From 01f7a68365aa4bea158cfc843bab0388e460e908 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Tue, 3 Apr 2018 13:07:31 +0200 Subject: [PATCH 0001/1361] test:mocktoken.js removed 4 arguments from Mocktoken() constructor --- test/MockToken.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/MockToken.js b/test/MockToken.js index 6145cd44..478231e5 100644 --- a/test/MockToken.js +++ b/test/MockToken.js @@ -27,7 +27,7 @@ contract('MockToken', (accounts) => { async function createToken() { - return await MockToken.new(SYMBOL, NAME, DECIMALS, TOTAL_SUPPLY, { from: accounts[0], gas: 3500000 }) + return await MockToken.new({ from: accounts[0], gas: 3500000 }) } describe('Basic properties', async () => { From b3dc0b3da2a87aa5b5470fcd4f37ae9a788dc6ed Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Tue, 3 Apr 2018 15:34:21 +0200 Subject: [PATCH 0002/1361] test:MockToken.js removed unused constants --- test/MockToken.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/MockToken.js b/test/MockToken.js index 478231e5..086ec2e5 100644 --- a/test/MockToken.js +++ b/test/MockToken.js @@ -2,7 +2,6 @@ const Utils = require('./lib/utils.js') const SimpleTokenUtils = require('./SimpleToken_utils.js') const Moment = require('moment') -const BigNumber = require('bignumber.js') const MockToken = artifacts.require("./MockToken.sol") @@ -17,15 +16,10 @@ const MockToken = artifacts.require("./MockToken.sol") contract('MockToken', (accounts) => { - const DECIMALSFACTOR = new BigNumber('10').pow('18') - const SYMBOL = "MOCK" const NAME = "Mock Token" - const DECIMALS = 18 - const TOTAL_SUPPLY = new BigNumber(web3.toWei(800000000, "ether")); const admin = accounts[1]; - async function createToken() { return await MockToken.new({ from: accounts[0], gas: 3500000 }) } From fd7bb8f805179f3590fccfc6a6486f6e7ae37e61 Mon Sep 17 00:00:00 2001 From: Benjamin Bollen Date: Mon, 22 Jan 2018 15:52:59 +0530 Subject: [PATCH 0003/1361] contracts: update arguments to unlockHeight. closes #28 --- contracts/Hasher.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/Hasher.sol b/contracts/Hasher.sol index 66f292d6..5fdf4d2e 100644 --- a/contracts/Hasher.sol +++ b/contracts/Hasher.sol @@ -55,7 +55,7 @@ contract Hasher { address _beneficiary, uint256 _amountST, uint256 _amountUT, - uint256 _escrowUnlockHeight) + uint256 _unlockHeight) public pure returns (bytes32) @@ -67,7 +67,7 @@ contract Hasher { _beneficiary, _amountST, _amountUT, - _escrowUnlockHeight); + _unlockHeight); } function hashRedemptionIntent( @@ -76,7 +76,7 @@ contract Hasher { uint256 _accountNonce, address _beneficiary, uint256 _amountUT, - uint256 _escrowUnlockHeight) + uint256 _unlockHeight) public pure returns (bytes32) @@ -87,6 +87,6 @@ contract Hasher { _accountNonce, _beneficiary, _amountUT, - _escrowUnlockHeight); + _unlockHeight); } } \ No newline at end of file From d80b3ee5976a4f76337506198312778060440c35 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Wed, 2 May 2018 15:50:36 +0200 Subject: [PATCH 0004/1361] Contracts: adds the gate contract. MOSA-19 --- contracts/Gate.sol | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 contracts/Gate.sol diff --git a/contracts/Gate.sol b/contracts/Gate.sol new file mode 100644 index 00000000..5666b083 --- /dev/null +++ b/contracts/Gate.sol @@ -0,0 +1,46 @@ +pragma solidity ^0.4.23; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: Gate +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./ProtocolVersioned.sol"; + +contract Gate is ProtocolVersioned { + /* + * Structures + */ + struct StakeRequest { + uint256 amount; + uint256 unlockHeight; + address beneficiary; //The token holder contract in the future + bytes32 hashLock; + } + + /* + * Storage + */ + address public workers; //TODO: update type once workers contract and interfaces are added to the repo. + mapping(address /*staker */ => StakeRequest) public stakeRequests; + + function Gate() public { //TODO: complete as necessary + + } +} \ No newline at end of file From 3f2be4626c541a0ec9a389400dfafaf1565b6d1d Mon Sep 17 00:00:00 2001 From: Benjamin Bollen Date: Mon, 22 Jan 2018 19:18:56 +0530 Subject: [PATCH 0005/1361] contracts: implement hash lock for stake and mint --- contracts/Hasher.sol | 12 +- contracts/OpenSTUtility.sol | 62 ++-- contracts/OpenSTUtilityInterface.sol | 8 +- contracts/OpenSTValue.sol | 81 +++-- contracts/OpenSTValueInterface.sol | 10 +- contracts/Registrar.sol | 18 +- package-lock.json | 30 +- package.json | 1 + test/OpenSTUtility.js | 250 +++++++------ test/OpenSTUtility_utils.js | 6 +- test/OpenSTValue.js | 286 +++++++-------- test/OpenSTValue_utils.js | 10 +- test/Protocol.js | 519 ++++++++++++++------------- test/Registrar.js | 35 +- test/STPrime.js | 3 +- test/lib/hash_lock.js | 32 ++ tools/runTestRpc.sh | 2 +- 17 files changed, 739 insertions(+), 626 deletions(-) create mode 100644 test/lib/hash_lock.js diff --git a/contracts/Hasher.sol b/contracts/Hasher.sol index 5fdf4d2e..0ce82d15 100644 --- a/contracts/Hasher.sol +++ b/contracts/Hasher.sol @@ -55,7 +55,8 @@ contract Hasher { address _beneficiary, uint256 _amountST, uint256 _amountUT, - uint256 _unlockHeight) + uint256 _unlockHeight, + bytes32 _hashLock) public pure returns (bytes32) @@ -67,7 +68,8 @@ contract Hasher { _beneficiary, _amountST, _amountUT, - _unlockHeight); + _unlockHeight, + _hashLock); } function hashRedemptionIntent( @@ -76,7 +78,8 @@ contract Hasher { uint256 _accountNonce, address _beneficiary, uint256 _amountUT, - uint256 _unlockHeight) + uint256 _unlockHeight, + bytes32 _hashLock) public pure returns (bytes32) @@ -87,6 +90,7 @@ contract Hasher { _accountNonce, _beneficiary, _amountUT, - _unlockHeight); + _unlockHeight, + _hashLock); } } \ No newline at end of file diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 5abe8268..1d2cb345 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -29,7 +29,7 @@ import "./OpsManaged.sol"; // utility chain contracts import "./STPrime.sol"; import "./STPrimeConfig.sol"; -import "./BrandedToken.sol"; +import "./BrandedToken.sol"; import "./UtilityTokenInterface.sol"; import "./ProtocolVersioned.sol"; @@ -37,7 +37,7 @@ import "./ProtocolVersioned.sol"; /// @title OpenST Utility contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { using SafeMath for uint256; - + /* * Structures */ @@ -52,6 +52,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { address beneficiary; uint256 amount; uint256 expirationHeight; + bytes32 hashLock; } struct Redemption { @@ -60,6 +61,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { address beneficiary; uint256 amountUT; uint256 unlockHeight; + bytes32 hashLock; } /* @@ -76,7 +78,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { address _staker, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight); event ProcessedMint(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, address _token, - address _staker, address _beneficiary, uint256 _amount); + address _staker, address _beneficiary, uint256 _amount, bytes32 _unlockSecret); event RevertedMint(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, address _staker, address _beneficiary, uint256 _amountUT); @@ -86,7 +88,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 _chainIdValue); event ProcessedRedemption(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, address _token, - address _redeemer, address _beneficiary, uint256 _amount); + address _redeemer, address _beneficiary, uint256 _amount, bytes32 _unlockSecret); event RevertedRedemption(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, address _redeemer, address _beneficiary, uint256 _amountUT); @@ -111,7 +113,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 public chainIdUtility; address public registrar; bytes32[] public uuids; - /// registered branded tokens + /// registered branded tokens mapping(bytes32 /* uuid */ => RegisteredToken) public registeredTokens; /// name reservation is first come, first serve mapping(bytes32 /* hashName */ => address /* requester */) public nameReservation; @@ -194,6 +196,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 _amountST, uint256 _amountUT, uint256 _stakingUnlockHeight, + bytes32 _hashLock, bytes32 _stakingIntentHash) external onlyRegistrar @@ -218,7 +221,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _beneficiary, _amountST, _amountUT, - _stakingUnlockHeight + _stakingUnlockHeight, + _hashLock ); require(stakingIntentHash == _stakingIntentHash); @@ -228,7 +232,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { staker: _staker, beneficiary: _beneficiary, amount: _amountUT, - expirationHeight: expirationHeight + expirationHeight: expirationHeight, + hashLock: _hashLock }); StakingIntentConfirmed(_uuid, stakingIntentHash, _staker, _beneficiary, _amountST, @@ -238,14 +243,17 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { } function processMinting( - bytes32 _stakingIntentHash) + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) external returns (address tokenAddress) { require(_stakingIntentHash != ""); Mint storage mint = mints[_stakingIntentHash]; - require(mint.staker == msg.sender); + + // present secret to unlock hashlock and continue process + require(mint.hashLock == keccak256(_unlockSecret)); // as process minting results in a gain it needs to expire well before // the escrow on the cost unlocks in OpenSTValue.processStake @@ -258,7 +266,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(token.mint(mint.beneficiary, mint.amount)); ProcessedMint(mint.uuid, _stakingIntentHash, tokenAddress, mint.staker, - mint.beneficiary, mint.amount); + mint.beneficiary, mint.amount, _unlockSecret); delete mints[_stakingIntentHash]; @@ -304,7 +312,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { bytes32 _uuid, uint256 _amountBT, uint256 _nonce, - address _beneficiary) + address _beneficiary, + bytes32 _hashLock) external returns ( uint256 unlockHeight, @@ -337,7 +346,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _nonce, _beneficiary, _amountBT, - unlockHeight + unlockHeight, + _hashLock ); redemptions[redemptionIntentHash] = Redemption({ @@ -345,7 +355,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { redeemer: msg.sender, beneficiary: _beneficiary, amountUT: _amountBT, - unlockHeight: unlockHeight + unlockHeight: unlockHeight, + hashLock: _hashLock }); RedemptionIntentDeclared(_uuid, redemptionIntentHash, address(token), @@ -359,7 +370,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /// note: redemption will be done to beneficiary address function redeemSTPrime( uint256 _nonce, - address _beneficiary) + address _beneficiary, + bytes32 _hashLock) external payable returns ( @@ -385,7 +397,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _nonce, _beneficiary, amountSTP, - unlockHeight + unlockHeight, + _hashLock ); redemptions[redemptionIntentHash] = Redemption({ @@ -393,7 +406,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { redeemer: msg.sender, beneficiary: _beneficiary, amountUT: amountSTP, - unlockHeight: unlockHeight + unlockHeight: unlockHeight, + hashLock: _hashLock }); RedemptionIntentDeclared(uuidSTPrime, redemptionIntentHash, simpleTokenPrime, @@ -403,7 +417,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { } function processRedeeming( - bytes32 _redemptionIntentHash) + bytes32 _redemptionIntentHash, + bytes32 _unlockSecret) external returns ( address tokenAddress) @@ -412,13 +427,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { Redemption storage redemption = redemptions[_redemptionIntentHash]; - // note: as processRedemption incurs a cost for the redeemer, we provide a fallback - // in v0.9 for registrar to process the redemption on behalf of the redeemer, - // as the redeemer could fail to process the redemption and avoid the cost of redeeming; - // this will be replaced with a signature carry-over implementation instead, where - // the signature of the intent hash suffices on value and utility chain, decoupling - // it from the transaction to processRedemption and processUnstaking - require(redemption.redeemer == msg.sender || registrar == msg.sender); + // present the secret to unlock the hashlock and continue process + require(redemption.hashLock == keccak256(_unlockSecret)); // as process redemption bears the cost there is no need to require // the unlockHeight is not past, the same way as we do require for @@ -434,7 +444,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(token.burn.value(value)(redemption.redeemer, redemption.amountUT)); ProcessedRedemption(redemption.uuid, _redemptionIntentHash, token, - redemption.redeemer, redemption.beneficiary, redemption.amountUT); + redemption.redeemer, redemption.beneficiary, redemption.amountUT, _unlockSecret); delete redemptions[_redemptionIntentHash]; @@ -680,4 +690,4 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { function blocksToWaitShort() public pure returns (uint256) { return BLOCKS_TO_WAIT_SHORT; } -} \ No newline at end of file +} diff --git a/contracts/OpenSTUtilityInterface.sol b/contracts/OpenSTUtilityInterface.sol index 8da3d9e8..ec4862ea 100644 --- a/contracts/OpenSTUtilityInterface.sol +++ b/contracts/OpenSTUtilityInterface.sol @@ -14,7 +14,7 @@ pragma solidity ^0.4.17; // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// +// // ---------------------------------------------------------------------------- // Utility chain: OpenSTUtilityInterface // @@ -35,13 +35,15 @@ contract OpenSTUtilityInterface { uint256 _amountST, uint256 _amountUT, uint256 _stakingUnlockHeight, + bytes32 _hashLock, bytes32 _stakingIntentHash) external returns ( uint256 expirationHeight); function processRedeeming( - bytes32 _redemptionIntentHash) + bytes32 _redemptionIntentHash, + bytes32 _unlockSecret) external returns ( address tokenAddress); @@ -76,4 +78,4 @@ contract OpenSTUtilityInterface { address, /* redeemer */ uint256, /* amountUT */ uint256 /* unlockHeight */); -} \ No newline at end of file +} diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 2fdaca35..135062ab 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -36,7 +36,7 @@ import "./SimpleStake.sol"; /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is OpsManaged, Hasher { using SafeMath for uint256; - + /* * Events */ @@ -50,7 +50,7 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 _chainIdUtility); event ProcessedStake(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, - address _stake, address _staker, uint256 _amountST, uint256 _amountUT); + address _stake, address _staker, uint256 _amountST, uint256 _amountUT, bytes32 _unlockSecret); event RevertedStake(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, address _staker, uint256 _amountST, uint256 _amountUT); @@ -59,7 +59,7 @@ contract OpenSTValue is OpsManaged, Hasher { address _redeemer, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight); event ProcessedUnstake(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, - address stake, address _redeemer, address _beneficiary, uint256 _amountST); + address stake, address _redeemer, address _beneficiary, uint256 _amountST, bytes32 _unlockSecret); event RevertedUnstake(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, address _redeemer, address _beneficiary, uint256 _amountST); @@ -96,6 +96,7 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 amountST; uint256 amountUT; uint256 unlockHeight; + bytes32 hashLock; } struct Unstake { @@ -106,6 +107,7 @@ contract OpenSTValue is OpsManaged, Hasher { // @dev consider removal of amountUT uint256 amountUT; uint256 expirationHeight; + bytes32 hashLock; } /* @@ -163,7 +165,8 @@ contract OpenSTValue is OpsManaged, Hasher { function stake( bytes32 _uuid, uint256 _amountST, - address _beneficiary) + address _beneficiary, + bytes32 _hashLock) external returns ( uint256 amountUT, @@ -177,48 +180,47 @@ contract OpenSTValue is OpsManaged, Hasher { // OpenSTValue needs to be able to transfer the stake into its balance for // keeping until the two-phase process is completed on both chains. require(_amountST > 0); - // Consider the security risk of using tx.origin; at the same time an allowance - // needs to be set before calling stake over a potentially malicious contract at stakingAccount. - // The second protection is that the staker needs to check the intent hash before - // signing off on completing the two-phased process. - require(valueToken.allowance(tx.origin, address(this)) >= _amountST); require(utilityTokens[_uuid].simpleStake != address(0)); require(_beneficiary != address(0)); UtilityToken storage utilityToken = utilityTokens[_uuid]; + // TODO: introduce parameter _staker + address _staker = tx.origin; + // if the staking account is set to a non-zero address, - // then all transactions have come (from/over) the staking account, - // whether this is an EOA or a contract; tx.origin is putting forward the funds + // then all transactions have come (from/over) the staking account if (utilityToken.stakingAccount != address(0)) require(msg.sender == utilityToken.stakingAccount); - require(valueToken.transferFrom(tx.origin, address(this), _amountST)); + require(valueToken.transferFrom(_staker, address(this), _amountST)); amountUT = (_amountST.mul(utilityToken.conversionRate)) .div(10**uint256(utilityToken.conversionRateDecimals)); unlockHeight = block.number + blocksToWaitLong(); - nonces[tx.origin]++; - nonce = nonces[tx.origin]; + nonces[_staker]++; + nonce = nonces[_staker]; stakingIntentHash = hashStakingIntent( _uuid, - tx.origin, + _staker, nonce, _beneficiary, _amountST, amountUT, - unlockHeight + unlockHeight, + _hashLock ); stakes[stakingIntentHash] = Stake({ uuid: _uuid, - staker: tx.origin, + staker: _staker, beneficiary: _beneficiary, nonce: nonce, amountST: _amountST, amountUT: amountUT, - unlockHeight: unlockHeight + unlockHeight: unlockHeight, + hashLock: _hashLock }); StakingIntentDeclared(_uuid, tx.origin, nonce, _beneficiary, @@ -229,7 +231,8 @@ contract OpenSTValue is OpsManaged, Hasher { } function processStaking( - bytes32 _stakingIntentHash) + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) external returns (address stakeAddress) { @@ -237,13 +240,9 @@ contract OpenSTValue is OpsManaged, Hasher { Stake storage stake = stakes[_stakingIntentHash]; - // note: as processStaking incurs a cost for the staker, we provide a fallback - // in v0.9 for registrar to process the staking on behalf of the staker, - // as the staker could fail to process the stake and avoid the cost of staking; - // this will be replaced with a signature carry-over implementation instead, where - // the signature of the intent hash suffices on value and utility chain, decoupling - // it from the transaction to processStaking and processMinting - require(stake.staker == msg.sender || registrar == msg.sender); + // present the secret to unlock the hashlock and continue process + require(stake.hashLock == keccak256(_unlockSecret)); + // as this bears the cost, there is no need to require // that the stake.unlockHeight is not yet surpassed // as is required on processMinting @@ -256,7 +255,7 @@ contract OpenSTValue is OpsManaged, Hasher { require(valueToken.transfer(stakeAddress, stake.amountST)); ProcessedStake(stake.uuid, _stakingIntentHash, stakeAddress, stake.staker, - stake.amountST, stake.amountUT); + stake.amountST, stake.amountUT, _unlockSecret); delete stakes[_stakingIntentHash]; @@ -302,6 +301,7 @@ contract OpenSTValue is OpsManaged, Hasher { address _beneficiary, uint256 _amountUT, uint256 _redemptionUnlockHeight, + bytes32 _hashLock, bytes32 _redemptionIntentHash) external onlyRegistrar @@ -326,7 +326,8 @@ contract OpenSTValue is OpsManaged, Hasher { nonces[_redeemer], _beneficiary, _amountUT, - _redemptionUnlockHeight + _redemptionUnlockHeight, + _hashLock ); require(_redemptionIntentHash == redemptionIntentHash); @@ -342,12 +343,13 @@ contract OpenSTValue is OpsManaged, Hasher { require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); unstakes[redemptionIntentHash] = Unstake({ - uuid: _uuid, - redeemer: _redeemer, - beneficiary: _beneficiary, - amountUT: _amountUT, - amountST: amountST, - expirationHeight: expirationHeight + uuid: _uuid, + redeemer: _redeemer, + beneficiary: _beneficiary, + amountUT: _amountUT, + amountST: amountST, + expirationHeight: expirationHeight, + hashLock: _hashLock }); RedemptionIntentConfirmed(_uuid, redemptionIntentHash, _redeemer, @@ -357,7 +359,8 @@ contract OpenSTValue is OpsManaged, Hasher { } function processUnstaking( - bytes32 _redemptionIntentHash) + bytes32 _redemptionIntentHash, + bytes32 _unlockSecret) external returns ( address stakeAddress) @@ -365,7 +368,9 @@ contract OpenSTValue is OpsManaged, Hasher { require(_redemptionIntentHash != ""); Unstake storage unstake = unstakes[_redemptionIntentHash]; - require(unstake.redeemer == msg.sender); + + // present secret to unlock hashlock and proceed + require(unstake.hashLock == keccak256(_unlockSecret)); // as the process unstake results in a gain for the caller // it needs to expire well before the process redemption can @@ -379,7 +384,7 @@ contract OpenSTValue is OpsManaged, Hasher { require(utilityToken.simpleStake.releaseTo(unstake.beneficiary, unstake.amountST)); ProcessedUnstake(unstake.uuid, _redemptionIntentHash, stakeAddress, - unstake.redeemer, unstake.beneficiary, unstake.amountST); + unstake.redeemer, unstake.beneficiary, unstake.amountST, _unlockSecret); delete unstakes[_redemptionIntentHash]; @@ -557,4 +562,4 @@ contract OpenSTValue is OpsManaged, Hasher { return true; } -} \ No newline at end of file +} diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index 1dd2dc79..7b5f3941 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -14,7 +14,7 @@ pragma solidity ^0.4.17; // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// +// // ---------------------------------------------------------------------------- // Value chain: OpenST protocol interface // @@ -27,7 +27,8 @@ import "./CoreInterface.sol"; contract OpenSTValueInterface { function processStaking( - bytes32 _stakingIntentHash) + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) external returns (address stakeAddress); @@ -38,6 +39,7 @@ contract OpenSTValueInterface { address _beneficiary, uint256 _amountUT, uint256 _redemptionUnlockHeight, + bytes32 _hashLock, bytes32 _redemptionIntentHash) external returns ( @@ -59,7 +61,7 @@ contract OpenSTValueInterface { address _stakingAccount, bytes32 _checkUuid) public - returns ( + returns ( bytes32 uuid); function stakes( @@ -83,4 +85,4 @@ contract OpenSTValueInterface { uint256, /* amountST */ uint256, /* amountUT */ uint256 /* expirationHeight */); -} \ No newline at end of file +} diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index f243188f..8452a605 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -55,6 +55,7 @@ contract Registrar is OpsManaged { address _beneficiary, uint256 _amountUT, uint256 _redemptionUnlockHeight, + bytes32 _hashLock, bytes32 _redemptionIntentHash) external onlyOps @@ -69,6 +70,7 @@ contract Registrar is OpsManaged { _beneficiary, _amountUT, _redemptionUnlockHeight, + _hashLock, _redemptionIntentHash); return (amountST, expirationHeight); @@ -113,18 +115,21 @@ contract Registrar is OpsManaged { _checkUuid); } + // @dev this can be deprecated as anyone with the unlockSecret + // can now call the processRedeeming function function processStaking( // address of OpenSTValue registry: OpenSTValueInterface _registry, // OpenSTValue function: - bytes32 _stakingIntentHash) + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) external onlyAdmin returns ( address stakeAddress) { return _registry.processStaking( - _stakingIntentHash); + _stakingIntentHash, _unlockSecret); } /* @@ -141,6 +146,7 @@ contract Registrar is OpsManaged { uint256 _amountST, uint256 _amountUT, uint256 _stakingUnlockHeight, + bytes32 _hashLock, bytes32 _stakingIntentHash) external onlyOps @@ -155,6 +161,7 @@ contract Registrar is OpsManaged { _amountST, _amountUT, _stakingUnlockHeight, + _hashLock, _stakingIntentHash); } @@ -184,17 +191,20 @@ contract Registrar is OpsManaged { _checkUuid); } + // @dev this can be deprecated as anyone with the unlockSecret + // can now call the processRedeeming function function processRedeeming( // address of OpenSTUtility registry: OpenSTUtilityInterface _registry, // OpenSTUtility function: - bytes32 _redemptionIntentHash) + bytes32 _redemptionIntentHash, + bytes32 _unlockSecret) external onlyAdmin returns ( address tokenAddress) { return _registry.processRedeeming( - _redemptionIntentHash); + _redemptionIntentHash, _unlockSecret); } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d754d009..20ffa8fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -756,6 +756,11 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -3317,6 +3322,24 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "requires": { + "bindings": "1.3.0", + "inherits": "2.0.3", + "nan": "2.8.0", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3678,9 +3701,7 @@ "nan": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "dev": true, - "optional": true + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" }, "node-libs-browser": { "version": "2.1.0", @@ -4283,8 +4304,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "semver": { "version": "5.4.1", diff --git a/package.json b/package.json index ddc28871..f0f6dfb3 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "assert": "^1.4.1", "bignumber": "^1.1.0", "bignumber.js": "^4.1.0", + "keccak": "^1.4.0", "moment": "^2.19.2", "web3": "^0.20.2" }, diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index ff3d2d89..e862163f 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -20,13 +20,14 @@ // ---------------------------------------------------------------------------- const Utils = require('./lib/utils.js'); +const HashLock = require('./lib/hash_lock.js'); const OpenSTUtility_utils = require('./OpenSTUtility_utils.js'); const BrandedToken = artifacts.require("./BrandedToken.sol"); const BigNumber = require('bignumber.js'); /// /// Test stories -/// +/// /// Properties /// has chainIdValue /// has chainIdUtility @@ -59,8 +60,8 @@ const BigNumber = require('bignumber.js'); /// /// ProcessMinting /// when expirationHeight is > block number -/// fails if stakingIntentHash is empty -/// fails if msg.sender != staker +/// fails to process if stakingIntentHash is empty +/// fails to process if hash of unlockSecret does not match hashlock /// successfully mints /// fails to re-process a processed mint /// when expirationHeight is < block number // TBD: how or where to test this practically @@ -81,7 +82,7 @@ const BigNumber = require('bignumber.js'); /// ProcessRedeeming /// BrandedToken /// fails to process if redemptionIntentHash is empty -/// fails to process if msg.sender is not redeemer or registrar +/// fails to process if hash of unlockSecret does not match hashlock /// successfully processes /// fails to reprocess /// STPrime @@ -101,7 +102,7 @@ contract('OpenSTUtility', function(accounts) { const symbol = "MCC"; const name = "Member Company Coin"; - + const conversionRateDecimals = 5; const conversionRate = new BigNumber(5 * (10**conversionRateDecimals)); @@ -112,9 +113,10 @@ contract('OpenSTUtility', function(accounts) { const hashName = "hashName"; const hashSymbol = "hashSymbol"; const requester = "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; - const token = "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; + const token = "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; const redeemer = accounts[0]; const redeemBeneficiary = accounts[2]; + const notRedeemer = accounts[5]; var result = null; var checkBtUuid = null; @@ -208,11 +210,14 @@ contract('OpenSTUtility', function(accounts) { result = await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); assert.equal(await openSTUtility.getUuidsSize.call(), 2); assert.equal((await openSTUtility.registeredTokens.call(checkBtUuid))[0], brandedToken); - await OpenSTUtility_utils.checkRegisteredBrandedTokenEvent(result.logs[0], registrar, brandedToken, checkBtUuid, symbol, name, conversionRate, accounts[0]); + await OpenSTUtility_utils.checkRegisteredBrandedTokenEvent(result.logs[0], registrar, brandedToken, checkBtUuid, symbol, name, conversionRate, accounts[0]); }) }) describe('ConfirmStakingIntent', async () => { + + const lock = HashLock.getHashLock(); + before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; @@ -220,52 +225,60 @@ contract('OpenSTUtility', function(accounts) { result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668) + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) }) it('fails to confirm by non-registrar', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: accounts[0] })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: accounts[0] })); }) it('fails to confirm when token is not registered', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent("bad UUID", accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent("bad UUID", accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); }) it('fails confirm when stakerNonce is not > previously', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 0, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 0, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); }) it('fails to confirm when amoutST is not > 0', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], 0, amountUT, 80668, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], 0, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); }) - it('fails to confirm when amoutUT is not > 0', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, 0, 80668, checkStakingIntentHash, { from: registrar })); + it('fails to confirm when amountUT is not > 0', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, 0, 80668, lock.l, checkStakingIntentHash, { from: registrar })); }) it('fails to confirm when stakingUnlockHeight is not > 0', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 0, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 0, lock.l, checkStakingIntentHash, { from: registrar })); }) it('fails to confirm when stakingIntentHash is empty', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, "", { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, "", { from: registrar })); + }) + + it('fails to confirm when presented with different lock', async () => { + const differentLock = HashLock.getHashLock(); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, differentLock.l, "", { from: registrar })); }) it('fails to confirm when stakingIntentHash does not match calculated hash', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, "bad stakingIntentHash", { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, "bad stakingIntentHash", { from: registrar })); }) it('successfully confirms', async () => { - expirationHeight = await openSTUtility.confirmStakingIntent.call(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); + expirationHeight = await openSTUtility.confirmStakingIntent.call(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); // call block number is one less than send block number expirationHeight = expirationHeight.plus(1) - result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); - await OpenSTUtility_utils.checkStakingIntentConfirmedEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, accounts[0], accounts[0], amountST, amountUT, expirationHeight); + result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await OpenSTUtility_utils.checkStakingIntentConfirmedEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, accounts[0], accounts[0], amountST, amountUT, expirationHeight); }) }) describe('ProcessMinting', async () => { + + const lock = HashLock.getHashLock(); + context('when expirationHeight is > block number', async () => { before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); @@ -274,28 +287,29 @@ contract('OpenSTUtility', function(accounts) { result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668) - result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); }) - it('fails if stakingIntentHash is empty', async () => { - await Utils.expectThrow(openSTUtility.processMinting("")); + it('fails to process if stakingIntentHash is empty', async () => { + await Utils.expectThrow(openSTUtility.processMinting("", lock.s)); }) - it('fails if msg.sender != staker', async () => { - await Utils.expectThrow(openSTUtility.processMinting(checkStakingIntentHash, { from: accounts[1] })); + it('fails to process if hash of unlockSecret does not match hashlock', async () => { + const differentLock = HashLock.getHashLock(); + await Utils.expectThrow(openSTUtility.processMinting(checkStakingIntentHash, differentLock.s, { from: accounts[1] })); }) it('successfully mints', async () => { - assert.equal(await openSTUtility.processMinting.call(checkStakingIntentHash), brandedToken); - result = await openSTUtility.processMinting(checkStakingIntentHash); - await OpenSTUtility_utils.checkProcessedMintEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, brandedToken, accounts[0], accounts[0], amountUT); + assert.equal(await openSTUtility.processMinting.call(checkStakingIntentHash, lock.s), brandedToken); + result = await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + await OpenSTUtility_utils.checkProcessedMintEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, brandedToken, accounts[0], accounts[0], amountUT, lock.s); }) it('fails to re-process a processed mint', async () => { - await Utils.expectThrow(openSTUtility.processMinting(checkStakingIntentHash)); + await Utils.expectThrow(openSTUtility.processMinting(checkStakingIntentHash, lock.s)); }) - }) + }) }) describe('Redeem', async () => { @@ -303,6 +317,9 @@ contract('OpenSTUtility', function(accounts) { var brandedTokenContract = null; const redeemAmountUT = new BigNumber(web3.toWei(1, "ether")); + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; @@ -310,45 +327,45 @@ contract('OpenSTUtility', function(accounts) { result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668) - await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); - await openSTUtility.processMinting(checkStakingIntentHash); - - brandedTokenContract = new BrandedToken(brandedToken); - await brandedTokenContract.claim(accounts[0]); - await brandedTokenContract.approve(openSTUtility.address, redeemAmountUT, { from: redeemer }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + + brandedTokenContract = new BrandedToken(brandedToken); + await brandedTokenContract.claim(accounts[0]); + await brandedTokenContract.approve(openSTUtility.address, redeemAmountUT, { from: redeemer }); }) it('fails to redeem when uuid is empty', async () => { - await Utils.expectThrow(openSTUtility.redeem("", redeemAmountUT, 2, redeemBeneficiary, { from: redeemer })); + await Utils.expectThrow(openSTUtility.redeem("", redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer })); }) it('fails to redeem when amount is not > 0', async () => { - await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, 0, 2, redeemBeneficiary, { from: redeemer })); + await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, 0, 2, redeemBeneficiary, lockR.l, { from: redeemer })); }) it('fails to redeem when nonce is not >= previously', async () => { - await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, redeemAmountUT, 0, redeemBeneficiary, { from: redeemer })); + await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, redeemAmountUT, 0, redeemBeneficiary, lockR.l, { from: redeemer })); }) it('fails to redeem when uuid is uuidSTPrime', async () => { uuidSTPrime = await openSTUtility.uuidSTPrime.call(); - await Utils.expectThrow(openSTUtility.redeem(uuidSTPrime, redeemAmountUT, 2, redeemBeneficiary, { from: redeemer })); + await Utils.expectThrow(openSTUtility.redeem(uuidSTPrime, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer })); }) it('fails to redeem if not approved to transfer the amount', async () => { await brandedTokenContract.approve(openSTUtility.address, 0, { from: redeemer }); - await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, { from: redeemer })); + await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer })); await brandedTokenContract.approve(openSTUtility.address, redeemAmountUT, { from: redeemer }); }) it('successfully redeems', async () => { - var redeemReturns = await openSTUtility.redeem.call(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, { from: redeemer }); + var redeemReturns = await openSTUtility.redeem.call(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); // call block number is one less than send block number unlockHeight = redeemReturns[0].plus(1); - var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(checkBtUuid, accounts[0], 2, redeemBeneficiary, redeemAmountUT, unlockHeight); - result = await openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, { from: redeemer }); + var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(checkBtUuid, accounts[0], 2, redeemBeneficiary, redeemAmountUT, unlockHeight, lockR.l); + result = await openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); await OpenSTUtility_utils.checkRedemptionIntentDeclaredEvent(result.logs[0], checkBtUuid, checkRedemptionIntentHash, brandedToken, redeemer, 2, redeemBeneficiary, redeemAmountUT, unlockHeight, chainIdValue); @@ -358,35 +375,36 @@ contract('OpenSTUtility', function(accounts) { describe('RedeemSTPrime', async () => { const redeemSTP = new BigNumber(2); + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); stPrime = contracts.stPrime; openSTUtility = contracts.openSTUtility; - uuidSTPrime = await openSTUtility.uuidSTPrime.call(); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668) + checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l); - await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); - await openSTUtility.processMinting(checkStakingIntentHash); - await stPrime.claim(accounts[0]); + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + await stPrime.claim(accounts[0]); }) it('fails to redeem when msg.value is not > 0', async () => { - await Utils.expectThrow(openSTUtility.redeemSTPrime(redeemSTP.toNumber(), redeemBeneficiary, { from: redeemer, value: 0 })); + await Utils.expectThrow(openSTUtility.redeemSTPrime(redeemSTP.toNumber(), redeemBeneficiary, lockR.l, { from: redeemer, value: 0 })); }) it('fails to redeem when nonce is not >= previously', async () => { - await Utils.expectThrow(openSTUtility.redeemSTPrime(0, redeemBeneficiary, { from: redeemer, value: 2 })); + await Utils.expectThrow(openSTUtility.redeemSTPrime(0, redeemBeneficiary, lockR.l, { from: redeemer, value: 2 })); }) it('successfully redeems', async () => { - var redeemReturns = await openSTUtility.redeemSTPrime.call(redeemSTP.toNumber(), redeemBeneficiary, { from: redeemer, value: 2 }); + var redeemReturns = await openSTUtility.redeemSTPrime.call(redeemSTP.toNumber(), redeemBeneficiary, lockR.l, { from: redeemer, value: 2 }); // call block number is one less than send block number unlockHeight = redeemReturns[1].plus(1) - var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(uuidSTPrime, redeemer, 2, redeemBeneficiary, redeemSTP, unlockHeight); - result = await openSTUtility.redeemSTPrime(redeemSTP, redeemBeneficiary, { from: redeemer, value: redeemSTP }); + var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(uuidSTPrime, redeemer, 2, redeemBeneficiary, redeemSTP, unlockHeight, lockR.l); + result = await openSTUtility.redeemSTPrime(redeemSTP, redeemBeneficiary, lockR.l, { from: redeemer, value: redeemSTP }); await OpenSTUtility_utils.checkRedemptionIntentDeclaredEvent(result.logs[0], uuidSTPrime, checkRedemptionIntentHash, stPrime.address, redeemer, 2, redeemBeneficiary, redeemSTP.toNumber(), unlockHeight, chainIdValue); @@ -398,6 +416,9 @@ contract('OpenSTUtility', function(accounts) { var brandedToken = null; var brandedTokenContract = null; + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + context('BrandedToken', async () => { var redemptionAmount = 3; @@ -408,39 +429,39 @@ contract('OpenSTUtility', function(accounts) { result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668) - await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); - await openSTUtility.processMinting(checkStakingIntentHash); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); brandedTokenContract = new BrandedToken(brandedToken); await brandedTokenContract.claim(accounts[0]); await brandedTokenContract.approve(openSTUtility.address, redemptionAmount, { from: redeemer }); - result = await openSTUtility.redeem(checkBtUuid, redemptionAmount, 2, redeemBeneficiary, { from: redeemer }); + result = await openSTUtility.redeem(checkBtUuid, redemptionAmount, 2, redeemBeneficiary, lockR.l, { from: redeemer }); redemptionIntentHash = result.logs[0].args._redemptionIntentHash; }) it('fails to process if redemptionIntentHash is empty', async () => { - await Utils.expectThrow(openSTUtility.processRedeeming("", { from: redeemer })); + await Utils.expectThrow(openSTUtility.processRedeeming("", lockR.s, { from: notRedeemer })); }) - it('fails to process if msg.sender is not redeemer or registrar', async () => { - await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, { from: accounts[5] })); + it('fails to process if hash of unlockSecret does not match hashlock', async () => { + await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, "incorrect unlock secret", { from: notRedeemer })); }) it('successfully processes', async () => { var openSTUtilityBal = await brandedTokenContract.balanceOf.call(openSTUtility.address); var totalSupply = await brandedTokenContract.totalSupply.call(); - assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, { from: redeemer }), brandedToken); - result = await openSTUtility.processRedeeming(redemptionIntentHash, { from: redeemer }); + assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, lockR.s, { from: notRedeemer }), brandedToken); + result = await openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: notRedeemer }); var postProcessOpenSTUtilityBal = await brandedTokenContract.balanceOf.call(openSTUtility.address); var postProcessTotalSupply = await brandedTokenContract.totalSupply.call(); assert.equal(postProcessOpenSTUtilityBal.toNumber(), openSTUtilityBal.minus(redemptionAmount).toNumber()); assert.equal(postProcessTotalSupply.toNumber(), totalSupply.minus(redemptionAmount).toNumber()); - await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], checkBtUuid, redemptionIntentHash, brandedToken, redeemer, redeemBeneficiary, redemptionAmount); + await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], checkBtUuid, redemptionIntentHash, brandedToken, redeemer, redeemBeneficiary, redemptionAmount, lockR.s); }) it('fails to reprocess', async () => { - await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, { from: redeemer })); + await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: notRedeemer })); }) }) @@ -448,31 +469,30 @@ contract('OpenSTUtility', function(accounts) { var redemptionAmount = 2; before(async () => { - contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); - stPrime = contracts.stPrime; - openSTUtility = contracts.openSTUtility; - - uuidSTPrime = await openSTUtility.uuidSTPrime.call(); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668) + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + stPrime = contracts.stPrime; + openSTUtility = contracts.openSTUtility; + uuidSTPrime = await openSTUtility.uuidSTPrime.call(); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l); - await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); - await openSTUtility.processMinting(checkStakingIntentHash); + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); await stPrime.claim(accounts[0]); - result = await openSTUtility.redeemSTPrime(redemptionAmount, redeemBeneficiary, { from: redeemer, value: redemptionAmount }); + result = await openSTUtility.redeemSTPrime(redemptionAmount, redeemBeneficiary, lockR.l, { from: redeemer, value: redemptionAmount }); redemptionIntentHash = result.logs[0].args._redemptionIntentHash; }) it('successfully processes', async () => { var stPrimeBal = await web3.eth.getBalance(stPrime.address); var totalSupply = await stPrime.totalSupply.call(); - assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, { from: redeemer }), stPrime.address); - result = await openSTUtility.processRedeeming(redemptionIntentHash, { from: redeemer }); + assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, lockR.s, { from: notRedeemer }), stPrime.address); + result = await openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: notRedeemer }); var postProcessStPrimeBal = await web3.eth.getBalance(stPrime.address); var postProcessTotalSupply = await stPrime.totalSupply.call(); assert.equal(postProcessStPrimeBal.toNumber(), stPrimeBal.minus(redemptionAmount).toNumber()); assert.equal(postProcessTotalSupply.toNumber(), totalSupply.minus(redemptionAmount).toNumber()); - await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], uuidSTPrime, redemptionIntentHash, stPrime.address, redeemer, redeemBeneficiary, redemptionAmount); + await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], uuidSTPrime, redemptionIntentHash, stPrime.address, redeemer, redeemBeneficiary, redemptionAmount, lockR.s); }) }) }) @@ -482,6 +502,9 @@ contract('OpenSTUtility', function(accounts) { var brandedToken = null; var brandedTokenContract = null; + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + context('BrandedToken', async () => { var redemptionAmount = 3; @@ -492,28 +515,28 @@ contract('OpenSTUtility', function(accounts) { result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668) - await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); - await openSTUtility.processMinting(checkStakingIntentHash); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); brandedTokenContract = new BrandedToken(brandedToken); await brandedTokenContract.claim(accounts[0]); await brandedTokenContract.approve(openSTUtility.address, redemptionAmount, { from: redeemer }); - result = await openSTUtility.redeem(checkBtUuid, redemptionAmount, 2, redeemBeneficiary, { from: redeemer }); + result = await openSTUtility.redeem(checkBtUuid, redemptionAmount, 2, redeemBeneficiary, lockR.l, { from: redeemer }); redemptionIntentHash = result.logs[0].args._redemptionIntentHash; }) it('successfully processes by registrar', async () => { var openSTUtilityBal = await brandedTokenContract.balanceOf.call(openSTUtility.address); var totalSupply = await brandedTokenContract.totalSupply.call(); - assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, { from: redeemer }), brandedToken); + assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, lockR.s, { from: notRedeemer }), brandedToken); // redemption is processed by Registrar - result = await openSTUtility.processRedeeming(redemptionIntentHash, { from: registrar }); + result = await openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: registrar }); var postProcessOpenSTUtilityBal = await brandedTokenContract.balanceOf.call(openSTUtility.address); var postProcessTotalSupply = await brandedTokenContract.totalSupply.call(); assert.equal(postProcessOpenSTUtilityBal.toNumber(), openSTUtilityBal.minus(redemptionAmount).toNumber()); assert.equal(postProcessTotalSupply.toNumber(), totalSupply.minus(redemptionAmount).toNumber()); - await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], checkBtUuid, redemptionIntentHash, brandedToken, redeemer, redeemBeneficiary, redemptionAmount); + await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], checkBtUuid, redemptionIntentHash, brandedToken, redeemer, redeemBeneficiary, redemptionAmount, lockR.s); }) }) @@ -526,45 +549,47 @@ contract('OpenSTUtility', function(accounts) { openSTUtility = contracts.openSTUtility; uuidSTPrime = await openSTUtility.uuidSTPrime.call(); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668) + checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) - await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, checkStakingIntentHash, { from: registrar }); - await openSTUtility.processMinting(checkStakingIntentHash); + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); await stPrime.claim(accounts[0]); - result = await openSTUtility.redeemSTPrime(redemptionAmount, redeemBeneficiary, { from: redeemer, value: redemptionAmount }); + result = await openSTUtility.redeemSTPrime(redemptionAmount, redeemBeneficiary, lockR.l, { from: redeemer, value: redemptionAmount }); redemptionIntentHash = result.logs[0].args._redemptionIntentHash; }) it('successfully processes by registrar', async () => { var stPrimeBal = await web3.eth.getBalance(stPrime.address); var totalSupply = await stPrime.totalSupply.call(); - assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, { from: redeemer }), stPrime.address); + assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, lockR.s, { from: notRedeemer }), stPrime.address); // redemption is processed by Registrar - result = await openSTUtility.processRedeeming(redemptionIntentHash, { from: registrar }); + result = await openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: registrar }); var postProcessStPrimeBal = await web3.eth.getBalance(stPrime.address); var postProcessTotalSupply = await stPrime.totalSupply.call(); assert.equal(postProcessStPrimeBal.toNumber(), stPrimeBal.minus(redemptionAmount).toNumber()); assert.equal(postProcessTotalSupply.toNumber(), totalSupply.minus(redemptionAmount).toNumber()); - await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], uuidSTPrime, redemptionIntentHash, stPrime.address, redeemer, redeemBeneficiary, redemptionAmount); + await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], uuidSTPrime, redemptionIntentHash, stPrime.address, redeemer, redeemBeneficiary, redemptionAmount, lockR.s); }) }) - + }); // Unit test cases for revert redemption describe('revert redemption', async () => { + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + context('revert redemption', async () => { var stakeAmountST = new BigNumber(web3.toWei(1, "ether")), - convertedAmountBT = (stakeAmountST*conversionRate), - redemptionAmountBT = new BigNumber(web3.toWei(2, "ether")), // How many Branded tokens to redeem - redeemerForRevert = accounts[0] // requester and redeemer is same here - escrowUnlockHeight = 0; + convertedAmountBT = (stakeAmountST*conversionRate), + redemptionAmountBT = new BigNumber(web3.toWei(2, "ether")), // How many Branded tokens to redeem + redeemerForRevert = accounts[0] // requester and redeemer is same here + escrowUnlockHeight = 0; before(async () => { - - contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); // Use OpenSTUtility Contract to expire redeem soon OpenSTUtility = contracts.openSTUtility; checkBtUuid = await OpenSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, OpenSTUtility.address, conversionRate, conversionRateDecimals); @@ -575,17 +600,16 @@ contract('OpenSTUtility', function(accounts) { escrowUnlockHeight = await OpenSTUtility.blocksToWaitLong.call(); // 1 more than BLOCKS_TO_WAIT_LONG in OpenSTUtility contract so that redeem expires escrowUnlockHeight = escrowUnlockHeight.toNumber() + 1; - checkStakingIntentHash = await OpenSTUtility.hashStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight); - await OpenSTUtility.confirmStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, checkStakingIntentHash, { from: registrar }); - await OpenSTUtility.processMinting(checkStakingIntentHash); + checkStakingIntentHash = await OpenSTUtility.hashStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, lock.l); + await OpenSTUtility.confirmStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, lock.l, checkStakingIntentHash, { from: registrar }); + await OpenSTUtility.processMinting(checkStakingIntentHash, lock.s); brandedTokenContract = new BrandedToken(brandedToken); await brandedTokenContract.claim(redeemerForRevert); // redeemerForRevert is approved with 5 BT await brandedTokenContract.approve(OpenSTUtility.address, redemptionAmountBT, { from: redeemerForRevert }); // After calling Redeem is left with 3 BT since redemptionAmountBT is 2 (5-2) - result = await OpenSTUtility.redeem(checkBtUuid, redemptionAmountBT, 2, redeemBeneficiary, { from: redeemerForRevert }); + result = await OpenSTUtility.redeem(checkBtUuid, redemptionAmountBT, 2, redeemBeneficiary, lockR.l, { from: redeemerForRevert }); redemptionIntentHash = result.logs[0].args._redemptionIntentHash; - }); // Mock transactions so that block number increases @@ -635,7 +659,7 @@ contract('OpenSTUtility', function(accounts) { it('fails to processRedeeming after revert redemption', async () => { - await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, { from: redeemerForRevert })); + await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, lockR.l, { from: redeemerForRevert })); }); @@ -651,6 +675,8 @@ contract('OpenSTUtility', function(accounts) { const AMOUNT_ST = new BigNumber(web3.toWei(10, "ether")); const AMOUNT_BT = new BigNumber(AMOUNT_ST*conversionRate); + const lock = HashLock.getHashLock(); + context('BrandedToken', async () => { before(async () => { @@ -661,9 +687,9 @@ contract('OpenSTUtility', function(accounts) { brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); stakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], - AMOUNT_ST, AMOUNT_BT, 80668); + AMOUNT_ST, AMOUNT_BT, 80668, lock.l); result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], AMOUNT_ST, - AMOUNT_BT, 80668, stakingIntentHash, { from: registrar }); + AMOUNT_BT, 80668, lock.l, stakingIntentHash, { from: registrar }); }); it('fails if stakingIntentHash is empty', async() => { @@ -685,8 +711,12 @@ contract('OpenSTUtility', function(accounts) { accounts[0], AMOUNT_BT); }) }) - }) + it('successfully revert Minting', async () => { + var result = await openSTUtility.revertMinting(stakingIntentHash, { from: accounts[2] , gasPrice: '0x12A05F200'}); + await OpenSTUtility_utils.checkRevertedMintEvent(result.logs[0], checkBtUuid, stakingIntentHash, accounts[0], + accounts[0], AMOUNT_BT); + }) + }) }); - }); diff --git a/test/OpenSTUtility_utils.js b/test/OpenSTUtility_utils.js index d855db24..a2ec2d8c 100644 --- a/test/OpenSTUtility_utils.js +++ b/test/OpenSTUtility_utils.js @@ -150,7 +150,7 @@ module.exports.checkStakingIntentConfirmedEventOnProtocol = (formattedDecodedEve assert.equal(event._amountUT, _amountUT.toNumber()); } -module.exports.checkProcessedMintEvent = (event, _uuid, _stakingIntentHash, _token, _staker, _beneficiary, _amount) => { +module.exports.checkProcessedMintEvent = (event, _uuid, _stakingIntentHash, _token, _staker, _beneficiary, _amount, _unlockSecret) => { if (Number.isInteger(_amount)) { _amount = new BigNumber(_amount); } @@ -162,6 +162,7 @@ module.exports.checkProcessedMintEvent = (event, _uuid, _stakingIntentHash, _tok assert.equal(event.args._staker, _staker); assert.equal(event.args._beneficiary, _beneficiary); assert.equal(event.args._amount.toNumber(), _amount.toNumber()); + assert.equal(event.args._unlockSecret, _unlockSecret); } module.exports.checkRedemptionIntentDeclaredEvent = (event, _uuid, _redemptionIntentHash, _token, _redeemer, _nonce, _beneficiary, _amount, _unlockHeight, _chainIdValue) => { @@ -193,7 +194,7 @@ module.exports.checkRedemptionIntentDeclaredEvent = (event, _uuid, _redemptionIn assert.equal(event.args._chainIdValue.toNumber(), _chainIdValue.toNumber()); } -module.exports.checkProcessedRedemptionEvent = (event, _uuid, _redemptionIntentHash, _token, _redeemer, _beneficiary, _amount) => { +module.exports.checkProcessedRedemptionEvent = (event, _uuid, _redemptionIntentHash, _token, _redeemer, _beneficiary, _amount, _unlockSecret) => { if (Number.isInteger(_amount)) { _amount = new BigNumber(_amount); } @@ -205,6 +206,7 @@ module.exports.checkProcessedRedemptionEvent = (event, _uuid, _redemptionIntentH assert.equal(event.args._redeemer, _redeemer); assert.equal(event.args._beneficiary, _beneficiary); assert.equal(event.args._amount.toNumber(), _amount.toNumber()); + assert.equal(event.args._unlockSecret, _unlockSecret); } module.exports.checkRevertedMintEvent = (event, _uuid, _stakingIntentHash, _staker, _beneficiary, _amount) => { diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 17f8d5cb..b2760aef 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -20,6 +20,7 @@ // ---------------------------------------------------------------------------- const Utils = require('./lib/utils.js'); +const HashLock = require('./lib/hash_lock.js'); const OpenSTValue_utils = require('./OpenSTValue_utils.js'); const Core = artifacts.require("./Core.sol"); const SimpleStake = artifacts.require("./SimpleStake.sol"); @@ -27,12 +28,12 @@ const BigNumber = require('bignumber.js'); /// /// Test stories -/// +/// /// Properties /// has chainIdValue /// has valueToken /// has registrar -/// +/// /// AddCore /// fails to add core by non-registrar /// fails to add core by registrar when core is null @@ -50,11 +51,11 @@ const BigNumber = require('bignumber.js'); /// fails to register when the given UUID does not match the calculated hash /// successfully registers /// fails to register if already exists -/// +/// /// Stake /// when the staking account is null /// fails to stake when amount is not > 0 -/// fails to stake when tx.origin has not approved it to transfer at least the amount +/// fails to stake when msg.sender has not approved it to transfer at least the amount /// fails to stake when the SimpleStake address for the given UUID is null /// fails to stake when the beneficiary is null /// successfully stakes @@ -64,13 +65,10 @@ const BigNumber = require('bignumber.js'); /// /// ProcessStaking /// fails to process when stakingIntentHash is empty -/// fails to process when msg.sender is not staker or registrar +/// fails to process if hash of unlockSecret does not match hashlock /// successfully processes /// fails to reprocess /// -/// ProcessStaking with fallback -/// successfully processes by registrar -/// /// ConfirmRedemptionIntent /// fails to confirm by non-registrar /// fails to confirm when utility token does not have a simpleStake address @@ -87,7 +85,7 @@ const BigNumber = require('bignumber.js'); /// ProcessUnstaking /// when expirationHeight is > block number /// fails to process when redemptionIntentHash is empty -/// fails to process when redeemer is not msg.sender +/// fails to process if hash of unlockSecret does not match hashlock /// fails to process when utility token does not have a simpleStake address /// successfully processes /// fails to reprocess @@ -104,7 +102,7 @@ contract('OpenSTValue', function(accounts) { const name = "Simple Token"; const conversionRateDecimals = 5; const conversionRate = new BigNumber(10 * 10**conversionRateDecimals); // conversion rate => 10 - + var valueToken = null; var openSTValue = null; var core = null; @@ -216,6 +214,8 @@ contract('OpenSTValue', function(accounts) { describe('Stake', async () => { const amountST = new BigNumber(web3.toWei(1, "ether")); + const lock = HashLock.getHashLock(); + context('when the staking account is null', async () => { before(async () => { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); @@ -226,33 +226,34 @@ contract('OpenSTValue', function(accounts) { }) it('fails to stake when amount is not > 0', async () => { - await Utils.expectThrow(openSTValue.stake(checkUuid, 0, accounts[0], { from: accounts[0] })); + await Utils.expectThrow(openSTValue.stake(checkUuid, 0, accounts[0], lock.l, { from: accounts[0] })); }) - it('fails to stake when tx.origin has not approved it to transfer at least the amount', async () => { - await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], { from: accounts[0] })); + it('fails to stake when msg.sender has not approved it to transfer at least the amount', async () => { + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] })); }) it('fails to stake when the SimpleStake address for the given UUID is null', async () => { await valueToken.approve(openSTValue.address, amountST, { from: accounts[0] }); - await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], { from: accounts[0] })); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] })); }) it('fails to stake when the beneficiary is null', async () => { checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); - await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); - await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, 0, { from: accounts[0] })); + await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, 0, lock.l, { from: accounts[0] })); }) it('successfully stakes', async () => { - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], { from: accounts[0] }); + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); var amountUT = stakeReturns[0].toNumber(); nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number var unlockHeight = stakeReturns[2].plus(1); - stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight); - result = await openSTValue.stake(checkUuid, amountST, accounts[0], { from: accounts[0] }); + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, + amountUT, unlockHeight, lock.l); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); @@ -273,18 +274,19 @@ contract('OpenSTValue', function(accounts) { }) it('fails to stake when msg.sender is not the stakingAccount', async () => { - await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], { from: accounts[1] })); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[1] })); }) it('successfully stakes', async () => { - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], { from: accounts[0] }); + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); var amountUT = stakeReturns[0].toNumber(); nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number var unlockHeight = stakeReturns[2].plus(1); - stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight); - result = await openSTValue.stake(checkUuid, amountST, accounts[0], { from: accounts[0] }); + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, + amountUT, unlockHeight, lock.l); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); @@ -295,6 +297,8 @@ contract('OpenSTValue', function(accounts) { describe('ProcessStaking', async () => { const amountST = new BigNumber(web3.toWei(1, "ether")), amountUT = amountST.mul(new BigNumber(conversionRate)).div(new BigNumber(10**conversionRateDecimals)); + const lock = HashLock.getHashLock(); + before(async () => { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; @@ -305,17 +309,18 @@ contract('OpenSTValue', function(accounts) { result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); stake = result.logs[0].args.stake; await valueToken.approve(openSTValue.address, amountST, { from: accounts[0] }); - result = await openSTValue.stake(checkUuid, amountST, accounts[0], { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); stakingIntentHash = result.logs[0].args._stakingIntentHash; }) it('fails to process when stakingIntentHash is empty', async () => { - await Utils.expectThrow(openSTValue.processStaking("", { from: accounts[0] })); + await Utils.expectThrow(openSTValue.processStaking("", lock.s, { from: accounts[0] })); }) - it('fails to process when msg.sender is not staker or registrar', async () => { + it('fails to process if hash of unlockSecret does not match hashlock', async () => { + const differentLock = HashLock.getHashLock(); // registrar can additionally as a fallback process staking in v0.9 - await Utils.expectThrow(openSTValue.processStaking(stakingIntentHash, { from: accounts[5] })); + await Utils.expectThrow(openSTValue.processStaking(stakingIntentHash, differentLock.s, { from: accounts[5] })); }) it('successfully processes', async () => { @@ -323,50 +328,17 @@ contract('OpenSTValue', function(accounts) { var stakeBal = await valueToken.balanceOf.call(stake); assert.equal(openSTValueBal.toNumber(), amountST); assert.equal(stakeBal.toNumber(), 0); - result = await openSTValue.processStaking(stakingIntentHash, { from: accounts[0] }); + result = await openSTValue.processStaking(stakingIntentHash, lock.s, { from: accounts[0] }); openSTValueBal = await valueToken.balanceOf.call(openSTValue.address); stakeBal = await valueToken.balanceOf.call(stake); assert.equal(openSTValueBal.toNumber(), 0); assert.equal(stakeBal.toNumber(), amountST); - await OpenSTValue_utils.checkProcessedStakeEvent(result.logs[0], checkUuid, stakingIntentHash, stake, accounts[0], amountST, amountUT); + await OpenSTValue_utils.checkProcessedStakeEvent(result.logs[0], checkUuid, stakingIntentHash, stake, accounts[0], amountST, amountUT, lock.s); }) it('fails to reprocess', async () => { - await Utils.expectThrow(openSTValue.processStaking(stakingIntentHash, { from: accounts[0] })); - }) - }) - - describe('ProcessStaking with fallback', async () => { - const amountST = new BigNumber(web3.toWei(1, "ether")), - amountUT = amountST.mul(new BigNumber(conversionRate)).div(new BigNumber(10**conversionRateDecimals)); - - before(async () => { - contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); - valueToken = contracts.valueToken; - openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); - await openSTValue.addCore(core.address, { from: registrar }); - checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); - result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); - stake = result.logs[0].args.stake; - await valueToken.approve(openSTValue.address, amountST, { from: accounts[0] }); - result = await openSTValue.stake(checkUuid, amountST, accounts[0], { from: accounts[0] }); - stakingIntentHash = result.logs[0].args._stakingIntentHash; - }) - - it('successfully processes by registrar', async () => { - var openSTValueBal = await valueToken.balanceOf.call(openSTValue.address); - var stakeBal = await valueToken.balanceOf.call(stake); - assert.equal(openSTValueBal.toNumber(), amountST); - assert.equal(stakeBal.toNumber(), 0); - result = await openSTValue.processStaking(stakingIntentHash, { from: registrar }); - - openSTValueBal = await valueToken.balanceOf.call(openSTValue.address); - stakeBal = await valueToken.balanceOf.call(stake); - assert.equal(openSTValueBal.toNumber(), 0); - assert.equal(stakeBal.toNumber(), amountST); - await OpenSTValue_utils.checkProcessedStakeEvent(result.logs[0], checkUuid, stakingIntentHash, stake, accounts[0], amountST, amountUT); + await Utils.expectThrow(openSTValue.processStaking(stakingIntentHash, lock.s, { from: accounts[0] })); }) }) @@ -378,6 +350,9 @@ contract('OpenSTValue', function(accounts) { var redemptionUnlockHeight = 80668; var amountUT = conversionRate.div(new BigNumber(10**conversionRateDecimals)); + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + before(async () => { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; @@ -391,62 +366,61 @@ contract('OpenSTValue', function(accounts) { }) it('fails to confirm by non-registrar', async () => { - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: accounts[0] })); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: accounts[0] })); }) it('fails to confirm when utility token does not have a simpleStake address', async () => { // Recalculate hash to confirm that it is not the error - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar })); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); }) it('fails to confirm when amountUT is not > 0', async () => { // Recalculate hash to confirm that it is not the error - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight, redemptionIntentHash, { from: registrar })); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); }) it('fails to confirm when redemptionUnlockHeight is not > 0', async () => { // Recalculate hash to confirm that it is not the error - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0, redemptionIntentHash, { from: registrar })); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0, lockR.l, redemptionIntentHash, { from: registrar })); }) it('fails to confirm when redemptionIntentHash is empty', async () => { - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, "", { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, "", { from: registrar })); }) it('fails to confirm when nonce is not exactly 1 greater than previously', async () => { // Recalculate hash to confirm that it is not the error - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar })); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); }) it('fails to confirm when redemptionIntentHash does not match calculated hash', async () => { - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, "bad hash", { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, "bad hash", { from: registrar })); }) it('fails to confirm when token balance of stake is not >= amountST', async () => { - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar })); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); }) it('successfully confirms', async () => { await valueToken.approve(openSTValue.address, 2, { from: accounts[0] }); - result = await openSTValue.stake(checkUuid, 2, accounts[0], { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, 2, accounts[0], lock.l, { from: accounts[0] }); stakingIntentHash = result.logs[0].args._stakingIntentHash; - await openSTValue.processStaking(stakingIntentHash, { from: accounts[0] }); - - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight); + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: accounts[0] }); - var confirmReturns = await openSTValue.confirmRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar }) + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + var confirmReturns = await openSTValue.confirmRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }) var amountST = confirmReturns[0]; assert.equal(amountST, (amountUT / conversionRate)*10**conversionRateDecimals); - - result = await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar }); + + result = await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); var blocks_to_wait_short = await openSTValue.blocksToWaitShort.call(); - + var blockNumber = web3.eth.blockNumber; var expirationHeight = blockNumber + blocks_to_wait_short.toNumber(); await OpenSTValue_utils.checkRedemptionIntentConfirmedEvent(result.logs[0], checkUuid, redemptionIntentHash, redeemer, redeemBeneficiary, amountST, amountUT, expirationHeight); @@ -454,8 +428,8 @@ contract('OpenSTValue', function(accounts) { }) it('fails to confirm a replay', async () => { - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar })); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); }) // Fails because logic does not prevent attempting to redeem 1 UTWei when the conversion rate is greater than 1 @@ -463,18 +437,22 @@ contract('OpenSTValue', function(accounts) { nonce = await openSTValue.getNextNonce.call(redeemer); // 1 STWei == 10 UTWei at the given conversion rate - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight, redemptionIntentHash, { from: registrar })); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); }) }) describe('ProcessUnstaking', async () => { var redeemer = accounts[2]; var redeemBeneficiary = accounts[3]; + var notRedeemer = accounts[5]; var redemptionIntentHash = null; var redemptionUnlockHeight = 80668; var amountUT = conversionRate.div(new BigNumber(10**conversionRateDecimals)); + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + context('when expirationHeight is > block number', async () => { before(async () => { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); @@ -487,23 +465,23 @@ contract('OpenSTValue', function(accounts) { stake = result.logs[0].args.stake; nonce = await openSTValue.getNextNonce.call(redeemer); await valueToken.approve(openSTValue.address, 1, { from: accounts[0] }); - result = await openSTValue.stake(checkUuid, 1, accounts[0], { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, 1, accounts[0], lock.l, { from: accounts[0] }); stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, { from: accounts[0] }); - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight); - await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar }); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); }) it('fails to process when redemptionIntentHash is empty', async () => { - await Utils.expectThrow(openSTValue.processUnstaking("", { from: redeemer })); + await Utils.expectThrow(openSTValue.processUnstaking("", lockR.s, { from: notRedeemer })); }) - it('fails to process when redeemer is not msg.sender', async () => { - await Utils.expectThrow(openSTValue.processUnstaking(redemptionIntentHash, { from: accounts[0] })); + it('fails to process if hash of unlockSecret does not match hashlock', async () => { + await Utils.expectThrow(openSTValue.processUnstaking(redemptionIntentHash, "incorrect unlock secret", { from: notRedeemer })); }) it('fails to process when utility token does not have a simpleStake address', async () => { - await Utils.expectThrow(openSTValue.processUnstaking("bad hash", { from: accounts[0] })); + await Utils.expectThrow(openSTValue.processUnstaking("bad hash", lockR.s, { from: notRedeemer })); }) it('successfully processes', async () => { @@ -511,17 +489,17 @@ contract('OpenSTValue', function(accounts) { var redeemBeneficiaryBal = await valueToken.balanceOf.call(redeemer); assert.equal(stakeBal.toNumber(), 1); assert.equal(redeemBeneficiaryBal.toNumber(), 0); - result = await openSTValue.processUnstaking(redemptionIntentHash, { from: redeemer }); - + result = await openSTValue.processUnstaking(redemptionIntentHash, lockR.s, { from: redeemer }); + stakeBal = await valueToken.balanceOf.call(stake); redeemBeneficiaryBal = await valueToken.balanceOf.call(redeemBeneficiary); assert.equal(stakeBal.toNumber(), 0); assert.equal(redeemBeneficiaryBal.toNumber(), 1); - await OpenSTValue_utils.checkProcessedUnstakeEvent(result.logs[0], checkUuid, redemptionIntentHash, stake, redeemer, redeemBeneficiary, 1); + await OpenSTValue_utils.checkProcessedUnstakeEvent(result.logs[0], checkUuid, redemptionIntentHash, stake, redeemer, redeemBeneficiary, 1, lockR.s); }) it('fails to reprocess', async () => { - await Utils.expectThrow(openSTValue.processUnstaking(redemptionIntentHash, { from: redeemer })); + await Utils.expectThrow(openSTValue.processUnstaking(redemptionIntentHash, lockR.s, { from: notRedeemer })); }) }) }) @@ -530,9 +508,11 @@ contract('OpenSTValue', function(accounts) { // Revert Staking before ProcessStaking describe('Process RevertStaking before ProcessStaking', async () => { + const lock = HashLock.getHashLock(); + context('Revert Stake', async () => { - var staker = accounts[0]; + var staker = accounts[0]; var owner = accounts[1]; var amountST = new BigNumber(web3.toWei(126, "ether")); var amountUT = null; @@ -546,54 +526,54 @@ contract('OpenSTValue', function(accounts) { await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); - await valueToken.approve(openSTValue.address, amountST, { from: staker }); + await valueToken.approve(openSTValue.address, amountST, { from: staker }); //Successfully Staking - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, { from: staker }); + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, lock.l, { from: staker }); amountUT = stakeReturns[0].toNumber(); nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - unlockHeight = stakeReturns[2].plus(1); - stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight); - result = await openSTValue.stake(checkUuid, amountST, staker, { from: staker }); - await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); + unlockHeight = stakeReturns[2].plus(1); + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); }); - - it('fails to process when stakingIntentHash is empty', async () => { + + it('fails to process when stakingIntentHash is empty', async () => { await Utils.expectThrow(openSTValue.revertStaking("", {from: staker})); }); - it('fails to process when stakingIntentHash is Bad Hash', async () => { + it('fails to process when stakingIntentHash is Bad Hash', async () => { await Utils.expectThrow(openSTValue.revertStaking("Bad Hash", {from: staker})); }); - it('fails to process when reverting before waiting period ends', async () => { + it('fails to process when reverting before waiting period ends', async () => { // for test of the test case lets make sure that waiting period is ended var waitTime = await openSTValue.blocksToWaitLong.call(); waitTime = waitTime.toNumber()-3; - // Wait time less 1 block for preceding test case and 1 block because condition is <= + // Wait time less 1 block for preceding test case and 1 block because condition is <= for (var i = 0; i < waitTime ; i++) { await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); } }); - - it('success processing revert staking', async () => { + + it('success processing revert staking', async () => { var result = await openSTValue.revertStaking(stakingIntentHash, {from: staker}); OpenSTValue_utils.checkRevertStakingEventProtocol(result.logs[0], checkUuid, stakingIntentHash, staker, amountST, amountUT); }); - it('fails to process revert staking', async () => { + it('fails to process revert staking', async () => { - await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); + await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); }); @@ -601,7 +581,7 @@ contract('OpenSTValue', function(accounts) { // Revert Staking After ProcessStaking context('Revert Staking After ProcessStaking', async () => { - var staker = accounts[0]; + var staker = accounts[0]; var owner = accounts[1]; var amountST = new BigNumber(web3.toWei(126, "ether")); var amountUT = null; @@ -615,42 +595,43 @@ contract('OpenSTValue', function(accounts) { await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); - await valueToken.approve(openSTValue.address, amountST, { from: staker }); + await valueToken.approve(openSTValue.address, amountST, { from: staker }); //Successfully Staking - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, { from: staker }); + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, lock.l, { from: staker }); amountUT = stakeReturns[0].toNumber(); nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number unlockHeight = stakeReturns[2].plus(1); - stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight); - result = await openSTValue.stake(checkUuid, amountST, staker, { from: staker }); - await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, + amountUT, unlockHeight, lock.l); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); // Process Staking - await openSTValue.processStaking(stakingIntentHash, { from: staker }); + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); }); - - it('fails to process when reverting before waiting period ends', async () => { + + it('fails to process when reverting before waiting period ends', async () => { // for test of the test case lets make sure that waiting period is ended var waitTime = await openSTValue.blocksToWaitLong.call(); waitTime = waitTime.toNumber()-1; - // Wait time less 1 block for preceding test case and 1 block because condition is <= + // Wait time less 1 block for preceding test case and 1 block because condition is <= for (var i = 0; i < waitTime; i++) { - await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); + await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); } }) - it('fails to process revert staking', async () => { + it('fails to process revert staking', async () => { + + await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); - await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); - }); - + }); }); @@ -667,6 +648,9 @@ contract('OpenSTValue', function(accounts) { var amountUT = (new BigNumber(amountST * conversionRate)).div(new BigNumber(10**conversionRateDecimals)); var externalUser = accounts[7]; + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + context('Revert Unstaking before ProcessUnstaking ', async () => { before(async () => { @@ -680,28 +664,28 @@ contract('OpenSTValue', function(accounts) { stake = result.logs[0].args.stake; nonce = await openSTValue.getNextNonce.call(redeemer); await valueToken.approve(openSTValue.address, amountST, { from: staker }); - result = await openSTValue.stake(checkUuid, amountST, staker, { from: staker }); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); stakingIntentHash = result.logs[0].args._stakingIntentHash; - await openSTValue.processStaking(stakingIntentHash, { from: staker }); - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight); - await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar }); + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); }); - + it('fails to process when redemptionIntentHash is empty ', async () => { - await Utils.expectThrow(openSTValue.revertUnstaking("", { from: externalUser })); + await Utils.expectThrow(openSTValue.revertUnstaking("", { from: externalUser })); }); it('fails to process when redemptionIntentHash is Bad Hash ', async () => { - await Utils.expectThrow(openSTValue.revertUnstaking("Bad Hash", { from: externalUser })); + await Utils.expectThrow(openSTValue.revertUnstaking("Bad Hash", { from: externalUser })); }); - it('fails to process when reverting before waiting period ends', async () => { + it('fails to process when reverting before waiting period ends', async () => { // for test of the test case lets make sure that waiting period is ended var waitTime = await openSTValue.blocksToWaitShort.call(); @@ -710,7 +694,7 @@ contract('OpenSTValue', function(accounts) { for (var i = 0; i < waitTime ; i++) { await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); } - + }); @@ -723,10 +707,10 @@ contract('OpenSTValue', function(accounts) { it('fails to process when revertUnstaking once its already done', async () => { - await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); + await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); }); - + }); context('Revert Unstaking after ProcessUnstaking ', async () => { @@ -742,19 +726,19 @@ contract('OpenSTValue', function(accounts) { stake = result.logs[0].args.stake; nonce = await openSTValue.getNextNonce.call(redeemer); await valueToken.approve(openSTValue.address, amountST, { from: staker }); - result = await openSTValue.stake(checkUuid, amountST, staker, { from: staker }); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); stakingIntentHash = result.logs[0].args._stakingIntentHash; - await openSTValue.processStaking(stakingIntentHash, { from: staker }); - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight); - await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, redemptionIntentHash, { from: registrar }); + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); - // Successfull ProcessUnstaking - processUnstakingResult = await openSTValue.processUnstaking(redemptionIntentHash, { from: redeemer }); - await OpenSTValue_utils.checkProcessedUnstakeEvent(processUnstakingResult.logs[0], checkUuid, redemptionIntentHash, stake, redeemer, redeemBeneficiary, amountST); + // Successfull ProcessUnstaking + processUnstakingResult = await openSTValue.processUnstaking(redemptionIntentHash, lockR.s, { from: redeemer }); + await OpenSTValue_utils.checkProcessedUnstakeEvent(processUnstakingResult.logs[0], checkUuid, redemptionIntentHash, stake, redeemer, redeemBeneficiary, amountST, lockR.s); }); - + it('fails to process when revertUnstaking once its already done', async () => { @@ -764,7 +748,7 @@ contract('OpenSTValue', function(accounts) { for (var i = 0; i < waitTime ; i++) { await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); } - await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); + await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); }); diff --git a/test/OpenSTValue_utils.js b/test/OpenSTValue_utils.js index e2cde0cd..02795b0a 100644 --- a/test/OpenSTValue_utils.js +++ b/test/OpenSTValue_utils.js @@ -25,7 +25,7 @@ const BigNumber = require('bignumber.js'); var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); -/// @dev Deploy +/// @dev Deploy module.exports.deployOpenSTValue = async (artifacts, accounts) => { const chainIdValue = 3; const valueToken = await SimpleToken.new(); @@ -148,7 +148,7 @@ module.exports.checkStakingIntentDeclaredEventProtocol = (event, _uuid, _staker, assert.equal(event.args._chainIdUtility.toNumber(), _chainIdUtility.toNumber()); } -module.exports.checkProcessedStakeEvent = (event, _uuid, _stakingIntentHash, _stake, _staker, _amountST, _amountUT) => { +module.exports.checkProcessedStakeEvent = (event, _uuid, _stakingIntentHash, _stake, _staker, _amountST, _amountUT, _unlockSecret) => { if (Number.isInteger(_amountST)) { _amountST = new BigNumber(_amountST); } @@ -164,6 +164,7 @@ module.exports.checkProcessedStakeEvent = (event, _uuid, _stakingIntentHash, _st assert.equal(event.args._staker, _staker); assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); assert.equal(event.args._amountUT.toNumber(), _amountUT.toNumber()); + assert.equal(event.args._unlockSecret, _unlockSecret); } module.exports.checkRedemptionIntentConfirmedEvent = (event, _uuid, _redemptionIntentHash, _redeemer, _beneficiary, _amountST, _amountUT, _expirationHeight) => { @@ -212,7 +213,7 @@ module.exports.checkRedemptionIntentConfirmedEventOnProtocol = (formattedDecoded assert.isAbove(_unlockHeight.toNumber(), 0); } -module.exports.checkProcessedUnstakeEvent = (event, _uuid, _redemptionIntentHash, stake, _redeemer, _beneficiary, _amountST) => { +module.exports.checkProcessedUnstakeEvent = (event, _uuid, _redemptionIntentHash, stake, _redeemer, _beneficiary, _amountST, _unlockSecret) => { if (Number.isInteger(_amountST)) { _amountST = new BigNumber(_amountST); } @@ -224,6 +225,7 @@ module.exports.checkProcessedUnstakeEvent = (event, _uuid, _redemptionIntentHash assert.equal(event.args._redeemer, _redeemer); assert.equal(event.args._beneficiary, _beneficiary); assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); + assert.equal(event.args._unlockSecret, _unlockSecret); } module.exports.checkRevertStakingEventProtocol = (event, _uuid, _stakingIntentHash, _staker, _amountST, _amountUT) => { @@ -257,4 +259,4 @@ module.exports.checkRevertedUnstake = (event, _uuid, _redemptionIntentHash, _red assert.equal(event.args._beneficiary, _beneficiary); assert.equal(event.args._amountST, _amountST.toNumber()); -} \ No newline at end of file +} diff --git a/test/Protocol.js b/test/Protocol.js index ae405f17..4cb1583f 100644 --- a/test/Protocol.js +++ b/test/Protocol.js @@ -22,6 +22,7 @@ const Assert = require('assert'); const BigNumber = require('bignumber.js'); const utils = require("./lib/utils.js"); +const HashLock = require('./lib/hash_lock.js'); const openSTValueUtils = require("./OpenSTValue_utils.js"); const openSTUtilityUtils = require('./OpenSTUtility_utils.js'); const web3EventsDecoder = require('./lib/event_decoder.js'); @@ -37,14 +38,14 @@ const CHAINID_VALUE = new BigNumber(2001); const CHAINID_UTILITY = new BigNumber(2002); contract('OpenST', function(accounts) { - + const conversionRateDecimals = 5; const TOKEN_SYMBOL = "ST"; const TOKEN_NAME = "Simple Token"; const TOKEN_DECIMALS = 18; const TOKENS_MAX = new BigNumber(web3.toWei(800000000, "ether")); - + const STPRIME_SYMBOL = "STP"; const STPRIME_NAME = "SimpleTokenPrime"; const STPRIME_CONVERSION_RATE = 1; @@ -55,21 +56,25 @@ contract('OpenST', function(accounts) { const name = "Branded Token"; const conversionRate = new BigNumber(10 * (10**conversionRateDecimals)); // conversion rate => 10 - const deployMachine = accounts[0]; - const owner = accounts[1]; - const admin = accounts[2]; - const ops = accounts[3]; - const intercommVC = accounts[4]; - const intercommUC = accounts[5]; - const requester = accounts[6]; - const staker = accounts[7]; - const redeemer = accounts[8]; - const redeemBeneficiary = accounts[9]; + const deployMachine = accounts[0]; + const owner = accounts[1]; + const admin = accounts[2]; + const ops = accounts[3]; + const intercommVC = accounts[4]; + const intercommUC = accounts[5]; + const requester = accounts[6]; + const stakerVC = accounts[7]; + const stakerUC = accounts[8]; + const beneficiary = accounts[10]; + // account 9 and 19 have no base tokens + const redeemer = accounts[9]; + const redeemBeneficiary = accounts[19]; const AMOUNT_ST = new BigNumber(web3.toWei(1000, "ether")); const AMOUNT_BT = (AMOUNT_ST.mul(conversionRate)).div(new BigNumber(10**conversionRateDecimals)); const REDEEM_AMOUNT_BT = new BigNumber(web3.toWei(5, "ether")); - const REDEEM_AMOUNT_STPRIME = new BigNumber(web3.toWei(15, "ether")); + const FUND_AMOUNT_STPRIME = new BigNumber(web3.toWei(15, "ether")); + const REDEEM_AMOUNT_STPRIME = new BigNumber(web3.toWei(10, "ether")); describe('Setup Utility chain with Simple Token Prime', function () { @@ -82,8 +87,8 @@ contract('OpenST', function(accounts) { var stPrime = null; var btSimpleStake = null; - var btSimpleStakeContractAddress = null; - var stPrimeSimpleStakeContractAddress = null; + var btSimpleStakeContractAddress = null; + var stPrimeSimpleStakeContractAddress = null; var registeredBrandedTokenUuid = null; var registeredBrandedToken = null; var nonceBT = null; @@ -121,11 +126,11 @@ contract('OpenST', function(accounts) { const o = await registrarVC.registerUtilityToken(openSTValue.address, STPRIME_SYMBOL, STPRIME_NAME, STPRIME_CONVERSION_RATE, STPRIME_CONVERSION_RATE_DECIMALS, CHAINID_UTILITY, 0, uuidSTP, { from: intercommVC }); - + utils.logResponse(o, "RegistrarVC.registerUtilityToken (STP)"); var formattedDecodedEvents = web3EventsDecoder.perform(o.receipt, openSTValue.address, openSTValueArtifacts.abi); - + openSTValueUtils.checkUtilityTokenRegisteredEventOnProtocol(formattedDecodedEvents, uuidSTP, STPRIME_SYMBOL, STPRIME_NAME, TOKEN_DECIMALS, STPRIME_CONVERSION_RATE, CHAINID_UTILITY, 0); @@ -140,10 +145,10 @@ contract('OpenST', function(accounts) { it("initialize transfer to Simple Token Prime contract address", async () => { Assert.equal(await web3.eth.getBalance(stPrime.address), 0); - const o = await stPrime.initialize({ from: deployMachine, value: TOKENS_MAX}); + const o = await stPrime.initialize({ from: deployMachine, value: TOKENS_MAX}); utils.logResponse(o, "STPrime.initialize"); var stPrimeContractBalanceAfterTransfer = await web3.eth.getBalance(stPrime.address).toNumber(); - Assert.equal(stPrimeContractBalanceAfterTransfer, TOKENS_MAX); + Assert.equal(stPrimeContractBalanceAfterTransfer, TOKENS_MAX); }); it("report gas usage: deployment and setup", async () => { @@ -154,20 +159,22 @@ contract('OpenST', function(accounts) { context('stake Simple Token for Simple Token Prime', function() { + const lockSTP = HashLock.getHashLock(); + it("stake Simple Token", async () => { uuidSTP = await openSTUtility.uuidSTPrime.call(); // transfer ST to staker account - Assert.ok(await simpleToken.transfer(staker, AMOUNT_ST, { from: deployMachine })); + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); // staker sets allowance for OpenSTValue - Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: staker })); + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); // for testing purpose query nonceSTP in advance - nonceSTP = await openSTValue.getNextNonce.call(staker); + nonceSTP = await openSTValue.getNextNonce.call(stakerVC); Assert.equal(nonceSTP, 1); // staker calls OpenSTValue.stake to initiate the staking for ST' with uuidSTP // with staker as the beneficiary - const o = await openSTValue.stake(uuidSTP, AMOUNT_ST, staker, { from: staker }); + const o = await openSTValue.stake(uuidSTP, AMOUNT_ST, beneficiary, lockSTP.l, { from: stakerVC }); utils.logResponse(o, "OpenSTValue.stake"); - openSTValueUtils.checkStakingIntentDeclaredEventProtocol(o.logs[0], uuidSTP, staker, nonceSTP, staker, + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(o.logs[0], uuidSTP, stakerVC, nonceSTP, beneficiary, AMOUNT_ST, AMOUNT_ST, CHAINID_UTILITY); stakingIntentHash = o.logs[0].args._stakingIntentHash; unlockHeight = o.logs[0].args._unlockHeight; @@ -175,26 +182,28 @@ contract('OpenST', function(accounts) { it("confirm staking intent for Simple Token Prime", async () => { // registrar registers staking intent on utility chain - const o = await registrarUC.confirmStakingIntent(openSTUtility.address, uuidSTP, staker, nonceSTP, - staker, AMOUNT_ST, AMOUNT_ST, unlockHeight, stakingIntentHash, { from: intercommUC }); + const o = await registrarUC.confirmStakingIntent(openSTUtility.address, uuidSTP, stakerVC, nonceSTP, + beneficiary, AMOUNT_ST, AMOUNT_ST, unlockHeight, lockSTP.l, stakingIntentHash, { from: intercommUC }); utils.logResponse(o, "OpenSTUtility.confirmStakingIntent"); }); it("process staking", async () => { - const o = await openSTValue.processStaking(stakingIntentHash, { from: staker }); + const o = await openSTValue.processStaking(stakingIntentHash, lockSTP.s, { from: stakerVC }); utils.logResponse(o, "OpenSTValue.processStaking"); }); it("process minting", async () => { - const o = await openSTUtility.processMinting(stakingIntentHash, { from: staker }); + // the stakerVC no longer needs to be the one calling processMinting on the value chain, + // to illustrate this we explicitly use a new key stakerUC + const o = await openSTUtility.processMinting(stakingIntentHash, lockSTP.s, { from: stakerUC }); utils.logResponse(o, "OpenSTUtility.processMinting"); }); it("claim Simple Token Prime", async () => { - var balanceBefore = await web3.eth.getBalance(staker); - const o = await stPrime.claim(staker, { from: intercommUC }); + var balanceBefore = await web3.eth.getBalance(beneficiary); + const o = await stPrime.claim(beneficiary, { from: intercommUC }); utils.logResponse(o, "STPrime.claim"); - var balanceAfter = await web3.eth.getBalance(staker); + var balanceAfter = await web3.eth.getBalance(beneficiary); var totalSupply = await stPrime.totalSupply.call(); Assert.equal(totalSupply.toNumber(), AMOUNT_ST.toNumber()); Assert.equal(balanceAfter.sub(balanceBefore).toNumber(), AMOUNT_ST.toNumber()); @@ -207,7 +216,6 @@ contract('OpenST', function(accounts) { }); context('propose and register branded token', function() { - // propose branded token it("propose branded token for member company", async() => { @@ -230,12 +238,12 @@ contract('OpenST', function(accounts) { const result = await registrarUC.registerBrandedToken(openSTUtility.address, symbol, name, conversionRate, conversionRateDecimals, requester, registeredBrandedToken, registeredBrandedTokenUuid, { from: intercommUC }); - var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); + var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); - openSTUtilityUtils.checkRegisteredBrandedTokenEventOnProtocol(formattedDecodedEvents, registrarUC.address, - registeredBrandedToken, registeredBrandedTokenUuid, symbol, name, conversionRate, requester); + openSTUtilityUtils.checkRegisteredBrandedTokenEventOnProtocol(formattedDecodedEvents, registrarUC.address, + registeredBrandedToken, registeredBrandedTokenUuid, symbol, name, conversionRate, requester); - utils.logResponse(result, "OpenSTUtility.registerBrandedToken"); + utils.logResponse(result, "OpenSTUtility.registerBrandedToken"); }); // register Utility Token on Value Chain @@ -248,7 +256,7 @@ contract('OpenST', function(accounts) { var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTValue.address, openSTValueArtifacts.abi); openSTValueUtils.checkUtilityTokenRegisteredEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, - symbol, name, TOKEN_DECIMALS, conversionRate, CHAINID_UTILITY, requester); + symbol, name, TOKEN_DECIMALS, conversionRate, CHAINID_UTILITY, stakerVC); var event = formattedDecodedEvents['UtilityTokenRegistered']; @@ -267,27 +275,28 @@ contract('OpenST', function(accounts) { }); - // stake ST for BT context('stake Simple Token for Branded Token', function() { + const lockBT = HashLock.getHashLock(); + it("approve and stake Simple Token", async() => { - // transfer ST to requester account - Assert.ok(await simpleToken.transfer(requester, AMOUNT_ST, { from: deployMachine })); - // Check for requester simpleToken Balance - var balanceOfRequester = await simpleToken.balanceOf(requester); - Assert.equal(balanceOfRequester, AMOUNT_ST.toNumber()); - // requester sets allowance for OpenSTValue - Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: requester })); + // transfer ST to stakerVC account + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); + // Check for stakerVC simpleToken Balance + var balanceOfStaker = await simpleToken.balanceOf(stakerVC); + Assert.equal(balanceOfStaker, AMOUNT_ST.toNumber()); + // stakerVC sets allowance for OpenSTValue + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); // Query nonceBT in advance - nonceBT = await openSTValue.getNextNonce.call(requester); - Assert.equal(nonceBT, 1); - // requester calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid - // with requester as the beneficiary - var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, requester, { from: requester }); + nonceBT = await openSTValue.getNextNonce.call(stakerVC); + Assert.equal(nonceBT, 2); + // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid + // with beneficiary + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockBT.l, { from: stakerVC }); - openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, requester, nonceBT, - requester, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, + beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; unlockHeight = stakeResult.logs[0].args._unlockHeight; @@ -300,22 +309,22 @@ contract('OpenST', function(accounts) { it("confirm staking intent for Branded Token", async() => { const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, - requester, nonceBT, requester, AMOUNT_ST, AMOUNT_BT, unlockHeight, stakingIntentHash, { from: intercommUC }); + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockBT.l, stakingIntentHash, { from: intercommUC }); var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); openSTUtilityUtils.checkStakingIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, - stakingIntentHash, requester, requester, AMOUNT_ST, AMOUNT_BT); + stakingIntentHash, stakerVC, beneficiary, AMOUNT_ST, AMOUNT_BT); utils.logResponse(result, "OpenSTUtility.confirmStakingIntent"); }); it("process staking", async() => { - const result = await openSTValue.processStaking(stakingIntentHash, { from: requester }); + const result = await openSTValue.processStaking(stakingIntentHash, lockBT.s, { from: stakerVC }); openSTValueUtils.checkProcessedStakeEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, - btSimpleStakeContractAddress, requester, AMOUNT_ST, AMOUNT_BT); + btSimpleStakeContractAddress, stakerVC, AMOUNT_ST, AMOUNT_BT, lockBT.s); utils.logResponse(result, "OpenSTValue.processStaking"); @@ -323,18 +332,18 @@ contract('OpenST', function(accounts) { it("process minting", async() => { - const result = await openSTUtility.processMinting(stakingIntentHash, { from: requester }); + const result = await openSTUtility.processMinting(stakingIntentHash, lockBT.s, { from: stakerUC }); openSTUtilityUtils.checkProcessedMintEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, - registeredBrandedToken, requester, requester, AMOUNT_BT); + registeredBrandedToken, stakerVC, beneficiary, AMOUNT_BT, lockBT.s); utils.logResponse(result, "OpenSTValue.processminting"); }); it("claim Branded Token", async() => { - var balanceBefore = await brandedToken.balanceOf(requester); - const o = await brandedToken.claim(requester, { from: intercommUC }); - var balanceAfter = await brandedToken.balanceOf(requester); + var balanceBefore = await brandedToken.balanceOf(beneficiary); + const o = await brandedToken.claim(beneficiary, { from: stakerUC }); + var balanceAfter = await brandedToken.balanceOf(beneficiary); var totalSupply = await brandedToken.totalSupply.call(); Assert.equal(totalSupply.toNumber(), AMOUNT_BT.toNumber()); Assert.equal(balanceAfter.sub(balanceBefore).toNumber(), AMOUNT_BT.toNumber()); @@ -351,7 +360,7 @@ contract('OpenST', function(accounts) { it("transfer branded token from Requester to Redeemer", async() => { - var result = await brandedToken.transfer(redeemer, REDEEM_AMOUNT_BT, { from: requester }); + var result = await brandedToken.transfer(redeemer, REDEEM_AMOUNT_BT, { from: beneficiary }); Assert.ok(result); var balanceOfRedeemer = await brandedToken.balanceOf(redeemer); Assert.equal(balanceOfRedeemer, REDEEM_AMOUNT_BT.toNumber()); @@ -363,9 +372,9 @@ contract('OpenST', function(accounts) { it("transfer STPrime to Redeemer", async() => { var redeemerBalanceBeforeTransfer = await web3.eth.getBalance(redeemer).toNumber(); - result = await web3.eth.sendTransaction({ from: staker, to: redeemer, value: REDEEM_AMOUNT_STPRIME ,gasPrice: '0x12A05F200' }); + result = await web3.eth.sendTransaction({ from: staker, to: redeemer, value: FUND_AMOUNT_STPRIME ,gasPrice: '0x12A05F200' }); var redeemerBalanceAfterTransfer = await web3.eth.getBalance(redeemer).toNumber(); - Assert.equal((redeemerBalanceBeforeTransfer+(REDEEM_AMOUNT_STPRIME.toNumber())), redeemerBalanceAfterTransfer); + Assert.equal((redeemerBalanceBeforeTransfer+(FUND_AMOUNT_STPRIME.toNumber())), redeemerBalanceAfterTransfer); }); @@ -379,6 +388,7 @@ contract('OpenST', function(accounts) { }); context('Redeem and Unstake Branded Token', function() { + const lockRedeem = HashLock.getHashLock(); it("approve branded token", async() => { @@ -391,7 +401,7 @@ contract('OpenST', function(accounts) { it("call redeem", async() => { nonce = await openSTValue.getNextNonce.call(redeemer); - var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, { from: redeemer }); + var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer }); redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; unlockHeight = redeemResult.logs[0].args._unlockHeight; openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, brandedToken.address, @@ -403,7 +413,7 @@ contract('OpenST', function(accounts) { it("confirm redemption intent", async() => { var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, - redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, redemptionIntentHash, { from: intercommVC }); + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); @@ -416,10 +426,10 @@ contract('OpenST', function(accounts) { it("process redemption", async() => { - var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, { from: redeemer }); + var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, lockRedeem.s, { from: redeemer }); openSTUtilityUtils.checkProcessedRedemptionEvent(processRedeemingResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, - brandedToken.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_BT) + brandedToken.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_BT, lockRedeem.s) utils.logResponse(processRedeemingResult, "openSTUtility.processRedeeming"); @@ -427,10 +437,10 @@ contract('OpenST', function(accounts) { it("process unstake", async() => { - var processUnstakeResult = await openSTValue.processUnstaking(redemptionIntentHash, { from: redeemer }); + var processUnstakeResult = await openSTValue.processUnstaking(redemptionIntentHash, lockRedeem.s, { from: redeemer }); openSTValueUtils.checkProcessedUnstakeEvent(processUnstakeResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, - btSimpleStakeContractAddress, redeemer, redeemBeneficiary, redeemedAmountST); + btSimpleStakeContractAddress, redeemer, redeemBeneficiary, redeemedAmountST, lockRedeem.s); utils.logResponse(processUnstakeResult, "openSTValue.processUnstaking"); @@ -445,13 +455,13 @@ contract('OpenST', function(accounts) { }); - // unstake STPrime by Redeemer context('Redeem and Unstake STPrime', function() { + const lockRedeem = HashLock.getHashLock(); it("call redeem", async() => { nonce = await openSTValue.getNextNonce.call(redeemer); - var redeemResult = await openSTUtility.redeemSTPrime(nonce, redeemBeneficiary, { from: redeemer, value: REDEEM_AMOUNT_STPRIME }); + var redeemResult = await openSTUtility.redeemSTPrime(nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer, value: REDEEM_AMOUNT_STPRIME }); redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; unlockHeight = redeemResult.logs[0].args._unlockHeight; openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], uuidSTP, redemptionIntentHash, stPrime.address, @@ -464,7 +474,7 @@ contract('OpenST', function(accounts) { it("confirm redemption intent", async() => { var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, uuidSTP, redeemer, nonce, redeemBeneficiary, - REDEEM_AMOUNT_STPRIME, unlockHeight, redemptionIntentHash, { from: intercommVC }); + REDEEM_AMOUNT_STPRIME, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); @@ -477,10 +487,10 @@ contract('OpenST', function(accounts) { it("process redemption", async() => { - var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, { from: redeemer }); + var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, lockRedeem.s, { from: redeemer }); openSTUtilityUtils.checkProcessedRedemptionEvent(processRedeemingResult.logs[0], uuidSTP, redemptionIntentHash, - stPrime.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_STPRIME) + stPrime.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_STPRIME, lockRedeem.s) utils.logResponse(processRedeemingResult, "openSTUtility.STPrime.processRedeeming"); @@ -488,11 +498,11 @@ contract('OpenST', function(accounts) { it("process unstake", async() => { - var processUnstakeResult = await openSTValue.processUnstaking(redemptionIntentHash, { from: redeemer }); + var processUnstakeResult = await openSTValue.processUnstaking(redemptionIntentHash, lockRedeem.s, { from: redeemer }); var event = processUnstakeResult.logs[0]; openSTValueUtils.checkProcessedUnstakeEvent(event, uuidSTP, redemptionIntentHash, - stPrimeSimpleStakeContractAddress, redeemer, redeemBeneficiary, REDEEM_AMOUNT_STPRIME); + stPrimeSimpleStakeContractAddress, redeemer, redeemBeneficiary, REDEEM_AMOUNT_STPRIME, lockRedeem.s); utils.logResponse(processUnstakeResult, "openSTValue.STPrime.processUnstaking"); }); @@ -506,245 +516,238 @@ contract('OpenST', function(accounts) { }); - // Revert stake - context('Revert stake', function() { - - it("call stake ", async() => { - // transfer ST to requester account - Assert.ok(await simpleToken.transfer(requester, AMOUNT_ST, { from: deployMachine })); - // Check for requester simpleToken Balance - var balanceOfRequester = await simpleToken.balanceOf(requester); - Assert.equal(balanceOfRequester, AMOUNT_ST.toNumber()); - // requester sets allowance for OpenSTValue - Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: requester })); - - nonceBT = await openSTValue.getNextNonce.call(requester); - // requester calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid - // with requester as the beneficiary - var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, requester, { from: requester }); - - openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, requester, nonceBT, - requester, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); - - stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; - - }); - - // // Before wait time as passed - it('fails to revertStaking before waiting period ends', async () => { - var waitTime = await openSTValue.blocksToWaitLong.call(); - waitTime = waitTime.toNumber(); - const amount = new BigNumber(1); - // Wait time less 1 block for preceding test case and 1 block because condition is <= - for (var i = 0; i < waitTime/2 ; i++) { - await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); - await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); - } - }); + context('Revert stake', function() { - it("revert staking after unlocking block height", async() => { - // Revert staking from staker user as it can called from any external user. - // If we put this as a contrain this test case will fail - var result = await openSTValue.revertStaking(stakingIntentHash, {from: staker}); - openSTValueUtils.checkRevertStakingEventProtocol(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, requester, - AMOUNT_ST, AMOUNT_BT) + const lockR = HashLock.getHashLock(); + + it("call stake", async() => { + // transfer ST to stakerVC account + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); + // Check for stakerVC simpleToken Balance + var balanceOfRequester = await simpleToken.balanceOf(stakerVC); + Assert.equal(balanceOfRequester, AMOUNT_ST.toNumber()); + // stakerVC sets allowance for OpenSTValue + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); + + nonceBT = await openSTValue.getNextNonce.call(stakerVC); + // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid + // with beneficiary + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockR.l, { from: stakerVC }); + + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, + beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + + stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; }); - }); + // Before wait time as passed + it('fails to revertStaking before waiting period ends', async () => { + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + const amount = new BigNumber(1); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (var i = 0; i < waitTime/2 ; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); + + it("revert staking after unlocking block height", async() => { + // Revert staking from staker user as it can called from any external user. + // If we put this as a contrain this test case will fail + var result = await openSTValue.revertStaking(stakingIntentHash, {from: stakerVC}); + openSTValueUtils.checkRevertStakingEventProtocol(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, stakerVC, + AMOUNT_ST, AMOUNT_BT) + }); + }); + + context('Revert minting', function() { - // // Revert minting - // // Revert staking should also work smoothly before calling revert minting - context('Revert minting', function() { + const lockR = HashLock.getHashLock(); it("call stake ", async() => { - // transfer ST to requester account - Assert.ok(await simpleToken.transfer(requester, AMOUNT_ST, { from: deployMachine })); + // transfer ST to requester account + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); // requester sets allowance for OpenSTValue - Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: requester })); + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); - nonceBT = await openSTValue.getNextNonce.call(requester); + nonceBT = await openSTValue.getNextNonce.call(stakerVC); // requester calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid // with requester as the beneficiary - var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, requester, { from: requester }); + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockR.l, { from: stakerVC }); - openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, requester, nonceBT, - requester, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, + beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; - unlockHeight = stakeResult.logs[0].args._unlockHeight; - nonceBT = stakeResult.logs[0].args._stakerNonce; + unlockHeight = stakeResult.logs[0].args._unlockHeight; + nonceBT = stakeResult.logs[0].args._stakerNonce; }); - it("confirm staking intent for Branded Token", async() => { - - const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, - requester, nonceBT, requester, AMOUNT_ST, AMOUNT_BT, unlockHeight, stakingIntentHash, { from: intercommUC }); + it("confirm staking intent for Branded Token", async() => { - var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); + const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockR.l, stakingIntentHash, { from: intercommUC }); - openSTUtilityUtils.checkStakingIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, - stakingIntentHash, requester, requester, AMOUNT_ST, AMOUNT_BT); + var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); - utils.logResponse(result, "OpenSTUtility.confirmStakingIntent"); + openSTUtilityUtils.checkStakingIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, + stakingIntentHash, stakerVC, beneficiary, AMOUNT_ST, AMOUNT_BT); - }); + utils.logResponse(result, "OpenSTUtility.confirmStakingIntent"); - // Before wait time as passed - // Revert minting should run only if revert staking can be done. Hence checking that first - it('fails to revertStaking before waiting period ends', async () => { - var waitTime = await openSTValue.blocksToWaitLong.call(); - waitTime = waitTime.toNumber(); - // Wait time less 1 block for preceding test case and 1 block because condition is <= - const amount = new BigNumber(1); - for (var i = 0; i < waitTime/2; i++) { - await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); - await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); - } - }); + }); - it("revert staking after unlocking block height", async() => { - // Revert staking from staker user as it can called from any external user. - // If we put this as a contraint this test case will fail - var result = await openSTValue.revertStaking(stakingIntentHash, {from: staker}); - openSTValueUtils.checkRevertStakingEventProtocol(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, requester, - AMOUNT_ST, AMOUNT_BT) + it('fails to revertStaking before waiting period ends', async () => { + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + const amount = new BigNumber(1); + for (var i = 0; i < waitTime/2; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); - }); + it("revert staking after unlocking block height", async() => { + // Revert staking from staker user as it can called from any external user. + // If we put this as a contraint this test case will fail + var result = await openSTValue.revertStaking(stakingIntentHash, {from: stakerVC}); + openSTValueUtils.checkRevertStakingEventProtocol(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, stakerVC, + AMOUNT_ST, AMOUNT_BT) + }); - // Before wait time as passed + // Before wait time as passed it('fails to revertMinting before expiration block', async () => { var waitTime = await openSTUtility.blocksToWaitShort.call(); waitTime = waitTime.toNumber(); // Wait time less 1 block for preceding test case and 1 block because condition is <= - const amount = new BigNumber(1); for (var i = 0; i < waitTime/2; i++) { - await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); - await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); } }); it("revert minting after expiring block height", async() => { - // Revert minting from staker user as it can called from any external user. - // If we put this as a contraint this test case will fail - var result = await openSTUtility.revertMinting(stakingIntentHash, {from: staker}); - openSTUtilityUtils.checkRevertedMintEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, - requester, requester, AMOUNT_BT) - - }); - - }); - // - // // After process staking, revertStake cannot be called but revertMinting can still be called. - // // As of now ST get stuck in SimpleStake Contract for the staker which should ideally be returned after revertMinting - // // Checking the ST balance in SimpleStake as non zero which will start failing once we fix the issue of - // // releasing ST after revertMinting as well - context('Revert minting after process Staking', function() { - - var previousSTBalance = null; + // Revert minting from staker user as it can called from any external user. + // If we put this as a contraint this test case will fail + var result = await openSTUtility.revertMinting(stakingIntentHash, {from: stakerVC}); + openSTUtilityUtils.checkRevertedMintEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, + stakerVC, beneficiary, AMOUNT_BT) + }); + }); - it("previous balance on simple stake", async() => { + // // After process staking, revertStake cannot be called but revertMinting can still be called. + // // As of now ST get stuck in SimpleStake Contract for the staker which should ideally be returned after revertMinting + // // Checking the ST balance in SimpleStake as non zero which will start failing once we fix the issue of + // // releasing ST after revertMinting as well + context('Revert minting after process Staking', function() { - previousSTBalance = await btSimpleStake.getTotalStake.call(); + const lockStake = HashLock.getHashLock(); + var previousSTBalance = null; - }); + it("previous balance on simple stake", async() => { + previousSTBalance = await btSimpleStake.getTotalStake.call(); + }); - it("call stake ", async() => { + it("call stake", async() => { // transfer ST to requester account - Assert.ok(await simpleToken.transfer(requester, AMOUNT_ST, { from: deployMachine })); - Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: requester })); + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); - nonceBT = await openSTValue.getNextNonce.call(requester); - // requester calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid - // with requester as the beneficiary - var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, requester, { from: requester }); + nonceBT = await openSTValue.getNextNonce.call(stakerVC); + // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid + // with stakerVC as the beneficiary + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockStake.l, { from: stakerVC }); - openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, requester, nonceBT, - requester, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, + beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; unlockHeight = stakeResult.logs[0].args._unlockHeight; nonceBT = stakeResult.logs[0].args._stakerNonce; - }); + }); - it("confirm staking intent for Branded Token", async() => { + it("confirm staking intent for Branded Token", async() => { - const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, - requester, nonceBT, requester, AMOUNT_ST, AMOUNT_BT, unlockHeight, stakingIntentHash, { from: intercommUC }); + const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockStake.l, stakingIntentHash, { from: intercommUC }); var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); openSTUtilityUtils.checkStakingIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, - stakingIntentHash, requester, requester, AMOUNT_ST, AMOUNT_BT); + stakingIntentHash, stakerVC, beneficiary, AMOUNT_ST, AMOUNT_BT); utils.logResponse(result, "OpenSTUtility.confirmStakingIntent"); - }); - - it("process staking", async () => { - const o = await openSTValue.processStaking(stakingIntentHash, { from: requester }); - utils.logResponse(o, "OpenSTValue.processStaking"); - }); - - // Before wait time as passed - it('fails to revertMinting before expiration block', async () => { - var waitTime = await openSTUtility.blocksToWaitShort.call(); - waitTime = waitTime.toNumber(); - // Wait time less 1 block for preceding test case and 1 block because condition is <= - - const amount = new BigNumber(1); - for (var i = 0; i < waitTime/2; i++) { - await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); - await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); - } - }); - - // Before wait time as passed - // Revert staking called after unlock block - it('fails to revertStaking before waiting period ends', async () => { - var waitTime = await openSTValue.blocksToWaitLong.call(); - waitTime = waitTime.toNumber(); - // Wait time less 1 block for preceding test case and 1 block because condition is <= - const amount = new BigNumber(1); - for (var i = 0; i < waitTime/2; i++) { - await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); - await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); - } - }); - - it("revert staking should not be allowed after processStaking", async() => { - await utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); - }); - - it("revert minting after expiring block height", async() => { - // Revert minting from staker user as it can be called from any external user. - // If we put this as a contraint this test case will fail - var result = await openSTUtility.revertMinting(stakingIntentHash, {from: staker}); - openSTUtilityUtils.checkRevertedMintEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, - requester, requester, AMOUNT_BT); - }); - - it ("validate if the ST is stuck in Simple Stake", async() => { + }); + + it("process staking", async () => { + const o = await openSTValue.processStaking(stakingIntentHash, lockStake.s, { from: stakerVC }); + utils.logResponse(o, "OpenSTValue.processStaking"); + }); + + // Before wait time as passed + it('fails to revertMinting before expiration block', async () => { + var waitTime = await openSTUtility.blocksToWaitShort.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + + const amount = new BigNumber(1); + for (var i = 0; i < waitTime/2; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); + + // Before wait time as passed + // Revert staking called after unlock block + it('fails to revertStaking before waiting period ends', async () => { + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + const amount = new BigNumber(1); + for (var i = 0; i < waitTime/2; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); + + it("revert staking should not be allowed after processStaking", async() => { + await utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, { from: stakerVC })); + }); + + it("revert minting after expiring block height", async() => { + // Revert minting from staker user as it can be called from any external user. + // If we put this as a contraint this test case will fail + var result = await openSTUtility.revertMinting(stakingIntentHash, { from: stakerVC }); + openSTUtilityUtils.checkRevertedMintEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, + stakerVC, beneficiary, AMOUNT_BT); + }); + + it ("validate if the ST is stuck in Simple Stake", async() => { var currentStBalance = await btSimpleStake.getTotalStake.call() var tobeBalance = previousSTBalance.toNumber() + AMOUNT_ST.toNumber(); Assert.equal(currentStBalance.toNumber(), tobeBalance) }); - }); + }); // SEQUENCE OF EVENTS // Call Redeem => Call RevertRedemption // context('call redeem then revertRedemption', function() { + const lockRedeem = HashLock.getHashLock(); // Redeemer should have some branded token it("transfers branded token to redeemer", async() => { - var result = await brandedToken.transfer(redeemer, REDEEM_AMOUNT_BT, {from: requester}); + var result = await brandedToken.transfer(redeemer, REDEEM_AMOUNT_BT, { from: beneficiary }); Assert.ok(result); var balanceOfRedeemer = await brandedToken.balanceOf(redeemer); Assert.equal(balanceOfRedeemer, REDEEM_AMOUNT_BT.toNumber()); @@ -760,7 +763,7 @@ contract('OpenST', function(accounts) { Assert.ok(approveResult); nonce = await openSTValue.getNextNonce.call(redeemer); - var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, { from: redeemer }); + var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer }); redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; unlockHeight = redeemResult.logs[0].args._unlockHeight; openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, @@ -774,7 +777,7 @@ contract('OpenST', function(accounts) { it('waits till redeem is expired', async () => { var waitTime = await openSTUtility.blocksToWaitLong.call(); waitTime = waitTime.toNumber(); - var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); // Mock transactions so that block number increases for (var i = 0; i < waitTime; i++) { await web3.eth.sendTransaction({ from: owner, to: admin, value: amountToTransfer, gasPrice: '0x12A05F200' }); @@ -806,6 +809,7 @@ contract('OpenST', function(accounts) { // Redeem => confirmRedemptionIntent => revertRedemption => revertUnstaking // context('call redeem then confirmRedemptionIntent then revertRedemption then revertUnstaking', function() { + const lockRedeem = HashLock.getHashLock(); // Since we reverted redemption in above case we don't need to transfer again as redeemer will already have REDEEM_AMOUNT_BT balance it("check branded token balance of redeemer", async() => { @@ -822,7 +826,7 @@ contract('OpenST', function(accounts) { Assert.ok(approveResult); nonce = await openSTValue.getNextNonce.call(redeemer); - var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, { from: redeemer }); + var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer }); redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; unlockHeight = redeemResult.logs[0].args._unlockHeight; openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, @@ -836,7 +840,7 @@ contract('OpenST', function(accounts) { it("calls confirmRedemptionIntent", async() => { var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, - redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, redemptionIntentHash, { from: intercommVC }); + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); openSTValueUtils.checkRedemptionIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, @@ -849,7 +853,7 @@ contract('OpenST', function(accounts) { it('waits till redeem is expired', async () => { var waitTime = await openSTUtility.blocksToWaitLong.call(); waitTime = waitTime.toNumber(); - var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); // Mock transactions so that block number increases for (var i = 0; i < waitTime; i++) { await web3.eth.sendTransaction({ from: owner, to: admin, value: amountToTransfer, gasPrice: '0x12A05F200' }); @@ -871,7 +875,7 @@ contract('OpenST', function(accounts) { it('waits till unstake is expired', async () => { var waitTime = await openSTValue.blocksToWaitShort.call(); waitTime = waitTime.toNumber(); - var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); // Mock transactions so that block number increases for (var i = 0; i < waitTime; i++) { await web3.eth.sendTransaction({ from: owner, to: admin, value: amountToTransfer, gasPrice: '0x12A05F200' }); @@ -902,7 +906,7 @@ contract('OpenST', function(accounts) { // Redeem => confirmRedemptionIntent => ProcessRedemption => revertRedemption => revertUnstaking // context('call redeem then confirmRedemptionIntent then ProcessRedemption then revertRedemption then revertUnstaking', function() { - + const lockRedeem = HashLock.getHashLock(); var previousSTBalance = null; it("previous balance on simple stake contract", async() => { @@ -926,7 +930,7 @@ contract('OpenST', function(accounts) { Assert.ok(approveResult); nonce = await openSTValue.getNextNonce.call(redeemer); - var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, { from: redeemer }); + var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer }); redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; unlockHeight = redeemResult.logs[0].args._unlockHeight; openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, @@ -940,7 +944,7 @@ contract('OpenST', function(accounts) { it("calls confirmRedemptionIntent", async() => { var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, - redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, redemptionIntentHash, { from: intercommVC }); + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); openSTValueUtils.checkRedemptionIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, @@ -951,10 +955,10 @@ contract('OpenST', function(accounts) { it("process redemption", async() => { - var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, { from: redeemer }); + var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, lockRedeem.s, { from: redeemer }); openSTUtilityUtils.checkProcessedRedemptionEvent(processRedeemingResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, - brandedToken.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_BT) + brandedToken.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_BT, lockRedeem.s) utils.logResponse(processRedeemingResult, "openSTUtility.revertUnstake.processRedeeming"); @@ -965,7 +969,7 @@ contract('OpenST', function(accounts) { var waitTime = await openSTUtility.blocksToWaitLong.call(); waitTime = waitTime.toNumber(); - var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); // Mock transactions so that block number increases for (var i = 0; i < waitTime; i++) { @@ -1027,6 +1031,5 @@ contract('OpenST', function(accounts) { }); }); - }); }); diff --git a/test/Registrar.js b/test/Registrar.js index f42f4114..f3635e72 100644 --- a/test/Registrar.js +++ b/test/Registrar.js @@ -19,13 +19,14 @@ // // ---------------------------------------------------------------------------- -const BigNumber = require('bignumber.js'); -const Utils = require('./lib/utils.js'); +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const HashLock = require('./lib/hash_lock.js'); const Registrar_utils = require('./Registrar_utils.js'); /// /// Test stories -/// +/// /// RegisterBrandedToken /// fails to register by non-adminOrOps /// successfully registers core @@ -58,7 +59,7 @@ contract('Registrar', function(accounts) { const name = "Member Company Coin"; const conversionRateDecimals = 5; const conversionRate = new BigNumber(10 * (10**conversionRateDecimals)); // Conversion rate => 10 - const amountST = new BigNumber(web3.toWei(2, "ether"));; + const amountST = new BigNumber(web3.toWei(2, "ether"));; describe('RegisterBrandedToken for utility chain', async() => { var contracts = null; @@ -148,6 +149,8 @@ contract('Registrar', function(accounts) { var unlockHeight = null; var stakingIntentHash = null; + const lock = HashLock.getHashLock(); + before(async() => { contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); valueToken = contracts.valueToken; @@ -163,7 +166,7 @@ contract('Registrar', function(accounts) { await registrar.addCore(openSTValue.address, core.address, { from: ops }); await registrar.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid, { from: ops }); await valueToken.approve(openSTValue.address, amountST, { from: staker }); - result = await openSTValue.stake(uuid, amountST, staker, { from: staker }); + result = await openSTValue.stake(uuid, amountST, staker, lock.l, { from: staker }); nonce = result.logs[0].args._stakerNonce; amountUT = result.logs[0].args._amountUT; unlockHeight = result.logs[0].args._unlockHeight; @@ -171,13 +174,13 @@ contract('Registrar', function(accounts) { }) it('fails to confirm by non-ops', async () => { - await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash)); - await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, { from: admin })); + await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash)); + await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash, { from: admin })); }) it('successfully confirms', async () => { var BLOCKS_TO_WAIT_SHORT = 240; - var expirationHeight = await registrar.confirmStakingIntent.call(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, { from: ops }); + var expirationHeight = await registrar.confirmStakingIntent.call(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash, { from: ops }); assert.ok(expirationHeight > BLOCKS_TO_WAIT_SHORT); }) @@ -195,7 +198,9 @@ contract('Registrar', function(accounts) { var redemptionIntentHash = null; const BLOCKS_TO_WAIT_LONG = 80667; const amountUTRedeemed = (conversionRate / (10**conversionRateDecimals)); - + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + before(async() => { contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); valueToken = contracts.valueToken; @@ -208,22 +213,22 @@ contract('Registrar', function(accounts) { await registrar.addCore(openSTValue.address, core.address, { from: ops }); await registrar.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid, { from: ops }); await valueToken.approve(openSTValue.address, amountST, { from: staker }); - var result = await openSTValue.stake(uuid, amountST, staker, { from: staker }); + var result = await openSTValue.stake(uuid, amountST, staker, lock.l, { from: staker }); var stakingIntentHash = result.logs[0].args._stakingIntentHash; - await openSTValue.processStaking(stakingIntentHash, { from: staker }); + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); nonce = await openSTValue.getNextNonce.call(staker); - redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l); }) it('fails to confirm by non-ops', async () => { - await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, redemptionIntentHash)); - await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, redemptionIntentHash, { from: admin })); + await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash)); + await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash, { from: admin })); }) it('successfully confirms', async () => { var BLOCKS_TO_WAIT_SHORT = 240; - var confirmReturns = await registrar.confirmRedemptionIntent.call(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, redemptionIntentHash, { from: ops }); + var confirmReturns = await registrar.confirmRedemptionIntent.call(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash, { from: ops }); assert.equal(confirmReturns[0], (amountUTRedeemed * (10**conversionRateDecimals))/conversionRate); assert.ok(confirmReturns[1] > BLOCKS_TO_WAIT_SHORT); }) diff --git a/test/STPrime.js b/test/STPrime.js index 6a2560fd..b10fa5d8 100644 --- a/test/STPrime.js +++ b/test/STPrime.js @@ -21,6 +21,7 @@ const BigNumber = require('bignumber.js'); const Utils = require('./lib/utils.js'); +const HashLock = require('./lib/hash_lock.js'); const STPrime_utils = require('./STPrime_utils.js'); /// @@ -42,7 +43,7 @@ const STPrime_utils = require('./STPrime_utils.js'); contract('STPrime', function(accounts) { const openSTProtocol = accounts[4]; - const beneficiary = accounts[9]; // set to 0 balance in runTestRpc.sh + const beneficiary = accounts[19]; // set to 0 balance in runTestRpc.sh const ST1 = new BigNumber(web3.toWei(1, "ether")); const ST2 = new BigNumber(web3.toWei(2, "ether")); const ST800M = new BigNumber(web3.toWei(800000000, "ether")); diff --git a/test/lib/hash_lock.js b/test/lib/hash_lock.js new file mode 100644 index 00000000..e548a0ad --- /dev/null +++ b/test/lib/hash_lock.js @@ -0,0 +1,32 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: lib/hash_lock.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const crypto = require('crypto'), + keccak256 = require('keccak'); + +/// for testing purposes produce a random secret and its hash +module.exports.getHashLock = () => { + // NOTE: for openst-platform encrypt secret + var secretBytes = crypto.randomBytes(32); + var lock = "0x" + keccak256('keccak256').update(secretBytes).digest('hex'); + var unlockSecret = "0x" + secretBytes.toString('hex'); + return {s: unlockSecret, l: lock}; +} diff --git a/tools/runTestRpc.sh b/tools/runTestRpc.sh index fad94940..7c16eb20 100755 --- a/tools/runTestRpc.sh +++ b/tools/runTestRpc.sh @@ -1,2 +1,2 @@ #!/bin/bash -testrpc --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea9,0" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb9,10000000000000000000000000000000" --gasLimit 12000000 +testrpc --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea9,0" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb9,0" --gasLimit 12000000 From ebe68c33b23c1e67f95086086a3a46fe4170830f Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Thu, 3 May 2018 17:36:12 +0530 Subject: [PATCH 0006/1361] openSTUtility test cases fixed --- test/OpenSTUtility.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index e862163f..76bbad5b 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -710,13 +710,7 @@ contract('OpenSTUtility', function(accounts) { await OpenSTUtility_utils.checkRevertedMintEvent(result.logs[0], checkBtUuid, stakingIntentHash, accounts[0], accounts[0], AMOUNT_BT); }) - }) - - it('successfully revert Minting', async () => { - var result = await openSTUtility.revertMinting(stakingIntentHash, { from: accounts[2] , gasPrice: '0x12A05F200'}); - await OpenSTUtility_utils.checkRevertedMintEvent(result.logs[0], checkBtUuid, stakingIntentHash, accounts[0], - accounts[0], AMOUNT_BT); - }) }) - }); + }) + }); From acfdbafd21f7960aa7b808302f05dcac8bf758ce Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Thu, 3 May 2018 18:03:29 +0530 Subject: [PATCH 0007/1361] openSTValue test cases fixed --- test/OpenSTValue.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index b2760aef..f7e81778 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -467,7 +467,7 @@ contract('OpenSTValue', function(accounts) { await valueToken.approve(openSTValue.address, 1, { from: accounts[0] }); result = await openSTValue.stake(checkUuid, 1, accounts[0], lock.l, { from: accounts[0] }); stakingIntentHash = result.logs[0].args._stakingIntentHash; - await openSTValue.processStaking(stakingIntentHash, { from: accounts[0] }); + await openSTValue.processStaking(stakingIntentHash, lock.s,{ from: accounts[0] }); redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); }) From 54b2a7703be32cc8bab8be216416b593bfc4fe29 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Thu, 3 May 2018 19:16:01 +0530 Subject: [PATCH 0008/1361] Protocol.js test cases fixed --- test/Protocol.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Protocol.js b/test/Protocol.js index 4cb1583f..64a100f8 100644 --- a/test/Protocol.js +++ b/test/Protocol.js @@ -251,7 +251,7 @@ contract('OpenST', function(accounts) { it("register utility token on value chain", async() => { const result = await registrarVC.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, - CHAINID_UTILITY, requester, registeredBrandedTokenUuid, { from: intercommVC }); + CHAINID_UTILITY, stakerVC, registeredBrandedTokenUuid, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTValue.address, openSTValueArtifacts.abi); @@ -372,7 +372,7 @@ contract('OpenST', function(accounts) { it("transfer STPrime to Redeemer", async() => { var redeemerBalanceBeforeTransfer = await web3.eth.getBalance(redeemer).toNumber(); - result = await web3.eth.sendTransaction({ from: staker, to: redeemer, value: FUND_AMOUNT_STPRIME ,gasPrice: '0x12A05F200' }); + result = await web3.eth.sendTransaction({ from: stakerVC, to: redeemer, value: FUND_AMOUNT_STPRIME ,gasPrice: '0x12A05F200' }); var redeemerBalanceAfterTransfer = await web3.eth.getBalance(redeemer).toNumber(); Assert.equal((redeemerBalanceBeforeTransfer+(FUND_AMOUNT_STPRIME.toNumber())), redeemerBalanceAfterTransfer); From 9b5efd5822a3425472b41f2b5fc175a00a1c55bc Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 3 May 2018 20:25:57 +0530 Subject: [PATCH 0009/1361] contract: add requestStake, revertStakeRequest, rejectRequest functions --- .gitignore | 2 + contracts/Gate.sol | 116 +- package-lock.json | 5620 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 4558 insertions(+), 1180 deletions(-) diff --git a/.gitignore b/.gitignore index 834a19d4..678000bc 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ contracts/abi/ # don't commit node_modules node_modules + +.idea/ diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 5666b083..4c347b12 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -22,8 +22,19 @@ pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- import "./ProtocolVersioned.sol"; +import "./OpenSTValue.sol"; +import "./EIP20Interface.sol"; contract Gate is ProtocolVersioned { + + /* + * Events + */ + event StakeRequested(address _staker, uint256 _amount, address _beneficiary); + event StakeRequestReverted(address _staker, uint256 _amount); + event StakeRequestRejected(address _staker, uint256 _amount); + + /* * Structures */ @@ -38,9 +49,112 @@ contract Gate is ProtocolVersioned { * Storage */ address public workers; //TODO: update type once workers contract and interfaces are added to the repo. + + // stake requests mapping(address /*staker */ => StakeRequest) public stakeRequests; - function Gate() public { //TODO: complete as necessary + // bounty amount + uint256 bounty; + + // utility token UUID + bytes32 uuid; + + // OpenSTValue contract + address openSTValue; + + /* + * Public functions + */ + function Gate( + address _workers, + uint256 _bounty, + bytes32 _uuid, + address _openSTValue) + public + ProtocolVersioned(_openSTValue) + { + require(_workers != address(0)); + require(_openSTValue != address(0)); + require(_uuid.length != 0); + + // Should bounty with 0 amount be allowed ? commenting right now + //require(_bounty > 0); + + workers = _workers; + bounty = _bounty; + uuid = _uuid; + openSTValue = _openSTValue; + } + + function requestStake( + uint256 _amount, + address _beneficiary) + external + returns ( + bool + ) + { + + require(_amount > 0); + require(_beneficiary != address(0)); + require(address(stakeRequests[msg.sender].beneficiary) == address(0)); // check if the state request does not exists + + require(EIP20Interface(openSTValue.valueToken).allowance(msg.sender, address(this)) >= _amount); + require(EIP20Interface(openSTValue.valueToken).transferFrom(msg.sender, address(this), _amount)); + + stakeRequests[msg.sender] = StakeRequest({ + amount: _amount, + beneficiary: _beneficiary, + hashLock: 0, + unlockHeight: 0 + }); + + StakeRequested(msg.sender, _amount, _beneficiary, unlockHeight); + + return unlockHeight; + } + + function revertStakeRequest() + returns (bool) + { + StakeRequest storage stakeRequest = stakeRequests[msg.sender]; + + // check if the state request exists for the msg.sender + require(address(stakeRequest.beneficiary) != address(0)); + + // check if the stake request was not accepted + require(stakeRequest.unlockHeight == 0); + + require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); + + delete stakeRequests[msg.sender]; + + StakeRequestReverted(msg.sender, stakeRequest.amount); + + return true; + } + + + function rejectRequest(address _staker) + returns (bool) + { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + + // check if the stake request was done. + StakeRequest storage stakeRequest = stakeRequests[_staker]; + + // check if the state request exists + require(address(stakeRequest.beneficiary) != address(0)); + + // transfer the amount back + require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); + + // delete the state request from the mapping storage + delete stakeRequests[msg.sender]; + + StakeRequestRejected(_staker, stakeRequest.amount); + return true; } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d754d009..977613ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,16 +4,33 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, "abi-decoder": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.0.9.tgz", - "integrity": "sha1-a8/Yb39j++yFc9l3izpPkruS4B8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.1.0.tgz", + "integrity": "sha512-nvLArBx0XOJufWyaghMKtIofZDBwEMdVZoqcetQOIe1qYeKZk4+kRYGPEJ5lt7dD3MLulw//amUzOJLM8eW5RA==", "dev": true, "requires": { - "babel-core": "6.26.0", + "babel-core": "6.26.3", "babel-loader": "6.4.1", "babel-plugin-add-module-exports": "0.2.1", "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-runtime": "6.23.0", "babel-preset-es2015": "6.24.1", "chai": "3.5.0", "web3": "0.18.4", @@ -40,9 +57,9 @@ } }, "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", "dev": true }, "acorn-dynamic-import": { @@ -89,6 +106,12 @@ "repeat-string": "1.6.1" } }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -101,24 +124,27 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "any-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", + "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", + "dev": true + }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "2.3.11", + "micromatch": "3.1.10", "normalize-path": "2.1.1" } }, "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", @@ -126,21 +152,54 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "4.11.8", "inherits": "2.0.1", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -157,13 +216,25 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", + "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", + "dev": true + }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "4.17.10" } }, "async-each": { @@ -172,6 +243,12 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -184,13 +261,13 @@ } }, "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", + "babel-generator": "6.26.1", "babel-helpers": "6.24.1", "babel-messages": "6.23.0", "babel-register": "6.26.0", @@ -202,7 +279,7 @@ "convert-source-map": "1.5.1", "debug": "2.6.9", "json5": "0.5.1", - "lodash": "4.17.4", + "lodash": "4.17.10", "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.8", @@ -211,9 +288,9 @@ } }, "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "6.23.0", @@ -221,11 +298,33 @@ "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.4", + "lodash": "4.17.10", "source-map": "0.5.7", "trim-right": "1.0.1" } }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, "babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", @@ -247,7 +346,30 @@ "babel-helper-function-name": "6.24.1", "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.10" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -301,7 +423,20 @@ "requires": { "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.10" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { @@ -364,6 +499,130 @@ "babel-runtime": "6.26.0" } }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", @@ -392,7 +651,7 @@ "babel-template": "6.26.0", "babel-traverse": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.10" } }, "babel-plugin-transform-es2015-classes": { @@ -476,15 +735,15 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", "babel-runtime": "6.26.0", "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { "babel-plugin-transform-strict-mode": "6.24.1", @@ -598,6 +857,47 @@ "regexpu-core": "2.0.0" } }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, "babel-plugin-transform-regenerator": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", @@ -607,6 +907,15 @@ "regenerator-transform": "0.10.1" } }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", @@ -635,7 +944,7 @@ "babel-plugin-transform-es2015-function-name": "6.24.1", "babel-plugin-transform-es2015-literals": "6.22.0", "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", "babel-plugin-transform-es2015-modules-umd": "6.24.1", "babel-plugin-transform-es2015-object-super": "6.24.1", @@ -649,17 +958,53 @@ "babel-plugin-transform-regenerator": "6.26.0" } }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", + "babel-core": "6.26.3", "babel-runtime": "6.26.0", - "core-js": "2.5.3", + "core-js": "2.5.5", "home-or-tmp": "2.0.0", - "lodash": "4.17.4", + "lodash": "4.17.10", "mkdirp": "0.5.1", "source-map-support": "0.4.18" } @@ -670,7 +1015,7 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.3", + "core-js": "2.5.5", "regenerator-runtime": "0.11.1" } }, @@ -684,7 +1029,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "lodash": "4.17.4" + "lodash": "4.17.10" } }, "babel-traverse": { @@ -700,8 +1045,8 @@ "babylon": "6.18.0", "debug": "2.6.9", "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "invariant": "2.2.4", + "lodash": "4.17.10" } }, "babel-types": { @@ -712,7 +1057,7 @@ "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.4", + "lodash": "4.17.10", "to-fast-properties": "1.0.3" } }, @@ -728,10 +1073,71 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, "big.js": { @@ -756,6 +1162,12 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "binaryextensions": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", + "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", + "dev": true + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -763,9 +1175,9 @@ "dev": true }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "1.0.0", @@ -773,14 +1185,32 @@ } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, "brorand": { @@ -796,34 +1226,34 @@ "dev": true }, "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", "inherits": "2.0.1", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", + "browserify-aes": "1.2.0", + "browserify-des": "1.0.1", "evp_bytestokey": "1.0.3" } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "dev": true, "requires": { "cipher-base": "1.0.4", @@ -838,7 +1268,7 @@ "dev": true, "requires": { "bn.js": "4.11.8", - "randombytes": "2.0.5" + "randombytes": "2.0.6" } }, "browserify-sign": { @@ -849,11 +1279,11 @@ "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", "elliptic": "6.4.0", "inherits": "2.0.1", - "parse-asn1": "5.1.0" + "parse-asn1": "5.1.1" } }, "browserify-zlib": { @@ -871,11 +1301,17 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", + "base64-js": "1.3.0", + "ieee754": "1.1.11", "isarray": "1.0.0" } }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -894,11 +1330,57 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true }, "center-align": { "version": "0.1.3", @@ -934,21 +1416,30 @@ "supports-color": "2.0.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "dev": true, "requires": { - "anymatch": "1.3.2", + "anymatch": "2.0.0", "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", + "braces": "2.3.2", + "fsevents": "1.2.3", + "glob-parent": "3.1.0", "inherits": "2.0.1", "is-binary-path": "1.0.1", - "is-glob": "2.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "readdirp": "2.1.0", + "upath": "1.0.5" } }, "cipher-base": { @@ -958,9 +1449,80 @@ "dev": true, "requires": { "inherits": "2.0.1", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "1.0.2" } }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -972,6 +1534,44 @@ "wordwrap": "0.0.2" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "2.0.1", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.6" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -984,6 +1584,37 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.3.tgz", + "integrity": "sha512-qTfM2pNFeMZcLvf/RbrVAzDEVttZjFhaApfx9dplNjvHSX88Ui66zBRb/4YGob/xUWxDceirgoC1lT676asfCQ==", + "dev": true + }, "commander": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", @@ -999,6 +1630,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1026,10 +1663,16 @@ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", "dev": true }, "core-util-is": { @@ -1039,9 +1682,9 @@ "dev": true }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", + "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", "dev": true, "requires": { "bn.js": "4.11.8", @@ -1049,29 +1692,30 @@ } }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "1.0.4", "inherits": "2.0.1", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "inherits": "2.0.1", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "cross-spawn": { @@ -1080,7 +1724,7 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.2", "shebang-command": "1.2.0", "which": "1.3.0" } @@ -1091,17 +1735,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.0", + "browserify-cipher": "1.0.1", "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", + "create-ecdh": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", "inherits": "2.0.1", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, "crypto-js": { @@ -1115,15 +1759,33 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.37" + "es5-ext": "0.10.42" } }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", + "dev": true + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1139,6 +1801,21 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "1.0.0" + } + }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -1156,6 +1833,59 @@ } } }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -1163,9 +1893,15 @@ "dev": true, "requires": { "inherits": "2.0.1", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, + "detect-conflict": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", + "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", + "dev": true + }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -1176,26 +1912,77 @@ } }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "4.11.8", "miller-rabin": "4.0.1", - "randombytes": "2.0.5" + "randombytes": "2.0.6" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "ejs": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", + "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", "dev": true }, "elliptic": { @@ -1209,7 +1996,7 @@ "hash.js": "1.1.3", "hmac-drbg": "1.0.1", "inherits": "2.0.1", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -1231,15 +2018,31 @@ "tapable": "0.2.8" } }, + "envinfo": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-4.4.2.tgz", + "integrity": "sha512-5rfRs+m+6pwoKRCFqpsA5+qsLngFms1aWPrxfKbrObCzQaPc3M3yPloZx+BL9UE3dK58cxw36XVQbFRSCCfGSQ==", + "dev": true + }, "errno": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { "prr": "1.0.1" } }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "dev": true, + "requires": { + "string-template": "0.2.1", + "xtend": "4.0.1" + } + }, "error-ex": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", @@ -1250,13 +2053,14 @@ } }, "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "version": "0.10.42", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "dev": true, "requires": { "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { @@ -1266,7 +2070,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.42", "es6-symbol": "3.1.1" } }, @@ -1277,7 +2081,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.42", "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", @@ -1291,7 +2095,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.42", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -1304,7 +2108,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.42" } }, "es6-weak-map": { @@ -1314,7 +2118,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.42", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } @@ -1333,18 +2137,23 @@ "requires": { "es6-map": "0.1.5", "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", + "esrecurse": "4.2.1", "estraverse": "4.2.0" } }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "4.2.0" } }, "estraverse": { @@ -1365,25 +2174,25 @@ "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", "dev": true, "requires": { - "webpack": "3.10.0" + "webpack": "3.11.0" }, "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", + "fast-deep-equal": "1.1.0", "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "json-schema-traverse": "0.3.1", + "uri-js": "3.0.2" } }, "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "ansi-regex": { @@ -1544,15 +2353,15 @@ } }, "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", "dev": true, "requires": { - "acorn": "5.3.0", + "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", + "ajv": "6.4.0", + "ajv-keywords": "3.2.0", "async": "2.6.0", "enhanced-resolve": "3.4.1", "escope": "3.6.0", @@ -1568,7 +2377,7 @@ "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", + "watchpack": "1.6.0", "webpack-sources": "1.1.0", "yargs": "8.0.2" } @@ -1618,7 +2427,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.42" } }, "events": { @@ -1634,7 +2443,7 @@ "dev": true, "requires": { "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "execa": { @@ -1652,13 +2461,45 @@ "strip-eof": "1.0.0" } }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, "expand-range": { @@ -1668,46 +2509,214 @@ "dev": true, "requires": { "fill-range": "2.2.3" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "homedir-polyfill": "1.0.1" } }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.21", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.1.tgz", + "integrity": "sha512-wSyW1TBK3ia5V+te0rGPXudeMHoUQW6O5Y9oATiaGhpENmEifPDlOdhpsnlj5HoG6ttIvGiY1DdCmI9X2xGMhg==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "2.2.1", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.1", + "micromatch": "3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "filename-regex": { + "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, "find-cache-dir": { @@ -1731,6 +2740,21 @@ "pinkie-promise": "2.0.1" } }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "flow-parser": { + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.71.0.tgz", + "integrity": "sha512-rXSvqSBLf8aRI6T3P99jMcUYvZoO1KZcKDkzGJmXvYdNAgRKu7sfGNtxEsn3cX4TgungBuJpX+K8aHRC9/B5MA==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1746,6 +2770,25 @@ "for-in": "1.0.2" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.1", + "readable-stream": "2.3.6" + } + }, "fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -1756,7 +2799,7 @@ "jsonfile": "2.4.0", "klaw": "1.3.1", "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "rimraf": "2.2.8" } }, "fs.realpath": { @@ -1766,39 +2809,29 @@ "dev": true }, "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", + "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", "dev": true, "optional": true, "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" + "nan": "2.10.0", + "node-pre-gyp": "0.9.1" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true @@ -1810,91 +2843,25 @@ "optional": true, "requires": { "delegates": "1.0.0", - "readable-stream": "2.2.9" + "readable-stream": "2.3.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, "balanced-match": { - "version": "0.4.2", + "version": "1.0.0", "bundled": true, "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, "brace-expansion": { - "version": "1.1.7", + "version": "1.1.11", "bundled": true, "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true @@ -1904,14 +2871,6 @@ "bundled": true, "dev": true }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, "concat-map": { "version": "0.0.1", "bundled": true, @@ -1925,35 +2884,11 @@ "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, "dev": true, "optional": true, @@ -1967,11 +2902,6 @@ "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, "delegates": { "version": "1.0.0", "bundled": true, @@ -1979,74 +2909,25 @@ "optional": true }, "detect-libc": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true, "dev": true, "optional": true }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", + "fs-minipass": { + "version": "1.2.5", "bundled": true, "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "minipass": "2.2.4" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } + "optional": true }, "gauge": { "version": "2.7.4", @@ -2054,7 +2935,7 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", + "aproba": "1.2.0", "console-control-strings": "1.1.0", "has-unicode": "2.0.1", "object-assign": "4.1.1", @@ -2064,27 +2945,11 @@ "wide-align": "1.1.2" } }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, "glob": { "version": "7.1.2", "bundled": true, "dev": true, + "optional": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -2094,64 +2959,35 @@ "path-is-absolute": "1.0.1" } }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", + "has-unicode": { + "version": "2.0.1", "bundled": true, "dev": true, "optional": true }, - "har-validator": { - "version": "4.2.1", + "iconv-lite": { + "version": "0.4.21", "bundled": true, "dev": true, "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "safer-buffer": "2.1.2" } }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", + "ignore-walk": { + "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "minimatch": "3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, + "optional": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -2163,7 +2999,7 @@ "dev": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -2176,111 +3012,43 @@ "number-is-nan": "1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, "dev": true, "optional": true }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", + "minimatch": { + "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "brace-expansion": "1.1.11" } }, - "mime-db": { - "version": "1.27.0", + "minimist": { + "version": "0.0.8", "bundled": true, "dev": true }, - "mime-types": { - "version": "2.1.15", + "minipass": { + "version": "2.2.4", "bundled": true, "dev": true, "requires": { - "mime-db": "1.27.0" + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, - "minimatch": { - "version": "3.0.4", + "minizlib": { + "version": "1.1.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.7" + "minipass": "2.2.4" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, "mkdirp": { "version": "0.5.1", "bundled": true, @@ -2295,23 +3063,33 @@ "dev": true, "optional": true }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, "node-pre-gyp": { - "version": "0.6.39", + "version": "0.9.1", "bundled": true, "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", + "detect-libc": "1.0.3", "mkdirp": "0.5.1", + "needle": "2.2.0", "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.6", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" } }, "nopt": { @@ -2320,12 +3098,28 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" } }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, "dev": true, "optional": true, @@ -2341,12 +3135,6 @@ "bundled": true, "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, "object-assign": { "version": "4.1.1", "bundled": true, @@ -2374,7 +3162,7 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "dev": true, "optional": true, @@ -2386,39 +3174,23 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.0", "bundled": true, "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.6", "bundled": true, "dev": true, "optional": true, "requires": { "deep-extend": "0.4.2", - "ini": "1.3.4", + "ini": "1.3.5", "minimist": "1.2.0", "strip-json-comments": "2.0.1" }, @@ -2432,112 +3204,63 @@ } }, "readable-stream": { - "version": "2.2.9", + "version": "2.3.6", "bundled": true, "dev": true, + "optional": true, "requires": { - "buffer-shims": "1.0.0", "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", "util-deprecate": "1.0.2" } }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, "dev": true, + "optional": true, "requires": { "glob": "7.1.2" } }, "safe-buffer": { - "version": "5.0.1", + "version": "5.1.1", "bundled": true, "dev": true }, - "semver": { - "version": "5.3.0", + "safer-buffer": { + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, - "set-blocking": { - "version": "2.0.0", + "sax": { + "version": "1.2.4", "bundled": true, "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", + "semver": { + "version": "5.5.0", "bundled": true, "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", + "set-blocking": { + "version": "2.0.0", "bundled": true, "dev": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, - "sshpk": { - "version": "1.13.0", + "signal-exit": { + "version": "3.0.2", "bundled": true, "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "string-width": { "version": "1.0.2", @@ -2550,19 +3273,14 @@ } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "5.1.1" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, @@ -2578,81 +3296,26 @@ "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", + "version": "4.4.1", "bundled": true, "dev": true, "optional": true, "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, "dev": true, "optional": true }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, "wide-align": { "version": "1.1.2", "bundled": true, @@ -2666,304 +3329,259 @@ "version": "1.0.2", "bundled": true, "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true } } }, "ganache-cli": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz", - "integrity": "sha512-C7a8su4Zwtootvcy9HtroshTsyUtLC51+aOGUREpy/G4CXbAuLa3nNQri2NyFdqGyOrm/D+jxYP/PWnnrGLyXg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.0.tgz", + "integrity": "sha512-FdTeyk4uLRHGeFiMe+Qnh4Hc5KiTVqvRVVvLDFJEVVKC1P1yHhEgZeh9sp1KhuvxSrxToxgJS25UapYQwH4zHw==", "dev": true, "requires": { - "webpack": "3.10.0" + "source-map-support": "0.5.5", + "webpack-cli": "2.1.2" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz", + "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "buffer-from": "1.0.0", + "source-map": "0.6.1" + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "gh-got": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", + "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", + "dev": true, + "requires": { + "got": "7.1.0", + "is-plain-obj": "1.1.0" + }, + "dependencies": { + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", "dev": true }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "1.0.0" + } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" + "prepend-http": "1.0.4" } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + } + } + }, + "github-username": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", + "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", + "dev": true, + "requires": { + "gh-got": "6.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.1", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-all": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", + "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", + "dev": true, + "requires": { + "glob": "7.1.2", + "yargs": "1.2.6" + }, + "dependencies": { + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", "dev": true }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "yargs": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", + "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "minimist": "0.1.0" } - }, - "read-pkg-up": { + } + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "is-glob": "2.0.1" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", - "dev": true, - "requires": { - "acorn": "5.3.0", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "camelcase": "4.1.0" + "is-extglob": "1.0.0" } } } }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } } }, - "glob-base": { + "glob-to-regexp": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "is-glob": "2.0.1" + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.0" } }, "globals": { @@ -2972,6 +3590,52 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "dev": true, + "requires": { + "@sindresorhus/is": "0.7.0", + "cacheable-request": "2.1.4", + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "into-stream": "3.1.0", + "is-retry-allowed": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "mimic-response": "1.0.0", + "p-cancelable": "0.4.1", + "p-timeout": "2.0.1", + "pify": "3.0.0", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "url-parse-lax": "3.0.0", + "url-to-options": "1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -2984,6 +3648,15 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, + "grouped-queue": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", + "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, "growl": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", @@ -2999,19 +3672,73 @@ "ansi-regex": "2.1.1" } }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "1.4.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.1" + "inherits": "2.0.1", + "safe-buffer": "5.1.2" } }, "hash.js": { @@ -3021,7 +3748,7 @@ "dev": true, "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" }, "dependencies": { "inherits": { @@ -3045,7 +3772,7 @@ "dev": true, "requires": { "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -3059,10 +3786,25 @@ "os-tmpdir": "1.0.2" } }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, "https-browserify": { @@ -3071,12 +3813,72 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "iconv-lite": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", + "dev": true + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -3098,16 +3900,121 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rxjs": "5.5.10", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "2.3.0", + "p-is-promise": "1.1.0" + } + }, "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { "loose-envify": "1.3.1" @@ -3119,6 +4026,15 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3146,7 +4062,35 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "is-dotfile": { @@ -3171,9 +4115,9 @@ "dev": true }, "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-finite": { @@ -3195,23 +4139,78 @@ } }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "2.1.1" } }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "3.2.2" } }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, + "is-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", + "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "dev": true, + "requires": { + "symbol-observable": "0.2.4" + }, + "dependencies": { + "symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "dev": true + } + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -3224,6 +4223,27 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-scoped": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", + "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", + "dev": true, + "requires": { + "scoped-regex": "1.0.0" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3236,12 +4256,24 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3249,12 +4281,30 @@ "dev": true }, "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", "dev": true, "requires": { - "isarray": "1.0.0" + "binaryextensions": "2.1.1", + "editions": "1.3.4", + "textextensions": "2.2.0" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" } }, "js-tokens": { @@ -3263,18 +4313,141 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "jscodeshift": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.0.tgz", + "integrity": "sha512-JAcQINNMFpdzzpKJN8k5xXjF3XDuckB1/48uScSzcnNyK199iWEc9AxKL9OoX5144M2w5zEx9Qs4/E/eBZZUlw==", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-1": "6.24.1", + "babel-register": "6.26.0", + "babylon": "7.0.0-beta.46", + "colors": "1.2.3", + "flow-parser": "0.71.0", + "lodash": "4.17.10", + "micromatch": "2.3.11", + "neo-async": "2.5.1", + "node-dir": "0.1.8", + "nomnom": "1.8.1", + "recast": "0.14.7", + "temp": "0.8.3", + "write-file-atomic": "1.3.4" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "babylon": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", + "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + } + } + }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", @@ -3317,6 +4490,15 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3350,6 +4532,150 @@ "invert-kv": "1.0.0" } }, + "listr": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", + "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "figures": "1.7.0", + "indent-string": "2.1.0", + "is-observable": "0.2.0", + "is-promise": "2.1.0", + "is-stream": "1.1.0", + "listr-silent-renderer": "1.1.1", + "listr-update-renderer": "0.4.0", + "listr-verbose-renderer": "0.4.1", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "ora": "0.2.3", + "p-map": "1.2.0", + "rxjs": "5.5.10", + "stream-to-observable": "0.2.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", + "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "elegant-spinner": "1.0.1", + "figures": "1.7.0", + "indent-string": "3.2.0", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "date-fns": "1.29.0", + "figures": "1.7.0" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -3400,9 +4726,9 @@ } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "lodash._baseassign": { @@ -3479,6 +4805,95 @@ "lodash.isarray": "3.0.4" } }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "2.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "cli-cursor": "1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -3494,14 +4909,52 @@ "js-tokens": "3.0.2" } }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "object-visit": "1.0.1" } }, "md5.js": { @@ -3512,18 +4965,6 @@ "requires": { "hash-base": "3.0.4", "inherits": "2.0.1" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.1" - } - } } }, "mem": { @@ -3532,7 +4973,92 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" + } + }, + "mem-fs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", + "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", + "dev": true, + "requires": { + "through2": "2.0.3", + "vinyl": "1.2.0", + "vinyl-file": "2.0.0" + } + }, + "mem-fs-editor": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.1.tgz", + "integrity": "sha512-54fptqhSZX1sSYsVVInG2qzUWPPrEv/6qYxHAwXJZQfzDcviJcL+7p/wmupg8SdAOi42m/vilMBemx3D6Sz22g==", + "dev": true, + "requires": { + "commondir": "1.0.1", + "deep-extend": "0.5.1", + "ejs": "2.5.9", + "glob": "7.1.2", + "globby": "8.0.1", + "isbinaryfile": "3.0.2", + "mkdirp": "0.5.1", + "multimatch": "2.1.0", + "rimraf": "2.2.8", + "through2": "2.0.3", + "vinyl": "2.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.1", + "glob": "7.1.2", + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } } }, "memory-fs": { @@ -3541,8 +5067,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.6", - "readable-stream": "2.3.3" + "errno": "0.1.7", + "readable-stream": "2.3.6" } }, "memorystream": { @@ -3551,25 +5077,39 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge2": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", + "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", + "dev": true + }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "miller-rabin": { @@ -3583,15 +5123,21 @@ } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, - "minimalistic-assert": { + "mimic-response": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { @@ -3606,7 +5152,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -3615,6 +5161,27 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -3653,6 +5220,26 @@ "ms": "2.0.0" } }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.1", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, "supports-color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", @@ -3665,9 +5252,9 @@ } }, "moment": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.2.tgz", - "integrity": "sha512-Rf6jiHPEfxp9+dlzxPTmRHbvoFXsh2L/U8hOupUMpnuecHQmI6cF6lUbJl3QqKPko1u6ujO+FxtcajLVfLpAtA==" + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" }, "ms": { "version": "2.0.0", @@ -3675,13 +5262,83 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", "dev": true, "optional": true }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "node-dir": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", + "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", + "dev": true + }, "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", @@ -3694,7 +5351,7 @@ "console-browserify": "1.1.0", "constants-browserify": "1.0.0", "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", + "domain-browser": "1.2.0", "events": "1.1.1", "https-browserify": "1.0.0", "os-browserify": "0.3.0", @@ -3702,27 +5359,62 @@ "process": "0.11.10", "punycode": "1.4.1", "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", + "readable-stream": "2.3.6", "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.4", + "stream-http": "2.8.1", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", "url": "0.11.0", "util": "0.10.3", "vm-browserify": "0.0.4" } }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "underscore": "1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", + "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "normalize-path": { @@ -3734,6 +5426,17 @@ "remove-trailing-separator": "1.1.0" } }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "2.0.0", + "query-string": "5.1.1", + "sort-keys": "2.0.0" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -3755,6 +5458,37 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -3765,6 +5499,15 @@ "is-extendable": "0.1.1" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3774,6 +5517,54 @@ "wrappy": "1.0.2" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-spinners": "0.1.2", + "object-assign": "4.1.1" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, "original-require": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", @@ -3807,12 +5598,39 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-lazy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", + "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=", + "dev": true + }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", @@ -3831,6 +5649,27 @@ "p-limit": "1.2.0" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "1.0.0" + } + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -3844,16 +5683,16 @@ "dev": true }, "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "pbkdf2": "3.0.16" } }, "parse-glob": { @@ -3866,6 +5705,23 @@ "is-dotfile": "1.0.3", "is-extglob": "1.0.0", "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } } }, "parse-json": { @@ -3877,12 +5733,30 @@ "error-ex": "1.3.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -3904,6 +5778,12 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -3916,16 +5796,16 @@ } }, "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "dev": true, "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "pify": { @@ -3958,12 +5838,36 @@ "find-up": "1.1.2" } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", + "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", + "dev": true + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -3977,9 +5881,9 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "prr": { @@ -3995,16 +5899,16 @@ "dev": true }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "dev": true, "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" } }, "punycode": { @@ -4013,6 +5917,17 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -4035,26 +5950,6 @@ "kind-of": "4.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -4067,22 +5962,40 @@ } }, "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "read-chunk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", + "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", "dev": true, "requires": { - "randombytes": "2.0.5", - "safe-buffer": "5.1.1" + "pify": "3.0.0", + "safe-buffer": "5.1.2" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "read-pkg": { @@ -4107,17 +6020,17 @@ } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", "util-deprecate": "1.0.2" }, "dependencies": { @@ -4137,10 +6050,39 @@ "requires": { "graceful-fs": "4.1.11", "minimatch": "3.0.4", - "readable-stream": "2.3.3", + "readable-stream": "2.3.6", "set-immediate-shim": "1.0.1" } }, + "recast": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", + "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", + "dev": true, + "requires": { + "ast-types": "0.11.3", + "esprima": "4.0.0", + "private": "0.1.8", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.7.1" + } + }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", @@ -4173,6 +6115,16 @@ "is-equal-shallow": "0.1.3" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -4234,6 +6186,12 @@ "is-finite": "1.0.2" } }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4252,6 +6210,71 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "1.0.1" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -4262,34 +6285,85 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "glob": "7.1.1" + "is-promise": "2.1.0" } }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.1" + "rx-lite": "4.0.8" + } + }, + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "scoped-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", "dev": true }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "set-blocking": { @@ -4304,6 +6378,29 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -4311,13 +6408,13 @@ "dev": true }, "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { "inherits": "2.0.1", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "shebang-command": { @@ -4335,6 +6432,17 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shelljs": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", + "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -4347,16 +6455,130 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, "solc": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.18.tgz", - "integrity": "sha512-Kq+O3PNF9Pfq7fB+lDYAuoqRdghLmZyfngsg0h1Hj38NKAeVHeGPOGeZasn5KqdPeCzbMFvaGyTySxzGv6aXCg==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.23.tgz", + "integrity": "sha512-AT7anLHY6uIRg2It6N0UlCHeZ7YeecIkUhnlirrCgCPCUevtnoN48BxvgigN/4jJTRljv5oFhAJtI6gvHzT5DQ==", "dev": true, "requires": { "fs-extra": "0.30.0", "memorystream": "0.3.1", "require-from-string": "1.2.1", - "semver": "5.4.1", + "semver": "5.5.0", "yargs": "4.8.1" }, "dependencies": { @@ -4417,6 +6639,15 @@ } } }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", @@ -4429,6 +6660,19 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -4438,27 +6682,74 @@ "source-map": "0.5.7" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "dev": true }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -4466,22 +6757,43 @@ "dev": true, "requires": { "inherits": "2.0.1", - "readable-stream": "2.3.3" + "readable-stream": "2.3.6" } }, "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", + "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", "dev": true, "requires": { "builtin-status-codes": "3.0.0", "inherits": "2.0.1", - "readable-stream": "2.3.3", + "readable-stream": "2.3.6", "to-arraybuffer": "1.0.1", "xtend": "4.0.1" } }, + "stream-to-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", + "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "dev": true, + "requires": { + "any-observable": "0.2.0" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -4494,12 +6806,12 @@ } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "strip-ansi": { @@ -4520,6 +6832,16 @@ "is-utf8": "0.2.1" } }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "2.0.0", + "strip-bom": "2.0.0" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4532,21 +6854,80 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "tapable": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2", + "rimraf": "2.2.8" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", + "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { "setimmediate": "1.0.5" } }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -4559,6 +6940,37 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -4566,14 +6978,14 @@ "dev": true }, "truffle": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.4.tgz", - "integrity": "sha512-keAkRNNfU3W7yUMRDF3YHoqmqdv6TChXY0g+RuPpxnRHfspXVtIKwuN2pV07jzY/RbDsIKShcSyF7VBV7eZUvg==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.7.tgz", + "integrity": "sha512-fe6BIcD9xo6iIJvV1m6ZhOk56kmB8k38kdoWOKYnPPw7ZUUSupgojeTb2K5e+4qIpIHvEvmET4yLUjSGR+hvwA==", "dev": true, "requires": { "mocha": "3.5.3", "original-require": "1.0.1", - "solc": "0.4.18" + "solc": "0.4.23" } }, "tty-browserify": { @@ -4631,6 +7043,122 @@ "webpack-sources": "1.1.0" } }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "untildify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", + "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", + "dev": true + }, + "upath": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", + "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==", + "dev": true + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -4649,6 +7177,38 @@ } } }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "utf8": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", @@ -4668,14 +7228,45 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "v8-compile-cache": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", + "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", + "dev": true + }, "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0", + "strip-bom-stream": "2.0.0", + "vinyl": "1.2.0" } }, "vm-browserify": { @@ -4688,20 +7279,20 @@ } }, "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.1" } }, "web3": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.2.tgz", - "integrity": "sha1-xU2sX8DjdzmcBMGm7LsS5FEyeNY=", + "version": "0.20.6", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", + "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", "requires": { "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", "crypto-js": "3.1.8", @@ -4721,7 +7312,7 @@ "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", "dev": true, "requires": { - "acorn": "5.3.0", + "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", "ajv": "4.11.8", "ajv-keywords": "1.5.1", @@ -4739,18 +7330,378 @@ "supports-color": "3.2.3", "tapable": "0.2.8", "uglify-js": "2.8.29", - "watchpack": "1.4.0", + "watchpack": "1.6.0", "webpack-sources": "1.1.0", "yargs": "6.6.0" }, "dependencies": { "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "webpack-addons": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", + "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", + "dev": true, + "requires": { + "jscodeshift": "0.4.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "ast-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", + "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "jscodeshift": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", + "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", + "dev": true, + "requires": { + "async": "1.5.2", + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-1": "6.24.1", + "babel-register": "6.26.0", + "babylon": "6.18.0", + "colors": "1.2.3", + "flow-parser": "0.71.0", + "lodash": "4.17.10", + "micromatch": "2.3.11", + "node-dir": "0.1.8", + "nomnom": "1.8.1", + "recast": "0.12.9", + "temp": "0.8.3", + "write-file-atomic": "1.3.4" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "recast": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", + "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", + "dev": true, + "requires": { + "ast-types": "0.10.1", + "core-js": "2.5.5", + "esprima": "4.0.0", + "private": "0.1.8", + "source-map": "0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.2.tgz", + "integrity": "sha512-2C6bs9gORlzCSgkNZTnj8hnXMxe3g2v+yqiUdB+1l/I3sI36ND4zZStV00yq0eGjE5CNu0eqOQr7YYe+42H2Yw==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "diff": "3.5.0", + "enhanced-resolve": "4.0.0", + "envinfo": "4.4.2", + "glob-all": "3.1.0", + "global-modules": "1.0.0", + "got": "8.3.1", + "import-local": "1.0.0", + "inquirer": "5.2.0", + "interpret": "1.1.0", + "jscodeshift": "0.5.0", + "listr": "0.13.0", + "loader-utils": "1.1.0", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mkdirp": "0.5.1", + "p-each-series": "1.0.0", + "p-lazy": "1.0.0", + "prettier": "1.12.1", + "supports-color": "5.4.0", + "v8-compile-cache": "1.1.2", + "webpack-addons": "1.1.5", + "yargs": "11.1.0", + "yeoman-environment": "2.0.6", + "yeoman-generator": "2.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "tapable": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "3.0.0" + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" } } } @@ -4816,6 +7767,17 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, "xhr2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", @@ -4900,6 +7862,306 @@ "dev": true } } + }, + "yeoman-environment": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz", + "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "globby": "6.1.0", + "grouped-queue": "0.3.3", + "inquirer": "3.3.0", + "is-scoped": "1.0.0", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mem-fs": "1.1.3", + "text-table": "0.2.0", + "untildify": "3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "yeoman-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", + "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", + "dev": true, + "requires": { + "async": "2.6.0", + "chalk": "2.4.1", + "cli-table": "0.3.1", + "cross-spawn": "6.0.5", + "dargs": "5.1.0", + "dateformat": "3.0.3", + "debug": "3.1.0", + "detect-conflict": "1.0.1", + "error": "7.0.2", + "find-up": "2.1.0", + "github-username": "4.1.0", + "istextorbinary": "2.2.1", + "lodash": "4.17.10", + "make-dir": "1.2.0", + "mem-fs-editor": "4.0.1", + "minimist": "1.2.0", + "pretty-bytes": "4.0.2", + "read-chunk": "2.1.0", + "read-pkg-up": "3.0.0", + "rimraf": "2.6.2", + "run-async": "2.3.0", + "shelljs": "0.8.1", + "text-table": "0.2.0", + "through2": "2.0.3", + "yeoman-environment": "2.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } } } } From 30994a823609a944cf96ad57cdb9f11afb880495 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 3 May 2018 20:34:47 +0530 Subject: [PATCH 0010/1361] contract: removed unlock height variable --- contracts/Gate.sol | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 4c347b12..641d70b2 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -109,7 +109,7 @@ contract Gate is ProtocolVersioned { unlockHeight: 0 }); - StakeRequested(msg.sender, _amount, _beneficiary, unlockHeight); + StakeRequested(msg.sender, _amount, _beneficiary, 0); return unlockHeight; } @@ -139,7 +139,7 @@ contract Gate is ProtocolVersioned { returns (bool) { // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender)); + require(workers.isWorker(msg.sender)); //TODO: revist this // check if the stake request was done. StakeRequest storage stakeRequest = stakeRequests[_staker]; @@ -147,6 +147,9 @@ contract Gate is ProtocolVersioned { // check if the state request exists require(address(stakeRequest.beneficiary) != address(0)); + // check if the stake request was not accepted + require(stakeRequest.unlockHeight == 0); + // transfer the amount back require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); From c54f9f8919d585f662174b7aabc25269f1e9ed0e Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 3 May 2018 21:17:09 +0530 Subject: [PATCH 0011/1361] Truffle: updated truffle version --- contracts/Gate.sol | 6 +++--- package.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 641d70b2..8d3eae0a 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.23; +pragma solidity 0.4.23; // Copyright 2018 OpenST Ltd. // @@ -111,7 +111,7 @@ contract Gate is ProtocolVersioned { StakeRequested(msg.sender, _amount, _beneficiary, 0); - return unlockHeight; + return true; } function revertStakeRequest() @@ -149,7 +149,7 @@ contract Gate is ProtocolVersioned { // check if the stake request was not accepted require(stakeRequest.unlockHeight == 0); - + // transfer the amount back require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); diff --git a/package.json b/package.json index ddc28871..25613227 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ "web3": "^0.20.2" }, "devDependencies": { - "truffle": "^4.0.1", - "ganache-cli": "^6.0.3", + "truffle": "^4.1.7", "abi-decoder": "^1.0.9", - "ethereumjs-testrpc": "^6.0.3" + "ethereumjs-testrpc": "^6.0.3", + "ganache-cli": "^6.0.3" }, "author": "OpenST Foundation Ltd.", "license": "Apache v2.0" From f47d766bc0011436319a75a20c3a3f57a196bef2 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 13:27:52 +0530 Subject: [PATCH 0012/1361] contract: Resolved compile issue for Gate.sol --- contracts/Gate.sol | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 8d3eae0a..d603f2fc 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -1,4 +1,4 @@ -pragma solidity 0.4.23; +pragma solidity ^0.4.23; // Copyright 2018 OpenST Ltd. // @@ -60,7 +60,7 @@ contract Gate is ProtocolVersioned { bytes32 uuid; // OpenSTValue contract - address openSTValue; + OpenSTValue openSTValue; /* * Public functions @@ -83,7 +83,7 @@ contract Gate is ProtocolVersioned { workers = _workers; bounty = _bounty; uuid = _uuid; - openSTValue = _openSTValue; + openSTValue = OpenSTValue(_openSTValue); } function requestStake( @@ -99,8 +99,8 @@ contract Gate is ProtocolVersioned { require(_beneficiary != address(0)); require(address(stakeRequests[msg.sender].beneficiary) == address(0)); // check if the state request does not exists - require(EIP20Interface(openSTValue.valueToken).allowance(msg.sender, address(this)) >= _amount); - require(EIP20Interface(openSTValue.valueToken).transferFrom(msg.sender, address(this), _amount)); + require(openSTValue.valueToken().allowance(msg.sender, address(this)) >= _amount); + require(openSTValue.valueToken().transferFrom(msg.sender, address(this), _amount)); stakeRequests[msg.sender] = StakeRequest({ amount: _amount, @@ -109,12 +109,13 @@ contract Gate is ProtocolVersioned { unlockHeight: 0 }); - StakeRequested(msg.sender, _amount, _beneficiary, 0); + StakeRequested(msg.sender, _amount, _beneficiary); return true; } function revertStakeRequest() + external returns (bool) { StakeRequest storage stakeRequest = stakeRequests[msg.sender]; @@ -125,7 +126,7 @@ contract Gate is ProtocolVersioned { // check if the stake request was not accepted require(stakeRequest.unlockHeight == 0); - require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); + require(openSTValue.valueToken().transfer(msg.sender, stakeRequest.amount)); delete stakeRequests[msg.sender]; @@ -136,10 +137,11 @@ contract Gate is ProtocolVersioned { function rejectRequest(address _staker) + external returns (bool) { // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender)); //TODO: revist this + //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check // check if the stake request was done. StakeRequest storage stakeRequest = stakeRequests[_staker]; @@ -151,7 +153,7 @@ contract Gate is ProtocolVersioned { require(stakeRequest.unlockHeight == 0); // transfer the amount back - require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); + require(openSTValue.valueToken().transfer(msg.sender, stakeRequest.amount)); // delete the state request from the mapping storage delete stakeRequests[msg.sender]; From 91747a2e1df4c5b5a9555a5fc37600de58cc3f4f Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 13:31:10 +0530 Subject: [PATCH 0013/1361] Travis: added gate/develop branch to run travis tests --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 8fc288c4..196b8578 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ branches: only: - master - develop + - gate/develop notifications: email: recipients: From 0c35acfa94289de380ad2cbda72ee0d5ae0a182e Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 14:44:59 +0530 Subject: [PATCH 0014/1361] contract: resolved lint warnings and errors. MOSA-20. MOSA-23. MOSA-24 --- contracts/Gate.sol | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index d603f2fc..e6abd39c 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -1,3 +1,4 @@ +/* solhint-disable-next-line compiler-fixed */ pragma solidity ^0.4.23; // Copyright 2018 OpenST Ltd. @@ -25,6 +26,7 @@ import "./ProtocolVersioned.sol"; import "./OpenSTValue.sol"; import "./EIP20Interface.sol"; + contract Gate is ProtocolVersioned { /* @@ -34,7 +36,6 @@ contract Gate is ProtocolVersioned { event StakeRequestReverted(address _staker, uint256 _amount); event StakeRequestRejected(address _staker, uint256 _amount); - /* * Structures */ @@ -54,13 +55,13 @@ contract Gate is ProtocolVersioned { mapping(address /*staker */ => StakeRequest) public stakeRequests; // bounty amount - uint256 bounty; + uint256 private bounty; // utility token UUID - bytes32 uuid; + bytes32 private uuid; // OpenSTValue contract - OpenSTValue openSTValue; + OpenSTValue private openSTValue; /* * Public functions @@ -77,7 +78,7 @@ contract Gate is ProtocolVersioned { require(_openSTValue != address(0)); require(_uuid.length != 0); - // Should bounty with 0 amount be allowed ? commenting right now + // Should bounty with 0 amount be allowed ? //require(_bounty > 0); workers = _workers; @@ -90,14 +91,14 @@ contract Gate is ProtocolVersioned { uint256 _amount, address _beneficiary) external - returns ( - bool - ) + returns ( bool /* success */) { require(_amount > 0); require(_beneficiary != address(0)); - require(address(stakeRequests[msg.sender].beneficiary) == address(0)); // check if the state request does not exists + + // check if the state request does not exists + require(address(stakeRequests[msg.sender].beneficiary) == address(0)); require(openSTValue.valueToken().allowance(msg.sender, address(this)) >= _amount); require(openSTValue.valueToken().transferFrom(msg.sender, address(this), _amount)); @@ -107,7 +108,7 @@ contract Gate is ProtocolVersioned { beneficiary: _beneficiary, hashLock: 0, unlockHeight: 0 - }); + }); StakeRequested(msg.sender, _amount, _beneficiary); @@ -116,7 +117,7 @@ contract Gate is ProtocolVersioned { function revertStakeRequest() external - returns (bool) + returns (bool /* success */) { StakeRequest storage stakeRequest = stakeRequests[msg.sender]; @@ -135,10 +136,9 @@ contract Gate is ProtocolVersioned { return true; } - function rejectRequest(address _staker) external - returns (bool) + returns (bool /* success */) { // check if the caller is whitelisted worker //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check From 399ccd237e0d2d5c9653b06597770b35f1e7f4f0 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 15:35:25 +0530 Subject: [PATCH 0015/1361] Contract: renamed function from rejectRequest to rejectStakeRequest --- contracts/Gate.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index e6abd39c..4d73ac89 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -136,7 +136,7 @@ contract Gate is ProtocolVersioned { return true; } - function rejectRequest(address _staker) + function rejectStakeRequest(address _staker) external returns (bool /* success */) { @@ -162,4 +162,5 @@ contract Gate is ProtocolVersioned { return true; } + } \ No newline at end of file From 77f41040c254ef552cf05473697037f8ae76dd0c Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 17:11:44 +0530 Subject: [PATCH 0016/1361] contract: removed compilation warnings related to contructor and emit event. MOSA-20. MOSA-23. MOSA-24. MOSA-45 --- contracts/Gate.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 4d73ac89..bca7a12b 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -66,7 +66,7 @@ contract Gate is ProtocolVersioned { /* * Public functions */ - function Gate( + constructor( address _workers, uint256 _bounty, bytes32 _uuid, @@ -110,7 +110,7 @@ contract Gate is ProtocolVersioned { unlockHeight: 0 }); - StakeRequested(msg.sender, _amount, _beneficiary); + emit StakeRequested(msg.sender, _amount, _beneficiary); return true; } @@ -131,7 +131,7 @@ contract Gate is ProtocolVersioned { delete stakeRequests[msg.sender]; - StakeRequestReverted(msg.sender, stakeRequest.amount); + emit StakeRequestReverted(msg.sender, stakeRequest.amount); return true; } @@ -158,7 +158,7 @@ contract Gate is ProtocolVersioned { // delete the state request from the mapping storage delete stakeRequests[msg.sender]; - StakeRequestRejected(_staker, stakeRequest.amount); + emit StakeRequestRejected(_staker, stakeRequest.amount); return true; } From a5c7c31828f1bc31fc52d25e5ff952d34872ae44 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 7 May 2018 14:16:24 +0530 Subject: [PATCH 0017/1361] contract: Code review changes --- contracts/Gate.sol | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index bca7a12b..6078b8bd 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -97,8 +97,8 @@ contract Gate is ProtocolVersioned { require(_amount > 0); require(_beneficiary != address(0)); - // check if the state request does not exists - require(address(stakeRequests[msg.sender].beneficiary) == address(0)); + // check if the stake request does not exists + require(stakeRequests[msg.sender].beneficiary == address(0)); require(openSTValue.valueToken().allowance(msg.sender, address(this)) >= _amount); require(openSTValue.valueToken().transferFrom(msg.sender, address(this), _amount)); @@ -121,8 +121,8 @@ contract Gate is ProtocolVersioned { { StakeRequest storage stakeRequest = stakeRequests[msg.sender]; - // check if the state request exists for the msg.sender - require(address(stakeRequest.beneficiary) != address(0)); + // check if the stake request exists for the msg.sender + require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted require(stakeRequest.unlockHeight == 0); @@ -143,19 +143,18 @@ contract Gate is ProtocolVersioned { // check if the caller is whitelisted worker //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check - // check if the stake request was done. StakeRequest storage stakeRequest = stakeRequests[_staker]; - // check if the state request exists - require(address(stakeRequest.beneficiary) != address(0)); + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted require(stakeRequest.unlockHeight == 0); // transfer the amount back - require(openSTValue.valueToken().transfer(msg.sender, stakeRequest.amount)); + require(openSTValue.valueToken().transfer(_staker, stakeRequest.amount)); - // delete the state request from the mapping storage + // delete the stake request from the mapping storage delete stakeRequests[msg.sender]; emit StakeRequestRejected(_staker, stakeRequest.amount); From c78d60dafeb09374580f96853664ec276d792a68 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 8 May 2018 13:01:31 +0530 Subject: [PATCH 0018/1361] Contract: Code review changes --- contracts/Gate.sol | 34 +++++++++++++++--------------- contracts/OpenSTValueInterface.sol | 4 ++++ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 6078b8bd..8f6e16b2 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -23,11 +23,11 @@ pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- import "./ProtocolVersioned.sol"; -import "./OpenSTValue.sol"; +import "./OpenSTValueInterface.sol"; import "./EIP20Interface.sol"; +import "./Owned.sol"; - -contract Gate is ProtocolVersioned { +contract Gate is ProtocolVersioned, Owned { /* * Events @@ -60,8 +60,6 @@ contract Gate is ProtocolVersioned { // utility token UUID bytes32 private uuid; - // OpenSTValue contract - OpenSTValue private openSTValue; /* * Public functions @@ -72,19 +70,17 @@ contract Gate is ProtocolVersioned { bytes32 _uuid, address _openSTValue) public + Owned() ProtocolVersioned(_openSTValue) { require(_workers != address(0)); require(_openSTValue != address(0)); require(_uuid.length != 0); - // Should bounty with 0 amount be allowed ? - //require(_bounty > 0); - workers = _workers; bounty = _bounty; uuid = _uuid; - openSTValue = OpenSTValue(_openSTValue); + } function requestStake( @@ -100,8 +96,7 @@ contract Gate is ProtocolVersioned { // check if the stake request does not exists require(stakeRequests[msg.sender].beneficiary == address(0)); - require(openSTValue.valueToken().allowance(msg.sender, address(this)) >= _amount); - require(openSTValue.valueToken().transferFrom(msg.sender, address(this), _amount)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), _amount)); stakeRequests[msg.sender] = StakeRequest({ amount: _amount, @@ -115,23 +110,27 @@ contract Gate is ProtocolVersioned { return true; } + + /// @dev In order to revert stake request the msg.sender should be the staker function revertStakeRequest() external returns (bool /* success */) { + // only staker can do revertStakeRequest, msg.sender == staker StakeRequest storage stakeRequest = stakeRequests[msg.sender]; // check if the stake request exists for the msg.sender require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted - require(stakeRequest.unlockHeight == 0); + require(stakeRequest.hashLock == 0); - require(openSTValue.valueToken().transfer(msg.sender, stakeRequest.amount)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, stakeRequest.amount)); + uint256 stakeRequestAmount = stakeRequest.amount; delete stakeRequests[msg.sender]; - emit StakeRequestReverted(msg.sender, stakeRequest.amount); + emit StakeRequestReverted(msg.sender, stakeRequestAmount); return true; } @@ -149,15 +148,16 @@ contract Gate is ProtocolVersioned { require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted - require(stakeRequest.unlockHeight == 0); + require(stakeRequest.hashLock == 0); // transfer the amount back - require(openSTValue.valueToken().transfer(_staker, stakeRequest.amount)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(_staker, stakeRequest.amount)); + uint256 stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[msg.sender]; - emit StakeRequestRejected(_staker, stakeRequest.amount); + emit StakeRequestRejected(_staker, stakeRequestAmount); return true; } diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index 1dd2dc79..9a92ce8e 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -23,6 +23,7 @@ pragma solidity ^0.4.17; // ---------------------------------------------------------------------------- import "./CoreInterface.sol"; +import "./EIP20Interface.sol"; contract OpenSTValueInterface { @@ -83,4 +84,7 @@ contract OpenSTValueInterface { uint256, /* amountST */ uint256, /* amountUT */ uint256 /* expirationHeight */); + + function valueToken() + returns (EIP20Interface /* value token address*/); } \ No newline at end of file From e84d6a45d720e59b8dfbfe82ca9c4bb5344cd3de Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 8 May 2018 16:43:17 +0530 Subject: [PATCH 0019/1361] contract: typecasted to bytes32(0) and uint256(0) while checking for 0 --- contracts/Gate.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 8f6e16b2..08017c73 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -75,7 +75,7 @@ contract Gate is ProtocolVersioned, Owned { { require(_workers != address(0)); require(_openSTValue != address(0)); - require(_uuid.length != 0); + require(_uuid.length != bytes32(0)); workers = _workers; bounty = _bounty; @@ -90,7 +90,7 @@ contract Gate is ProtocolVersioned, Owned { returns ( bool /* success */) { - require(_amount > 0); + require(_amount > uint256(0)); require(_beneficiary != address(0)); // check if the stake request does not exists @@ -123,7 +123,7 @@ contract Gate is ProtocolVersioned, Owned { require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted - require(stakeRequest.hashLock == 0); + require(stakeRequest.hashLock == bytes32(0)); require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, stakeRequest.amount)); @@ -148,7 +148,7 @@ contract Gate is ProtocolVersioned, Owned { require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted - require(stakeRequest.hashLock == 0); + require(stakeRequest.hashLock == bytes32(0)); // transfer the amount back require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(_staker, stakeRequest.amount)); From 7195c7ad859c357d33b66e4907b1159919d8150b Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 8 May 2018 17:15:38 +0530 Subject: [PATCH 0020/1361] contract: fixed compilation issue --- contracts/Gate.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 08017c73..9022e4e9 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -75,7 +75,7 @@ contract Gate is ProtocolVersioned, Owned { { require(_workers != address(0)); require(_openSTValue != address(0)); - require(_uuid.length != bytes32(0)); + require(_uuid.length != uint8(0)); workers = _workers; bounty = _bounty; From 33cbde807696a9cfa0e65898956733b96450be78 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Wed, 2 May 2018 15:50:36 +0200 Subject: [PATCH 0021/1361] Contracts: adds the gate contract. MOSA-19 --- contracts/Gate.sol | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 contracts/Gate.sol diff --git a/contracts/Gate.sol b/contracts/Gate.sol new file mode 100644 index 00000000..5666b083 --- /dev/null +++ b/contracts/Gate.sol @@ -0,0 +1,46 @@ +pragma solidity ^0.4.23; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: Gate +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./ProtocolVersioned.sol"; + +contract Gate is ProtocolVersioned { + /* + * Structures + */ + struct StakeRequest { + uint256 amount; + uint256 unlockHeight; + address beneficiary; //The token holder contract in the future + bytes32 hashLock; + } + + /* + * Storage + */ + address public workers; //TODO: update type once workers contract and interfaces are added to the repo. + mapping(address /*staker */ => StakeRequest) public stakeRequests; + + function Gate() public { //TODO: complete as necessary + + } +} \ No newline at end of file From 65b95d703a4fa9576665818baace59c5592e9b4a Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 3 May 2018 20:25:57 +0530 Subject: [PATCH 0022/1361] contract: add requestStake, revertStakeRequest, rejectRequest functions --- .gitignore | 2 + contracts/Gate.sol | 116 +- package-lock.json | 5624 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 4560 insertions(+), 1182 deletions(-) diff --git a/.gitignore b/.gitignore index 834a19d4..678000bc 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ contracts/abi/ # don't commit node_modules node_modules + +.idea/ diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 5666b083..4c347b12 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -22,8 +22,19 @@ pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- import "./ProtocolVersioned.sol"; +import "./OpenSTValue.sol"; +import "./EIP20Interface.sol"; contract Gate is ProtocolVersioned { + + /* + * Events + */ + event StakeRequested(address _staker, uint256 _amount, address _beneficiary); + event StakeRequestReverted(address _staker, uint256 _amount); + event StakeRequestRejected(address _staker, uint256 _amount); + + /* * Structures */ @@ -38,9 +49,112 @@ contract Gate is ProtocolVersioned { * Storage */ address public workers; //TODO: update type once workers contract and interfaces are added to the repo. + + // stake requests mapping(address /*staker */ => StakeRequest) public stakeRequests; - function Gate() public { //TODO: complete as necessary + // bounty amount + uint256 bounty; + + // utility token UUID + bytes32 uuid; + + // OpenSTValue contract + address openSTValue; + + /* + * Public functions + */ + function Gate( + address _workers, + uint256 _bounty, + bytes32 _uuid, + address _openSTValue) + public + ProtocolVersioned(_openSTValue) + { + require(_workers != address(0)); + require(_openSTValue != address(0)); + require(_uuid.length != 0); + + // Should bounty with 0 amount be allowed ? commenting right now + //require(_bounty > 0); + + workers = _workers; + bounty = _bounty; + uuid = _uuid; + openSTValue = _openSTValue; + } + + function requestStake( + uint256 _amount, + address _beneficiary) + external + returns ( + bool + ) + { + + require(_amount > 0); + require(_beneficiary != address(0)); + require(address(stakeRequests[msg.sender].beneficiary) == address(0)); // check if the state request does not exists + + require(EIP20Interface(openSTValue.valueToken).allowance(msg.sender, address(this)) >= _amount); + require(EIP20Interface(openSTValue.valueToken).transferFrom(msg.sender, address(this), _amount)); + + stakeRequests[msg.sender] = StakeRequest({ + amount: _amount, + beneficiary: _beneficiary, + hashLock: 0, + unlockHeight: 0 + }); + + StakeRequested(msg.sender, _amount, _beneficiary, unlockHeight); + + return unlockHeight; + } + + function revertStakeRequest() + returns (bool) + { + StakeRequest storage stakeRequest = stakeRequests[msg.sender]; + + // check if the state request exists for the msg.sender + require(address(stakeRequest.beneficiary) != address(0)); + + // check if the stake request was not accepted + require(stakeRequest.unlockHeight == 0); + + require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); + + delete stakeRequests[msg.sender]; + + StakeRequestReverted(msg.sender, stakeRequest.amount); + + return true; + } + + + function rejectRequest(address _staker) + returns (bool) + { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + + // check if the stake request was done. + StakeRequest storage stakeRequest = stakeRequests[_staker]; + + // check if the state request exists + require(address(stakeRequest.beneficiary) != address(0)); + + // transfer the amount back + require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); + + // delete the state request from the mapping storage + delete stakeRequests[msg.sender]; + + StakeRequestRejected(_staker, stakeRequest.amount); + return true; } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 20ffa8fb..e9595c4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,16 +4,33 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, "abi-decoder": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.0.9.tgz", - "integrity": "sha1-a8/Yb39j++yFc9l3izpPkruS4B8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.1.0.tgz", + "integrity": "sha512-nvLArBx0XOJufWyaghMKtIofZDBwEMdVZoqcetQOIe1qYeKZk4+kRYGPEJ5lt7dD3MLulw//amUzOJLM8eW5RA==", "dev": true, "requires": { - "babel-core": "6.26.0", + "babel-core": "6.26.3", "babel-loader": "6.4.1", "babel-plugin-add-module-exports": "0.2.1", "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-runtime": "6.23.0", "babel-preset-es2015": "6.24.1", "chai": "3.5.0", "web3": "0.18.4", @@ -40,9 +57,9 @@ } }, "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", "dev": true }, "acorn-dynamic-import": { @@ -89,6 +106,12 @@ "repeat-string": "1.6.1" } }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -101,24 +124,27 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "any-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", + "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", + "dev": true + }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "2.3.11", + "micromatch": "3.1.10", "normalize-path": "2.1.1" } }, "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", @@ -126,21 +152,54 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "4.11.8", "inherits": "2.0.1", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -157,13 +216,25 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", + "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", + "dev": true + }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "4.17.10" } }, "async-each": { @@ -172,6 +243,12 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -184,13 +261,13 @@ } }, "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", + "babel-generator": "6.26.1", "babel-helpers": "6.24.1", "babel-messages": "6.23.0", "babel-register": "6.26.0", @@ -202,7 +279,7 @@ "convert-source-map": "1.5.1", "debug": "2.6.9", "json5": "0.5.1", - "lodash": "4.17.4", + "lodash": "4.17.10", "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.8", @@ -211,9 +288,9 @@ } }, "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "6.23.0", @@ -221,11 +298,33 @@ "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.4", + "lodash": "4.17.10", "source-map": "0.5.7", "trim-right": "1.0.1" } }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, "babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", @@ -247,7 +346,30 @@ "babel-helper-function-name": "6.24.1", "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.10" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -301,7 +423,20 @@ "requires": { "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.10" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { @@ -364,6 +499,130 @@ "babel-runtime": "6.26.0" } }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", @@ -392,7 +651,7 @@ "babel-template": "6.26.0", "babel-traverse": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.10" } }, "babel-plugin-transform-es2015-classes": { @@ -476,15 +735,15 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", "babel-runtime": "6.26.0", "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { "babel-plugin-transform-strict-mode": "6.24.1", @@ -598,6 +857,47 @@ "regexpu-core": "2.0.0" } }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, "babel-plugin-transform-regenerator": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", @@ -607,6 +907,15 @@ "regenerator-transform": "0.10.1" } }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", @@ -635,7 +944,7 @@ "babel-plugin-transform-es2015-function-name": "6.24.1", "babel-plugin-transform-es2015-literals": "6.22.0", "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", "babel-plugin-transform-es2015-modules-umd": "6.24.1", "babel-plugin-transform-es2015-object-super": "6.24.1", @@ -649,17 +958,53 @@ "babel-plugin-transform-regenerator": "6.26.0" } }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", + "babel-core": "6.26.3", "babel-runtime": "6.26.0", - "core-js": "2.5.3", + "core-js": "2.5.6", "home-or-tmp": "2.0.0", - "lodash": "4.17.4", + "lodash": "4.17.10", "mkdirp": "0.5.1", "source-map-support": "0.4.18" } @@ -670,7 +1015,7 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.3", + "core-js": "2.5.6", "regenerator-runtime": "0.11.1" } }, @@ -684,7 +1029,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "lodash": "4.17.4" + "lodash": "4.17.10" } }, "babel-traverse": { @@ -700,8 +1045,8 @@ "babylon": "6.18.0", "debug": "2.6.9", "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "invariant": "2.2.4", + "lodash": "4.17.10" } }, "babel-types": { @@ -712,7 +1057,7 @@ "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.4", + "lodash": "4.17.10", "to-fast-properties": "1.0.3" } }, @@ -728,10 +1073,71 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, "big.js": { @@ -756,6 +1162,12 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "binaryextensions": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", + "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", + "dev": true + }, "bindings": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", @@ -768,9 +1180,9 @@ "dev": true }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "1.0.0", @@ -778,14 +1190,32 @@ } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, "brorand": { @@ -801,34 +1231,34 @@ "dev": true }, "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", "inherits": "2.0.1", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", + "browserify-aes": "1.2.0", + "browserify-des": "1.0.1", "evp_bytestokey": "1.0.3" } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "dev": true, "requires": { "cipher-base": "1.0.4", @@ -843,7 +1273,7 @@ "dev": true, "requires": { "bn.js": "4.11.8", - "randombytes": "2.0.5" + "randombytes": "2.0.6" } }, "browserify-sign": { @@ -854,11 +1284,11 @@ "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", "elliptic": "6.4.0", "inherits": "2.0.1", - "parse-asn1": "5.1.0" + "parse-asn1": "5.1.1" } }, "browserify-zlib": { @@ -876,11 +1306,17 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", + "base64-js": "1.3.0", + "ieee754": "1.1.11", "isarray": "1.0.0" } }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -899,11 +1335,57 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true }, "center-align": { "version": "0.1.3", @@ -939,21 +1421,30 @@ "supports-color": "2.0.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "dev": true, "requires": { - "anymatch": "1.3.2", + "anymatch": "2.0.0", "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", + "braces": "2.3.2", + "fsevents": "1.2.3", + "glob-parent": "3.1.0", "inherits": "2.0.1", "is-binary-path": "1.0.1", - "is-glob": "2.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "readdirp": "2.1.0", + "upath": "1.0.5" } }, "cipher-base": { @@ -963,9 +1454,80 @@ "dev": true, "requires": { "inherits": "2.0.1", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "1.0.2" } }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -977,6 +1539,44 @@ "wordwrap": "0.0.2" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "2.0.1", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.6" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -989,6 +1589,37 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", + "integrity": "sha512-6Y+iBnWmXL+AWtlOp2Vr6R2w5MUlNJRwR0ShVFaAb1CqWzhPOpQg4L0jxD+xpw/Nc8QJwaq3KM79QUCriY8CWQ==", + "dev": true + }, "commander": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", @@ -1004,6 +1635,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1031,10 +1668,16 @@ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==", "dev": true }, "core-util-is": { @@ -1044,9 +1687,9 @@ "dev": true }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { "bn.js": "4.11.8", @@ -1054,29 +1697,30 @@ } }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "1.0.4", "inherits": "2.0.1", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "inherits": "2.0.1", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "cross-spawn": { @@ -1085,7 +1729,7 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.3", "shebang-command": "1.2.0", "which": "1.3.0" } @@ -1096,17 +1740,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.0", + "browserify-cipher": "1.0.1", "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", "inherits": "2.0.1", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, "crypto-js": { @@ -1120,15 +1764,33 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.37" + "es5-ext": "0.10.42" } }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", + "dev": true + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1144,6 +1806,21 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "1.0.0" + } + }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -1161,6 +1838,59 @@ } } }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -1168,9 +1898,15 @@ "dev": true, "requires": { "inherits": "2.0.1", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, + "detect-conflict": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", + "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", + "dev": true + }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -1181,26 +1917,77 @@ } }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "4.11.8", "miller-rabin": "4.0.1", - "randombytes": "2.0.5" + "randombytes": "2.0.6" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", "dev": true }, "elliptic": { @@ -1214,7 +2001,7 @@ "hash.js": "1.1.3", "hmac-drbg": "1.0.1", "inherits": "2.0.1", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -1236,15 +2023,31 @@ "tapable": "0.2.8" } }, + "envinfo": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-4.4.2.tgz", + "integrity": "sha512-5rfRs+m+6pwoKRCFqpsA5+qsLngFms1aWPrxfKbrObCzQaPc3M3yPloZx+BL9UE3dK58cxw36XVQbFRSCCfGSQ==", + "dev": true + }, "errno": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { "prr": "1.0.1" } }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "dev": true, + "requires": { + "string-template": "0.2.1", + "xtend": "4.0.1" + } + }, "error-ex": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", @@ -1255,13 +2058,14 @@ } }, "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "version": "0.10.42", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "dev": true, "requires": { "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { @@ -1271,7 +2075,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.42", "es6-symbol": "3.1.1" } }, @@ -1282,7 +2086,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.42", "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", @@ -1296,7 +2100,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.42", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -1309,7 +2113,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.42" } }, "es6-weak-map": { @@ -1319,7 +2123,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.42", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } @@ -1338,18 +2142,23 @@ "requires": { "es6-map": "0.1.5", "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", + "esrecurse": "4.2.1", "estraverse": "4.2.0" } }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "4.2.0" } }, "estraverse": { @@ -1370,25 +2179,25 @@ "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", "dev": true, "requires": { - "webpack": "3.10.0" + "webpack": "3.11.0" }, "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", + "fast-deep-equal": "1.1.0", "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "json-schema-traverse": "0.3.1", + "uri-js": "3.0.2" } }, "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "ansi-regex": { @@ -1549,15 +2358,15 @@ } }, "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", "dev": true, "requires": { - "acorn": "5.3.0", + "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", + "ajv": "6.4.0", + "ajv-keywords": "3.2.0", "async": "2.6.0", "enhanced-resolve": "3.4.1", "escope": "3.6.0", @@ -1573,7 +2382,7 @@ "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", + "watchpack": "1.6.0", "webpack-sources": "1.1.0", "yargs": "8.0.2" } @@ -1623,7 +2432,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.42" } }, "events": { @@ -1639,7 +2448,7 @@ "dev": true, "requires": { "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "execa": { @@ -1657,13 +2466,45 @@ "strip-eof": "1.0.0" } }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, "expand-range": { @@ -1673,46 +2514,214 @@ "dev": true, "requires": { "fill-range": "2.2.3" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "homedir-polyfill": "1.0.1" } }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.23", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.1.tgz", + "integrity": "sha512-wSyW1TBK3ia5V+te0rGPXudeMHoUQW6O5Y9oATiaGhpENmEifPDlOdhpsnlj5HoG6ttIvGiY1DdCmI9X2xGMhg==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "2.2.1", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.2", + "micromatch": "3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, "find-cache-dir": { @@ -1736,6 +2745,21 @@ "pinkie-promise": "2.0.1" } }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "flow-parser": { + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.71.0.tgz", + "integrity": "sha512-rXSvqSBLf8aRI6T3P99jMcUYvZoO1KZcKDkzGJmXvYdNAgRKu7sfGNtxEsn3cX4TgungBuJpX+K8aHRC9/B5MA==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1751,6 +2775,25 @@ "for-in": "1.0.2" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.1", + "readable-stream": "2.3.6" + } + }, "fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -1761,7 +2804,7 @@ "jsonfile": "2.4.0", "klaw": "1.3.1", "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "rimraf": "2.2.8" } }, "fs.realpath": { @@ -1771,39 +2814,29 @@ "dev": true }, "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", + "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", "dev": true, "optional": true, "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" + "nan": "2.10.0", + "node-pre-gyp": "0.9.1" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true @@ -1815,91 +2848,25 @@ "optional": true, "requires": { "delegates": "1.0.0", - "readable-stream": "2.2.9" + "readable-stream": "2.3.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, "balanced-match": { - "version": "0.4.2", + "version": "1.0.0", "bundled": true, "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, "brace-expansion": { - "version": "1.1.7", + "version": "1.1.11", "bundled": true, "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true @@ -1909,14 +2876,6 @@ "bundled": true, "dev": true }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, "concat-map": { "version": "0.0.1", "bundled": true, @@ -1930,35 +2889,11 @@ "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, "dev": true, "optional": true, @@ -1972,11 +2907,6 @@ "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, "delegates": { "version": "1.0.0", "bundled": true, @@ -1984,74 +2914,25 @@ "optional": true }, "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", + "version": "1.0.3", "bundled": true, "dev": true, "optional": true }, - "form-data": { - "version": "2.1.4", + "fs-minipass": { + "version": "1.2.5", "bundled": true, "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "minipass": "2.2.4" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } + "optional": true }, "gauge": { "version": "2.7.4", @@ -2059,7 +2940,7 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", + "aproba": "1.2.0", "console-control-strings": "1.1.0", "has-unicode": "2.0.1", "object-assign": "4.1.1", @@ -2069,27 +2950,11 @@ "wide-align": "1.1.2" } }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, "glob": { "version": "7.1.2", "bundled": true, "dev": true, + "optional": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -2099,64 +2964,35 @@ "path-is-absolute": "1.0.1" } }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", + "has-unicode": { + "version": "2.0.1", "bundled": true, "dev": true, "optional": true }, - "har-validator": { - "version": "4.2.1", + "iconv-lite": { + "version": "0.4.21", "bundled": true, "dev": true, "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "safer-buffer": "2.1.2" } }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", + "ignore-walk": { + "version": "3.0.1", "bundled": true, "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "minimatch": "3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, + "optional": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -2168,7 +3004,7 @@ "dev": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -2181,111 +3017,43 @@ "number-is-nan": "1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, "dev": true, "optional": true }, - "jsprim": { - "version": "1.4.0", + "minimatch": { + "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "brace-expansion": "1.1.11" } }, - "mime-db": { - "version": "1.27.0", + "minimist": { + "version": "0.0.8", "bundled": true, "dev": true }, - "mime-types": { - "version": "2.1.15", + "minipass": { + "version": "2.2.4", "bundled": true, "dev": true, "requires": { - "mime-db": "1.27.0" + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, - "minimatch": { - "version": "3.0.4", + "minizlib": { + "version": "1.1.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.7" + "minipass": "2.2.4" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, "mkdirp": { "version": "0.5.1", "bundled": true, @@ -2300,23 +3068,33 @@ "dev": true, "optional": true }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, "node-pre-gyp": { - "version": "0.6.39", + "version": "0.9.1", "bundled": true, "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", + "detect-libc": "1.0.3", "mkdirp": "0.5.1", + "needle": "2.2.0", "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.6", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" } }, "nopt": { @@ -2325,12 +3103,28 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" } }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, "dev": true, "optional": true, @@ -2346,12 +3140,6 @@ "bundled": true, "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, "object-assign": { "version": "4.1.1", "bundled": true, @@ -2379,7 +3167,7 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "dev": true, "optional": true, @@ -2391,39 +3179,23 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.0", "bundled": true, "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.6", "bundled": true, "dev": true, "optional": true, "requires": { "deep-extend": "0.4.2", - "ini": "1.3.4", + "ini": "1.3.5", "minimist": "1.2.0", "strip-json-comments": "2.0.1" }, @@ -2437,112 +3209,63 @@ } }, "readable-stream": { - "version": "2.2.9", + "version": "2.3.6", "bundled": true, "dev": true, + "optional": true, "requires": { - "buffer-shims": "1.0.0", "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", "util-deprecate": "1.0.2" } }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, "dev": true, + "optional": true, "requires": { "glob": "7.1.2" } }, "safe-buffer": { - "version": "5.0.1", + "version": "5.1.1", "bundled": true, "dev": true }, - "semver": { - "version": "5.3.0", + "safer-buffer": { + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, - "set-blocking": { - "version": "2.0.0", + "sax": { + "version": "1.2.4", "bundled": true, "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", + "semver": { + "version": "5.5.0", "bundled": true, "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", + "set-blocking": { + "version": "2.0.0", "bundled": true, "dev": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, - "sshpk": { - "version": "1.13.0", + "signal-exit": { + "version": "3.0.2", "bundled": true, "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "string-width": { "version": "1.0.2", @@ -2555,19 +3278,14 @@ } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "5.1.1" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, @@ -2583,81 +3301,26 @@ "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", + "version": "4.4.1", "bundled": true, "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, "dev": true, "optional": true }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, "wide-align": { "version": "1.1.2", "bundled": true, @@ -2671,304 +3334,259 @@ "version": "1.0.2", "bundled": true, "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true } } }, "ganache-cli": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz", - "integrity": "sha512-C7a8su4Zwtootvcy9HtroshTsyUtLC51+aOGUREpy/G4CXbAuLa3nNQri2NyFdqGyOrm/D+jxYP/PWnnrGLyXg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.0.tgz", + "integrity": "sha512-FdTeyk4uLRHGeFiMe+Qnh4Hc5KiTVqvRVVvLDFJEVVKC1P1yHhEgZeh9sp1KhuvxSrxToxgJS25UapYQwH4zHw==", "dev": true, "requires": { - "webpack": "3.10.0" + "source-map-support": "0.5.5", + "webpack-cli": "2.1.3" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz", + "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "buffer-from": "1.0.0", + "source-map": "0.6.1" + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "gh-got": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", + "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", + "dev": true, + "requires": { + "got": "7.1.0", + "is-plain-obj": "1.1.0" + }, + "dependencies": { + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", "dev": true }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "1.0.0" + } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" + "prepend-http": "1.0.4" } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + } + } + }, + "github-username": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", + "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", + "dev": true, + "requires": { + "gh-got": "6.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.1", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-all": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", + "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", + "dev": true, + "requires": { + "glob": "7.1.2", + "yargs": "1.2.6" + }, + "dependencies": { + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", "dev": true }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "yargs": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", + "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "minimist": "0.1.0" } - }, - "read-pkg-up": { + } + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "is-glob": "2.0.1" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", - "dev": true, - "requires": { - "acorn": "5.3.0", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "camelcase": "4.1.0" + "is-extglob": "1.0.0" } } } }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } } }, - "glob-base": { + "glob-to-regexp": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "is-glob": "2.0.1" + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.0" } }, "globals": { @@ -2977,6 +3595,52 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "dev": true, + "requires": { + "@sindresorhus/is": "0.7.0", + "cacheable-request": "2.1.4", + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "into-stream": "3.1.0", + "is-retry-allowed": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "mimic-response": "1.0.0", + "p-cancelable": "0.4.1", + "p-timeout": "2.0.1", + "pify": "3.0.0", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "url-parse-lax": "3.0.0", + "url-to-options": "1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -2989,6 +3653,15 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, + "grouped-queue": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", + "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, "growl": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", @@ -3004,19 +3677,73 @@ "ansi-regex": "2.1.1" } }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "1.4.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.1" + "inherits": "2.0.1", + "safe-buffer": "5.1.2" } }, "hash.js": { @@ -3026,7 +3753,7 @@ "dev": true, "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" }, "dependencies": { "inherits": { @@ -3050,7 +3777,7 @@ "dev": true, "requires": { "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -3064,10 +3791,25 @@ "os-tmpdir": "1.0.2" } }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, "https-browserify": { @@ -3076,12 +3818,72 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", + "dev": true + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -3103,16 +3905,121 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rxjs": "5.5.10", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "2.3.0", + "p-is-promise": "1.1.0" + } + }, "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { "loose-envify": "1.3.1" @@ -3124,6 +4031,15 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3151,7 +4067,35 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "is-dotfile": { @@ -3176,9 +4120,9 @@ "dev": true }, "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-finite": { @@ -3200,23 +4144,78 @@ } }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "2.1.1" } }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "3.2.2" } }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, + "is-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", + "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "dev": true, + "requires": { + "symbol-observable": "0.2.4" + }, + "dependencies": { + "symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "dev": true + } + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -3229,6 +4228,27 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-scoped": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", + "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", + "dev": true, + "requires": { + "scoped-regex": "1.0.0" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3241,12 +4261,24 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3254,12 +4286,30 @@ "dev": true }, "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", "dev": true, "requires": { - "isarray": "1.0.0" + "binaryextensions": "2.1.1", + "editions": "1.3.4", + "textextensions": "2.2.0" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" } }, "js-tokens": { @@ -3268,18 +4318,141 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "jscodeshift": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.0.tgz", + "integrity": "sha512-JAcQINNMFpdzzpKJN8k5xXjF3XDuckB1/48uScSzcnNyK199iWEc9AxKL9OoX5144M2w5zEx9Qs4/E/eBZZUlw==", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-1": "6.24.1", + "babel-register": "6.26.0", + "babylon": "7.0.0-beta.46", + "colors": "1.2.4", + "flow-parser": "0.71.0", + "lodash": "4.17.10", + "micromatch": "2.3.11", + "neo-async": "2.5.1", + "node-dir": "0.1.8", + "nomnom": "1.8.1", + "recast": "0.14.7", + "temp": "0.8.3", + "write-file-atomic": "1.3.4" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "babylon": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", + "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + } + } + }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", @@ -3329,8 +4502,8 @@ "requires": { "bindings": "1.3.0", "inherits": "2.0.3", - "nan": "2.8.0", - "safe-buffer": "5.1.1" + "nan": "2.10.0", + "safe-buffer": "5.1.2" }, "dependencies": { "inherits": { @@ -3340,6 +4513,15 @@ } } }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3373,6 +4555,150 @@ "invert-kv": "1.0.0" } }, + "listr": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", + "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "figures": "1.7.0", + "indent-string": "2.1.0", + "is-observable": "0.2.0", + "is-promise": "2.1.0", + "is-stream": "1.1.0", + "listr-silent-renderer": "1.1.1", + "listr-update-renderer": "0.4.0", + "listr-verbose-renderer": "0.4.1", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "ora": "0.2.3", + "p-map": "1.2.0", + "rxjs": "5.5.10", + "stream-to-observable": "0.2.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", + "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "elegant-spinner": "1.0.1", + "figures": "1.7.0", + "indent-string": "3.2.0", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "date-fns": "1.29.0", + "figures": "1.7.0" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -3423,9 +4749,9 @@ } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "lodash._baseassign": { @@ -3502,6 +4828,95 @@ "lodash.isarray": "3.0.4" } }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "2.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "cli-cursor": "1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -3517,14 +4932,52 @@ "js-tokens": "3.0.2" } }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "object-visit": "1.0.1" } }, "md5.js": { @@ -3535,18 +4988,6 @@ "requires": { "hash-base": "3.0.4", "inherits": "2.0.1" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.1" - } - } } }, "mem": { @@ -3555,7 +4996,92 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" + } + }, + "mem-fs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", + "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", + "dev": true, + "requires": { + "through2": "2.0.3", + "vinyl": "1.2.0", + "vinyl-file": "2.0.0" + } + }, + "mem-fs-editor": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz", + "integrity": "sha512-QHvdXLLNmwJXxKdf7x27aNUren6IoPxwcM8Sfd+S6/ddQQMcYdEtVKsh6ilpqMrU18VQuKZEaH0aCGt3JDbA0g==", + "dev": true, + "requires": { + "commondir": "1.0.1", + "deep-extend": "0.5.1", + "ejs": "2.6.1", + "glob": "7.1.2", + "globby": "8.0.1", + "isbinaryfile": "3.0.2", + "mkdirp": "0.5.1", + "multimatch": "2.1.0", + "rimraf": "2.2.8", + "through2": "2.0.3", + "vinyl": "2.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.1", + "glob": "7.1.2", + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } } }, "memory-fs": { @@ -3564,8 +5090,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.6", - "readable-stream": "2.3.3" + "errno": "0.1.7", + "readable-stream": "2.3.6" } }, "memorystream": { @@ -3574,25 +5100,39 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "miller-rabin": { @@ -3606,15 +5146,21 @@ } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, - "minimalistic-assert": { + "mimic-response": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { @@ -3629,7 +5175,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -3638,6 +5184,27 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -3676,6 +5243,26 @@ "ms": "2.0.0" } }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.1", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, "supports-color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", @@ -3688,9 +5275,9 @@ } }, "moment": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.2.tgz", - "integrity": "sha512-Rf6jiHPEfxp9+dlzxPTmRHbvoFXsh2L/U8hOupUMpnuecHQmI6cF6lUbJl3QqKPko1u6ujO+FxtcajLVfLpAtA==" + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" }, "ms": { "version": "2.0.0", @@ -3698,10 +5285,80 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "node-dir": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", + "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", + "dev": true }, "node-libs-browser": { "version": "2.1.0", @@ -3715,7 +5372,7 @@ "console-browserify": "1.1.0", "constants-browserify": "1.0.0", "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", + "domain-browser": "1.2.0", "events": "1.1.1", "https-browserify": "1.0.0", "os-browserify": "0.3.0", @@ -3723,27 +5380,62 @@ "process": "0.11.10", "punycode": "1.4.1", "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", + "readable-stream": "2.3.6", "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.4", + "stream-http": "2.8.1", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", "url": "0.11.0", "util": "0.10.3", "vm-browserify": "0.0.4" } }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "underscore": "1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", + "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "normalize-path": { @@ -3755,6 +5447,17 @@ "remove-trailing-separator": "1.1.0" } }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "2.0.0", + "query-string": "5.1.1", + "sort-keys": "2.0.0" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -3776,6 +5479,37 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -3786,6 +5520,15 @@ "is-extendable": "0.1.1" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3795,6 +5538,54 @@ "wrappy": "1.0.2" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-spinners": "0.1.2", + "object-assign": "4.1.1" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, "original-require": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", @@ -3828,12 +5619,39 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-lazy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", + "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=", + "dev": true + }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", @@ -3852,6 +5670,27 @@ "p-limit": "1.2.0" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "1.0.0" + } + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -3865,16 +5704,16 @@ "dev": true }, "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "pbkdf2": "3.0.16" } }, "parse-glob": { @@ -3887,6 +5726,23 @@ "is-dotfile": "1.0.3", "is-extglob": "1.0.0", "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } } }, "parse-json": { @@ -3898,12 +5754,30 @@ "error-ex": "1.3.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -3925,6 +5799,12 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -3937,16 +5817,16 @@ } }, "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "dev": true, "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "pify": { @@ -3979,12 +5859,36 @@ "find-up": "1.1.2" } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", + "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", + "dev": true + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -3998,9 +5902,9 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "prr": { @@ -4016,16 +5920,16 @@ "dev": true }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "dev": true, "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" } }, "punycode": { @@ -4034,6 +5938,17 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -4056,26 +5971,6 @@ "kind-of": "4.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -4088,22 +5983,40 @@ } }, "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "read-chunk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", + "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", "dev": true, "requires": { - "randombytes": "2.0.5", - "safe-buffer": "5.1.1" + "pify": "3.0.0", + "safe-buffer": "5.1.2" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "read-pkg": { @@ -4128,17 +6041,17 @@ } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", "util-deprecate": "1.0.2" }, "dependencies": { @@ -4158,10 +6071,39 @@ "requires": { "graceful-fs": "4.1.11", "minimatch": "3.0.4", - "readable-stream": "2.3.3", + "readable-stream": "2.3.6", "set-immediate-shim": "1.0.1" } }, + "recast": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", + "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", + "dev": true, + "requires": { + "ast-types": "0.11.3", + "esprima": "4.0.0", + "private": "0.1.8", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.7.1" + } + }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", @@ -4194,6 +6136,16 @@ "is-equal-shallow": "0.1.3" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -4255,6 +6207,12 @@ "is-finite": "1.0.2" } }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4273,6 +6231,71 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "1.0.1" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -4283,33 +6306,84 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "glob": "7.1.1" + "hash-base": "3.0.4", + "inherits": "2.0.1" } }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.1" + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "scoped-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", + "dev": true }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "set-blocking": { @@ -4324,6 +6398,29 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -4331,13 +6428,13 @@ "dev": true }, "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { "inherits": "2.0.1", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "shebang-command": { @@ -4355,6 +6452,17 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shelljs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", + "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -4367,16 +6475,130 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, "solc": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.18.tgz", - "integrity": "sha512-Kq+O3PNF9Pfq7fB+lDYAuoqRdghLmZyfngsg0h1Hj38NKAeVHeGPOGeZasn5KqdPeCzbMFvaGyTySxzGv6aXCg==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.23.tgz", + "integrity": "sha512-AT7anLHY6uIRg2It6N0UlCHeZ7YeecIkUhnlirrCgCPCUevtnoN48BxvgigN/4jJTRljv5oFhAJtI6gvHzT5DQ==", "dev": true, "requires": { "fs-extra": "0.30.0", "memorystream": "0.3.1", "require-from-string": "1.2.1", - "semver": "5.4.1", + "semver": "5.5.0", "yargs": "4.8.1" }, "dependencies": { @@ -4437,6 +6659,15 @@ } } }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", @@ -4449,6 +6680,19 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -4458,27 +6702,74 @@ "source-map": "0.5.7" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "dev": true }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -4486,22 +6777,43 @@ "dev": true, "requires": { "inherits": "2.0.1", - "readable-stream": "2.3.3" + "readable-stream": "2.3.6" } }, "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", + "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", "dev": true, "requires": { "builtin-status-codes": "3.0.0", "inherits": "2.0.1", - "readable-stream": "2.3.3", + "readable-stream": "2.3.6", "to-arraybuffer": "1.0.1", "xtend": "4.0.1" } }, + "stream-to-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", + "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "dev": true, + "requires": { + "any-observable": "0.2.0" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -4514,12 +6826,12 @@ } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "strip-ansi": { @@ -4540,6 +6852,16 @@ "is-utf8": "0.2.1" } }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "2.0.0", + "strip-bom": "2.0.0" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4552,21 +6874,80 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "tapable": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2", + "rimraf": "2.2.8" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", + "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { "setimmediate": "1.0.5" } }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -4579,6 +6960,37 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -4586,14 +6998,14 @@ "dev": true }, "truffle": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.4.tgz", - "integrity": "sha512-keAkRNNfU3W7yUMRDF3YHoqmqdv6TChXY0g+RuPpxnRHfspXVtIKwuN2pV07jzY/RbDsIKShcSyF7VBV7eZUvg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.8.tgz", + "integrity": "sha512-btDML3J9Ao+UDqR725ajTybcEqyXzxFzJDC/NAXOyOXoXf2HJwKq6VEvnjP9qc6owA+fJ50d87MmsPRXk+riCg==", "dev": true, "requires": { "mocha": "3.5.3", "original-require": "1.0.1", - "solc": "0.4.18" + "solc": "0.4.23" } }, "tty-browserify": { @@ -4651,6 +7063,122 @@ "webpack-sources": "1.1.0" } }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "untildify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", + "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", + "dev": true + }, + "upath": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", + "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==", + "dev": true + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -4669,6 +7197,38 @@ } } }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "utf8": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", @@ -4688,14 +7248,45 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "v8-compile-cache": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", + "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", + "dev": true + }, "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0", + "strip-bom-stream": "2.0.0", + "vinyl": "1.2.0" } }, "vm-browserify": { @@ -4708,20 +7299,20 @@ } }, "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.1" } }, "web3": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.2.tgz", - "integrity": "sha1-xU2sX8DjdzmcBMGm7LsS5FEyeNY=", + "version": "0.20.6", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", + "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", "requires": { "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", "crypto-js": "3.1.8", @@ -4741,7 +7332,7 @@ "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", "dev": true, "requires": { - "acorn": "5.3.0", + "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", "ajv": "4.11.8", "ajv-keywords": "1.5.1", @@ -4759,18 +7350,378 @@ "supports-color": "3.2.3", "tapable": "0.2.8", "uglify-js": "2.8.29", - "watchpack": "1.4.0", + "watchpack": "1.6.0", "webpack-sources": "1.1.0", "yargs": "6.6.0" }, "dependencies": { "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "webpack-addons": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", + "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", + "dev": true, + "requires": { + "jscodeshift": "0.4.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "ast-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", + "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "jscodeshift": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", + "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", + "dev": true, + "requires": { + "async": "1.5.2", + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-1": "6.24.1", + "babel-register": "6.26.0", + "babylon": "6.18.0", + "colors": "1.2.4", + "flow-parser": "0.71.0", + "lodash": "4.17.10", + "micromatch": "2.3.11", + "node-dir": "0.1.8", + "nomnom": "1.8.1", + "recast": "0.12.9", + "temp": "0.8.3", + "write-file-atomic": "1.3.4" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "recast": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", + "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", + "dev": true, + "requires": { + "ast-types": "0.10.1", + "core-js": "2.5.6", + "esprima": "4.0.0", + "private": "0.1.8", + "source-map": "0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.3.tgz", + "integrity": "sha512-5AsKoL/Ccn8iTrwk3uErdyhetGH+c7VRQ7Itim2GL0IhBRq5rtojVDk00buMRmFmBpw1RvHXq97Gup965LbozA==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "diff": "3.5.0", + "enhanced-resolve": "4.0.0", + "envinfo": "4.4.2", + "glob-all": "3.1.0", + "global-modules": "1.0.0", + "got": "8.3.1", + "import-local": "1.0.0", + "inquirer": "5.2.0", + "interpret": "1.1.0", + "jscodeshift": "0.5.0", + "listr": "0.13.0", + "loader-utils": "1.1.0", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mkdirp": "0.5.1", + "p-each-series": "1.0.0", + "p-lazy": "1.0.0", + "prettier": "1.12.1", + "supports-color": "5.4.0", + "v8-compile-cache": "1.1.2", + "webpack-addons": "1.1.5", + "yargs": "11.1.0", + "yeoman-environment": "2.0.6", + "yeoman-generator": "2.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "tapable": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "3.0.0" + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" } } } @@ -4836,6 +7787,17 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, "xhr2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", @@ -4920,6 +7882,306 @@ "dev": true } } + }, + "yeoman-environment": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz", + "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "globby": "6.1.0", + "grouped-queue": "0.3.3", + "inquirer": "3.3.0", + "is-scoped": "1.0.0", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mem-fs": "1.1.3", + "text-table": "0.2.0", + "untildify": "3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "yeoman-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", + "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", + "dev": true, + "requires": { + "async": "2.6.0", + "chalk": "2.4.1", + "cli-table": "0.3.1", + "cross-spawn": "6.0.5", + "dargs": "5.1.0", + "dateformat": "3.0.3", + "debug": "3.1.0", + "detect-conflict": "1.0.1", + "error": "7.0.2", + "find-up": "2.1.0", + "github-username": "4.1.0", + "istextorbinary": "2.2.1", + "lodash": "4.17.10", + "make-dir": "1.2.0", + "mem-fs-editor": "4.0.2", + "minimist": "1.2.0", + "pretty-bytes": "4.0.2", + "read-chunk": "2.1.0", + "read-pkg-up": "3.0.0", + "rimraf": "2.6.2", + "run-async": "2.3.0", + "shelljs": "0.8.2", + "text-table": "0.2.0", + "through2": "2.0.3", + "yeoman-environment": "2.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } } } } From 325a3e559584ee0b857dccc2cb5db1fb3898c7d7 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 3 May 2018 20:34:47 +0530 Subject: [PATCH 0023/1361] contract: removed unlock height variable --- contracts/Gate.sol | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 4c347b12..641d70b2 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -109,7 +109,7 @@ contract Gate is ProtocolVersioned { unlockHeight: 0 }); - StakeRequested(msg.sender, _amount, _beneficiary, unlockHeight); + StakeRequested(msg.sender, _amount, _beneficiary, 0); return unlockHeight; } @@ -139,7 +139,7 @@ contract Gate is ProtocolVersioned { returns (bool) { // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender)); + require(workers.isWorker(msg.sender)); //TODO: revist this // check if the stake request was done. StakeRequest storage stakeRequest = stakeRequests[_staker]; @@ -147,6 +147,9 @@ contract Gate is ProtocolVersioned { // check if the state request exists require(address(stakeRequest.beneficiary) != address(0)); + // check if the stake request was not accepted + require(stakeRequest.unlockHeight == 0); + // transfer the amount back require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); From 7ad23384a59391cc9e31b4bcfcd2e6c367d54fd2 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 3 May 2018 21:17:09 +0530 Subject: [PATCH 0024/1361] Truffle: updated truffle version --- contracts/Gate.sol | 6 +++--- package.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 641d70b2..8d3eae0a 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.23; +pragma solidity 0.4.23; // Copyright 2018 OpenST Ltd. // @@ -111,7 +111,7 @@ contract Gate is ProtocolVersioned { StakeRequested(msg.sender, _amount, _beneficiary, 0); - return unlockHeight; + return true; } function revertStakeRequest() @@ -149,7 +149,7 @@ contract Gate is ProtocolVersioned { // check if the stake request was not accepted require(stakeRequest.unlockHeight == 0); - + // transfer the amount back require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); diff --git a/package.json b/package.json index f0f6dfb3..0fe10096 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,10 @@ "web3": "^0.20.2" }, "devDependencies": { - "truffle": "^4.0.1", - "ganache-cli": "^6.0.3", + "truffle": "^4.1.7", "abi-decoder": "^1.0.9", - "ethereumjs-testrpc": "^6.0.3" + "ethereumjs-testrpc": "^6.0.3", + "ganache-cli": "^6.0.3" }, "author": "OpenST Foundation Ltd.", "license": "Apache v2.0" From da6b96f9b001f748598a5945453d92f41fb1516c Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 13:27:52 +0530 Subject: [PATCH 0025/1361] contract: Resolved compile issue for Gate.sol --- contracts/Gate.sol | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 8d3eae0a..d603f2fc 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -1,4 +1,4 @@ -pragma solidity 0.4.23; +pragma solidity ^0.4.23; // Copyright 2018 OpenST Ltd. // @@ -60,7 +60,7 @@ contract Gate is ProtocolVersioned { bytes32 uuid; // OpenSTValue contract - address openSTValue; + OpenSTValue openSTValue; /* * Public functions @@ -83,7 +83,7 @@ contract Gate is ProtocolVersioned { workers = _workers; bounty = _bounty; uuid = _uuid; - openSTValue = _openSTValue; + openSTValue = OpenSTValue(_openSTValue); } function requestStake( @@ -99,8 +99,8 @@ contract Gate is ProtocolVersioned { require(_beneficiary != address(0)); require(address(stakeRequests[msg.sender].beneficiary) == address(0)); // check if the state request does not exists - require(EIP20Interface(openSTValue.valueToken).allowance(msg.sender, address(this)) >= _amount); - require(EIP20Interface(openSTValue.valueToken).transferFrom(msg.sender, address(this), _amount)); + require(openSTValue.valueToken().allowance(msg.sender, address(this)) >= _amount); + require(openSTValue.valueToken().transferFrom(msg.sender, address(this), _amount)); stakeRequests[msg.sender] = StakeRequest({ amount: _amount, @@ -109,12 +109,13 @@ contract Gate is ProtocolVersioned { unlockHeight: 0 }); - StakeRequested(msg.sender, _amount, _beneficiary, 0); + StakeRequested(msg.sender, _amount, _beneficiary); return true; } function revertStakeRequest() + external returns (bool) { StakeRequest storage stakeRequest = stakeRequests[msg.sender]; @@ -125,7 +126,7 @@ contract Gate is ProtocolVersioned { // check if the stake request was not accepted require(stakeRequest.unlockHeight == 0); - require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); + require(openSTValue.valueToken().transfer(msg.sender, stakeRequest.amount)); delete stakeRequests[msg.sender]; @@ -136,10 +137,11 @@ contract Gate is ProtocolVersioned { function rejectRequest(address _staker) + external returns (bool) { // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender)); //TODO: revist this + //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check // check if the stake request was done. StakeRequest storage stakeRequest = stakeRequests[_staker]; @@ -151,7 +153,7 @@ contract Gate is ProtocolVersioned { require(stakeRequest.unlockHeight == 0); // transfer the amount back - require(EIP20Interface(openSTValue.valueToken).transfer(msg.sender, stakeRequest.amount)); + require(openSTValue.valueToken().transfer(msg.sender, stakeRequest.amount)); // delete the state request from the mapping storage delete stakeRequests[msg.sender]; From c6df7cb22ea77aa12983d1f6261ad14f29320596 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 13:31:10 +0530 Subject: [PATCH 0026/1361] Travis: added gate/develop branch to run travis tests --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 8fc288c4..196b8578 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ branches: only: - master - develop + - gate/develop notifications: email: recipients: From 617868255e2380ffe263c0c24df46a87226965d0 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 14:44:59 +0530 Subject: [PATCH 0027/1361] contract: resolved lint warnings and errors. MOSA-20. MOSA-23. MOSA-24 --- contracts/Gate.sol | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index d603f2fc..e6abd39c 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -1,3 +1,4 @@ +/* solhint-disable-next-line compiler-fixed */ pragma solidity ^0.4.23; // Copyright 2018 OpenST Ltd. @@ -25,6 +26,7 @@ import "./ProtocolVersioned.sol"; import "./OpenSTValue.sol"; import "./EIP20Interface.sol"; + contract Gate is ProtocolVersioned { /* @@ -34,7 +36,6 @@ contract Gate is ProtocolVersioned { event StakeRequestReverted(address _staker, uint256 _amount); event StakeRequestRejected(address _staker, uint256 _amount); - /* * Structures */ @@ -54,13 +55,13 @@ contract Gate is ProtocolVersioned { mapping(address /*staker */ => StakeRequest) public stakeRequests; // bounty amount - uint256 bounty; + uint256 private bounty; // utility token UUID - bytes32 uuid; + bytes32 private uuid; // OpenSTValue contract - OpenSTValue openSTValue; + OpenSTValue private openSTValue; /* * Public functions @@ -77,7 +78,7 @@ contract Gate is ProtocolVersioned { require(_openSTValue != address(0)); require(_uuid.length != 0); - // Should bounty with 0 amount be allowed ? commenting right now + // Should bounty with 0 amount be allowed ? //require(_bounty > 0); workers = _workers; @@ -90,14 +91,14 @@ contract Gate is ProtocolVersioned { uint256 _amount, address _beneficiary) external - returns ( - bool - ) + returns ( bool /* success */) { require(_amount > 0); require(_beneficiary != address(0)); - require(address(stakeRequests[msg.sender].beneficiary) == address(0)); // check if the state request does not exists + + // check if the state request does not exists + require(address(stakeRequests[msg.sender].beneficiary) == address(0)); require(openSTValue.valueToken().allowance(msg.sender, address(this)) >= _amount); require(openSTValue.valueToken().transferFrom(msg.sender, address(this), _amount)); @@ -107,7 +108,7 @@ contract Gate is ProtocolVersioned { beneficiary: _beneficiary, hashLock: 0, unlockHeight: 0 - }); + }); StakeRequested(msg.sender, _amount, _beneficiary); @@ -116,7 +117,7 @@ contract Gate is ProtocolVersioned { function revertStakeRequest() external - returns (bool) + returns (bool /* success */) { StakeRequest storage stakeRequest = stakeRequests[msg.sender]; @@ -135,10 +136,9 @@ contract Gate is ProtocolVersioned { return true; } - function rejectRequest(address _staker) external - returns (bool) + returns (bool /* success */) { // check if the caller is whitelisted worker //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check From 7b37489aea5be1eff98c53f81e8e7d96cabd1dd4 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 15:35:25 +0530 Subject: [PATCH 0028/1361] Contract: renamed function from rejectRequest to rejectStakeRequest --- contracts/Gate.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index e6abd39c..4d73ac89 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -136,7 +136,7 @@ contract Gate is ProtocolVersioned { return true; } - function rejectRequest(address _staker) + function rejectStakeRequest(address _staker) external returns (bool /* success */) { @@ -162,4 +162,5 @@ contract Gate is ProtocolVersioned { return true; } + } \ No newline at end of file From ad221f89ce9c29c2d16bd1360e5c0f9333c51a39 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 4 May 2018 17:11:44 +0530 Subject: [PATCH 0029/1361] contract: removed compilation warnings related to contructor and emit event. MOSA-20. MOSA-23. MOSA-24. MOSA-45 --- contracts/Gate.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 4d73ac89..bca7a12b 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -66,7 +66,7 @@ contract Gate is ProtocolVersioned { /* * Public functions */ - function Gate( + constructor( address _workers, uint256 _bounty, bytes32 _uuid, @@ -110,7 +110,7 @@ contract Gate is ProtocolVersioned { unlockHeight: 0 }); - StakeRequested(msg.sender, _amount, _beneficiary); + emit StakeRequested(msg.sender, _amount, _beneficiary); return true; } @@ -131,7 +131,7 @@ contract Gate is ProtocolVersioned { delete stakeRequests[msg.sender]; - StakeRequestReverted(msg.sender, stakeRequest.amount); + emit StakeRequestReverted(msg.sender, stakeRequest.amount); return true; } @@ -158,7 +158,7 @@ contract Gate is ProtocolVersioned { // delete the state request from the mapping storage delete stakeRequests[msg.sender]; - StakeRequestRejected(_staker, stakeRequest.amount); + emit StakeRequestRejected(_staker, stakeRequest.amount); return true; } From 19f1bfe664ce43a68f0e2829cee26668985d849a Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 7 May 2018 14:16:24 +0530 Subject: [PATCH 0030/1361] contract: Code review changes --- contracts/Gate.sol | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index bca7a12b..6078b8bd 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -97,8 +97,8 @@ contract Gate is ProtocolVersioned { require(_amount > 0); require(_beneficiary != address(0)); - // check if the state request does not exists - require(address(stakeRequests[msg.sender].beneficiary) == address(0)); + // check if the stake request does not exists + require(stakeRequests[msg.sender].beneficiary == address(0)); require(openSTValue.valueToken().allowance(msg.sender, address(this)) >= _amount); require(openSTValue.valueToken().transferFrom(msg.sender, address(this), _amount)); @@ -121,8 +121,8 @@ contract Gate is ProtocolVersioned { { StakeRequest storage stakeRequest = stakeRequests[msg.sender]; - // check if the state request exists for the msg.sender - require(address(stakeRequest.beneficiary) != address(0)); + // check if the stake request exists for the msg.sender + require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted require(stakeRequest.unlockHeight == 0); @@ -143,19 +143,18 @@ contract Gate is ProtocolVersioned { // check if the caller is whitelisted worker //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check - // check if the stake request was done. StakeRequest storage stakeRequest = stakeRequests[_staker]; - // check if the state request exists - require(address(stakeRequest.beneficiary) != address(0)); + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted require(stakeRequest.unlockHeight == 0); // transfer the amount back - require(openSTValue.valueToken().transfer(msg.sender, stakeRequest.amount)); + require(openSTValue.valueToken().transfer(_staker, stakeRequest.amount)); - // delete the state request from the mapping storage + // delete the stake request from the mapping storage delete stakeRequests[msg.sender]; emit StakeRequestRejected(_staker, stakeRequest.amount); From 2be27a943381120258fc107ffc9dd22fe8018ca5 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 8 May 2018 13:01:31 +0530 Subject: [PATCH 0031/1361] Contract: Code review changes --- contracts/Gate.sol | 34 +++++++++++++++--------------- contracts/OpenSTValueInterface.sol | 6 +++++- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 6078b8bd..8f6e16b2 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -23,11 +23,11 @@ pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- import "./ProtocolVersioned.sol"; -import "./OpenSTValue.sol"; +import "./OpenSTValueInterface.sol"; import "./EIP20Interface.sol"; +import "./Owned.sol"; - -contract Gate is ProtocolVersioned { +contract Gate is ProtocolVersioned, Owned { /* * Events @@ -60,8 +60,6 @@ contract Gate is ProtocolVersioned { // utility token UUID bytes32 private uuid; - // OpenSTValue contract - OpenSTValue private openSTValue; /* * Public functions @@ -72,19 +70,17 @@ contract Gate is ProtocolVersioned { bytes32 _uuid, address _openSTValue) public + Owned() ProtocolVersioned(_openSTValue) { require(_workers != address(0)); require(_openSTValue != address(0)); require(_uuid.length != 0); - // Should bounty with 0 amount be allowed ? - //require(_bounty > 0); - workers = _workers; bounty = _bounty; uuid = _uuid; - openSTValue = OpenSTValue(_openSTValue); + } function requestStake( @@ -100,8 +96,7 @@ contract Gate is ProtocolVersioned { // check if the stake request does not exists require(stakeRequests[msg.sender].beneficiary == address(0)); - require(openSTValue.valueToken().allowance(msg.sender, address(this)) >= _amount); - require(openSTValue.valueToken().transferFrom(msg.sender, address(this), _amount)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), _amount)); stakeRequests[msg.sender] = StakeRequest({ amount: _amount, @@ -115,23 +110,27 @@ contract Gate is ProtocolVersioned { return true; } + + /// @dev In order to revert stake request the msg.sender should be the staker function revertStakeRequest() external returns (bool /* success */) { + // only staker can do revertStakeRequest, msg.sender == staker StakeRequest storage stakeRequest = stakeRequests[msg.sender]; // check if the stake request exists for the msg.sender require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted - require(stakeRequest.unlockHeight == 0); + require(stakeRequest.hashLock == 0); - require(openSTValue.valueToken().transfer(msg.sender, stakeRequest.amount)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, stakeRequest.amount)); + uint256 stakeRequestAmount = stakeRequest.amount; delete stakeRequests[msg.sender]; - emit StakeRequestReverted(msg.sender, stakeRequest.amount); + emit StakeRequestReverted(msg.sender, stakeRequestAmount); return true; } @@ -149,15 +148,16 @@ contract Gate is ProtocolVersioned { require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted - require(stakeRequest.unlockHeight == 0); + require(stakeRequest.hashLock == 0); // transfer the amount back - require(openSTValue.valueToken().transfer(_staker, stakeRequest.amount)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(_staker, stakeRequest.amount)); + uint256 stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[msg.sender]; - emit StakeRequestRejected(_staker, stakeRequest.amount); + emit StakeRequestRejected(_staker, stakeRequestAmount); return true; } diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index 7b5f3941..1cc48ed2 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -23,6 +23,7 @@ pragma solidity ^0.4.17; // ---------------------------------------------------------------------------- import "./CoreInterface.sol"; +import "./EIP20Interface.sol"; contract OpenSTValueInterface { @@ -85,4 +86,7 @@ contract OpenSTValueInterface { uint256, /* amountST */ uint256, /* amountUT */ uint256 /* expirationHeight */); -} + + function valueToken() + returns (EIP20Interface /* value token address*/); +} \ No newline at end of file From aeb404236d140b63a1efed5ccae415fb2b47d1e3 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 8 May 2018 16:43:17 +0530 Subject: [PATCH 0032/1361] contract: typecasted to bytes32(0) and uint256(0) while checking for 0 --- contracts/Gate.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 8f6e16b2..08017c73 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -75,7 +75,7 @@ contract Gate is ProtocolVersioned, Owned { { require(_workers != address(0)); require(_openSTValue != address(0)); - require(_uuid.length != 0); + require(_uuid.length != bytes32(0)); workers = _workers; bounty = _bounty; @@ -90,7 +90,7 @@ contract Gate is ProtocolVersioned, Owned { returns ( bool /* success */) { - require(_amount > 0); + require(_amount > uint256(0)); require(_beneficiary != address(0)); // check if the stake request does not exists @@ -123,7 +123,7 @@ contract Gate is ProtocolVersioned, Owned { require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted - require(stakeRequest.hashLock == 0); + require(stakeRequest.hashLock == bytes32(0)); require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, stakeRequest.amount)); @@ -148,7 +148,7 @@ contract Gate is ProtocolVersioned, Owned { require(stakeRequest.beneficiary != address(0)); // check if the stake request was not accepted - require(stakeRequest.hashLock == 0); + require(stakeRequest.hashLock == bytes32(0)); // transfer the amount back require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(_staker, stakeRequest.amount)); From 51a4e7102d70e0ba8911ecc689351b8ed22e918f Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 8 May 2018 17:15:38 +0530 Subject: [PATCH 0033/1361] contract: fixed compilation issue --- contracts/Gate.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 08017c73..9022e4e9 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -75,7 +75,7 @@ contract Gate is ProtocolVersioned, Owned { { require(_workers != address(0)); require(_openSTValue != address(0)); - require(_uuid.length != bytes32(0)); + require(_uuid.length != uint8(0)); workers = _workers; bounty = _bounty; From 48a4712bdec7f1009f101b347ec9ea8665b6c02f Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 9 May 2018 12:27:14 +0530 Subject: [PATCH 0034/1361] contract: initial code for acceptStakeRequest. MOSA-21 --- contracts/Gate.sol | 117 +++++++++++++++++++++++------ contracts/GateInterface.sol | 71 +++++++++++++++++ contracts/OpenSTValue.sol | 19 +++-- contracts/OpenSTValueInterface.sol | 14 ++++ 4 files changed, 188 insertions(+), 33 deletions(-) create mode 100644 contracts/GateInterface.sol diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 9022e4e9..d88ae7a1 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -26,15 +26,9 @@ import "./ProtocolVersioned.sol"; import "./OpenSTValueInterface.sol"; import "./EIP20Interface.sol"; import "./Owned.sol"; +import "./GateInterface.sol"; -contract Gate is ProtocolVersioned, Owned { - - /* - * Events - */ - event StakeRequested(address _staker, uint256 _amount, address _beneficiary); - event StakeRequestReverted(address _staker, uint256 _amount); - event StakeRequestRejected(address _staker, uint256 _amount); +contract Gate is GateInterface, ProtocolVersioned, Owned { /* * Structures @@ -49,16 +43,16 @@ contract Gate is ProtocolVersioned, Owned { /* * Storage */ - address public workers; //TODO: update type once workers contract and interfaces are added to the repo. + address private gateWorkers; //TODO: update type once workers contract and interfaces are added to the repo. // stake requests - mapping(address /*staker */ => StakeRequest) public stakeRequests; + mapping(address /*staker */ => StakeRequest) private gateStakeRequests; // bounty amount - uint256 private bounty; + uint256 private gateBounty; // utility token UUID - bytes32 private uuid; + bytes32 private gateUuid; /* @@ -68,18 +62,17 @@ contract Gate is ProtocolVersioned, Owned { address _workers, uint256 _bounty, bytes32 _uuid, - address _openSTValue) + address _openSTProtocol) public Owned() - ProtocolVersioned(_openSTValue) + ProtocolVersioned(_openSTProtocol) { require(_workers != address(0)); - require(_openSTValue != address(0)); require(_uuid.length != uint8(0)); - workers = _workers; - bounty = _bounty; - uuid = _uuid; + gateWorkers = _workers; + gateBounty = _bounty; + gateUuid = _uuid; } @@ -94,11 +87,11 @@ contract Gate is ProtocolVersioned, Owned { require(_beneficiary != address(0)); // check if the stake request does not exists - require(stakeRequests[msg.sender].beneficiary == address(0)); + require(gateStakeRequests[msg.sender].beneficiary == address(0)); require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), _amount)); - stakeRequests[msg.sender] = StakeRequest({ + gateStakeRequests[msg.sender] = StakeRequest({ amount: _amount, beneficiary: _beneficiary, hashLock: 0, @@ -117,7 +110,7 @@ contract Gate is ProtocolVersioned, Owned { returns (bool /* success */) { // only staker can do revertStakeRequest, msg.sender == staker - StakeRequest storage stakeRequest = stakeRequests[msg.sender]; + StakeRequest storage stakeRequest = gateStakeRequests[msg.sender]; // check if the stake request exists for the msg.sender require(stakeRequest.beneficiary != address(0)); @@ -128,7 +121,7 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, stakeRequest.amount)); uint256 stakeRequestAmount = stakeRequest.amount; - delete stakeRequests[msg.sender]; + delete gateStakeRequests[msg.sender]; emit StakeRequestReverted(msg.sender, stakeRequestAmount); @@ -140,9 +133,9 @@ contract Gate is ProtocolVersioned, Owned { returns (bool /* success */) { // check if the caller is whitelisted worker - //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check + //require(gateWorkers.isWorker(msg.sender)); //TODO: revist this to add worker check - StakeRequest storage stakeRequest = stakeRequests[_staker]; + StakeRequest storage stakeRequest = gateStakeRequests[_staker]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -155,11 +148,85 @@ contract Gate is ProtocolVersioned, Owned { uint256 stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage - delete stakeRequests[msg.sender]; + delete gateStakeRequests[msg.sender]; emit StakeRequestRejected(_staker, stakeRequestAmount); return true; } + /// @dev In order to accept stake the staker needs to approve gate contract for bounty amount. + /// This can be called only by whitelisted worker address + function acceptStakeRequest(address _staker, bytes32 _hashLock) + external + returns (bool /* success */) + { + // check if the caller is whitelisted worker + //require(gateWorkers.isWorker(msg.sender)); //TODO: revist this to add worker check + + StakeRequest storage stakeRequest = gateStakeRequests[_staker]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was not accepted + require(stakeRequest.hashLock == bytes32(0)); + + // check if _hashLock is not 0 + require(_hashLock != bytes32(0)); + + // Transfer bounty amount form worker to gate contract + require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), gateBounty)); + + // Approve OpenSTValue contract for stake amount + require(OpenSTValueInterface(openSTProtocol).valueToken().approve(openSTProtocol, stakeRequest.amount)); + + + uint256 amountUT = 0; + uint256 nonce = 0; + uint256 unlockHeight = 0; + bytes32 stakingIntentHash = bytes32(0); + + (amountUT, nonce, unlockHeight, stakingIntentHash) = OpenSTValueInterface(openSTProtocol).stake( + gateUuid, + stakeRequest.amount, + stakeRequest.beneficiary, + _hashLock, + _staker); + + stakeRequest.unlockHeight = unlockHeight; + stakeRequest.hashLock = _hashLock; + + //gateStakeRequests[_staker].unlockHeight = unlockHeight; + //gateStakeRequests[_staker].hashLock = _hashLock; + + return true; + } + function workers() + external + returns (address) + { + return gateWorkers; + } + + function bounty() + external + returns (uint256) + { + return gateBounty; + } + + function uuid() + external + returns (bytes32) + { + return gateUuid; + } + + function getOpenSTProtocol() + external + returns (address) + { + return openSTProtocol; + } } \ No newline at end of file diff --git a/contracts/GateInterface.sol b/contracts/GateInterface.sol new file mode 100644 index 00000000..7baaa705 --- /dev/null +++ b/contracts/GateInterface.sol @@ -0,0 +1,71 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: Gate +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +contract GateInterface { + + /* + * Events + */ + event StakeRequested(address _staker, uint256 _amount, address _beneficiary); + event StakeRequestReverted(address _staker, uint256 _amount); + event StakeRequestRejected(address _staker, uint256 _amount); + + function workers() + external + returns (address); + + function bounty() + external + returns (uint256); + + function uuid() + external + returns (bytes32); + + function getOpenSTProtocol() + external + returns (address); + + function requestStake( + uint256 _amount, + address _beneficiary) + external + returns ( bool /* success */); + + + /// @dev In order to revert stake request the msg.sender should be the staker + function revertStakeRequest() + external + returns (bool /* success */); + + function rejectStakeRequest(address _staker) + external + returns (bool /* success */); + + /// @dev In order to accept stake the staker needs to approve gate contract for bounty amount. + /// This can be called only by whitelisted worker address + function acceptStakeRequest(address _staker, bytes32 _hashLock) + external + returns (bool /* success */); +} \ No newline at end of file diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 135062ab..0128f073 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -32,6 +32,7 @@ import "./ProtocolVersioned.sol"; // value chain contracts import "./SimpleStake.sol"; +import "./GateInterface.sol"; /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is OpsManaged, Hasher { @@ -166,7 +167,8 @@ contract OpenSTValue is OpsManaged, Hasher { bytes32 _uuid, uint256 _amountST, address _beneficiary, - bytes32 _hashLock) + bytes32 _hashLock, + address _staker) external returns ( uint256 amountUT, @@ -179,20 +181,21 @@ contract OpenSTValue is OpsManaged, Hasher { // check the staking contract has been approved to spend the amount to stake // OpenSTValue needs to be able to transfer the stake into its balance for // keeping until the two-phase process is completed on both chains. - require(_amountST > 0); + require(_amountST > uint256(0)); require(utilityTokens[_uuid].simpleStake != address(0)); require(_beneficiary != address(0)); + require(_staker != address(0)); - UtilityToken storage utilityToken = utilityTokens[_uuid]; + // check if the msg.sender is Gate contract + GateInterface(msg.sender).getOpenSTProtocol() == address(this); - // TODO: introduce parameter _staker - address _staker = tx.origin; + UtilityToken storage utilityToken = utilityTokens[_uuid]; // if the staking account is set to a non-zero address, // then all transactions have come (from/over) the staking account - if (utilityToken.stakingAccount != address(0)) require(msg.sender == utilityToken.stakingAccount); - require(valueToken.transferFrom(_staker, address(this), _amountST)); + if (utilityToken.stakingAccount != address(0)) require(_staker == utilityToken.stakingAccount); + require(valueToken.transferFrom(msg.sender, address(this), _amountST)); amountUT = (_amountST.mul(utilityToken.conversionRate)) .div(10**uint256(utilityToken.conversionRateDecimals)); @@ -223,7 +226,7 @@ contract OpenSTValue is OpsManaged, Hasher { hashLock: _hashLock }); - StakingIntentDeclared(_uuid, tx.origin, nonce, _beneficiary, + StakingIntentDeclared(_uuid, _staker, nonce, _beneficiary, _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); return (amountUT, nonce, unlockHeight, stakingIntentHash); diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index 1cc48ed2..b527ace4 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -88,5 +88,19 @@ contract OpenSTValueInterface { uint256 /* expirationHeight */); function valueToken() + public returns (EIP20Interface /* value token address*/); + + function stake( + bytes32 _uuid, + uint256 _amountST, + address _beneficiary, + bytes32 _hashLock, + address _staker) + external + returns ( + uint256 amountUT, + uint256 nonce, + uint256 unlockHeight, + bytes32 stakingIntentHash); } \ No newline at end of file From 0c6243228c89bf36d9797a488dbcc41d4c0a38cb Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 9 May 2018 15:12:59 +0530 Subject: [PATCH 0035/1361] contract: initial code for processStaking and revertStaking. MOSA-21 --- contracts/Gate.sol | 77 +++++++++++++++++++++++++++++- contracts/GateInterface.sol | 12 +++++ contracts/OpenSTValue.sol | 11 ++++- contracts/OpenSTValueInterface.sol | 17 +++++-- 4 files changed, 111 insertions(+), 6 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index d88ae7a1..09cd25a3 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -202,7 +202,82 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { return true; } - function workers() + + + function processStaking( + bytes32 _stakingIntentHash, + bytes32 _unlockSecret, + address _staker) + external + returns (bool /* success */) + { + // check if the caller is whitelisted worker + //require(gateWorkers.isWorker(msg.sender)); //TODO: revist this to add worker check + + require(_stakingIntentHash != bytes32(0)); + require(_staker != address(0)); + + StakeRequest storage stakeRequest = gateStakeRequests[_staker]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was accepted + require(stakeRequest.hashLock != bytes32(0)); + + // validate the unlockSecret. + require(stakeRequest.hashLock == keccak256(_unlockSecret)); + + OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); + + // Transfer bounty amount to the msg.sender account + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, gateBounty)); + + // delete the stake request from the mapping storage + delete gateStakeRequests[msg.sender]; + + return true; + } + + /// @dev In order to revertStaking the msg.sender should be the staker + function revertStaking(bytes32 _stakingIntentHash) + external + returns (bool /* success */) + { + + // check if the caller is whitelisted worker + //require(gateWorkers.isWorker(msg.sender)); //TODO: revist this to add worker check + + require(_stakingIntentHash != bytes32(0)); + + StakeRequest storage stakeRequest = gateStakeRequests[msg.sender]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was accepted + require(stakeRequest.hashLock != bytes32(0)); + + // require that the stake is unlocked and exists + require(stakeRequest.unlockHeight > 0); + require(stakeRequest.unlockHeight <= block.number); + + bytes32 uuid = bytes32(0); + uint256 amountST = uint256(0); + address stakerAddress = address(0); + (uuid, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash, msg.sender); + + require(stakerAddress == msg.sender); + // Transfer bounty amount to the msg.sender account + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, gateBounty)); + + // delete the stake request from the mapping storage + delete gateStakeRequests[msg.sender]; + + return true; + } + + function workers() external returns (address) { diff --git a/contracts/GateInterface.sol b/contracts/GateInterface.sol index 7baaa705..01e7b769 100644 --- a/contracts/GateInterface.sol +++ b/contracts/GateInterface.sol @@ -68,4 +68,16 @@ contract GateInterface { function acceptStakeRequest(address _staker, bytes32 _hashLock) external returns (bool /* success */); + + function processStaking( + bytes32 _stakingIntentHash, + bytes32 _unlockSecret, + address _staker) + external + returns (bool /* success */); + + function revertStaking(bytes32 _stakingIntentHash) + external + returns (bool /* success */); + } \ No newline at end of file diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 0128f073..00609c22 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -239,6 +239,9 @@ contract OpenSTValue is OpsManaged, Hasher { external returns (address stakeAddress) { + // check if the msg.sender is Gate contract + GateInterface(msg.sender).getOpenSTProtocol() == address(this); + require(_stakingIntentHash != ""); Stake storage stake = stakes[_stakingIntentHash]; @@ -266,13 +269,17 @@ contract OpenSTValue is OpsManaged, Hasher { } function revertStaking( - bytes32 _stakingIntentHash) + bytes32 _stakingIntentHash, + address _staker) external returns ( bytes32 uuid, uint256 amountST, address staker) { + // check if the msg.sender is Gate contract + GateInterface(msg.sender).getOpenSTProtocol() == address(this); + require(_stakingIntentHash != ""); Stake storage stake = stakes[_stakingIntentHash]; @@ -281,6 +288,8 @@ contract OpenSTValue is OpsManaged, Hasher { require(stake.unlockHeight > 0); require(stake.unlockHeight <= block.number); + require(_staker == stake.staker); + assert(valueToken.balanceOf(address(this)) >= stake.amountST); // revert the amount that was intended to be staked back to staker require(valueToken.transfer(stake.staker, stake.amountST)); diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index b527ace4..7bd4b9c1 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -99,8 +99,17 @@ contract OpenSTValueInterface { address _staker) external returns ( - uint256 amountUT, - uint256 nonce, - uint256 unlockHeight, - bytes32 stakingIntentHash); + uint256, /* amountUT*/ + uint256, /* nonce*/ + uint256, /* unlockHeight*/ + bytes32 /* stakingIntentHash*/); + + function revertStaking( + bytes32 _stakingIntentHash, + address _staker) + external + returns ( + bytes32, /* uuid */ + uint256, /* amountST */ + address /* staker */); } \ No newline at end of file From 145cab33e9a1893a17dae113f0ebd5e54020189a Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Wed, 9 May 2018 17:50:14 +0530 Subject: [PATCH 0036/1361] [MOSA-48]Upgraded web3 version to v1.0.0.beta.33 --- package.json | 2 +- test/EIP20Token_utils.js | 56 ++-- test/SimpleToken.js | 565 ++++++++++++++++++++------------------- test/lib/utils.js | 100 ------- 4 files changed, 317 insertions(+), 406 deletions(-) diff --git a/package.json b/package.json index f0f6dfb3..cb1fd434 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "bignumber.js": "^4.1.0", "keccak": "^1.4.0", "moment": "^2.19.2", - "web3": "^0.20.2" + "web3": "^1.0.0-beta.33" }, "devDependencies": { "truffle": "^4.0.1", diff --git a/test/EIP20Token_utils.js b/test/EIP20Token_utils.js index 802f8acc..2d3caa3d 100644 --- a/test/EIP20Token_utils.js +++ b/test/EIP20Token_utils.js @@ -26,45 +26,55 @@ var EIP20Token = artifacts.require("./EIP20TokenMock.sol"); /// @dev Deploy module.exports.deployEIP20Token = async (artifacts, accounts) => { - const token = await EIP20Token.new("SYMBOL", "Name", 18, { from: accounts[0], gas: 3500000 }); + const token = await EIP20Token.new("SYMBOL", "Name", 18, {from: accounts[0], gas: 3500000}); - return { - token : token - } + return { + token: token + } } /// @dev Assert on Transfer event module.exports.checkTransferEventGroup = (result, _from, _to, _value) => { - Assert.equal(result.logs.length, 1); + Assert.equal(result.logs.length, 1); - const event = result.logs[0]; + const event = result.logs[0]; - module.exports.checkTransferEvent(event, _from, _to, _value); + module.exports.checkTransferEvent(event, _from, _to, _value); } module.exports.checkTransferEvent = (event, _from, _to, _value) => { - if (Number.isInteger(_value)) { - _value = new BigNumber(_value); - } - Assert.equal(event.event, "Transfer"); - Assert.equal(event.args._from, _from); - Assert.equal(event.args._to, _to); - Assert.equal(event.args._value.toNumber(), _value.toNumber()); + let eventBody = event.args; + assertTransferEvent(event.event, eventBody._from, eventBody._to, eventBody._value.toNumber(), _from, _to, _value) } +module.exports.checkTransferEventAbiDecoder = (event, _from, _to, _value) => { + let eventType = Object.keys(event)[0]; + let eventBody = event[eventType]; + assertTransferEvent(eventType, eventBody._from, eventBody._to, eventBody._value, _from, _to, _value) +} + +assertTransferEvent = (eventType, actualFrom, actualTo, actualValue, expectedFrom, expectedTo, expectedValue) => { + if (Number.isInteger(_value)) { + _value = new BigNumber(_value); + } + Assert.equal(eventType, "Transfer"); + Assert.equal(actualFrom, expectedFrom); + Assert.equal(actualTo, expectedTo); + Assert.equal(actualValue, expectedValue.toNumber()); +} module.exports.checkApprovalEventGroup = (result, _owner, _spender, _value) => { - assert.equal(result.logs.length, 1) + assert.equal(result.logs.length, 1) - const event = result.logs[0] + const event = result.logs[0] - if (Number.isInteger(_value)) { - _value = new BigNumber(_value) - } + if (Number.isInteger(_value)) { + _value = new BigNumber(_value) + } - assert.equal(event.event, "Approval") - assert.equal(event.args._owner, _owner) - assert.equal(event.args._spender, _spender) - assert.equal(event.args._value.toNumber(), _value.toNumber()) + assert.equal(event.event, "Approval") + assert.equal(event.args._owner, _owner) + assert.equal(event.args._spender, _spender) + assert.equal(event.args._value.toNumber(), _value.toNumber()) } diff --git a/test/SimpleToken.js b/test/SimpleToken.js index f2c1a140..158994ab 100644 --- a/test/SimpleToken.js +++ b/test/SimpleToken.js @@ -27,6 +27,7 @@ const BigNumber = require('bignumber.js'); const Utils = require('./lib/utils.js'); const SimpleTokenUtils = require('./SimpleToken_utils.js') const EIP20Token_utils = require('./EIP20Token_utils.js') +const web3EventsDecoder = require('./lib/event_decoder.js'); const SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") @@ -101,377 +102,377 @@ const SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") // contract('SimpleToken', (accounts) => { - - const SYMBOL = "ST" - const NAME = "Simple Token" - const DECIMALS = 18 - const TOTAL_SUPPLY = new BigNumber(web3.toWei(800000000, "ether")); - - const ST10000 = new BigNumber(web3.toWei(10000, "ether")); - const ST9000 = new BigNumber(web3.toWei(9000, "ether")); - const ST1000 = new BigNumber(web3.toWei(1000, "ether")); - const ST10 = new BigNumber(web3.toWei(10, "ether")); - const ST1 = new BigNumber(web3.toWei(1, "ether")); - - const owner = accounts[0] - const admin = accounts[1] - const ops = accounts[2] - - async function createToken() { - return await SimpleToken.new() - } - - - describe('Basic properties', async () => { - - var token = null - - before(async () => { - token = await createToken() - }) - - - it("name", async () => { - assert.equal(await token.name.call(), NAME) - }) - - it("symbol", async () => { - assert.equal(await token.symbol.call(), SYMBOL) - }) - - it("decimals", async () => { - assert.equal(await token.decimals.call(), DECIMALS) - }) - - it("totalSupply", async () => { - assert.equal((await token.totalSupply.call()).toNumber(), TOTAL_SUPPLY.toNumber()) - }) - it("balances is private", async () => { - assert.isTrue(typeof(token.balances) == 'undefined') - }) + const SYMBOL = "ST" + const NAME = "Simple Token" + const DECIMALS = 18 + const TOTAL_SUPPLY = new BigNumber(web3.toWei(800000000, "ether")); + + const ST10000 = new BigNumber(web3.toWei(10000, "ether")); + const ST9000 = new BigNumber(web3.toWei(9000, "ether")); + const ST1000 = new BigNumber(web3.toWei(1000, "ether")); + const ST10 = new BigNumber(web3.toWei(10, "ether")); + const ST1 = new BigNumber(web3.toWei(1, "ether")); + + const owner = accounts[0] + const admin = accounts[1] + const ops = accounts[2] + + async function createToken() { + return await SimpleToken.new() + } + + + describe('Basic properties', async () => { + + var token = null + + before(async () => { + token = await createToken() + }) + - it('Constructor raised transfer event', async () => { - const receipt = await web3.eth.getTransactionReceipt(token.transactionHash) - assert.equal(receipt.logs.length, 1) - const logs = Utils.decodeLogs(token.abi, [ receipt.logs[0] ]) - EIP20Token_utils.checkTransferEvent(logs[0], 0, accounts[0], TOTAL_SUPPLY) - }) - // it('Constructor raised transfer event', async () => { - // const receipt = await web3.eth.getTransactionReceipt(token.transactionHash) - // assert.equal(receipt.logs.length, 1) - // console.log("Simple Token -------- token.abi"); - // console.log(token.abi.length) - // console.log(JSON.stringify(token.abi[32], null, 4)); - // console.log("Simple Token -------- receipt.logs[0]"); - // console.log(receipt.logs[0]) - // console.log("Simple Token -------- receipt.logs[0].topics"); - // console.log(receipt.logs[0].topics) - // // @dev SimpleToken abi[32] is 'Transfer' event; - // // solve this better for moving to web3 v1.0.0 - // // var inputs = token.abi[32].inputs; - // // var data = receipt.logs[0].data; - // // var topics = receipt.logs[0].topics; - // // const logs = Web3.eth.abi.decodeLog(inputs, data, topics) - // // console.log(JSON.stringify(logs, null, 4)); - // // Utils.checkTransferEvent(logs, 0, accounts[0], TOTAL_SUPPLY) - // }) - }) + it("name", async () => { + assert.equal(await token.name.call(), NAME) + }) + + it("symbol", async () => { + assert.equal(await token.symbol.call(), SYMBOL) + }) + it("decimals", async () => { + assert.equal(await token.decimals.call(), DECIMALS) + }) - describe('transfer function after finalize', async () => { + it("totalSupply", async () => { + assert.equal((await token.totalSupply.call()).toNumber(), TOTAL_SUPPLY.toNumber()) + }) - var token = null + it("balances is private", async () => { + assert.isTrue(typeof(token.balances) == 'undefined') + }) - before(async () => { - token = await createToken() + it('Constructor raised transfer event', async () => { + const receipt = await web3.eth.getTransactionReceipt(token.transactionHash) + assert.equal(receipt.logs.length, 1) + const logs = web3EventsDecoder.perform(receipt, token.address, token.abi); + EIP20Token_utils.checkTransferEventAbiDecoder(logs, 0, accounts[0], TOTAL_SUPPLY) + }) + // it('Constructor raised transfer event', async () => { + // const receipt = await web3.eth.getTransactionReceipt(token.transactionHash) + // assert.equal(receipt.logs.length, 1) + // console.log("Simple Token -------- token.abi"); + // console.log(token.abi.length) + // console.log(JSON.stringify(token.abi[32], null, 4)); + // console.log("Simple Token -------- receipt.logs[0]"); + // console.log(receipt.logs[0]) + // console.log("Simple Token -------- receipt.logs[0].topics"); + // console.log(receipt.logs[0].topics) + // // @dev SimpleToken abi[32] is 'Transfer' event; + // // solve this better for moving to web3 v1.0.0 + // // var inputs = token.abi[32].inputs; + // // var data = receipt.logs[0].data; + // // var topics = receipt.logs[0].topics; + // // const logs = Web3.eth.abi.decodeLog(inputs, data, topics) + // // console.log(JSON.stringify(logs, null, 4)); + // // Utils.checkTransferEvent(logs, 0, accounts[0], TOTAL_SUPPLY) + // }) + }) - await token.setOpsAddress(ops) - await token.setAdminAddress(admin) - await token.finalize({ from: admin }) - }) + describe('transfer function after finalize', async () => { - it("transfer tokens from owner to other", async () => { - var res = await token.transfer(accounts[1], ST1000); - EIP20Token_utils.checkTransferEventGroup(await token.transfer(accounts[1], ST1000), accounts[0], accounts[1], ST1000) - }) + var token = null - it("transfer 0 tokens", async () => { - assert.equal(await token.transfer.call(accounts[2], 0, { from: accounts[1] }), true) - EIP20Token_utils.checkTransferEventGroup(await token.transfer(accounts[2], 0, { from: accounts[1] }), accounts[1], accounts[2], 0) - }) + before(async () => { + token = await createToken() - it("transfer > balance", async () => { - const balance = await token.balanceOf.call(accounts[1]) - await Utils.expectThrow(token.transfer.call(accounts[2], balance.add(ST1), { from: accounts[1] })) - }) + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) - it("transfer = balance", async () => { - const balance1Before = await token.balanceOf.call(accounts[1]) - const balance2Before = await token.balanceOf.call(accounts[2]) + await token.finalize({from: admin}) + }) - assert.equal(await token.transfer.call(accounts[2], balance1Before, { from: accounts[1] }), true) - await token.transfer(accounts[2], balance1Before, { from: accounts[1] }) + it("transfer tokens from owner to other", async () => { + var res = await token.transfer(accounts[1], ST1000); + EIP20Token_utils.checkTransferEventGroup(await token.transfer(accounts[1], ST1000), accounts[0], accounts[1], ST1000) + }) - const balance1After = await token.balanceOf.call(accounts[1]) - const balance2After = await token.balanceOf.call(accounts[2]) + it("transfer 0 tokens", async () => { + assert.equal(await token.transfer.call(accounts[2], 0, {from: accounts[1]}), true) + EIP20Token_utils.checkTransferEventGroup(await token.transfer(accounts[2], 0, {from: accounts[1]}), accounts[1], accounts[2], 0) + }) - assert.equal(balance1After.toNumber(), 0) - assert.equal(balance2After.sub(balance2Before).toNumber(), balance1Before.sub(balance1After).toNumber(), balance1Before.toNumber()) - }) + it("transfer > balance", async () => { + const balance = await token.balanceOf.call(accounts[1]) + await Utils.expectThrow(token.transfer.call(accounts[2], balance.add(ST1), {from: accounts[1]})) + }) - it("transfer 1 token", async () => { - const balance1Before = await token.balanceOf.call(accounts[1]) - const balance2Before = await token.balanceOf.call(accounts[2]) + it("transfer = balance", async () => { + const balance1Before = await token.balanceOf.call(accounts[1]) + const balance2Before = await token.balanceOf.call(accounts[2]) - assert.equal(await token.transfer.call(accounts[1], ST1, { from: accounts[2] }), true) - await token.transfer(accounts[1], ST1, { from: accounts[2] }) + assert.equal(await token.transfer.call(accounts[2], balance1Before, {from: accounts[1]}), true) + await token.transfer(accounts[2], balance1Before, {from: accounts[1]}) - const balance1After = await token.balanceOf.call(accounts[1]) - const balance2After = await token.balanceOf.call(accounts[2]) + const balance1After = await token.balanceOf.call(accounts[1]) + const balance2After = await token.balanceOf.call(accounts[2]) - assert.equal(balance1After.toNumber(), ST1.toNumber()) - assert.equal(balance2After.toNumber(), balance2Before.sub(ST1).toNumber()) - }) - }) + assert.equal(balance1After.toNumber(), 0) + assert.equal(balance2After.sub(balance2Before).toNumber(), balance1Before.sub(balance1After).toNumber(), balance1Before.toNumber()) + }) + it("transfer 1 token", async () => { + const balance1Before = await token.balanceOf.call(accounts[1]) + const balance2Before = await token.balanceOf.call(accounts[2]) - describe('transferFrom function before finalize', async () => { + assert.equal(await token.transfer.call(accounts[1], ST1, {from: accounts[2]}), true) + await token.transfer(accounts[1], ST1, {from: accounts[2]}) - var token = null + const balance1After = await token.balanceOf.call(accounts[1]) + const balance2After = await token.balanceOf.call(accounts[2]) - before(async () => { - token = await createToken() + assert.equal(balance1After.toNumber(), ST1.toNumber()) + assert.equal(balance2After.toNumber(), balance2Before.sub(ST1).toNumber()) + }) + }) - await token.setOpsAddress(ops) - await token.setAdminAddress(admin) - await token.transfer(accounts[4], ST10000) - }) + describe('transferFrom function before finalize', async () => { + var token = null - it("transfer 0 from account 1 -> 2 with 0 allowance", async () => { - assert.equal(await token.approve.call(accounts[2], 0, { from: accounts[4] }), true) - assert.equal(await token.allowance.call(accounts[4], accounts[2]), 0) - await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST10, { from: accounts[2] })) - }) + before(async () => { + token = await createToken() - it("transfer 1000 from account 1 -> 2 without allowance", async () => { - await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, { from: accounts[4] })) - await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, { from: accounts[2] })) - }) + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) - it("transfer 1000 from account 1 -> 2 with 10 allowance", async () => { - assert.equal(await token.approve.call(accounts[2], ST10, { from: accounts[4] }), true) - EIP20Token_utils.checkApprovalEventGroup(await token.approve(accounts[2], ST10, { from: accounts[4] }), accounts[4], accounts[2], ST10) + await token.transfer(accounts[4], ST10000) + }) - assert.equal((await token.allowance.call(accounts[4], accounts[2], { from: accounts[4] })).toNumber(), ST10.toNumber()) - await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, { from: accounts[4] })) - await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, { from: accounts[2] })) - }) + it("transfer 0 from account 1 -> 2 with 0 allowance", async () => { + assert.equal(await token.approve.call(accounts[2], 0, {from: accounts[4]}), true) + assert.equal(await token.allowance.call(accounts[4], accounts[2]), 0) + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST10, {from: accounts[2]})) + }) - it("transfer 1000 from account 1 -> 2 with 1000 allowance (as ops)", async () => { - // We first need to bring approval to 0 - assert.equal(await token.approve.call(ops, 0, { from: accounts[4] }), true) - EIP20Token_utils.checkApprovalEventGroup(await token.approve(ops, 0, { from: accounts[4] }), accounts[4], ops, 0) + it("transfer 1000 from account 1 -> 2 without allowance", async () => { + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, {from: accounts[4]})) + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, {from: accounts[2]})) + }) - assert.equal(await token.allowance.call(accounts[4], ops, { from: accounts[4] }), 0) + it("transfer 1000 from account 1 -> 2 with 10 allowance", async () => { + assert.equal(await token.approve.call(accounts[2], ST10, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(accounts[2], ST10, {from: accounts[4]}), accounts[4], accounts[2], ST10) - assert.equal(await token.approve.call(ops, ST1000, { from: accounts[4] }), true) - EIP20Token_utils.checkApprovalEventGroup(await token.approve(ops, ST1000, { from: accounts[4] }), accounts[4], ops, ST1000) + assert.equal((await token.allowance.call(accounts[4], accounts[2], {from: accounts[4]})).toNumber(), ST10.toNumber()) - assert.equal(await token.allowance.call(accounts[4], ops), ST1000.toNumber(), { from: accounts[4] }) + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, {from: accounts[4]})) + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, {from: accounts[2]})) + }) - await Utils.expectThrow(token.transferFrom.call(accounts[4], ops, ST1000, { from: accounts[4] })) - assert.equal(await token.transferFrom.call(accounts[4], ops, ST1000, { from: ops }), true) - await token.transferFrom(accounts[4], ops, ST1000, { from: ops }) - - assert.equal((await token.balanceOf.call(accounts[4])).toNumber(), ST9000.toNumber()) - assert.equal((await token.balanceOf.call(ops)).toNumber(), ST1000.toNumber()) - }) + it("transfer 1000 from account 1 -> 2 with 1000 allowance (as ops)", async () => { + // We first need to bring approval to 0 + assert.equal(await token.approve.call(ops, 0, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(ops, 0, {from: accounts[4]}), accounts[4], ops, 0) - it("transfer 1000 from account 1 -> 2 with 1000 allowance (as admin)", async () => { - // We first need to bring approval to 0 - assert.equal(await token.approve.call(admin, 0, { from: accounts[4] }), true) - EIP20Token_utils.checkApprovalEventGroup(await token.approve(admin, 0, { from: accounts[4] }), accounts[4], admin, 0) + assert.equal(await token.allowance.call(accounts[4], ops, {from: accounts[4]}), 0) - assert.equal(await token.allowance.call(accounts[4], admin, { from: accounts[4] }), 0) + assert.equal(await token.approve.call(ops, ST1000, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(ops, ST1000, {from: accounts[4]}), accounts[4], ops, ST1000) - assert.equal(await token.approve.call(admin, ST1000, { from: accounts[4] }), true) - EIP20Token_utils.checkApprovalEventGroup(await token.approve(admin, ST1000, { from: accounts[4] }), accounts[4], admin, ST1000) + assert.equal(await token.allowance.call(accounts[4], ops), ST1000.toNumber(), {from: accounts[4]}) - assert.equal(await token.allowance.call(accounts[4], admin), ST1000.toNumber(), { from: accounts[4] }) + await Utils.expectThrow(token.transferFrom.call(accounts[4], ops, ST1000, {from: accounts[4]})) + assert.equal(await token.transferFrom.call(accounts[4], ops, ST1000, {from: ops}), true) + await token.transferFrom(accounts[4], ops, ST1000, {from: ops}) - await Utils.expectThrow(token.transferFrom.call(accounts[4], admin, ST1000, { from: accounts[4] })) - await Utils.expectThrow(token.transferFrom.call(accounts[4], admin, ST1000, { from: admin })) - }) - }) + assert.equal((await token.balanceOf.call(accounts[4])).toNumber(), ST9000.toNumber()) + assert.equal((await token.balanceOf.call(ops)).toNumber(), ST1000.toNumber()) + }) + it("transfer 1000 from account 1 -> 2 with 1000 allowance (as admin)", async () => { + // We first need to bring approval to 0 + assert.equal(await token.approve.call(admin, 0, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(admin, 0, {from: accounts[4]}), accounts[4], admin, 0) - describe('transferFrom function after finalize', async () => { + assert.equal(await token.allowance.call(accounts[4], admin, {from: accounts[4]}), 0) - var token = null + assert.equal(await token.approve.call(admin, ST1000, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(admin, ST1000, {from: accounts[4]}), accounts[4], admin, ST1000) - before(async () => { - token = await createToken() + assert.equal(await token.allowance.call(accounts[4], admin), ST1000.toNumber(), {from: accounts[4]}) - await token.setOpsAddress(ops) - await token.setAdminAddress(admin) + await Utils.expectThrow(token.transferFrom.call(accounts[4], admin, ST1000, {from: accounts[4]})) + await Utils.expectThrow(token.transferFrom.call(accounts[4], admin, ST1000, {from: admin})) + }) + }) - await token.transfer(accounts[1], ST10000) - token.finalize({ from: admin }) - }) + describe('transferFrom function after finalize', async () => { + var token = null - it("transfer 0 from account 1 -> 2 with 0 allowance", async () => { - assert.equal(await token.approve.call(accounts[2], 0, { from: accounts[1] }), true) - assert.equal(await token.allowance.call(accounts[1], accounts[2]), 0) - assert.equal(await token.transferFrom.call(accounts[1], accounts[2], 0, { from: accounts[1] }), true) - assert.equal(await token.transferFrom.call(accounts[1], accounts[2], 0, { from: accounts[2] }), true) - }) + before(async () => { + token = await createToken() - it("transfer 1000 from account 1 -> 2 without allowance", async () => { - await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, { from: accounts[1] })) - await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, { from: accounts[2] })) - }) + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) - it("transfer 1000 from account 1 -> 2 with 10 allowance", async () => { - assert.equal(await token.approve.call(accounts[2], ST10, { from: accounts[1] }), true) - await token.approve(accounts[2], ST10, { from: accounts[1] }) - assert.equal(await token.allowance.call(accounts[1], accounts[2]), ST10.toNumber()) - await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, { from: accounts[1] })) - await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, { from: accounts[2] })) - }) + await token.transfer(accounts[1], ST10000) - it("transfer 1000 from account 1 -> 2 with 1000 allowance", async () => { - // We first need to bring approval to 0 - assert.equal(await token.approve.call(accounts[2], 0, { from: accounts[1] }), true) - await token.approve(accounts[2], 0, { from: accounts[1] }) - assert.equal(await token.allowance.call(accounts[1], accounts[2]), 0) + token.finalize({from: admin}) + }) - assert.equal(await token.approve.call(accounts[2], ST1000, { from: accounts[1] }), true) - await token.approve(accounts[2], ST1000, { from: accounts[1] }) - assert.equal(await token.allowance.call(accounts[1], accounts[2]), ST1000.toNumber()) - await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, { from: accounts[1] })) - assert.equal(await token.transferFrom.call(accounts[1], accounts[2], ST1000, { from: accounts[2] }), true) - await token.transferFrom(accounts[1], accounts[2], ST1000, { from: accounts[2] }) + it("transfer 0 from account 1 -> 2 with 0 allowance", async () => { + assert.equal(await token.approve.call(accounts[2], 0, {from: accounts[1]}), true) + assert.equal(await token.allowance.call(accounts[1], accounts[2]), 0) + assert.equal(await token.transferFrom.call(accounts[1], accounts[2], 0, {from: accounts[1]}), true) + assert.equal(await token.transferFrom.call(accounts[1], accounts[2], 0, {from: accounts[2]}), true) + }) - assert.equal((await token.balanceOf.call(accounts[1])).toNumber(), ST9000.toNumber()) - assert.equal((await token.balanceOf.call(accounts[2])).toNumber(), ST1000.toNumber()) - }) - }) + it("transfer 1000 from account 1 -> 2 without allowance", async () => { + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[1]})) + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[2]})) + }) + it("transfer 1000 from account 1 -> 2 with 10 allowance", async () => { + assert.equal(await token.approve.call(accounts[2], ST10, {from: accounts[1]}), true) + await token.approve(accounts[2], ST10, {from: accounts[1]}) + assert.equal(await token.allowance.call(accounts[1], accounts[2]), ST10.toNumber()) + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[1]})) + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[2]})) + }) - describe('owner and operations', async () => { + it("transfer 1000 from account 1 -> 2 with 1000 allowance", async () => { + // We first need to bring approval to 0 + assert.equal(await token.approve.call(accounts[2], 0, {from: accounts[1]}), true) + await token.approve(accounts[2], 0, {from: accounts[1]}) + assert.equal(await token.allowance.call(accounts[1], accounts[2]), 0) - var token = null + assert.equal(await token.approve.call(accounts[2], ST1000, {from: accounts[1]}), true) + await token.approve(accounts[2], ST1000, {from: accounts[1]}) + assert.equal(await token.allowance.call(accounts[1], accounts[2]), ST1000.toNumber()) + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[1]})) + assert.equal(await token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[2]}), true) + await token.transferFrom(accounts[1], accounts[2], ST1000, {from: accounts[2]}) - before(async () => { - token = await createToken() + assert.equal((await token.balanceOf.call(accounts[1])).toNumber(), ST9000.toNumber()) + assert.equal((await token.balanceOf.call(accounts[2])).toNumber(), ST1000.toNumber()) + }) + }) - await token.setOpsAddress(ops) - await token.setAdminAddress(admin) - await token.transfer(accounts[1], ST10000) - await token.transfer(accounts[2], ST1000) - }) + describe('owner and operations', async () => { + var token = null - it("check initial owner", async () => { - assert.equal(await token.owner.call(), accounts[0]) - }) - it("check initial admin", async () => { - assert.equal(await token.adminAddress.call(), accounts[1]) - }) + before(async () => { + token = await createToken() - it("check initial ops", async () => { - assert.equal(await token.opsAddress.call(), accounts[2]) - }) + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) - it("change ops address to some account", async () => { - assert.equal(await token.setOpsAddress.call(accounts[5]), true) - await token.setOpsAddress(accounts[5]) - }) + await token.transfer(accounts[1], ST10000) + await token.transfer(accounts[2], ST1000) + }) - it("change ops address to 0", async () => { - assert.equal(await token.setOpsAddress.call(0), true) - await token.setOpsAddress(0) - }) - it("change ops address to account 3", async () => { - assert.equal(await token.setOpsAddress.call(accounts[3]), true) - await token.setOpsAddress(accounts[3]) - }) + it("check initial owner", async () => { + assert.equal(await token.owner.call(), accounts[0]) + }) - it("finalize as normal", async () => { - await Utils.expectThrow(token.finalize.call({ from: accounts[4] })) - }) + it("check initial admin", async () => { + assert.equal(await token.adminAddress.call(), accounts[1]) + }) - it("finalize as ops", async () => { - await Utils.expectThrow(token.finalize.call({ from: ops })) - }) + it("check initial ops", async () => { + assert.equal(await token.opsAddress.call(), accounts[2]) + }) - it("finalize as admin", async () => { - assert.equal(await token.finalize.call({ from: admin }), true) - }) - }) + it("change ops address to some account", async () => { + assert.equal(await token.setOpsAddress.call(accounts[5]), true) + await token.setOpsAddress(accounts[5]) + }) + it("change ops address to 0", async () => { + assert.equal(await token.setOpsAddress.call(0), true) + await token.setOpsAddress(0) + }) - describe('finalize function', async () => { + it("change ops address to account 3", async () => { + assert.equal(await token.setOpsAddress.call(accounts[3]), true) + await token.setOpsAddress(accounts[3]) + }) - var token = null + it("finalize as normal", async () => { + await Utils.expectThrow(token.finalize.call({from: accounts[4]})) + }) - before(async () => { - token = await createToken() + it("finalize as ops", async () => { + await Utils.expectThrow(token.finalize.call({from: ops})) + }) - await token.setOpsAddress(ops) - await token.setAdminAddress(admin) - }) + it("finalize as admin", async () => { + assert.equal(await token.finalize.call({from: admin}), true) + }) + }) - it("check properties before and after finalize", async () => { - assert.equal(await token.finalized.call(), false) - SimpleTokenUtils.checkFinalizedEventGroup(await token.finalize({ from: admin })) - assert.equal(await token.finalized.call(), true) - }) + describe('finalize function', async () => { - it("try to finalize a 2nd time", async () => { - await Utils.expectThrow(token.finalize.call({ from: admin })) - }) - }) + var token = null + before(async () => { + token = await createToken() - describe('burn function', async () => { + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) + }) - var token = null - before(async () => { - token = await createToken() + it("check properties before and after finalize", async () => { + assert.equal(await token.finalized.call(), false) + SimpleTokenUtils.checkFinalizedEventGroup(await token.finalize({from: admin})) + assert.equal(await token.finalized.call(), true) + }) - await token.setOpsAddress(ops) - await token.setAdminAddress(admin) - }) + it("try to finalize a 2nd time", async () => { + await Utils.expectThrow(token.finalize.call({from: admin})) + }) + }) - it("burn greater than balance", async () => { - await Utils.expectThrow(token.burn.call((TOTAL_SUPPLY.plus(ST1)), { from: accounts[0] })) - }) - it("burn less than or equal to balance", async () => { - const balanceBefore = await token.balanceOf(accounts[0]) + describe('burn function', async () => { - SimpleTokenUtils.checkBurntEventGroup(await token.burn(ST1000, { from: accounts[0] })) + var token = null - const currentBalance = await token.balanceOf(accounts[0]) - const currentSupply = await token.totalSupply.call() + before(async () => { + token = await createToken() - assert.equal(balanceBefore.minus(currentBalance).toNumber(), ST1000.toNumber()) - assert.equal(TOTAL_SUPPLY.minus(currentSupply).toNumber(), ST1000.toNumber()) - }) - }) + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) + }) + + it("burn greater than balance", async () => { + await Utils.expectThrow(token.burn.call((TOTAL_SUPPLY.plus(ST1)), {from: accounts[0]})) + }) + + it("burn less than or equal to balance", async () => { + const balanceBefore = await token.balanceOf(accounts[0]) + + SimpleTokenUtils.checkBurntEventGroup(await token.burn(ST1000, {from: accounts[0]})) + + const currentBalance = await token.balanceOf(accounts[0]) + const currentSupply = await token.totalSupply.call() + + assert.equal(balanceBefore.minus(currentBalance).toNumber(), ST1000.toNumber()) + assert.equal(TOTAL_SUPPLY.minus(currentSupply).toNumber(), ST1000.toNumber()) + }) + }) }) diff --git a/test/lib/utils.js b/test/lib/utils.js index da8f169f..a473b49e 100644 --- a/test/lib/utils.js +++ b/test/lib/utils.js @@ -20,7 +20,6 @@ // ---------------------------------------------------------------------------- const Assert = require('assert'); -const SolidityEvent = require("web3/lib/web3/event.js"); const NullAddress = "0x0000000000000000000000000000000000000000"; @@ -138,102 +137,3 @@ module.exports.getGasPrice = function () { }) } -/// @dev Decode logs with ABI -module.exports.decodeLogs = (abi, logs) => { - return decodeLogs(abi, logs) -} - - -function decodeLogs(abi, logs) { - var decodedLogs = null - try { - decodedLogs = decodeLogsInternal(abi, logs) - } catch(error) { - throw new 'Could not decode receipt log for transaction ' + txID + ', message: ' + error - } - - return decodedLogs -} - - -function decodeLogsInternal(abi, logs) { - - // Find events in the ABI - var abiEvents = abi.filter(json => { - return json.type === 'event' - }) - - if (abiEvents.length === 0) { - return - } - - // Build SolidityEvent objects - var solidityEvents = [] - for (i = 0; i < abiEvents.length; i++) { - solidityEvents.push(new SolidityEvent(null, abiEvents[i], null)) - } - - // Decode each log entry - var decodedLogs = [] - for (i = 0; i < logs.length; i++) { - - var event = null - for (j = 0; j < solidityEvents.length; j++) { - if (solidityEvents[j].signature() == logs[i].topics[0].replace("0x", "")) { - event = solidityEvents[j] - break - } - } - - var decodedLog = null - - if (event != null) { - decodedLog = event.decode(logs[i]) - } else { - // We could not find the right event to decode this log entry, just keep as is. - decodedLog = logs[i] - } - - // Convert bytes32 parameters to ascii - for (j = 0; j < abiEvents.length; j++) { - const abiEvent = abiEvents[j] - - if (!abiEvent.inputs) { - continue - } - - if (abiEvent.name != decodedLog.name) { - continue - } - - for (k = 0; k < abiEvent.inputs; k++) { - if (abiEvent.inputs[k].type == 'bytes32') { - decodedLog.args[abiEvent.inputs[k].name] = hexToAscii(decodedLog.args[abiEvent.inputs[k]]); - } - } - } - - decodedLogs.push(decodedLog) - } - - return decodedLogs -} - - -function hexToAscii(hexStr) { - var asciiStr = '' - - var start = (hex.substring(0, 2) === '0x') ? 2 : 0 - - for (i = start; i < hexStr.length; i += 2) { - var charCode = parseInt(hex.substr(i, 2), 16) - - if (code === 0) { - continue - } - - asciiStr += String.fromCharCode(code); - } - - return asciiStr; -} \ No newline at end of file From d4f5547a1e1cdaea10e013dfbe91f036953cbff9 Mon Sep 17 00:00:00 2001 From: sarvesh jain Date: Wed, 9 May 2018 18:46:34 +0530 Subject: [PATCH 0037/1361] Adding .idea file in git ignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 834a19d4..fa0445a4 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,7 @@ contracts/abi/ # don't commit node_modules node_modules + + +#Dont track idea file +.idea/ From f448ad0aaab7915d9d2d693d509b22b7cb1d5cc6 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Fri, 4 May 2018 15:31:39 +0200 Subject: [PATCH 0038/1361] contracts: adds the workers contract (MOSA-27) --- contracts/Workers.sol | 156 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 contracts/Workers.sol diff --git a/contracts/Workers.sol b/contracts/Workers.sol new file mode 100644 index 00000000..3714dd2f --- /dev/null +++ b/contracts/Workers.sol @@ -0,0 +1,156 @@ +pragma solidity ^0.4.17; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: Workers +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./SafeMath.sol"; +import "./EIP20TokenInterface.sol"; +import "./ProtocolVersioned.sol"; +import "./Owned.sol"; + +/// A set of authorised workers +contract Workers is ProtocolVersioned, Owned { + using SafeMath for uint256; + /// EIP20token address is private for now. + EIP20Token private eip20token; + /* + * Storage + */ + /// workers are active up unto the deactivation height + mapping(address => uint256 /* deactivation height */) public workers; + /// workers have token balances + mapping(address => uint256) balances; + + /* + * Events + */ + ///Event for worker set + event WorkerSet( + address indexed _worker, + uint256 indexed _deactivationHeight, + uint256 _remainingHeight); + + ///Event for worker removed + event WorkerRemoved( + address indexed _worker, + bool _existed); + + /// @dev Constructor; + /// public method; + constructor( + address _eip20token, + address _protocol) + public + ProtocolVersioned(_protocol) + { + require(_eip20token != 0); + require(_protocol != address(0)); + + eip20token = _eip20token; + protocol = _protocol; + } + + /// @dev Takes _worker, _deactivationHeight; + /// Sets worker and its deactivation height; + /// external method; + /// @param _worker worker + /// @param _deactivationHeight deactivationHeight + /// @return (remainingHeight) + function setWorker( + address _worker, + uint256 _deactivationHeight) + external + onlyOwner() + returns (uint256 /* remaining activation length */) + { + require(_worker != address(0)); + require(_deactivationHeight >= block.number); + + workers[_worker] = _deactivationHeight; + uint256 remainingHeight = _deactivationHeight - block.number; + //Event for worker set + WorkerSet(_worker, _deactivationHeight, remainingHeight); + + return (remainingHeight); + } + + /// @dev Takes _worker; + /// removes the worker; + /// external method; + /// @param _worker worker + /// @return (existed) + function removeWorker( + address _worker) + external + onlyOwner() + returns (bool existed) + { + existed = (workers[_worker] > 0); + + delete workers[_worker]; + //Event for worker removed + WorkerRemoved(_worker, existed); + + return existed; + } + + /// @dev Clean up or collectively revoke all workers; + /// external method; + /// only called by ops or admin; + function remove() + external + onlyOwner() + { + selfdestruct(msg.sender); + } + + /// @dev Takes _worker; + /// checks if the worker is valid; + /// external method; + /// @param _worker worker + /// @return (isValid) + function isWorker( + address _worker) + external + view + returns (bool /* is active worker */) + { + return (workers[_worker] >= block.number); + } + + function approve( + address _spender, + uint256 _amount) + external + onlyOwner() + returns (bool success) + { + /// check if the allowance exists for spender address + require(eip20token.allowance(msg.sender, _spender) >= 0); + /// approve the spender for the amount + require(eip20token.approve(_spender, _amount)); + /// Emit Approval event + Approval(msg.sender, _spender, _amount); + + return true; + } + +} \ No newline at end of file From 8ca1620ce364080f58be2bb473c97fe086481215 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Tue, 8 May 2018 17:09:54 +0200 Subject: [PATCH 0039/1361] contracts: changed the solidity compiler version (MOSA-27) --- contracts/Workers.sol | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/contracts/Workers.sol b/contracts/Workers.sol index 3714dd2f..6540faa5 100644 --- a/contracts/Workers.sol +++ b/contracts/Workers.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.23; // Copyright 2018 OpenST Ltd. // @@ -36,8 +36,6 @@ contract Workers is ProtocolVersioned, Owned { */ /// workers are active up unto the deactivation height mapping(address => uint256 /* deactivation height */) public workers; - /// workers have token balances - mapping(address => uint256) balances; /* * Events @@ -56,16 +54,14 @@ contract Workers is ProtocolVersioned, Owned { /// @dev Constructor; /// public method; constructor( - address _eip20token, - address _protocol) + address _eip20token) public ProtocolVersioned(_protocol) { - require(_eip20token != 0); + require(_eip20token != address(0)); require(_protocol != address(0)); eip20token = _eip20token; - protocol = _protocol; } /// @dev Takes _worker, _deactivationHeight; @@ -144,7 +140,7 @@ contract Workers is ProtocolVersioned, Owned { returns (bool success) { /// check if the allowance exists for spender address - require(eip20token.allowance(msg.sender, _spender) >= 0); + require(eip20token.allowance(msg.sender, _spender) >= uint256(0)); /// approve the spender for the amount require(eip20token.approve(_spender, _amount)); /// Emit Approval event From ad1f6f978a796861533926f58d7616019a54dce2 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Tue, 8 May 2018 18:27:16 +0200 Subject: [PATCH 0040/1361] contracts: removed a logic conflicting require from approve() (MOSA-27) --- contracts/Workers.sol | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/contracts/Workers.sol b/contracts/Workers.sol index 6540faa5..0a056dfc 100644 --- a/contracts/Workers.sol +++ b/contracts/Workers.sol @@ -81,7 +81,7 @@ contract Workers is ProtocolVersioned, Owned { require(_deactivationHeight >= block.number); workers[_worker] = _deactivationHeight; - uint256 remainingHeight = _deactivationHeight - block.number; + uint256 remainingHeight = sub(_deactivationHeight, block.number); //Event for worker set WorkerSet(_worker, _deactivationHeight, remainingHeight); @@ -139,11 +139,9 @@ contract Workers is ProtocolVersioned, Owned { onlyOwner() returns (bool success) { - /// check if the allowance exists for spender address - require(eip20token.allowance(msg.sender, _spender) >= uint256(0)); /// approve the spender for the amount require(eip20token.approve(_spender, _amount)); - /// Emit Approval event + /// emit Approval event Approval(msg.sender, _spender, _amount); return true; From 068db0522b807454fd69e06a0cc99b0952657aab Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Wed, 9 May 2018 18:03:28 +0200 Subject: [PATCH 0041/1361] contracts: fixes inheritance, function modifiers, constructor (MOSA-27) --- contracts/Workers.sol | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/contracts/Workers.sol b/contracts/Workers.sol index 0a056dfc..59a87a79 100644 --- a/contracts/Workers.sol +++ b/contracts/Workers.sol @@ -15,7 +15,7 @@ pragma solidity ^0.4.23; // limitations under the License. // // ---------------------------------------------------------------------------- -// Utility chain: Workers +// Value chain: Workers // // http://www.simpletoken.org/ // @@ -23,14 +23,13 @@ pragma solidity ^0.4.23; import "./SafeMath.sol"; import "./EIP20TokenInterface.sol"; -import "./ProtocolVersioned.sol"; -import "./Owned.sol"; +import "./OpsManaged.sol"; /// A set of authorised workers -contract Workers is ProtocolVersioned, Owned { +contract Workers is OpsManaged { using SafeMath for uint256; /// EIP20token address is private for now. - EIP20Token private eip20token; + EIP20TokenInterface private eip20token; /* * Storage */ @@ -56,10 +55,9 @@ contract Workers is ProtocolVersioned, Owned { constructor( address _eip20token) public - ProtocolVersioned(_protocol) + OpsManaged() { require(_eip20token != address(0)); - require(_protocol != address(0)); eip20token = _eip20token; } @@ -74,7 +72,7 @@ contract Workers is ProtocolVersioned, Owned { address _worker, uint256 _deactivationHeight) external - onlyOwner() + onlyOps() returns (uint256 /* remaining activation length */) { require(_worker != address(0)); @@ -83,7 +81,7 @@ contract Workers is ProtocolVersioned, Owned { workers[_worker] = _deactivationHeight; uint256 remainingHeight = sub(_deactivationHeight, block.number); //Event for worker set - WorkerSet(_worker, _deactivationHeight, remainingHeight); + emit WorkerSet(_worker, _deactivationHeight, remainingHeight); return (remainingHeight); } @@ -96,14 +94,14 @@ contract Workers is ProtocolVersioned, Owned { function removeWorker( address _worker) external - onlyOwner() + onlyOps() returns (bool existed) { existed = (workers[_worker] > 0); delete workers[_worker]; //Event for worker removed - WorkerRemoved(_worker, existed); + emit WorkerRemoved(_worker, existed); return existed; } @@ -113,7 +111,7 @@ contract Workers is ProtocolVersioned, Owned { /// only called by ops or admin; function remove() external - onlyOwner() + onlyAdminOrOps() { selfdestruct(msg.sender); } @@ -136,13 +134,11 @@ contract Workers is ProtocolVersioned, Owned { address _spender, uint256 _amount) external - onlyOwner() + onlyOps() returns (bool success) { /// approve the spender for the amount require(eip20token.approve(_spender, _amount)); - /// emit Approval event - Approval(msg.sender, _spender, _amount); return true; } From d3a9831238a26132e6acd211d16f2ddcb2f43e6c Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Wed, 9 May 2018 21:17:48 +0200 Subject: [PATCH 0042/1361] contracts: fixes the missing imports (MOSA-27) --- contracts/Workers.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/Workers.sol b/contracts/Workers.sol index 59a87a79..529f51ae 100644 --- a/contracts/Workers.sol +++ b/contracts/Workers.sol @@ -22,14 +22,14 @@ pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- import "./SafeMath.sol"; -import "./EIP20TokenInterface.sol"; +import "./EIP20Interface.sol"; import "./OpsManaged.sol"; /// A set of authorised workers contract Workers is OpsManaged { using SafeMath for uint256; /// EIP20token address is private for now. - EIP20TokenInterface private eip20token; + EIP20Interface private eip20token; /* * Storage */ @@ -79,7 +79,7 @@ contract Workers is OpsManaged { require(_deactivationHeight >= block.number); workers[_worker] = _deactivationHeight; - uint256 remainingHeight = sub(_deactivationHeight, block.number); + uint256 remainingHeight = _deactivationHeight.sub(block.number); //Event for worker set emit WorkerSet(_worker, _deactivationHeight, remainingHeight); From d4e954bf59c00f0d07ad69fafe0ad21b78340b0b Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Wed, 9 May 2018 21:36:40 +0200 Subject: [PATCH 0043/1361] contracts: casts _eip20token address to contract type (MOSA-27) --- contracts/Workers.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Workers.sol b/contracts/Workers.sol index 529f51ae..ec3af499 100644 --- a/contracts/Workers.sol +++ b/contracts/Workers.sol @@ -59,7 +59,7 @@ contract Workers is OpsManaged { { require(_eip20token != address(0)); - eip20token = _eip20token; + eip20token = EIP20Interface(_eip20token); } /// @dev Takes _worker, _deactivationHeight; From f86a1e06ac6509f6de67a0c3aaabe8bec4ee4524 Mon Sep 17 00:00:00 2001 From: sarvesh jain Date: Thu, 10 May 2018 12:07:48 +0530 Subject: [PATCH 0044/1361] [MOSA-48] Fixing broken tests --- test/EIP20Token_utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/EIP20Token_utils.js b/test/EIP20Token_utils.js index 2d3caa3d..17335327 100644 --- a/test/EIP20Token_utils.js +++ b/test/EIP20Token_utils.js @@ -55,8 +55,8 @@ module.exports.checkTransferEventAbiDecoder = (event, _from, _to, _value) => { } assertTransferEvent = (eventType, actualFrom, actualTo, actualValue, expectedFrom, expectedTo, expectedValue) => { - if (Number.isInteger(_value)) { - _value = new BigNumber(_value); + if (Number.isInteger(expectedValue)) { + expectedValue = new BigNumber(expectedValue); } Assert.equal(eventType, "Transfer"); Assert.equal(actualFrom, expectedFrom); From 9a08d71f7fab46a09e41fb36c6ba60f0d93ee3a2 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 10 May 2018 14:52:11 +0530 Subject: [PATCH 0045/1361] contract: Removed GateInterface. MOSA-21 --- contracts/Gate.sol | 106 ++++++++++++++---------------------- contracts/GateInterface.sol | 83 ---------------------------- contracts/OpenSTValue.sol | 14 +---- 3 files changed, 44 insertions(+), 159 deletions(-) delete mode 100644 contracts/GateInterface.sol diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 09cd25a3..4e94a888 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -26,9 +26,15 @@ import "./ProtocolVersioned.sol"; import "./OpenSTValueInterface.sol"; import "./EIP20Interface.sol"; import "./Owned.sol"; -import "./GateInterface.sol"; -contract Gate is GateInterface, ProtocolVersioned, Owned { +contract Gate is ProtocolVersioned, Owned { + + /* + * Events + */ + event StakeRequested(address _staker, uint256 _amount, address _beneficiary); + event StakeRequestReverted(address _staker, uint256 _amount); + event StakeRequestRejected(address _staker, uint256 _amount); /* * Structures @@ -36,23 +42,23 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { struct StakeRequest { uint256 amount; uint256 unlockHeight; - address beneficiary; //The token holder contract in the future + address beneficiary; //The token holder contract in the future bytes32 hashLock; } /* * Storage */ - address private gateWorkers; //TODO: update type once workers contract and interfaces are added to the repo. + address public workers; //TODO: update type once workers contract and interfaces are added to the repo. // stake requests - mapping(address /*staker */ => StakeRequest) private gateStakeRequests; + mapping(address /*staker */ => StakeRequest) public stakeRequests; // bounty amount - uint256 private gateBounty; + uint256 public bounty; // utility token UUID - bytes32 private gateUuid; + bytes32 public uuid; /* @@ -70,9 +76,9 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { require(_workers != address(0)); require(_uuid.length != uint8(0)); - gateWorkers = _workers; - gateBounty = _bounty; - gateUuid = _uuid; + workers = _workers; + bounty = _bounty; + uuid = _uuid; } @@ -87,11 +93,11 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { require(_beneficiary != address(0)); // check if the stake request does not exists - require(gateStakeRequests[msg.sender].beneficiary == address(0)); + require(stakeRequests[msg.sender].beneficiary == address(0)); require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), _amount)); - gateStakeRequests[msg.sender] = StakeRequest({ + stakeRequests[msg.sender] = StakeRequest({ amount: _amount, beneficiary: _beneficiary, hashLock: 0, @@ -110,7 +116,7 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { returns (bool /* success */) { // only staker can do revertStakeRequest, msg.sender == staker - StakeRequest storage stakeRequest = gateStakeRequests[msg.sender]; + StakeRequest storage stakeRequest = stakeRequests[msg.sender]; // check if the stake request exists for the msg.sender require(stakeRequest.beneficiary != address(0)); @@ -121,7 +127,7 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, stakeRequest.amount)); uint256 stakeRequestAmount = stakeRequest.amount; - delete gateStakeRequests[msg.sender]; + delete stakeRequests[msg.sender]; emit StakeRequestReverted(msg.sender, stakeRequestAmount); @@ -133,9 +139,9 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { returns (bool /* success */) { // check if the caller is whitelisted worker - //require(gateWorkers.isWorker(msg.sender)); //TODO: revist this to add worker check + //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check - StakeRequest storage stakeRequest = gateStakeRequests[_staker]; + StakeRequest storage stakeRequest = stakeRequests[_staker]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -148,7 +154,7 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { uint256 stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage - delete gateStakeRequests[msg.sender]; + delete stakeRequests[msg.sender]; emit StakeRequestRejected(_staker, stakeRequestAmount); @@ -162,9 +168,9 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { returns (bool /* success */) { // check if the caller is whitelisted worker - //require(gateWorkers.isWorker(msg.sender)); //TODO: revist this to add worker check + //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check - StakeRequest storage stakeRequest = gateStakeRequests[_staker]; + StakeRequest storage stakeRequest = stakeRequests[_staker]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -176,7 +182,7 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { require(_hashLock != bytes32(0)); // Transfer bounty amount form worker to gate contract - require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), gateBounty)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), bounty)); // Approve OpenSTValue contract for stake amount require(OpenSTValueInterface(openSTProtocol).valueToken().approve(openSTProtocol, stakeRequest.amount)); @@ -188,17 +194,17 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { bytes32 stakingIntentHash = bytes32(0); (amountUT, nonce, unlockHeight, stakingIntentHash) = OpenSTValueInterface(openSTProtocol).stake( - gateUuid, + uuid, stakeRequest.amount, stakeRequest.beneficiary, _hashLock, _staker); - stakeRequest.unlockHeight = unlockHeight; - stakeRequest.hashLock = _hashLock; + // Check if the stake function call did not result in to error. + require(stakingIntentHash != bytes32(0)); - //gateStakeRequests[_staker].unlockHeight = unlockHeight; - //gateStakeRequests[_staker].hashLock = _hashLock; + stakeRequests[_staker].unlockHeight = unlockHeight; + stakeRequests[_staker].hashLock = _hashLock; return true; } @@ -212,12 +218,12 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { returns (bool /* success */) { // check if the caller is whitelisted worker - //require(gateWorkers.isWorker(msg.sender)); //TODO: revist this to add worker check + //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check require(_stakingIntentHash != bytes32(0)); require(_staker != address(0)); - StakeRequest storage stakeRequest = gateStakeRequests[_staker]; + StakeRequest storage stakeRequest = stakeRequests[_staker]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -229,12 +235,12 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { require(stakeRequest.hashLock == keccak256(_unlockSecret)); OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); - + // Transfer bounty amount to the msg.sender account - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, gateBounty)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); // delete the stake request from the mapping storage - delete gateStakeRequests[msg.sender]; + delete stakeRequests[msg.sender]; return true; } @@ -246,11 +252,11 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { { // check if the caller is whitelisted worker - //require(gateWorkers.isWorker(msg.sender)); //TODO: revist this to add worker check + //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check require(_stakingIntentHash != bytes32(0)); - StakeRequest storage stakeRequest = gateStakeRequests[msg.sender]; + StakeRequest storage stakeRequest = stakeRequests[msg.sender]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -262,46 +268,18 @@ contract Gate is GateInterface, ProtocolVersioned, Owned { require(stakeRequest.unlockHeight > 0); require(stakeRequest.unlockHeight <= block.number); - bytes32 uuid = bytes32(0); + bytes32 uuidR = bytes32(0); uint256 amountST = uint256(0); address stakerAddress = address(0); - (uuid, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash, msg.sender); + (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash, msg.sender); require(stakerAddress == msg.sender); // Transfer bounty amount to the msg.sender account - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, gateBounty)); + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); // delete the stake request from the mapping storage - delete gateStakeRequests[msg.sender]; + delete stakeRequests[msg.sender]; return true; } - - function workers() - external - returns (address) - { - return gateWorkers; - } - - function bounty() - external - returns (uint256) - { - return gateBounty; - } - - function uuid() - external - returns (bytes32) - { - return gateUuid; - } - - function getOpenSTProtocol() - external - returns (address) - { - return openSTProtocol; - } } \ No newline at end of file diff --git a/contracts/GateInterface.sol b/contracts/GateInterface.sol deleted file mode 100644 index 01e7b769..00000000 --- a/contracts/GateInterface.sol +++ /dev/null @@ -1,83 +0,0 @@ -/* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.23; - -// Copyright 2018 OpenST Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ---------------------------------------------------------------------------- -// Value chain: Gate -// -// http://www.simpletoken.org/ -// -// ---------------------------------------------------------------------------- - -contract GateInterface { - - /* - * Events - */ - event StakeRequested(address _staker, uint256 _amount, address _beneficiary); - event StakeRequestReverted(address _staker, uint256 _amount); - event StakeRequestRejected(address _staker, uint256 _amount); - - function workers() - external - returns (address); - - function bounty() - external - returns (uint256); - - function uuid() - external - returns (bytes32); - - function getOpenSTProtocol() - external - returns (address); - - function requestStake( - uint256 _amount, - address _beneficiary) - external - returns ( bool /* success */); - - - /// @dev In order to revert stake request the msg.sender should be the staker - function revertStakeRequest() - external - returns (bool /* success */); - - function rejectStakeRequest(address _staker) - external - returns (bool /* success */); - - /// @dev In order to accept stake the staker needs to approve gate contract for bounty amount. - /// This can be called only by whitelisted worker address - function acceptStakeRequest(address _staker, bytes32 _hashLock) - external - returns (bool /* success */); - - function processStaking( - bytes32 _stakingIntentHash, - bytes32 _unlockSecret, - address _staker) - external - returns (bool /* success */); - - function revertStaking(bytes32 _stakingIntentHash) - external - returns (bool /* success */); - -} \ No newline at end of file diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 00609c22..eae38b56 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -32,8 +32,6 @@ import "./ProtocolVersioned.sol"; // value chain contracts import "./SimpleStake.sol"; -import "./GateInterface.sol"; - /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is OpsManaged, Hasher { using SafeMath for uint256; @@ -187,14 +185,11 @@ contract OpenSTValue is OpsManaged, Hasher { require(_beneficiary != address(0)); require(_staker != address(0)); - // check if the msg.sender is Gate contract - GateInterface(msg.sender).getOpenSTProtocol() == address(this); - UtilityToken storage utilityToken = utilityTokens[_uuid]; // if the staking account is set to a non-zero address, // then all transactions have come (from/over) the staking account - if (utilityToken.stakingAccount != address(0)) require(_staker == utilityToken.stakingAccount); + if (utilityToken.stakingAccount != address(0)) require(msg.sender == utilityToken.stakingAccount); require(valueToken.transferFrom(msg.sender, address(this), _amountST)); amountUT = (_amountST.mul(utilityToken.conversionRate)) @@ -226,6 +221,7 @@ contract OpenSTValue is OpsManaged, Hasher { hashLock: _hashLock }); + // msg.sender should also be included ? StakingIntentDeclared(_uuid, _staker, nonce, _beneficiary, _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); @@ -239,9 +235,6 @@ contract OpenSTValue is OpsManaged, Hasher { external returns (address stakeAddress) { - // check if the msg.sender is Gate contract - GateInterface(msg.sender).getOpenSTProtocol() == address(this); - require(_stakingIntentHash != ""); Stake storage stake = stakes[_stakingIntentHash]; @@ -277,9 +270,6 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 amountST, address staker) { - // check if the msg.sender is Gate contract - GateInterface(msg.sender).getOpenSTProtocol() == address(this); - require(_stakingIntentHash != ""); Stake storage stake = stakes[_stakingIntentHash]; From d775f91f0d5a78231e879460f4347e890713fff0 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 10 May 2018 15:05:26 +0530 Subject: [PATCH 0046/1361] contract: Updated ProcessStaking and RevertStaking for Gate contract. MOSA-21 --- contracts/Gate.sol | 41 ++++++++---------- contracts/OpenSTValue.sol | 6 +-- test/Gate.js | 69 +++++++++++++++++++++++++++++ test/Gate_utils.js | 91 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 26 deletions(-) create mode 100644 test/Gate.js create mode 100644 test/Gate_utils.js diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 4e94a888..56137ec3 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -212,8 +212,7 @@ contract Gate is ProtocolVersioned, Owned { function processStaking( bytes32 _stakingIntentHash, - bytes32 _unlockSecret, - address _staker) + bytes32 _unlockSecret) external returns (bool /* success */) { @@ -221,9 +220,14 @@ contract Gate is ProtocolVersioned, Owned { //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check require(_stakingIntentHash != bytes32(0)); - require(_staker != address(0)); - StakeRequest storage stakeRequest = stakeRequests[_staker]; + // we call processStaking for OpenSTValue and get the stakeAddress on succuess. + address stakeAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); + + // check if the stake address is not 0 + require(stakeAddress != address(0)); + + StakeRequest storage stakeRequest = stakeRequests[stakeAddress]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -231,21 +235,16 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake request was accepted require(stakeRequest.hashLock != bytes32(0)); - // validate the unlockSecret. - require(stakeRequest.hashLock == keccak256(_unlockSecret)); - - OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); - // Transfer bounty amount to the msg.sender account require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); // delete the stake request from the mapping storage - delete stakeRequests[msg.sender]; + delete stakeRequests[stakeAddress]; return true; } - /// @dev In order to revertStaking the msg.sender should be the staker + function revertStaking(bytes32 _stakingIntentHash) external returns (bool /* success */) @@ -256,6 +255,14 @@ contract Gate is ProtocolVersioned, Owned { require(_stakingIntentHash != bytes32(0)); + bytes32 uuidR = bytes32(0); + uint256 amountST = uint256(0); + address stakerAddress = address(0); + (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash, msg.sender); + + // check if the stake address is not 0 + require(stakeAddress != address(0)); + StakeRequest storage stakeRequest = stakeRequests[msg.sender]; // check if the stake request exists @@ -264,21 +271,11 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake request was accepted require(stakeRequest.hashLock != bytes32(0)); - // require that the stake is unlocked and exists - require(stakeRequest.unlockHeight > 0); - require(stakeRequest.unlockHeight <= block.number); - - bytes32 uuidR = bytes32(0); - uint256 amountST = uint256(0); - address stakerAddress = address(0); - (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash, msg.sender); - - require(stakerAddress == msg.sender); // Transfer bounty amount to the msg.sender account require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); // delete the stake request from the mapping storage - delete stakeRequests[msg.sender]; + delete stakeRequests[stakeAddress]; return true; } diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index eae38b56..ad88e565 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -32,6 +32,7 @@ import "./ProtocolVersioned.sol"; // value chain contracts import "./SimpleStake.sol"; + /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is OpsManaged, Hasher { using SafeMath for uint256; @@ -262,8 +263,7 @@ contract OpenSTValue is OpsManaged, Hasher { } function revertStaking( - bytes32 _stakingIntentHash, - address _staker) + bytes32 _stakingIntentHash) external returns ( bytes32 uuid, @@ -278,8 +278,6 @@ contract OpenSTValue is OpsManaged, Hasher { require(stake.unlockHeight > 0); require(stake.unlockHeight <= block.number); - require(_staker == stake.staker); - assert(valueToken.balanceOf(address(this)) >= stake.amountST); // revert the amount that was intended to be staked back to staker require(valueToken.transfer(stake.staker, stake.amountST)); diff --git a/test/Gate.js b/test/Gate.js new file mode 100644 index 00000000..e32ca5ef --- /dev/null +++ b/test/Gate.js @@ -0,0 +1,69 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Gate.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Utils = require('./lib/utils.js'); +const BigNumber = require('bignumber.js'); +const Gate_utils = require('./Gate_utils.js'); + + +contract('OpenSTValue', function(accounts) { + + beforeEach (async () => { + result = await Gate_utils.deployGate(artifacts, accounts); + valueToken = result.valueToken; + openSTValue = result.openSTValue; + uuid = result.uuid; + gate = result.gate; + workers = result.workers; + bounty = result.bounty; + }); + + describe('Properties', async () => { + + + it('has workers', async () => { + assert.equal(await gate.workers.call(), workers); + }); + + it('has bounty', async () => { + let bountyValue = await gate.bounty.call(); + assert.equal(bountyValue.toNumber(), bounty); + }); + + it('has uuid', async () => { + let gateUUID = await gate.uuid.call(); + assert.equal(gateUUID, uuid); + }); + + it('has openSTProtocol', async () => { + assert.equal(await gate.getOpenSTProtocol.call(), openSTValue.address); + }); + }) + + describe('requestStake', async () => { + + it('happy case', async () => { + assert.equal(await gate.workers.call(), workers); + }); + + }) + +}); diff --git a/test/Gate_utils.js b/test/Gate_utils.js new file mode 100644 index 00000000..f4b0bd67 --- /dev/null +++ b/test/Gate_utils.js @@ -0,0 +1,91 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: BrandedToken_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const OpenSTValue_utils = require('./OpenSTValue_utils.js') + , OpenSTValue = artifacts.require("./OpenSTValueMock.sol") + , SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") + , Core = artifacts.require("./Core.sol") + , SimpleStake = artifacts.require("./SimpleStake.sol") + , Gate = artifacts.require("./Gate.sol") + ; + +const Assert = require('assert') + , BigNumber = require('bignumber.js') + ; + +/// @dev Deploy +module.exports.deployGate = async (artifacts, accounts) => { + + const chainIdValue = 3 + , chainIdRemote = 1410 + , openSTRemote = accounts[4] + , valueToken = await SimpleToken.new() + , registrar = accounts[1] + , symbol = "ST" + , name = "Simple Token" + , conversionRateDecimals = 5 + , conversionRate = new BigNumber(10 * 10**conversionRateDecimals) // conversion rate => 10 + , workers = accounts[2] + , bounty = 100 + ; + + var core = null + , openSTValue = null + , checkUuid = null + ; + + + // Set SimpleToken admin in order to finalize SimpleToken + await valueToken.setAdminAddress(accounts[1]); + // SimpleToken must be finalized to permit certain transfers + assert.ok(await valueToken.finalize({ from: accounts[1] })); + openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); + + + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + await openSTValue.addCore(core.address, { from: registrar }); + + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + + assert.equal(await openSTValue.registerUtilityToken.call(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }), checkUuid); + const result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + + // Stake address is returned by UtilityTokenRegistered but verified below rather than by checkUtilityTokenRegisteredEvent + OpenSTValue_utils.checkUtilityTokenRegisteredEvent(result.logs[0], checkUuid, symbol, name, 18, conversionRate, chainIdRemote, 0); + var simpleStake = new SimpleStake(result.logs[0].args.stake); + + assert.equal(await simpleStake.uuid.call(), checkUuid); + assert.equal(await simpleStake.eip20Token.call(), valueToken.address); + assert.equal(await openSTValue.getUuidsSize.call(), 1); + assert.equal((await openSTValue.utilityTokens.call(checkUuid))[0], symbol); + + const gate = await Gate.new(workers, bounty, checkUuid, openSTValue.address); + + return { + valueToken : valueToken, + openSTValue : openSTValue, + uuid: checkUuid, + gate: gate, + workers: workers, + bounty: bounty + } + +} From d6a7f1e6ccdf974bcdd30e5561c8da7efc7edc96 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 10 May 2018 15:10:27 +0530 Subject: [PATCH 0047/1361] contract: Fixed typo mistake. MOSA-21 --- contracts/Gate.sol | 12 ++++++------ test/Gate.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 56137ec3..ba9eb024 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -222,12 +222,12 @@ contract Gate is ProtocolVersioned, Owned { require(_stakingIntentHash != bytes32(0)); // we call processStaking for OpenSTValue and get the stakeAddress on succuess. - address stakeAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); + address stakerAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); // check if the stake address is not 0 - require(stakeAddress != address(0)); + require(stakerAddress != address(0)); - StakeRequest storage stakeRequest = stakeRequests[stakeAddress]; + StakeRequest storage stakeRequest = stakeRequests[stakerAddress]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -239,7 +239,7 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); // delete the stake request from the mapping storage - delete stakeRequests[stakeAddress]; + delete stakeRequests[stakerAddress]; return true; } @@ -261,7 +261,7 @@ contract Gate is ProtocolVersioned, Owned { (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash, msg.sender); // check if the stake address is not 0 - require(stakeAddress != address(0)); + require(stakerAddress != address(0)); StakeRequest storage stakeRequest = stakeRequests[msg.sender]; @@ -275,7 +275,7 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); // delete the stake request from the mapping storage - delete stakeRequests[stakeAddress]; + delete stakeRequests[stakerAddress]; return true; } diff --git a/test/Gate.js b/test/Gate.js index e32ca5ef..3f4e0c77 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -54,7 +54,7 @@ contract('OpenSTValue', function(accounts) { }); it('has openSTProtocol', async () => { - assert.equal(await gate.getOpenSTProtocol.call(), openSTValue.address); + assert.equal(await gate.openSTProtocol.call(), openSTValue.address); }); }) From 536c2db2cd3b98cabba06c4caeb65fa40e0529e0 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 10 May 2018 20:48:11 +0530 Subject: [PATCH 0048/1361] contracts: tested happy flow --- contracts/Gate.sol | 50 ++++-- contracts/OpenSTValue.sol | 13 +- contracts/OpenSTValueInterface.sol | 7 +- test/Gate.js | 239 ++++++++++++++++++++++++++++- test/Gate_utils.js | 54 ++++++- 5 files changed, 335 insertions(+), 28 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index ba9eb024..9ce66261 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -35,6 +35,14 @@ contract Gate is ProtocolVersioned, Owned { event StakeRequested(address _staker, uint256 _amount, address _beneficiary); event StakeRequestReverted(address _staker, uint256 _amount); event StakeRequestRejected(address _staker, uint256 _amount); + event StakeRequestAccepted( + address _staker, + uint256 _amount, + uint256 _amountUT, + uint256 _nonce, + uint256 _unlockHeight, + bytes32 _stakingIntentHash); + /* * Structures @@ -206,6 +214,8 @@ contract Gate is ProtocolVersioned, Owned { stakeRequests[_staker].unlockHeight = unlockHeight; stakeRequests[_staker].hashLock = _hashLock; + emit StakeRequestAccepted(_staker, stakeRequest.amount, amountUT, nonce, unlockHeight, stakingIntentHash); + return true; } @@ -221,13 +231,9 @@ contract Gate is ProtocolVersioned, Owned { require(_stakingIntentHash != bytes32(0)); - // we call processStaking for OpenSTValue and get the stakeAddress on succuess. - address stakerAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); + address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); - // check if the stake address is not 0 - require(stakerAddress != address(0)); - - StakeRequest storage stakeRequest = stakeRequests[stakerAddress]; + StakeRequest storage stakeRequest = stakeRequests[staker]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -235,17 +241,24 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake request was accepted require(stakeRequest.hashLock != bytes32(0)); + // we call processStaking for OpenSTValue and get the stakeAddress on success. + address stakerAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); + + // check if the stake address is not 0 + require(stakerAddress != address(0)); + // Transfer bounty amount to the msg.sender account require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); // delete the stake request from the mapping storage - delete stakeRequests[stakerAddress]; + delete stakeRequests[staker]; return true; } - function revertStaking(bytes32 _stakingIntentHash) + function revertStaking( + bytes32 _stakingIntentHash) external returns (bool /* success */) { @@ -255,15 +268,9 @@ contract Gate is ProtocolVersioned, Owned { require(_stakingIntentHash != bytes32(0)); - bytes32 uuidR = bytes32(0); - uint256 amountST = uint256(0); - address stakerAddress = address(0); - (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash, msg.sender); - - // check if the stake address is not 0 - require(stakerAddress != address(0)); + address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); - StakeRequest storage stakeRequest = stakeRequests[msg.sender]; + StakeRequest storage stakeRequest = stakeRequests[staker]; // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -271,11 +278,20 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake request was accepted require(stakeRequest.hashLock != bytes32(0)); + + bytes32 uuidR = bytes32(0); + uint256 amountST = uint256(0); + address stakerAddress = address(0); + (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash); + + // check if the stake address is not 0 + require(stakerAddress != address(0)); + // Transfer bounty amount to the msg.sender account require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); // delete the stake request from the mapping storage - delete stakeRequests[stakerAddress]; + delete stakeRequests[staker]; return true; } diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index ad88e565..bf0c5172 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -222,7 +222,6 @@ contract OpenSTValue is OpsManaged, Hasher { hashLock: _hashLock }); - // msg.sender should also be included ? StakingIntentDeclared(_uuid, _staker, nonce, _beneficiary, _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); @@ -562,4 +561,16 @@ contract OpenSTValue is OpsManaged, Hasher { return true; } + + function getStakerAddress( + bytes32 _stakingIntentHash) + external + returns (address /* staker */) + { + require(_stakingIntentHash != ""); + Stake storage stake = stakes[_stakingIntentHash]; + + return stake.staker; + + } } diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index 7bd4b9c1..531260e5 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -105,11 +105,14 @@ contract OpenSTValueInterface { bytes32 /* stakingIntentHash*/); function revertStaking( - bytes32 _stakingIntentHash, - address _staker) + bytes32 _stakingIntentHash) external returns ( bytes32, /* uuid */ uint256, /* amountST */ address /* staker */); + + function getStakerAddress(bytes32 _stakingIntentHash) + external + returns (address /* staker */); } \ No newline at end of file diff --git a/test/Gate.js b/test/Gate.js index 3f4e0c77..d25cc67b 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -22,11 +22,17 @@ const Utils = require('./lib/utils.js'); const BigNumber = require('bignumber.js'); const Gate_utils = require('./Gate_utils.js'); +const HashLock = require('./lib/hash_lock.js'); +contract('Gate', function(accounts) { -contract('OpenSTValue', function(accounts) { + var stakerAccount = accounts[0] + , stakeAmount = new BigNumber(web3.toWei(1000, "ether")) + , beneficiaryAccount = accounts[6] + , workerAddress1 = accounts[7]; + ; - beforeEach (async () => { + const deployGate = async function() { result = await Gate_utils.deployGate(artifacts, accounts); valueToken = result.valueToken; openSTValue = result.openSTValue; @@ -34,10 +40,69 @@ contract('OpenSTValue', function(accounts) { gate = result.gate; workers = result.workers; bounty = result.bounty; - }); + }; + + const requestStake = async function () { + let initialStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + ; + // approve gate contract + await valueToken.approve(gate.address, stakeAmount, { from: stakerAccount }); + + let requestStakeResult = await gate.requestStake.call(stakeAmount, beneficiaryAccount, {from: stakerAccount}); + assert.equal(requestStakeResult, true); + + let requestStakeResponse = await gate.requestStake(stakeAmount, beneficiaryAccount, {from: stakerAccount}); + await Gate_utils.checkRequestStakeEvent(requestStakeResponse.logs[0],stakerAccount, stakeAmount, beneficiaryAccount); + + let finalStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + // check balances + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.sub(stakeAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.plus(stakeAmount)), true); + + // request again should fail + await Utils.expectThrow(gate.requestStake(stakeAmount, beneficiaryAccount, {from: stakerAccount})); + }; + + const acceptStakeRequest = async function() { + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + + let initialworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + , bountyAmount = await gate.bounty.call() + , lock = HashLock.getHashLock() + ; + + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let acceptStakeRequestResult = await gate.acceptStakeRequest.call(stakerAccount, lock.l, {from: workerAddress1}); + assert.equal(acceptStakeRequestResult, true); + + let acceptStakeRequestResponse = await gate.acceptStakeRequest(stakerAccount, lock.l, {from: workerAddress1}); + await Gate_utils.checkStakeRequestAcceptedEvent(acceptStakeRequestResponse.logs[0],stakerAccount, stakeAmount); + + const stakingIntentHash = acceptStakeRequestResponse.logs[0].args._stakingIntentHash; + let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.sub(bountyAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.plus(bountyAmount).sub(stakeAmount)), true); + + // request again should fail + await Utils.expectThrow(gate.acceptStakeRequest(stakerAccount, lock.l, {from: workerAddress1})); + + return {lock: lock, stakingIntentHash: stakingIntentHash} ; + }; describe('Properties', async () => { + before (async () => { + await deployGate(); + }); it('has workers', async () => { assert.equal(await gate.workers.call(), workers); @@ -56,14 +121,174 @@ contract('OpenSTValue', function(accounts) { it('has openSTProtocol', async () => { assert.equal(await gate.openSTProtocol.call(), openSTValue.address); }); - }) + }); describe('requestStake', async () => { + before (async () => { + await deployGate(); + }); - it('happy case', async () => { - assert.equal(await gate.workers.call(), workers); + it('successfully processes request stake', async () => { + await requestStake(); }); + }); - }) + describe('revertStakeRequest', async () => { + + before (async () => { + await deployGate(); + await requestStake(); + }); + + it('successfully processes revert request stake', async () => { + + let initialStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + let revertRequestStakeResult = await gate.revertStakeRequest.call({from: stakerAccount}); + assert.equal(revertRequestStakeResult, true); + + let revertRequestStakeResponse = await gate.revertStakeRequest({from: stakerAccount}); + await Gate_utils.checkStakeRequestRevertedEvent(revertRequestStakeResponse.logs[0],stakerAccount, stakeAmount); + + let finalStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + // check balances + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(stakeAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(stakeAmount)), true); + + // request again should fail + await Utils.expectThrow(gate.revertStakeRequest({from: stakerAccount})); + + }) + }); + + describe('rejectStakeRequest', async () => { + + before (async () => { + await deployGate(); + await requestStake(); + }); + + it('successfully processes reject request stake', async () => { + + let initialStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + let rejectRequestStakeResult = await gate.rejectStakeRequest.call(stakerAccount, {from: workerAddress1}); + assert.equal(rejectRequestStakeResult, true); + + let rejectRequestStakeResponse = await gate.rejectStakeRequest(stakerAccount, {from: workerAddress1}); + await Gate_utils.checkStakeRequestRejectedEvent(rejectRequestStakeResponse.logs[0],stakerAccount, stakeAmount); + let finalStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + // check balances + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(stakeAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(stakeAmount)), true); + + // request again should fail + await Utils.expectThrow(gate.rejectStakeRequest(stakerAccount, {from: workerAddress1})); + + }) + }); + + + describe('acceptStakeRequest', async () => { + + before (async () => { + await deployGate(); + await requestStake(); + }); + + it('successfully processes accept request stake', async () => { + await acceptStakeRequest(); + }) + + }); + + describe('processStaking', async () => { + + before (async () => { + await deployGate(); + await requestStake(); + stakeResult = await acceptStakeRequest(); + stakingIntentHash = stakeResult['stakingIntentHash']; + lock = stakeResult['lock']; + }); + + it('successfully processes', async () => { + + let initialworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + , bountyAmount = await gate.bounty.call() + ; + + let processStakingResult = await gate.processStaking.call(stakingIntentHash, lock.s, {from: workerAddress1}); + assert.equal(processStakingResult, true); + + let processStakingResponse = await gate.processStaking(stakingIntentHash, lock.s, {from: workerAddress1}); + //await Gate_utils.checkProcessedStakeEvent(processStakingResponse.logs[0],stakerAccount, stakeAmount); + + let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.plus(bountyAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); + + // request again should fail + await Utils.expectThrow(gate.processStaking(stakingIntentHash, lock.s, {from: workerAddress1})); + + }) + + }); + + describe('revertStaking', async () => { + + before (async () => { + await deployGate(); + await requestStake(); + stakeResult = await acceptStakeRequest(); + stakingIntentHash = stakeResult['stakingIntentHash']; + }); + + it('successfully processes', async () => { + + let initialworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + , bountyAmount = await gate.bounty.call() + ; + + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (var i = 0; i < waitTime-2 ; i++) { + await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: workerAddress1})); + } + + let revertStakingResponse = await gate.revertStaking(stakingIntentHash, {from: workerAddress1}); + console.log("revertStakingResponse: ",revertStakingResponse); + + let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.plus(bountyAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); + + // request again should fail + await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: workerAddress1})); + + }) + + }) }); + + diff --git a/test/Gate_utils.js b/test/Gate_utils.js index f4b0bd67..4b3c35e6 100644 --- a/test/Gate_utils.js +++ b/test/Gate_utils.js @@ -87,5 +87,57 @@ module.exports.deployGate = async (artifacts, accounts) => { workers: workers, bounty: bounty } +}; + + + +module.exports.checkRequestStakeEvent = (event, _staker, _amount, _beneficiary) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + assert.equal(event.event, "StakeRequested"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); + assert.equal(event.args._beneficiary, _beneficiary); +}; + + +module.exports.checkStakeRequestRevertedEvent = (event, _staker, _amount) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + assert.equal(event.event, "StakeRequestReverted"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); +}; + +module.exports.checkStakeRequestRejectedEvent = (event, _staker, _amount) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + assert.equal(event.event, "StakeRequestRejected"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); +}; + +module.exports.checkStakeRequestAcceptedEvent = (event, _staker, _amount) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + assert.equal(event.event, "StakeRequestAccepted"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); +}; + +module.exports.checkProcessedStakeEvent = (event, _staker, _amount) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + console.log("event: ",event); + assert.equal(event.event, "ProcessedStake"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amountST.toNumber(10), _amount.toNumber(10)); +}; + + -} From 518ff4b9ee645f5ca7d07223f5def538298c5b3a Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 11 May 2018 13:39:45 +0530 Subject: [PATCH 0049/1361] contract: code review changes. MOSA-21, MOSA-28, MOSA-29 --- contracts/Gate.sol | 39 ++++++++++++++++++++++++++++++--------- test/Gate.js | 10 +++++++--- test/Gate_utils.js | 22 ++++++++++++++++++---- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 9ce66261..9a570c41 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -37,7 +37,7 @@ contract Gate is ProtocolVersioned, Owned { event StakeRequestRejected(address _staker, uint256 _amount); event StakeRequestAccepted( address _staker, - uint256 _amount, + uint256 _amountST, uint256 _amountUT, uint256 _nonce, uint256 _unlockHeight, @@ -50,7 +50,7 @@ contract Gate is ProtocolVersioned, Owned { struct StakeRequest { uint256 amount; uint256 unlockHeight; - address beneficiary; //The token holder contract in the future + address beneficiary; bytes32 hashLock; } @@ -173,7 +173,11 @@ contract Gate is ProtocolVersioned, Owned { /// This can be called only by whitelisted worker address function acceptStakeRequest(address _staker, bytes32 _hashLock) external - returns (bool /* success */) + returns ( + uint256 amountUT, + uint256 nonce, + uint256 unlockHeight, + bytes32 stakingIntentHash) { // check if the caller is whitelisted worker //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check @@ -196,11 +200,6 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().approve(openSTProtocol, stakeRequest.amount)); - uint256 amountUT = 0; - uint256 nonce = 0; - uint256 unlockHeight = 0; - bytes32 stakingIntentHash = bytes32(0); - (amountUT, nonce, unlockHeight, stakingIntentHash) = OpenSTValueInterface(openSTProtocol).stake( uuid, stakeRequest.amount, @@ -216,7 +215,7 @@ contract Gate is ProtocolVersioned, Owned { emit StakeRequestAccepted(_staker, stakeRequest.amount, amountUT, nonce, unlockHeight, stakingIntentHash); - return true; + return (amountUT, nonce, unlockHeight, stakingIntentHash); } @@ -231,6 +230,9 @@ contract Gate is ProtocolVersioned, Owned { require(_stakingIntentHash != bytes32(0)); + //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; + //but all staking stateful information will move to the gate contract in v0.9.4 (making OpenST a library call) + //and making this call obsolete address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); StakeRequest storage stakeRequest = stakeRequests[staker]; @@ -247,8 +249,16 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake address is not 0 require(stakerAddress != address(0)); + // TODO: revist this to add worker check + // If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract + // else transfer the bounty to msg.sender. + //if (workers.isWorker(msg.sender)) { + // // Transfer bounty amount to the workers contract address + // require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + //} else { // Transfer bounty amount to the msg.sender account require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); + //} // delete the stake request from the mapping storage delete stakeRequests[staker]; @@ -268,6 +278,9 @@ contract Gate is ProtocolVersioned, Owned { require(_stakingIntentHash != bytes32(0)); + //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; + //but all staking stateful information will move to the gate contract in v0.9.4 (making OpenST a library call) + //and making this call obsolete address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); StakeRequest storage stakeRequest = stakeRequests[staker]; @@ -287,8 +300,16 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake address is not 0 require(stakerAddress != address(0)); + // TODO: revist this to add worker check + // If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract + // else transfer the bounty to msg.sender. + //if (workers.isWorker(msg.sender)) { + // // Transfer bounty amount to the workers contract address + // require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + //} else { // Transfer bounty amount to the msg.sender account require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); + //} // delete the stake request from the mapping storage delete stakeRequests[staker]; diff --git a/test/Gate.js b/test/Gate.js index d25cc67b..d0a1ef39 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -78,12 +78,16 @@ contract('Gate', function(accounts) { await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); let acceptStakeRequestResult = await gate.acceptStakeRequest.call(stakerAccount, lock.l, {from: workerAddress1}); - assert.equal(acceptStakeRequestResult, true); + let amountUT = acceptStakeRequestResult[0]; + let nonce = acceptStakeRequestResult[1]; + let unlockHeight = acceptStakeRequestResult[2].plus(1); + + let stakingIntentHash = await openSTValue.hashStakingIntent.call(uuid, stakerAccount, nonce, beneficiaryAccount, stakeAmount, + amountUT, unlockHeight, lock.l); let acceptStakeRequestResponse = await gate.acceptStakeRequest(stakerAccount, lock.l, {from: workerAddress1}); - await Gate_utils.checkStakeRequestAcceptedEvent(acceptStakeRequestResponse.logs[0],stakerAccount, stakeAmount); + await Gate_utils.checkStakeRequestAcceptedEvent(acceptStakeRequestResponse.logs[0],stakerAccount, stakeAmount, amountUT, nonce, unlockHeight, stakingIntentHash); - const stakingIntentHash = acceptStakeRequestResponse.logs[0].args._stakingIntentHash; let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) , finalGateBalance = await valueToken.balanceOf.call(gate.address) ; diff --git a/test/Gate_utils.js b/test/Gate_utils.js index 4b3c35e6..ad7d080a 100644 --- a/test/Gate_utils.js +++ b/test/Gate_utils.js @@ -120,13 +120,27 @@ module.exports.checkStakeRequestRejectedEvent = (event, _staker, _amount) => { assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); }; -module.exports.checkStakeRequestAcceptedEvent = (event, _staker, _amount) => { - if (Number.isInteger(_amount)) { - _amount = new BigNumber(_amount); + +module.exports.checkStakeRequestAcceptedEvent = (event, _staker, _amountST, _amountUT, _nonce, _unlockHeight, _stakingIntentHash) => { + if (Number.isInteger(_amountST)) { + _amount = new BigNumber(_amountST); + } + if (Number.isInteger(_amountUT)) { + _amount = new BigNumber(_amountUT); + } + if (Number.isInteger(_nonce)) { + _amount = new BigNumber(_nonce); + } + if (Number.isInteger(_unlockHeight)) { + _amount = new BigNumber(_unlockHeight); } assert.equal(event.event, "StakeRequestAccepted"); assert.equal(event.args._staker, _staker); - assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); + assert.equal(event.args._amountST.toNumber(10), _amountST.toNumber(10)); + assert.equal(event.args._amountUT.toNumber(10), _amountUT.toNumber(10)); + assert.equal(event.args._nonce.toNumber(10), _nonce.toNumber(10)); + assert.equal(event.args._unlockHeight.toNumber(10), _unlockHeight.toNumber(10)); + assert.equal(event.args._stakingIntentHash, _stakingIntentHash); }; module.exports.checkProcessedStakeEvent = (event, _staker, _amount) => { From c58206223f75c4d567bbba1c2b9b0abd2c8b0edf Mon Sep 17 00:00:00 2001 From: sarvesh jain Date: Mon, 14 May 2018 13:36:27 +0530 Subject: [PATCH 0050/1361] [MOSA-10] Update constructor syntax with latest style --- contracts/BrandedToken.sol | 2 +- contracts/Core.sol | 2 +- contracts/EIP20Token.sol | 2 +- contracts/EIP20TokenMock.sol | 3 ++- contracts/OpenSTUtility.sol | 2 +- contracts/OpenSTUtilityMock.sol | 2 +- contracts/OpenSTValue.sol | 2 +- contracts/OpenSTValueMock.sol | 2 +- contracts/OpsManaged.sol | 2 +- contracts/Owned.sol | 2 +- contracts/ProtocolVersioned.sol | 2 +- contracts/ProtocolVersionedMock.sol | 2 +- contracts/Registrar.sol | 2 +- contracts/STPrime.sol | 2 +- contracts/SimpleStake.sol | 2 +- contracts/SimpleToken/ERC20Token.sol | 2 +- contracts/SimpleToken/MockToken.sol | 2 +- contracts/SimpleToken/OpsManaged.sol | 2 +- contracts/SimpleToken/Owned.sol | 2 +- contracts/SimpleToken/SimpleToken.sol | 2 +- contracts/UtilityTokenAbstract.sol | 2 +- contracts/UtilityTokenAbstractMock.sol | 3 ++- 22 files changed, 24 insertions(+), 22 deletions(-) diff --git a/contracts/BrandedToken.sol b/contracts/BrandedToken.sol index 083efd2b..1a5ecb47 100644 --- a/contracts/BrandedToken.sol +++ b/contracts/BrandedToken.sol @@ -45,7 +45,7 @@ contract BrandedToken is EIP20Token, UtilityTokenAbstract { /* * Public functions */ - function BrandedToken( + constructor( bytes32 _uuid, string _symbol, string _name, diff --git a/contracts/Core.sol b/contracts/Core.sol index 4583bc41..7c163410 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -56,7 +56,7 @@ contract Core is CoreInterface { /* * Public functions */ - function Core( + constructor( address _registrar, uint256 _chainIdOrigin, uint256 _chainIdRemote, diff --git a/contracts/EIP20Token.sol b/contracts/EIP20Token.sol index 8f68d2fe..745f8681 100644 --- a/contracts/EIP20Token.sol +++ b/contracts/EIP20Token.sol @@ -39,7 +39,7 @@ contract EIP20Token is EIP20Interface { mapping(address => mapping (address => uint256)) allowed; - function EIP20Token(string _symbol, string _name, uint8 _decimals) public + constructor(string _symbol, string _name, uint8 _decimals) public { tokenSymbol = _symbol; tokenName = _name; diff --git a/contracts/EIP20TokenMock.sol b/contracts/EIP20TokenMock.sol index 90fb3eb3..e152fa40 100644 --- a/contracts/EIP20TokenMock.sol +++ b/contracts/EIP20TokenMock.sol @@ -26,7 +26,8 @@ import "./EIP20Token.sol"; /// @title EIP20TokenMock /// @dev Implements mock totalSupply function and wraps internal functions to enable testing EIP20Token contract EIP20TokenMock is EIP20Token { - function EIP20TokenMock(string _symbol, string _name, uint8 _decimals) + + constructor(string _symbol, string _name, uint8 _decimals) EIP20Token(_symbol, _name, _decimals) public { } diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 1d2cb345..7cb393ed 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -139,7 +139,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _; } - function OpenSTUtility( + constructor( uint256 _chainIdValue, uint256 _chainIdUtility, address _registrar) diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol index 3895310b..4c6e961e 100644 --- a/contracts/OpenSTUtilityMock.sol +++ b/contracts/OpenSTUtilityMock.sol @@ -32,7 +32,7 @@ contract OpenSTUtilityMock is OpenSTUtility { /* * Public functions */ - function OpenSTUtilityMock( + constructor( uint256 _chainIdValue, uint256 _chainIdUtility, address _registrar) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 135062ab..f70d1459 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -138,7 +138,7 @@ contract OpenSTValue is OpsManaged, Hasher { _; } - function OpenSTValue( + constructor( uint256 _chainIdValue, EIP20Interface _eip20token, address _registrar) diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index ea329833..7db5f769 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -32,7 +32,7 @@ contract OpenSTValueMock is OpenSTValue { /* * Public functions */ - function OpenSTValueMock( + constructor( uint256 _chainIdValue, EIP20Interface _eip20token, address _registrar) diff --git a/contracts/OpsManaged.sol b/contracts/OpsManaged.sol index 34037873..2cc0068d 100644 --- a/contracts/OpsManaged.sol +++ b/contracts/OpsManaged.sol @@ -36,7 +36,7 @@ contract OpsManaged is Owned { event OpsAddressChanged(address indexed _newAddress); - function OpsManaged() public + constructor() public Owned() { } diff --git a/contracts/Owned.sol b/contracts/Owned.sol index d748cf7a..13d483d4 100644 --- a/contracts/Owned.sol +++ b/contracts/Owned.sol @@ -34,7 +34,7 @@ contract Owned { event OwnershipTransferCompleted(address indexed _newOwner); - function Owned() public { + constructor() public { owner = msg.sender; } diff --git a/contracts/ProtocolVersioned.sol b/contracts/ProtocolVersioned.sol index 51bee169..05332088 100644 --- a/contracts/ProtocolVersioned.sol +++ b/contracts/ProtocolVersioned.sol @@ -81,7 +81,7 @@ contract ProtocolVersioned { * Public functions */ /// @dev Constructor set the OpenST Protocol - function ProtocolVersioned(address _protocol) + constructor(address _protocol) public notNull(_protocol) { diff --git a/contracts/ProtocolVersionedMock.sol b/contracts/ProtocolVersionedMock.sol index 28d70291..04347cd0 100644 --- a/contracts/ProtocolVersionedMock.sol +++ b/contracts/ProtocolVersionedMock.sol @@ -31,7 +31,7 @@ contract ProtocolVersionedMock is ProtocolVersioned { /* * Public functions */ - function ProtocolVersionedMock(address _protocol) + constructor(address _protocol) ProtocolVersioned(_protocol) public { } diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index 8452a605..b22032f3 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -37,7 +37,7 @@ contract Registrar is OpsManaged { /* * Public functions */ - function Registrar() public + constructor() public OpsManaged() { } diff --git a/contracts/STPrime.sol b/contracts/STPrime.sol index 11a362d5..e656bdbf 100644 --- a/contracts/STPrime.sol +++ b/contracts/STPrime.sol @@ -64,7 +64,7 @@ contract STPrime is UtilityTokenAbstract, STPrimeConfig { /* * Public functions */ - function STPrime( + constructor( bytes32 _uuid, uint256 _chainIdValue, uint256 _chainIdUtility, diff --git a/contracts/SimpleStake.sol b/contracts/SimpleStake.sol index fb72c3b1..0684a72f 100644 --- a/contracts/SimpleStake.sol +++ b/contracts/SimpleStake.sol @@ -51,7 +51,7 @@ contract SimpleStake is ProtocolVersioned { /// @param _eip20Token EIP20 token that will be staked /// @param _openSTProtocol OpenSTProtocol contract that governs staking /// @param _uuid Unique Universal Identifier of the registered utility token - function SimpleStake( + constructor( EIP20Interface _eip20Token, address _openSTProtocol, bytes32 _uuid) diff --git a/contracts/SimpleToken/ERC20Token.sol b/contracts/SimpleToken/ERC20Token.sol index bb915a54..4aa7e3f1 100644 --- a/contracts/SimpleToken/ERC20Token.sol +++ b/contracts/SimpleToken/ERC20Token.sol @@ -30,7 +30,7 @@ contract ERC20Token is ERC20Interface, Owned { mapping(address => mapping (address => uint256)) allowed; - function ERC20Token(string _symbol, string _name, uint8 _decimals, uint256 _totalSupply) public + constructor(string _symbol, string _name, uint8 _decimals, uint256 _totalSupply) public Owned() { tokenSymbol = _symbol; diff --git a/contracts/SimpleToken/MockToken.sol b/contracts/SimpleToken/MockToken.sol index f0da8c26..3ce7b35c 100644 --- a/contracts/SimpleToken/MockToken.sol +++ b/contracts/SimpleToken/MockToken.sol @@ -22,7 +22,7 @@ contract MockToken is ERC20Token, OpsManaged, SimpleTokenConfig { // Events event Finalized(); - function MockToken() public + constructor() public ERC20Token("MOCK", "Mock Token", TOKEN_DECIMALS, TOKENS_MAX) OpsManaged() { } diff --git a/contracts/SimpleToken/OpsManaged.sol b/contracts/SimpleToken/OpsManaged.sol index 5bbc84c5..de1a6990 100644 --- a/contracts/SimpleToken/OpsManaged.sol +++ b/contracts/SimpleToken/OpsManaged.sol @@ -36,7 +36,7 @@ contract OpsManaged is Owned { event OpsAddressChanged(address indexed _newAddress); - function OpsManaged() public + constructor() public Owned() { } diff --git a/contracts/SimpleToken/Owned.sol b/contracts/SimpleToken/Owned.sol index 6696c6ee..defb9f4d 100644 --- a/contracts/SimpleToken/Owned.sol +++ b/contracts/SimpleToken/Owned.sol @@ -22,7 +22,7 @@ contract Owned { event OwnershipTransferCompleted(address indexed _newOwner); - function Owned() public { + constructor() public { owner = msg.sender; } diff --git a/contracts/SimpleToken/SimpleToken.sol b/contracts/SimpleToken/SimpleToken.sol index ae793094..da35a8cf 100644 --- a/contracts/SimpleToken/SimpleToken.sol +++ b/contracts/SimpleToken/SimpleToken.sol @@ -43,7 +43,7 @@ contract SimpleToken is ERC20Token, OpsManaged, SimpleTokenConfig { event Finalized(); - function SimpleToken() public + constructor() public ERC20Token(TOKEN_SYMBOL, TOKEN_NAME, TOKEN_DECIMALS, TOKENS_MAX) OpsManaged() { diff --git a/contracts/UtilityTokenAbstract.sol b/contracts/UtilityTokenAbstract.sol index 5bb89670..a980b9e7 100644 --- a/contracts/UtilityTokenAbstract.sol +++ b/contracts/UtilityTokenAbstract.sol @@ -70,7 +70,7 @@ contract UtilityTokenAbstract is Hasher, ProtocolVersioned, UtilityTokenInterfac /* * Public functions */ - function UtilityTokenAbstract( + constructor( bytes32 _uuid, string _symbol, string _name, diff --git a/contracts/UtilityTokenAbstractMock.sol b/contracts/UtilityTokenAbstractMock.sol index ceade695..2ff0c028 100644 --- a/contracts/UtilityTokenAbstractMock.sol +++ b/contracts/UtilityTokenAbstractMock.sol @@ -29,7 +29,8 @@ import "./UtilityTokenAbstract.sol"; /// @dev Implements mock claim, mint, and burn functions /// and wraps internal functions to enable testing UtilityTokenAbstract contract UtilityTokenAbstractMock is UtilityTokenAbstract { - function UtilityTokenAbstractMock( + + constructor( bytes32 _uuid, string _symbol, string _name, From 5f31dee1bb9bf9d6f3898de9796aa52c7f6de213 Mon Sep 17 00:00:00 2001 From: sarvesh jain Date: Mon, 14 May 2018 14:02:19 +0530 Subject: [PATCH 0051/1361] [MOSA-10] Adding emit statement for event generation --- contracts/EIP20Token.sol | 8 ++++---- contracts/OpenSTUtility.sol | 18 +++++++++--------- contracts/OpenSTValue.sol | 14 +++++++------- contracts/OpsManaged.sol | 4 ++-- contracts/Owned.sol | 4 ++-- contracts/ProtocolVersioned.sol | 6 +++--- contracts/SimpleStake.sol | 2 +- contracts/SimpleToken/ERC20Token.sol | 8 ++++---- contracts/SimpleToken/OpsManaged.sol | 4 ++-- contracts/SimpleToken/Owned.sol | 4 ++-- contracts/SimpleToken/SimpleToken.sol | 4 ++-- contracts/UtilityTokenAbstract.sol | 4 ++-- 12 files changed, 40 insertions(+), 40 deletions(-) diff --git a/contracts/EIP20Token.sol b/contracts/EIP20Token.sol index 745f8681..4b1f642f 100644 --- a/contracts/EIP20Token.sol +++ b/contracts/EIP20Token.sol @@ -79,7 +79,7 @@ contract EIP20Token is EIP20Interface { balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); - Transfer(msg.sender, _to, _value); + emit Transfer(msg.sender, _to, _value); return true; } @@ -90,7 +90,7 @@ contract EIP20Token is EIP20Interface { allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); - Transfer(_from, _to, _value); + emit Transfer(_from, _to, _value); return true; } @@ -100,7 +100,7 @@ contract EIP20Token is EIP20Interface { allowed[msg.sender][_spender] = _value; - Approval(msg.sender, _spender, _value); + emit Approval(msg.sender, _spender, _value); return true; } @@ -111,7 +111,7 @@ contract EIP20Token is EIP20Interface { balances[address(this)] = balances[address(this)].sub(_amount); balances[_beneficiary] = balances[_beneficiary].add(_amount); - Transfer(address(this), _beneficiary, _amount); + emit Transfer(address(this), _beneficiary, _amount); return true; } diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 7cb393ed..78a5088c 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -236,7 +236,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { hashLock: _hashLock }); - StakingIntentConfirmed(_uuid, stakingIntentHash, _staker, _beneficiary, _amountST, + emit StakingIntentConfirmed(_uuid, stakingIntentHash, _staker, _beneficiary, _amountST, _amountUT, expirationHeight); return expirationHeight; @@ -265,7 +265,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(token.mint(mint.beneficiary, mint.amount)); - ProcessedMint(mint.uuid, _stakingIntentHash, tokenAddress, mint.staker, + emit ProcessedMint(mint.uuid, _stakingIntentHash, tokenAddress, mint.staker, mint.beneficiary, mint.amount, _unlockSecret); delete mints[_stakingIntentHash]; @@ -298,7 +298,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { delete mints[_stakingIntentHash]; - RevertedMint(uuid, _stakingIntentHash, staker, beneficiary, amount); + emit RevertedMint(uuid, _stakingIntentHash, staker, beneficiary, amount); return (uuid, staker, beneficiary, amount); } @@ -359,7 +359,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { hashLock: _hashLock }); - RedemptionIntentDeclared(_uuid, redemptionIntentHash, address(token), + emit RedemptionIntentDeclared(_uuid, redemptionIntentHash, address(token), msg.sender, _nonce, _beneficiary, _amountBT, unlockHeight, chainIdValue); return (unlockHeight, redemptionIntentHash); @@ -410,7 +410,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { hashLock: _hashLock }); - RedemptionIntentDeclared(uuidSTPrime, redemptionIntentHash, simpleTokenPrime, + emit RedemptionIntentDeclared(uuidSTPrime, redemptionIntentHash, simpleTokenPrime, msg.sender, _nonce, _beneficiary, amountSTP, unlockHeight, chainIdValue); return (amountSTP, unlockHeight, redemptionIntentHash); @@ -443,7 +443,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(token.burn.value(value)(redemption.redeemer, redemption.amountUT)); - ProcessedRedemption(redemption.uuid, _redemptionIntentHash, token, + emit ProcessedRedemption(redemption.uuid, _redemptionIntentHash, token, redemption.redeemer, redemption.beneficiary, redemption.amountUT, _unlockSecret); delete redemptions[_redemptionIntentHash]; @@ -485,7 +485,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { delete redemptions[_redemptionIntentHash]; // fire event - RevertedRedemption(uuid, _redemptionIntentHash, redeemer, beneficiary, amountUT); + emit RevertedRedemption(uuid, _redemptionIntentHash, redeemer, beneficiary, amountUT); return (uuid, redeemer, beneficiary, amountUT); } @@ -538,7 +538,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { // registrar nameReservation[hashName] = msg.sender; - ProposedBrandedToken(msg.sender, address(proposedBT), btUuid, + emit ProposedBrandedToken(msg.sender, address(proposedBT), btUuid, _symbol, _name, _conversionRate, _conversionRateDecimals); return btUuid; @@ -647,7 +647,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { symbolRoute[hashSymbol] = _brandedToken; uuids.push(registeredUuid); - RegisteredBrandedToken(registrar, _brandedToken, registeredUuid, _symbol, _name, + emit RegisteredBrandedToken(registrar, _brandedToken, registeredUuid, _symbol, _name, _conversionRate, _conversionRateDecimals, _requester); return registeredUuid; diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index f70d1459..2c88a29a 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -223,7 +223,7 @@ contract OpenSTValue is OpsManaged, Hasher { hashLock: _hashLock }); - StakingIntentDeclared(_uuid, tx.origin, nonce, _beneficiary, + emit StakingIntentDeclared(_uuid, tx.origin, nonce, _beneficiary, _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); return (amountUT, nonce, unlockHeight, stakingIntentHash); @@ -254,7 +254,7 @@ contract OpenSTValue is OpsManaged, Hasher { assert(valueToken.balanceOf(address(this)) >= stake.amountST); require(valueToken.transfer(stakeAddress, stake.amountST)); - ProcessedStake(stake.uuid, _stakingIntentHash, stakeAddress, stake.staker, + emit ProcessedStake(stake.uuid, _stakingIntentHash, stakeAddress, stake.staker, stake.amountST, stake.amountUT, _unlockSecret); delete stakes[_stakingIntentHash]; @@ -286,7 +286,7 @@ contract OpenSTValue is OpsManaged, Hasher { amountST = stake.amountST; staker = stake.staker; - RevertedStake(stake.uuid, _stakingIntentHash, stake.staker, + emit RevertedStake(stake.uuid, _stakingIntentHash, stake.staker, stake.amountST, stake.amountUT); delete stakes[_stakingIntentHash]; @@ -352,7 +352,7 @@ contract OpenSTValue is OpsManaged, Hasher { hashLock: _hashLock }); - RedemptionIntentConfirmed(_uuid, redemptionIntentHash, _redeemer, + emit RedemptionIntentConfirmed(_uuid, redemptionIntentHash, _redeemer, _beneficiary, amountST, _amountUT, expirationHeight); return (amountST, expirationHeight); @@ -383,7 +383,7 @@ contract OpenSTValue is OpsManaged, Hasher { require(utilityToken.simpleStake.releaseTo(unstake.beneficiary, unstake.amountST)); - ProcessedUnstake(unstake.uuid, _redemptionIntentHash, stakeAddress, + emit ProcessedUnstake(unstake.uuid, _redemptionIntentHash, stakeAddress, unstake.redeemer, unstake.beneficiary, unstake.amountST, _unlockSecret); delete unstakes[_redemptionIntentHash]; @@ -416,7 +416,7 @@ contract OpenSTValue is OpsManaged, Hasher { delete unstakes[_redemptionIntentHash]; - RevertedUnstake(uuid, _redemptionIntentHash, redeemer, beneficiary, amountST); + emit RevertedUnstake(uuid, _redemptionIntentHash, redeemer, beneficiary, amountST); return (uuid, redeemer, beneficiary, amountST); } @@ -527,7 +527,7 @@ contract OpenSTValue is OpsManaged, Hasher { }); uuids.push(uuid); - UtilityTokenRegistered(uuid, address(simpleStake), _symbol, _name, + emit UtilityTokenRegistered(uuid, address(simpleStake), _symbol, _name, TOKEN_DECIMALS, _conversionRate, _conversionRateDecimals, _chainIdUtility, _stakingAccount); return uuid; diff --git a/contracts/OpsManaged.sol b/contracts/OpsManaged.sol index 2cc0068d..111ea90f 100644 --- a/contracts/OpsManaged.sol +++ b/contracts/OpsManaged.sol @@ -89,7 +89,7 @@ contract OpsManaged is Owned { adminAddress = _adminAddress; - AdminAddressChanged(_adminAddress); + emit AdminAddressChanged(_adminAddress); return true; } @@ -103,7 +103,7 @@ contract OpsManaged is Owned { opsAddress = _opsAddress; - OpsAddressChanged(_opsAddress); + emit OpsAddressChanged(_opsAddress); return true; } diff --git a/contracts/Owned.sol b/contracts/Owned.sol index 13d483d4..336b4f80 100644 --- a/contracts/Owned.sol +++ b/contracts/Owned.sol @@ -53,7 +53,7 @@ contract Owned { function initiateOwnershipTransfer(address _proposedOwner) public onlyOwner returns (bool) { proposedOwner = _proposedOwner; - OwnershipTransferInitiated(_proposedOwner); + emit OwnershipTransferInitiated(_proposedOwner); return true; } @@ -65,7 +65,7 @@ contract Owned { owner = proposedOwner; proposedOwner = address(0); - OwnershipTransferCompleted(owner); + emit OwnershipTransferCompleted(owner); return true; } diff --git a/contracts/ProtocolVersioned.sol b/contracts/ProtocolVersioned.sol index 05332088..15eb95d1 100644 --- a/contracts/ProtocolVersioned.sol +++ b/contracts/ProtocolVersioned.sol @@ -102,7 +102,7 @@ contract ProtocolVersioned { earliestTransferHeight = block.number + blocksToWaitForProtocolTransfer(); proposedProtocol = _proposedProtocol; - ProtocolTransferInitiated(openSTProtocol, _proposedProtocol, earliestTransferHeight); + emit ProtocolTransferInitiated(openSTProtocol, _proposedProtocol, earliestTransferHeight); return true; } @@ -119,7 +119,7 @@ contract ProtocolVersioned { proposedProtocol = address(0); earliestTransferHeight = 0; - ProtocolTransferCompleted(openSTProtocol); + emit ProtocolTransferCompleted(openSTProtocol); return true; } @@ -137,7 +137,7 @@ contract ProtocolVersioned { proposedProtocol = address(0); earliestTransferHeight = 0; - ProtocolTransferRevoked(openSTProtocol, revokedProtocol); + emit ProtocolTransferRevoked(openSTProtocol, revokedProtocol); return true; } diff --git a/contracts/SimpleStake.sol b/contracts/SimpleStake.sol index 0684a72f..a3304de1 100644 --- a/contracts/SimpleStake.sol +++ b/contracts/SimpleStake.sol @@ -77,7 +77,7 @@ contract SimpleStake is ProtocolVersioned { require(_to != address(0)); require(eip20Token.transfer(_to, _amount)); - ReleasedStake(msg.sender, _to, _amount); + emit ReleasedStake(msg.sender, _to, _amount); return true; } diff --git a/contracts/SimpleToken/ERC20Token.sol b/contracts/SimpleToken/ERC20Token.sol index 4aa7e3f1..10c43b73 100644 --- a/contracts/SimpleToken/ERC20Token.sol +++ b/contracts/SimpleToken/ERC20Token.sol @@ -41,7 +41,7 @@ contract ERC20Token is ERC20Interface, Owned { // According to the ERC20 standard, a token contract which creates new tokens should trigger // a Transfer event and transfers of 0 values must also fire the event. - Transfer(0x0, owner, _totalSupply); + emit Transfer(0x0, owner, _totalSupply); } @@ -82,7 +82,7 @@ contract ERC20Token is ERC20Interface, Owned { balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); - Transfer(msg.sender, _to, _value); + emit Transfer(msg.sender, _to, _value); return true; } @@ -93,7 +93,7 @@ contract ERC20Token is ERC20Interface, Owned { allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); - Transfer(_from, _to, _value); + emit Transfer(_from, _to, _value); return true; } @@ -103,7 +103,7 @@ contract ERC20Token is ERC20Interface, Owned { allowed[msg.sender][_spender] = _value; - Approval(msg.sender, _spender, _value); + emit Approval(msg.sender, _spender, _value); return true; } diff --git a/contracts/SimpleToken/OpsManaged.sol b/contracts/SimpleToken/OpsManaged.sol index de1a6990..56986c6d 100644 --- a/contracts/SimpleToken/OpsManaged.sol +++ b/contracts/SimpleToken/OpsManaged.sol @@ -89,7 +89,7 @@ contract OpsManaged is Owned { adminAddress = _adminAddress; - AdminAddressChanged(_adminAddress); + emit AdminAddressChanged(_adminAddress); return true; } @@ -103,7 +103,7 @@ contract OpsManaged is Owned { opsAddress = _opsAddress; - OpsAddressChanged(_opsAddress); + emit OpsAddressChanged(_opsAddress); return true; } diff --git a/contracts/SimpleToken/Owned.sol b/contracts/SimpleToken/Owned.sol index defb9f4d..bb6ac9aa 100644 --- a/contracts/SimpleToken/Owned.sol +++ b/contracts/SimpleToken/Owned.sol @@ -41,7 +41,7 @@ contract Owned { function initiateOwnershipTransfer(address _proposedOwner) public onlyOwner returns (bool) { proposedOwner = _proposedOwner; - OwnershipTransferInitiated(_proposedOwner); + emit OwnershipTransferInitiated(_proposedOwner); return true; } @@ -53,7 +53,7 @@ contract Owned { owner = proposedOwner; proposedOwner = address(0); - OwnershipTransferCompleted(owner); + emit OwnershipTransferCompleted(owner); return true; } diff --git a/contracts/SimpleToken/SimpleToken.sol b/contracts/SimpleToken/SimpleToken.sol index da35a8cf..d246f395 100644 --- a/contracts/SimpleToken/SimpleToken.sol +++ b/contracts/SimpleToken/SimpleToken.sol @@ -88,7 +88,7 @@ contract SimpleToken is ERC20Token, OpsManaged, SimpleTokenConfig { balances[msg.sender] = balances[msg.sender].sub(_value); tokenTotalSupply = tokenTotalSupply.sub(_value); - Burnt(msg.sender, _value); + emit Burnt(msg.sender, _value); return true; } @@ -100,7 +100,7 @@ contract SimpleToken is ERC20Token, OpsManaged, SimpleTokenConfig { finalized = true; - Finalized(); + emit Finalized(); return true; } diff --git a/contracts/UtilityTokenAbstract.sol b/contracts/UtilityTokenAbstract.sol index a980b9e7..b6e1d8fc 100644 --- a/contracts/UtilityTokenAbstract.sol +++ b/contracts/UtilityTokenAbstract.sol @@ -199,7 +199,7 @@ contract UtilityTokenAbstract is Hasher, ProtocolVersioned, UtilityTokenInterfac totalTokenSupply = totalTokenSupply.add(_amount); claims[_beneficiary] = claims[_beneficiary].add(_amount); - Minted(tokenUuid, _beneficiary, _amount, claims[_beneficiary], totalTokenSupply); + emit Minted(tokenUuid, _beneficiary, _amount, claims[_beneficiary], totalTokenSupply); return true; } @@ -214,7 +214,7 @@ contract UtilityTokenAbstract is Hasher, ProtocolVersioned, UtilityTokenInterfac { totalTokenSupply = totalTokenSupply.sub(_amount); - Burnt(tokenUuid, _burner, _amount, totalTokenSupply); + emit Burnt(tokenUuid, _burner, _amount, totalTokenSupply); return true; } From 45dcceed0afa3c72c546912a7c0e43453d939f04 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 14 May 2018 19:21:09 +0530 Subject: [PATCH 0052/1361] contract: Workers integrated --- contracts/Gate.sol | 52 +++++++++++++-------------- contracts/WorkersInterface.sol | 66 ++++++++++++++++++++++++++++++++++ test/Gate.js | 12 +++++-- test/Gate_utils.js | 26 +++++++++----- 4 files changed, 116 insertions(+), 40 deletions(-) create mode 100644 contracts/WorkersInterface.sol diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 9a570c41..2ebe040e 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -26,6 +26,7 @@ import "./ProtocolVersioned.sol"; import "./OpenSTValueInterface.sol"; import "./EIP20Interface.sol"; import "./Owned.sol"; +import "./WorkersInterface.sol"; contract Gate is ProtocolVersioned, Owned { @@ -57,7 +58,7 @@ contract Gate is ProtocolVersioned, Owned { /* * Storage */ - address public workers; //TODO: update type once workers contract and interfaces are added to the repo. + WorkersInterface public workers; // stake requests mapping(address /*staker */ => StakeRequest) public stakeRequests; @@ -84,7 +85,7 @@ contract Gate is ProtocolVersioned, Owned { require(_workers != address(0)); require(_uuid.length != uint8(0)); - workers = _workers; + workers = WorkersInterface(_workers); bounty = _bounty; uuid = _uuid; @@ -147,7 +148,7 @@ contract Gate is ProtocolVersioned, Owned { returns (bool /* success */) { // check if the caller is whitelisted worker - //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check + require(workers.isWorker(msg.sender)); StakeRequest storage stakeRequest = stakeRequests[_staker]; @@ -180,7 +181,7 @@ contract Gate is ProtocolVersioned, Owned { bytes32 stakingIntentHash) { // check if the caller is whitelisted worker - //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check + require(workers.isWorker(msg.sender)); StakeRequest storage stakeRequest = stakeRequests[_staker]; @@ -226,7 +227,7 @@ contract Gate is ProtocolVersioned, Owned { returns (bool /* success */) { // check if the caller is whitelisted worker - //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check + require(workers.isWorker(msg.sender)); require(_stakingIntentHash != bytes32(0)); @@ -249,16 +250,15 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake address is not 0 require(stakerAddress != address(0)); - // TODO: revist this to add worker check - // If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract - // else transfer the bounty to msg.sender. - //if (workers.isWorker(msg.sender)) { - // // Transfer bounty amount to the workers contract address - // require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); - //} else { - // Transfer bounty amount to the msg.sender account - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); - //} + //If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract + //else transfer the bounty to msg.sender. + if (workers.isWorker(msg.sender)) { + // Transfer bounty amount to the workers contract address + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + } else { + //Transfer bounty amount to the msg.sender account + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); + } // delete the stake request from the mapping storage delete stakeRequests[staker]; @@ -273,9 +273,6 @@ contract Gate is ProtocolVersioned, Owned { returns (bool /* success */) { - // check if the caller is whitelisted worker - //require(workers.isWorker(msg.sender)); //TODO: revist this to add worker check - require(_stakingIntentHash != bytes32(0)); //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; @@ -300,16 +297,15 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake address is not 0 require(stakerAddress != address(0)); - // TODO: revist this to add worker check - // If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract - // else transfer the bounty to msg.sender. - //if (workers.isWorker(msg.sender)) { - // // Transfer bounty amount to the workers contract address - // require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); - //} else { - // Transfer bounty amount to the msg.sender account - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); - //} + //If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract + //else transfer the bounty to msg.sender. + if (workers.isWorker(msg.sender)) { + // Transfer bounty amount to the workers contract address + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + } else { + //Transfer bounty amount to the msg.sender account + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); + } // delete the stake request from the mapping storage delete stakeRequests[staker]; diff --git a/contracts/WorkersInterface.sol b/contracts/WorkersInterface.sol new file mode 100644 index 00000000..083a517c --- /dev/null +++ b/contracts/WorkersInterface.sol @@ -0,0 +1,66 @@ +pragma solidity ^0.4.23; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: WorkersInterface +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +/// A set of authorised workers +contract WorkersInterface { + + function setWorker( + address _worker, + uint256 _deactivationHeight) + external + returns (uint256 /* remaining activation length */); + + /// @dev Takes _worker; + /// removes the worker; + /// external method; + /// @param _worker worker + /// @return (existed) + function removeWorker( + address _worker) + external + returns (bool /* existed */); + + /// @dev Clean up or collectively revoke all workers; + /// external method; + /// only called by ops or admin; + function remove() + external; + + /// @dev Takes _worker; + /// checks if the worker is valid; + /// external method; + /// @param _worker worker + /// @return (isValid) + function isWorker( + address _worker) + external + view + returns (bool /* is active worker */); + + function approve( + address _spender, + uint256 _amount) + external + returns (bool success); + +} \ No newline at end of file diff --git a/test/Gate.js b/test/Gate.js index d0a1ef39..16c2c96b 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -29,7 +29,6 @@ contract('Gate', function(accounts) { var stakerAccount = accounts[0] , stakeAmount = new BigNumber(web3.toWei(1000, "ether")) , beneficiaryAccount = accounts[6] - , workerAddress1 = accounts[7]; ; const deployGate = async function() { @@ -40,6 +39,7 @@ contract('Gate', function(accounts) { gate = result.gate; workers = result.workers; bounty = result.bounty; + workerAddress1 = result.workerAddress1; }; const requestStake = async function () { @@ -228,6 +228,7 @@ contract('Gate', function(accounts) { it('successfully processes', async () => { let initialworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + , initialWorkerBalance = await valueToken.balanceOf.call(workers) , initialGateBalance = await valueToken.balanceOf.call(gate.address) , bountyAmount = await gate.bounty.call() ; @@ -240,10 +241,12 @@ contract('Gate', function(accounts) { let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) , finalGateBalance = await valueToken.balanceOf.call(gate.address) + , finalWorkerBalance = await valueToken.balanceOf.call(workers) ; // check balances - assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.plus(bountyAmount)), true); + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); // request again should fail @@ -265,6 +268,7 @@ contract('Gate', function(accounts) { it('successfully processes', async () => { let initialworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + , initialWorkerBalance = await valueToken.balanceOf.call(workers) , initialGateBalance = await valueToken.balanceOf.call(gate.address) , bountyAmount = await gate.bounty.call() ; @@ -281,10 +285,12 @@ contract('Gate', function(accounts) { let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) , finalGateBalance = await valueToken.balanceOf.call(gate.address) + , finalWorkerBalance = await valueToken.balanceOf.call(workers) ; // check balances - assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.plus(bountyAmount)), true); + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); // request again should fail diff --git a/test/Gate_utils.js b/test/Gate_utils.js index ad7d080a..1c6fd421 100644 --- a/test/Gate_utils.js +++ b/test/Gate_utils.js @@ -25,6 +25,7 @@ const OpenSTValue_utils = require('./OpenSTValue_utils.js') , Core = artifacts.require("./Core.sol") , SimpleStake = artifacts.require("./SimpleStake.sol") , Gate = artifacts.require("./Gate.sol") + , Workers = artifacts.require("./Workers.sol") ; const Assert = require('assert') @@ -38,13 +39,14 @@ module.exports.deployGate = async (artifacts, accounts) => { , chainIdRemote = 1410 , openSTRemote = accounts[4] , valueToken = await SimpleToken.new() - , registrar = accounts[1] , symbol = "ST" , name = "Simple Token" , conversionRateDecimals = 5 , conversionRate = new BigNumber(10 * 10**conversionRateDecimals) // conversion rate => 10 - , workers = accounts[2] , bounty = 100 + , admin = accounts[3] + , ops = accounts[1] + , registrar = accounts[5] ; var core = null @@ -52,17 +54,22 @@ module.exports.deployGate = async (artifacts, accounts) => { , checkUuid = null ; - // Set SimpleToken admin in order to finalize SimpleToken - await valueToken.setAdminAddress(accounts[1]); + await valueToken.setAdminAddress(admin); // SimpleToken must be finalized to permit certain transfers - assert.ok(await valueToken.finalize({ from: accounts[1] })); + assert.ok(await valueToken.finalize({ from: admin })); openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); await openSTValue.addCore(core.address, { from: registrar }); + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, new BigNumber(web3.toWei(10, "ether")), {from:ops}); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); assert.equal(await openSTValue.registerUtilityToken.call(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }), checkUuid); @@ -77,15 +84,16 @@ module.exports.deployGate = async (artifacts, accounts) => { assert.equal(await openSTValue.getUuidsSize.call(), 1); assert.equal((await openSTValue.utilityTokens.call(checkUuid))[0], symbol); - const gate = await Gate.new(workers, bounty, checkUuid, openSTValue.address); + const gate = await Gate.new(workers.address, bounty, checkUuid, openSTValue.address); return { valueToken : valueToken, openSTValue : openSTValue, uuid: checkUuid, gate: gate, - workers: workers, - bounty: bounty + workers: workers.address, + bounty: bounty, + workerAddress1: worker1 } }; From 6310bfe0a0a0adc012ccff6a9e96ba42403b92c4 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 14 May 2018 19:42:41 +0530 Subject: [PATCH 0053/1361] truffle: fixed breaking truffle testcases --- test/OpenSTValue.js | 36 ++++++++++++++++++------------------ test/Protocol.js | 10 +++++----- test/Registrar.js | 4 ++-- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index f7e81778..78634596 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -226,26 +226,26 @@ contract('OpenSTValue', function(accounts) { }) it('fails to stake when amount is not > 0', async () => { - await Utils.expectThrow(openSTValue.stake(checkUuid, 0, accounts[0], lock.l, { from: accounts[0] })); + await Utils.expectThrow(openSTValue.stake(checkUuid, 0, accounts[0], lock.l, accounts[0], { from: accounts[0] })); }) it('fails to stake when msg.sender has not approved it to transfer at least the amount', async () => { - await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] })); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] })); }) it('fails to stake when the SimpleStake address for the given UUID is null', async () => { await valueToken.approve(openSTValue.address, amountST, { from: accounts[0] }); - await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] })); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] })); }) it('fails to stake when the beneficiary is null', async () => { checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); - await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, 0, lock.l, { from: accounts[0] })); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, 0, lock.l, accounts[0], { from: accounts[0] })); }) it('successfully stakes', async () => { - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); var amountUT = stakeReturns[0].toNumber(); nonce = stakeReturns[1].toNumber(); @@ -253,7 +253,7 @@ contract('OpenSTValue', function(accounts) { var unlockHeight = stakeReturns[2].plus(1); stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, lock.l); - result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); @@ -274,11 +274,11 @@ contract('OpenSTValue', function(accounts) { }) it('fails to stake when msg.sender is not the stakingAccount', async () => { - await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[1] })); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[1], { from: accounts[1] })); }) it('successfully stakes', async () => { - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); var amountUT = stakeReturns[0].toNumber(); nonce = stakeReturns[1].toNumber(); @@ -286,7 +286,7 @@ contract('OpenSTValue', function(accounts) { var unlockHeight = stakeReturns[2].plus(1); stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, lock.l); - result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); @@ -309,7 +309,7 @@ contract('OpenSTValue', function(accounts) { result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); stake = result.logs[0].args.stake; await valueToken.approve(openSTValue.address, amountST, { from: accounts[0] }); - result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); stakingIntentHash = result.logs[0].args._stakingIntentHash; }) @@ -409,7 +409,7 @@ contract('OpenSTValue', function(accounts) { it('successfully confirms', async () => { await valueToken.approve(openSTValue.address, 2, { from: accounts[0] }); - result = await openSTValue.stake(checkUuid, 2, accounts[0], lock.l, { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, 2, accounts[0], lock.l, accounts[0], { from: accounts[0] }); stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, lock.s, { from: accounts[0] }); @@ -465,7 +465,7 @@ contract('OpenSTValue', function(accounts) { stake = result.logs[0].args.stake; nonce = await openSTValue.getNextNonce.call(redeemer); await valueToken.approve(openSTValue.address, 1, { from: accounts[0] }); - result = await openSTValue.stake(checkUuid, 1, accounts[0], lock.l, { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, 1, accounts[0], lock.l, accounts[0], { from: accounts[0] }); stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, lock.s,{ from: accounts[0] }); redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); @@ -529,14 +529,14 @@ contract('OpenSTValue', function(accounts) { await valueToken.approve(openSTValue.address, amountST, { from: staker }); //Successfully Staking - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, lock.l, { from: staker }); + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, lock.l, staker, { from: staker }); amountUT = stakeReturns[0].toNumber(); nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number unlockHeight = stakeReturns[2].plus(1); stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); - result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); }); @@ -598,7 +598,7 @@ contract('OpenSTValue', function(accounts) { await valueToken.approve(openSTValue.address, amountST, { from: staker }); //Successfully Staking - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, lock.l, { from: staker }); + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, lock.l, staker, { from: staker }); amountUT = stakeReturns[0].toNumber(); nonce = stakeReturns[1].toNumber(); @@ -606,7 +606,7 @@ contract('OpenSTValue', function(accounts) { unlockHeight = stakeReturns[2].plus(1); stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); - result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); // Process Staking @@ -664,7 +664,7 @@ contract('OpenSTValue', function(accounts) { stake = result.logs[0].args.stake; nonce = await openSTValue.getNextNonce.call(redeemer); await valueToken.approve(openSTValue.address, amountST, { from: staker }); - result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); @@ -726,7 +726,7 @@ contract('OpenSTValue', function(accounts) { stake = result.logs[0].args.stake; nonce = await openSTValue.getNextNonce.call(redeemer); await valueToken.approve(openSTValue.address, amountST, { from: staker }); - result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); diff --git a/test/Protocol.js b/test/Protocol.js index 64a100f8..566a1c49 100644 --- a/test/Protocol.js +++ b/test/Protocol.js @@ -172,7 +172,7 @@ contract('OpenST', function(accounts) { Assert.equal(nonceSTP, 1); // staker calls OpenSTValue.stake to initiate the staking for ST' with uuidSTP // with staker as the beneficiary - const o = await openSTValue.stake(uuidSTP, AMOUNT_ST, beneficiary, lockSTP.l, { from: stakerVC }); + const o = await openSTValue.stake(uuidSTP, AMOUNT_ST, beneficiary, lockSTP.l, stakerVC, { from: stakerVC }); utils.logResponse(o, "OpenSTValue.stake"); openSTValueUtils.checkStakingIntentDeclaredEventProtocol(o.logs[0], uuidSTP, stakerVC, nonceSTP, beneficiary, AMOUNT_ST, AMOUNT_ST, CHAINID_UTILITY); @@ -293,7 +293,7 @@ contract('OpenST', function(accounts) { Assert.equal(nonceBT, 2); // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid // with beneficiary - var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockBT.l, { from: stakerVC }); + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockBT.l, stakerVC, { from: stakerVC }); openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); @@ -532,7 +532,7 @@ contract('OpenST', function(accounts) { nonceBT = await openSTValue.getNextNonce.call(stakerVC); // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid // with beneficiary - var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockR.l, { from: stakerVC }); + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockR.l, stakerVC, { from: stakerVC }); openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); @@ -575,7 +575,7 @@ contract('OpenST', function(accounts) { nonceBT = await openSTValue.getNextNonce.call(stakerVC); // requester calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid // with requester as the beneficiary - var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockR.l, { from: stakerVC }); + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockR.l, stakerVC, { from: stakerVC }); openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); @@ -662,7 +662,7 @@ contract('OpenST', function(accounts) { nonceBT = await openSTValue.getNextNonce.call(stakerVC); // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid // with stakerVC as the beneficiary - var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockStake.l, { from: stakerVC }); + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockStake.l, stakerVC, { from: stakerVC }); openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); diff --git a/test/Registrar.js b/test/Registrar.js index f3635e72..137cb1d5 100644 --- a/test/Registrar.js +++ b/test/Registrar.js @@ -166,7 +166,7 @@ contract('Registrar', function(accounts) { await registrar.addCore(openSTValue.address, core.address, { from: ops }); await registrar.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid, { from: ops }); await valueToken.approve(openSTValue.address, amountST, { from: staker }); - result = await openSTValue.stake(uuid, amountST, staker, lock.l, { from: staker }); + result = await openSTValue.stake(uuid, amountST, staker, lock.l, staker, { from: staker }); nonce = result.logs[0].args._stakerNonce; amountUT = result.logs[0].args._amountUT; unlockHeight = result.logs[0].args._unlockHeight; @@ -213,7 +213,7 @@ contract('Registrar', function(accounts) { await registrar.addCore(openSTValue.address, core.address, { from: ops }); await registrar.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid, { from: ops }); await valueToken.approve(openSTValue.address, amountST, { from: staker }); - var result = await openSTValue.stake(uuid, amountST, staker, lock.l, { from: staker }); + var result = await openSTValue.stake(uuid, amountST, staker, lock.l, staker, { from: staker }); var stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); nonce = await openSTValue.getNextNonce.call(staker); From 4458e163e08e0c5faf4c31086449b348868f96e4 Mon Sep 17 00:00:00 2001 From: sarvesh jain Date: Mon, 14 May 2018 20:24:57 +0530 Subject: [PATCH 0054/1361] Fixing constructor and event statement warning --- contracts/Registrar.sol | 2 +- contracts/SimpleToken/MockToken.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index b22032f3..8452a605 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -37,7 +37,7 @@ contract Registrar is OpsManaged { /* * Public functions */ - constructor() public + function Registrar() public OpsManaged() { } diff --git a/contracts/SimpleToken/MockToken.sol b/contracts/SimpleToken/MockToken.sol index 3ce7b35c..2841916a 100644 --- a/contracts/SimpleToken/MockToken.sol +++ b/contracts/SimpleToken/MockToken.sol @@ -33,7 +33,7 @@ contract MockToken is ERC20Token, OpsManaged, SimpleTokenConfig { finalized = true; - Finalized(); + emit Finalized(); return true; } From 5a7ca3f7653cc6935d55dd4465743dc0f5c05cc9 Mon Sep 17 00:00:00 2001 From: sarvesh jain Date: Mon, 14 May 2018 20:27:51 +0530 Subject: [PATCH 0055/1361] casting contract object to address before calling balance method --- contracts/Registrar.sol | 2 +- contracts/STPrime.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index 8452a605..0cd6169d 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -37,7 +37,7 @@ contract Registrar is OpsManaged { /* * Public functions */ - function Registrar() public + constructor() public OpsManaged() { } diff --git a/contracts/STPrime.sol b/contracts/STPrime.sol index e656bdbf..fabf6489 100644 --- a/contracts/STPrime.sol +++ b/contracts/STPrime.sol @@ -109,7 +109,7 @@ contract STPrime is UtilityTokenAbstract, STPrimeConfig { returns (bool /* success */) { uint256 amount = claimInternal(_beneficiary); - assert(this.balance >= amount); + assert(address(this).balance >= amount); // transfer throws if insufficient funds _beneficiary.transfer(amount); From 02d8ea78beb6c339d981d5a2dccd0ff8267627de Mon Sep 17 00:00:00 2001 From: sarvesh jain Date: Mon, 14 May 2018 20:44:46 +0530 Subject: [PATCH 0056/1361] Upgrading version of truffle and pragma statement in solidity --- contracts/BrandedToken.sol | 2 +- contracts/Core.sol | 2 +- contracts/CoreInterface.sol | 2 +- contracts/EIP20Interface.sol | 2 +- contracts/EIP20Token.sol | 2 +- contracts/EIP20TokenMock.sol | 2 +- contracts/Hasher.sol | 2 +- contracts/OpenSTUtility.sol | 2 +- contracts/OpenSTUtilityInterface.sol | 2 +- contracts/OpenSTUtilityMock.sol | 2 +- contracts/OpenSTValue.sol | 2 +- contracts/OpenSTValueInterface.sol | 2 +- contracts/OpenSTValueMock.sol | 2 +- contracts/OpsManaged.sol | 2 +- contracts/Owned.sol | 2 +- contracts/ProtocolVersioned.sol | 2 +- contracts/ProtocolVersionedMock.sol | 2 +- contracts/Registrar.sol | 2 +- contracts/STPrime.sol | 2 +- contracts/STPrimeConfig.sol | 2 +- contracts/SafeMath.sol | 2 +- contracts/SafeMathMock.sol | 2 +- contracts/SimpleStake.sol | 2 +- contracts/SimpleToken/ERC20Interface.sol | 2 +- contracts/SimpleToken/ERC20Token.sol | 2 +- contracts/SimpleToken/MockToken.sol | 2 +- contracts/SimpleToken/OpsManaged.sol | 2 +- contracts/SimpleToken/Owned.sol | 2 +- contracts/SimpleToken/SafeMath.sol | 2 +- contracts/SimpleToken/SimpleToken.sol | 2 +- contracts/SimpleToken/SimpleTokenConfig.sol | 2 +- contracts/UtilityTokenAbstract.sol | 2 +- contracts/UtilityTokenAbstractMock.sol | 2 +- contracts/UtilityTokenInterface.sol | 2 +- package.json | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) diff --git a/contracts/BrandedToken.sol b/contracts/BrandedToken.sol index 1a5ecb47..a391f865 100644 --- a/contracts/BrandedToken.sol +++ b/contracts/BrandedToken.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/Core.sol b/contracts/Core.sol index 7c163410..c34a53d3 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/CoreInterface.sol b/contracts/CoreInterface.sol index a6e94847..79f8042a 100644 --- a/contracts/CoreInterface.sol +++ b/contracts/CoreInterface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/EIP20Interface.sol b/contracts/EIP20Interface.sol index 350793da..322326d5 100644 --- a/contracts/EIP20Interface.sol +++ b/contracts/EIP20Interface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/EIP20Token.sol b/contracts/EIP20Token.sol index 4b1f642f..69dab7da 100644 --- a/contracts/EIP20Token.sol +++ b/contracts/EIP20Token.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/EIP20TokenMock.sol b/contracts/EIP20TokenMock.sol index e152fa40..63d1d719 100644 --- a/contracts/EIP20TokenMock.sol +++ b/contracts/EIP20TokenMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/Hasher.sol b/contracts/Hasher.sol index 0ce82d15..e8491ff6 100644 --- a/contracts/Hasher.sol +++ b/contracts/Hasher.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 78a5088c..39d74568 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTUtilityInterface.sol b/contracts/OpenSTUtilityInterface.sol index ec4862ea..2a270846 100644 --- a/contracts/OpenSTUtilityInterface.sol +++ b/contracts/OpenSTUtilityInterface.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol index 4c6e961e..32fe435d 100644 --- a/contracts/OpenSTUtilityMock.sol +++ b/contracts/OpenSTUtilityMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 2c88a29a..5a84f985 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index 7b5f3941..9042089a 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 7db5f769..1058f4d8 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpsManaged.sol b/contracts/OpsManaged.sol index 111ea90f..aa898642 100644 --- a/contracts/OpsManaged.sol +++ b/contracts/OpsManaged.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/Owned.sol b/contracts/Owned.sol index 336b4f80..7214c11c 100644 --- a/contracts/Owned.sol +++ b/contracts/Owned.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/ProtocolVersioned.sol b/contracts/ProtocolVersioned.sol index 15eb95d1..169a5bb5 100644 --- a/contracts/ProtocolVersioned.sol +++ b/contracts/ProtocolVersioned.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/ProtocolVersionedMock.sol b/contracts/ProtocolVersionedMock.sol index 04347cd0..77e9fb5a 100644 --- a/contracts/ProtocolVersionedMock.sol +++ b/contracts/ProtocolVersionedMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index 0cd6169d..69b6e30f 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/STPrime.sol b/contracts/STPrime.sol index fabf6489..bc666f4a 100644 --- a/contracts/STPrime.sol +++ b/contracts/STPrime.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/STPrimeConfig.sol b/contracts/STPrimeConfig.sol index 45bdd9b8..93905ccb 100644 --- a/contracts/STPrimeConfig.sol +++ b/contracts/STPrimeConfig.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SafeMath.sol b/contracts/SafeMath.sol index 379f7be2..1bec8bc5 100644 --- a/contracts/SafeMath.sol +++ b/contracts/SafeMath.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SafeMathMock.sol b/contracts/SafeMathMock.sol index 7ab4d294..673e038e 100644 --- a/contracts/SafeMathMock.sol +++ b/contracts/SafeMathMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SimpleStake.sol b/contracts/SimpleStake.sol index a3304de1..33be109a 100644 --- a/contracts/SimpleStake.sol +++ b/contracts/SimpleStake.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SimpleToken/ERC20Interface.sol b/contracts/SimpleToken/ERC20Interface.sol index 4238ee23..1f5f1af7 100644 --- a/contracts/SimpleToken/ERC20Interface.sol +++ b/contracts/SimpleToken/ERC20Interface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // ---------------------------------------------------------------------------- // Standard ERC20 Interface diff --git a/contracts/SimpleToken/ERC20Token.sol b/contracts/SimpleToken/ERC20Token.sol index 10c43b73..e24fd79b 100644 --- a/contracts/SimpleToken/ERC20Token.sol +++ b/contracts/SimpleToken/ERC20Token.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // ---------------------------------------------------------------------------- // Standard ERC20 Token Implementation diff --git a/contracts/SimpleToken/MockToken.sol b/contracts/SimpleToken/MockToken.sol index 2841916a..132ae884 100644 --- a/contracts/SimpleToken/MockToken.sol +++ b/contracts/SimpleToken/MockToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // ---------------------------------------------------------------------------- // Mock Token Contract diff --git a/contracts/SimpleToken/OpsManaged.sol b/contracts/SimpleToken/OpsManaged.sol index 56986c6d..bd190daa 100644 --- a/contracts/SimpleToken/OpsManaged.sol +++ b/contracts/SimpleToken/OpsManaged.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SimpleToken/Owned.sol b/contracts/SimpleToken/Owned.sol index bb6ac9aa..24947efa 100644 --- a/contracts/SimpleToken/Owned.sol +++ b/contracts/SimpleToken/Owned.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // ---------------------------------------------------------------------------- // Basic Ownership Implementation diff --git a/contracts/SimpleToken/SafeMath.sol b/contracts/SimpleToken/SafeMath.sol index c3c635a7..c145860e 100644 --- a/contracts/SimpleToken/SafeMath.sol +++ b/contracts/SimpleToken/SafeMath.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // ---------------------------------------------------------------------------- // SafeMath Library Implementation diff --git a/contracts/SimpleToken/SimpleToken.sol b/contracts/SimpleToken/SimpleToken.sol index d246f395..5b1495cb 100644 --- a/contracts/SimpleToken/SimpleToken.sol +++ b/contracts/SimpleToken/SimpleToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // ---------------------------------------------------------------------------- // Simple Token Contract diff --git a/contracts/SimpleToken/SimpleTokenConfig.sol b/contracts/SimpleToken/SimpleTokenConfig.sol index 300faede..14ab80cf 100644 --- a/contracts/SimpleToken/SimpleTokenConfig.sol +++ b/contracts/SimpleToken/SimpleTokenConfig.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // ---------------------------------------------------------------------------- // Token Configuration diff --git a/contracts/UtilityTokenAbstract.sol b/contracts/UtilityTokenAbstract.sol index b6e1d8fc..0b461f55 100644 --- a/contracts/UtilityTokenAbstract.sol +++ b/contracts/UtilityTokenAbstract.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/UtilityTokenAbstractMock.sol b/contracts/UtilityTokenAbstractMock.sol index 2ff0c028..379e2fa7 100644 --- a/contracts/UtilityTokenAbstractMock.sol +++ b/contracts/UtilityTokenAbstractMock.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/UtilityTokenInterface.sol b/contracts/UtilityTokenInterface.sol index 0eea607a..38d37969 100644 --- a/contracts/UtilityTokenInterface.sol +++ b/contracts/UtilityTokenInterface.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.17; +pragma solidity ^0.4.18; // Copyright 2017 OpenST Ltd. // diff --git a/package.json b/package.json index cb1fd434..c4e140b1 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "web3": "^1.0.0-beta.33" }, "devDependencies": { - "truffle": "^4.0.1", + "truffle": "^4.1.8", "ganache-cli": "^6.0.3", "abi-decoder": "^1.0.9", "ethereumjs-testrpc": "^6.0.3" From 15d0b1f614777580af7fcb404e2aa6e7065b3fa9 Mon Sep 17 00:00:00 2001 From: Sarvesh jain Date: Tue, 15 May 2018 15:40:18 +0530 Subject: [PATCH 0057/1361] Changing constructor synta in meta coin and Migrations --- truffle/contracts/MetaCoin.sol | 2 +- truffle/contracts/Migrations.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/truffle/contracts/MetaCoin.sol b/truffle/contracts/MetaCoin.sol index fa570e96..c48f3c54 100644 --- a/truffle/contracts/MetaCoin.sol +++ b/truffle/contracts/MetaCoin.sol @@ -12,7 +12,7 @@ contract MetaCoin { event Transfer(address indexed _from, address indexed _to, uint256 _value); - function MetaCoin() { + constructor() { balances[tx.origin] = 10000; } diff --git a/truffle/contracts/Migrations.sol b/truffle/contracts/Migrations.sol index 7e7fe8d4..c7d09bd2 100644 --- a/truffle/contracts/Migrations.sol +++ b/truffle/contracts/Migrations.sol @@ -8,7 +8,7 @@ contract Migrations { if (msg.sender == owner) _; } - function Migrations() { + constructor() { owner = msg.sender; } From 6d9b24f7ed735a80d97be085eb93d9f15caa9d35 Mon Sep 17 00:00:00 2001 From: Sarvesh jain Date: Tue, 15 May 2018 16:32:24 +0530 Subject: [PATCH 0058/1361] Updating solidity statements with solidity version ^0.4.23 --- contracts/BrandedToken.sol | 2 +- contracts/Core.sol | 2 +- contracts/CoreInterface.sol | 2 +- contracts/EIP20Interface.sol | 2 +- contracts/EIP20Token.sol | 2 +- contracts/EIP20TokenMock.sol | 2 +- contracts/Hasher.sol | 2 +- contracts/OpenSTUtility.sol | 2 +- contracts/OpenSTUtilityInterface.sol | 2 +- contracts/OpenSTUtilityMock.sol | 2 +- contracts/OpenSTValue.sol | 2 +- contracts/OpenSTValueInterface.sol | 2 +- contracts/OpenSTValueMock.sol | 2 +- contracts/OpsManaged.sol | 2 +- contracts/Owned.sol | 2 +- contracts/ProtocolVersioned.sol | 2 +- contracts/ProtocolVersionedMock.sol | 2 +- contracts/Registrar.sol | 2 +- contracts/STPrime.sol | 2 +- contracts/STPrimeConfig.sol | 2 +- contracts/SafeMath.sol | 2 +- contracts/SafeMathMock.sol | 2 +- contracts/SimpleStake.sol | 2 +- contracts/SimpleToken/ERC20Interface.sol | 2 +- contracts/SimpleToken/ERC20Token.sol | 2 +- contracts/SimpleToken/MockToken.sol | 2 +- contracts/SimpleToken/OpsManaged.sol | 2 +- contracts/SimpleToken/Owned.sol | 2 +- contracts/SimpleToken/SafeMath.sol | 2 +- contracts/SimpleToken/SimpleToken.sol | 2 +- contracts/SimpleToken/SimpleTokenConfig.sol | 2 +- contracts/UtilityTokenAbstract.sol | 2 +- contracts/UtilityTokenAbstractMock.sol | 2 +- contracts/UtilityTokenInterface.sol | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/contracts/BrandedToken.sol b/contracts/BrandedToken.sol index a391f865..94d860a6 100644 --- a/contracts/BrandedToken.sol +++ b/contracts/BrandedToken.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/Core.sol b/contracts/Core.sol index c34a53d3..d4c6ad44 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/CoreInterface.sol b/contracts/CoreInterface.sol index 79f8042a..3b9e933a 100644 --- a/contracts/CoreInterface.sol +++ b/contracts/CoreInterface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/EIP20Interface.sol b/contracts/EIP20Interface.sol index 322326d5..d66ba745 100644 --- a/contracts/EIP20Interface.sol +++ b/contracts/EIP20Interface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/EIP20Token.sol b/contracts/EIP20Token.sol index 69dab7da..44f60f59 100644 --- a/contracts/EIP20Token.sol +++ b/contracts/EIP20Token.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/EIP20TokenMock.sol b/contracts/EIP20TokenMock.sol index 63d1d719..0f47e1f9 100644 --- a/contracts/EIP20TokenMock.sol +++ b/contracts/EIP20TokenMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/Hasher.sol b/contracts/Hasher.sol index e8491ff6..e829bc10 100644 --- a/contracts/Hasher.sol +++ b/contracts/Hasher.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 39d74568..f1fea45b 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTUtilityInterface.sol b/contracts/OpenSTUtilityInterface.sol index 2a270846..46f1d0f5 100644 --- a/contracts/OpenSTUtilityInterface.sol +++ b/contracts/OpenSTUtilityInterface.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol index 32fe435d..8b99628a 100644 --- a/contracts/OpenSTUtilityMock.sol +++ b/contracts/OpenSTUtilityMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 5a84f985..7eea71bd 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index 9042089a..eebf463a 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 1058f4d8..0812e7aa 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/OpsManaged.sol b/contracts/OpsManaged.sol index aa898642..46c9d5bb 100644 --- a/contracts/OpsManaged.sol +++ b/contracts/OpsManaged.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/Owned.sol b/contracts/Owned.sol index 7214c11c..9d2899d9 100644 --- a/contracts/Owned.sol +++ b/contracts/Owned.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/ProtocolVersioned.sol b/contracts/ProtocolVersioned.sol index 169a5bb5..05ea21f2 100644 --- a/contracts/ProtocolVersioned.sol +++ b/contracts/ProtocolVersioned.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/ProtocolVersionedMock.sol b/contracts/ProtocolVersionedMock.sol index 77e9fb5a..7a914b96 100644 --- a/contracts/ProtocolVersionedMock.sol +++ b/contracts/ProtocolVersionedMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index 69b6e30f..c7473194 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/STPrime.sol b/contracts/STPrime.sol index bc666f4a..a353283e 100644 --- a/contracts/STPrime.sol +++ b/contracts/STPrime.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/STPrimeConfig.sol b/contracts/STPrimeConfig.sol index 93905ccb..193a6447 100644 --- a/contracts/STPrimeConfig.sol +++ b/contracts/STPrimeConfig.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SafeMath.sol b/contracts/SafeMath.sol index 1bec8bc5..47dd86bc 100644 --- a/contracts/SafeMath.sol +++ b/contracts/SafeMath.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SafeMathMock.sol b/contracts/SafeMathMock.sol index 673e038e..951bacb7 100644 --- a/contracts/SafeMathMock.sol +++ b/contracts/SafeMathMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SimpleStake.sol b/contracts/SimpleStake.sol index 33be109a..9d237b68 100644 --- a/contracts/SimpleStake.sol +++ b/contracts/SimpleStake.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SimpleToken/ERC20Interface.sol b/contracts/SimpleToken/ERC20Interface.sol index 1f5f1af7..f31eddee 100644 --- a/contracts/SimpleToken/ERC20Interface.sol +++ b/contracts/SimpleToken/ERC20Interface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- // Standard ERC20 Interface diff --git a/contracts/SimpleToken/ERC20Token.sol b/contracts/SimpleToken/ERC20Token.sol index e24fd79b..7ffda10e 100644 --- a/contracts/SimpleToken/ERC20Token.sol +++ b/contracts/SimpleToken/ERC20Token.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- // Standard ERC20 Token Implementation diff --git a/contracts/SimpleToken/MockToken.sol b/contracts/SimpleToken/MockToken.sol index 132ae884..1d08b258 100644 --- a/contracts/SimpleToken/MockToken.sol +++ b/contracts/SimpleToken/MockToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- // Mock Token Contract diff --git a/contracts/SimpleToken/OpsManaged.sol b/contracts/SimpleToken/OpsManaged.sol index bd190daa..82f36935 100644 --- a/contracts/SimpleToken/OpsManaged.sol +++ b/contracts/SimpleToken/OpsManaged.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/SimpleToken/Owned.sol b/contracts/SimpleToken/Owned.sol index 24947efa..6011d0b9 100644 --- a/contracts/SimpleToken/Owned.sol +++ b/contracts/SimpleToken/Owned.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- // Basic Ownership Implementation diff --git a/contracts/SimpleToken/SafeMath.sol b/contracts/SimpleToken/SafeMath.sol index c145860e..c1e10459 100644 --- a/contracts/SimpleToken/SafeMath.sol +++ b/contracts/SimpleToken/SafeMath.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- // SafeMath Library Implementation diff --git a/contracts/SimpleToken/SimpleToken.sol b/contracts/SimpleToken/SimpleToken.sol index 5b1495cb..d81d5072 100644 --- a/contracts/SimpleToken/SimpleToken.sol +++ b/contracts/SimpleToken/SimpleToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- // Simple Token Contract diff --git a/contracts/SimpleToken/SimpleTokenConfig.sol b/contracts/SimpleToken/SimpleTokenConfig.sol index 14ab80cf..5fad4922 100644 --- a/contracts/SimpleToken/SimpleTokenConfig.sol +++ b/contracts/SimpleToken/SimpleTokenConfig.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- // Token Configuration diff --git a/contracts/UtilityTokenAbstract.sol b/contracts/UtilityTokenAbstract.sol index 0b461f55..cee223f5 100644 --- a/contracts/UtilityTokenAbstract.sol +++ b/contracts/UtilityTokenAbstract.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/UtilityTokenAbstractMock.sol b/contracts/UtilityTokenAbstractMock.sol index 379e2fa7..b33d2915 100644 --- a/contracts/UtilityTokenAbstractMock.sol +++ b/contracts/UtilityTokenAbstractMock.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // diff --git a/contracts/UtilityTokenInterface.sol b/contracts/UtilityTokenInterface.sol index 38d37969..f007e5b0 100644 --- a/contracts/UtilityTokenInterface.sol +++ b/contracts/UtilityTokenInterface.sol @@ -1,5 +1,5 @@ /* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; // Copyright 2017 OpenST Ltd. // From b2325c1a2f029004a9747750ef77bc4fd385cd3f Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 16 May 2018 16:57:37 +0530 Subject: [PATCH 0059/1361] Test: updated truffle tests --- test/Gate.js | 751 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 612 insertions(+), 139 deletions(-) diff --git a/test/Gate.js b/test/Gate.js index 16c2c96b..cb7db98d 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -42,66 +42,288 @@ contract('Gate', function(accounts) { workerAddress1 = result.workerAddress1; }; - const requestStake = async function () { - let initialStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) + const approveGateAndRequestStake = async function (amount, beneficiary, staker, successCase) { + // approve gate contract + await valueToken.approve(gate.address, amount, { from: staker }); + // call the request stake + return requestStake(amount, beneficiary, staker, successCase); + }; + + const requestStake = async function (amount, beneficiary, staker, successCase) { + // intial account balances + let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (successCase) { + // success case + let requestStakeResult = await gate.requestStake.call(amount, beneficiary, {from: staker}); + assert.equal(requestStakeResult, successCase); + + let requestStakeResponse = await gate.requestStake(amount, beneficiary, {from: staker}); + await Gate_utils.checkRequestStakeEvent(requestStakeResponse.logs[0],staker, amount, beneficiary); + + } else { + // fail case + await Utils.expectThrow(gate.requestStake(amount, beneficiary, {from: staker})); + } + + // account balances after execution + let finalStakerAccountBalance = await valueToken.balanceOf.call(staker) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (successCase) { + // check balances for success case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.sub(amount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.plus(amount)), true); + } else { + // check balances for failed case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.requestStake(amount, beneficiary, {from: staker})); + }; + + const revertStakeRequest = async function (staker, amount , successCase) { + // intial account balances + let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) , initialGateBalance = await valueToken.balanceOf.call(gate.address) ; - // approve gate contract - await valueToken.approve(gate.address, stakeAmount, { from: stakerAccount }); - let requestStakeResult = await gate.requestStake.call(stakeAmount, beneficiaryAccount, {from: stakerAccount}); - assert.equal(requestStakeResult, true); + if (successCase) { + // success case steps + let revertRequestStakeResult = await gate.revertStakeRequest.call({from: staker}); + assert.equal(revertRequestStakeResult, true); - let requestStakeResponse = await gate.requestStake(stakeAmount, beneficiaryAccount, {from: stakerAccount}); - await Gate_utils.checkRequestStakeEvent(requestStakeResponse.logs[0],stakerAccount, stakeAmount, beneficiaryAccount); + let revertRequestStakeResponse = await gate.revertStakeRequest({from: staker}); + await Gate_utils.checkStakeRequestRevertedEvent(revertRequestStakeResponse.logs[0],staker, amount); + } else { + // fail case steps + await Utils.expectThrow(gate.revertStakeRequest({from: staker})); + } let finalStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) , finalGateBalance = await valueToken.balanceOf.call(gate.address) ; - // check balances - assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.sub(stakeAmount)), true); - assert.equal(finalGateBalance.equals(initialGateBalance.plus(stakeAmount)), true); + if (successCase) { + // check balances for success case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(amount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(amount)), true); + } else { + // check balances for failed case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.revertStakeRequest({from: staker})); + }; + + const rejectStakeRequest = async function (staker, amount, messageSender, successCase) { + + // load intial account balance + let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (successCase) { + + let rejectRequestStakeResult = await gate.rejectStakeRequest.call(staker, {from: messageSender}); + assert.equal(rejectRequestStakeResult, true); + + let rejectRequestStakeResponse = await gate.rejectStakeRequest(staker, {from: messageSender}); + await Gate_utils.checkStakeRequestRejectedEvent(rejectRequestStakeResponse.logs[0],staker, amount); + + } else { + await Utils.expectThrow(gate.rejectStakeRequest(staker, {from: messageSender})); + } + + // load balances after execution + let finalStakerAccountBalance = await valueToken.balanceOf.call(staker) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (successCase) { + // check balances for success case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(amount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(amount)), true); + } else { + // check balances for failed case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } // request again should fail - await Utils.expectThrow(gate.requestStake(stakeAmount, beneficiaryAccount, {from: stakerAccount})); + await Utils.expectThrow(gate.rejectStakeRequest(staker, {from: messageSender})); }; - const acceptStakeRequest = async function() { - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + const acceptStakeRequest = async function(staker, amount, lock, messageSender, successCase) { - let initialworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) , initialGateBalance = await valueToken.balanceOf.call(gate.address) , bountyAmount = await gate.bounty.call() - , lock = HashLock.getHashLock() ; - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + let stakingIntentHash = null; + if (successCase) { + /*let acceptStakeRequestResult = await gate.acceptStakeRequest.call(staker, lock.l, {from: messageSender}); + let amountUT = acceptStakeRequestResult[0]; + let nonce = acceptStakeRequestResult[1]; + let unlockHeight = acceptStakeRequestResult[2].plus(1); - let acceptStakeRequestResult = await gate.acceptStakeRequest.call(stakerAccount, lock.l, {from: workerAddress1}); - let amountUT = acceptStakeRequestResult[0]; - let nonce = acceptStakeRequestResult[1]; - let unlockHeight = acceptStakeRequestResult[2].plus(1); + stakingIntentHash = await openSTValue.hashStakingIntent.call(uuid, staker, nonce, beneficiaryAccount, amount, + amountUT, unlockHeight, lock.l); +*/ - let stakingIntentHash = await openSTValue.hashStakingIntent.call(uuid, stakerAccount, nonce, beneficiaryAccount, stakeAmount, - amountUT, unlockHeight, lock.l); + let stakingIntentHashParams = await getStakingIntentHashParams(staker, amount, lock, messageSender); + let amountUT = stakingIntentHashParams.amountUT; + let nonce = stakingIntentHashParams.nonce; + let unlockHeight = stakingIntentHashParams.unlockHeight; - let acceptStakeRequestResponse = await gate.acceptStakeRequest(stakerAccount, lock.l, {from: workerAddress1}); - await Gate_utils.checkStakeRequestAcceptedEvent(acceptStakeRequestResponse.logs[0],stakerAccount, stakeAmount, amountUT, nonce, unlockHeight, stakingIntentHash); + stakingIntentHash = stakingIntentHashParams.stakingIntentHash; - let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) + let acceptStakeRequestResponse = await gate.acceptStakeRequest(staker, lock.l, {from: messageSender}); + await Gate_utils.checkStakeRequestAcceptedEvent(acceptStakeRequestResponse.logs[0],staker, amount, amountUT, nonce, unlockHeight, stakingIntentHash); + } else { + await Utils.expectThrow(gate.acceptStakeRequest(staker, lock.l, {from: messageSender})); + } + + let finalworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) , finalGateBalance = await valueToken.balanceOf.call(gate.address) ; - // check balances - assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.sub(bountyAmount)), true); - assert.equal(finalGateBalance.equals(initialGateBalance.plus(bountyAmount).sub(stakeAmount)), true); + if (successCase) { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.sub(bountyAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.plus(bountyAmount).sub(amount)), true); + + } else { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } // request again should fail - await Utils.expectThrow(gate.acceptStakeRequest(stakerAccount, lock.l, {from: workerAddress1})); + await Utils.expectThrow(gate.acceptStakeRequest(staker, lock.l, {from: messageSender})); return {lock: lock, stakingIntentHash: stakingIntentHash} ; }; + const processStaking = async function (stakingIntentHash, unlockSecret, messageSender, successCase) { + + let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , initialWorkerBalance = await valueToken.balanceOf.call(workers) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + , bountyAmount = await gate.bounty.call() + ; + + if (successCase) { + let processStakingResult = await gate.processStaking.call(stakingIntentHash, unlockSecret, {from: messageSender}); + assert.equal(processStakingResult, true); + + let processStakingResponse = await gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender}); + //await Gate_utils.checkProcessedStakeEvent(processStakingResponse.logs[0],stakerAccount, stakeAmount); + } else { + await Utils.expectThrow(gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender})); + } + + + let finalworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + , finalWorkerBalance = await valueToken.balanceOf.call(workers) + ; + + if (successCase) { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); + } else { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender})); + }; + + const revertStaking = async function (stakingIntentHash, messageSender, isWhiteListedWorker, successCase) { + + let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , initialWorkerBalance = await valueToken.balanceOf.call(workers) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + , bountyAmount = await gate.bounty.call() + ; + + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (var i = 0; i < waitTime-2 ; i++) { + await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); + } + + if (successCase) { + let revertStakingResponse = await gate.revertStaking(stakingIntentHash, {from: messageSender}); + } else { + await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); + } + + + let finalworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + , finalWorkerBalance = await valueToken.balanceOf.call(workers) + ; + + if (successCase) { + // check balances + if (isWhiteListedWorker) { + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); + } else { + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.plus(bountyAmount)), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance), true); + } + assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); + + } else { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); + + }; + + const getStakingIntentHashParams = async function (staker, amount, lock, messageSender) { + let acceptStakeRequestResult = await gate.acceptStakeRequest.call(staker, lock.l, {from: messageSender}); + let amountUT = acceptStakeRequestResult[0]; + let nonce = acceptStakeRequestResult[1]; + let unlockHeight = acceptStakeRequestResult[2].plus(1); + + stakingIntentHash = await openSTValue.hashStakingIntent.call(uuid, staker, nonce, beneficiaryAccount, amount, + amountUT, unlockHeight, lock.l); + + return { + stakingIntentHash: stakingIntentHash, + amountUT: amountUT, + nonce: nonce, + unlockHeight: unlockHeight, + uuid: uuid, + staker: staker, + beneficiaryAccount: beneficiaryAccount, + amountST: amount, + hashLock: lock.l + } + }; + describe('Properties', async () => { before (async () => { @@ -128,177 +350,428 @@ contract('Gate', function(accounts) { }); describe('requestStake', async () => { - before (async () => { + beforeEach (async () => { await deployGate(); }); it('successfully processes request stake', async () => { - await requestStake(); + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + }); + + it('fails to processes request stake when stake amount is 0', async () => { + await approveGateAndRequestStake(new BigNumber(0), beneficiaryAccount, stakerAccount, false); + }); + + it('fails to processes request stake when beneficiary account is 0', async () => { + await approveGateAndRequestStake(stakeAmount, 0, stakerAccount, false); + }); + + it('fails to processes request stake when staker account has not approved gate contract', async () => { + await requestStake(stakeAmount, beneficiaryAccount, stakerAccount, false); }); }); + describe('revertStakeRequest', async () => { - before (async () => { + let bountyAmount = null; + let lock = null; + + beforeEach (async () => { await deployGate(); - await requestStake(); + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); }); it('successfully processes revert request stake', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await revertStakeRequest(stakerAccount, stakeAmount ,true); + }); - let initialStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) - , initialGateBalance = await valueToken.balanceOf.call(gate.address) - ; - - let revertRequestStakeResult = await gate.revertStakeRequest.call({from: stakerAccount}); - assert.equal(revertRequestStakeResult, true); + it('fails to processes revert request stake when staker account has not requested stake before', async () => { + await revertStakeRequest(stakerAccount, stakeAmount ,false); + }); - let revertRequestStakeResponse = await gate.revertStakeRequest({from: stakerAccount}); - await Gate_utils.checkStakeRequestRevertedEvent(revertRequestStakeResponse.logs[0],stakerAccount, stakeAmount); + it('fails to processes revert request stake after accepting stake request', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - let finalStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) - , finalGateBalance = await valueToken.balanceOf.call(gate.address) - ; - // check balances - assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(stakeAmount)), true); - assert.equal(finalGateBalance.equals(initialGateBalance.sub(stakeAmount)), true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); - // request again should fail - await Utils.expectThrow(gate.revertStakeRequest({from: stakerAccount})); + await revertStakeRequest(stakerAccount, stakeAmount ,false); + }); - }) }); describe('rejectStakeRequest', async () => { - before (async () => { + let bountyAmount = null; + let lock = null; + + beforeEach (async () => { await deployGate(); - await requestStake(); + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); }); it('successfully processes reject request stake', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); + }); - let initialStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) - , initialGateBalance = await valueToken.balanceOf.call(gate.address) - ; - - let rejectRequestStakeResult = await gate.rejectStakeRequest.call(stakerAccount, {from: workerAddress1}); - assert.equal(rejectRequestStakeResult, true); + it('fails to processes reject request stake when staker account has not requested stake before', async () => { + await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, false); + }); - let rejectRequestStakeResponse = await gate.rejectStakeRequest(stakerAccount, {from: workerAddress1}); - await Gate_utils.checkStakeRequestRejectedEvent(rejectRequestStakeResponse.logs[0],stakerAccount, stakeAmount); + it('fails to processes reject request stake after accepting stake request', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - let finalStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) - , finalGateBalance = await valueToken.balanceOf.call(gate.address) - ; - // check balances - assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(stakeAmount)), true); - assert.equal(finalGateBalance.equals(initialGateBalance.sub(stakeAmount)), true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - // request again should fail - await Utils.expectThrow(gate.rejectStakeRequest(stakerAccount, {from: workerAddress1})); + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); - }) + await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, false); + }); }); - describe('acceptStakeRequest', async () => { + describe('acceptStakeRequest', async () => { - before (async () => { - await deployGate(); - await requestStake(); - }); + let bountyAmount = null; + let lock = null; - it('successfully processes accept request stake', async () => { - await acceptStakeRequest(); - }) + beforeEach (async () => { - }); + await deployGate(); - describe('processStaking', async () => { + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); + }); + + it('successfully processes accept request stake', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + + }); + + it('fails to processes accept request stake when worker is not whitelisted address', async () => { + + let workerAddress = accounts[10]; + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress }); + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress, false); + + }); + + it('fails to processes accept request stake when staker address is blank', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + await acceptStakeRequest(0, stakeAmount, lock, workerAddress1, false); + + }); + + it('fails to processes accept request stake when hash lock is blank', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + lock.l = 0; + lock.s = 0; + await acceptStakeRequest(0, stakeAmount, lock, workerAddress1, false); + + }); + + it('fails to processes accept stake request when worker address has insufficient balance', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + await acceptStakeRequest(0, stakeAmount, lock, workerAddress1, false); + + }); + + it('fails to processes accept stake request when worker address has not approved gate contract', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await acceptStakeRequest(0, stakeAmount, lock, workerAddress1, false); + + }); - before (async () => { - await deployGate(); - await requestStake(); - stakeResult = await acceptStakeRequest(); - stakingIntentHash = stakeResult['stakingIntentHash']; - lock = stakeResult['lock']; }); - it('successfully processes', async () => { - let initialworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) - , initialWorkerBalance = await valueToken.balanceOf.call(workers) - , initialGateBalance = await valueToken.balanceOf.call(gate.address) - , bountyAmount = await gate.bounty.call() - ; + describe('processStaking', async () => { - let processStakingResult = await gate.processStaking.call(stakingIntentHash, lock.s, {from: workerAddress1}); - assert.equal(processStakingResult, true); + let bountyAmount = null; + let lock = null; - let processStakingResponse = await gate.processStaking(stakingIntentHash, lock.s, {from: workerAddress1}); - //await Gate_utils.checkProcessedStakeEvent(processStakingResponse.logs[0],stakerAccount, stakeAmount); + beforeEach (async () => { + await deployGate(); + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); + }); - let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) - , finalGateBalance = await valueToken.balanceOf.call(gate.address) - , finalWorkerBalance = await valueToken.balanceOf.call(workers) - ; + it('successfully processes', async () => { - // check balances - assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); - assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); - assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - // request again should fail - await Utils.expectThrow(gate.processStaking(stakingIntentHash, lock.s, {from: workerAddress1})); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - }) + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; - }); + await processStaking(stakingIntentHash, lock.s, workerAddress1, true); + + }); + + it('fails to processes when the worker address is not white listed', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + let workerAddress = accounts[10]; + await processStaking(stakingIntentHash, lock.s, workerAddress, false); + + }); + + it('fails to processes when stakingIntentHash is 0', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + await processStaking(0, lock.s, workerAddress1, false); + + }); + + it('fails to processes when stakingIntentHash is invalid', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + await processStaking(beneficiaryAccount, lock.s, workerAddress1, false); + + }); + + it('fails to processes when unlockSecret is 0', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await processStaking(stakingIntentHash, 0, workerAddress1, false); + + }); + + it('fails to processes when unlockSecret is invalid', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await processStaking(stakingIntentHash, beneficiaryAccount, workerAddress1, false); + + }); + + it('fails to processes when stakeRequest was not accepted', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + + }); + + it('fails to processes when stakeRequest was rejected', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + + await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + + }); + + it('fails to processes when stakeRequest was reverted', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + + await revertStakeRequest(stakerAccount, stakeAmount ,true); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + + }); - describe('revertStaking', async () => { - before (async () => { - await deployGate(); - await requestStake(); - stakeResult = await acceptStakeRequest(); - stakingIntentHash = stakeResult['stakingIntentHash']; }); - it('successfully processes', async () => { - let initialworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) - , initialWorkerBalance = await valueToken.balanceOf.call(workers) - , initialGateBalance = await valueToken.balanceOf.call(gate.address) - , bountyAmount = await gate.bounty.call() - ; + describe('revertStaking', async () => { - var waitTime = await openSTValue.blocksToWaitLong.call(); - waitTime = waitTime.toNumber(); - // Wait time less 1 block for preceding test case and 1 block because condition is <= - for (var i = 0; i < waitTime-2 ; i++) { - await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: workerAddress1})); - } + let bountyAmount = null; + let lock = null; - let revertStakingResponse = await gate.revertStaking(stakingIntentHash, {from: workerAddress1}); - console.log("revertStakingResponse: ",revertStakingResponse); + beforeEach (async () => { + await deployGate(); + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); + }); - let finalworkerAddress1Balance = await valueToken.balanceOf.call(workerAddress1) - , finalGateBalance = await valueToken.balanceOf.call(gate.address) - , finalWorkerBalance = await valueToken.balanceOf.call(workers) - ; + it('successfully processes', async () => { - // check balances - assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); - assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); - assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await revertStaking(stakingIntentHash, workerAddress1, true, true); + + }); + + it('fails to process when already processStake is called', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await processStaking(stakingIntentHash, lock.s, workerAddress1, true); + + await revertStaking(stakingIntentHash, workerAddress1, true, false); + + }); + + it('fails to process when already stakingIntentHash is 9', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await revertStaking(0, workerAddress1, true, false); + + }); + + it('fails to process when already stakingIntentHash is invalid', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await revertStaking(beneficiaryAccount, workerAddress1, true, false); + + }); + + it('successfully process when worker is not whitelisted', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + let workerAddress = accounts[10]; + await revertStaking(stakingIntentHash, workerAddress, false, true); + + }); + + + it('fails to processes when stakeRequest was not accepted', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, true, false); + + }); + + it('fails to processes when stakeRequest was rejected', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + + await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, true, false); + }); + + it('fails to processes when stakeRequest was reverted', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); - // request again should fail - await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: workerAddress1})); + await revertStakeRequest(stakerAccount, stakeAmount ,true); + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, true, false); + }); }) - }) }); From b74d0ac8f774271cfb93621becc93d3ab45d272b Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 16 May 2018 17:16:00 +0530 Subject: [PATCH 0060/1361] test: code refactoring --- test/Gate.js | 137 +++++++++++---------------------------------------- 1 file changed, 29 insertions(+), 108 deletions(-) diff --git a/test/Gate.js b/test/Gate.js index cb7db98d..47a50748 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -42,23 +42,23 @@ contract('Gate', function(accounts) { workerAddress1 = result.workerAddress1; }; - const approveGateAndRequestStake = async function (amount, beneficiary, staker, successCase) { + const approveGateAndRequestStake = async function (amount, beneficiary, staker, isSuccessCase) { // approve gate contract await valueToken.approve(gate.address, amount, { from: staker }); // call the request stake - return requestStake(amount, beneficiary, staker, successCase); + return requestStake(amount, beneficiary, staker, isSuccessCase); }; - const requestStake = async function (amount, beneficiary, staker, successCase) { + const requestStake = async function (amount, beneficiary, staker, isSuccessCase) { // intial account balances let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) , initialGateBalance = await valueToken.balanceOf.call(gate.address) ; - if (successCase) { + if (isSuccessCase) { // success case let requestStakeResult = await gate.requestStake.call(amount, beneficiary, {from: staker}); - assert.equal(requestStakeResult, successCase); + assert.equal(requestStakeResult, isSuccessCase); let requestStakeResponse = await gate.requestStake(amount, beneficiary, {from: staker}); await Gate_utils.checkRequestStakeEvent(requestStakeResponse.logs[0],staker, amount, beneficiary); @@ -73,7 +73,7 @@ contract('Gate', function(accounts) { , finalGateBalance = await valueToken.balanceOf.call(gate.address) ; - if (successCase) { + if (isSuccessCase) { // check balances for success case assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.sub(amount)), true); assert.equal(finalGateBalance.equals(initialGateBalance.plus(amount)), true); @@ -87,13 +87,13 @@ contract('Gate', function(accounts) { await Utils.expectThrow(gate.requestStake(amount, beneficiary, {from: staker})); }; - const revertStakeRequest = async function (staker, amount , successCase) { + const revertStakeRequest = async function (staker, amount , isSuccessCase) { // intial account balances let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) , initialGateBalance = await valueToken.balanceOf.call(gate.address) ; - if (successCase) { + if (isSuccessCase) { // success case steps let revertRequestStakeResult = await gate.revertStakeRequest.call({from: staker}); assert.equal(revertRequestStakeResult, true); @@ -108,7 +108,7 @@ contract('Gate', function(accounts) { let finalStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) , finalGateBalance = await valueToken.balanceOf.call(gate.address) ; - if (successCase) { + if (isSuccessCase) { // check balances for success case assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(amount)), true); assert.equal(finalGateBalance.equals(initialGateBalance.sub(amount)), true); @@ -122,14 +122,14 @@ contract('Gate', function(accounts) { await Utils.expectThrow(gate.revertStakeRequest({from: staker})); }; - const rejectStakeRequest = async function (staker, amount, messageSender, successCase) { + const rejectStakeRequest = async function (staker, amount, messageSender, isSuccessCase) { // load intial account balance let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) , initialGateBalance = await valueToken.balanceOf.call(gate.address) ; - if (successCase) { + if (isSuccessCase) { let rejectRequestStakeResult = await gate.rejectStakeRequest.call(staker, {from: messageSender}); assert.equal(rejectRequestStakeResult, true); @@ -146,7 +146,7 @@ contract('Gate', function(accounts) { , finalGateBalance = await valueToken.balanceOf.call(gate.address) ; - if (successCase) { + if (isSuccessCase) { // check balances for success case assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(amount)), true); assert.equal(finalGateBalance.equals(initialGateBalance.sub(amount)), true); @@ -160,7 +160,7 @@ contract('Gate', function(accounts) { await Utils.expectThrow(gate.rejectStakeRequest(staker, {from: messageSender})); }; - const acceptStakeRequest = async function(staker, amount, lock, messageSender, successCase) { + const acceptStakeRequest = async function(staker, amount, lock, messageSender, isSuccessCase) { let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) , initialGateBalance = await valueToken.balanceOf.call(gate.address) @@ -168,15 +168,8 @@ contract('Gate', function(accounts) { ; let stakingIntentHash = null; - if (successCase) { - /*let acceptStakeRequestResult = await gate.acceptStakeRequest.call(staker, lock.l, {from: messageSender}); - let amountUT = acceptStakeRequestResult[0]; - let nonce = acceptStakeRequestResult[1]; - let unlockHeight = acceptStakeRequestResult[2].plus(1); - stakingIntentHash = await openSTValue.hashStakingIntent.call(uuid, staker, nonce, beneficiaryAccount, amount, - amountUT, unlockHeight, lock.l); -*/ + if (isSuccessCase) { let stakingIntentHashParams = await getStakingIntentHashParams(staker, amount, lock, messageSender); let amountUT = stakingIntentHashParams.amountUT; @@ -195,7 +188,7 @@ contract('Gate', function(accounts) { , finalGateBalance = await valueToken.balanceOf.call(gate.address) ; - if (successCase) { + if (isSuccessCase) { // check balances assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.sub(bountyAmount)), true); assert.equal(finalGateBalance.equals(initialGateBalance.plus(bountyAmount).sub(amount)), true); @@ -212,7 +205,7 @@ contract('Gate', function(accounts) { return {lock: lock, stakingIntentHash: stakingIntentHash} ; }; - const processStaking = async function (stakingIntentHash, unlockSecret, messageSender, successCase) { + const processStaking = async function (stakingIntentHash, unlockSecret, messageSender, isSuccessCase) { let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) , initialWorkerBalance = await valueToken.balanceOf.call(workers) @@ -220,7 +213,7 @@ contract('Gate', function(accounts) { , bountyAmount = await gate.bounty.call() ; - if (successCase) { + if (isSuccessCase) { let processStakingResult = await gate.processStaking.call(stakingIntentHash, unlockSecret, {from: messageSender}); assert.equal(processStakingResult, true); @@ -236,7 +229,7 @@ contract('Gate', function(accounts) { , finalWorkerBalance = await valueToken.balanceOf.call(workers) ; - if (successCase) { + if (isSuccessCase) { // check balances assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); @@ -252,7 +245,7 @@ contract('Gate', function(accounts) { await Utils.expectThrow(gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender})); }; - const revertStaking = async function (stakingIntentHash, messageSender, isWhiteListedWorker, successCase) { + const revertStaking = async function (stakingIntentHash, messageSender, isWhiteListedWorker, isSuccessCase) { let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) , initialWorkerBalance = await valueToken.balanceOf.call(workers) @@ -267,7 +260,7 @@ contract('Gate', function(accounts) { await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); } - if (successCase) { + if (isSuccessCase) { let revertStakingResponse = await gate.revertStaking(stakingIntentHash, {from: messageSender}); } else { await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); @@ -279,7 +272,7 @@ contract('Gate', function(accounts) { , finalWorkerBalance = await valueToken.balanceOf.call(workers) ; - if (successCase) { + if (isSuccessCase) { // check balances if (isWhiteListedWorker) { assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); @@ -525,14 +518,14 @@ contract('Gate', function(accounts) { await deployGate(); bountyAmount = await gate.bounty.call(); lock = HashLock.getHashLock(); - }); - - it('successfully processes', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + }); + + it('successfully processes', async () => { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -541,12 +534,7 @@ contract('Gate', function(accounts) { }); - it('fails to processes when the worker address is not white listed', async () => { - - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + it('fails to processes when the worker address is not whitelisted', async () => { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -558,11 +546,6 @@ contract('Gate', function(accounts) { it('fails to processes when stakingIntentHash is 0', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); await processStaking(0, lock.s, workerAddress1, false); @@ -570,11 +553,6 @@ contract('Gate', function(accounts) { it('fails to processes when stakingIntentHash is invalid', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); await processStaking(beneficiaryAccount, lock.s, workerAddress1, false); @@ -582,11 +560,6 @@ contract('Gate', function(accounts) { it('fails to processes when unlockSecret is 0', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -596,11 +569,6 @@ contract('Gate', function(accounts) { it('fails to processes when unlockSecret is invalid', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -610,10 +578,6 @@ contract('Gate', function(accounts) { it('fails to processes when stakeRequest was not accepted', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); @@ -621,10 +585,6 @@ contract('Gate', function(accounts) { it('fails to processes when stakeRequest was rejected', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); @@ -634,10 +594,6 @@ contract('Gate', function(accounts) { it('fails to processes when stakeRequest was reverted', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await revertStakeRequest(stakerAccount, stakeAmount ,true); @@ -645,7 +601,6 @@ contract('Gate', function(accounts) { }); - }); @@ -658,14 +613,13 @@ contract('Gate', function(accounts) { await deployGate(); bountyAmount = await gate.bounty.call(); lock = HashLock.getHashLock(); - }); - - it('successfully processes', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + }); + + it('successfully processes', async () => { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -676,11 +630,6 @@ contract('Gate', function(accounts) { it('fails to process when already processStake is called', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -690,12 +639,7 @@ contract('Gate', function(accounts) { }); - it('fails to process when already stakingIntentHash is 9', async () => { - - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + it('fails to process when already stakingIntentHash is 0', async () => { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -706,11 +650,6 @@ contract('Gate', function(accounts) { it('fails to process when already stakingIntentHash is invalid', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -720,11 +659,6 @@ contract('Gate', function(accounts) { it('successfully process when worker is not whitelisted', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; @@ -736,22 +670,13 @@ contract('Gate', function(accounts) { it('fails to processes when stakeRequest was not accepted', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); - await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, true, false); }); it('fails to processes when stakeRequest was rejected', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); @@ -760,10 +685,6 @@ contract('Gate', function(accounts) { it('fails to processes when stakeRequest was reverted', async () => { - await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); - await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); - let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await revertStakeRequest(stakerAccount, stakeAmount ,true); From 0a45fec384eb5b93d8fb6fcfe3fc100ebd434b9d Mon Sep 17 00:00:00 2001 From: Benjamin Bollen Date: Wed, 16 May 2018 14:57:43 +0200 Subject: [PATCH 0061/1361] docs/diagrams: add stake and mint diagrams for v0.9.2 and proposed v0.9.3 --- .gitignore | 10 + docs/diagrams/v092/stakemintv092.png | Bin 0 -> 454975 bytes .../diagrams/v093/stakemint/stakemintv093.pdf | Bin 0 -> 96457 bytes .../diagrams/v093/stakemint/stakemintv093.tex | 342 ++++++++++++++++++ 4 files changed, 352 insertions(+) create mode 100644 docs/diagrams/v092/stakemintv092.png create mode 100644 docs/diagrams/v093/stakemint/stakemintv093.pdf create mode 100644 docs/diagrams/v093/stakemint/stakemintv093.tex diff --git a/.gitignore b/.gitignore index fa0445a4..7f79520f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,13 @@ node_modules #Dont track idea file .idea/ + +# LaTeX auxiliary files +*.aux +*.log +## Build tool auxiliary files: +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync \ No newline at end of file diff --git a/docs/diagrams/v092/stakemintv092.png b/docs/diagrams/v092/stakemintv092.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee948e7f152f8c285aa0e09c7f8765d298fd556 GIT binary patch literal 454975 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

*8|LaY&g}n1}Xze)d#!bQe$R!#2Nl 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%0D-e)A2SDHfR3HZfe}b{T#>we(Ni>Ze>taQ%+sK_! z(L$z!*f=SlNo8f_V`i=UjEsz~_7++f6XM-BQ1_Xy9FES2_sF~T5GRmT7P7{jW+1K%4Ipc=Y=ww#IrJYPlatUSEB+MgEY* zopwgA&uccb2>&Kz^7h2pv+L9^5ygOpn%1(-laQn+z9`n^a+MLV@T*B5T}7EHD7GaHe}&0=7$LMf z9e1R9MIJR&R82gLza6m%#-mA_z*LrHR zt!oqku_1LVLw#H?v1jKosnx17Qk^G!=d12xHp?Gyom_4{dZ&7dQv9fg6j!nHm!thZ zC$R^~jCqgp&c&;Rw)x#3L@F&CUz|?K$jIwfRkr7oa?MzL%)%X0|9AU(=PkP2+7^Z& ztbko~Q(=2RTtU`4vtEtMTDNStZ!d^SVqV?k;88rik7o@kT>sz~t{4@Z%ni@1MGjd2 z4Z?3-QlBEdfI(E(tE6_6np-;Gup#G)w^8e&S1~5jRR)NQ1Y6--StpD{kze}ZKc1T<^ph6fXMX;*LMez&;NE%kv3U! z&sbIae<*e?>~xV1L7KJrrQ)+5PJa|}(=!13@dVQiD^v6H+Z<)H`g!>OiGW>msS_*`r>Mh z$QCx^s%KS^T?iUHVE=JLbV+R^APUCxK?(M*=_RWKGtX6bR33UAuXFYyc_$#xA;VLF*Nf%ZT%e!f95xIViFEHu|M1#{;8BO^glV)Dj^6v~BjN0i<*arfy~7*@~@H8}Q#nFoD`O*=>2umblXXatQ2?)&K! ziGj$E??2_99oRdsgn@%lwDm890HQEhrH!kSnr_HDF#Q?JTqjFKQ8_V>PT)x7b*-{K zmD@IZEu2XD^z7a=$A~o+?>=?_j?z?hAE7;UCryg9&wpA>skXAns9qp29u|%$SJ!3J zSP{#2QOV9$Xlo-ZjMw_R6s8@q`Le6t!!ymy*x6JX`TsXE{_Qk<=5XYptD&vSW6OhQ z%1)AZx2#;RU6}nS)_xzXqzf~Ik?rz#mGLOW7$J}Vf||^HrXJh)oAaLGCp9Ip<(rl% z>(}0OXWW&TA$Do1*}w5P^iqR|8G#nT-%OU111T6q4HHIxZ<|`!zokt7L9*>Xa5#18 z!7)abVR@Pj-kau8XS0wltqULvjpEXRrX;42dp%XDQvdEw4k4_kh>WWd5!PsDX)SpZ znX?c1tV;2EbL(BVYT3TN7<6l@D*3>8z@eD6sHHB9yL~+-Xyn$n<-Kg8Yf@RowT9o1 zy^FLV!tDFamLKsxPucz%fRC^RAo-|qtJ=F-CI38$Eo_6FVL~q5<~maw!nM1VlQgnJ zIxEhHkeafBxs$2a-RyW2D~b7+;-_*Mjf9{Pq2GSl!Fm#HsWmr&ops;+5tVDun(LGp zd)HS3nk$k;SHbDX)9L`L4OJwWtVBNl@V*_A%C#*<857GlO0VMp*R^nQg(sW0tT#(% zvD+qUZr|##=V_K_mQIkJ>ugFF;w*l`2UTiUjtg)Mk=%?PP+}37pgS#Fd=mGO+7Z-4 zI{#&{CJE=ZN7UEUutA}toIcUprL{oVvvs=3J=Nsw{?9Ux|E0=+Lc90iKk(jwbJ8?i z-*hz|@~%bt5#8N_pPn3%m-^O`Yt96DC`sw*Dn)fR>dl^#wxbRgas8%+bDBmWrw;wI z<E?qNUT-|-!OTy;IWybO)o--HVOSPl04r5_Z3Fa!z43(nk`W^hJ}`Zzg^Udd zs*-8jQXsD96~ZbGN$#{ET?+w!wm;pcv8^$6cN@S&t5iG0^9u6i)WcImB~x7#c~y39 z7*!Z3=1$tg`^C4I4m))ufvi=;xR zzVMZ%gTJ*22#dz%&WA5Wzgc5(r%Zen1L?eC&)ev+kZR8bO`kiwMFHS6o6?HI`tv0e zzUukpUsdOrab1v$9`*(L8q^<_tPj)CjD6os#`?PO)S-PVW3t}C=CRl_q5#X8Ui>%{ zZZMvn6ms|TXAYZ9XqrsW1TNQc?K{tT-$@6s%%zbJU^%bMe8SqsMb(Kp#=0Vh!GU*7lMFOt#mNTe zIaSOOC1$i1)m`kwl3hVb(~1fUyL;``$Q>4pPYaX@GvA`^;`8%2-H}5@OW2(d$W9oV zlHXy3Aw_5vS~Ts@FS4&x>x=sLGDxzN<#JuwO9z=Xe7`wcaca1(YHg7*nJO&3b#QC^B_7RH~!KBk;Z4lhc4A94un9^s^( zC#{{do0Z;{&3g&kZ$}=0?2=C&f7lV0uW*(qOLxWD09dMP2{B53l}+Na&i$Ir&(M`M zL{dbG#n5FV)<3Ex>$XF&rh6sFMs%S@2fod!GYNc0RmDrEl!cjPF0TZ6$b-uEuS>mY zyE|A_YARy=UwhJyRQe}={x?u!I`W^O1au@~5I4t?aVK^iP>e*{S*Va&7yY4_6GggD zr(4oOEhp~ZzaO%l#2U07nykC?`;ktUs2YRa^LdJ?&0ScZ*+VGfAlbt{z2eIZ*CiJ z2-;L!`xxJoyn9cojY?uU#o9co{t7V1Ho3;1jH_MGmU8$@+fO;mg12}E-rzSBqxiXy z(oc=KxVa4hNl-d?TK8u^IBPXMlh8eW`e`8#)DA;LM~Z1Rq|eI$P1aux0BF*8l1H(L z2nCq4n_D%{rReM{erowtOsDxd*&9;j!lbT)`g1{xWSzbSgB}B4$w{uz_)pyO zaW4kwr<(9t5Zu%}hOFwR@1HPA|6)$;V+k1vitOj2>;I_+0+ z-hQr-nwOLKx|U!3`Vj#ROIquvTF0&ee(spJG6ekK6seF%6*-kU|1T&~U+K#~W3fL_ zr1N==jV6s2@|d#mX$dM*PBJ;Q$;F7o zR6DS9`VlpX$_=jJq1Gz0^*lo^jn8ezWSddxVBN@pu0$jDGv$k^=fQJ?Ju5nFi+m|x zvp=>~Ty6@jTg&y+f^ycay{nURBWKvtgZAx80qrCBFr4t-me(*%mt6PAjjz!?nMqZe zCMs_L_AGF+qHoTfNc}eM^E@)Ay_}p8v?)_ojfc4bzi|9$uBXgykkJ!GI z_bqDMG~4Nw`2@eDT(?Em0N*-S4i=Piy)L;kz@2i`u4&xD#`;KA6yC0Ic+u{YXGfk4 zN`K#>*3bhaGl(4%-MJm%85^e;QTEHViU>zAEThfsvGbN)@0<5E_#@>UXq`pvNe1Fr z-V&g@D3h>z5|nA=&~T_yWRAq#Ehvknbqz?m&9VU@fg9TboMyUBws7u_?1-LmCE292 zS;SjP^xzY1m@EK==UFx_&4e?O+Ma*3Cks=Dhw* zp-jf^)EBSWBX0-nm8M5vb=kYxppfi{kA#FCX?1m;dfl0{g6wCH1#BwvEW7w_c2k~? zbt4r%;i6b{XU8||Hm*35*@uZ5Nk=byoRPnDRFA+7pn4=d2Bqp2VJ&V?+biSZ*x5zl z8gJS6(fx^8k1fUR%C$VU4&nGsI=%tT=@%IF`B_jDJgV1|T3zV`?BLhF{+U@!5)Hb3 zI1V)0g#V+`|9#%`XkpwxvmLO+7xD3{+S=MiCnoZ`RdD^Sy}h>W(|}&7H?*|1-H(ji zyyW#6|M-a#V!Yp9Yh%mGq~+tf)p^uK@z$07AQiE@u8&|SrbX_te0f+=eWp85bvrcw!4J#(UU5D2W~+y9Ixs|K zqo$>6kTM=Rbsg_L7r6J!qV6Z|j5VvCcVa%)PhI#Rl0EZ2?~Fzs*$GIpR`O-wPoR&m ztj>#OjD|%EZS|CeJ5oK__MR`9>*?*yqw93`tUXnJ!uW!HfR;)OTA+obl*l;0NIlJ< z1noZ3W;=D+nSNQxVJu9z?aIrTTJmn*!3uh{s$f7T$DgVro^+`E>LNH31UA$}V&P>@#<_r}BoUx@|j^$zuZ&RaAFc6Af zOEuDy(^{+tiPVDv9C5Ep&UoJT2LJCTQ`s)ayDp^X=DRH&EQB%!TBwT6fhDz&7T41wo<{)+fy!Sa(T)m)uf>R__Px6LDc!c=lH@f3@h?(~ zHv+Mr(l&`m0bWhN5t83=1{hKJ=8GKo0X~&yN3|~1YjBGLR8v_TXug4M?M4niq*IAp zn4kB<-kX}5Dk@}oD7s_{#h;tsJP3?7u44`{dR4a}yTnQv)CBt3AR9XE=_eegwgIg5 z0YVIVte6*Mv$(LSPuGBi>rSZ6=Ceim)b}6dojepBq6{0EaI=Oz$sT}A*lkSD< ze2?S{h{CIEo~|?jmkK@^N!Zazz15M%+&K$1$?b2EvBHNJAU9L_Pi7Ib&uKa(h@_5y z&+gn%L>=;P`gX~x2SAUw+}zb5Xjy7mud26*O(z^|qN5$=?DEj_)X??5iNd8$ikIy5 zesw%IJ5&`*kw{7z56d9m^+qqhZ^6F}9iHxr?3Yp$3D&KoLE(Y*_( zJcGdtJ6Khak{F+kPZA!}!W;yKeE@Vai`y(p_DJq-?nS^=KOfRUx<`sb>>=s2sxKSr zlD&Uw0UF(nWhrTW2cg#D;f{)LRU+6&agw(r%!}P;r z>XVhOqyb0T>H#nti}vKvx0ZGH*1TDoDc1A}E3uIly{#a0Nv3+Sho8+19;04#nBT;qL+;Zn&uMi3m2}+qGP45$x*pu;XaJpHQb2)%wp(4wQxWgt<{g)jl zxi|z5%H42P4SnqWax-St`vL=_7l0}b7YQD$w1fnkWc>=@wn$DdVs$jshGVA`n)mvS zX>Zfu_GpVY8o0oysITj@dO)yTX{k=I>#LWjpVSO<_6;tRNODbSeSf_4C~+2dz3ww9 ziR{}$)x}M$1UAVYnM~dnVCGZOi58EWx@+ddMhik0*Gy3qEBdkx8NIJmK}|Y|PRUlK zQAtp-TeIFyLz)G5|6P(cedU$*(imZZONibUYXtwI>Ud|BF@G89po7M(y5^Dm* zNg-&j%8+mTK6ikJ9zT742jDfr=OJg>CdH;KhMcOt>WN?Fsrqry83t14Z#$dibGgR1 zHrPDr=aK!LSN{0?PXw*-$qO{qU^cIrVGVA{p|+yVW%zoP}rUgI>jjBLhvQyCrpH-gHN?s`%$=0q~o{@z(` z{FD>Ml1G@x(PTMTs4l#vzIN+PVnar+6Cl!)PyB+XkAVVZ(;!6s5gJc1-?_ZkJMF@@ zqw^VgME-^9ASGWlLFu{70%b54U%#15p=K73(7Wpzp3Aw|yo_te?=r+GJcE#EZ*VO4 z*v#8{e@V>ZlgXv6(~E%8KyEg=bjDxl-s*?`!bIY}?-D0HtvEqhS|=7 z#tzlURq_L7f3&?e=>|xFGhg5P2~Oj@hmWT#D3^}&PQu}`J?TgIzeQ7BuNn%AckJ&4X3sAW zT6@Sn)!njtnz0H6qFbj~FkXPEAk}zKl~s@shhHP4I8aAerpKj~l$5fG-WcOf0QA1|5uTn}jYU27>wy7GYa7$1j4Ats(YMdO6dg%enmY+fGV&!K&G^YH z+9-A5bq7Iv`Xl4oHAH8%$()#CvT0jKyU2?`52Gt00LvCRPKFLJef!uxnH3!7&K-j? ziPwk5$IDGp7%T-uG)OJK9ZiZ`xO4Gmb$VQC?!?JG428}4M)n@tjQWJn?OD}HQl&lb zKMo1+0K<8stwi_hN7?3PJIB}Tb!poo8gk(TCFi~ECTUOyiTdi0ILEJUB6W^xt2IYC za0|VSd_Jy>(U9&sw})Lpl!$3H5=(#2gc(dR@M(eTmp}6bQg$Pk4*Dv--X4u{G>}GY zP>zUE`Ver(D#pr3!TRcYK%WCZ4!3lJq1~C^<7S_Iy*@ucB4kZ6jb%=GUbFPd{-L(E zp8Ip_I1xfE(>Y-?&2wKTRrenX-L8tP9YcgD-Ww`;UUCwhUNuCTZJW_pA5JTq9|bIc zYqe8Hk9_()d)ln=m@xOGY$(keIH@n>)ml!k)%HDTF%Q1pHX=L#fbij63W^1*QIPDf zb$kIirb*u&nWPG-PLdnn^vBrNTaQ7QyOlepTeNYLoS6%AZQ09|jJdacwlt+i1SP=a zw-N8BL55ZXW(Xh;QsKBjL*{1*`M7PhqS8gWx>*?8I0A?diwSp++KB+_QJvVSqfl^i zE+*$;4&VmB&@~5zoL?1&zFzi;5CA%BKus(&CWuqbokqID;+gHI)c&io{XKfNGjzlL zO=}_Qkh4p&YVPoLNr4Z5aXt~cR_O6Y9e>fM=Up3W!*9;dgxCy9jM2AaS)?a|vLk`= z$(u)&U$SqO&C84g#l4Mid%krTnj_sh-N;gb@y2P#Bs;X4Kp6~nR$E=bE3~SiHYme!};LOXlS4^%g4;6@PBpQz({in@9@0*6-P^ z=d~Ym)XXe`Ft;US((U3>KmqoEqF@vd@BY(yo0KzZVK{+}Q{qEOIoK&TwW?nNqQUN;50Nzgiay9mv@&#WZXKe0 zN*|=xCl|lGa5Z1u2>R}!x=Cvjii8H7_&HE*xg$8&so{qFDvbm43B$NUM+L_}6^nr? zZD8(<;mAd$hA7zxN58w&^4MCZy*{54+G&}s=S&O#x`k^?#v zqa{wjePDQ?&hK3BGxF=PN)Hn6Ql=K`gR|;92Mmt%*$07qSI02f!e+nZW54=|QckV$ zG2smXUK?b47t?Z}7Or%}6|XnS?cNJg-O_oZ9O-k=wSeHTb)n={DOx4IhclUyJEE$G z-bMmT=!XG`Ka-LQ30NJ**QYzd!L9ICS&_dQy|~PW-xlPG64xZV3!e>kVJ>smvTx2# z8O-z1d?AW@<4yyLHVEvc%Tq)1>irK=>`5k92wFSDu>43CP4ceYzkIB7k%AobEF7Hn zEIR24#DRlJ@Q!@}TqKXGu>RI=$8(;y9lNr`@*;8;M8927wr>v3yy})&-T6rL@zb7M zVqE;b&Hz6|#cLiAWNouAyNGIU0Tt5%c?>Xvk4G+SIGokLgsEXhEl!WXoKH2bzO4Yk z0{*I*w;>$@bQt=mH9+Uc8(;alvLj@ZSSB$c(|OIV*nS?>w=M@*Rc052xwvD9L~Axo z6Spd39WK+zSH602;Ow$Xx207hWp}#My)&ov%jq&-Z1gPk43u#DgvUwdKAK*?0PygN z1=$L&@nFLHxrDt$^R0mON7hh?#Xp!pf#3)zA!&XUCt{2QqcVc7Y8$P_mU1Ej+Sw-! z(hP;xlVNF}2z)MWRZzTvV5aLxL0nGntl#?9c<;??+Z%#gJtHkZJY$iq{W?_Tmr&2M z@UKHABy+ExN|cIWUtnS3qjy^yBrqO_9QQ6_Z}@Qta(Nmgl7kf#W{v+m;IJD2=}jP% zg%-;pIkj?TeZK#1e)0ebo`wYGb9#RDe(=!!>7r`7!-_68W;pc6CP-P4Uv4bXDhvxn z)qxJ>Sr=cBb{6%zJH-?-7W zw+~23MG)YA2OBTP2>mAfkyYiYYZjsNMpS(YK567o>=Ef#MfNpPk<<*sLIuw)Gqw5C z`7~ezuN7l}D3d?89wGY>{SeQ(K`)2x72OqI76Qj0puMx&gD_-MlclAl`F@hPn59={ zT(^G?BurmGtMOF5B8Ik+n)lKbkPL7W4kxpF1uUcK4gN5-mjD32p$eDXfi`{RTOT$x zQ#v0*UW<|g_iDKthX6^3N6x!InRA)|RHa~H->YHG$?o203Do<@$HyR&wcLF}At$2a zG_W$QZQB;68(@3l7QBfUqKfA|u5VJlldv%9-?*z4hnzNV3-n z`joBMEIHFO$_gz`oQd1;eFP8tV+4=yyTT+a>0ui&o;DibfhMt7wGO3j1LW0qDgtS2>JJf_>>?1urrRFd#q(9L}{Nw(RH!3iQVjx<6^ZbVgH%sY+ z?lz+!2+VqCE;ZC1Eo7$xYh%qRf`(zbHFtY_C(~i@aj+3|B%afofst;aV*xWxn&gMB zohx#%N2nERPkt0z`rZ zS?o1F!0f&cq}?5T4Q=@mz8ICUUKW_cFm;o8H(=jQ^Xnls1(Hco_1|+o3?LnzEQEa6 zLRDm-yWFk?TjGE!duB)m0V2P~$nUaLM_yWYzede1`RDi^KNyWO2Duv|00A^^NZr(@ zpd>A^x7W_if^-VTXAvuB zT=zKQ6+fF7QpN+WwT-f@DlqyPd0?Uc3Dth$D^qvIf#8x;$h;DW+CfI3XN{xtcGZbW z>ywVY__g z(VR>6RyNj^FjmV>NQ%obOrH)0yr5jS#1S1JhLb;M?%7JvGM%8X8158)lkf55M6Y}3 zbC}G+NX)7noZnm?#GTAJ1euM;K=M(rHsh08HkPx!94BK&V50>;`^YuAuD?C?t}h{? zV$zi$-*<>Mz7rs0l>N-d!p@UFhz)+*a3g}2ac+PFu)!)clQNoL3+Z85R!#*ywA`l! zA+{+gfZ@K|@AS08O*;XZRh`a-f*bh|pcnu>oq^PSaE~~XcTtmYp31?B?<{YwS@kKK*bT*cR=a53 z!wC68frbZ}NdvJI%xAU-JIpvhPL;=Gcs^{1RfsMcnOA zYm!?Z|Io0NU;V3wjk2TS71voC&6AraF`pMWv3n%djf@%QhWTUtr^h)ZcRlWv<=R*k z_)h^pmbx=*N{#non#xP*AX7`Y37j<@5g#MuJi_`D_c%i00kssI441Jz2+{d0qe^1w zaZ)6vMV*eSWJ05kou19!*V51-11aG%Qw#CetjDIuKcdl20IR8Be}`{GNa;h8kl zD9CB>GI>34YOL!f$(rHHy2o{Plsg8!V&Ra@9doSEbdnV8zkm>Eu)o|Q zI|5pUR_g>i6G&6?8rOhOIV(dyR#z~py-go~>q=`uc9%1mwn5cLv&smW%gCF2AZ!h&E5Hc?(FwlhCjX$=w@8 zzYn2Y?@5YylG}ep8e+Jn^z1H4-A9j9{PC3bC;j1kKSn42QSv(uX*PEDK7e_g!MI}C zS4y_V5N>u$kg;R0t-@meGsJWe944i6*^m*aX;Ib0<3XlCR{p5*=a8s#Jwo7nzux6X zUl65v897$MQ1e2QtVN2D*qruT(fxI7teaq3eLXJwQ_ewR4g!M4ZHj4KTHt(h4ul3K zv(-)qh09h3>#mFvr(R3Deoa%f(#7A37(2B;zz32JpVlk&I%GUdZ-4~_u~kTwG1hlr zhyp3S8Dcx z^fi9^f@zD9Cn#wxv4tL(R8Hs4a+L`pfLzGT*<^d3%_B>!D8&`fe4ASpP%wGDx~Y;q zq+ZBi2o>!mu2Tsiv|j+?gTKHl0MNCfVe4i8WbA$L(8%;%5O=zyRwA>5e{YoT!cvAQ z7t!`%cNx^Ym8N!soo zYvrA?Cs}r;G-O!;nJUnA#_bRDL#kRtavABw?jl_R5QmLjgmZ#$ARS>zM{+KH^DlUt zfEJO7jL-75Iwxb8!El8botB>MPf6HBab4BK9TS-qW5+MX9b@`)R`(wU_j=HJdhUA9 z0N%L%E%vqYO~l^B3m36tc~;yTo8ojnxksr0GMX7{CIWizT0W?Z4uccX z*F#wkh1`*RnN70`q?Nq?dQwTj(QkyO-!t+h&qo(A%Iuf_C`+ZR;9{%KM*>G zs~0sd&9sIxHj3xKAbcyK`wK(xl=E*$G1_9)wr5BDos5)}k1){)FG}b_gP{Kdn9&=- z*946_TcYVh^SJ1Wt0EP*@{ESI?FfL8pqdeo^l|Fo4?D$+TtABsXrDOQ@AmA)6=M@q?q@*|7@`O7Y#?vsLlxf1+Hs9H1m`N-|qzT)1 z@Qo&V)1xzrAQ=vk#H!o93mxO$Qmz-6R-cABw$G|zs_HySSXx7;{Cfng0t!@JcepA` z#>g0yA(>e--Ts&TE`=Zc!y2NXW^Db?jBE&?4F->#+9R32tjF}EdSZRm{Unn~nya5y z_MUl#OEanI*-eYLOebigQ&T5e{oY-FXLS)UM-xv{b<1Ai)PID79}^GzYh3*fP$$`ykp zK4kXSxV14QeJj%k(-?%6xR_;d=7&HO!n{?@dw@pdF10R~TuUx!XpWdy_gWT!A#e8T zTHr>&RCaD*i!Xl{{OGD|3-NdAV{@*i4-DlasC{Pzg75?Q8W7(PN`FKfu4P{6c=_vW zZ>&VmD^-wAgTS^ztoTLd89*+W5US)mE0DO`m$_t>q$}~ocBZSiC-2uJzyBSrRhatv zYu&}xeXJ@yaff&!Fn&+@y`S3~b92X}WWPMsks@0sr;~rd0~{V+Q*U7#1W>IvVc7fP z@vO+jwO;x&j`e++@J7O3hYcG;yr78Dp^xo&xB4BTN(JHnX@ECVIfC~M{~38n-#4bM zA5hQ$sIP+Z9(4BAkW^4Hriqo<^PyhZw$!FnQ>N@I%<8pR(Wpj5`EzTc7L)?WoO+8( zz_9!H36j^jLGZ#0s#abD_U+D}CW4|Oj_Cx}9jdHJrBOgiL+yaMo!~U2Q zrL5Ly8eD(B)FHoQgPo0F*ZBKANQr2|h%)>ExWKZXKL)0n#@;5l&$gM*f|UMX9iVoV za}DS>AgqPKCgM%>BPkBYxHTh&zTZqY0Ip44+uy@Q_k;WXUx z<7&SuZ4u0vwp4%%^WGQc!*Sw9UN@h{%?>gkD83V-n&1rK)fURZFxcddW z!tXBlw}E6cULzgWfgA6xl;NpQ6L+5g9V&&7ieK1Kj@<X$Ygs&22k%T2L;Idk^TP|iz3;T?{ge;v;KY6zc_@A7@uhl|Z_J-ukb z!s(yW>%u%UVKR$x9$f z0GI_iXi-b+wOfKIcIlF|6X@Rq6H(moV0w#&sJ! zc-zLQu~oP-u|w!Dxv``S)kN9Ebh$j`sz_EyBsYa%}z(`i^XcO1vJ&*sF@ zjru4o((^0addoeD`tq~}bD9ijzuv!}E}$5d(Xj}}0C?NS*YuHGx)9>2m9I~>V@IuT zc9*}sENil8dT@51Bjd<=`m|v+-nt=5&!;8x+d6fE-HWzljRSpkf<-I4V-03ChpZ(( zb4~gUEz!1ZeEDo)x=MrwBjSU`RU7p)B#qNF8L?@Ue7`<%9!pZomq*9LFSjuoA{b)c zvq2|M?{bXgw!`fD!OG{l8(|d`Fv`D>(!XyK88f+BFu2ppqn};+6oWx*i@KS!+0y9t zYq%-XeI97JTDTY9+rG>*eZLtQs(l`xRgoK%Y$7v)tH}&jvJWU=^sIUM>cLWvmhi#K zF{8c}CeT)N(c0Fez>}==*dzH;8?*l;M$E0?rf^awzopmY9vv0W80|+x96)`25m{csEVlIUYS@-!QX;GT>5-)8a!MQ;9`MlobMA0& z^!RiLR3T9P?a9M?Fn+h=tytibpeR)PNFgs8dmgNky4p|pO4V#Yj z77cCFNKJpCaM5K|Z6Pn=2-8bmQV2~UZG0!5H|o2=QtoI9U-*$c5A+g*VYS9DM6nr1 z-fRA+iCjTLQ!gN%<1*J?nlpMM)<=_Sk?juCO~f!EkGcXozKjw97ognHX<$+M?h0tk z_(@qaW0#(UArY|T~x-WSvrmQNx1(x*?bU|VSzg8M*T7_ zvKp_ZZ{f)xO$v)ICMPXDhiZ;sH=ac*FTry4%BE(i?xv9)#g)yLuEx&hhiAMVX!i_a z-R0WHxp;zUcqu>o$?c=JxzuzTC>0riuOYXCo))}|bW#MS`Ty=x|FlKd+4~V2Y)|M{ zQA=@0XhY?N!?SprcFe3-*jud@xhlF?`T1#K{|AFrf9yp2J_BhQ4$u%R*E20OFgIsG zFhae-i;@C9FpIkU!BqZCfZmS^h8-9hsEX9;Y+C0aQ#Cl`o$8HxO3E-V_ar{;e@`(bsOp8>=Oxg&#Ik5F zQw?dJX+(mMcePq#o6(HW35aE$#6!=B6rZoR;@`t|tUS6uGVuK$Do?30i`n~cdy4c7 z9uyV?iPLtXo8GS3OB9`8H2)hn8LFy$b}QTyXaav}CL?big(eJkb7=mHZu0tylSv+B zYwq3zSfqmLFTb@KQJ`nq4uqC+?wf*fv_&%b!r*`ECzXEcCuNbsL`wojt_~itri^31 z7^6W84u}pEn1JLUbJcoWSKQp(y1P~*N+H)?gq@zUN5ii`mx_$;4U(2SQ7EX(?90(Q zCs=^r0XA-8$;zZ5-~x;`g!d-~s~UNOw;*y>0a=&dU{l?JX&Y@fUcfIL$_a|Gd?uS(~T<388ji3%UR#0ffl%Dk(_^y~{cOWaWX@t!9N_ZD zeJX7avQ}GpqL$oAeR-0g*6=Oz488HzcT&QuSWl{=fv_21=vPp|b)H-g2wPR6>i$m9 z7>s$8!)WNf0ONM^k=Rd>qLNH0OHp)S8Aj${t&QzUqVO@cB5W9oU)s=0yAVA)-fx0 zjdJHhoxB#JkxQk@q`*swEWIg{2(?6Qn9&BU;5*?xGFG0PjFM}S1BPSV>7Nax6KFD^ zat2=m%X|L==gYUUOEzb^>-pBA%- zH7%{`5&S62IJqZtNrXG*Jli4^Q{fl?v?L@EJM|<8r0#sn7Mo!!?9q-%Nu zY)*%v_8Yo*z6*hp*dr?uLRrp6BTZ#SJL4j5m!#nS4n8LV1%=c%KXwrQlsY{)&-Y&| zfcywuOQ%X#+P$qSRCx{=-Bs}A@1|z zr5+C#1%xmk&sP*5>X^G`*}v!p$_l)n9)-t0DAC0?>bD)S6KxFw}K)4MA=Fw zPKi|<@@aK>xi@n%sLm2VA1spOn0+oVHK|}-K)gb^p%y`E!)WVgQekj!PPrkG4yuTI zV*>D?L8b0nATzs=J<~xklXSi*4CGTaGW^&LKP)BNR>ql7+5E3i5{pf{@pn`JX;X2y za{PM{a^a#+i(Ax*-2$+r6#-Fy0c!EU^Lq1pHeh`V3u!`OvVuW?qy9F8E@KJ)#HdE= zZol;+{PK__K(3)hzgAp!hxWJ1pSJeg895#8@Ar*<8_>V$cE(HIG1^Y#E)}nb^**pb z=ZA_RR69$*)b!Rv0J?p@J_DPMJf3S`0}Fl2S)S5}!4pYd;+hz0uk*&6yTGHCCrYewc)drF*B9SZN>Yp*iF2 zWP4i5f{kcC&t3TYl7;E}{64HKh>bQ62c~TeUtnY7XdEzM8T~qz(0VKPxpB_E=jl@N zxXGpPEOF+`ee8YgOSAdFu(Zq=jmv30HijmgTSShBKP<|6U>5#2+ zo=1^F?6+;17eBlq#N0RZbK&bJR`se3pB*8kB_nd3$(Q>VIEUz=YuD~jFxBr*JaD=5 zG9~ARr@Xv;60=J40rmKO%`tr|>1CNVU9utgt}ji-#k4ZtacZCGASEjya0rTxortoYg2 zZ^q^#?1l#;wmKO$@=)%*r8#bI?2}$Zkzk>$#qo=>4GgJeyPm?5%j0b9>@|w$hRqL? zEu7DjXkQk`pGj(AR)Va~#`RWo%`vc(pE{mRyY&$@HXYEVp*J>lRb|&;y7iYp}$gCRwgWNzA-+$*9dn<*ER(q`l+bxYGtg(HnunRjY2_Jj%oWBAa-kC4)Wq zq@h4Kdti$_ZZ!&}Qs!-BjQwh8x6QVQ^D$q|lJPrrtBH(+LRYlks=Xh7`zq@;5G%}t z$~a@V8f7o>)d6K6y}0PwwknmsX4PJGo-u-$tQc?d3T1dCb^a{>#*GHn93QKcXLH3x z%#ZTTx8Pq)uOjUV*x}M^k?{0>n0VD8PtJ)@#-c>9j9l_(fdshcarUw{%Qv4}U3J@e zU0FZ+qHK~B?KDgamo=T8->eiRD`nvHc8=`-;MvuzS}b)S*wJDn>gt&7E~V9XS355# zMCebMNx%X}alyflmj`?L#Me z3+3tbT;?H>&4Ha(ve^R^IzdI>oR70{;*o65aeGU~@*~UO)u?UHXS~*-R0jTR!pB|O zS`z!v{qE{&Ck}o$-`DKD)Rx+GlorkmM?@AL$P^9O@oD)Jo^P|{#-8Zn5#efv*p(wn zD|3NHbQyLwh09%!#6J2P(ap|Q=u7Vm*g?B7i+}1ZTahxdazB?9FKhC7z2nB9wrTE- zlNs%i_Rr(VykM(yr^+!htPN4U%ULJg_79wDer-eDo94o@cE>Y}_soDJak5m|#GAsK zhG#6KHkEX(+@kk2H8ws@Q?25aWas2;S>F=-<^A5t@XLdzTrGK(jTk$5pw`rS zGcSUYy#HsLv@eT``EZaX-_lpc9msg7H9->>EYAz$>-?-Xo+;YOT{7T2dceLMXa8tD z>dm1tg1tm`UsStrF@gU9{}iiO*etsugg7_P(MOYbg*)62|IJ$Yzh*9k-Dq3xV$k|- ze(K+~X@^bsjc%cV((QUV9{x$!hC^~>Uwp!0lFWqC|9VXU!1q~lWj6>`2|mv7!}^mC>~Cm zI>I2n#KwcSIQL(>@5KRe`oX9-PUACim*uzxtZzjwAO+6|np~V;mo<%T*+|glEl{iM zWSE_5PoIls-zmg`lH31h^8*LIy`YDk5r5ZL%(%Q@G#2)5{g?;YEcu=3qjB0jYkd^T zb)ek0^cJn+J^f>OuUxmis=La2i7n-q#I>Y{O+Pq|3tz~+}hpS7$kZQ>V$wD`6N9H!A{?3L)=m#j54 z6t9+J3RBAy#K(#!-!L zKaG=jFP@tstsV6Bd^;p0e0$SJ?3B;SYE;MCTkNPeJ&&uI-q<`YM7^;ts$dBE7ZuLlf1H52L@bF3=U8xein-J%c7-@thv3u)Wwzrd9(vplo5>ivS#be{=o z87N*ypt2H*P^gKwp6qV(eO|pk5GHEHx?IDsVROtN?O_cpQ!pOEPhdU?1(Gsh(zer~k$9@rbGUTk2 z^`7MYR{RhORXSt%uIEp|ey{Y@ER)Wim61aqWl@i9{v2f1qrT_okRZ|HjpxQW=)U`{ z>YZc=^Q%$4cmDpzvf{t({FHy(e4cw(=%};B|BpYXROK?RA{7Xi^bpC_F>gsHA6V;O z<6u@nrAC)guxVKdM)VU=XI5iW{D$@Zw50k z1#xllG-f2pUfVTLE`)MN(y;#EAQubDo%ip?@N7^8lW9@ywIN;R_elpC(8wF1ig*y7^_kh1H1~nn2ftPootm7r zn>KE4HhdsizINU3cNk?i_lK9E2L|)l_ z{)S7~ouMdy;%hEgFisJWQy&V7+)>^H*`~ z1^kN5A)4_r&T1{3Yl*l2?+3l8e3hI+q_8^2x}8eQc=P|ktKS%O+DbH2?q;i3`eBFN z;~rn-h0s#`zG^oIYUU8!;M+9p*u)e7nkzJZj8&6IcdDgPsj5&+Uo#nuU zYQInBoBH;L5y%WU1arPw2UX%}I@9f&cgxnI`fWcBq54n2p9RB4A}nZ0scP)Xm@L3TJi-v=FM#Ui<^4CjPOnA-*O^~ z>Rq-(zCsAz$07BH8QwN<&mOQf#Ea#~I%Z33km%+XA}^sb)Rqd3$&hN$=b%!YQs7w0# zgDBMW+dtPnh%3A!9XtA8R`fH_bTh+IwXfO#oOzjM^6356zKY6!&F9X$|LaN0t$u^n zm)&{yKlA;68!SrpYLHmV!J8g8hF3cmRn(8o=m-Cohcu#IaS|Fn{_fKMc`u>i*b8~^ zdthK~z@f_Y%N_1`&wUfNSUX?eMR8ik+3Rqs46OU7m;cR9EKu!!aLQ^Wt&RW;UOjj%NF z@}T07Y2MqQjt7{Or;UHVAN zUdQcvrBB_OOB@p?bah<{IlpUIvbdKsb98j{1q`1yO?2d@;_*ggr{Q9y1#N9x}M7puo(`yz94BnR@vb^Hr{2kGt_aK0f}T;JH0EeHG8w zoPGhKC9PvuU>%FcXq=yOSM_-~)-|c8KGJl3@;2JTP6@h)pp@$Y#RT;hn~12W^e-np z7c*9LPf^_tZ%I@P+#J#{k`Nmk8(yGj8iPH1#>GW^_}jPFpG;f_-;t(-ZY-B2C;LUq z3y=QP0tk684cwcQFstQJKJ?&h!eu?Zi$0)(&`j0{(j;njPx)ybKYsl2w%@*zsaI~* z?!#`y$c89=70X@xWJ>?KzlZkyNOBE{TO`J1_WtEzJ13FjjU&!Fx_;w$tb>2xrSF~n z(+@vuqrcv>zvMeZx%WuDvM`6c+`o+JCG z@MUf7s3wz|@Pk(iKHlH;RH)JB|Iqf{@l^ls|G3dqDZ621WK$uVlr3auD_ND1nVqD_ z%8sn;5ekucq-1ZBEqlv6IEVAQp4IE~8t>Qp_5OawufMt}=RC*bab4GaT-PJYiy_oc zbVjTXzqzs4bIhM*rq4Vv4U2VmIVE5nXV#95U9;vFuVQuN*<1ZlON(lhQe}<@SW+G_r(hi?8!7Z$l$N*I zhMM~Y$S~8~@XVGzE}KA1c{4uv?rJQ)Xx*7ATjAHQKW&Vl-v7vM!2etu{|U*T5*)+B z*zN`%{gu!j3j6{6(9zc-kF1#}&d$z`m6|w5e13NJRdMm9x%qOOk-8@FC&NltN0~7v zH9_ih_;H!zyw+zlJS!N8y-2`<8d3RRd>svAx%^;1XP-XL1KX{R;LFK(%bSY>nzag^ zsKiUwgBI`O;dhlt0_>8U;TaWpm1b2pD8Ds6*B2BrzhS7Zo}yd5<$8P{f!)BhIKfc( zY_p-u^z>BK+wS6Jp1Wn(7>zg|f(*>9w%9?Jsj@LJfN@2!A;=tI9(Su*_|?_kw-{g(6pk|{=&{*Vg~%Kb?5g#;P5 z4=x|@k#sqbks=#%u5#Iej~%xR4XH%?2%bn&K!hPbw2$?~q3h=6=4u0UCr>6p092&d-m2rp}ceNUg~A~%RxawiYWEye~hDjg4g`^>1%)zpk)f z*~}_8?!q}w`f>+DleZ@gDqSPtpB>s9;nBmVX*T=I5w@jWnq6L2+48WYgWraDMz%B# zPrCc-S2_3shw;xrMP7;ZhPX-(jFZ~p83~^*#t_jf$VBp8kNGdTz)#AIl{mvt?d|@H zcbZ@zbJK24P7X)b_$5XP!CbwPV85m5p!D?g#~vSvOqDsfxr>YPRz)|~*V`wXqQjRs z-rfk*)zzKYv+nj<{9L!;8g19#|L(5k_Uh#OVWm8DW23@$nV92T#JA0e5%u9{9>WS& z-0nm}_>=jkSI+kAuEDjIjVNl2k_X8gvkwJa%anpmC+d7@`g4mUDnbolnZ+G3l`$&>O=#?e~8MR@gmMZnRtDzbQ6G0p-iFT z;UPvsGE{2+l#<8rwVP*eo`K@q8`la^km=4`x<`*1$=5OeR^wY%*tRfSsfWg_O|^9G zdRkd=1)buRS@VGXY-(!C_Hzk2EuL126TC3HsYxj)FU=$4p-L|8y4t{^bR=#JBhaxs zztJH}msV)rHfM-#isp$PP!sxi9b2kkdX6OvRk`s+ujp1SQOo9ZYkW>jhZ%fp?6|7y z?nbYs(0mgQs(Ud5{)6Ok=mKd3+ctMzXWBVe)!S&6Odi ztlZql-g1XoQV7tJXgAot>F|MBnE538VM<2UfP- zi_F^+9#8wQ-p9l)dO?UUy4%Y=ROL4Rg$qJv)RZ8+WpG-{2~dhGx?#8OZ_`rJfnMM< zS58PsXou@;@^DRL>B4;w$BG}oE0G)~upN#sFVQ4)Mhf@YCF7mFkIYHu#Bg>W|0jjS zPm;%VyY1cy?D}liBz{4toRstVZ2CidP761Nycb93mu#2#o~OsQICSf9L_f!TwIX@Y~r+&o4cM89-DpU zt9TBT1T3Z^FAee=Cx@IzA~6AmyK}!k?P0RI3=SmHkw3 zwIws0p7AhDk(4Bj92V8?GH!4AekF@bVlu&3_LCQ z+7!-&?k1`gbPw$GM(HM}ew7f`XX{X1gu??gYd+Z{CR}xScJzZ!wqu&kLh2(ExU@oS zvFBCu5BW) z2!th`pZq(t9vi_Oh|AJoslF9y+<3upe6&@V3h!0su<)dWC z#xCc-@9kn>3b~pWYTL_^-}9mE&6{VDYWtjWoE!*%ufBZI+U8AclRZdGodod%LO+;+ zH3&`9`lS83alU&E;VfN{LHzw@%9pFuTdcb}JFiHg&7DK5MmjpcunW17&$5$gn|IQ9 z6V}Yfj~`cG)4(fFe)Z~X&s)Qa2dcxZ!89U%e)nh+;d$0GhSVpD?XGu`6F+4;9n@)_ z=pplnzCKZp%eJwh;gzl6YfL;`1_=49o=1p?CO*tHJ~{{i3yQfSr$t@Y@gM=iUSm_!Bx-tUs*zVlp+F}lM(q4Udb33In3rwS;YVbwhbywm3?rvyb?Y*#+4k0MaLRCTaoH*By)nk$K%>=}NZ*pf zpz4f|PmgyEl{-UN3rcWX651{V(A6*>5fL%7iB3qMb=~OEo@`6qyv8iP)Qd^PHYBzu zO9%KJ>Mifs;C_~DeRhaUMN|?3b%se@@F~jtW5mRrE8}&Oj&M>uvJCi6YYx=`d=PWn ztoN9Mq{Zj9c@JJ*pwP-TL)ClB+0HaO+}i<9|D8fW2vFrTc||`9PGiW}e}po#HPK-> zt%}BIRO)sDDsc5C6X~m63_2%|#8mG^OA-?oGc$8HKq?Opk0-saND4QVoN(n%i^+R? zo_8!QJDR_))8SU=x_f%0p`7f|YFzBIM4%qfPgkE3tMZ*r^Y+GP=i<_gSIIiBpz|pm zU6F!zNnRt&`T%9HEkYVk=e~|hJN>?}z%B~N8~$0L7ia!GzzwO|TB~tk2el1aT`_X?_s;M)MGbP;snony>($UvWU^1~cj-D;%N ze)`Ur3wMl6&v?RTYiMdRA1BvtElTDzX652agSnh8VjTOG;V_ldt-C+ zPO%WcXqT6roZL?1%RAemr-QPejjTrpxKI-R`DdF zP@e5bJ5ys-cC;4}5fK29ra}s$N0)1BYqPCb?Vm?(@+MbIYinrKdqtaBgi%f&RcXZR z!B|m$KZhf6aENOnD#A*@e(IVMolc?IvBNc$1ayY) zEa2AKB(yzn%`v>I=G)ub*-*zEEQciX6$;_5*C}x{O0g78%HHaKUS2JISl*t?&wsL^ z5QvTcDG=|(aqD04Cd0dI_qP(nt7zOsgHdvnGT-UQgYpvV?N`fijvkZMXee7+E*+;8 z&D3Ez9i#@Q5J7zx?CR<|QyiVmR_%RVz5#icj#0S(1|_F4+3-*w_xEn?#1zE@W1 zMZ)AoEo#XVnGn?YEp%<3 zi;;9d5SWEk-QC}>03kcwXVt&k*Q%3#>(L{EZ5#Cr<+N}Xl{w02x!3LzG>aHWwzGLA zTE_H;&}O!C^Yh`DWV@*gvpe6n-Mb;|!-bXg8YdHE%+1|Vx~C=*OL6FA3%iML_eh`_ zuWG{8thO}W(TIh2kIqPNRX~GyRDS=A zvx7rBa?1=SDOlQ}y)rHr0BEefS`mos$zD@_`j6x-*lqii;vr z9UFhw22ZAV)G1-$kJxk{Nv!1=zS5P zw@4`%6Hh01><0*;x4{>*=`WMjB$R|ftmb#+=>9_#63;ji4cZyrbLzhey+2sJnMu?& zD#6<0C$xwcl+8j9R45RBjwFn3VKuLpGYbt?%Eyy(v5qLLbBCHb8-F*8I=_<1Wq##1`a7cdN4UchF!`*nWY?5E7pvn(vK3A0Rw?x8_;lq8nLr+FJc zbUvbI63y>)QEkmk*8d!IMiwZio^?8o5tVlyG2X?`4q$ES31XY9eOY)eRP37%G#wScu}*^A1i5UnlJU);|^5mmUkt1 z)eOUz${~M5ynLxBo*1&Z(8suJGE(Is<=`d5XG(I59lop(?^L`=Awf!99Q6>jj-jD- zEGlfsIeB+}az?7|6iQ5FF{i?_*(@b|Gcqwz1qu>Y+gpcFAwSj5I5hSk&Vc_!YRa_k zSY-93|NYCO6r5eWT3UHK3W~ow2Lf5tuibRK6b?Ho>q`Kgt^3Zp<#xH+{a}YGnV{3s z5YsJ%#3fHyK%Onzmd*DF6FLa&Nm*H$Mk0{ALw#~#Ly2}z!hi`F+8950hUN5it76ZK ziZK7XVhKSZzIcsk@893xe<@Wkq9Thq9nVvUKi4>)Ur?a7H_(%#Z3)Fu0zTw^nzCte zPd9iuGQJ90NA@j*1$%vYty7jbPZLfCKP223A5hU5C6mw#yUj!tCuq2g+HSES71#de z$^z5AVWP8giS^J$s~m(q7!Y9B3Pc%cYiqMO9)(SX5H?OqVwW!<5j&0xq2C<#ur8#J z-S(?EFAcr|I*oLnHzntd%W%JT7lMWtoV1R_kxqWxvcDIFN~?)~Ak%h6W`R;Lh)%-L zewT&)z(tO)*NQzDLk|Vfip4^C0*8XNet$o<#zz#l^?UXg+g(D#zT2r8`dKIcb9f$W zYszoJ#nnC{V8O%V|2LaYA_FoDP8!Fio_<|X@d$9rJ)Ji z@dV_ByL~Yo(n5rf`;ICD1e8jpeO+NaBn+9B_ufY+&xev9LjBFo!;=wh=qk^Phk<+* zg-V>=?BTGTo1G2C7+PAgA-sXT)%((F%iWy~c!4bn%q@>hG%lYfh4(mb8}q?`e8c*Z z4_O`>v&g+TpIb6~(IU-FN;M+DEdq1CYzdBx)2!Rv8V~7$-7I(TI4wd{!OIOpTSa&| zEqs-PA4TB23=I>qEzZ#_QmMFb-5V$l`jV?B`-uL!q$EBGiPhIP-uu28-s}UycVgG5 z(p8fzIvl=z|Fsx)+s>wtEOJ5SfvQGvtBBr6OxT!)p)<(Ocz7b;4Ubp5NEl)<+1~WY zFScB$7RGm$js8|pPQo{)%cJu^e$V#cKfJ6bPo7NRl5txrh-GQkdi?8Klhx6?49Njh zJdJhs-$x}|(9)`@EQ#)Fw0>0xT(9K=bXw%RY?uv9!9l;5#{>Gg10ggv0mXGb*HEwHGTXt5~>n+8Mp*wM_v3jL;Y3`z~R%hc` zAk;?e7e@{XG>{c)BAX`2(8x!F6r!%AbgT!Il_~b#;TYc64oajK}{WD>@4{)cuU6##*kf!Zpkys>>I<>_%?rY3%OtKQtL~|`;sKIkZlllO zyhKe)TRiC5An37EbgtI}J>)EvTBQ}Z6r!~jtw$6$X6}1tmViZM@r=<4Z9Tmlo#_Cc zs&*?8OB}#-HHz0Hr_jB(&00Xiw8_lOyv~L9+~wp}luoDpd4a#%sozD8S67*jcwKkg z9h|xAB+NvKR5zo0UosPZdT zpJCBZgCgP{Kw?Kn$85<~;3dv7Y#6WHAOEasV#4U3EC+>6DjeCAQ_Otqgus~-oIms! zNs97epO>(6DMgy&gw(l7VLE2?ES@zZqt17F_#X+PI>88yid3vpQrh{3kpVROB*pZ? z?aabq3*WJ@pjRc&s;rC$Fv90Eg2JvUZreaMR*n;t1PKQU7>Ik4?{dqXm+y?h9tt&| zzGGvP0obDp)&72b9_s@(C}xIaIFB@EwGU$7q$Jj993;EFc>^KEUDOMx#-2vj_++Td+El}SF~H#bcO&UD17ZS~o&u?neOGa=Tx)>m z6#PTve8l``s`f*V=#5NBbG8HQy~9;8{e7q&f{ZQusCyW8^S;$>cZbnxe2}AKPjz8E zQE}>i-EB5UsJM}l;gGvj7g@x`3)fPx_kevq+y)l}VJYaX z5)%VEsWx`|61y!!nFOA}iEe3EsTej}wN^DoF7wtn)eRaB51y*)A2Mkoc+=U;oi6H) znd`c()Kc;9@~L`DCeKSQBf@l>1g;{D`nG_${_+xP*x#=;PAJ@##8!;DU=O~nQT8x|^ zVCN+|Pzj!Tmmd$sm2Kxh!q6tvD;_nD#MFXGy3>Fg$hu%{lse$%%_sa@qw`^W2MOF9R zoyeu?udr0J%qk(|@%q|P9$}umM|y;k^Ssz`t&ruE5b}a@HVJ>L@QTU+NNqdeTo{nglqz%eUt1UgH$K zu6l<%{y!}yH?WKKY!qf(DqRupL)?&fc#LhodsZ=cY>1H)SQNGRNfRaqM@LnAdtQD4 z0Yn%M(`BJ1?%J5|opf9$qKi0i;K0OkNpW$u*{M^O4YY|D(XaJO)q+b(N(4;a_EU_| zHuk9me!6u5iQa&$p!`np_V!LiB`&x?RtF)xICZ>W$AiIb7Y(Z;?~V~K$dlc@y|TNz zyV)p}1ko5MtoXfDqE;);*;j6^uh&oW^?86^49rNAoVefea>D{|_=?WW$v;V@T!zaf zHX~8JO2s4a<)zD?=)%dp?%w49W?1K0Es@CL^u82qZHx}a?BW3sjMk=#pJ9JY78cwe#P(3jdwriESl(lRwc;08jNbRvREv`&-5G z8M)m}lA(j(&B7bR|FbRl*CW2EH5w5feigb`U)5hezIyz20I)iM-@tSemJqYAfDDXU zf^fn~7g%@XPV5r~BT3h{_r$;1|NiqOP2Gu{+i}_4Js3~S_R1vM>4(qP)n!~|=GwS7 zN#EaI+b_$q*?wgxPO~+0W`NJj09spw{4DEP+~rH)LE&>dUWrPD$9s4*V6 ztp&F>2W;fYr87R-G9#@fKe%ip*8W4a{5*Dc-Yd22$#CwAIS0A)u_JM*rVV*iomz3e zNM>}d{yVd^ui+kMXFh+nmdYp<2YF~t2uhq2@+>7G)8_LP7y8pxb-3g;P zIk6tbtv{@2|1VZ;sC}N77@zhb~o|w%w;= ze_XxCm+LUv``@pz{i|T+63qJ9fCgU|$W+lwXiIybYSzBY_AnC2TmRG&<2j9=+J?14 zwd<=(=#8a701%>yW^&^AD2ZRu9u2@Rl#BRScgU?3NK*^H4VNhbbL)pxsaYxEw4Ley)Ch>v_{e*{tu|- z#~uFoN^p=9!HqS2@fMMJUlBb8MtE@Er{DkCh4JI-%6dj5dBsoNy+OW?tdl4&oy!M# zqSU@G%6Z#EL&W~^5L&te!uK&q?0IsKY%)Jy}fZDg@CbMqWaV- zIPo8%e>C{vy{>_K?i04HI~45|J^rtk5&CwjIxh8@PrB!N?|NggsH^?7y+(z(a3r9C|H%8Dclr0ykrlafB%1Rsn@XLKnD6@>1^9CnFNYMC&*os z9ubj|9Y9c7PBunD=NkzLqFWfc&N9b}xm^My;&%BTT%n6}-G~0{sFdIuSXf+4lViGN zNt3fZ4Ii`)K7>w)P-NU)=}IZt+3e*{KQ=19;$yxy{_LxC6o$7_XV zEn&;}h-H-j(j_y#19Lp9TYTvk#$*u)PBB-kz_fVbtF< z2nI*ysKFoi7PK5y*XNY#N_Tw`n|ttzgeVT#K}nDQY@Gic12lRM0hVrTY|N~vfXVf9 z_ZCg2nqyY+tSz4qSzdQ`$A7kNV7;Fau)e(Bhd>QZQ}gqsJy^zgbGA*yRtheZrLgE| zS+~uFw{ACHpWNUPY3^5KKQXG+Oh)9(Dj*=h*sE5yCS5E)>Dmh#SwqyRI6-l3X$BJ4 zt#41e?2g44gyT7LW{U;!-?9b2X&_7&ePn4)l)Vcg4i%kt253Vi~9 zei*;H2r97|)L$!IH|8RcIJawMT2?&^%iig#Q@jI6OYgK*RE`5?S2Z#+QozWSI8d73 z=+hQn{dsHPh-{Xd=D%H>3(f_gr5ylOMQnyXgIXWyK2-SmE}<)-70{VE@T}7>Lxh1{ z`(v#5m)@PxxEulQ_StH2VKr1dJF4%ph>F)`aK)#ngm9jIYud4CE|dDka?M-NP%(g~*Jr!_u72S>;0GiS2izEwpFl2QnQp$-^^!|1D04l85Q+ZBnT zE}h@qzS+Krefe^7JVc6tjY2T(qU|mi8Gbr6+W{Tiv#Il29R%lt8jwf8=tI4)_|+3i zdOL}TTbR`*9x_UxtG&Xlc*K4>9T8_I{8x~*PkRbf;q-yu4(1~DztNw+dYYS?TUpV) zVWElBXlBElvC+QcH~rI#lQKNtIc52im(jDcCk}lTHk>R5GswjFg?_DqU6#JR7n#)! zoK$IRTWO0rVmQ}bC7%3RIvnHTh?kZ^2k zy9^_OFz71a`LrlAEDQLKSM7$_UZGd^NVUs~kMU-Ao-=T71&*V^B-}Xey1#99(F-={ zkK7zfKb|wCdfpu;aWppfA6KgBUVsz>Qde)=G@5p%%C8#lC`NO4JU&e3fD(Wo3p+2x z-Jx?LiW_#F=hA(9%hwD829C7rtf@l5fRbYcY!a-mfo=!8-XR3n{^}}XoN5sU0p0;| zqq+fE25s|q^DEEgYhS-^tovLYV&xeVE2~^AY|SMkJVgIc_wFgP{tysIm=8jxAo%1yvY?dF1Xx1pa_K?|e@pHTfWcs8uK z;IfgU!_8ja{qkBh{*0xYkdROjMDE6xmY#dd2#fcEj6#svO`OaiM9pn#dipNWm)8?U z$(U^m$eU%Q_t$4S5K6nn6{6Hbjc@1+Kl`%Q#Kj8a_)px{+0Kvq1-wFc78%PzkUS@~ z!!^hEx1D#xVIU|&YoDsDO}H6d-%i55e{Z0d=r#ZaQy4htrRf#K zHb3FFAqod&d$ws9=*}4hxp6ts({%^4Y`_M%?73;;P1<7wH2V_p$sEr zKXnu+ekZ4MqERSp6AICab+~PX!Sz|Q%#mwYDg14_59Niz?t(1_O;`B{FQqN=LM#_3 zp6XUM;6FXw>%VNIg|SKAL@f7H4?vI++nxwNJl@HXq*zpeSt>s~(31H)6-MAXxx0on zP&KSigE=B6&%AKYcH!#fmJUuai7{6=m6(jVA!E>gVjr-b= z0WuC4`ZNcNY`uHzf+-V{yyZMhsq-iHQwzrf2*f`nnoF)N0d%G)tcW- zf?g6xx4TJ**tvYL#nC>KVvv$@0Ad14ykfA-6`w5MuMGPe81l0=UPyp2Z^WMl6>D`Q zAOISGpbG4NbJGX@=aaz8^hy0~-h>BP!Q}@MnFknaSIvRFqi3-4R>#t#;h8s0*EElg z(j%MP5ESe%7^npSAEd+)J*>MCNUrPZ^Q=;0J#)SiGJgue+? zFiq)m;67H5M_gnL(-}oY8qROrlTWDxiihx6u(7ed8Xh(Tq9!FdnPGdmvF~lf3efPN zaS@P^yeledpXo?xm|nBoiH_g9`^8XdhgUE%BBFkzt)(T>To>pe)s{=V;Qn(FS=oOQ z33kE3#6-SVG*nez^$$bPx;7vRMioWH0QX}&H{Lwl!C)p$-jOAe6uRF`li<-Q`1D5N zwP9r}gfnTfbJvnUOHgxhDYeD|Gn5W>PGcgR2Mz;!z@De+%c5p<_~}Q4<*QF*GmpQR z%sCf}uz3OkWF(e(0W~!>k9X^=#e;bK{CTW(fo-@$S?WM5L82p$YuGFSW6kx1c%tW)#=}4f15O)pCz>c}B%L1L7sTJ43?>k)%E`cmNd1vR6!7r}cjdR=A z9K_}*1p69LQgfJ$e`7_=>L&+;_niH|%&Ug?1Qk>`x4krcBxB3wps7{^TOI#jyvcuz zH45Hc9C~XrH5=oH(V_pGoPLy1xzr1T-QB5r&y)03Y@X1eO7xb_I;|32GCd&ZIOjI=mpBD;`t>D@ti!`NLUSg^b90~qI-Q8U3Rfp zZ0fU@OpRmglNZOM&O953ENHhVN1L7V7)AD^UVuD5OiAQ3EkP#G0LYsnJH?svVH1L>tpoh z=I6xB13ndc7kXx&UpsYdP^Vztw}`^r^q+vn!xBgxvG2ao&2&dr$}cnOjf9ViAB4#T zeejOPC;j{;V#*^1iUzz| z4&dsj1ldq$jN%wAt*jzZYab5MS$yfbtDQBpNG^DaCLnSvY)D&pr%=c1I_2&R#eNbJ zh=y^>@xs!%xw#-*-qeKvysR5trLL-a)AcoEoM9CG;7gqufHCR&gJmEdcxfc`!Y0=! zX_pRL8ZU9(%iS!I4?kx~6xW(4k?$`#XM^zk_iTQ42CWP*GC<*JC(gmi$)rl|n18l> zx{FibGnHUp3v7HhEBCkgt0xhJgokJN6zz&9s^M8E$$xSp!)Di<==eU^;n$PBMgEKb zlPxA5yihYaGWqujDIk&{17;jOBR1@&<1s$>A73OBpkU<$QTZIL++?5tV!)-A!4@U| zuA0p=>WDnNy>FKnz%Hwc@)WDw?7xdxbN%Io9_q*XO69X&4za^~Zx-ras4 zRrgMzFC1ZS`@O*WH%p;*GXAO5y!>JUusIwn%;otG>rg8s#ci<0^rc1Ao_j=}`7C@r z>UMAmly}ZUh?U6HG;Qhz8AZsA#Sj_k0H{3AtRQbDe9`8(_!d2wPmoLkf^3()*`+gK ztJoO|!I+KOtugw_`Rb+ZBDK-m0yuVDx`1Njsy#wI<2~#}<}n<9`;Ar1VBJWA@Jgd{ zuB|ZV)rO;k+bd%@DLUMeCeg9=zWyKYBN=VjfB0`3v@4in&`fQw-5;{w5ihR%4;2EU zwEpmTcHs}X5>CQXYKi4n6fmsx{t6yay9zUSyQd0wKl4CVQ@(S?tnPAZLVR{m%q3qj38KZeX=fi|5?V>qQ;o&N!5rH(G+xCHh&F|DW^ z^!r&4l`&HhgMqflbJum~0ipN9JM>QAj<2J2ySDcd@-hgeU6AHxAp}4dMOISM<#%3_ zM^BmY3L@@poSqP#`_f>k19X%EQdt!*FDnZZpH^-GLvFRBDgFypkrS3j2qLC?l)b|X zyk=;8B2Ou&dL}OzIbm$hncJQQuZTd)XlgHA1nS%k zWfGe)?<$v8&Bns=6yTFJbwl&$ZL~Ys%?rZ4BE5Latbc|cP^%svTy6)NMg162%nhvh zkEux(ryB(-b&67gn+>2F{L zZ}ijeI-}dq{_8htqp8$4jMUVU`@TS*W(ecpJgdeIZf=ps743yiC4<1#!SF-o-zcr(otlrfiiUX6I1%RUT6=>bQ zyAwV1YmXFIcAXnq%Zckb*9CcZT+s<|&Kk7fb5RKH_mM0OisIBsE^pz#`vn@Y5eF>@ zjjNj*J4_vwx8i_a6$USnS#i<>#G=V48+=_}{xB5mJ?2O$s%_{ZZ7=FibUJslZfgzc zcTN;H82$p`cXAo@(ew=jz#`54yRLGM2QrqcFv^9&b}u2b@D7Fyty!j3H(2j6BVI7U zgW$CV`jkSJXR-U}(U|ptgPB>1ID<#(3*>_GO)$jg8Vto_8vIk@`1910QLdF``QZ_? zjl;aMo9=IQ;a`Wk{n$sqMF8T0I^LpK6Z$OlPTtI@M#}kT3=ux_vOgWS+1`Dw>iS44 z(w@H13HOd<>D3WXu=(e~+p0p5IQ$Uv?c2?s1yyKPw&crcfaV^JTHTde8t8ZS{O&_n zKW$$7jN&lNmjbYA3|&=PYwRO1V&Kq^;W!lC9Xn`)@#yyh~359t!^CiI6VdfFx z&m{bpCNmvqQ9Wz<&3z5)CD1&is-)E72dzp_U8?h?iuS6VjT-h`NKh%%nI@%p4b?sZ zKCk`kG?(j{GEwC7x$0T`Nw$uA(N3682OQU{m*c`vDfuW~Pp=n92z(v2Tn{f8PhLt= z!*<(Q2xtWO^T$y;4+7Q`CKh?p+c%b)7z=*OGI+LQzngh}5yfxRN5R>GyoiJb){{q( zz|QVPDX}#S!D(a}X*~yQ#|ZQIz#e6H;W6wXFp`mkx*Bi3zdw%fj8YCZltHkX>wWgd z(P?r1AE6f)4qudpIs)LN$M+8hV?TVCAzVVjC80CkDYw@T=W8X)aTL++z zHV|CT!PG)m;5>-pam6B@N(4M|m=h{=(;>icMF3_iz#K6!WdlbNI~K-+!m9PqrB;y= z`SMMVK`uzIJAL#3n}C4!u$HDK1(4u?egN>WBpx&sIkiDozS}W_l`D*rPn5TcZXGYN z|E&_qH7Jh~hkgnYF56#@?GMJ!!A_A0C>l+DanlHBNf!A{43S}Wan$C0U75k;i%nx(9_QjHpB$ZRnJHJmtH+uPamcvPBbqTDjb7-bZ*` z7(#v#0z~qiL_pYS5L@(CVlFgNNi}RtBMqX^B-kt8O(&(Q(Xx|LaxIomK9bSUb9?f! z$0T%@%G21$%gfhT}Wfl$$RvDrS=)t zSZJQKyC2k9<$=-QEo1JA4x$#cz1+2&>S>5X{3=!4+b+7awUoFX`Of}+b~+Pxw~Vzd z|JR9Lg?n0HI&($V0`wTH-jh=!i4HTwsZw6E>MM}$asu|f8x+R=;EVYjYmtzv9mHba zW%OY0Mujy0Wq~}vq|ct;9i#E88B5BdgW*2~Tp`1Q+td`xG0MzODcdt-DTBTiSYUW9 zdB7dx%#p4(u=x4)Khnw1t^b)qe)AFs-7kn#1cr1?-^;V-7Qq3f!`~E;V0@m{3;l)b zE{?hPrGQQ2{3aTmL2B0tSRbk#gweC$%ib3KX#~qcv?dUdIxM>1f`~}Rv6w5G;aV51 z3{ky%aPV4hzELlE_3Ya&FS2*h9m1e}B0q&1_AutV-1A#s2At20cg?qDJqz(NHm09l z27OW8#>PeggK}9r2bC{#qEFBOO@mB*t!Y(71EHuy$R%=jRJJ!1Ykb?~2emJcqmQY0jJ ztZ_{W*XkxFHYC=?TiLA9=8)s|BHjFCdWLS#H7e`J_kjZs3NrYdZhQ0Pt+!1F2tO}e zGCp5l|FDnw5O%PtFcXzi&bD~5dJ`2Mfxp*R}YUWLp zG`Z_Nrz5oFMzzB^O)HM8wiSg~n@6^oQxEwHs*e~qUmLWxc=c^5g?^82Hv1i$Z_e;K0E1NILtiGf8>Ur~KwAB%G z$U>NL*Yg)RzxZg%s|5o!o3%75QZdn#X~YZ{xsjWAc+8=Mi4<4bmaklZUfaeUM3mGACx65p43OT7vT3gr%PY!He6k`@S{YHjXjb_M=NsyV?4E z`7K_7onxdyGc*Y^8zkF4yL2QZ`^ge>kTLU_A}ibBe!>jT@iQW2&m~o~PB{Iae7w4= zYnd4%a!TKvLR>Fna_}LkYD?9|gZ25%-yi&6d;>BPo#d3Xu5K)R&7F|eeQ{NTyXP(@ z>TkOIk3Sxtp<|wL^&mz9x$d8T+Js4MciabfY{k$PJ=|UyG;(RGLC8Wr$JG;90VbrxRC9F~S z8j>QGQ9e5*mDIF4=dF|9cE*BPlA9F+)R0;As?KD8v#Ch@Kh2DXeK)sWKf`po!{|9_ zr8tAv8{84D1uxj~Z;Tijh^!XsU`>LR$np{c5gc|-<5b?wJhI3&y8fjg(YP&gS>(@m z^50pUf4!ft`EWCrHphQ#*ib(>$RRYYjF7R8Sn{^ULnN&|i+guDvKvQj z1%)+zIGetP79CbM3#x4>w8Xa==~+Euf8rE{_nwbiN@*$E=tw@5tt<0R$eWG9UW<1J zrXKw9xtyXxcH9jq4`R}H+^fM5w1|pq<5|AJoc?c5)=s}_`NPu@5&gMRQ0+B)Phs;T zr^2;=_Kfqpaty;os-)%g;T*!@DvrK;myXh`FfgPrykX3`yI1LSOfXkWd_RAX_by8H$^8FKP+aKs^Sg2e zbDx2Tf1yNvi%tN1S^t$pk$IlVV-qzT6OMrW^`>n|Q=(ozoIi=jGC~l!AyrV@E?Si6N zo`cMFhkB`;MM+Ezbt8oR>fa;F{sY6D{qs!6Q0Jq9B&tci^P-3Agdi=&^&Ya4p^JVj zVV^QW-{Cj>?awRw&nrQWm`+8tM)B>-sG4tY%HIjue|yn6MRnDa=w(Z~`_$3ReT;y0 z95>poYZ*S;c~YiKQ_hQ=K)iZJ;woG-F^&9E!MMJw172TRN!bF%`}_YgmKs^y#9f62 zf}GE7VIrX{_3Fv4)^y)u*lOE5M}Ahm$yem(1AKz%)#dNh(JBB zZCN8HFH3FiftKE4p@+078_~5=*7K9e1=)k>0Pep-Lo>7iviD{TYyH1}cw)AFUZ9%^Ed1TAg$-i+53`zUjy(SlV3%1-5}rO^qQ z12?R+$YWQp8#hYpxE!V?e%kAidnsqCUuZyt+G)r{6gJ>BT@z&NaMfrya7kYnX zJHqdgboVs9>O8|TQZZaU((6JRY!Bf^FrTFV4{@&YBiX+T7jH&fm7`3X0}`IW0$M-Q zeI!Wf*kXU(sfYeUMH+{PGE24tGD>r&#`R4t)NAf=8t@x+iElg|YII%}c`>u;(Ym}& zzE}ESlJ80IgAS|2`(#g3-mtdi?tYX-uWZ(PTQ7R8m49I6D=jIx!F8ijT&5&Xo>ykv z($VzkKvO~BvQ{(l+INo5ct2}Y3+dfk-LO9?a9@y;D?aFoIxQz9?}5s`y2X=ok#S7& zS87@v%ic-JNE@3Dmb~eIU54)E2YY?AZxx{%JH~8U^!wLg7u2-0N^M$>`C#yX`Q_tr zg5gt6!3CTq=qfns33GfYXuZ5Qa?N91P`yt!jA?R@$56a(eB%hk{~wVicNzjoU}@rx zzF2*i_*@IWMVFVY&5M@YM$gvjfMKVN&->-V9v_$R>@qoH9+czKSd(Xtm$4^3HSAqCvhA#Dn`|*G}uUaEUMb_6N(x>YCZxu2YygToiurX(L5BSTh6RWK6 z_+dXFC*wTwZ_|X_Db*c+<=b}G((~^{uTm95UKxtj^E-@N(V63=FIOkbh`eE0G9NyG z$9IX}cut#+<7Rl!;hczFeL|j>CHd0*Z#_Ehg6;?0iE zzD9GKN;K($(_y^lMlVuyNM@RSO`bCyrp(zt;FPN^Zl5=&u50*uVAwj^c40ztve47V zm96)RMG@H}bRQzc%>L+*z)$cICJb^iq&ok8J#TjH5OgrF!9w=C2hV zxpoq(M6}4sX9b+&pK}!(ot5G)5!I$iKQ}!E-!#pWsHSByCy*IkFcxlDomCx?lQj?5 zQHDA`OrY%VHm0g=6tMF|_>;AMHr9Q$`GTz=HQqy5cKl~^pN1@5jWX5Hh#DK0XB0gU z7j~SfEMAuN$e$uHJi7?Ln(+TtVGn23e27R$$m>IjM!$8zX&$K|f)7h?QYwm1Xwzk! ztsHf@T*dpm+dB$2`C!xgwC%xfw#GAlRFTgWOw<{@S<^s$ zvUsG*$3K=LF%BcNY}2{7Pl=WDB0B+9zJ(Xd0GX{_R~XV_rtX>FjnA^NQl|t_^W&0J!mD%oMuRI-5iXXhbMy@3VXP8tFcV``g{oDx{JbIcWw^;}p893}~5X;@?UOp2_NCI)NC6s|Mpk6ysD zI#hQm{l41MNBSSnE6*jhe15DME8LwUoHaQiR@WB1KGjrc}V|}eLv$^eQ#8IWI6tE^`Ov$4xWj(>`G+CR(mIqv@_nDW;$oHRajjVeA%F^VShuIID)QrWkgTT~~@ z#YuU1u!H~~^L>vCF3NQ#l5z1(mhM-L^NxmXS(@9PN-St9T9JZ@rwlmdGrW+p&l1AD zAJ81mLc666+idsymVL;)PWB_SDxkOl+QOe9rN2q5QcR?O0JXT?Zqp=j}ATWBi7lEw*dwlcb8PtrFaTaUcCO4=F4(NDMv>{z0 z;rCRbI!laWaj@+FqwPK5vEKXtaVZIvBqS@OYzdLsph5`QT~x9+UG{9)qs%fRGc$V= zp%lvAd*re=*Jb=)pX!{ubD!UR-{1TD`~A=3;T%q?%jfg{yk5`sdR;aY?oO|zGMPDq z($wac3Ll5m89UIQRW69**X5UKjC~D7wTD>Fft7a$}r;@b(Lk9-)8UtwC$pcm})sGl~&uJ)=z_-2~8Tgp%51I4f znlR;$JYPKEY@~A5y&`FNZfzLRC;m*z;iNc*V&bmJjPbU4T*$`FG^@#SBJ+550XT0& zLR{M7H;mG$ES0h?I{=>C5zDm1iC65b;>%)=DMEds7i(_6n|GNYI=W#oAEUhNAz9=e zQae(;$uqc7s*_6eqjx3gP$2?LR&MTvrt6aJsQ(d5`W|Zno4nsN3=uFuKS*2Aj!jYNrk zW*r>*@a49+vX{EdXTPwx4eGD^4R~n1&PW>?W;7rjF6;$#Uww*HxGRafIW(D*lM)>EXRe7UaJhjmuQ$OG8QE!}9k^XXODpDZ*~S7O!*D}b z3{np;k?e6*wFy7**RM0oy=y1%ztvT%t|Pr;juEr{%miiY^|aN%K`5q#=35%Wz0Jld zGrOF$vi4fi1=VmJ9IY=j<_pzzJ{l4FB|AYu_R%>?|xr!W|3JKJhhFn-|R#ZlJ3wT(p5_lpIBV$6)B(NBielG><~gNM8!l z&{41~bNd5_x}tt)D?$?gD{bY($taRPvH(Eo5uF9ZK__S`BN;Q8G5!o;VWKx(JGx#^ zMIy(!^oV7czGL< zEo?$s);k1LWN>d&D8!%e%Ak^@Sh;vQk0_v%D?&Q-JECPf+I($MYUxeBz-T}lF>0n9T$;D) z{@2I6Ip}}s75pf=XD)cv9xX$C>EQPEzy9NRdk_m&lrNGlLYoRyxp9_hO+TZ7>*Ptx zgsjoK&)A?>ziA+?jll^jg7EdZt7T;F#s09Ci)S;IORKc;-ZGc(fH0x;lZ5Y-f`I+P z%F6Y>mUmzb?B1vi1({+OymhgZHRh;4t%#%pn-Ki<0I{ER%;+L4487<3_JR;?pnL~% z_RpBr04TLuHr1@|vnzlyIiWW_IhlMf;@U&|gl3&bQh?dC&ZnyN_JrmLvkKg{&sG0& zQg~FViO+9lefNgN<>1w84Z&yFaG*hJA-zQr- zA%4vt&G>iDDF4)fgo&8vKblBL)t4N31Fe2V$@2ds*_LHlKaVcG){~u8S*Tn9kOS(( zW$3!2MVUrwICx>qaEIQ}MA%}wW6+C>gYFe)^In@VP&IA7u=h>b_AS4xLqZjlD=9CFHt0Uk@70W5mqa!6 zRXL$b{(A_$U-EZ14vYonGL+J831AP9WI-D(KWN&H1KA|uYpB=cPy*3Z&@vUCpQX%G|!Pw+zj#vImCNb2*vy>+Z6= zzN4k~28YU;du#GGv}HZnv}>m%vi5!hRK^KxXjnw`gM#n$4Qdd(i{RgAB}dah{R1@; zk$*XOJZeW4OS7TS+!Zl!@~X{pGBvoF0j$K(*mzZgh73 =GY~3ZT;Q@6zH?IHCRLL33x1 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 VX=L}Hwoqc*R*x-tf8P7mzW^e%x`hA$ literal 0 HcmV?d00001 diff --git a/docs/diagrams/v093/stakemint/stakemintv093.pdf b/docs/diagrams/v093/stakemint/stakemintv093.pdf new file mode 100644 index 0000000000000000000000000000000000000000..505019ba3f5098355a7dae18718e0e594aee1053 GIT binary patch literal 96457 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

Q9QsHI1-)ZCW*O6No0UYP)q*u+}|DET<=x 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�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 z%0AE)_~5^tu;}NXjY%`ib@({7^aZK+^ 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

  • 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
    d6QKFBX;cOxRLc% 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

    *8|LaY&g}n1}Xze)d#!bQe$R!#2Nl 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%0D-e)A2SDHfR3HZfe}b{T#>we(Ni>Ze>taQ%+sK_! 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 =GY~3ZT;Q@6zH?IHCRLL33x1 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 VX=L}Hwoqc*R*x-tf8P7mzW^e%x`hA$ literal 0 HcmV?d00001 diff --git a/docs/diagrams/v093/stakemint/stakemintv093.pdf b/docs/diagrams/v093/stakemint/stakemintv093.pdf new file mode 100644 index 0000000000000000000000000000000000000000..505019ba3f5098355a7dae18718e0e594aee1053 GIT binary patch literal 96457 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]{Branded Token Gate}{OST} + % pull OST from Facilitator + \begin{umlcall}[dt=5, fill=green!20, type=return]{Staker}{OST} + \end{umlcall} + \end{umlcall} + + % emit StakeRequested event which Facilitator listens to + \begin{umlcall}[dt=5, type=return, op={emit StakeRequested(staker, amount, tokenHolder)}]{Branded Token Gate}{Facilitator} + \end{umlcall} + \end{umlcall} + + % Facilitator evaluates request against policy (monetary and KYC/AML) + \begin{umlfragment}[type=alt, label=accept, name=policy, inner xsep=2] + \begin{umlcall}[dt=6, op={: approve(gate, bounty)}]{Facilitator}{OST} + \end{umlcall} + % Facilitator accepts request + \begin{umlcall}[op={: acceptRequest(staker, amount, hashLock)}]{Facilitator}{Branded Token Gate} + % Pull Facilitator's bounty into Gate + \begin{umlcall}[fill=green!20, op={: transferFrom(facilitator, gate, bounty)}, return={<>}]{Branded Token Gate}{OST} + % pull OST for bounty from Facilitator + \begin{umlcall}[dt=5, fill=green!20, type=return]{Facilitator}{OST} + \end{umlcall} + \end{umlcall} + % Approve OpenSTValue as spender for Gate + \begin{umlcall}[op={: approve(openSTValue, amount)}]{Branded Token Gate}{OST} + \end{umlcall} + + % Gate calls on to OpenSTValue to stake (later abstract to library call) + \begin{umlcall}[op={: stake(uuid, staker, amount, hashLock, tokenHolder)}, return={nonce, unlockHeight}]{Branded Token Gate}{OpenSTValue} + % check stakingAccount + \begin{umlcallself}[op={require(msg.sender = gate = stakingAccount || stakingAccount = 0x)}]{OpenSTValue} + \end{umlcallself} + % OpenSTValue pulls amount plus bounty from Facilitator to + % its OST account balance + \begin{umlcall}[dt=4, op={: transferFrom(gate, OpenSTValue, amount)}, fill=green!20, return=<>]{OpenSTValue}{OST} + % pull OST for pre-fund amount from Facilitator + \begin{umlcall}[dt=20, fill=green!20, type=return]{Branded Token Gate}{OST} + \end{umlcall} + \end{umlcall} + % store StakingIntentHash in contract storage + \begin{umlcallself}[op={store StakingIntentHash},]{OpenSTValue} + \end{umlcallself} + % HTLC(facilitator, amount+bounty)Facilitator + \begin{umlcallself}[dt=0, op={HTLC(staker, amount)},]{OpenSTValue} + \end{umlcallself} + % emit StakingIntentDeclared + \begin{umlcall}[type=return, op={emit StakingIntentDeclared(nonce, unlockHeight, StakingIntentHash)}]{OpenSTValue}{Facilitator} + \end{umlcall} + \end{umlcall} + % HTLC(facilitator, bounty) + \begin{umlcallself}[op={HTLC(facilitator, bounty)}]{Branded Token Gate} + \end{umlcallself} + \end{umlcall} + + % Facilitator rejects request + \umlfpart[reject] + \begin{umlcall}[dt=5, op={: rejectRequest(staker, amount)}]{Facilitator}{Branded Token Gate} + % transfer amount back to staker + \begin{umlcall}[fill=green!20, op={: transfer(staker, amount)}]{Branded Token Gate}{OST} + % return OST to staker + \begin{umlcall}[type=return, fill=green!20, op=<>]{OST}{Staker} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlfragment} + \umlnote[x=2, y=-7]{policy}{evaluate request against policy (KYC/AML)} + \umlnote[x=30,y=-5, width=200]{policy}{to accept the staking request the facilitator generates a secret, random unlockSecret, and publishes hashLock=Hash(unlockSecret)} + + % optionally, staker can initiate revert after timeout and no action from Facilitator + \begin{umlfragment}[type=opt] + % staker reverts Stake Request after timeout + \begin{umlcall}[dt=12, op={: revertStakeRequest(staker, amount)}, fill=green!20]{Staker}{Branded Token Gate} + % gate checks amount is not locked under HTLC or time-lock is not yet expired + \begin{umlcallself}[op={require(msg.sender=staker and no HTLC)}]{Branded Token Gate} + \end{umlcallself} + % transfer amount back to staker + \begin{umlcall}[fill=green!20, op={: transfer(staker, amount)}]{Branded Token Gate}{OST} + % return OST to staker + \begin{umlcall}[type=return, fill=green!20, op=<>]{OST}{Staker} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlfragment} + + %%% + %%% OpenST Mosaic (Foundation reports respective state root of ) + %%% + + \begin{umlfragment}[type=loop, name=mosaic] + + \begin{umlcall}[dt=175, op={new block(blockHeight, stateRoot)}]{Utility Chain}{Foundation} + % Foundation report state root of Utility chain on CoreUC on value chain + \begin{umlcall}[op={: report(UC, blockHeight, stateRoot)}]{Foundation}{RegistrarVC} + \begin{umlcall}[op={: commit(blockHeight, stateRoot)}]{RegistrarVC}{CoreUC} + % state root of utility chain got reported on value chain + \begin{umlcall}[dt=10, type=return, op={emit CommittedStateRoot(UC, blockHeight, stateRoot)}]{CoreUC}{Facilitator} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlcall} + + % Foundation report state root of Value chain on CoreVC on utility chain + \begin{umlcall}[dt=205, op={new block(blockHeight, stateRoot)}]{Value Chain}{Foundation} + \begin{umlcall}[op={: report(VC, blockHeight, stateRoot}]{Foundation}{RegistrarUC} + % reporting through registrar is instant commit + \begin{umlcall}[op={: commit(blockHeight, stateRoot)}]{RegistrarUC}{CoreVC} + % state root of value chain got reported on utility chain + \begin{umlcall}[dt=10, type=return, op={emit CommittedStateRoot(VC, blockHeight, stateRoot)}]{CoreVC}{Facilitator} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlcall} + + \end{umlfragment} + \umlnote[x=30, y=-26, width=180]{mosaic}{Placeholder for OpenST Mosaic game} + + %%% + %%% Facilitator has observed a committed state root that includes the StakingIntentHash + %%% + + % Facilitator submits claim for StakingIntentHash by presenting Merkle proof + \begin{umlcall}[dt=15, op={: claimStakingIntentHash(StakingIntentHash, merkleProof[], committedBlockHeight)}, return={emit ValidatedStakingIntentHash(StakingIntentHash)}]{Facilitator}{OpenSTUtility} + % OpenSTUtility checks StakingIntentHash against committed state root + \begin{umlcall}[op={: getStateRoot(blockHeight)}, return={stateRoot @ blockHeight}]{OpenSTUtility}{CoreVC} + \end{umlcall} + % OpenSTUtility validate merkle proof + \begin{umlcallself}[op={validate proof}]{OpenSTUtility} + \end{umlcallself} + % OpenSTUtility store valid StakingIntentHash + \begin{umlcallself}[op={store valid StakingIntentHash}]{OpenSTUtility} + \end{umlcallself} + \end{umlcall} + + % Facilitator submits pre-image data for StakingIntentHash + \begin{umlcall}[dt=5, op={: ConfirmStakingIntent(StakingIntentHash, uuid, hashLock, amountST, amountUT, stakingProcessor, stakingProcessorNonce, tokenHolder, unlockHeight)}, return={emit StakingIntentConfirmed(StakingIntentHash, nonce, unlockHeight, expirationHeight)}]{Facilitator}{OpenSTUtility} + % OpenSTUtility asserts valid pre-image data for StakingIntentHash + \begin{umlcallself}[op={assert valid pre-image data}]{OpenSTUtility} + \end{umlcallself} + % OpenSTUtility checks StakingIntentHash against committed state root + \begin{umlcall}[op={: getLatestHeight()}, return={latestHeight}]{OpenSTUtility}{CoreVC} + \end{umlcall} + % OpenSTUtility asserts grace period before unlockHeight + \begin{umlcallself}[op={assert grace period before unlockHeight}]{OpenSTUtility} + \end{umlcallself} + % OpenSTUtility store mint object with StakingIntentHash and expiration Height + \begin{umlcallself}[op={store mint with expirationHeight}]{OpenSTUtility} + \end{umlcallself} + \end{umlcall} + + %%% + %%% Facilitator has moved both value and utility chain to the first stage + %%% and can now either proceed or revert by revealing the hash lock secret or await timeout + %%% + + % Correctly initialised staking information on both systems + \begin{umlfragment}[type=alt, label=proceed, name=phasetwo, inner xsep=6] + \begin{umlcall}[dt=6, fill=green!20, op={: processStaking(StakingIntentHash, unlockSecret)}]{Facilitator}{Branded Token Gate} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{Branded Token Gate} + \end{umlcallself} + % Facilitator first calls processStaking to ensure the bounty is return to him + \begin{umlcall}[dt=4, op={: processStaking(StakingIntentHash, unlockSecret)}]{Branded Token Gate}{OpenSTValue} + % check stakingAccount + \begin{umlcallself}[op={require(msg.sender = gate = stakingAccount || stakingAccount = 0x)}]{OpenSTValue} + \end{umlcallself} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{OpenSTValue} + \end{umlcallself} + % transfer amount OST to SimpleStake + \begin{umlcall}[fill=green!20, op={: transfer(simpleStake, amount)}]{OpenSTValue}{OST} + \begin{umlcall}[dt=5, fill=green!20, type=return, op={<>}]{OST}{SimpleStake} + \end{umlcall} + \end{umlcall} + \begin{umlcall}[dt=5, type=return, op={emit ProcessedStake(StakingIntentHash, unlockSecret)}]{OpenSTValue}{Hunter} + \end{umlcall} + \end{umlcall} + % transfer bounty from gate to facilitator + \begin{umlcall}[dt=5, fill=green!20, op={: transfer(facilitator, bounty)}]{Branded Token Gate}{OST} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{OST}{Facilitator} + \end{umlcall} + \end{umlcall} + \end{umlcall} + + % Facilitator then calls processMinting to mint the utility tokens + \begin{umlcall}[op={: processMinting(StakingIntentHash, unlockSecret)}]{Facilitator}{OpenSTUtility} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{OpenSTUtility} + \end{umlcallself} + % require mint not yet expired + \begin{umlcallself}[op={require(expirationHeight > block.number)}]{OpenSTUtility} + \end{umlcallself} + % mint Branded Tokens + \begin{umlcall}[fill=green!20, op={: mint(amountUT, tokenHolder)}]{OpenSTUtility}{Branded Token} + % store claim + \begin{umlcallself}[op={store claim}]{Branded Token} + \end{umlcallself} + \end{umlcall} + \begin{umlcall}[type=return, op={emit ProcessedMint(StakingIntentHash, unlockSecret)}]{OpenSTUtility}{Hunter} + \end{umlcall} + \end{umlcall} + + % Facilitator (or anyone) can call claim to transfer UT to token holder + \begin{umlcall}[dt=5, op={: claim(tokenHolder)}]{Facilitator}{Branded Token} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{Branded Token}{Token Holder} + \end{umlcall} + \end{umlcall} + + %%% + %%% Hunter + %%% + + \begin{umlfragment}[type=opt, name=bounty, label={ensure completion}, inner xsep=15] + % process staking on gate + \begin{umlcall}[dt=20, fill=green!20, op={: processStaking(StakingIntentHash, unlockSecret)}]{Hunter}{Branded Token Gate} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{Branded Token Gate} + \end{umlcallself} + % Facilitator first calls processStaking to ensure the bounty is return to him + \begin{umlcall}[dt=4, op={: processStaking(StakingIntentHash, unlockSecret)}]{Branded Token Gate}{OpenSTValue} + % check stakingAccount + \begin{umlcallself}[op={require(msg.sender = gate = stakingAccount || stakingAccount = 0x)}]{OpenSTValue} + \end{umlcallself} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{OpenSTValue} + \end{umlcallself} + % transfer amount OST to SimpleStake + \begin{umlcall}[fill=green!20, op={: transfer(simpleStake, amount)}]{OpenSTValue}{OST} + \begin{umlcall}[dt=5, fill=green!20, type=return, op={<>}]{OST}{SimpleStake} + \end{umlcall} + \end{umlcall} + \begin{umlcall}[dt=5, type=return, op={emit ProcessedStake(StakingIntentHash, unlockSecret)}]{OpenSTValue}{Facilitator} + \end{umlcall} + \end{umlcall} + % transfer bounty from gate to facilitator + \begin{umlcall}[dt=5, fill=green!20, op={: transfer(hunter, bounty)}]{Branded Token Gate}{OST} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{OST}{Hunter} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlfragment} + \umlnote[x=12, y=-64, width=150]{bounty}{If stake was left unprocessed, unlock secret is known through mint. Bounty is always transferred to msg.sender of processStaking()} + + \umlfpart[revert] + + \begin{umlcall}[dt=20, fill=green!20, op={: revertStaking(StakingIntentHash)}]{Facilitator}{Branded Token Gate} + % check unlockHeight is in the past + \begin{umlcallself}[op={require(unlockHeight <= block.number)}]{Branded Token Gate} + \end{umlcallself} + % Facilitator reverts stake to get back amount and bounty + \begin{umlcall}[fill=green!20, op={: revertStaking(StakingIntentHash)}]{Branded Token Gate}{OpenSTValue} + % check stakingAccount + \begin{umlcallself}[op={require(msg.sender = gate = stakingAccount || stakingAccount = 0x)}]{OpenSTValue} + \end{umlcallself} + % check unlockHeight + \begin{umlcallself}[op={require(unlockHeight <= block.number)}]{OpenSTValue} + \end{umlcallself} + % transfer amount and bounty OST to facilitator + \begin{umlcall}[fill=green!20, op={: transfer(staker, amount)}]{OpenSTValue}{OST} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{OST}{Staker} + \end{umlcall} + \end{umlcall} + \end{umlcall} + % transfer bounty from gate to facilitator + \begin{umlcall}[dt=5, fill=green!20, op={: transfer(facilitator, bounty)}]{Branded Token Gate}{OST} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{OST}{Facilitator} + \end{umlcall} + \end{umlcall} + \end{umlcall} + + \begin{umlcall}[op={: revertMinting(StakingIntentHash)}]{Facilitator}{OpenSTUtility} + % require mint not yet expired + \begin{umlcallself}[op={require(expirationHeight <= block.number)}]{OpenSTUtility} + \end{umlcallself} + \end{umlcall} + \end{umlfragment} + \umlnote[x=1, y=-47, width=100]{phasetwo}{With both value chain and utility chain configured correctly for StakingIntentHash, Facilitator can proceed by revealing the unlock secret, or revert by awaiting the unlock height } + \umlnote[x=40, y=-100, width=120]{phasetwo}{Any actor can call revertStaking and the bounty is returned to the facilitator} + + \end{umlseqdiag} +\end{tikzpicture} + + +\end{document} + diff --git a/docs/json/BrandedToken.json b/docs/json/BrandedToken.json new file mode 100644 index 00000000..3ef2bce2 --- /dev/null +++ b/docs/json/BrandedToken.json @@ -0,0 +1,111 @@ + +{ + "methods" : { + "allowance(address,address)" : { + "details" : "Takes _owner, _spender; returns remaining allowance of _spender from _owner", + "params" : { + "_owner" : "owner", + "_spender" : "spender" + }, + "return" : "remaining" + }, + "approve(address,uint256)" : { + "details" : "Takes _spender, _value; approves _spender to transfer _value from msg.sender; emits Approval event", + "params" : { + "_spender" : "spender", + "_value" : "value" + }, + "return" : "success" + }, + "balanceOf(address)" : { + "details" : "Takes _owner; returns balance of _owner", + "params" : { + "_owner" : "owner" + }, + "return" : "balance" + }, + "burn(address,uint256)" : { + "details" : "Takes _burner, _amount; calls burnEIP20 and returns the result of calling burnInternal; only callable by protocol", + "params" : { + "_amount" : "amount", + "_burner" : "burner" + }, + "return" : "bool" + }, + "claim(address)" : { + "details" : "Takes _beneficiary; calls claimInternal and returns the result of calling claimEIP20", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "bool" + }, + "completeProtocolTransfer()" : { + "details" : "Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol", + "return" : "success bool" + }, + "decimals()" : { + "details" : "Returns decimals", + "return" : "uint8" + }, + "initiateProtocolTransfer(address)" : { + "details" : "Takes _proposedProtocol; initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol", + "params" : { + "_proposedProtocol" : "proposedProtocol" + }, + "return" : "success bool" + }, + "mint(address,uint256)" : { + "details" : "Takes _beneficiary, _amount; calls mintEIP20 and returns the result of calling mintInternal; only callable by protocol", + "params" : { + "_amount" : "amount", + "_beneficiary" : "beneficiary" + }, + "return" : "bool" + }, + "name()" : { + "details" : "Returns name", + "return" : "string" + }, + "revokeProtocolTransfer()" : { + "details" : "protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol", + "return" : "success bool" + }, + "symbol()" : { + "details" : "Returns symbol", + "return" : "string" + }, + "totalSupply()" : { + "details" : "Get totalTokenSupply as view so that child cannot edit", + "return" : "uint256" + }, + "transfer(address,uint256)" : { + "details" : "Takes _to, _value; transfers _value from balance of msg.sender to _to; emits Transfer event", + "params" : { + "_to" : "to", + "_value" : "value" + }, + "return" : "success" + }, + "transferFrom(address,address,uint256)" : { + "details" : "Takes _from, _to, _value; transfers _value from balance of _from to _to; emits Transfer event", + "params" : { + "_from" : "from", + "_to" : "to", + "_value" : "value" + }, + "return" : "success" + }, + "unclaimed(address)" : { + "details" : "Takes _beneficiary; returns unclaimed amount for _beneficiary", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "uint256" + }, + "uuid()" : { + "details" : "Returns uuid", + "return" : "bytes32" + } + }, + "title" : "BrandedToken - An EIP20 token minted by staking Simple Token on Ethereum mainnet. Branded tokens are designed to be used within a (decentralised) application and support: smart contract controlled password reset for users who don't yet (hard-spoon FTW) manage their own private keys (+v0.9.2); soft-exit for a user to redeem their equivalent part of the Simple Token stake on Ethereum mainnet; hard-exit for all users if the utility chain halts to reclaim their equivalent part of the Simple Token stake on Ethereum (before v1.0)" +} \ No newline at end of file diff --git a/docs/json/Core.json b/docs/json/Core.json new file mode 100644 index 00000000..9c322ecb --- /dev/null +++ b/docs/json/Core.json @@ -0,0 +1,18 @@ + +{ + "methods" : { + "chainIdRemote()" : { + "details" : "Returns ID of remote chain", + "return" : "uint256" + }, + "openSTRemote()" : { + "details" : "Returns protocol on remote chain", + "return" : "address" + }, + "registrar()" : { + "details" : "Returns registrar", + "return" : "address" + } + }, + "title" : "Core - A minimal stub that will become the anchoring and consensus point for the utility chain to validate itself against" +} \ No newline at end of file diff --git a/docs/json/CoreInterface.json b/docs/json/CoreInterface.json new file mode 100644 index 00000000..a45d66bb --- /dev/null +++ b/docs/json/CoreInterface.json @@ -0,0 +1,19 @@ + +{ + "methods" : { + "chainIdRemote()" : { + "details" : "Returns ID of remote chain", + "return" : "uint256" + }, + "openSTRemote()" : { + "details" : "Returns protocol on remote chain", + "return" : "address" + }, + "registrar()" : { + "details" : "Returns registrar", + "return" : "address" + } + }, + "title" : "CoreInterface - Interface for Core" +} + diff --git a/docs/json/EIP20Interface.json b/docs/json/EIP20Interface.json new file mode 100644 index 00000000..1cc669b3 --- /dev/null +++ b/docs/json/EIP20Interface.json @@ -0,0 +1,63 @@ + +{ + "methods" : { + "allowance(address,address)" : { + "details" : "Returns remaining allowance of _spender from _owner", + "params" : { + "_owner" : "owner", + "_spender" : "spender" + }, + "return" : "remaining" + }, + "approve(address,uint256)" : { + "details" : "Approves _spender to transfer _value from msg.sender; emits Approval event", + "params" : { + "_spender" : "spender", + "_value" : "value" + }, + "return" : "success" + }, + "balanceOf(address)" : { + "details" : "Returns balance of _owner", + "params" : { + "_owner" : "owner" + }, + "return" : "balance" + }, + "decimals()" : { + "details" : "Returns decimals", + "return" : "uint8" + }, + "name()" : { + "details" : "Returns name", + "return" : "string" + }, + "symbol()" : { + "details" : "Returns symbol", + "return" : "string" + }, + "totalSupply()" : { + "details" : "Returns totalSupply", + "return" : "uint256" + }, + "transfer(address,uint256)" : { + "details" : "Transfers _value from balance of msg.sender to _to; emits Transfer event", + "params" : { + "_to" : "to", + "_value" : "value" + }, + "return" : "success" + }, + "transferFrom(address,address,uint256)" : { + "details" : "Transfers _value from balance of _from to _to; emits Transfer event", + "params" : { + "_from" : "from", + "_to" : "to", + "_value" : "value" + }, + "return" : "success" + } + }, + "title" : "EIP20Interface - Interface for EIP20Token" +} + diff --git a/docs/json/EIP20Token.json b/docs/json/EIP20Token.json new file mode 100644 index 00000000..8b369e3c --- /dev/null +++ b/docs/json/EIP20Token.json @@ -0,0 +1,62 @@ + +{ + "methods" : { + "allowance(address,address)" : { + "details" : "Takes _owner, _spender; returns remaining allowance of _spender from _owner", + "params" : { + "_owner" : "owner", + "_spender" : "spender" + }, + "return" : "remaining" + }, + "approve(address,uint256)" : { + "details" : "Takes _spender, _value; approves _spender to transfer _value from msg.sender; emits Approval event", + "params" : { + "_spender" : "spender", + "_value" : "value" + }, + "return" : "success" + }, + "balanceOf(address)" : { + "details" : "Takes _owner; returns balance of _owner", + "params" : { + "_owner" : "owner" + }, + "return" : "balance" + }, + "decimals()" : { + "details" : "Returns decimals", + "return" : "uint8" + }, + "name()" : { + "details" : "Returns name", + "return" : "string" + }, + "symbol()" : { + "details" : "Returns symbol", + "return" : "string" + }, + "totalSupply()" : { + "details" : "Returns totalSupply", + "return" : "uint256" + }, + "transfer(address,uint256)" : { + "details" : "Takes _to, _value; transfers _value from balance of msg.sender to _to; emits Transfer event", + "params" : { + "_to" : "to", + "_value" : "value" + }, + "return" : "success" + }, + "transferFrom(address,address,uint256)" : { + "details" : "Takes _from, _to, _value; transfers _value from balance of _from to _to; emits Transfer event", + "params" : { + "_from" : "from", + "_to" : "to", + "_value" : "value" + }, + "return" : "success" + } + }, + "title" : "EIP20Token - Implements EIP20 token" +} \ No newline at end of file diff --git a/docs/json/EIP20TokenMock.json b/docs/json/EIP20TokenMock.json new file mode 100644 index 00000000..bf308c48 --- /dev/null +++ b/docs/json/EIP20TokenMock.json @@ -0,0 +1,83 @@ + +{ + "methods" : { + "allowance(address,address)" : { + "details" : "Takes _owner, _spender; returns remaining allowance of _spender from _owner", + "params" : { + "_owner" : "owner", + "_spender" : "spender" + }, + "return" : "remaining" + }, + "approve(address,uint256)" : { + "details" : "Takes _spender, _value; approves _spender to transfer _value from msg.sender; emits Approval event", + "params" : { + "_spender" : "spender", + "_value" : "value" + }, + "return" : "success" + }, + "balanceOf(address)" : { + "details" : "Takes _owner; returns balance of _owner", + "params" : { + "_owner" : "owner" + }, + "return" : "balance" + }, + "burnEIP20Public(uint256)" : { + "details" : "Public wrapper for burnEIP20Public", + "params" : { + "_amount" : "amount" + }, + "return" : "success bool" + }, + "claimEIP20Public(address,uint256)" : { + "details" : "Public wrapper for claimEIP20Public", + "params" : { + "_amount" : "amount", + "_beneficiary" : "beneficiary" + }, + "return" : "success bool" + }, + "decimals()" : { + "details" : "Returns decimals", + "return" : "uint8" + }, + "mintEIP20Public(uint256)" : { + "details" : "Public wrapper for mintEIP20Public", + "params" : { + "_amount" : "amount" + }, + "return" : "success bool" + }, + "name()" : { + "details" : "Returns name", + "return" : "string" + }, + "symbol()" : { + "details" : "Returns symbol", + "return" : "string" + }, + "totalSupply()" : { + "details" : "Mock totalSupply function" + }, + "transfer(address,uint256)" : { + "details" : "Takes _to, _value; transfers _value from balance of msg.sender to _to; emits Transfer event", + "params" : { + "_to" : "to", + "_value" : "value" + }, + "return" : "success" + }, + "transferFrom(address,address,uint256)" : { + "details" : "Takes _from, _to, _value; transfers _value from balance of _from to _to; emits Transfer event", + "params" : { + "_from" : "from", + "_to" : "to", + "_value" : "value" + }, + "return" : "success" + } + }, + "title" : "EIP20TokenMock - Implements mock totalSupply function and wraps internal functions to enable testing EIP20Token" +} \ No newline at end of file diff --git a/docs/json/Hasher.json b/docs/json/Hasher.json new file mode 100644 index 00000000..489fd64d --- /dev/null +++ b/docs/json/Hasher.json @@ -0,0 +1,43 @@ + +{ + "methods" : { + "hashRedemptionIntent(bytes32,address,uint256,uint256,uint256)" : { + "details" : "Returns hash of _uuid, _account, _accountNonce, _amountUT, _escrowUnlockHeight", + "params" : { + "_account" : "account", + "_accountNonce" : "accountNonce", + "_amountUT" : "amountUT", + "_escrowUnlockHeight" : "escrowUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "bytes32" + }, + "hashStakingIntent(bytes32,address,uint256,address,uint256,uint256,uint256)" : { + "details" : "Returns hash of _uuid, _account, _accountNonce, _beneficiary, _amountST, _amountUT, _escrowUnlockHeight", + "params" : { + "_account" : "account", + "_accountNonce" : "accountNonce", + "_amountST" : "amountST", + "_amountUT" : "amountUT", + "_beneficiary" : "beneficiary", + "_escrowUnlockHeight" : "escrowUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "bytes32" + }, + "hashUuid(string,string,uint256,uint256,address,uint256)" : { + "details" : "Returns hash of _symbol, _name, _chainIdValue, _chainIdUtility, _openSTUtility, _conversionRate", + "params" : { + "_chainIdUtility" : "chainIdUtility", + "_chainIdValue" : "chainIdValue", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_openSTUtility" : "openSTUtility", + "_symbol" : "symbol" + }, + "return" : "bytes32" + } + }, + "title" : "Hasher - Protocol hash functions" +} + diff --git a/docs/json/OpenSTUtility.json b/docs/json/OpenSTUtility.json new file mode 100644 index 00000000..2c66468a --- /dev/null +++ b/docs/json/OpenSTUtility.json @@ -0,0 +1,176 @@ + +{ + "methods" : { + "checkAvailability(bytes32,bytes32,address)" : { + "details" : "Takes _hashSymbol, _hashName, _requester; checks whether branded token is available", + "params" : { + "_hashName" : "hashName", + "_hashSymbol" : "hashSymbol", + "_requester" : "requester" + }, + "return" : "bool" + }, + "completeOwnershipTransfer()" : { + "details" : "Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event", + "return" : "success bool" + }, + "confirmStakingIntent(bytes32,address,uint256,address,uint256,uint256,uint256,bytes32)" : { + "details" : "Takes _uuid, _staker, _stakerNonce, _beneficiary, _amountST, _amountUT, _stakingUnlockHeight, _stakingIntentHash; confirms staking intent; emits StakingIntentConfirmed event; only callable by registrar", + "params" : { + "_amountST" : "amountST", + "_amountUT" : "amountUT", + "_beneficiary" : "beneficiary", + "_staker" : "staker", + "_stakerNonce" : "stakerNonce", + "_stakingIntentHash" : "stakingIntentHash", + "_stakingUnlockHeight" : "stakingUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "expirationHeight" + }, + "hashRedemptionIntent(bytes32,address,uint256,uint256,uint256)" : { + "details" : "Returns hash of _uuid, _account, _accountNonce, _amountUT, _escrowUnlockHeight", + "params" : { + "_account" : "account", + "_accountNonce" : "accountNonce", + "_amountUT" : "amountUT", + "_escrowUnlockHeight" : "escrowUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "bytes32" + }, + "hashStakingIntent(bytes32,address,uint256,address,uint256,uint256,uint256)" : { + "details" : "Returns hash of _uuid, _account, _accountNonce, _beneficiary, _amountST, _amountUT, _escrowUnlockHeight", + "params" : { + "_account" : "account", + "_accountNonce" : "accountNonce", + "_amountST" : "amountST", + "_amountUT" : "amountUT", + "_beneficiary" : "beneficiary", + "_escrowUnlockHeight" : "escrowUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "bytes32" + }, + "hashUuid(string,string,uint256,uint256,address,uint256)" : { + "details" : "Returns hash of _symbol, _name, _chainIdValue, _chainIdUtility, _openSTUtility, _conversionRate", + "params" : { + "_chainIdUtility" : "chainIdUtility", + "_chainIdValue" : "chainIdValue", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_openSTUtility" : "openSTUtility", + "_symbol" : "symbol" + }, + "return" : "bytes32" + }, + "initiateOwnershipTransfer(address)" : { + "details" : "Takes _proposedOwner; sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event", + "params" : { + "_proposedOwner" : "proposedOwner" + }, + "return" : "success bool" + }, + "initiateProtocolTransfer(address,address)" : { + "details" : "Takes _token, _proposedProtocol; initiates transfer to _proposedProtocol for _token; only callable by adminAddress", + "params" : { + "_proposedProtocol" : "proposedProtocol", + "_token" : "token" + }, + "return" : "success bool" + }, + "processMinting(bytes32)" : { + "details" : "Takes _stakingIntentHash; processes corresponding mint; emits ProcessedMint event", + "params" : { + "_stakingIntentHash" : "stakingIntentHash" + }, + "return" : "tokenAddress" + }, + "processRedeeming(bytes32)" : { + "details" : "Takes _redemptionIntentHash; processes corresponding redemption; emits ProcessedRedemption event", + "params" : { + "_redemptionIntentHash" : "redemptionIntentHash" + }, + "return" : "tokenAddress" + }, + "proposeBrandedToken(string,string,uint256)" : { + "details" : "Takes _symbol _name _conversionRate. Congratulations on looking under the hood and obtaining ST' to call proposeBrandedToken; however, OpenSTFoundation is not yet actively listening to these events because to automate it we will build a web UI where you can authenticate with your msg.sender = _requester key; until that time please drop us a line on partners(at)simpletoken.org and we can work with you to register your branded token", + "params" : { + "_conversionRate" : "conversionRate", + "_name" : "name", + "_symbol" : "symbol" + }, + "return" : "btUuid" + }, + "redeem(bytes32,uint256,uint256)" : { + "details" : "Takes _uuid, _amountBT, _nonce; redeemer must set an allowance for the branded token with OpenSTUtility as the spender so that the branded token can be taken into escrow by OpenSTUtility; emits RedemptionIntentDeclared event. Note: for STPrime, call OpenSTUtility.redeemSTPrime as a payable function. Note: nonce must be queried from OpenSTValue contract", + "params" : { + "_amountBT" : "amountBT", + "_nonce" : "nonce", + "_uuid" : "uuid" + }, + "return" : "unlockHeight, redemptionIntentHash" + }, + "redeemSTPrime(uint256)" : { + "details" : "Takes _nonce; redeemer must send as value the amount STP to redeem; emits RedemptionIntentDeclared event. Note: nonce must be queried from OpenSTValue contract", + "params" : { + "_nonce" : "nonce" + }, + "return" : "amountSTP, unlockHeight, redemptionIntentHash" + }, + "registerBrandedToken(string,string,uint256,address,address,bytes32)" : { + "details" : "Takes _symbol, _name, _conversionRate, _requester, _brandedToken, _checkUuid; registers a branded token; emits RegisteredBrandedToken event; only callable by registrar", + "params" : { + "_brandedToken" : "brandedToken", + "_checkUuid" : "checkUuid", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_requester" : "requester", + "_symbol" : "symbol" + }, + "return" : "registeredUuid" + }, + "registeredTokenProperties(bytes32)" : { + "params" : { + "_uuid" : "uuid" + }, + "return" : "token address, registrar address" + }, + "revertMinting(bytes32)" : { + "details" : "Takes _stakingIntentHash; reverts corresponding mint; emits RevertedMint event", + "params" : { + "_stakingIntentHash" : "stakingIntentHash" + }, + "return" : "uuid, staker, beneficiary, amount" + }, + "revertRedemption(bytes32)" : { + "details" : "Takes _redemptionIntentHash; reverts corresponding redemption; emits RevertedRedemption event", + "params" : { + "_redemptionIntentHash" : "redemptionIntentHash" + }, + "return" : "uuid, redeemer, amountUT" + }, + "revokeProtocolTransfer(address)" : { + "details" : "Takes _token; revokes protocol transfer; on the very first released version v0.9.1 there is no need to completeProtocolTransfer from a previous version; only callable by adminAddress", + "params" : { + "_token" : "token" + }, + "return" : "success bool" + }, + "setAdminAddress(address)" : { + "details" : "Takes _adminAddress; sets adminAddress to _adminAddress and returns true; only callable by owner or adminAddress; adminAddress can also be set to 0 to 'disable' it", + "params" : { + "_adminAddress" : "adminAddress" + }, + "return" : "bool" + }, + "setOpsAddress(address)" : { + "details" : "Takes _opsAddress; sets opsAddress to _opsAddress and returns true; only callable by owner or adminAddress; _opsAddress can also be set to 0 to 'disable' it", + "params" : { + "_opsAddress" : "opsAddress" + }, + "return" : "bool" + } + }, + "title" : "OpenSTUtility - Protocol for a utility chain" +} \ No newline at end of file diff --git a/docs/json/OpenSTUtilityInterface.json b/docs/json/OpenSTUtilityInterface.json new file mode 100644 index 00000000..eac7e32b --- /dev/null +++ b/docs/json/OpenSTUtilityInterface.json @@ -0,0 +1,39 @@ + +{ + "methods" : { + "confirmStakingIntent(bytes32,address,uint256,address,uint256,uint256,uint256,bytes32)" : { + "details" : "Takes _uuid _staker _stakerNonce _beneficiary _amountST _amountUT _stakingUnlockHeight _stakingIntentHash; confirms staking intent; emits StakingIntentConfirmed event", + "params" : { + "_amountST" : "amountST", + "_amountUT" : "amountUT", + "_beneficiary" : "beneficiary", + "_staker" : "staker", + "_stakerNonce" : "stakerNonce", + "_stakingIntentHash" : "stakingIntentHash", + "_stakingUnlockHeight" : "stakingUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "expirationHeight" + }, + "processRedeeming(bytes32)" : { + "details" : "Takes _redemptionIntentHash; processes corresponding redemption; emits ProcessedRedemption event", + "params" : { + "_redemptionIntentHash" : "redemptionIntentHash" + }, + "return" : "tokenAddress" + }, + "registerBrandedToken(string,string,uint256,address,address,bytes32)" : { + "details" : "Takes _symbol, _name, _conversionRate, _requester, _brandedToken, _checkUuid; registers a branded token; emits RegisteredBrandedToken event", + "params" : { + "_brandedToken" : "brandedToken", + "_checkUuid" : "checkUuid", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_requester" : "requester", + "_symbol" : "symbol" + }, + "return" : "registeredUuid" + } + }, + "title" : "OpenSTUtilityInterface - Interface for OpenSTUtility" +} \ No newline at end of file diff --git a/docs/json/OpenSTValue.json b/docs/json/OpenSTValue.json new file mode 100644 index 00000000..cd543d28 --- /dev/null +++ b/docs/json/OpenSTValue.json @@ -0,0 +1,172 @@ + +{ + "methods" : { + "addCore(address)" : { + "details" : "Takes _core; adds _core to cores by core.chainIdRemote; only callable by registrar", + "params" : { + "_core" : "core" + }, + "return" : "success bool" + }, + "blocksToWaitLong()" : { + "details" : "Returns BLOCKS_TO_WAIT_LONG", + "return" : "uint256" + }, + "blocksToWaitShort()" : { + "details" : "Returns BLOCKS_TO_WAIT_SHORT", + "return" : "uint256" + }, + "completeOwnershipTransfer()" : { + "details" : "Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event", + "return" : "success bool" + }, + "confirmRedemptionIntent(bytes32,address,uint256,uint256,uint256,bytes32)" : { + "details" : "Takes _uuid, _redeemer, _redeemerNonce, _amountUT, _redemptionUnlockHeight, _redemptionIntentHash; confirms redemption intent; emits RedemptionIntentConfirmed event; only callable by registrar", + "params" : { + "_amountUT" : "amountUT", + "_redeemer" : "redeemer", + "_redeemerNonce" : "redeemerNonce", + "_redemptionIntentHash" : "redemptionIntentHash", + "_redemptionUnlockHeight" : "redemptionUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "amountST, expirationHeight" + }, + "core(uint256)" : { + "details" : "Takes _chainIdUtility; returns core address", + "return" : "address" + }, + "getNextNonce(address)" : { + "details" : "Takes _account; returns next nonce", + "return" : "uint256" + }, + "hashRedemptionIntent(bytes32,address,uint256,uint256,uint256)" : { + "details" : "Returns hash of _uuid, _account, _accountNonce, _amountUT, _escrowUnlockHeight", + "params" : { + "_account" : "account", + "_accountNonce" : "accountNonce", + "_amountUT" : "amountUT", + "_escrowUnlockHeight" : "escrowUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "bytes32" + }, + "hashStakingIntent(bytes32,address,uint256,address,uint256,uint256,uint256)" : { + "details" : "Returns hash of _uuid, _account, _accountNonce, _beneficiary, _amountST, _amountUT, _escrowUnlockHeight", + "params" : { + "_account" : "account", + "_accountNonce" : "accountNonce", + "_amountST" : "amountST", + "_amountUT" : "amountUT", + "_beneficiary" : "beneficiary", + "_escrowUnlockHeight" : "escrowUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "bytes32" + }, + "hashUuid(string,string,uint256,uint256,address,uint256)" : { + "details" : "Returns hash of _symbol, _name, _chainIdValue, _chainIdUtility, _openSTUtility, _conversionRate", + "params" : { + "_chainIdUtility" : "chainIdUtility", + "_chainIdValue" : "chainIdValue", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_openSTUtility" : "openSTUtility", + "_symbol" : "symbol" + }, + "return" : "bytes32" + }, + "initiateOwnershipTransfer(address)" : { + "details" : "Takes _proposedOwner; sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event", + "params" : { + "_proposedOwner" : "proposedOwner" + }, + "return" : "success bool" + }, + "initiateProtocolTransfer(address,address)" : { + "details" : "Takes _simpleStake, _proposedProtocol; initiates transfer to _proposedProtocol for _simpleStake; only callable by adminAddress", + "params" : { + "_proposedProtocol" : "proposedProtocol", + "_simpleStake" : "simpleStake" + }, + "return" : "success bool" + }, + "processStaking(bytes32)" : { + "details" : "Takes _stakingIntentHash; processes corresponding stake; emits ProcessedStake event", + "params" : { + "_stakingIntentHash" : "stakingIntentHash" + }, + "return" : "stakeAddress" + }, + "processUnstaking(bytes32)" : { + "details" : "Takes _redemptionIntentHash; processes corresponding unstake; emits ProcessedUnstake event", + "params" : { + "_redemptionIntentHash" : "redemptionIntentHash" + }, + "return" : "stakeAddress" + }, + "registerUtilityToken(string,string,uint256,uint256,address,bytes32)" : { + "details" : "Takes _symbol, _name, _conversionRate, _chainIdUtility, _stakingAccount, _checkUuid; registers a utility token; emits UtilityTokenRegistered event; only callable by registrar", + "params" : { + "_chainIdUtility" : "chainIdUtility", + "_checkUuid" : "checkUuid", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_stakingAccount" : "stakingAccount", + "_symbol" : "symbol" + }, + "return" : "uuid" + }, + "revertStaking(bytes32)" : { + "details" : "Takes _stakingIntentHash; reverts corresponding stake; emits RevertedStake event", + "params" : { + "_stakingIntentHash" : "stakingIntentHash" + }, + "return" : "uuid, staker, amountST, staker" + }, + "revertUnstaking(bytes32)" : { + "details" : "Takes _redemptionIntentHash; reverts corresponding unstake; emits RevertedUnstake event", + "params" : { + "_redemptionIntentHash" : "redemptionIntentHash" + }, + "return" : "uuid, redeemer, amountST" + }, + "revokeProtocolTransfer(address)" : { + "details" : "Takes _simpleStake; revokes protocol transfer; on the very first released version v0.9.1 there is no need to completeProtocolTransfer from a previous version; only callable by adminAddress", + "params" : { + "_simpleStake" : "simpleStake" + }, + "return" : "success bool" + }, + "setAdminAddress(address)" : { + "details" : "Takes _adminAddress; sets adminAddress to _adminAddress and returns true; only callable by owner or adminAddress; adminAddress can also be set to 0 to 'disable' it", + "params" : { + "_adminAddress" : "adminAddress" + }, + "return" : "bool" + }, + "setOpsAddress(address)" : { + "details" : "Takes _opsAddress; sets opsAddress to _opsAddress and returns true; only callable by owner or adminAddress; _opsAddress can also be set to 0 to 'disable' it", + "params" : { + "_opsAddress" : "opsAddress" + }, + "return" : "bool" + }, + "stake(bytes32,uint256,address)" : { + "details" : "Takes _uuid, _amountST, _beneficiary; In order to stake the tx.origin needs to set an allowance for the OpenSTValue contract to transfer to itself to hold during the staking process.", + "params" : { + "_amountST" : "amountST", + "_beneficiary" : "beneficiary", + "_uuid" : "uuid" + }, + "return" : "amountUT, nonce, unlockHeight, stakingIntentHash" + }, + "utilityTokenProperties(bytes32)" : { + "params" : { + "_uuid" : "uuid" + }, + "return" : "symbol, name, conversionRate, decimals, chainIdUtility, simpleStake, stakingAccount" + } + }, + "title" : "OpenSTValue - value staking contract for OpenST " +} \ No newline at end of file diff --git a/docs/json/OpenSTValueInterface.json b/docs/json/OpenSTValueInterface.json new file mode 100644 index 00000000..c98e9d5e --- /dev/null +++ b/docs/json/OpenSTValueInterface.json @@ -0,0 +1,45 @@ + +{ + "methods" : { + "addCore(address)" : { + "details" : "Takes _core; adds _core to cores by core.chainIdRemote", + "params" : { + "_core" : "core" + }, + "return" : "success bool" + }, + "confirmRedemptionIntent(bytes32,address,uint256,uint256,uint256,bytes32)" : { + "details" : "Takes _uuid, _redeemer, _redeemerNonce, _amountUT, _redemptionUnlockHeight, _redemptionIntentHash; confirms redemption intent; emits RedemptionIntentConfirmed event", + "params" : { + "_amountUT" : "amountUT", + "_redeemer" : "redeemer", + "_redeemerNonce" : "redeemerNonce", + "_redemptionIntentHash" : "redemptionIntentHash", + "_redemptionUnlockHeight" : "redemptionUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "amountST, expirationHeight" + }, + "processStaking(bytes32)" : { + "details" : "Takes _stakingIntentHash; processes corresponding stake; emits ProcessedStake event", + "params" : { + "_stakingIntentHash" : "stakingIntentHash" + }, + "return" : "stakeAddress" + }, + "registerUtilityToken(string,string,uint256,uint256,address,bytes32)" : { + "details" : "Takes _symbol, _name, _conversionRate, _chainIdUtility, _stakingAccount, _checkUuid; registers a utility token; emits UtilityTokenRegistered event", + "params" : { + "_chainIdUtility" : "chainIdUtility", + "_checkUuid" : "checkUuid", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_stakingAccount" : "stakingAccount", + "_symbol" : "symbol" + }, + "return" : "uuid" + } + }, + "title" : "OpenSTValueInterface - Interface for OpenSTValue" +} + diff --git a/docs/json/OpsManaged.json b/docs/json/OpsManaged.json new file mode 100644 index 00000000..04b63760 --- /dev/null +++ b/docs/json/OpsManaged.json @@ -0,0 +1,31 @@ + +{ + "methods" : { + "completeOwnershipTransfer()" : { + "details" : "Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event", + "return" : "success bool" + }, + "initiateOwnershipTransfer(address)" : { + "details" : "Takes _proposedOwner; sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event", + "params" : { + "_proposedOwner" : "proposedOwner" + }, + "return" : "success bool" + }, + "setAdminAddress(address)" : { + "details" : "Takes _adminAddress; sets adminAddress to _adminAddress and returns true; only callable by owner or adminAddress; adminAddress can also be set to 0 to 'disable' it", + "params" : { + "_adminAddress" : "adminAddress" + }, + "return" : "bool" + }, + "setOpsAddress(address)" : { + "details" : "Takes _opsAddress; sets opsAddress to _opsAddress and returns true; only callable by owner or adminAddress; _opsAddress can also be set to 0 to 'disable' it", + "params" : { + "_opsAddress" : "opsAddress" + }, + "return" : "bool" + } + }, + "title" : "OpsManaged - OpenST ownership and permission model" +} \ No newline at end of file diff --git a/docs/json/Owned.json b/docs/json/Owned.json new file mode 100644 index 00000000..24cc3b94 --- /dev/null +++ b/docs/json/Owned.json @@ -0,0 +1,18 @@ + +{ + "methods" : { + "completeOwnershipTransfer()" : { + "details" : "Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event", + "return" : "success bool" + }, + "initiateOwnershipTransfer(address)" : { + "details" : "Takes _proposedOwner; sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event", + "params" : { + "_proposedOwner" : "proposedOwner" + }, + "return" : "success bool" + } + }, + "title" : "Owned - Implements basic ownership with 2-step transfers" +} + diff --git a/docs/json/ProtocolVersioned.json b/docs/json/ProtocolVersioned.json new file mode 100644 index 00000000..fbc75779 --- /dev/null +++ b/docs/json/ProtocolVersioned.json @@ -0,0 +1,22 @@ + +{ + "methods" : { + "completeProtocolTransfer()" : { + "details" : "Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol", + "return" : "success bool" + }, + "initiateProtocolTransfer(address)" : { + "details" : "Takes _proposedProtocol; initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol", + "params" : { + "_proposedProtocol" : "proposedProtocol" + }, + "return" : "success bool" + }, + "revokeProtocolTransfer()" : { + "details" : "protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol", + "return" : "success bool" + } + }, + "title" : "ProtocolVersioned - Administers protocol versioning" +} + diff --git a/docs/json/Registrar.json b/docs/json/Registrar.json new file mode 100644 index 00000000..8bc3b6d8 --- /dev/null +++ b/docs/json/Registrar.json @@ -0,0 +1,109 @@ + +{ + "methods" : { + "addCore(address,address)" : { + "details" : "Takes _registry, _core; adds _core to _registry; only callable by adminAddress or opsAddress", + "params" : { + "_core" : "core", + "_registry" : "registry" + }, + "return" : "success bool" + }, + "completeOwnershipTransfer()" : { + "details" : "Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event", + "return" : "success bool" + }, + "confirmRedemptionIntent(address,bytes32,address,uint256,uint256,uint256,bytes32)" : { + "details" : "Takes __registry, uuid, _redeemer, _redeemerNonce, _amountUT, _redemptionUnlockHeight, _redemptionIntentHash; confirms redemption intent with _registry; only callable by opsAddress", + "params" : { + "_amountUT" : "amountUT", + "_redeemer" : "redeemer", + "_redeemerNonce" : "redeemerNonce", + "_redemptionIntentHash" : "redemptionIntentHash", + "_redemptionUnlockHeight" : "redemptionUnlockHeight", + "_registry" : "registry", + "_uuid" : "uuid" + }, + "return" : "amountST, expirationHeight" + }, + "confirmStakingIntent(address,bytes32,address,uint256,address,uint256,uint256,uint256,bytes32)" : { + "details" : "Takes _registry, _uuid, _staker, _stakerNonce, _beneficiary, _amountST, _amountUT, _stakingUnlockHeight, _stakingIntentHash; confirms staking intent with _registry; only callable by opsAddress", + "params" : { + "_amountST" : "amountST", + "_amountUT" : "amountUT", + "_beneficiary" : "beneficiary", + "_registry" : "registry", + "_staker" : "staker", + "_stakerNonce" : "stakerNonce", + "_stakingIntentHash" : "stakingIntentHash", + "_stakingUnlockHeight" : "stakingUnlockHeight", + "_uuid" : "uuid" + }, + "return" : "expirationHeight" + }, + "initiateOwnershipTransfer(address)" : { + "details" : "Takes _proposedOwner; sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event", + "params" : { + "_proposedOwner" : "proposedOwner" + }, + "return" : "success bool" + }, + "processRedeeming(address,bytes32)" : { + "details" : "Takes _registry, _redemptionIntentHash; processes corresponding redemption with _registry; only callable by adminAddress", + "params" : { + "_redemptionIntentHash" : "redemptionIntentHash", + "_registry" : "registry" + }, + "return" : "tokenAddress" + }, + "processStaking(address,bytes32)" : { + "details" : "Takes _registry, _stakingIntentHash; processes stake with _registry; only callable by adminAddress", + "params" : { + "_registry" : "registry", + "_stakingIntentHash" : "stakingIntentHash" + }, + "return" : "stakeAddress" + }, + "registerBrandedToken(address,string,string,uint256,address,address,bytes32)" : { + "details" : "Takes _registry, _symbol, _name, _conversionRate, _requester, _brandedToken, _checkUuid; registers a branded token with _registry; only callable by adminAddress or opsAddress", + "params" : { + "_brandedToken" : "brandedToken", + "_checkUuid" : "checkUuid", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_registry" : "registry", + "_requester" : "requester", + "_symbol" : "symbol" + }, + "return" : "registeredUuid" + }, + "registerUtilityToken(address,string,string,uint256,uint256,address,bytes32)" : { + "details" : "Takes _registry, _symbol, _name, _conversionRate, _chainIdUtility, _stakingAccount, _checkUuid; registers a utility token with _registry; only callable by adminAddress or opsAddress", + "params" : { + "_chainIdUtility" : "chainIdUtility", + "_checkUuid" : "checkUuid", + "_conversionRate" : "conversionRate", + "_name" : "name", + "_registry" : "registry", + "_stakingAccount" : "stakingAccount", + "_symbol" : "symbol" + }, + "return" : "uuid" + }, + "setAdminAddress(address)" : { + "details" : "Takes _adminAddress; sets adminAddress to _adminAddress and returns true; only callable by owner or adminAddress; adminAddress can also be set to 0 to 'disable' it", + "params" : { + "_adminAddress" : "adminAddress" + }, + "return" : "bool" + }, + "setOpsAddress(address)" : { + "details" : "Takes _opsAddress; sets opsAddress to _opsAddress and returns true; only callable by owner or adminAddress; _opsAddress can also be set to 0 to 'disable' it", + "params" : { + "_opsAddress" : "opsAddress" + }, + "return" : "bool" + } + }, + "title" : "Registrar - Administers registrations for utility tokens" +} \ No newline at end of file diff --git a/docs/json/STPrime.json b/docs/json/STPrime.json new file mode 100644 index 00000000..4d4fc922 --- /dev/null +++ b/docs/json/STPrime.json @@ -0,0 +1,61 @@ + +{ + "methods" : { + "burn(address,uint256)" : { + "details" : "Takes _burner, _amount; burns utility tokens after having redeemed them through the protocol for the staked Simple Token; only callable by protocol", + "params" : { + "_amount" : "amount", + "_burner" : "burner" + }, + "return" : "bool" + }, + "claim(address)" : { + "details" : "Takes _beneficiary; transfers full claim to beneficiary; claim can be called publicly as the beneficiary and amount are set, and this allows for reduced steps on the user experience to complete the claim automatically; for first stake of ST' the gas price by one validator has to be zero to deploy the contracts and accept the very first staking of ST for ST' and its protocol executions.", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "success bool" + }, + "completeProtocolTransfer()" : { + "details" : "Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol", + "return" : "success bool" + }, + "initialize()" : { + "details" : "On setup of the utility chain the base tokens need to be transfered in full to STPrime for the base tokens to be minted as ST'" + }, + "initiateProtocolTransfer(address)" : { + "details" : "Takes _proposedProtocol; initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol", + "params" : { + "_proposedProtocol" : "proposedProtocol" + }, + "return" : "success bool" + }, + "mint(address,uint256)" : { + "details" : "Takes _beneficiary, _amount; mints new Simple Token Prime into circulation and increase total supply accordingly; tokens are minted into a claim to ensure that the protocol completion does not continue into foreign contracts at _beneficiary; only callable by protocol", + "params" : { + "_amount" : "amount return bool", + "_beneficiary" : "beneficiary" + } + }, + "revokeProtocolTransfer()" : { + "details" : "protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol", + "return" : "success bool" + }, + "totalSupply()" : { + "details" : "Get totalTokenSupply as view so that child cannot edit", + "return" : "uint256" + }, + "unclaimed(address)" : { + "details" : "Takes _beneficiary; returns unclaimed amount for _beneficiary", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "uint256" + }, + "uuid()" : { + "details" : "Returns uuid", + "return" : "bytes32" + } + }, + "title" : "STPrime - A freely tradable equivalent representation of Simple Token [ST] on Ethereum mainnet on the utility chain; STPrime functions as the base token to pay for gas consumption on the utility chain; it is not an EIP20 token, but functions as the genesis guardian of the finite amount of base tokens on the utility chain" +} \ No newline at end of file diff --git a/docs/json/SimpleStake.json b/docs/json/SimpleStake.json new file mode 100644 index 00000000..6aa8e1b9 --- /dev/null +++ b/docs/json/SimpleStake.json @@ -0,0 +1,34 @@ + +{ + "methods" : { + "completeProtocolTransfer()" : { + "details" : "Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol", + "return" : "success bool" + }, + "getTotalStake()" : { + "details" : "total stake is the balance of the staking contract; accidental transfers directly to SimpleStake bypassing the OpenST protocol will not mint new utility tokens, but will add to the total stake; (accidental) donations can not be prevented", + "return" : "uint256" + }, + "initiateProtocolTransfer(address)" : { + "details" : "Takes _proposedProtocol; initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol", + "params" : { + "_proposedProtocol" : "proposedProtocol" + }, + "return" : "success bool" + }, + "releaseTo(address,uint256)" : { + "details" : "Takes _to, _amount; allows the protocol to release the staked amount into provided address. The protocol MUST be a contract that sets the rules on how the stake can be released and to who. The protocol takes the role of an \"owner\" of the stake. Only callable by protocol. Emits ReleasedStake event.", + "params" : { + "_amount" : "Amount of stake to release to beneficiary", + "_to" : "Beneficiary of the amount of the stake" + }, + "return" : "success bool" + }, + "revokeProtocolTransfer()" : { + "details" : "protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol", + "return" : "success bool" + } + }, + "title" : "SimpleStake - Stakes the value of an EIP20 token on Ethereum for a utility token on the OpenST platform" +} + diff --git a/docs/json/UtilityTokenAbstract.json b/docs/json/UtilityTokenAbstract.json new file mode 100644 index 00000000..cbc15e5f --- /dev/null +++ b/docs/json/UtilityTokenAbstract.json @@ -0,0 +1,59 @@ + +{ + "methods" : { + "burn(address,uint256)" : { + "details" : "Takes _burner, _amount; burns utility tokens after having redeemed them through the protocol for the staked Simple Token", + "params" : { + "_amount" : "amount", + "_burner" : "burner" + }, + "return" : "success" + }, + "claim(address)" : { + "details" : "Takes _beneficiary; transfers full claim to beneficiary", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "success" + }, + "completeProtocolTransfer()" : { + "details" : "Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol", + "return" : "success bool" + }, + "initiateProtocolTransfer(address)" : { + "details" : "Takes _proposedProtocol; initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol", + "params" : { + "_proposedProtocol" : "proposedProtocol" + }, + "return" : "success bool" + }, + "mint(address,uint256)" : { + "details" : "Takes _beneficiary, _amount; mints new utility tokens", + "params" : { + "_amount" : "amount", + "_beneficiary" : "beneficiary" + }, + "return" : "success" + }, + "revokeProtocolTransfer()" : { + "details" : "protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol", + "return" : "success bool" + }, + "totalSupply()" : { + "details" : "Get totalTokenSupply as view so that child cannot edit", + "return" : "uint256" + }, + "unclaimed(address)" : { + "details" : "Takes _beneficiary; returns unclaimed amount for _beneficiary", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "uint256" + }, + "uuid()" : { + "details" : "Returns uuid", + "return" : "bytes32" + } + }, + "title" : "UtilityTokenAbstract - Base utility token functionality for BrandedTokens and STPrime" +} \ No newline at end of file diff --git a/docs/json/UtilityTokenAbstractMock.json b/docs/json/UtilityTokenAbstractMock.json new file mode 100644 index 00000000..7eb64957 --- /dev/null +++ b/docs/json/UtilityTokenAbstractMock.json @@ -0,0 +1,82 @@ + +{ + "methods" : { + "burn(address,uint256)" : { + "details" : "Mock burn function", + "params" : { + "_amount" : "amount", + "_redeemer" : "redeemer" + }, + "return" : "success bool" + }, + "burnInternalPublic(address,uint256)" : { + "details" : "Public wrapper for burnInternal", + "params" : { + "_amount" : "amount", + "_redeemer" : "redeemer" + }, + "return" : "success bool" + }, + "claim(address)" : { + "details" : "Mock claim function", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "success bool" + }, + "claimInternalPublic(address)" : { + "details" : "Public wrapper for claimInternal", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "amount" + }, + "completeProtocolTransfer()" : { + "details" : "Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol", + "return" : "success bool" + }, + "initiateProtocolTransfer(address)" : { + "details" : "Takes _proposedProtocol; initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol", + "params" : { + "_proposedProtocol" : "proposedProtocol" + }, + "return" : "success bool" + }, + "mint(address,uint256)" : { + "details" : "Mock mint function", + "params" : { + "_amount" : "amount", + "_beneficiary" : "beneficiary" + }, + "return" : "success bool" + }, + "mintInternalPublic(address,uint256)" : { + "details" : "Public wrapper for mintInternal", + "params" : { + "_amount" : "amount", + "_beneficiary" : "beneficiary" + }, + "return" : "success bool" + }, + "revokeProtocolTransfer()" : { + "details" : "protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol", + "return" : "success bool" + }, + "totalSupply()" : { + "details" : "Get totalTokenSupply as view so that child cannot edit", + "return" : "uint256" + }, + "unclaimed(address)" : { + "details" : "Takes _beneficiary; returns unclaimed amount for _beneficiary", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "uint256" + }, + "uuid()" : { + "details" : "Returns uuid", + "return" : "bytes32" + } + }, + "title" : "UtilityTokenAbstractMock - Implements mock claim, mint, and burn functions and wraps internal functions to enable testing UtilityTokenAbstract" +} \ No newline at end of file diff --git a/docs/json/UtilityTokenInterface.json b/docs/json/UtilityTokenInterface.json new file mode 100644 index 00000000..30198f8b --- /dev/null +++ b/docs/json/UtilityTokenInterface.json @@ -0,0 +1,38 @@ + +{ + "methods" : { + "burn(address,uint256)" : { + "details" : "Takes _burner, _amount; burns utility tokens after having redeemed them through the protocol for the staked Simple Token", + "params" : { + "_amount" : "amount", + "_burner" : "burner" + }, + "return" : "success" + }, + "claim(address)" : { + "details" : "Takes _beneficiary; transfers full claim to beneficiary", + "params" : { + "_beneficiary" : "beneficiary" + }, + "return" : "success" + }, + "mint(address,uint256)" : { + "details" : "Takes _beneficiary, _amount; mints new utility tokens", + "params" : { + "_amount" : "amount", + "_beneficiary" : "beneficiary" + }, + "return" : "success" + }, + "totalSupply()" : { + "details" : "Get totalTokenSupply as view so that child cannot edit", + "return" : "supply" + }, + "uuid()" : { + "details" : "Get unique universal identifier for utility token", + "return" : "getUuid" + } + }, + "title" : "UtilityTokenInterface - Interface for UtilityToken" +} + diff --git a/docs/md/BrandedToken.md b/docs/md/BrandedToken.md new file mode 100644 index 00000000..f257133e --- /dev/null +++ b/docs/md/BrandedToken.md @@ -0,0 +1,29 @@ +# OpenST Protocol Documentation + +## BrandedToken + + +An EIP20 token minted by staking Simple Token on Ethereum mainnet. Branded tokens are designed to be used within a (decentralised) application and support: smart contract controlled password reset for users who don't yet (hard-spoon FTW) manage their own private keys (+v0.9.2); soft-exit for a user to redeem their equivalent part of the Simple Token stake on Ethereum mainnet; hard-exit for all users if the utility chain halts to reclaim their equivalent part of the Simple Token stake on Ethereum (before v1.0) + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +allowance
    (address, address) | remaining | Takes _owner, _spender

    Returns remaining allowance of _spender from _owner +approve
    (address, uint256) | success | Takes _spender, _value

    Approves _spender to transfer _value from msg.sender; emits Approval event +balanceOf
    (address) | balance | Takes _owner

    Returns balance of _owner +burn
    (address, uint256) | bool | Takes _burner, _amount

    Calls burnEIP20 and returns the result of calling burnInternal; only callable by protocol +claim
    (address) | bool | Takes _beneficiary

    Calls claimInternal and returns the result of calling claimEIP20 +completeProtocolTransfer() | success bool | Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol +decimals() | uint8 | Returns decimals +initiateProtocolTransfer
    (address) | success bool | Takes _proposedProtocol

    Initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol +mint
    (address, uint256) | bool | Takes _beneficiary, _amount

    Calls mintEIP20 and returns the result of calling mintInternal; only callable by protocol +name() | string | Returns name +revokeProtocolTransfer() | success bool | protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol +symbol() | string | Returns symbol +totalSupply() | uint256 | Get totalTokenSupply as view so that child cannot edit +transfer
    (address, uint256) | success | Takes _to, _value

    Transfers _value from balance of msg.sender to _to; emits Transfer event +transferFrom
    (address, address, uint256) | success | Takes _from, _to, _value

    Transfers _value from balance of _from to _to; emits Transfer event +unclaimed
    (address) | uint256 | Takes _beneficiary

    Returns unclaimed amount for _beneficiary +uuid() | bytes32 | Returns uuid + diff --git a/docs/md/Core.md b/docs/md/Core.md new file mode 100644 index 00000000..fa79df14 --- /dev/null +++ b/docs/md/Core.md @@ -0,0 +1,15 @@ +# OpenST Protocol Documentation + +## Core + + +A minimal stub that will become the anchoring and consensus point for the utility chain to validate itself against + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +chainIdRemote() | uint256 | Returns ID of remote chain +openSTRemote() | address | Returns protocol on remote chain +registrar() | address | Returns registrar + diff --git a/docs/md/CoreInterface.md b/docs/md/CoreInterface.md new file mode 100644 index 00000000..017d4baa --- /dev/null +++ b/docs/md/CoreInterface.md @@ -0,0 +1,15 @@ +# OpenST Protocol Documentation + +## CoreInterface + + +Interface for Core + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +chainIdRemote() | uint256 | Returns ID of remote chain +openSTRemote() | address | Returns protocol on remote chain +registrar() | address | Returns registrar + diff --git a/docs/md/EIP20Interface.md b/docs/md/EIP20Interface.md new file mode 100644 index 00000000..66f77033 --- /dev/null +++ b/docs/md/EIP20Interface.md @@ -0,0 +1,21 @@ +# OpenST Protocol Documentation + +## EIP20Interface + + +Interface for EIP20Token + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +allowance
    (address, address) | remaining | Returns remaining allowance of _spender from _owner +approve
    (address, uint256) | success | Approves _spender to transfer _value from msg.sender; emits Approval event +balanceOf
    (address) | balance | Returns balance of _owner +decimals() | uint8 | Returns decimals +name() | string | Returns name +symbol() | string | Returns symbol +totalSupply() | uint256 | Returns totalSupply +transfer
    (address, uint256) | success | Transfers _value from balance of msg.sender to _to; emits Transfer event +transferFrom
    (address, address, uint256) | success | Transfers _value from balance of _from to _to; emits Transfer event + diff --git a/docs/md/EIP20Token.md b/docs/md/EIP20Token.md new file mode 100644 index 00000000..45e563f1 --- /dev/null +++ b/docs/md/EIP20Token.md @@ -0,0 +1,21 @@ +# OpenST Protocol Documentation + +## EIP20Token + + +Implements EIP20 token + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +allowance
    (address, address) | remaining | Takes _owner, _spender

    Returns remaining allowance of _spender from _owner +approve
    (address, uint256) | success | Takes _spender, _value

    Approves _spender to transfer _value from msg.sender; emits Approval event +balanceOf
    (address) | balance | Takes _owner

    Returns balance of _owner +decimals() | uint8 | Returns decimals +name() | string | Returns name +symbol() | string | Returns symbol +totalSupply() | uint256 | Returns totalSupply +transfer
    (address, uint256) | success | Takes _to, _value

    Transfers _value from balance of msg.sender to _to; emits Transfer event +transferFrom
    (address, address, uint256) | success | Takes _from, _to, _value

    Transfers _value from balance of _from to _to; emits Transfer event + diff --git a/docs/md/EIP20TokenMock.md b/docs/md/EIP20TokenMock.md new file mode 100644 index 00000000..904a5f8d --- /dev/null +++ b/docs/md/EIP20TokenMock.md @@ -0,0 +1,24 @@ +# OpenST Protocol Documentation + +## EIP20TokenMock + + +Implements mock totalSupply function and wraps internal functions to enable testing EIP20Token + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +allowance
    (address, address) | remaining | Takes _owner, _spender

    Returns remaining allowance of _spender from _owner +approve
    (address, uint256) | success | Takes _spender, _value

    Approves _spender to transfer _value from msg.sender; emits Approval event +balanceOf
    (address) | balance | Takes _owner

    Returns balance of _owner +burnEIP20Public
    (uint256) | success bool | Public wrapper for burnEIP20Public +claimEIP20Public
    (address, uint256) | success bool | Public wrapper for claimEIP20Public +decimals() | uint8 | Returns decimals +mintEIP20Public
    (uint256) | success bool | Public wrapper for mintEIP20Public +name() | string | Returns name +symbol() | string | Returns symbol +totalSupply() | | Mock totalSupply function +transfer
    (address, uint256) | success | Takes _to, _value

    Transfers _value from balance of msg.sender to _to; emits Transfer event +transferFrom
    (address, address, uint256) | success | Takes _from, _to, _value

    Transfers _value from balance of _from to _to; emits Transfer event + diff --git a/docs/md/Hasher.md b/docs/md/Hasher.md new file mode 100644 index 00000000..601669d4 --- /dev/null +++ b/docs/md/Hasher.md @@ -0,0 +1,15 @@ +# OpenST Protocol Documentation + +## Hasher + + +Protocol hash functions + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +hashRedemptionIntent
    (bytes32, address, uint256, uint256, uint256) | bytes32 | Returns hash of _uuid, _account, _accountNonce, _amountUT, _escrowUnlockHeight +hashStakingIntent
    (bytes32, address, uint256, address, uint256, uint256, uint256) | bytes32 | Returns hash of _uuid, _account, _accountNonce, _beneficiary, _amountST, _amountUT, _escrowUnlockHeight +hashUuid
    (string, string, uint256, uint256, address, uint256) | bytes32 | Returns hash of _symbol, _name, _chainIdValue, _chainIdUtility, _openSTUtility, _conversionRate + diff --git a/docs/md/OpenSTUtility.md b/docs/md/OpenSTUtility.md new file mode 100644 index 00000000..2f1ad96c --- /dev/null +++ b/docs/md/OpenSTUtility.md @@ -0,0 +1,32 @@ +# OpenST Protocol Documentation + +## OpenSTUtility + + +Protocol for a utility chain + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +checkAvailability
    (bytes32, bytes32, address) | bool | Takes _hashSymbol, _hashName, _requester

    Checks whether branded token is available +completeOwnershipTransfer() | success bool | Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event +confirmStakingIntent
    (bytes32, address, uint256, address, uint256, uint256, uint256, bytes32) | expirationHeight | Takes _uuid, _staker, _stakerNonce, _beneficiary, _amountST, _amountUT, _stakingUnlockHeight, _stakingIntentHash

    Confirms staking intent; emits StakingIntentConfirmed event; only callable by registrar +hashRedemptionIntent
    (bytes32, address, uint256, uint256, uint256) | bytes32 | Returns hash of _uuid, _account, _accountNonce, _amountUT, _escrowUnlockHeight +hashStakingIntent
    (bytes32, address, uint256, address, uint256, uint256, uint256) | bytes32 | Returns hash of _uuid, _account, _accountNonce, _beneficiary, _amountST, _amountUT, _escrowUnlockHeight +hashUuid
    (string, string, uint256, uint256, address, uint256) | bytes32 | Returns hash of _symbol, _name, _chainIdValue, _chainIdUtility, _openSTUtility, _conversionRate +initiateOwnershipTransfer
    (address) | success bool | Takes _proposedOwner

    Sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event +initiateProtocolTransfer
    (address, address) | success bool | Takes _token, _proposedProtocol

    Initiates transfer to _proposedProtocol for _token; only callable by adminAddress +processMinting
    (bytes32) | tokenAddress | Takes _stakingIntentHash

    Processes corresponding mint; emits ProcessedMint event +processRedeeming
    (bytes32) | tokenAddress | Takes _redemptionIntentHash

    Processes corresponding redemption; emits ProcessedRedemption event +proposeBrandedToken
    (string, string, uint256) | btUuid | Takes _symbol _name _conversionRate. Congratulations on looking under the hood and obtaining ST' to call proposeBrandedToken

    However, OpenSTFoundation is not yet actively listening to these events because to automate it we will build a web UI where you can authenticate with your msg.sender = _requester key; until that time please drop us a line on partners(at)simpletoken.org and we can work with you to register your branded token +redeem
    (bytes32, uint256, uint256) | unlockHeight, redemptionIntentHash | Takes _uuid, _amountBT, _nonce

    Redeemer must set an allowance for the branded token with OpenSTUtility as the spender so that the branded token can be taken into escrow by OpenSTUtility; emits RedemptionIntentDeclared event. Note: for STPrime, call OpenSTUtility.redeemSTPrime as a payable function. Note: nonce must be queried from OpenSTValue contract +redeemSTPrime
    (uint256) | amountSTP, unlockHeight, redemptionIntentHash | Takes _nonce

    Redeemer must send as value the amount STP to redeem; emits RedemptionIntentDeclared event. Note: nonce must be queried from OpenSTValue contract +registerBrandedToken
    (string, string, uint256, address, address, bytes32) | registeredUuid | Takes _symbol, _name, _conversionRate, _requester, _brandedToken, _checkUuid

    Registers a branded token; emits RegisteredBrandedToken event; only callable by registrar +registeredTokenProperties
    (bytes32) | token address, registrar address | +revertMinting
    (bytes32) | uuid, staker, beneficiary, amount | Takes _stakingIntentHash

    Reverts corresponding mint; emits RevertedMint event +revertRedemption
    (bytes32) | uuid, redeemer, amountUT | Takes _redemptionIntentHash

    Reverts corresponding redemption; emits RevertedRedemption event +revokeProtocolTransfer
    (address) | success bool | Takes _token

    Revokes protocol transfer; on the very first released version v0.9.1 there is no need to completeProtocolTransfer from a previous version; only callable by adminAddress +setAdminAddress
    (address) | bool | Takes _adminAddress

    Sets adminAddress to _adminAddress and returns true; only callable by owner or adminAddress; adminAddress can also be set to 0 to 'disable' it +setOpsAddress
    (address) | bool | Takes _opsAddress

    Sets opsAddress to _opsAddress and returns true; only callable by owner or adminAddress; _opsAddress can also be set to 0 to 'disable' it + diff --git a/docs/md/OpenSTUtilityInterface.md b/docs/md/OpenSTUtilityInterface.md new file mode 100644 index 00000000..0c36eb0a --- /dev/null +++ b/docs/md/OpenSTUtilityInterface.md @@ -0,0 +1,15 @@ +# OpenST Protocol Documentation + +## OpenSTUtilityInterface + + +Interface for OpenSTUtility + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +confirmStakingIntent
    (bytes32, address, uint256, address, uint256, uint256, uint256, bytes32) | expirationHeight | Takes _uuid _staker _stakerNonce _beneficiary _amountST _amountUT _stakingUnlockHeight _stakingIntentHash

    Confirms staking intent; emits StakingIntentConfirmed event +processRedeeming
    (bytes32) | tokenAddress | Takes _redemptionIntentHash

    Processes corresponding redemption; emits ProcessedRedemption event +registerBrandedToken
    (string, string, uint256, address, address, bytes32) | registeredUuid | Takes _symbol, _name, _conversionRate, _requester, _brandedToken, _checkUuid

    Registers a branded token; emits RegisteredBrandedToken event + diff --git a/docs/md/OpenSTValue.md b/docs/md/OpenSTValue.md new file mode 100644 index 00000000..e0f6869b --- /dev/null +++ b/docs/md/OpenSTValue.md @@ -0,0 +1,34 @@ +# OpenST Protocol Documentation + +## OpenSTValue + + +value staking contract for OpenST + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +addCore
    (address) | success bool | Takes _core

    Adds _core to cores by core.chainIdRemote; only callable by registrar +blocksToWaitLong() | uint256 | Returns BLOCKS_TO_WAIT_LONG +blocksToWaitShort() | uint256 | Returns BLOCKS_TO_WAIT_SHORT +completeOwnershipTransfer() | success bool | Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event +confirmRedemptionIntent
    (bytes32, address, uint256, uint256, uint256, bytes32) | amountST, expirationHeight | Takes _uuid, _redeemer, _redeemerNonce, _amountUT, _redemptionUnlockHeight, _redemptionIntentHash

    Confirms redemption intent; emits RedemptionIntentConfirmed event; only callable by registrar +core
    (uint256) | address | Takes _chainIdUtility

    Returns core address +getNextNonce
    (address) | uint256 | Takes _account

    Returns next nonce +hashRedemptionIntent
    (bytes32, address, uint256, uint256, uint256) | bytes32 | Returns hash of _uuid, _account, _accountNonce, _amountUT, _escrowUnlockHeight +hashStakingIntent
    (bytes32, address, uint256, address, uint256, uint256, uint256) | bytes32 | Returns hash of _uuid, _account, _accountNonce, _beneficiary, _amountST, _amountUT, _escrowUnlockHeight +hashUuid
    (string, string, uint256, uint256, address, uint256) | bytes32 | Returns hash of _symbol, _name, _chainIdValue, _chainIdUtility, _openSTUtility, _conversionRate +initiateOwnershipTransfer
    (address) | success bool | Takes _proposedOwner

    Sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event +initiateProtocolTransfer
    (address, address) | success bool | Takes _simpleStake, _proposedProtocol

    Initiates transfer to _proposedProtocol for _simpleStake; only callable by adminAddress +processStaking
    (bytes32) | stakeAddress | Takes _stakingIntentHash

    Processes corresponding stake; emits ProcessedStake event +processUnstaking
    (bytes32) | stakeAddress | Takes _redemptionIntentHash

    Processes corresponding unstake; emits ProcessedUnstake event +registerUtilityToken
    (string, string, uint256, uint256, address, bytes32) | uuid | Takes _symbol, _name, _conversionRate, _chainIdUtility, _stakingAccount, _checkUuid

    Registers a utility token; emits UtilityTokenRegistered event; only callable by registrar +revertStaking
    (bytes32) | uuid, staker, amountST, staker | Takes _stakingIntentHash

    Reverts corresponding stake; emits RevertedStake event +revertUnstaking
    (bytes32) | uuid, redeemer, amountST | Takes _redemptionIntentHash

    Reverts corresponding unstake; emits RevertedUnstake event +revokeProtocolTransfer
    (address) | success bool | Takes _simpleStake

    Revokes protocol transfer; on the very first released version v0.9.1 there is no need to completeProtocolTransfer from a previous version; only callable by adminAddress +setAdminAddress
    (address) | bool | Takes _adminAddress

    Sets adminAddress to _adminAddress and returns true; only callable by owner or adminAddress; adminAddress can also be set to 0 to 'disable' it +setOpsAddress
    (address) | bool | Takes _opsAddress

    Sets opsAddress to _opsAddress and returns true; only callable by owner or adminAddress; _opsAddress can also be set to 0 to 'disable' it +stake
    (bytes32, uint256, address) | amountUT, nonce, unlockHeight, stakingIntentHash | Takes _uuid, _amountST, _beneficiary

    In order to stake the tx.origin needs to set an allowance for the OpenSTValue contract to transfer to itself to hold during the staking process. +utilityTokenProperties
    (bytes32) | symbol, name, conversionRate, decimals, chainIdUtility, simpleStake, stakingAccount | + diff --git a/docs/md/OpenSTValueInterface.md b/docs/md/OpenSTValueInterface.md new file mode 100644 index 00000000..c3a6e0af --- /dev/null +++ b/docs/md/OpenSTValueInterface.md @@ -0,0 +1,16 @@ +# OpenST Protocol Documentation + +## OpenSTValueInterface + + +Interface for OpenSTValue + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +addCore
    (address) | success bool | Takes _core

    Adds _core to cores by core.chainIdRemote +confirmRedemptionIntent
    (bytes32, address, uint256, uint256, uint256, bytes32) | amountST, expirationHeight | Takes _uuid, _redeemer, _redeemerNonce, _amountUT, _redemptionUnlockHeight, _redemptionIntentHash

    Confirms redemption intent; emits RedemptionIntentConfirmed event +processStaking
    (bytes32) | stakeAddress | Takes _stakingIntentHash

    Processes corresponding stake; emits ProcessedStake event +registerUtilityToken
    (string, string, uint256, uint256, address, bytes32) | uuid | Takes _symbol, _name, _conversionRate, _chainIdUtility, _stakingAccount, _checkUuid

    Registers a utility token; emits UtilityTokenRegistered event + diff --git a/docs/md/OpsManaged.md b/docs/md/OpsManaged.md new file mode 100644 index 00000000..2f788d5c --- /dev/null +++ b/docs/md/OpsManaged.md @@ -0,0 +1,16 @@ +# OpenST Protocol Documentation + +## OpsManaged + + +OpenST ownership and permission model + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +completeOwnershipTransfer() | success bool | Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event +initiateOwnershipTransfer
    (address) | success bool | Takes _proposedOwner

    Sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event +setAdminAddress
    (address) | bool | Takes _adminAddress

    Sets adminAddress to _adminAddress and returns true; only callable by owner or adminAddress; adminAddress can also be set to 0 to 'disable' it +setOpsAddress
    (address) | bool | Takes _opsAddress

    Sets opsAddress to _opsAddress and returns true; only callable by owner or adminAddress; _opsAddress can also be set to 0 to 'disable' it + diff --git a/docs/md/Owned.md b/docs/md/Owned.md new file mode 100644 index 00000000..353ebc80 --- /dev/null +++ b/docs/md/Owned.md @@ -0,0 +1,14 @@ +# OpenST Protocol Documentation + +## Owned + + +Implements basic ownership with 2-step transfers + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +completeOwnershipTransfer() | success bool | Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event +initiateOwnershipTransfer
    (address) | success bool | Takes _proposedOwner

    Sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event + diff --git a/docs/md/ProtocolVersioned.md b/docs/md/ProtocolVersioned.md new file mode 100644 index 00000000..3ad970f0 --- /dev/null +++ b/docs/md/ProtocolVersioned.md @@ -0,0 +1,15 @@ +# OpenST Protocol Documentation + +## ProtocolVersioned + + +Administers protocol versioning + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +completeProtocolTransfer() | success bool | Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol +initiateProtocolTransfer
    (address) | success bool | Takes _proposedProtocol

    Initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol +revokeProtocolTransfer() | success bool | protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol + diff --git a/docs/md/Registrar.md b/docs/md/Registrar.md new file mode 100644 index 00000000..aa669d18 --- /dev/null +++ b/docs/md/Registrar.md @@ -0,0 +1,23 @@ +# OpenST Protocol Documentation + +## Registrar + + +Administers registrations for utility tokens + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +addCore
    (address, address) | success bool | Takes _registry, _core

    Adds _core to _registry; only callable by adminAddress or opsAddress +completeOwnershipTransfer() | success bool | Sets proposedOwner to owner and proposedOwner to 0; only callable by proposedOwner; emits OwnershipTransferCompleted event +confirmRedemptionIntent
    (address, bytes32, address, uint256, uint256, uint256, bytes32) | amountST, expirationHeight | Takes __registry, uuid, _redeemer, _redeemerNonce, _amountUT, _redemptionUnlockHeight, _redemptionIntentHash

    Confirms redemption intent with _registry; only callable by opsAddress +confirmStakingIntent
    (address, bytes32, address, uint256, address, uint256, uint256, uint256, bytes32) | expirationHeight | Takes _registry, _uuid, _staker, _stakerNonce, _beneficiary, _amountST, _amountUT, _stakingUnlockHeight, _stakingIntentHash

    Confirms staking intent with _registry; only callable by opsAddress +initiateOwnershipTransfer
    (address) | success bool | Takes _proposedOwner

    Sets proposedOwner to _proposedOwner; only callable by owner; emits OwnershipTransferInitiated event +processRedeeming
    (address, bytes32) | tokenAddress | Takes _registry, _redemptionIntentHash

    Processes corresponding redemption with _registry; only callable by adminAddress +processStaking
    (address, bytes32) | stakeAddress | Takes _registry, _stakingIntentHash

    Processes stake with _registry; only callable by adminAddress +registerBrandedToken
    (address, string, string, uint256, address, address, bytes32) | registeredUuid | Takes _registry, _symbol, _name, _conversionRate, _requester, _brandedToken, _checkUuid

    Registers a branded token with _registry; only callable by adminAddress or opsAddress +registerUtilityToken
    (address, string, string, uint256, uint256, address, bytes32) | uuid | Takes _registry, _symbol, _name, _conversionRate, _chainIdUtility, _stakingAccount, _checkUuid

    Registers a utility token with _registry; only callable by adminAddress or opsAddress +setAdminAddress
    (address) | bool | Takes _adminAddress

    Sets adminAddress to _adminAddress and returns true; only callable by owner or adminAddress; adminAddress can also be set to 0 to 'disable' it +setOpsAddress
    (address) | bool | Takes _opsAddress

    Sets opsAddress to _opsAddress and returns true; only callable by owner or adminAddress; _opsAddress can also be set to 0 to 'disable' it + diff --git a/docs/md/STPrime.md b/docs/md/STPrime.md new file mode 100644 index 00000000..3c1b9383 --- /dev/null +++ b/docs/md/STPrime.md @@ -0,0 +1,22 @@ +# OpenST Protocol Documentation + +## STPrime + + +A freely tradable equivalent representation of Simple Token [ST] on Ethereum mainnet on the utility chain; STPrime functions as the base token to pay for gas consumption on the utility chain; it is not an EIP20 token, but functions as the genesis guardian of the finite amount of base tokens on the utility chain + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +burn
    (address, uint256) | bool | Takes _burner, _amount

    Burns utility tokens after having redeemed them through the protocol for the staked Simple Token; only callable by protocol +claim
    (address) | success bool | Takes _beneficiary

    Transfers full claim to beneficiary; claim can be called publicly as the beneficiary and amount are set, and this allows for reduced steps on the user experience to complete the claim automatically; for first stake of ST' the gas price by one validator has to be zero to deploy the contracts and accept the very first staking of ST for ST' and its protocol executions. +completeProtocolTransfer() | success bool | Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol +initialize() | | On setup of the utility chain the base tokens need to be transfered in full to STPrime for the base tokens to be minted as ST' +initiateProtocolTransfer
    (address) | success bool | Takes _proposedProtocol

    Initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol +mint
    (address, uint256) | | Takes _beneficiary, _amount

    Mints new Simple Token Prime into circulation and increase total supply accordingly; tokens are minted into a claim to ensure that the protocol completion does not continue into foreign contracts at _beneficiary; only callable by protocol +revokeProtocolTransfer() | success bool | protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol +totalSupply() | uint256 | Get totalTokenSupply as view so that child cannot edit +unclaimed
    (address) | uint256 | Takes _beneficiary

    Returns unclaimed amount for _beneficiary +uuid() | bytes32 | Returns uuid + diff --git a/docs/md/SimpleStake.md b/docs/md/SimpleStake.md new file mode 100644 index 00000000..13082eeb --- /dev/null +++ b/docs/md/SimpleStake.md @@ -0,0 +1,17 @@ +# OpenST Protocol Documentation + +## SimpleStake + + +Stakes the value of an EIP20 token on Ethereum for a utility token on the OpenST platform + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +completeProtocolTransfer() | success bool | Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol +getTotalStake() | uint256 | total stake is the balance of the staking contract; accidental transfers directly to SimpleStake bypassing the OpenST protocol will not mint new utility tokens, but will add to the total stake; (accidental) donations can not be prevented +initiateProtocolTransfer
    (address) | success bool | Takes _proposedProtocol

    Initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol +releaseTo
    (address, uint256) | success bool | Takes _to, _amount

    Allows the protocol to release the staked amount into provided address. The protocol MUST be a contract that sets the rules on how the stake can be released and to who. The protocol takes the role of an "owner" of the stake. Only callable by protocol. Emits ReleasedStake event. +revokeProtocolTransfer() | success bool | protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol + diff --git a/docs/md/UtilityTokenAbstract.md b/docs/md/UtilityTokenAbstract.md new file mode 100644 index 00000000..e831ebcf --- /dev/null +++ b/docs/md/UtilityTokenAbstract.md @@ -0,0 +1,21 @@ +# OpenST Protocol Documentation + +## UtilityTokenAbstract + + +Base utility token functionality for BrandedTokens and STPrime + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +burn
    (address, uint256) | success | Takes _burner, _amount

    Burns utility tokens after having redeemed them through the protocol for the staked Simple Token +claim
    (address) | success | Takes _beneficiary

    Transfers full claim to beneficiary +completeProtocolTransfer() | success bool | Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol +initiateProtocolTransfer
    (address) | success bool | Takes _proposedProtocol

    Initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol +mint
    (address, uint256) | success | Takes _beneficiary, _amount

    Mints new utility tokens +revokeProtocolTransfer() | success bool | protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol +totalSupply() | uint256 | Get totalTokenSupply as view so that child cannot edit +unclaimed
    (address) | uint256 | Takes _beneficiary

    Returns unclaimed amount for _beneficiary +uuid() | bytes32 | Returns uuid + diff --git a/docs/md/UtilityTokenAbstractMock.md b/docs/md/UtilityTokenAbstractMock.md new file mode 100644 index 00000000..be3a056a --- /dev/null +++ b/docs/md/UtilityTokenAbstractMock.md @@ -0,0 +1,24 @@ +# OpenST Protocol Documentation + +## UtilityTokenAbstractMock + + +Implements mock claim, mint, and burn functions and wraps internal functions to enable testing UtilityTokenAbstract + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +burn
    (address, uint256) | success bool | Mock burn function +burnInternalPublic
    (address, uint256) | success bool | Public wrapper for burnInternal +claim
    (address) | success bool | Mock claim function +claimInternalPublic
    (address) | amount | Public wrapper for claimInternal +completeProtocolTransfer() | success bool | Only after the waiting period, can proposed protocol complete the transfer; emits ProtocolTransferCompleted event; only callable by proposed protocol +initiateProtocolTransfer
    (address) | success bool | Takes _proposedProtocol

    Initiates protocol transfer; emits ProtocolTransferInitiated event; only callable by protocol +mint
    (address, uint256) | success bool | Mock mint function +mintInternalPublic
    (address, uint256) | success bool | Public wrapper for mintInternal +revokeProtocolTransfer() | success bool | protocol can revoke initiated protocol transfer; emits ProtocolTransferRevoked event; only callable by protocol +totalSupply() | uint256 | Get totalTokenSupply as view so that child cannot edit +unclaimed
    (address) | uint256 | Takes _beneficiary

    Returns unclaimed amount for _beneficiary +uuid() | bytes32 | Returns uuid + diff --git a/docs/md/UtilityTokenInterface.md b/docs/md/UtilityTokenInterface.md new file mode 100644 index 00000000..820ba161 --- /dev/null +++ b/docs/md/UtilityTokenInterface.md @@ -0,0 +1,17 @@ +# OpenST Protocol Documentation + +## UtilityTokenInterface + + +Interface for UtilityToken + +### Function Summary + +Signature | Returns | Details +--- | --- | --- +burn
    (address, uint256) | success | Takes _burner, _amount

    Burns utility tokens after having redeemed them through the protocol for the staked Simple Token +claim
    (address) | success | Takes _beneficiary

    Transfers full claim to beneficiary +mint
    (address, uint256) | success | Takes _beneficiary, _amount

    Mints new utility tokens +totalSupply() | supply | Get totalTokenSupply as view so that child cannot edit +uuid() | getUuid | Get unique universal identifier for utility token + diff --git a/docs/protocol.png b/docs/protocol.png new file mode 100644 index 0000000000000000000000000000000000000000..d68a88e15160ed28e1fa87e832c4b8748596c7e6 GIT binary patch literal 289103 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�sTj}K$!m2S|Ui<9Wc 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�fU4$)X0F} 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 z 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


    >IH4-FvL>G+~W(5l<>&DQz~cnORyLe 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
    J;4DJeRRCoc+4ZX% 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 $8$3<8_}j95{K|Zg#Ev@^-QVeNFA20kjT9VL>{q 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 k{vYrk!2Z7)@Cwd)OlMMhjGBOn0QfUEwKb%7 literal 0 HcmV?d00001 diff --git a/migrations/1_initial_migration.js b/migrations/1_initial_migration.js new file mode 100644 index 00000000..4d5f3f9b --- /dev/null +++ b/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +var Migrations = artifacts.require("./Migrations.sol"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/migrations/_2_deploy_contracts.js b/migrations/_2_deploy_contracts.js new file mode 100644 index 00000000..7df52ca8 --- /dev/null +++ b/migrations/_2_deploy_contracts.js @@ -0,0 +1,5 @@ +module.exports = function(deployer) { + // deployer.deploy(ConvertLib); + // deployer.link(ConvertLib, MetaCoin); + // deployer.deploy(MetaCoin); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..9ab51e95 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9769 @@ +{ + "name": "openst-protocol", + "version": "0.9.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz", + "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==", + "dev": true + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, + "abi-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.1.0.tgz", + "integrity": "sha512-nvLArBx0XOJufWyaghMKtIofZDBwEMdVZoqcetQOIe1qYeKZk4+kRYGPEJ5lt7dD3MLulw//amUzOJLM8eW5RA==", + "dev": true, + "requires": { + "babel-core": "^6.23.1", + "babel-loader": "^6.3.2", + "babel-plugin-add-module-exports": "^0.2.1", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-preset-es2015": "^6.22.0", + "chai": "^3.5.0", + "web3": "^0.18.4", + "webpack": "^2.7.0" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "dev": true + }, + "web3": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", + "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", + "dev": true, + "requires": { + "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" + } + } + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.5.tgz", + "integrity": "sha512-oJjo+5e7/vEc2FBK8gUalV0pba4L3VdBIs2EKhOLHLcOd2FgQIVQN9xb0eZ9IjEWyAL7vq6fGJxOvVvdCHNyMw==", + "dev": true + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-loader": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", + "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "loader-utils": "^0.2.16", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-add-module-exports": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", + "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "bignumber": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bignumber/-/bignumber-1.1.0.tgz", + "integrity": "sha1-5qsKdD2l8+oBjlwXWX0SH3howVk=" + }, + "bignumber.js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "binaryextensions": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", + "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", + "dev": true + }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sha3": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", + "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "requires": { + "js-sha3": "^0.3.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", + "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "colors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", + "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-js": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + } + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-conflict": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", + "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "envinfo": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-5.10.0.tgz", + "integrity": "sha512-rXbzXWvnQxy+TcqZlARbWVQwgGVVouVJgFZhLVN5htjLxl1thstrP2ZGi0pXC309AbK7gVOPU+ulz/tmpCI7iw==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "dev": true, + "requires": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-lib": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", + "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "keccakjs": "^0.2.1", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "ethereumjs-testrpc": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", + "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", + "dev": true, + "requires": { + "webpack": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", + "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "webpack": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + } + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", + "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.0.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "flow-parser": { + "version": "0.75.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.75.0.tgz", + "integrity": "sha512-QEyV/t9TERBOSI/zSx0zhKH6924135WPI7pMmug2n/n/4puFm4mdAq1QaKPA3IPhXDRtManbySkKhRqws5UUGA==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "fs-promise": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", + "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "requires": { + "any-promise": "^1.3.0", + "fs-extra": "^2.0.0", + "mz": "^2.6.0", + "thenify-all": "^1.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "ganache-cli": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.3.tgz", + "integrity": "sha512-6g/jPkhEMBlefOUQR0AXQooTCsLFD4iOvTDmsqi/B3XOktB9KGSioDaEy5lCcgzJczzUHT1YCZXhrZcUgtNkkg==", + "dev": true, + "requires": { + "source-map-support": "^0.5.3", + "webpack-cli": "^2.0.9" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gh-got": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", + "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", + "dev": true, + "requires": { + "got": "^7.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "github-username": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", + "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", + "dev": true, + "requires": { + "gh-got": "^6.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-all": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", + "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", + "dev": true, + "requires": { + "glob": "^7.0.5", + "yargs": "~1.2.6" + }, + "dependencies": { + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", + "dev": true + }, + "yargs": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", + "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", + "dev": true, + "requires": { + "minimist": "^0.1.0" + } + } + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "grouped-queue": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", + "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", + "dev": true, + "requires": { + "lodash": "^4.17.2" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz", + "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + }, + "dependencies": { + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + } + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-scoped": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", + "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", + "dev": true, + "requires": { + "scoped-regex": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", + "dev": true, + "requires": { + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "js-sha3": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", + "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jscodeshift": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.1.tgz", + "integrity": "sha512-sRMollbhbmSDrR79JMAnhEjyZJlQQVozeeY9A6/KNuV26DNcuB3mGSCWXp0hks9dcwRNOELbNOiwraZaXXRk5Q==", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^7.0.0-beta.47", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", + "neo-async": "^2.5.0", + "node-dir": "0.1.8", + "nomnom": "^1.8.1", + "recast": "^0.15.0", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "babylon": { + "version": "7.0.0-beta.47", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", + "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "keccakjs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", + "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", + "requires": { + "browserify-sha3": "^0.0.1", + "sha3": "^1.1.0" + } + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "listr": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.1.tgz", + "integrity": "sha512-MSMUUVN1f8aRnPi4034RkOqdiUlpYW+FqwFE3aL0uYNPRavkt2S2SsSpDDofn8BDpqv2RNnsdOcCHWsChcq77A==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.4.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^6.1.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "rxjs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", + "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", + "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + } + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "mem-fs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", + "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", + "dev": true, + "requires": { + "through2": "^2.0.0", + "vinyl": "^1.1.0", + "vinyl-file": "^2.0.0" + } + }, + "mem-fs-editor": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz", + "integrity": "sha512-QHvdXLLNmwJXxKdf7x27aNUren6IoPxwcM8Sfd+S6/ddQQMcYdEtVKsh6ilpqMrU18VQuKZEaH0aCGt3JDbA0g==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "deep-extend": "^0.5.1", + "ejs": "^2.5.9", + "glob": "^7.0.3", + "globby": "^8.0.0", + "isbinaryfile": "^3.0.2", + "mkdirp": "^0.5.0", + "multimatch": "^2.0.0", + "rimraf": "^2.2.8", + "through2": "^2.0.0", + "vinyl": "^2.0.1" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "*" + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "mock-fs": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.5.0.tgz", + "integrity": "sha512-qqudNfOX7ZmX9vm1WIAU+gWlmxVNAnwY6UG3RkFutNywmRCUGP83tujP6IxX2DS1TmcaEZBOhYwDuYEmJYE+3w==" + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "mout": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "node-dir": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", + "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + } + } + }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "oboe": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", + "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + } + } + }, + "original-require": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", + "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", + "dev": true + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-lazy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", + "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "requires": { + "for-each": "^0.3.2", + "trim": "0.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "prettier": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.5.tgz", + "integrity": "sha512-4M90mfvLz6yRf2Dhzd+xPIE6b4xkI8nHMJhsSm9IlfG17g6wujrrm7+H1X8x52tC4cSNm6HmuhCUSNe6Hd5wfw==", + "dev": true + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "randomhex": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", + "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "read-chunk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", + "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", + "dev": true, + "requires": { + "pify": "^3.0.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "recast": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.15.0.tgz", + "integrity": "sha512-47C2mIxQYvFICrTNuV4+xGgBa1nAoq42ANN5oDTSBIJ50NX7jcki7gAC6HWYptnQgHmqIRTHJq8OKdi3fwgyNQ==", + "dev": true, + "requires": { + "ast-types": "0.11.5", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "scoped-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", + "dev": true + }, + "scrypt": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", + "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", + "requires": { + "nan": "^2.0.8" + } + }, + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "requires": { + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" + } + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "requires": { + "pbkdf2": "^3.0.3" + } + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "~2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sha3": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.2.tgz", + "integrity": "sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k=", + "requires": { + "nan": "2.10.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shelljs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", + "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "solc": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", + "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", + "dev": true, + "requires": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "dev": true, + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + } + } + }, + "solparse": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", + "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", + "requires": { + "mocha": "^4.0.1", + "pegjs": "^0.10.0", + "yargs": "^10.0.3" + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "requires": { + "is-natural-number": "^4.0.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "^2.0.0" + } + }, + "swarm-js": { + "version": "0.1.37", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", + "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "decompress": "^4.0.0", + "eth-lib": "^0.1.26", + "fs-extra": "^2.1.2", + "fs-promise": "^2.0.0", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar.gz": "^1.0.5", + "xhr-request-promise": "^0.1.2" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" + } + }, + "tar.gz": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", + "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", + "requires": { + "bluebird": "^2.9.34", + "commander": "^2.8.1", + "fstream": "^1.0.8", + "mout": "^0.11.0", + "tar": "^2.1.1" + }, + "dependencies": { + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + } + } + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", + "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", + "dev": true + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "^1.4.1" + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "truffle": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.12.tgz", + "integrity": "sha1-9F9LbBzhWGX817v19jNA9eFuKVA=", + "dev": true, + "requires": { + "mocha": "^4.1.0", + "original-require": "1.0.1", + "solc": "0.4.24" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "requires": { + "buffer": "^3.0.1", + "through": "^2.3.6" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + } + } + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "dev": true + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "utf8": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "v8-compile-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", + "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "web3": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.34.tgz", + "integrity": "sha1-NH5WG3hAmMtVYzFfSQR5odkfKrE=", + "requires": { + "web3-bzz": "1.0.0-beta.34", + "web3-core": "1.0.0-beta.34", + "web3-eth": "1.0.0-beta.34", + "web3-eth-personal": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-shh": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-bzz": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.34.tgz", + "integrity": "sha1-Bo03d3q2Xlxg+OyLmlDP5FJ3kpw=", + "requires": { + "got": "7.1.0", + "swarm-js": "0.1.37", + "underscore": "1.8.3" + } + }, + "web3-core": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.34.tgz", + "integrity": "sha1-EhvoVV6fsA0sXQXd0zgdDJ5GmH4=", + "requires": { + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-requestmanager": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-helpers": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.34.tgz", + "integrity": "sha1-sWjaANPhnhVrwVriAyA91N/uLQM=", + "requires": { + "underscore": "1.8.3", + "web3-eth-iban": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-method": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.34.tgz", + "integrity": "sha1-7BY8iixJD6AqfsFVWfpzB/x8xt0=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-promievent": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-promievent": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.34.tgz", + "integrity": "sha1-pPT6Z4S7KT6CxglgrltWqUzQPtw=", + "requires": { + "any-promise": "1.3.0", + "eventemitter3": "1.1.1" + } + }, + "web3-core-requestmanager": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.34.tgz", + "integrity": "sha1-Afj2zyrmtvC3DDi64e90G1urIVw=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-providers-http": "1.0.0-beta.34", + "web3-providers-ipc": "1.0.0-beta.34", + "web3-providers-ws": "1.0.0-beta.34" + } + }, + "web3-core-subscriptions": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.34.tgz", + "integrity": "sha1-n+0UQDPyIcPPIQYDAv/a9e8t4t4=", + "requires": { + "eventemitter3": "1.1.1", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34" + } + }, + "web3-eth": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.34.tgz", + "integrity": "sha1-dAhgAIUMb+b1Ne9Jg31tS7YRMmg=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-eth-abi": "1.0.0-beta.34", + "web3-eth-accounts": "1.0.0-beta.34", + "web3-eth-contract": "1.0.0-beta.34", + "web3-eth-iban": "1.0.0-beta.34", + "web3-eth-personal": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-eth-abi": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.34.tgz", + "integrity": "sha1-A0Uz46ovfln/MXk+rqaFwO1a9no=", + "requires": { + "bn.js": "4.11.6", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-accounts": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.34.tgz", + "integrity": "sha1-4JFC7uzHl6w0WbdemyOUbTaV8zM=", + "requires": { + "any-promise": "1.3.0", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.7", + "scrypt.js": "0.2.0", + "underscore": "1.8.3", + "uuid": "2.0.1", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } + } + }, + "web3-eth-contract": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.34.tgz", + "integrity": "sha1-nbs4+udkOoCEJ6IBgEcOx0FckeY=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-promievent": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-eth-abi": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-eth-iban": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.34.tgz", + "integrity": "sha1-mvRYYFhnzPdOqXmq8yazi6alugw=", + "requires": { + "bn.js": "4.11.6", + "web3-utils": "1.0.0-beta.34" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-personal": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.34.tgz", + "integrity": "sha1-mvuhZzQuveVCC81YlcP2w0OI8gU=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-net": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.34.tgz", + "integrity": "sha1-QnzqL0MYgUScjjjVIykPFz+f9j0=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-providers-http": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.34.tgz", + "integrity": "sha1-5WG1K7tDdmKCAH1AKFv+NVDCfno=", + "requires": { + "web3-core-helpers": "1.0.0-beta.34", + "xhr2": "0.1.4" + } + }, + "web3-providers-ipc": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.34.tgz", + "integrity": "sha1-obd/GjBtc2SanAOQUuQMtxMo0Ao=", + "requires": { + "oboe": "2.1.3", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34" + } + }, + "web3-providers-ws": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.34.tgz", + "integrity": "sha1-fecPG4Py3jZHZ3IVa+z+9uNRbrM=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" + } + }, + "web3-shh": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.34.tgz", + "integrity": "sha1-l1Bh1x6uxCzO5Xb3vY9w8DhEr+A=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34" + } + }, + "web3-utils": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.34.tgz", + "integrity": "sha1-lBH8OarvOcpOBhafdiKX2f8CCXA=", + "requires": { + "bn.js": "4.11.6", + "eth-lib": "0.1.27", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randomhex": "0.1.5", + "underscore": "1.8.3", + "utf8": "2.1.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "webpack": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", + "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^4.7.0", + "ajv-keywords": "^1.1.1", + "async": "^2.1.2", + "enhanced-resolve": "^3.3.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^0.2.16", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^3.1.0", + "tapable": "~0.2.5", + "uglify-js": "^2.8.27", + "watchpack": "^1.3.1", + "webpack-sources": "^1.0.1", + "yargs": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "webpack-addons": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", + "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", + "dev": true, + "requires": { + "jscodeshift": "^0.4.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "ast-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", + "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "jscodeshift": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", + "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", + "dev": true, + "requires": { + "async": "^1.5.0", + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^6.17.3", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", + "node-dir": "0.1.8", + "nomnom": "^1.8.1", + "recast": "^0.12.5", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "recast": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", + "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", + "dev": true, + "requires": { + "ast-types": "0.10.1", + "core-js": "^2.4.1", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.5.tgz", + "integrity": "sha512-CiWQR+1JS77rmyiO6y1q8Kt/O+e8nUUC9YfJ25JtSmzDwbqJV7vIsh3+QKRHVTbTCa0DaVh8iY1LBiagUIDB3g==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "diff": "^3.5.0", + "enhanced-resolve": "^4.0.0", + "envinfo": "^5.7.0", + "glob-all": "^3.1.0", + "global-modules": "^1.0.0", + "got": "^8.3.1", + "import-local": "^1.0.0", + "inquirer": "^5.2.0", + "interpret": "^1.1.0", + "jscodeshift": "^0.5.0", + "listr": "^0.14.1", + "loader-utils": "^1.1.0", + "lodash": "^4.17.10", + "log-symbols": "^2.2.0", + "mkdirp": "^0.5.1", + "p-each-series": "^1.0.0", + "p-lazy": "^1.0.0", + "prettier": "^1.12.1", + "supports-color": "^5.4.0", + "v8-compile-cache": "^2.0.0", + "webpack-addons": "^1.1.5", + "yargs": "^11.1.0", + "yeoman-environment": "^2.1.1", + "yeoman-generator": "^2.0.5" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", + "requires": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", + "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", + "requires": { + "xhr-request": "^1.0.1" + } + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "requires": { + "camelcase": "^4.1.0" + } + }, + "yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha1-T7G8euH8L1cDe1SvasyP4QMcW3c=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yeoman-environment": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.2.0.tgz", + "integrity": "sha512-gQ+hIW8QRlUo4jGBDCm++qg01SXaIVJ7VyLrtSwk2jQG4vtvluWpsGIl7V8DqT2jGiqukdec0uEyffVEyQgaZA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "diff": "^3.3.1", + "escape-string-regexp": "^1.0.2", + "globby": "^8.0.1", + "grouped-queue": "^0.3.3", + "inquirer": "^5.2.0", + "is-scoped": "^1.0.0", + "lodash": "^4.17.10", + "log-symbols": "^2.1.0", + "mem-fs": "^1.1.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "untildify": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "yeoman-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", + "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", + "dev": true, + "requires": { + "async": "^2.6.0", + "chalk": "^2.3.0", + "cli-table": "^0.3.1", + "cross-spawn": "^6.0.5", + "dargs": "^5.1.0", + "dateformat": "^3.0.3", + "debug": "^3.1.0", + "detect-conflict": "^1.0.0", + "error": "^7.0.2", + "find-up": "^2.1.0", + "github-username": "^4.0.0", + "istextorbinary": "^2.2.1", + "lodash": "^4.17.10", + "make-dir": "^1.1.0", + "mem-fs-editor": "^4.0.0", + "minimist": "^1.2.0", + "pretty-bytes": "^4.0.2", + "read-chunk": "^2.1.0", + "read-pkg-up": "^3.0.0", + "rimraf": "^2.6.2", + "run-async": "^2.0.0", + "shelljs": "^0.8.0", + "text-table": "^0.2.0", + "through2": "^2.0.0", + "yeoman-environment": "^2.0.5" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..7a5db47d --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "openst-protocol", + "version": "0.9.1", + "description": "", + "dependencies": { + "assert": "^1.4.1", + "bignumber": "^1.1.0", + "bignumber.js": "^4.1.0", + "keccak": "^1.4.0", + "moment": "^2.19.2", + "solparse": "^2.2.5", + "web3": "^1.0.0-beta.33" + }, + "devDependencies": { + "truffle": "^4.1.8", + "ganache-cli": "^6.0.3", + "abi-decoder": "^1.0.9", + "ethereumjs-testrpc": "^6.0.3" + }, + "author": "OpenST Foundation Ltd.", + "license": "Apache v2.0" +} diff --git a/test/BrandedToken.js b/test/BrandedToken.js new file mode 100644 index 00000000..82bbb894 --- /dev/null +++ b/test/BrandedToken.js @@ -0,0 +1,119 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: BrandedToken.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const BrandedToken_utils = require('./BrandedToken_utils.js'); + +/// +/// Test stories +/// +/// Mint, Claim, Burn +/// fails to mint by non-openSTProtocol +/// successfully mints +/// successfully claims +/// fails to burn by non-openSTProtocol +/// fails to burn by openSTProtocol if msg.value != 0 +/// successfully burns +/// + +contract('BrandedToken', function(accounts) { + const openSTProtocol = accounts[4]; + + const beneficiary = accounts[0]; + const ST1 = new BigNumber(web3.toWei(1, "ether")); + const ST2 = new BigNumber(web3.toWei(2, "ether")); + + var result = null; + var totalSupply = null; + var tokenBalance = null; + var beneficiaryBalance = null; + var unclaimed = null; + + describe ('Mint, Claim, Burn', async () => { + before(async () => { + contracts = await BrandedToken_utils.deployBrandedToken(artifacts, accounts); + token = contracts.token; + }) + + it('fails to mint by non-openSTProtocol', async () => { + await Utils.expectThrow(token.mint(beneficiary, ST2, { from: accounts[0] })); + }) + + it('successfully mints', async () => { + assert.equal(await token.totalSupply.call(), 0); + assert.equal(await token.balanceOf.call(token.address), 0); + assert.equal(await token.balanceOf.call(beneficiary), 0); + assert.equal(await token.unclaimed.call(beneficiary), 0); + assert.equal(await token.mint.call(beneficiary, ST2, { from: openSTProtocol }), true); + result = await token.mint(beneficiary, ST2, { from: openSTProtocol }); + + totalSupply = await token.totalSupply.call(); + tokenBalance = await token.balanceOf.call(token.address); + beneficiaryBalance = await token.balanceOf.call(beneficiary); + unclaimed = await token.unclaimed.call(beneficiary); + + assert.equal(totalSupply.toNumber(), ST2); + assert.equal(tokenBalance.toNumber(), ST2); + assert.equal(beneficiaryBalance.toNumber(), 0); + assert.equal(unclaimed.toNumber(), ST2); + }) + + it('successfully claims', async () => { + assert.equal(await token.claim.call(beneficiary, { from: openSTProtocol }), true); + result = await token.claim(beneficiary, { from: openSTProtocol }); + + totalSupply = await token.totalSupply.call(); + tokenBalance = await token.balanceOf.call(token.address); + beneficiaryBalance = await token.balanceOf.call(beneficiary); + unclaimed = await token.unclaimed.call(beneficiary); + + assert.equal(totalSupply.toNumber(), ST2); + assert.equal(tokenBalance.toNumber(), 0); + assert.equal(beneficiaryBalance.toNumber(), ST2); + assert.equal(unclaimed.toNumber(), 0); + }) + + it('fails to burn by non-openSTProtocol', async () => { + await Utils.expectThrow(token.burn(beneficiary, ST1, { from: accounts[0] })); + }) + + it('fails to burn by openSTProtocol if msg.value != 0', async () => { + const amountBT = new BigNumber(web3.toWei(1, "ether")); + await Utils.expectThrow(token.burn(beneficiary, ST1, { from: openSTProtocol, value: amountBT })); + }) + + it('successfully burns', async () => { + // Protocol must hold tokens in order to burn tokens + await token.transfer(openSTProtocol, ST1, { from: beneficiary }); + var protocolBalance = await token.balanceOf.call(openSTProtocol); + assert.equal(protocolBalance.toNumber(), ST1); + assert.equal(await token.burn.call(beneficiary, ST1, { from: openSTProtocol }), true); + result = await token.burn(beneficiary, ST1, { from: openSTProtocol }); + + totalSupply = await token.totalSupply.call(); + protocolBalance = await token.balanceOf.call(openSTProtocol); + + assert.equal(totalSupply.toNumber(), ST1); + assert.equal(protocolBalance.toNumber(), 0); + }) + }) +}) diff --git a/test/BrandedToken_utils.js b/test/BrandedToken_utils.js new file mode 100644 index 00000000..f6348c48 --- /dev/null +++ b/test/BrandedToken_utils.js @@ -0,0 +1,44 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: BrandedToken_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); +const BigNumber = require('bignumber.js'); + +var Hasher = artifacts.require("./Hasher.sol"); +var BrandedToken = artifacts.require("./BrandedToken.sol"); + +/// @dev Deploy +module.exports.deployBrandedToken = async (artifacts, accounts) => { + const hasher = await Hasher.new(); + /// mock OpenST protocol contract address with an external account + const openSTProtocol = accounts[4]; + const conversionRateDecimals = 5; + const conversionRate = new BigNumber(10 * (10 ** conversionRateDecimals)); + const genesisChainIdValue = 3; + const genesisChainIdUtility = 1410; + const UUID = await hasher.hashUuid.call("symbol", "name", genesisChainIdValue, genesisChainIdUtility, openSTProtocol, conversionRate, conversionRateDecimals); + + const token = await BrandedToken.new(UUID, "symbol", "name", 18, genesisChainIdValue, genesisChainIdUtility, conversionRate, conversionRateDecimals, { from: openSTProtocol }); + + return { + token : token + } +} diff --git a/test/ContractStructureTest.js b/test/ContractStructureTest.js new file mode 100644 index 00000000..07ec4c39 --- /dev/null +++ b/test/ContractStructureTest.js @@ -0,0 +1,99 @@ +const SolidityParser = require("solparse"); + + +//todo We can extend this test for all the solidity contracts. But it's out of scope for now +const contracts = [ + { + name: "OpenSTUtility.sol", + path: "./contracts/OpenSTUtility.sol" + }, + { + name: "OpenSTValue.sol", + path: "./contracts/OpenSTValue.sol" + }, + { + name: "Gate.sol", + path: "./contracts/Gate.sol" + } +]; +const validSequence = ["event", "constant", "mapping", "variable", "array", "struct"]; + +function getContract(result) { + return result.body.filter(e => { + if (e.type === "ContractStatement") { + return e; + } + }); +} + +function checkElementDataType(element) { + if (element.type === "EventDeclaration") { + return 'event'; + } + if (element.type === "StateVariableDeclaration" && element.is_constant) { + return 'constant'; + } + if (element.type === "StateVariableDeclaration" && typeof(element.literal.literal) === 'object' && element.literal.literal.type === "MappingExpression") { + return 'mapping'; + } + + if (element.type === "StateVariableDeclaration" && typeof(element.literal.literal) === 'string' && element.literal.array_parts.length > 0) { + return 'array'; + } + if (element.type === "StateVariableDeclaration" && typeof(element.literal.literal) === 'string') { + return 'variable'; + } + if (element.type === "StructDeclaration") { + return "struct"; + } + return "unknown"; + +} + +function isDataTypeDeclaredInContract(dataTypesInContract, currentDataType) { + return dataTypesInContract.indexOf(currentDataType) !== -1; +} + +function getContractVariables(parsedFile) { + + let contract = getContract(parsedFile); + return contract[0].body; +} + +function getListOfDataTypesInContract(file,) { + + let parsedFile = SolidityParser.parseFile(file.path); + let contractBody = getContractVariables(parsedFile); + + return contractBody.map(element => checkElementDataType(element)).filter(t => t !== 'unknown'); +} + +describe('Contract Structure Test', async () => { + + contracts.map(file => { + let dataTypesInContract = getListOfDataTypesInContract(file); + for (let i = 0; i < validSequence.length; i++) { + it('In ' + file.name + ' verify ' + validSequence[i] + ' is declared at right position', async () => { + let currentDataType = validSequence[i]; + if (isDataTypeDeclaredInContract(dataTypesInContract, currentDataType)) { + let currentDatatypePosition = -1; + let nonCurrentDataTypePosition = -1; + for (let t = 0; t < dataTypesInContract.length; t++) { + if (currentDataType === dataTypesInContract[t]) { + currentDatatypePosition = t; + } + else if (validSequence.indexOf(dataTypesInContract[t]) > i) { + nonCurrentDataTypePosition = t; + } + let message = `${dataTypesInContract[nonCurrentDataTypePosition]} is declared before ${currentDataType}`; + //check if non current datatype is not defined before current type + assert.equal(nonCurrentDataTypePosition > -1 && currentDatatypePosition === -1, false, message); + //non current data type should be defined after current data type + assert.equal(nonCurrentDataTypePosition > currentDatatypePosition || nonCurrentDataTypePosition === -1, true, message); + } + } + }); + } + }); + +}); \ No newline at end of file diff --git a/test/Core.js b/test/Core.js new file mode 100644 index 00000000..656bb25f --- /dev/null +++ b/test/Core.js @@ -0,0 +1,56 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Core.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Core_utils = require('./Core_utils.js'); + +/// +/// Test stories +/// +/// Properties +/// has coreRegistrar +/// has coreChainIdRemote +/// has coreOpenSTRemote +/// + +contract('Core', function(accounts) { + const registrar = accounts[1]; + const chainIdRemote = 1410; + const openSTRemote = accounts[4]; + + describe('Properties', async () => { + before(async () => { + contracts = await Core_utils.deployCore(artifacts, accounts); + core = contracts.core; + }) + + it('has coreRegistrar', async () => { + assert.equal(await core.registrar.call(), registrar); + }) + + it('has coreChainIdRemote', async () => { + assert.equal(await core.chainIdRemote.call(), chainIdRemote); + }) + + it('has coreOpenSTRemote', async () => { + assert.equal(await core.openSTRemote.call(), openSTRemote); + }) + }) +}) diff --git a/test/Core_utils.js b/test/Core_utils.js new file mode 100644 index 00000000..33c0a4d1 --- /dev/null +++ b/test/Core_utils.js @@ -0,0 +1,56 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Core_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Core = artifacts.require("./Core.sol") + , SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") + , Workers = artifacts.require("./Workers.sol") +; + +const BigNumber = require('bignumber.js') +; + + +/// @dev Deploy +module.exports.deployCore = async (artifacts, accounts) => { + const registrar = accounts[1] + , admin = accounts[2] + , ops = accounts[3] + , openSTRemote = accounts[4] + , chainIdOrigin = 3 + , chainIdRemote = 1410 + , valueToken = await SimpleToken.new() + , deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")) + ; + + //Set SimpleToken admin in order to finalize SimpleToken + await valueToken.setAdminAddress(admin); + + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); + const core = await Core.new(registrar, chainIdOrigin, chainIdRemote, openSTRemote, workers.address, {from:accounts[0]}); + return { + core : core + } +} diff --git a/test/EIP20Token_protocol_extensions.js b/test/EIP20Token_protocol_extensions.js new file mode 100644 index 00000000..7eb31e58 --- /dev/null +++ b/test/EIP20Token_protocol_extensions.js @@ -0,0 +1,114 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: EIP20Token_protocol_extensions.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const EIP20Token_utils = require('./EIP20Token_utils.js'); + +/// +/// Test stories +/// +/// MintEIP20, ClaimEIP20, BurnEIP20 +/// successfully mints +/// successfully claims +/// successfully burns +/// + +contract('EIP20Token', function(accounts) { + const beneficiary1 = accounts[0]; + const beneficiary2 = '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; + const ST1 = new BigNumber(web3.toWei(1, "ether")); + const ST2 = new BigNumber(web3.toWei(2, "ether")); + const ST3 = new BigNumber(web3.toWei(3, "ether")); + + var result = null; + var tokenBalance = null; + var beneficiaryBalance = null; + + describe ('MintEIP20, ClaimEIP20, BurnEIP20', async () => { + before(async () => { + contracts = await EIP20Token_utils.deployEIP20Token(artifacts, accounts); + token = contracts.token; + }) + + it('successfully mints', async () => { + assert.equal(await token.balanceOf.call(token.address), 0); + assert.equal(await token.mintEIP20Public.call(ST1), true); + result = await token.mintEIP20Public(ST1); + + tokenBalance = await token.balanceOf.call(token.address); + assert.equal(tokenBalance.toNumber(), ST1); + assert.equal(await token.mintEIP20Public.call(ST2), true); + result = await token.mintEIP20Public(ST2); + + tokenBalance = await token.balanceOf.call(token.address); + assert.equal(tokenBalance.toNumber(), ST3); + }) + + it('successfully claims', async () => { + assert.equal(await token.balanceOf.call(beneficiary1), 0); + assert.equal(await token.claimEIP20Public.call(beneficiary1, ST1), true); + + // Claim for beneficiary1 + result = await token.claimEIP20Public(beneficiary1, ST1); + + tokenBalance = await token.balanceOf.call(token.address); + assert.equal(tokenBalance.toNumber(), ST2); + beneficiaryBalance = await token.balanceOf.call(beneficiary1); + assert.equal(beneficiaryBalance.toNumber(), ST1); + EIP20Token_utils.checkTransferEvent(result.logs[0], token.address, beneficiary1, ST1); + + // Claim again for beneficiary1 + result = await token.claimEIP20Public(beneficiary1, ST1); + + tokenBalance = await token.balanceOf.call(token.address); + assert.equal(tokenBalance.toNumber(), ST1); + beneficiaryBalance = await token.balanceOf.call(beneficiary1); + assert.equal(beneficiaryBalance.toNumber(), ST2); + EIP20Token_utils.checkTransferEvent(result.logs[0], token.address, beneficiary1, ST1); + + // Claim for beneficiary2 + result = await token.claimEIP20Public(beneficiary2, ST1); + + tokenBalance = await token.balanceOf.call(token.address); + assert.equal(tokenBalance.toNumber(), 0); + beneficiaryBalance = await token.balanceOf.call(beneficiary2); + assert.equal(beneficiaryBalance.toNumber(), ST1); + EIP20Token_utils.checkTransferEvent(result.logs[0], token.address, beneficiary2, ST1); + }) + + it('successfully burns', async () => { + beneficiaryBalance = await token.balanceOf.call(beneficiary1); + assert.equal(beneficiaryBalance.toNumber(), ST2); + assert.equal(await token.burnEIP20Public.call(ST1, { from: beneficiary1 }), true); + result = await token.burnEIP20Public(ST1, { from: beneficiary1 }); + + beneficiaryBalance = await token.balanceOf.call(beneficiary1); + assert.equal(beneficiaryBalance.toNumber(), ST1); + assert.equal(await token.burnEIP20Public.call(ST1, { from: beneficiary1 }), true); + result = await token.burnEIP20Public(ST1, { from: beneficiary1 }); + + beneficiaryBalance = await token.balanceOf.call(beneficiary1); + assert.equal(beneficiaryBalance.toNumber(), 0); + }) + + }) +}) diff --git a/test/EIP20Token_utils.js b/test/EIP20Token_utils.js new file mode 100644 index 00000000..17335327 --- /dev/null +++ b/test/EIP20Token_utils.js @@ -0,0 +1,80 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: EIP20Token_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); +const BigNumber = require('bignumber.js'); + +var EIP20Token = artifacts.require("./EIP20TokenMock.sol"); + +/// @dev Deploy +module.exports.deployEIP20Token = async (artifacts, accounts) => { + const token = await EIP20Token.new("SYMBOL", "Name", 18, {from: accounts[0], gas: 3500000}); + + return { + token: token + } +} + +/// @dev Assert on Transfer event +module.exports.checkTransferEventGroup = (result, _from, _to, _value) => { + Assert.equal(result.logs.length, 1); + + const event = result.logs[0]; + + module.exports.checkTransferEvent(event, _from, _to, _value); +} + + +module.exports.checkTransferEvent = (event, _from, _to, _value) => { + let eventBody = event.args; + assertTransferEvent(event.event, eventBody._from, eventBody._to, eventBody._value.toNumber(), _from, _to, _value) +} + +module.exports.checkTransferEventAbiDecoder = (event, _from, _to, _value) => { + let eventType = Object.keys(event)[0]; + let eventBody = event[eventType]; + assertTransferEvent(eventType, eventBody._from, eventBody._to, eventBody._value, _from, _to, _value) +} + +assertTransferEvent = (eventType, actualFrom, actualTo, actualValue, expectedFrom, expectedTo, expectedValue) => { + if (Number.isInteger(expectedValue)) { + expectedValue = new BigNumber(expectedValue); + } + Assert.equal(eventType, "Transfer"); + Assert.equal(actualFrom, expectedFrom); + Assert.equal(actualTo, expectedTo); + Assert.equal(actualValue, expectedValue.toNumber()); +} + +module.exports.checkApprovalEventGroup = (result, _owner, _spender, _value) => { + assert.equal(result.logs.length, 1) + + const event = result.logs[0] + + if (Number.isInteger(_value)) { + _value = new BigNumber(_value) + } + + assert.equal(event.event, "Approval") + assert.equal(event.args._owner, _owner) + assert.equal(event.args._spender, _spender) + assert.equal(event.args._value.toNumber(), _value.toNumber()) +} diff --git a/test/Gate.js b/test/Gate.js new file mode 100644 index 00000000..bb51bfca --- /dev/null +++ b/test/Gate.js @@ -0,0 +1,693 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Gate.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Utils = require('./lib/utils.js'); +const BigNumber = require('bignumber.js'); +const Gate_utils = require('./Gate_utils.js'); +const HashLock = require('./lib/hash_lock.js'); + +contract('Gate', function(accounts) { + + var stakerAccount = accounts[0] + , stakeAmount = new BigNumber(web3.toWei(1000, "ether")) + , beneficiaryAccount = accounts[6] + ; + + const deployGate = async function() { + result = await Gate_utils.deployGate(artifacts, accounts); + valueToken = result.valueToken; + openSTValue = result.openSTValue; + uuid = result.uuid; + gate = result.gate; + workers = result.workers; + bounty = result.bounty; + workerAddress1 = result.workerAddress1; + }; + + const approveGateAndRequestStake = async function (amount, beneficiary, staker, isSuccessCase) { + // approve gate contract + await valueToken.approve(gate.address, amount, { from: staker }); + // call the request stake + return requestStake(amount, beneficiary, staker, isSuccessCase); + }; + + const requestStake = async function (amount, beneficiary, staker, isSuccessCase) { + // intial account balances + let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (isSuccessCase) { + // success case + let isSuccess = await gate.requestStake.call(amount, beneficiary, {from: staker}); + assert.equal(isSuccess, true); + + let requestStakeResponse = await gate.requestStake(amount, beneficiary, {from: staker}); + await Gate_utils.checkRequestStakeEvent(requestStakeResponse.logs[0],staker, amount, beneficiary); + + } else { + // fail case + await Utils.expectThrow(gate.requestStake(amount, beneficiary, {from: staker})); + } + + // account balances after execution + let finalStakerAccountBalance = await valueToken.balanceOf.call(staker) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (isSuccessCase) { + // check balances for success case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.sub(amount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.plus(amount)), true); + } else { + // check balances for failed case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.requestStake(amount, beneficiary, {from: staker})); + }; + + const revertStakeRequest = async function (staker, amount , isSuccessCase) { + // intial account balances + let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (isSuccessCase) { + // success case steps + let revertRequestStakeResult = await gate.revertStakeRequest.call({from: staker}); + assert.equal(revertRequestStakeResult.eq(amount), true); + + let revertRequestStakeResponse = await gate.revertStakeRequest({from: staker}); + await Gate_utils.checkStakeRequestRevertedEvent(revertRequestStakeResponse.logs[0],staker, amount); + } else { + // fail case steps + await Utils.expectThrow(gate.revertStakeRequest({from: staker})); + } + + let finalStakerAccountBalance = await valueToken.balanceOf.call(stakerAccount) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + if (isSuccessCase) { + // check balances for success case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(amount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(amount)), true); + } else { + // check balances for failed case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.revertStakeRequest({from: staker})); + }; + + const rejectStakeRequest = async function (staker, amount, reason, messageSender, isSuccessCase) { + + // load intial account balance + let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (isSuccessCase) { + + let rejectRequestStakeResult = await gate.rejectStakeRequest.call(staker, reason, {from: messageSender}); + assert.equal(rejectRequestStakeResult.eq(amount), true); + + let rejectRequestStakeResponse = await gate.rejectStakeRequest(staker, reason, {from: messageSender}); + await Gate_utils.checkStakeRequestRejectedEvent(rejectRequestStakeResponse.logs[0],staker, amount, reason); + + } else { + await Utils.expectThrow(gate.rejectStakeRequest(staker, reason, {from: messageSender})); + } + + // load balances after execution + let finalStakerAccountBalance = await valueToken.balanceOf.call(staker) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (isSuccessCase) { + // check balances for success case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance.plus(amount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(amount)), true); + } else { + // check balances for failed case + assert.equal(finalStakerAccountBalance.equals(initialStakerAccountBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.rejectStakeRequest(staker, reason, {from: messageSender})); + }; + + const acceptStakeRequest = async function(staker, amount, lock, messageSender, isSuccessCase) { + + let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + , bountyAmount = await gate.bounty.call() + ; + + let stakingIntentHash = null; + + if (isSuccessCase) { + + let stakingIntentHashParams = await getStakingIntentHashParams(staker, amount, lock, messageSender); + let amountUT = stakingIntentHashParams.amountUT; + let nonce = stakingIntentHashParams.nonce; + let unlockHeight = stakingIntentHashParams.unlockHeight; + + stakingIntentHash = stakingIntentHashParams.stakingIntentHash; + + let acceptStakeRequestResponse = await gate.acceptStakeRequest(staker, lock.l, {from: messageSender}); + await Gate_utils.checkStakeRequestAcceptedEvent(acceptStakeRequestResponse.logs[0],staker, amount, amountUT, nonce, unlockHeight, stakingIntentHash); + } else { + await Utils.expectThrow(gate.acceptStakeRequest(staker, lock.l, {from: messageSender})); + } + + let finalworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + ; + + if (isSuccessCase) { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.sub(bountyAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.plus(bountyAmount).sub(amount)), true); + + } else { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.acceptStakeRequest(staker, lock.l, {from: messageSender})); + + return {lock: lock, stakingIntentHash: stakingIntentHash} ; + }; + + const processStaking = async function (stakingIntentHash, unlockSecret, messageSender, isSuccessCase) { + + let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , initialWorkerBalance = await valueToken.balanceOf.call(workers) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + , bountyAmount = await gate.bounty.call() + ; + + if (isSuccessCase) { + let processStakingResult = await gate.processStaking.call(stakingIntentHash, unlockSecret, {from: messageSender}); + assert.equal(stakeAmount.eq(processStakingResult), true); + + let processStakingResponse = await gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender}); + //await Gate_utils.checkProcessedStakeEvent(processStakingResponse.logs[0],stakerAccount, stakeAmount); + } else { + await Utils.expectThrow(gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender})); + } + + + let finalworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + , finalWorkerBalance = await valueToken.balanceOf.call(workers) + ; + + if (isSuccessCase) { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); + } else { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender})); + }; + + const revertStaking = async function (stakingIntentHash, messageSender, isSuccessCase) { + + let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , initialWorkerBalance = await valueToken.balanceOf.call(workers) + , initialGateBalance = await valueToken.balanceOf.call(gate.address) + , bountyAmount = await gate.bounty.call() + ; + + let waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (let i = 0; i < waitTime - 2; i++) { + await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); + } + + if (isSuccessCase) { + let revertStakingResponse = await gate.revertStaking(stakingIntentHash, {from: messageSender}); + assert.equal(revertStakingResponse.receipt.status, 1); + } else { + await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); + } + + + let finalworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) + , finalGateBalance = await valueToken.balanceOf.call(gate.address) + , finalWorkerBalance = await valueToken.balanceOf.call(workers) + ; + + if (isSuccessCase) { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); + assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); + + } else { + // check balances + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance), true); + assert.equal(finalGateBalance.equals(initialGateBalance), true); + } + + // request again should fail + await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); + + }; + + const getStakingIntentHashParams = async function (staker, amount, lock, messageSender) { + let acceptStakeRequestResult = await gate.acceptStakeRequest.call(staker, lock.l, {from: messageSender}); + let amountUT = acceptStakeRequestResult[0]; + let nonce = acceptStakeRequestResult[1]; + let unlockHeight = acceptStakeRequestResult[2].plus(1); + + stakingIntentHash = await openSTValue.hashStakingIntent.call(uuid, staker, nonce, beneficiaryAccount, amount, + amountUT, unlockHeight, lock.l); + + return { + stakingIntentHash: stakingIntentHash, + amountUT: amountUT, + nonce: nonce, + unlockHeight: unlockHeight, + uuid: uuid, + staker: staker, + beneficiaryAccount: beneficiaryAccount, + amountST: amount, + hashLock: lock.l + } + }; + describe('Properties', async () => { + + before (async () => { + await deployGate(); + }); + + it('has workers', async () => { + assert.equal(await gate.workers.call(), workers); + }); + + it('has bounty', async () => { + let bountyValue = await gate.bounty.call(); + assert.equal(bountyValue.toNumber(), bounty); + }); + + it('has uuid', async () => { + let gateUUID = await gate.uuid.call(); + assert.equal(gateUUID, uuid); + }); + + it('has openSTProtocol', async () => { + assert.equal(await gate.openSTProtocol.call(), openSTValue.address); + }); + }); + + describe('requestStake', async () => { + beforeEach (async () => { + await deployGate(); + }); + + it('successfully processes request stake', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + }); + + it('fails to processes request stake when stake amount is 0', async () => { + await approveGateAndRequestStake(new BigNumber(0), beneficiaryAccount, stakerAccount, false); + }); + + it('fails to processes request stake when beneficiary account is 0', async () => { + await approveGateAndRequestStake(stakeAmount, 0, stakerAccount, false); + }); + + it('fails to processes request stake when staker account has not approved gate contract', async () => { + await requestStake(stakeAmount, beneficiaryAccount, stakerAccount, false); + }); + }); + + + describe('revertStakeRequest', async () => { + + let bountyAmount = null; + let lock = null; + + beforeEach (async () => { + await deployGate(); + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); + }); + + it('successfully processes revert stake request', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await revertStakeRequest(stakerAccount, stakeAmount ,true); + }); + + it('fails to processes revert stake request when staker account has not requested stake before', async () => { + await revertStakeRequest(stakerAccount, stakeAmount ,false); + }); + + it('fails to processes revert stake request after stake request was accepted', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + + await revertStakeRequest(stakerAccount, stakeAmount ,false); + }); + + }); + + describe('rejectStakeRequest', async () => { + + let bountyAmount = null; + let lock = null; + let rejectReason = 2; + + beforeEach (async () => { + await deployGate(); + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); + }); + + it('successfully processes reject stake request', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await rejectStakeRequest(stakerAccount, stakeAmount, rejectReason, workerAddress1, true); + }); + + it('fails to processes reject stake request when staker account has not requested to stake before', async () => { + await rejectStakeRequest(stakerAccount, stakeAmount, rejectReason, workerAddress1, false); + }); + + it('fails to processes reject stake request after stake request was accepted', async () => { + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + + await rejectStakeRequest(stakerAccount, stakeAmount, rejectReason, workerAddress1, false); + }); + }); + + + describe('acceptStakeRequest', async () => { + + let bountyAmount = null; + let lock = null; + + beforeEach (async () => { + + await deployGate(); + + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); + }); + + it('successfully processes accept stake request', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + + }); + + it('fails to processes accept stake request when worker is not whitelisted address', async () => { + + let workerAddress = accounts[10]; + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress }); + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress, false); + + }); + + it('fails to processes accept stake request when staker address is blank', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + await acceptStakeRequest(0, stakeAmount, lock, workerAddress1, false); + + }); + + it('fails to processes accept stake request when hash lock is blank', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + + lock.l = 0; + lock.s = 0; + await acceptStakeRequest(0, stakeAmount, lock, workerAddress1, false); + + }); + + it('fails to processes accept stake request when worker address has insufficient balance', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + await acceptStakeRequest(0, stakeAmount, lock, workerAddress1, false); + + }); + + it('fails to processes accept stake request when worker address has not approved gate contract', async () => { + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await acceptStakeRequest(0, stakeAmount, lock, workerAddress1, false); + + }); + + }); + + + describe('processStaking', async () => { + + let bountyAmount = null; + let lock = null; + + beforeEach (async () => { + await deployGate(); + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + }); + + it('successfully processes', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await processStaking(stakingIntentHash, lock.s, workerAddress1, true); + + }); + + it('fails to processes when the worker address is not whitelisted', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + let workerAddress = accounts[10]; + await processStaking(stakingIntentHash, lock.s, workerAddress, false); + + }); + + it('fails to processes when stakingIntentHash is 0', async () => { + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + await processStaking(0, lock.s, workerAddress1, false); + + }); + + it('fails to processes when stakingIntentHash is invalid', async () => { + + await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + await processStaking(beneficiaryAccount, lock.s, workerAddress1, false); + + }); + + it('fails to processes when unlockSecret is 0', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await processStaking(stakingIntentHash, 0, workerAddress1, false); + + }); + + it('fails to processes when unlockSecret is invalid', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await processStaking(stakingIntentHash, beneficiaryAccount, workerAddress1, false); + + }); + + it('fails to processes when stakeRequest was not accepted', async () => { + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + + }); + + it('fails to processes when stakeRequest was rejected', async () => { + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + + await rejectStakeRequest(stakerAccount, stakeAmount, 0, workerAddress1, true); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + + }); + + it('fails to processes when stakeRequest was reverted', async () => { + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + + await revertStakeRequest(stakerAccount, stakeAmount ,true); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + + }); + + }); + + describe('revertStaking', async () => { + + let bountyAmount = null; + let lock = null; + + beforeEach (async () => { + await deployGate(); + bountyAmount = await gate.bounty.call(); + lock = HashLock.getHashLock(); + + await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); + await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); + await valueToken.approve(gate.address, bountyAmount, { from: workerAddress1 }); + }); + + it('successfully processes', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await revertStaking(stakingIntentHash, workerAddress1, true); + + }); + + it('fails to process when already processStake is called', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await processStaking(stakingIntentHash, lock.s, workerAddress1, true); + + await revertStaking(stakingIntentHash, workerAddress1, false); + + }); + + it('fails to process when stakingIntentHash is 0', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await revertStaking(0, workerAddress1, false); + + }); + + it('fails to process when stakingIntentHash is invalid', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + await revertStaking(beneficiaryAccount, workerAddress1, false); + + }); + + it('fails to process when worker is not whitelisted', async () => { + + let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); + let stakingIntentHash = stakeResult['stakingIntentHash']; + + let workerAddress = accounts[10]; + await revertStaking(stakingIntentHash, workerAddress, false); + + }); + + + it('fails to processes when stakeRequest was not accepted', async () => { + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, false); + + }); + + it('fails to processes when stakeRequest was rejected', async () => { + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + + await rejectStakeRequest(stakerAccount, stakeAmount, 0, workerAddress1, true); + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, false); + }); + + it('fails to processes when stakeRequest was reverted', async () => { + + let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); + + await revertStakeRequest(stakerAccount, stakeAmount ,true); + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, false); + }); + + }) + +}); + + diff --git a/test/Gate_utils.js b/test/Gate_utils.js new file mode 100644 index 00000000..5ce5699e --- /dev/null +++ b/test/Gate_utils.js @@ -0,0 +1,169 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: BrandedToken_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const OpenSTValue_utils = require('./OpenSTValue_utils.js') + , OpenSTValue = artifacts.require("./OpenSTValueMock.sol") + , SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") + , Core = artifacts.require("./Core.sol") + , SimpleStake = artifacts.require("./SimpleStake.sol") + , Gate = artifacts.require("./Gate.sol") + , Workers = artifacts.require("./Workers.sol") + ; + +const Assert = require('assert') + , BigNumber = require('bignumber.js') + ; + +/// @dev Deploy +module.exports.deployGate = async (artifacts, accounts) => { + + const chainIdValue = 3 + , chainIdRemote = 1410 + , openSTRemote = accounts[4] + , valueToken = await SimpleToken.new() + , symbol = "ST" + , name = "Simple Token" + , conversionRateDecimals = 5 + , conversionRate = new BigNumber(10 * 10**conversionRateDecimals) // conversion rate => 10 + , bounty = 100 + , admin = accounts[3] + , ops = accounts[1] + , registrar = accounts[5] + ; + + var core = null + , openSTValue = null + , checkUuid = null + ; + + // Set SimpleToken admin in order to finalize SimpleToken + await valueToken.setAdminAddress(admin); + // SimpleToken must be finalized to permit certain transfers + assert.ok(await valueToken.finalize({ from: admin })); + openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); + + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, new BigNumber(web3.toWei(10, "ether")), {from:ops}); + + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + + assert.equal(await openSTValue.registerUtilityToken.call(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }), checkUuid); + const result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + + // Stake address is returned by UtilityTokenRegistered but verified below rather than by checkUtilityTokenRegisteredEvent + OpenSTValue_utils.checkUtilityTokenRegisteredEvent(result.logs[0], checkUuid, symbol, name, 18, conversionRate, chainIdRemote, 0); + var simpleStake = new SimpleStake(result.logs[0].args.stake); + + assert.equal(await simpleStake.uuid.call(), checkUuid); + assert.equal(await simpleStake.eip20Token.call(), valueToken.address); + assert.equal(await openSTValue.getUuidsSize.call(), 1); + assert.equal((await openSTValue.utilityTokens.call(checkUuid))[0], symbol); + + const gate = await Gate.new(workers.address, bounty, checkUuid, openSTValue.address); + + return { + valueToken : valueToken, + openSTValue : openSTValue, + uuid: checkUuid, + gate: gate, + workers: workers.address, + bounty: bounty, + workerAddress1: worker1 + } +}; + + + +module.exports.checkRequestStakeEvent = (event, _staker, _amount, _beneficiary) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + assert.equal(event.event, "StakeRequested"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); + assert.equal(event.args._beneficiary, _beneficiary); +}; + + +module.exports.checkStakeRequestRevertedEvent = (event, _staker, _amount) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + assert.equal(event.event, "StakeRequestReverted"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); +}; + +module.exports.checkStakeRequestRejectedEvent = (event, _staker, _amount, _reason) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + if (Number.isInteger(_reason)) { + _reason = new BigNumber(_reason); + } + assert.equal(event.event, "StakeRequestRejected"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); + assert.equal(event.args._reason.toNumber(10), _reason.toNumber(10)); +}; + + +module.exports.checkStakeRequestAcceptedEvent = (event, _staker, _amountST, _amountUT, _nonce, _unlockHeight, _stakingIntentHash) => { + if (Number.isInteger(_amountST)) { + _amount = new BigNumber(_amountST); + } + if (Number.isInteger(_amountUT)) { + _amount = new BigNumber(_amountUT); + } + if (Number.isInteger(_nonce)) { + _amount = new BigNumber(_nonce); + } + if (Number.isInteger(_unlockHeight)) { + _amount = new BigNumber(_unlockHeight); + } + assert.equal(event.event, "StakeRequestAccepted"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amountST.toNumber(10), _amountST.toNumber(10)); + assert.equal(event.args._amountUT.toNumber(10), _amountUT.toNumber(10)); + assert.equal(event.args._nonce.toNumber(10), _nonce.toNumber(10)); + assert.equal(event.args._unlockHeight.toNumber(10), _unlockHeight.toNumber(10)); + assert.equal(event.args._stakingIntentHash, _stakingIntentHash); +}; + +module.exports.checkProcessedStakeEvent = (event, _staker, _amount) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + console.log("event: ",event); + assert.equal(event.event, "ProcessedStake"); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amountST.toNumber(10), _amount.toNumber(10)); +}; + + + diff --git a/test/MockToken.js b/test/MockToken.js new file mode 100644 index 00000000..086ec2e5 --- /dev/null +++ b/test/MockToken.js @@ -0,0 +1,65 @@ +const Utils = require('./lib/utils.js') +const SimpleTokenUtils = require('./SimpleToken_utils.js') + +const Moment = require('moment') + +const MockToken = artifacts.require("./MockToken.sol") + + +// Test Stories +// +// Finalize +// - check properties before and after finalize +// - try to finalize a 2nd time +// + + +contract('MockToken', (accounts) => { + + const SYMBOL = "MOCK" + const NAME = "Mock Token" + const admin = accounts[1]; + + async function createToken() { + return await MockToken.new({ from: accounts[0], gas: 3500000 }) + } + + describe('Basic properties', async () => { + + var token = null + + before(async () => { + token = await createToken() + }) + + it("symbol", async () => { + assert.equal(await token.symbol.call(), SYMBOL) + }) + + it("name", async () => { + assert.equal(await token.name.call(), NAME) + }) + }) + + describe('Finalize', async () => { + + var token = null + + before(async () => { + token = await createToken() + + await token.setAdminAddress(admin) + }) + + + it("check properties before and after finalize", async () => { + assert.equal(await token.finalized.call(), false) + SimpleTokenUtils.checkFinalizedEventGroup(await token.finalize({ from: admin })) + assert.equal(await token.finalized.call(), true) + }) + + it("try to finalize a 2nd time", async () => { + await Utils.expectThrow(token.finalize.call({ from: admin })) + }) + }) +}) diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js new file mode 100644 index 00000000..76bbad5b --- /dev/null +++ b/test/OpenSTUtility.js @@ -0,0 +1,716 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: OpenSTUtility.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Utils = require('./lib/utils.js'); +const HashLock = require('./lib/hash_lock.js'); +const OpenSTUtility_utils = require('./OpenSTUtility_utils.js'); +const BrandedToken = artifacts.require("./BrandedToken.sol"); +const BigNumber = require('bignumber.js'); + +/// +/// Test stories +/// +/// Properties +/// has chainIdValue +/// has chainIdUtility +/// has registrar +/// +/// ProposeBrandedToken +/// fails to propose when symbol is empty +/// fails to propose when name is empty +/// fails to propose when conversion rate is not > 0 +/// successfully proposes +/// +/// RegisterBrandedToken +/// fails to register by non-registrar +/// fails to register when symbol is empty +/// fails to register when name is empty +/// fails to register when conversion rate is not > 0 +/// fails to register when UUIDs do not match +/// successfully registers +/// +/// ConfirmStakingIntent +/// fails to confirm by non-registrar +/// fails to confirm when token is not registered +/// fails confirm when stakerNonce is not > previously +/// fails to confirm when amoutST is not > 0 +/// fails to confirm when amoutUT is not > 0 +/// fails to confirm when stakingUnlockHeight is not > 0 +/// fails to confirm when stakingIntentHash is empty +/// fails to confirm when stakingIntentHash does not match calculated hash +/// successfully confirms +/// +/// ProcessMinting +/// when expirationHeight is > block number +/// fails to process if stakingIntentHash is empty +/// fails to process if hash of unlockSecret does not match hashlock +/// successfully mints +/// fails to re-process a processed mint +/// when expirationHeight is < block number // TBD: how or where to test this practically +/// +/// Redeem +/// fails to redeem when uuid is empty +/// fails to redeem when amount is not > 0 +/// fails to redeem when nonce is not >= previously +/// fails to redeem when uuid is uuidSTPrime +/// fails to redeem if not approved to transfer the amount +/// successfully redeems +/// +/// RedeemSTPrime +/// fails to redeem when msg.value is not > 0 +/// fails to redeem when nonce is not >= previously +/// successfully redeems +/// +/// ProcessRedeeming +/// BrandedToken +/// fails to process if redemptionIntentHash is empty +/// fails to process if hash of unlockSecret does not match hashlock +/// successfully processes +/// fails to reprocess +/// STPrime +/// successfully processes +/// +/// ProcessRedeeming with fallback +/// BrandedToken +/// successfully processes by registrar +/// STPrime +/// successfully processes by registrar +/// + +contract('OpenSTUtility', function(accounts) { + const chainIdValue = 3; + const chainIdUtility = 1410; + const registrar = accounts[1]; + + const symbol = "MCC"; + const name = "Member Company Coin"; + + const conversionRateDecimals = 5; + const conversionRate = new BigNumber(5 * (10**conversionRateDecimals)); + + const amountST = new BigNumber(web3.toWei(1, "ether")); + const amountUT = (amountST.mul(conversionRate)).div(new BigNumber(10**conversionRateDecimals)); + + + const hashName = "hashName"; + const hashSymbol = "hashSymbol"; + const requester = "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + const token = "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; + const redeemer = accounts[0]; + const redeemBeneficiary = accounts[2]; + const notRedeemer = accounts[5]; + + var result = null; + var checkBtUuid = null; + var brandedToken = null; + var checkStakingIntentHash = null; + var unlockHeight = null; + var uuidSTPrime = null; + var expirationHeight = null; + + describe('Properties', async () => { + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + }) + + it('has chainIdValue', async () => { + assert.equal(await openSTUtility.chainIdValue.call(), chainIdValue); + }) + + it('has chainIdUtility', async () => { + assert.equal(await openSTUtility.chainIdUtility.call(), chainIdUtility); + }) + + it('has registrar', async () => { + assert.equal(await openSTUtility.registrar.call(), registrar); + }) + }) + + describe('ProposeBrandedToken', async () => { + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + }) + + it('fails to propose when symbol is empty', async () => { + await Utils.expectThrow(openSTUtility.proposeBrandedToken("", name, conversionRate, conversionRateDecimals)); + }) + + it('fails to propose when name is empty', async () => { + await Utils.expectThrow(openSTUtility.proposeBrandedToken(symbol, "", conversionRate, conversionRateDecimals)); + }) + + it('fails to propose when conversion rate is not > 0', async () => { + await Utils.expectThrow(openSTUtility.proposeBrandedToken(symbol, name, 0, conversionRateDecimals)); + }) + + it('successfully proposes', async () => { + assert.equal(await openSTUtility.proposeBrandedToken.call(symbol, name, conversionRate, conversionRateDecimals), checkBtUuid); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + + // Token address is returned by ProposedBrandedToken but verified below rather than by checkProposedBrandedTokenEvent + OpenSTUtility_utils.checkProposedBrandedTokenEvent(result.logs[0], accounts[0], checkBtUuid, symbol, name, conversionRate); + var brandedTokenContract = new BrandedToken(result.logs[0].args._token); + assert.equal(await brandedTokenContract.uuid.call(), checkBtUuid); + }) + }) + + describe('RegisterBrandedToken', async () => { + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + brandedToken = result.logs[0].args._token; + }) + + it('fails to register by non-registrar', async () => { + await Utils.expectThrow(openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: accounts[0] })); + }) + + it('fails to register when symbol is empty', async () => { + await Utils.expectThrow(openSTUtility.registerBrandedToken("", name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar })); + }) + + it('fails to register when name is empty', async () => { + await Utils.expectThrow(openSTUtility.registerBrandedToken(symbol, "", conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar })); + }) + + it('fails to register when conversion rate is not > 0', async () => { + await Utils.expectThrow(openSTUtility.registerBrandedToken(symbol, name, 0, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar })); + }) + + it('fails to register when UUIDs do not match', async () => { + await Utils.expectThrow(openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, "bad UUID", { from: registrar })); + }) + + it('successfully registers', async () => { + assert.equal(await openSTUtility.getUuidsSize.call(), 1); // there is already 1 UUID in uuids for STPrime + assert.equal(await openSTUtility.registerBrandedToken.call(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }), checkBtUuid); + result = await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); + assert.equal(await openSTUtility.getUuidsSize.call(), 2); + assert.equal((await openSTUtility.registeredTokens.call(checkBtUuid))[0], brandedToken); + await OpenSTUtility_utils.checkRegisteredBrandedTokenEvent(result.logs[0], registrar, brandedToken, checkBtUuid, symbol, name, conversionRate, accounts[0]); + }) + }) + + describe('ConfirmStakingIntent', async () => { + + const lock = HashLock.getHashLock(); + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + brandedToken = result.logs[0].args._token; + await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + }) + + it('fails to confirm by non-registrar', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: accounts[0] })); + }) + + it('fails to confirm when token is not registered', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent("bad UUID", accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); + }) + + it('fails confirm when stakerNonce is not > previously', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 0, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); + }) + + it('fails to confirm when amoutST is not > 0', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], 0, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); + }) + + it('fails to confirm when amountUT is not > 0', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, 0, 80668, lock.l, checkStakingIntentHash, { from: registrar })); + }) + + it('fails to confirm when stakingUnlockHeight is not > 0', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 0, lock.l, checkStakingIntentHash, { from: registrar })); + }) + + it('fails to confirm when stakingIntentHash is empty', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, "", { from: registrar })); + }) + + it('fails to confirm when presented with different lock', async () => { + const differentLock = HashLock.getHashLock(); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, differentLock.l, "", { from: registrar })); + }) + + it('fails to confirm when stakingIntentHash does not match calculated hash', async () => { + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, "bad stakingIntentHash", { from: registrar })); + }) + + it('successfully confirms', async () => { + expirationHeight = await openSTUtility.confirmStakingIntent.call(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + + // call block number is one less than send block number + expirationHeight = expirationHeight.plus(1) + result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await OpenSTUtility_utils.checkStakingIntentConfirmedEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, accounts[0], accounts[0], amountST, amountUT, expirationHeight); + }) + }) + + describe('ProcessMinting', async () => { + + const lock = HashLock.getHashLock(); + + context('when expirationHeight is > block number', async () => { + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + brandedToken = result.logs[0].args._token; + await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + }) + + it('fails to process if stakingIntentHash is empty', async () => { + await Utils.expectThrow(openSTUtility.processMinting("", lock.s)); + }) + + it('fails to process if hash of unlockSecret does not match hashlock', async () => { + const differentLock = HashLock.getHashLock(); + await Utils.expectThrow(openSTUtility.processMinting(checkStakingIntentHash, differentLock.s, { from: accounts[1] })); + }) + + it('successfully mints', async () => { + assert.equal(await openSTUtility.processMinting.call(checkStakingIntentHash, lock.s), brandedToken); + result = await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + await OpenSTUtility_utils.checkProcessedMintEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, brandedToken, accounts[0], accounts[0], amountUT, lock.s); + }) + + it('fails to re-process a processed mint', async () => { + await Utils.expectThrow(openSTUtility.processMinting(checkStakingIntentHash, lock.s)); + }) + }) + }) + + describe('Redeem', async () => { + + var brandedTokenContract = null; + const redeemAmountUT = new BigNumber(web3.toWei(1, "ether")); + + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + brandedToken = result.logs[0].args._token; + await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + + brandedTokenContract = new BrandedToken(brandedToken); + await brandedTokenContract.claim(accounts[0]); + await brandedTokenContract.approve(openSTUtility.address, redeemAmountUT, { from: redeemer }); + }) + + it('fails to redeem when uuid is empty', async () => { + await Utils.expectThrow(openSTUtility.redeem("", redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer })); + }) + + it('fails to redeem when amount is not > 0', async () => { + await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, 0, 2, redeemBeneficiary, lockR.l, { from: redeemer })); + }) + + it('fails to redeem when nonce is not >= previously', async () => { + await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, redeemAmountUT, 0, redeemBeneficiary, lockR.l, { from: redeemer })); + }) + + it('fails to redeem when uuid is uuidSTPrime', async () => { + uuidSTPrime = await openSTUtility.uuidSTPrime.call(); + await Utils.expectThrow(openSTUtility.redeem(uuidSTPrime, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer })); + }) + + it('fails to redeem if not approved to transfer the amount', async () => { + await brandedTokenContract.approve(openSTUtility.address, 0, { from: redeemer }); + await Utils.expectThrow(openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer })); + await brandedTokenContract.approve(openSTUtility.address, redeemAmountUT, { from: redeemer }); + }) + + it('successfully redeems', async () => { + var redeemReturns = await openSTUtility.redeem.call(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); + + // call block number is one less than send block number + unlockHeight = redeemReturns[0].plus(1); + var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(checkBtUuid, accounts[0], 2, redeemBeneficiary, redeemAmountUT, unlockHeight, lockR.l); + result = await openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); + + await OpenSTUtility_utils.checkRedemptionIntentDeclaredEvent(result.logs[0], checkBtUuid, checkRedemptionIntentHash, brandedToken, + redeemer, 2, redeemBeneficiary, redeemAmountUT, unlockHeight, chainIdValue); + }) + }) + + describe('RedeemSTPrime', async () => { + + const redeemSTP = new BigNumber(2); + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + stPrime = contracts.stPrime; + openSTUtility = contracts.openSTUtility; + uuidSTPrime = await openSTUtility.uuidSTPrime.call(); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l); + + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + await stPrime.claim(accounts[0]); + }) + + it('fails to redeem when msg.value is not > 0', async () => { + await Utils.expectThrow(openSTUtility.redeemSTPrime(redeemSTP.toNumber(), redeemBeneficiary, lockR.l, { from: redeemer, value: 0 })); + }) + + it('fails to redeem when nonce is not >= previously', async () => { + await Utils.expectThrow(openSTUtility.redeemSTPrime(0, redeemBeneficiary, lockR.l, { from: redeemer, value: 2 })); + }) + + it('successfully redeems', async () => { + var redeemReturns = await openSTUtility.redeemSTPrime.call(redeemSTP.toNumber(), redeemBeneficiary, lockR.l, { from: redeemer, value: 2 }); + + // call block number is one less than send block number + unlockHeight = redeemReturns[1].plus(1) + var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(uuidSTPrime, redeemer, 2, redeemBeneficiary, redeemSTP, unlockHeight, lockR.l); + result = await openSTUtility.redeemSTPrime(redeemSTP, redeemBeneficiary, lockR.l, { from: redeemer, value: redeemSTP }); + + await OpenSTUtility_utils.checkRedemptionIntentDeclaredEvent(result.logs[0], uuidSTPrime, checkRedemptionIntentHash, stPrime.address, + redeemer, 2, redeemBeneficiary, redeemSTP.toNumber(), unlockHeight, chainIdValue); + }) + }) + + describe('ProcessRedeeming', async () => { + var redemptionIntentHash = null; + var brandedToken = null; + var brandedTokenContract = null; + + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + context('BrandedToken', async () => { + var redemptionAmount = 3; + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + brandedToken = result.logs[0].args._token; + await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + brandedTokenContract = new BrandedToken(brandedToken); + await brandedTokenContract.claim(accounts[0]); + await brandedTokenContract.approve(openSTUtility.address, redemptionAmount, { from: redeemer }); + result = await openSTUtility.redeem(checkBtUuid, redemptionAmount, 2, redeemBeneficiary, lockR.l, { from: redeemer }); + redemptionIntentHash = result.logs[0].args._redemptionIntentHash; + }) + + it('fails to process if redemptionIntentHash is empty', async () => { + await Utils.expectThrow(openSTUtility.processRedeeming("", lockR.s, { from: notRedeemer })); + }) + + it('fails to process if hash of unlockSecret does not match hashlock', async () => { + await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, "incorrect unlock secret", { from: notRedeemer })); + }) + + it('successfully processes', async () => { + var openSTUtilityBal = await brandedTokenContract.balanceOf.call(openSTUtility.address); + var totalSupply = await brandedTokenContract.totalSupply.call(); + assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, lockR.s, { from: notRedeemer }), brandedToken); + result = await openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: notRedeemer }); + + var postProcessOpenSTUtilityBal = await brandedTokenContract.balanceOf.call(openSTUtility.address); + var postProcessTotalSupply = await brandedTokenContract.totalSupply.call(); + assert.equal(postProcessOpenSTUtilityBal.toNumber(), openSTUtilityBal.minus(redemptionAmount).toNumber()); + assert.equal(postProcessTotalSupply.toNumber(), totalSupply.minus(redemptionAmount).toNumber()); + await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], checkBtUuid, redemptionIntentHash, brandedToken, redeemer, redeemBeneficiary, redemptionAmount, lockR.s); + }) + + it('fails to reprocess', async () => { + await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: notRedeemer })); + }) + }) + + context('STPrime', async () => { + var redemptionAmount = 2; + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + stPrime = contracts.stPrime; + openSTUtility = contracts.openSTUtility; + uuidSTPrime = await openSTUtility.uuidSTPrime.call(); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l); + + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + await stPrime.claim(accounts[0]); + result = await openSTUtility.redeemSTPrime(redemptionAmount, redeemBeneficiary, lockR.l, { from: redeemer, value: redemptionAmount }); + redemptionIntentHash = result.logs[0].args._redemptionIntentHash; + }) + + it('successfully processes', async () => { + var stPrimeBal = await web3.eth.getBalance(stPrime.address); + var totalSupply = await stPrime.totalSupply.call(); + assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, lockR.s, { from: notRedeemer }), stPrime.address); + result = await openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: notRedeemer }); + + var postProcessStPrimeBal = await web3.eth.getBalance(stPrime.address); + var postProcessTotalSupply = await stPrime.totalSupply.call(); + assert.equal(postProcessStPrimeBal.toNumber(), stPrimeBal.minus(redemptionAmount).toNumber()); + assert.equal(postProcessTotalSupply.toNumber(), totalSupply.minus(redemptionAmount).toNumber()); + await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], uuidSTPrime, redemptionIntentHash, stPrime.address, redeemer, redeemBeneficiary, redemptionAmount, lockR.s); + }) + }) + }) + + describe('ProcessRedeeming with fallback', async () => { + var redemptionIntentHash = null; + var brandedToken = null; + var brandedTokenContract = null; + + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + context('BrandedToken', async () => { + var redemptionAmount = 3; + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate,conversionRateDecimals); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + brandedToken = result.logs[0].args._token; + await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + brandedTokenContract = new BrandedToken(brandedToken); + await brandedTokenContract.claim(accounts[0]); + await brandedTokenContract.approve(openSTUtility.address, redemptionAmount, { from: redeemer }); + result = await openSTUtility.redeem(checkBtUuid, redemptionAmount, 2, redeemBeneficiary, lockR.l, { from: redeemer }); + redemptionIntentHash = result.logs[0].args._redemptionIntentHash; + }) + + it('successfully processes by registrar', async () => { + var openSTUtilityBal = await brandedTokenContract.balanceOf.call(openSTUtility.address); + var totalSupply = await brandedTokenContract.totalSupply.call(); + assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, lockR.s, { from: notRedeemer }), brandedToken); + // redemption is processed by Registrar + result = await openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: registrar }); + + var postProcessOpenSTUtilityBal = await brandedTokenContract.balanceOf.call(openSTUtility.address); + var postProcessTotalSupply = await brandedTokenContract.totalSupply.call(); + assert.equal(postProcessOpenSTUtilityBal.toNumber(), openSTUtilityBal.minus(redemptionAmount).toNumber()); + assert.equal(postProcessTotalSupply.toNumber(), totalSupply.minus(redemptionAmount).toNumber()); + await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], checkBtUuid, redemptionIntentHash, brandedToken, redeemer, redeemBeneficiary, redemptionAmount, lockR.s); + }) + }) + + context('STPrime', async () => { + var redemptionAmount = 2; + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + stPrime = contracts.stPrime; + openSTUtility = contracts.openSTUtility; + + uuidSTPrime = await openSTUtility.uuidSTPrime.call(); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.processMinting(checkStakingIntentHash, lock.s); + await stPrime.claim(accounts[0]); + result = await openSTUtility.redeemSTPrime(redemptionAmount, redeemBeneficiary, lockR.l, { from: redeemer, value: redemptionAmount }); + redemptionIntentHash = result.logs[0].args._redemptionIntentHash; + }) + + it('successfully processes by registrar', async () => { + var stPrimeBal = await web3.eth.getBalance(stPrime.address); + var totalSupply = await stPrime.totalSupply.call(); + assert.equal(await openSTUtility.processRedeeming.call(redemptionIntentHash, lockR.s, { from: notRedeemer }), stPrime.address); + // redemption is processed by Registrar + result = await openSTUtility.processRedeeming(redemptionIntentHash, lockR.s, { from: registrar }); + + var postProcessStPrimeBal = await web3.eth.getBalance(stPrime.address); + var postProcessTotalSupply = await stPrime.totalSupply.call(); + assert.equal(postProcessStPrimeBal.toNumber(), stPrimeBal.minus(redemptionAmount).toNumber()); + assert.equal(postProcessTotalSupply.toNumber(), totalSupply.minus(redemptionAmount).toNumber()); + await OpenSTUtility_utils.checkProcessedRedemptionEvent(result.logs[0], uuidSTPrime, redemptionIntentHash, stPrime.address, redeemer, redeemBeneficiary, redemptionAmount, lockR.s); + }) + }) + }); + + // Unit test cases for revert redemption + describe('revert redemption', async () => { + + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + context('revert redemption', async () => { + + var stakeAmountST = new BigNumber(web3.toWei(1, "ether")), + convertedAmountBT = (stakeAmountST*conversionRate), + redemptionAmountBT = new BigNumber(web3.toWei(2, "ether")), // How many Branded tokens to redeem + redeemerForRevert = accounts[0] // requester and redeemer is same here + escrowUnlockHeight = 0; + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + // Use OpenSTUtility Contract to expire redeem soon + OpenSTUtility = contracts.openSTUtility; + checkBtUuid = await OpenSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, OpenSTUtility.address, conversionRate, conversionRateDecimals); + result = await OpenSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + brandedToken = result.logs[0].args._token; + await OpenSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, redeemerForRevert, brandedToken, checkBtUuid, { from: registrar }); + + escrowUnlockHeight = await OpenSTUtility.blocksToWaitLong.call(); + // 1 more than BLOCKS_TO_WAIT_LONG in OpenSTUtility contract so that redeem expires + escrowUnlockHeight = escrowUnlockHeight.toNumber() + 1; + checkStakingIntentHash = await OpenSTUtility.hashStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, lock.l); + await OpenSTUtility.confirmStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, lock.l, checkStakingIntentHash, { from: registrar }); + await OpenSTUtility.processMinting(checkStakingIntentHash, lock.s); + brandedTokenContract = new BrandedToken(brandedToken); + await brandedTokenContract.claim(redeemerForRevert); + // redeemerForRevert is approved with 5 BT + await brandedTokenContract.approve(OpenSTUtility.address, redemptionAmountBT, { from: redeemerForRevert }); + // After calling Redeem is left with 3 BT since redemptionAmountBT is 2 (5-2) + result = await OpenSTUtility.redeem(checkBtUuid, redemptionAmountBT, 2, redeemBeneficiary, lockR.l, { from: redeemerForRevert }); + redemptionIntentHash = result.logs[0].args._redemptionIntentHash; + }); + + // Mock transactions so that block number increases + it('waits till redeem is expired', async () => { + + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + + for (var i = 0; i < escrowUnlockHeight; i++) { + await web3.eth.sendTransaction({ from: accounts[2], to: accounts[1], value: amountToTransfer, gasPrice: '0x12A05F200' }); + } + + }); + + it('fails to revert redemption when redemptionIntentHash is empty', async () => { + + await Utils.expectThrow(OpenSTUtility.revertRedemption("", { from: redeemerForRevert })); + + }); + + it('fails to revert redemption when redemptionIntentHash is any random string', async () => { + + await Utils.expectThrow(OpenSTUtility.revertRedemption("hshhsgdg7alffwwsda", { from: redeemerForRevert })); + + }); + + it('Verify balance of redeemer just before reverting redemption', async () => { + + var balanceOfRedeemer = await brandedTokenContract.balanceOf(redeemerForRevert); + await assert.equal(balanceOfRedeemer.toNumber(), (convertedAmountBT-redemptionAmountBT)); + + }); + + it('successfully reverts redemption', async () => { + + var revertRedemptionResult = await OpenSTUtility.revertRedemption(redemptionIntentHash, { from: redeemerForRevert }); + OpenSTUtility_utils.checkRevertedRedemption(revertRedemptionResult.logs[0], checkBtUuid, redemptionIntentHash, + redeemerForRevert, redeemBeneficiary, redemptionAmountBT); + + }); + + it('Verify balance of redeemer just after reverting redemption', async () => { + + var balanceOfRedeemer = await brandedTokenContract.balanceOf(redeemerForRevert); + await assert.equal(balanceOfRedeemer.toNumber(), convertedAmountBT); + + }); + + it('fails to processRedeeming after revert redemption', async () => { + + await Utils.expectThrow(openSTUtility.processRedeeming(redemptionIntentHash, lockR.l, { from: redeemerForRevert })); + + }); + + }); + + }); + + // Unit test case for revertMinting + describe('revert minting', async () => { + var redemptionIntentHash = null; + var brandedToken = null; + var stakingIntentHash = null; + const AMOUNT_ST = new BigNumber(web3.toWei(10, "ether")); + const AMOUNT_BT = new BigNumber(AMOUNT_ST*conversionRate); + + const lock = HashLock.getHashLock(); + + context('BrandedToken', async () => { + + before(async () => { + contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); + openSTUtility = contracts.openSTUtility; + checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); + brandedToken = result.logs[0].args._token; + await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); + stakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], + AMOUNT_ST, AMOUNT_BT, 80668, lock.l); + result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], AMOUNT_ST, + AMOUNT_BT, 80668, lock.l, stakingIntentHash, { from: registrar }); + }); + + it('fails if stakingIntentHash is empty', async() => { + await Utils.expectThrow(openSTUtility.revertMinting("", { from: accounts[2] })); + }); + + // Before wait time as passed + it('fails to complete by proposedProtocol before waiting period ends', async () => { + // Wait time less 1 block for preceding test case and 1 block because condition is <= + var waitBlock = await openSTUtility.blocksToWaitShort.call(); + for (var i = 0; i < waitBlock - 2; i++) { + await Utils.expectThrow(openSTUtility.revertMinting(stakingIntentHash, { from: accounts[2], gasPrice: '0x12A05F200' })); + } + }) + + it('successfully revert Minting', async () => { + var result = await openSTUtility.revertMinting(stakingIntentHash, { from: accounts[2] , gasPrice: '0x12A05F200'}); + await OpenSTUtility_utils.checkRevertedMintEvent(result.logs[0], checkBtUuid, stakingIntentHash, accounts[0], + accounts[0], AMOUNT_BT); + }) + }) + }) + +}); diff --git a/test/OpenSTUtility_utils.js b/test/OpenSTUtility_utils.js new file mode 100644 index 00000000..a2ec2d8c --- /dev/null +++ b/test/OpenSTUtility_utils.js @@ -0,0 +1,234 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: OpenSTUtility_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); + +var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); +var STPrime = artifacts.require("./STPrime.sol"); + +const chainIdValue = 3; +const chainIdUtility = 1410; + +/// @dev Deploy OpenSTUtility +module.exports.deployOpenSTUtility = async (artifacts, accounts) => { + const registrar = accounts[1]; + + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar, { gas: 10000000 }); + const stPrimeAddress = await openSTUtility.simpleTokenPrime.call(); + const stPrime = new STPrime(stPrimeAddress); + + await stPrime.initialize({ from: accounts[11], value: new BigNumber(web3.toWei(800000000, "ether")) }); + + return { + stPrime : stPrime, + openSTUtility : openSTUtility + } +} + +// Token address is returned by ProposedBrandedToken but verified elsewhere +module.exports.checkProposedBrandedTokenEvent = (event, _requester, _uuid, _symbol, _name, _conversionRate) => { + if (Number.isInteger(_conversionRate)) { + _conversionRate = new BigNumber(_conversionRate); + } + + assert.equal(event.event, "ProposedBrandedToken"); + assert.equal(event.args._requester, _requester); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._symbol, _symbol); + assert.equal(event.args._name, _name); + assert.equal(event.args._conversionRate.toNumber(), _conversionRate.toNumber()); +} + +module.exports.validateProposedBrandedTokenEvent = (event, _requester, _symbol, _name, _conversionRate) => { + if (Number.isInteger(_conversionRate)) { + _conversionRate = new BigNumber(_conversionRate); + } + + assert.equal(event.event, "ProposedBrandedToken"); + assert.equal(event.args._requester, _requester); + assert.equal(event.args._symbol, _symbol); + assert.equal(event.args._name, _name); + assert.equal(event.args._conversionRate.toNumber(), _conversionRate.toNumber()); +} + + +module.exports.checkRegisteredBrandedTokenEvent = (event, _registrar, _token, _uuid, _symbol, _name, _conversionRate, _requester) => { + assert.equal(event.event, "RegisteredBrandedToken"); + if (Number.isInteger(_conversionRate)) { + _conversionRate = new BigNumber(_conversionRate); + } + + assert.equal(event.args._registrar, _registrar); + assert.equal(event.args._token, _token); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._symbol, _symbol); + assert.equal(event.args._name, _name); + assert.equal(event.args._conversionRate.toNumber(), _conversionRate.toNumber()); + assert.equal(event.args._requester, _requester); +} + +module.exports.checkRegisteredBrandedTokenEventOnProtocol = (formattedDecodedEvents, _registrar, _token, _uuid, _symbol, _name, _conversionRate, _requester) => { + + var event = formattedDecodedEvents['RegisteredBrandedToken']; + + assert.notEqual(event, null); + + if (Number.isInteger(_conversionRate)) { + _conversionRate = new BigNumber(_conversionRate); + } + + assert.equal(event._registrar, _registrar); + assert.equal(event._token, _token); + assert.equal(event._uuid, _uuid); + assert.equal(event._symbol, _symbol); + assert.equal(event._name, _name); + assert.equal(event._conversionRate, _conversionRate.toNumber()); + assert.equal(event._requester, _requester); +} + +module.exports.checkStakingIntentConfirmedEvent = (event, _uuid, _stakingIntentHash, _staker, _beneficiary, _amountST, _amountUT, _expirationHeight) => { + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + if (Number.isInteger(_amountUT)) { + _amountUT = new BigNumber(_amountUT); + } + + if (Number.isInteger(_expirationHeight)) { + _expirationHeight = new BigNumber(_expirationHeight); + } + + assert.equal(event.event, "StakingIntentConfirmed"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._stakingIntentHash, _stakingIntentHash); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); + assert.equal(event.args._amountUT.toNumber(), _amountUT.toNumber()); + assert.equal(event.args._expirationHeight.toNumber(), _expirationHeight.toNumber()); +} + +module.exports.checkStakingIntentConfirmedEventOnProtocol = (formattedDecodedEvents, _uuid, _stakingIntentHash, + _staker, _beneficiary, _amountST, _amountUT) => { + + var event = formattedDecodedEvents['StakingIntentConfirmed']; + + assert.notEqual(event, null); + + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + if (Number.isInteger(_amountUT)) { + _amountUT = new BigNumber(_amountUT); + } + + assert.equal(event._uuid, _uuid); + assert.equal(event._stakingIntentHash, _stakingIntentHash); + assert.equal(event._staker, _staker); + assert.equal(event._beneficiary, _beneficiary); + assert.equal(event._amountST, _amountST.toNumber()); + assert.equal(event._amountUT, _amountUT.toNumber()); +} + +module.exports.checkProcessedMintEvent = (event, _uuid, _stakingIntentHash, _token, _staker, _beneficiary, _amount, _unlockSecret) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + + assert.equal(event.event, "ProcessedMint"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._stakingIntentHash, _stakingIntentHash); + assert.equal(event.args._token, _token); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amount.toNumber(), _amount.toNumber()); + assert.equal(event.args._unlockSecret, _unlockSecret); +} + +module.exports.checkRedemptionIntentDeclaredEvent = (event, _uuid, _redemptionIntentHash, _token, _redeemer, _nonce, _beneficiary, _amount, _unlockHeight, _chainIdValue) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + + if (Number.isInteger(_nonce)) { + _nonce = new BigNumber(_nonce); + } + + if (Number.isInteger(_unlockHeight)) { + _unlockHeight = new BigNumber(_unlockHeight); + } + + if (Number.isInteger(_chainIdValue)) { + _chainIdValue = new BigNumber(_chainIdValue); + } + + assert.equal(event.event, "RedemptionIntentDeclared"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._redemptionIntentHash, _redemptionIntentHash); + assert.equal(event.args._token, _token); + assert.equal(event.args._redeemer, _redeemer); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._nonce.toNumber(), _nonce.toNumber()); + assert.equal(event.args._amount.toNumber(), _amount.toNumber()); + assert.equal(event.args._unlockHeight.toNumber(), _unlockHeight.toNumber()); + assert.equal(event.args._chainIdValue.toNumber(), _chainIdValue.toNumber()); +} + +module.exports.checkProcessedRedemptionEvent = (event, _uuid, _redemptionIntentHash, _token, _redeemer, _beneficiary, _amount, _unlockSecret) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + } + + assert.equal(event.event, "ProcessedRedemption"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._redemptionIntentHash, _redemptionIntentHash); + assert.equal(event.args._token, _token); + assert.equal(event.args._redeemer, _redeemer); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amount.toNumber(), _amount.toNumber()); + assert.equal(event.args._unlockSecret, _unlockSecret); +} + +module.exports.checkRevertedMintEvent = (event, _uuid, _stakingIntentHash, _staker, _beneficiary, _amount) => { + _amount = new BigNumber(_amount); + + + assert.equal(event.event, "RevertedMint"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._stakingIntentHash, _stakingIntentHash); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amountUT.toNumber(), _amount.toNumber()); +} + +module.exports.checkRevertedRedemption = (event, _uuid, _redemptionIntentHash, _redeemer, _beneficiary, _amountUT) => { + _amountUT = new BigNumber(_amountUT); + + assert.equal(event.event, "RevertedRedemption"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._redemptionIntentHash, _redemptionIntentHash); + assert.equal(event.args._redeemer, _redeemer); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amountUT.toNumber(), _amountUT.toNumber()); + +} diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js new file mode 100644 index 00000000..e7949d2d --- /dev/null +++ b/test/OpenSTValue.js @@ -0,0 +1,757 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: OpenSTValue.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Utils = require('./lib/utils.js'); +const HashLock = require('./lib/hash_lock.js'); +const OpenSTValue_utils = require('./OpenSTValue_utils.js'); +const Core = artifacts.require("./Core.sol"); +const SimpleStake = artifacts.require("./SimpleStake.sol"); +const BigNumber = require('bignumber.js'); + +/// +/// Test stories +/// +/// Properties +/// has chainIdValue +/// has valueToken +/// has registrar +/// +/// AddCore +/// fails to add core by non-registrar +/// fails to add core by registrar when core is null +/// fails to add core when registrar != core.registrar +/// fails to add core when core.chainIdRemote is null // Cannot test because Core cannot be deployed with null chainIdRemote +/// successfully adds core +/// fails to add core if already exists +/// +/// RegisterUtilityToken +/// fails to register by non-registrar +/// fails to register when name is empty +/// fails to register when symbol is empty +/// fails to register when conversion rate is not > 0 +/// fails to register when core.openSTRemote is null // Cannot test because Core cannot be deployed with null openSTRemote +/// fails to register when the given UUID does not match the calculated hash +/// successfully registers +/// fails to register if already exists +/// +/// Stake +/// when the staking account is null +/// fails to stake when amount is not > 0 +/// fails to stake when msg.sender has not approved it to transfer at least the amount +/// fails to stake when the SimpleStake address for the given UUID is null +/// fails to stake when the beneficiary is null +/// successfully stakes +/// when the staking account is not null +/// fails to stake when msg.sender is not the stakingAccount +/// successfully stakes +/// +/// ProcessStaking +/// fails to process when stakingIntentHash is empty +/// fails to process if hash of unlockSecret does not match hashlock +/// successfully processes +/// fails to reprocess +/// +/// ConfirmRedemptionIntent +/// fails to confirm by non-registrar +/// fails to confirm when utility token does not have a simpleStake address +/// fails to confirm when amountUT is not > 0 +/// fails to confirm when redemptionUnlockHeight is not > 0 +/// fails to confirm when redemptionIntentHash is empty +/// fails to confirm when nonce is not exactly 1 greater than previously +/// fails to confirm when redemptionIntentHash does not match calculated hash +/// fails to confirm when token balance of stake is not >= amountST +/// successfully confirms +/// fails to confirm a replay +/// fails to confirm when amountUT does not convert into at least 1 STWei // Fails +/// +/// ProcessUnstaking +/// when expirationHeight is > block number +/// fails to process when redemptionIntentHash is empty +/// fails to process if hash of unlockSecret does not match hashlock +/// fails to process when utility token does not have a simpleStake address +/// successfully processes +/// fails to reprocess +/// when expirationHeight is < block number // TBD: how or where to test this practically +/// + +contract('OpenSTValue', function(accounts) { + const chainIdValue = 3; + const chainIdRemote = 1410; + const openSTRemote = accounts[4]; + const registrar = accounts[1]; + + const symbol = "ST"; + const name = "Simple Token"; + const conversionRateDecimals = 5; + const conversionRate = new BigNumber(10 * 10**conversionRateDecimals); // conversion rate => 10 + + var valueToken = null + , openSTValue = null + , core = null + , checkUuid = null + ,result = null + , hasher = null + , stakingIntentHash + , stake = null + , nonce = null + , workers = null + ; + + describe('Properties', async () => { + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + workers = contracts.workers; + }) + + it('has chainIdValue', async () => { + assert.equal(await openSTValue.chainIdValue.call(), chainIdValue); + }) + + it('has valueToken', async () => { + assert.equal(await openSTValue.valueToken.call(), valueToken.address); + }) + + it('has registrar', async () => { + assert.equal(await openSTValue.registrar.call(), registrar); + }) + }) + + describe('AddCore', async () => { + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + }) + + it('fails to add core by non-registrar', async () => { + await Utils.expectThrow(openSTValue.addCore(core.address, { from: accounts[0] })); + }) + + it('fails to add core by registrar when core is null', async () => { + await Utils.expectThrow(openSTValue.addCore(0, { from: registrar })); + }) + + it('successfully adds core', async () => { + assert.equal(await openSTValue.addCore.call(core.address, { from: registrar }), true); + await openSTValue.addCore(core.address, { from: registrar }); + }) + + it('fails to add core if already exists', async () => { + await Utils.expectThrow(openSTValue.addCore(core.address, { from: registrar })); + }) + }) + + describe('RegisterUtilityToken', async () => { + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + }) + + it('fails to register by non-registrar', async () => { + await Utils.expectThrow(openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: accounts[0] })); + }) + + it('fails to register when name is empty', async () => { + await Utils.expectThrow(openSTValue.registerUtilityToken(symbol, "", conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar })); + }) + + it('fails to register when symbol is empty', async () => { + await Utils.expectThrow(openSTValue.registerUtilityToken("", name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar })); + }) + + it('fails to register when conversion rate is not > 0', async () => { + await Utils.expectThrow(openSTValue.registerUtilityToken(symbol, name, 0, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar })); + }) + + it('fails to register when the given UUID does not match the calculated hash', async () => { + await Utils.expectThrow(openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, "bad checkUuid", { from: registrar })); + }) + + it('successfully registers', async () => { + assert.equal(await openSTValue.getUuidsSize.call(), 0); + assert.equal(await openSTValue.registerUtilityToken.call(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }), checkUuid); + result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + + // Stake address is returned by UtilityTokenRegistered but verified below rather than by checkUtilityTokenRegisteredEvent + OpenSTValue_utils.checkUtilityTokenRegisteredEvent(result.logs[0], checkUuid, symbol, name, 18, conversionRate, chainIdRemote, 0); + var simpleStake = new SimpleStake(result.logs[0].args.stake); + assert.equal(await simpleStake.uuid.call(), checkUuid); + assert.equal(await simpleStake.eip20Token.call(), valueToken.address); + assert.equal(await openSTValue.getUuidsSize.call(), 1); + assert.equal((await openSTValue.utilityTokens.call(checkUuid))[0], symbol); + }) + + it('fails to register if already exists', async () => { + await Utils.expectThrow(openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar })); + }) + }) + + describe('Stake', async () => { + const amountST = new BigNumber(web3.toWei(1, "ether")); + const lock = HashLock.getHashLock(); + + context('when the staking account is null', async () => { + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + }) + + it('fails to stake when amount is not > 0', async () => { + await Utils.expectThrow(openSTValue.stake(checkUuid, 0, accounts[0], lock.l, accounts[0], { from: accounts[0] })); + }) + + it('fails to stake when msg.sender has not approved it to transfer at least the amount', async () => { + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] })); + }) + + it('fails to stake when the SimpleStake address for the given UUID is null', async () => { + await valueToken.approve(openSTValue.address, amountST, { from: accounts[0] }); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] })); + }) + + it('fails to stake when the beneficiary is null', async () => { + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, 0, lock.l, accounts[0], { from: accounts[0] })); + }) + + it('successfully stakes', async () => { + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + var amountUT = stakeReturns[0].toNumber(); + nonce = stakeReturns[1].toNumber(); + + // call block number is one less than send block number + var unlockHeight = stakeReturns[2].plus(1); + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, + amountUT, unlockHeight, lock.l); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, accounts[0], + amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); + }) + }) + + context('when the staking account is not null', async () => { + + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, accounts[0], checkUuid, { from: registrar }); + await valueToken.approve(openSTValue.address,amountST, { from: accounts[0] }); + }) + + it('fails to stake when msg.sender is not the stakingAccount', async () => { + await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[1], { from: accounts[1] })); + }) + + it('successfully stakes', async () => { + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + var amountUT = stakeReturns[0].toNumber(); + nonce = stakeReturns[1].toNumber(); + + // call block number is one less than send block number + var unlockHeight = stakeReturns[2].plus(1); + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, + amountUT, unlockHeight, lock.l); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, accounts[0], + amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); + }) + }) + }) + + describe('ProcessStaking', async () => { + const amountST = new BigNumber(web3.toWei(1, "ether")), + amountUT = amountST.mul(new BigNumber(conversionRate)).div(new BigNumber(10**conversionRateDecimals)); + const lock = HashLock.getHashLock(); + + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + stake = result.logs[0].args.stake; + await valueToken.approve(openSTValue.address, amountST, { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + stakingIntentHash = result.logs[0].args._stakingIntentHash; + }) + + it('fails to process when stakingIntentHash is empty', async () => { + await Utils.expectThrow(openSTValue.processStaking("", lock.s, { from: accounts[0] })); + }) + + it('fails to process if hash of unlockSecret does not match hashlock', async () => { + const differentLock = HashLock.getHashLock(); + // registrar can additionally as a fallback process staking in v0.9 + await Utils.expectThrow(openSTValue.processStaking(stakingIntentHash, differentLock.s, { from: accounts[5] })); + }) + + it('successfully processes', async () => { + var openSTValueBal = await valueToken.balanceOf.call(openSTValue.address); + var stakeBal = await valueToken.balanceOf.call(stake); + assert.equal(openSTValueBal.toNumber(), amountST); + assert.equal(stakeBal.toNumber(), 0); + result = await openSTValue.processStaking(stakingIntentHash, lock.s, { from: accounts[0] }); + + openSTValueBal = await valueToken.balanceOf.call(openSTValue.address); + stakeBal = await valueToken.balanceOf.call(stake); + assert.equal(openSTValueBal.toNumber(), 0); + assert.equal(stakeBal.toNumber(), amountST); + await OpenSTValue_utils.checkProcessedStakeEvent(result.logs[0], checkUuid, stakingIntentHash, stake, accounts[0], amountST, amountUT, lock.s); + }) + + it('fails to reprocess', async () => { + await Utils.expectThrow(openSTValue.processStaking(stakingIntentHash, lock.s, { from: accounts[0] })); + }) + }) + + describe('ConfirmRedemptionIntent', async () => { + // Using accounts[2] as redeemer to confirm that redemption/unstaking is not limited to the staker + var redeemer = accounts[2]; + var redeemBeneficiary = accounts[3]; + var redemptionIntentHash = null; + var redemptionUnlockHeight = 80668; + var amountUT = conversionRate.div(new BigNumber(10**conversionRateDecimals)); + + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + stake = result.logs[0].args.stake; + nonce = await openSTValue.getNextNonce.call(redeemer); + }) + + it('fails to confirm by non-registrar', async () => { + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: accounts[0] })); + }) + + it('fails to confirm when utility token does not have a simpleStake address', async () => { + // Recalculate hash to confirm that it is not the error + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + }) + + it('fails to confirm when amountUT is not > 0', async () => { + // Recalculate hash to confirm that it is not the error + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + }) + + it('fails to confirm when redemptionUnlockHeight is not > 0', async () => { + // Recalculate hash to confirm that it is not the error + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0, lockR.l, redemptionIntentHash, { from: registrar })); + }) + + it('fails to confirm when redemptionIntentHash is empty', async () => { + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, "", { from: registrar })); + }) + + it('fails to confirm when nonce is not exactly 1 greater than previously', async () => { + // Recalculate hash to confirm that it is not the error + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + }) + + it('fails to confirm when redemptionIntentHash does not match calculated hash', async () => { + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, "bad hash", { from: registrar })); + }) + + it('fails to confirm when token balance of stake is not >= amountST', async () => { + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + }) + + it('successfully confirms', async () => { + await valueToken.approve(openSTValue.address, 2, { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, 2, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + stakingIntentHash = result.logs[0].args._stakingIntentHash; + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: accounts[0] }); + + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + var confirmReturns = await openSTValue.confirmRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }) + var amountST = confirmReturns[0]; + assert.equal(amountST, (amountUT / conversionRate)*10**conversionRateDecimals); + + result = await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); + var blocks_to_wait_short = await openSTValue.blocksToWaitShort.call(); + + var blockNumber = web3.eth.blockNumber; + var expirationHeight = blockNumber + blocks_to_wait_short.toNumber(); + await OpenSTValue_utils.checkRedemptionIntentConfirmedEvent(result.logs[0], checkUuid, redemptionIntentHash, redeemer, redeemBeneficiary, amountST, amountUT, expirationHeight); + + }) + + it('fails to confirm a replay', async () => { + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + }) + + // Fails because logic does not prevent attempting to redeem 1 UTWei when the conversion rate is greater than 1 + it('fails to confirm when amountUT does not convert into at least 1 STWei', async () => { + nonce = await openSTValue.getNextNonce.call(redeemer); + + // 1 STWei == 10 UTWei at the given conversion rate + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight, lockR.l); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + }) + }) + + describe('ProcessUnstaking', async () => { + var redeemer = accounts[2]; + var redeemBeneficiary = accounts[3]; + var notRedeemer = accounts[5]; + var redemptionIntentHash = null; + var redemptionUnlockHeight = 80668; + var amountUT = conversionRate.div(new BigNumber(10**conversionRateDecimals)); + + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + context('when expirationHeight is > block number', async () => { + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + stake = result.logs[0].args.stake; + nonce = await openSTValue.getNextNonce.call(redeemer); + await valueToken.approve(openSTValue.address, 1, { from: accounts[0] }); + result = await openSTValue.stake(checkUuid, 1, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + stakingIntentHash = result.logs[0].args._stakingIntentHash; + await openSTValue.processStaking(stakingIntentHash, lock.s,{ from: accounts[0] }); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); + }) + + it('fails to process when redemptionIntentHash is empty', async () => { + await Utils.expectThrow(openSTValue.processUnstaking("", lockR.s, { from: notRedeemer })); + }) + + it('fails to process if hash of unlockSecret does not match hashlock', async () => { + await Utils.expectThrow(openSTValue.processUnstaking(redemptionIntentHash, "incorrect unlock secret", { from: notRedeemer })); + }) + + it('fails to process when utility token does not have a simpleStake address', async () => { + await Utils.expectThrow(openSTValue.processUnstaking("bad hash", lockR.s, { from: notRedeemer })); + }) + + it('successfully processes', async () => { + var stakeBal = await valueToken.balanceOf.call(stake); + var redeemBeneficiaryBal = await valueToken.balanceOf.call(redeemer); + assert.equal(stakeBal.toNumber(), 1); + assert.equal(redeemBeneficiaryBal.toNumber(), 0); + result = await openSTValue.processUnstaking(redemptionIntentHash, lockR.s, { from: redeemer }); + + stakeBal = await valueToken.balanceOf.call(stake); + redeemBeneficiaryBal = await valueToken.balanceOf.call(redeemBeneficiary); + assert.equal(stakeBal.toNumber(), 0); + assert.equal(redeemBeneficiaryBal.toNumber(), 1); + await OpenSTValue_utils.checkProcessedUnstakeEvent(result.logs[0], checkUuid, redemptionIntentHash, stake, redeemer, redeemBeneficiary, 1, lockR.s); + }) + + it('fails to reprocess', async () => { + await Utils.expectThrow(openSTValue.processUnstaking(redemptionIntentHash, lockR.s, { from: notRedeemer })); + }) + }) + }) + + + // Revert Staking before ProcessStaking + describe('Process RevertStaking before ProcessStaking', async () => { + + const lock = HashLock.getHashLock(); + + context('Revert Stake', async () => { + + var staker = accounts[0]; + var owner = accounts[1]; + var amountST = new BigNumber(web3.toWei(126, "ether")); + var amountUT = null; + var unlockHeight = null; + + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); + await valueToken.approve(openSTValue.address, amountST, { from: staker }); + + //Successfully Staking + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, lock.l, staker, { from: staker }); + amountUT = stakeReturns[0].toNumber(); + nonce = stakeReturns[1].toNumber(); + + // call block number is one less than send block number + unlockHeight = stakeReturns[2].plus(1); + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); + + }); + + it('fails to process when stakingIntentHash is empty', async () => { + + await Utils.expectThrow(openSTValue.revertStaking("", {from: staker})); + + }); + + it('fails to process when stakingIntentHash is Bad Hash', async () => { + + await Utils.expectThrow(openSTValue.revertStaking("Bad Hash", {from: staker})); + + }); + + it('fails to process when reverting before waiting period ends', async () => { + // for test of the test case lets make sure that waiting period is ended + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber()-3; + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (var i = 0; i < waitTime ; i++) { + await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); + } + + }); + + it('success processing revert staking', async () => { + + var result = await openSTValue.revertStaking(stakingIntentHash, {from: staker}); + OpenSTValue_utils.checkRevertStakingEventProtocol(result.logs[0], checkUuid, stakingIntentHash, staker, amountST, amountUT); + + }); + + it('fails to process revert staking', async () => { + + await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); + + }); + + }) + + // Revert Staking After ProcessStaking + context('Revert Staking After ProcessStaking', async () => { + var staker = accounts[0]; + var owner = accounts[1]; + var amountST = new BigNumber(web3.toWei(126, "ether")); + var amountUT = null; + var unlockHeight = null; + + before(async () => { + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); + await valueToken.approve(openSTValue.address, amountST, { from: staker }); + + //Successfully Staking + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, staker, lock.l, staker, { from: staker }); + amountUT = stakeReturns[0].toNumber(); + nonce = stakeReturns[1].toNumber(); + + // call block number is one less than send block number + unlockHeight = stakeReturns[2].plus(1); + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, + amountUT, unlockHeight, lock.l); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); + + // Process Staking + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); + }); + + it('fails to process when reverting before waiting period ends', async () => { + + // for test of the test case lets make sure that waiting period is ended + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber()-1; + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (var i = 0; i < waitTime; i++) { + await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); + } + + }) + + it('fails to process revert staking', async () => { + + await Utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, {from: staker})); + + }); + + + }); + + }); + + // Revert Unstaking + describe('Revert Unstaking', async () => { + + var staker = accounts[0]; + var redeemer = accounts[2]; + var redeemBeneficiary = accounts[3]; + var redemptionIntentHash = null; + var redemptionUnlockHeight = 80668; + var amountST = new BigNumber(web3.toWei(1, "ether")); + var amountUT = (new BigNumber(amountST * conversionRate)).div(new BigNumber(10**conversionRateDecimals)); + var externalUser = accounts[7]; + + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + context('Revert Unstaking before ProcessUnstaking ', async () => { + before(async () => { + + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); + stake = result.logs[0].args.stake; + nonce = await openSTValue.getNextNonce.call(redeemer); + await valueToken.approve(openSTValue.address, amountST, { from: staker }); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); + stakingIntentHash = result.logs[0].args._stakingIntentHash; + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); + + }); + + + it('fails to process when redemptionIntentHash is empty ', async () => { + + await Utils.expectThrow(openSTValue.revertUnstaking("", { from: externalUser })); + + }); + + it('fails to process when redemptionIntentHash is Bad Hash ', async () => { + + await Utils.expectThrow(openSTValue.revertUnstaking("Bad Hash", { from: externalUser })); + + }); + + it('fails to process when reverting before waiting period ends', async () => { + + // for test of the test case lets make sure that waiting period is ended + var waitTime = await openSTValue.blocksToWaitShort.call(); + waitTime = waitTime.toNumber() - 3; + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (var i = 0; i < waitTime ; i++) { + await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); + } + + }); + + + it('success processing revert unstaking', async () => { + + var revertUnstakingResult = await openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser }); + await OpenSTValue_utils.checkRevertedUnstake(revertUnstakingResult.logs[0], checkUuid, redemptionIntentHash,redeemer, redeemBeneficiary, amountST); + + }); + + it('fails to process when revertUnstaking once its already done', async () => { + + await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); + + }); + + }); + + context('Revert Unstaking after ProcessUnstaking ', async () => { + before(async () => { + + contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); + valueToken = contracts.valueToken; + openSTValue = contracts.openSTValue; + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); + result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); + stake = result.logs[0].args.stake; + nonce = await openSTValue.getNextNonce.call(redeemer); + await valueToken.approve(openSTValue.address, amountST, { from: staker }); + result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); + stakingIntentHash = result.logs[0].args._stakingIntentHash; + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); + + + // Successfull ProcessUnstaking + processUnstakingResult = await openSTValue.processUnstaking(redemptionIntentHash, lockR.s, { from: redeemer }); + await OpenSTValue_utils.checkProcessedUnstakeEvent(processUnstakingResult.logs[0], checkUuid, redemptionIntentHash, stake, redeemer, redeemBeneficiary, amountST, lockR.s); + + }); + + + it('fails to process when revertUnstaking once its already done', async () => { + + var waitTime = await openSTValue.blocksToWaitShort.call(); + waitTime = waitTime.toNumber() - 1; + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (var i = 0; i < waitTime ; i++) { + await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); + } + await Utils.expectThrow(openSTValue.revertUnstaking(redemptionIntentHash, { from: externalUser })); + + }); + + }); + + }); + +}) diff --git a/test/OpenSTValue_utils.js b/test/OpenSTValue_utils.js new file mode 100644 index 00000000..c4238d50 --- /dev/null +++ b/test/OpenSTValue_utils.js @@ -0,0 +1,278 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: OpenSTValue_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); + +//var OpenSTValue = artifacts.require("./OpenSTValue.sol"); +var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); +var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); +var Workers = artifacts.require("./Workers.sol"); + +/// @dev Deploy +module.exports.deployOpenSTValue = async (artifacts, accounts) => { + const chainIdValue = 3 + , valueToken = await SimpleToken.new() + , registrar = accounts[1] + , admin = accounts[2] + , ops = accounts[3] + , deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")) + ; + + // Set SimpleToken admin in order to finalize SimpleToken + await valueToken.setAdminAddress(accounts[1]); + // SimpleToken must be finalized to permit certain transfers + assert.ok(await valueToken.finalize({ from: accounts[1] })); + + const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); + + //Set SimpleToken admin in order to finalize SimpleToken + await valueToken.setAdminAddress(admin); + + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); + + return { + valueToken : valueToken, + openSTValue : openSTValue, + workers: workers + } +} + +// Stake address is returned by UtilityTokenRegistered but verified elsewhere +module.exports.checkUtilityTokenRegisteredEvent = (event, _uuid, _symbol, _name, _decimals, _conversionRate, _chainIdUtility, _stakingAccount) => { + if (Number.isInteger(_decimals)) { + _decimals = new BigNumber(_decimals); + } + + if (Number.isInteger(_conversionRate)) { + _conversionRate = new BigNumber(_conversionRate); + } + + assert.equal(event.event, "UtilityTokenRegistered"); + assert.equal(event.args._uuid, _uuid); + // TODO: re-evaluate checking + // assert.equal(event.args.stake, stake); + assert.equal(event.args._symbol, _symbol); + assert.equal(event.args._name, _name); + assert.equal(event.args._decimals.toNumber(), _decimals); + assert.equal(event.args._conversionRate.toNumber(), _conversionRate); + assert.equal(event.args._chainIdUtility, _chainIdUtility); + assert.equal(event.args._stakingAccount, _stakingAccount); +} + +module.exports.checkUtilityTokenRegisteredEventOnProtocol = (formattedDecodedEvents, _uuid, _symbol, _name, _decimals, _conversionRate, _chainIdUtility, _stakingAccount) => { + + var event = formattedDecodedEvents['UtilityTokenRegistered']; + + assert.notEqual(event, null); + + if (Number.isInteger(_decimals)) { + _decimals = new BigNumber(_decimals); + } + + if (Number.isInteger(_conversionRate)) { + _conversionRate = new BigNumber(_conversionRate); + } + + assert.equal(event._uuid, _uuid); + // assert.equal(event.args.stake, stake); + assert.equal(event._symbol, _symbol); + assert.equal(event._name, _name); + assert.equal(event._decimals, _decimals); + assert.equal(event._conversionRate, _conversionRate); + assert.equal(event._chainIdUtility, _chainIdUtility); + assert.equal(event._stakingAccount, _stakingAccount); +} + +module.exports.checkStakingIntentDeclaredEvent = (event, _uuid, _staker, _stakerNonce, _beneficiary, _amountST, _amountUT, _unlockHeight, _stakingIntentHash, _chainIdUtility) => { + if (Number.isInteger(_stakerNonce)) { + _stakerNonce = new BigNumber(_stakerNonce); + } + + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + if (Number.isInteger(_amountUT)) { + _amountUT = new BigNumber(_amountUT); + } + + if (Number.isInteger(_unlockHeight)) { + _unlockHeight = new BigNumber(_unlockHeight); + } + + assert.equal(event.event, "StakingIntentDeclared"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._stakerNonce.toNumber(), _stakerNonce.toNumber()); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); + assert.equal(event.args._amountUT.toNumber(), _amountUT.toNumber()); + assert.equal(event.args._unlockHeight.toNumber(), _unlockHeight.toNumber()); + assert.equal(event.args._stakingIntentHash, _stakingIntentHash); + assert.equal(event.args._chainIdUtility, _chainIdUtility); +} + +module.exports.checkStakingIntentDeclaredEventProtocol = (event, _uuid, _staker, _stakerNonce, _beneficiary, + _amountST, _amountUT, _chainIdUtility) => { + + if (Number.isInteger(_stakerNonce)) { + _stakerNonce = new BigNumber(_stakerNonce); + } + + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + if (Number.isInteger(_amountUT)) { + _amountUT = new BigNumber(_amountUT); + } + + if (Number.isInteger(_chainIdUtility)) { + _chainIdUtility = new BigNumber(_chainIdUtility); + } + + assert.equal(event.event, "StakingIntentDeclared"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._stakerNonce.toNumber(), _stakerNonce.toNumber()); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); + assert.equal(event.args._amountUT.toNumber(), _amountUT.toNumber()); + assert.equal(event.args._chainIdUtility.toNumber(), _chainIdUtility.toNumber()); +} + +module.exports.checkProcessedStakeEvent = (event, _uuid, _stakingIntentHash, _stake, _staker, _amountST, _amountUT, _unlockSecret) => { + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + if (Number.isInteger(_amountUT)) { + _amountUT = new BigNumber(_amountUT); + } + + assert.equal(event.event, "ProcessedStake"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._stakingIntentHash, _stakingIntentHash); + assert.equal(event.args._stake, _stake); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); + assert.equal(event.args._amountUT.toNumber(), _amountUT.toNumber()); + assert.equal(event.args._unlockSecret, _unlockSecret); +} + +module.exports.checkRedemptionIntentConfirmedEvent = (event, _uuid, _redemptionIntentHash, _redeemer, _beneficiary, _amountST, _amountUT, _expirationHeight) => { + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + if (Number.isInteger(_amountUT)) { + _amountUT = new BigNumber(_amountUT); + } + + if (Number.isInteger(_expirationHeight)) { + _expirationHeight = new BigNumber(_expirationHeight); + } + + assert.equal(event.event, "RedemptionIntentConfirmed"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._redemptionIntentHash, _redemptionIntentHash); + assert.equal(event.args._redeemer, _redeemer); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); + assert.equal(event.args._amountUT.toNumber(), _amountUT.toNumber()); + assert.equal(event.args._expirationHeight.toNumber(), _expirationHeight.toNumber()); +} + +module.exports.checkRedemptionIntentConfirmedEventOnProtocol = (formattedDecodedEvents, uuid, _redemptionIntentHash, _redeemer, _beneficiary, _amountST, _amountUT) => { + var event = formattedDecodedEvents['RedemptionIntentConfirmed']; + assert.notEqual(event, null); + + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + if (Number.isInteger(_amountUT)) { + _amountUT = new BigNumber(_amountUT); + } + + var _unlockHeight = new BigNumber(event._expirationHeight); + + assert.equal(event._uuid, uuid); + assert.equal(event._redemptionIntentHash, _redemptionIntentHash); + assert.equal(event._redeemer, _redeemer); + assert.equal(event._beneficiary, _beneficiary); + assert.equal(event._amountST, _amountST.toNumber()); + assert.equal(event._amountUT, _amountUT.toNumber()); + assert.isAbove(_unlockHeight.toNumber(), 0); +} + +module.exports.checkProcessedUnstakeEvent = (event, _uuid, _redemptionIntentHash, stake, _redeemer, _beneficiary, _amountST, _unlockSecret) => { + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + assert.equal(event.event, "ProcessedUnstake"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._redemptionIntentHash, _redemptionIntentHash); + assert.equal(event.args.stake, stake); + assert.equal(event.args._redeemer, _redeemer); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); + assert.equal(event.args._unlockSecret, _unlockSecret); +} + +module.exports.checkRevertStakingEventProtocol = (event, _uuid, _stakingIntentHash, _staker, _amountST, _amountUT) => { + + if (Number.isInteger(_amountUT)) { + _amountUT = new BigNumber(_amountUT); + } + + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + assert.equal(event.event, "RevertedStake"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._staker, _staker); + assert.equal(event.args._stakingIntentHash, _stakingIntentHash); + assert.equal(event.args._amountST, _amountST.toNumber()); + assert.equal(event.args._amountUT, _amountUT.toNumber()); +} + +module.exports.checkRevertedUnstake = (event, _uuid, _redemptionIntentHash, _redeemer, _beneficiary, _amountST) => { + + if (Number.isInteger(_amountST)) { + _amountST = new BigNumber(_amountST); + } + + assert.equal(event.event, "RevertedUnstake"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._redemptionIntentHash, _redemptionIntentHash); + assert.equal(event.args._redeemer, _redeemer); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amountST, _amountST.toNumber()); + +} diff --git a/test/OpsManaged.js b/test/OpsManaged.js new file mode 100644 index 00000000..281cf51b --- /dev/null +++ b/test/OpsManaged.js @@ -0,0 +1,162 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: OpsManaged.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js') + +const Utils = require('./lib/utils.js') +const OpsManagedUtils = require('./OpsManaged_utils.js'); + +const OpsManaged = artifacts.require("./OpsManaged.sol") + + +// +// Basic properties +// owner +// adminAddress +// opsAddress +// +// setAdminAddress +// setAdminAddress to owner +// setAdminAddress to this +// setAdminAddress to ops address +// setAdminAddress to account[1] +// setAdminAddress to 0 +// +// setOpsAddress +// setOpsAddress to owner +// setOpsAddress to this +// setOpsAddress to ops address +// setOpsAddress to account[1] +// setOpsAddress to 0 +// + +contract('OpsManaged', (accounts) => { + + + async function createOpsManaged() { + return await OpsManaged.new() + } + + + describe('Basic properties', async () => { + + var instance = null + + before(async () => { + instance = await createOpsManaged() + }) + + + it("owner", async () => { + assert.equal(await instance.owner.call(), accounts[0]) + }) + + it("adminAddress", async () => { + assert.equal(await instance.adminAddress.call(), 0) + }) + + it("opsAddress", async () => { + assert.equal(await instance.opsAddress.call(), 0) + }) + }) + + + describe('setAdminAddress', async () => { + + var instance = null + + before(async () => { + instance = await createOpsManaged() + }) + + + it("to the owner", async () => { + const owner = await instance.owner.call() + await Utils.expectThrow(instance.setAdminAddress.call(owner)) + }) + + it("to 'this'", async () => { + await Utils.expectThrow(instance.setAdminAddress.call(instance.address)) + }) + + it("to ops address", async () => { + assert.equal(await instance.setOpsAddress.call(accounts[2]), true) + await instance.setOpsAddress(accounts[2]) + + await Utils.expectThrow(instance.setAdminAddress.call(accounts[2])) + }) + + it("to accounts[1]", async () => { + assert.equal(await instance.adminAddress.call(), 0) + assert.equal(await instance.setAdminAddress.call(accounts[1]), true) + OpsManagedUtils.checkAdminAddressChangedEventGroup(await instance.setAdminAddress(accounts[1]), accounts[1]) + assert.equal(await instance.adminAddress.call(), accounts[1]) + }) + + it("to 0", async () => { + assert.equal(await instance.adminAddress.call(), accounts[1]) + assert.equal(await instance.setAdminAddress.call(0), true) + OpsManagedUtils.checkAdminAddressChangedEventGroup(await instance.setAdminAddress(0), 0) + assert.equal(await instance.adminAddress.call(), 0) + }) + }) + + + describe('setOpsAddress', async () => { + + var instance = null + + before(async () => { + instance = await createOpsManaged() + }) + + + it("to the owner", async () => { + const owner = await instance.owner.call() + await Utils.expectThrow(instance.setOpsAddress.call(owner)) + }) + + it("to 'this'", async () => { + await Utils.expectThrow(instance.setOpsAddress.call(instance.address)) + }) + + it("to ops address", async () => { + assert.equal(await instance.setAdminAddress.call(accounts[3]), true) + await instance.setAdminAddress(accounts[3]) + + await Utils.expectThrow(instance.setOpsAddress.call(accounts[3])) + }) + + it("to accounts[1]", async () => { + assert.equal(await instance.opsAddress.call(), 0) + assert.equal(await instance.setOpsAddress.call(accounts[1]), true) + OpsManagedUtils.checkOpsAddressChangedEventGroup(await instance.setOpsAddress(accounts[1]), accounts[1]) + assert.equal(await instance.opsAddress.call(), accounts[1]) + }) + + it("to 0", async () => { + assert.equal(await instance.opsAddress.call(), accounts[1]) + assert.equal(await instance.setAdminAddress.call(0), true) + OpsManagedUtils.checkOpsAddressChangedEventGroup(await instance.setOpsAddress(0), 0) + assert.equal(await instance.opsAddress.call(), 0) + }) + }) +}) diff --git a/test/OpsManaged_utils.js b/test/OpsManaged_utils.js new file mode 100644 index 00000000..7e8f2188 --- /dev/null +++ b/test/OpsManaged_utils.js @@ -0,0 +1,38 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: OpsManaged_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +module.exports.checkAdminAddressChangedEventGroup = (result, _newAddress) => { + assert.equal(result.logs.length, 1) + + const event = result.logs[0] + + assert.equal(event.event, "AdminAddressChanged") + assert.equal(event.args._newAddress, _newAddress) +} + +module.exports.checkOpsAddressChangedEventGroup = (result, _newAddress) => { + assert.equal(result.logs.length, 1) + + const event = result.logs[0] + + assert.equal(event.event, "OpsAddressChanged") + assert.equal(event.args._newAddress, _newAddress) +} \ No newline at end of file diff --git a/test/Owned.js b/test/Owned.js new file mode 100644 index 00000000..19008964 --- /dev/null +++ b/test/Owned.js @@ -0,0 +1,140 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Owned.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Utils = require('./lib/utils.js') +const OwnedUtils = require('./Owned_utils.js') + +const BigNumber = require('bignumber.js') + +const Owned = artifacts.require("./Owned.sol") + + +// +// Basic properties +// owner +// +// initiateOwnershipTransfer +// to 0 +// to this +// to current owner +// to accounts[1] as non-owner +// to accounts[1] +// +// completeOwnershipTransfer +// from accounts[2] +// from current owner +// from accounts[1] +// + +contract('OpsManaged', (accounts) => { + + + async function createOwned() { + return await Owned.new() + } + + + describe('Basic properties', async () => { + + var instance = null + + before(async () => { + instance = await createOwned() + }) + + + it("owner", async () => { + assert.equal(await instance.owner.call(), accounts[0]) + }) + + it("proposedOwner", async () => { + assert.equal(await instance.proposedOwner.call(), 0) + }) + }) + + + describe('initiateOwnershipTransfer', async () => { + + var instance = null + + before(async () => { + instance = await createOwned() + }) + + it("to 0", async () => { + assert.equal(await instance.initiateOwnershipTransfer.call(0), true) + OwnedUtils.checkOwnershipTransferInitiatedEventGroup(await instance.initiateOwnershipTransfer(0), 0) + }) + + it("to this", async () => { + assert.equal(await instance.initiateOwnershipTransfer.call(instance.address), true) + OwnedUtils.checkOwnershipTransferInitiatedEventGroup(await instance.initiateOwnershipTransfer(instance.address), instance.address) + }) + + it("to current owner", async () => { + const owner = await instance.owner.call() + assert.equal(await instance.initiateOwnershipTransfer.call(owner), true) + OwnedUtils.checkOwnershipTransferInitiatedEventGroup(await instance.initiateOwnershipTransfer(owner), owner) + }) + + it("to accounts[1] as non-owner", async () => { + await Utils.expectThrow(instance.initiateOwnershipTransfer.call(accounts[1], { from: accounts[2] })) + }) + + it("to accounts[1]", async () => { + assert.equal(await instance.initiateOwnershipTransfer.call(accounts[1]), true) + OwnedUtils.checkOwnershipTransferInitiatedEventGroup(await instance.initiateOwnershipTransfer(accounts[1]), accounts[1]) + }) + }) + + + describe('completeOwnershipTransfer', async () => { + + var instance = null + + before(async () => { + instance = await createOwned() + }) + + + it("from accounts[2]", async () => { + await Utils.expectThrow(instance.completeOwnershipTransfer.call({ from: accounts[2] })) + }) + + it("from current owner", async () => { + const owner = await instance.owner.call() + await Utils.expectThrow(instance.completeOwnershipTransfer.call({ from: owner })) + }) + + it("from account[1]", async () => { + assert.equal(await instance.owner.call(), accounts[0]) + assert.equal(await instance.proposedOwner.call(), 0) + await instance.initiateOwnershipTransfer(accounts[1]) + assert.equal(await instance.proposedOwner.call(), accounts[1]) + + assert.equal(await instance.completeOwnershipTransfer.call({ from: accounts[1] }), true) + OwnedUtils.checkOwnershipTransferCompletedEventGroup(await instance.completeOwnershipTransfer({ from: accounts[1] }), accounts[1]) + + assert.equal(await instance.owner.call(), accounts[1]) + assert.equal(await instance.proposedOwner.call(), 0) + }) + }) +}) diff --git a/test/Owned_utils.js b/test/Owned_utils.js new file mode 100644 index 00000000..4cb73e30 --- /dev/null +++ b/test/Owned_utils.js @@ -0,0 +1,37 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Owned_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +module.exports.checkOwnershipTransferInitiatedEventGroup = (result, _proposedOwner) => { + assert.equal(result.logs.length, 1) + + const event = result.logs[0] + + assert.equal(event.event, "OwnershipTransferInitiated") + assert.equal(event.args._proposedOwner, _proposedOwner) +} + +module.exports.checkOwnershipTransferCompletedEventGroup = (result) => { + assert.equal(result.logs.length, 1) + + const event = result.logs[0] + + assert.equal(event.event, "OwnershipTransferCompleted") +} \ No newline at end of file diff --git a/test/Protocol.js b/test/Protocol.js new file mode 100644 index 00000000..566a1c49 --- /dev/null +++ b/test/Protocol.js @@ -0,0 +1,1035 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: stake Simple Token for utility tokens and branded tokens +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); +const BigNumber = require('bignumber.js'); +const utils = require("./lib/utils.js"); +const HashLock = require('./lib/hash_lock.js'); +const openSTValueUtils = require("./OpenSTValue_utils.js"); +const openSTUtilityUtils = require('./OpenSTUtility_utils.js'); +const web3EventsDecoder = require('./lib/event_decoder.js'); + +const ProtocolUtils = require('./Protocol_utils.js'); + +const openSTUtilityArtifacts = artifacts.require("./OpenSTUtilityMock.sol"); +const openSTValueArtifacts = artifacts.require("./OpenSTValueMock.sol"); +const BrandedToken = artifacts.require("./BrandedToken.sol"); +const SimpleStake = artifacts.require("./SimpleStake.sol"); + +const CHAINID_VALUE = new BigNumber(2001); +const CHAINID_UTILITY = new BigNumber(2002); + +contract('OpenST', function(accounts) { + + const conversionRateDecimals = 5; + + const TOKEN_SYMBOL = "ST"; + const TOKEN_NAME = "Simple Token"; + const TOKEN_DECIMALS = 18; + const TOKENS_MAX = new BigNumber(web3.toWei(800000000, "ether")); + + const STPRIME_SYMBOL = "STP"; + const STPRIME_NAME = "SimpleTokenPrime"; + const STPRIME_CONVERSION_RATE = 1; + const STPRIME_CONVERSION_RATE_DECIMALS = 0; + + // Member Details + const symbol = "BT"; + const name = "Branded Token"; + const conversionRate = new BigNumber(10 * (10**conversionRateDecimals)); // conversion rate => 10 + + const deployMachine = accounts[0]; + const owner = accounts[1]; + const admin = accounts[2]; + const ops = accounts[3]; + const intercommVC = accounts[4]; + const intercommUC = accounts[5]; + const requester = accounts[6]; + const stakerVC = accounts[7]; + const stakerUC = accounts[8]; + const beneficiary = accounts[10]; + // account 9 and 19 have no base tokens + const redeemer = accounts[9]; + const redeemBeneficiary = accounts[19]; + + const AMOUNT_ST = new BigNumber(web3.toWei(1000, "ether")); + const AMOUNT_BT = (AMOUNT_ST.mul(conversionRate)).div(new BigNumber(10**conversionRateDecimals)); + const REDEEM_AMOUNT_BT = new BigNumber(web3.toWei(5, "ether")); + const FUND_AMOUNT_STPRIME = new BigNumber(web3.toWei(15, "ether")); + const REDEEM_AMOUNT_STPRIME = new BigNumber(web3.toWei(10, "ether")); + + describe('Setup Utility chain with Simple Token Prime', function () { + + var simpleToken = null; + var registrarVC = null; + var registrarUC = null; + var coreVC = null; + var openSTValue = null; + var openSTUtility = null; + var stPrime = null; + var btSimpleStake = null; + + var btSimpleStakeContractAddress = null; + var stPrimeSimpleStakeContractAddress = null; + var registeredBrandedTokenUuid = null; + var registeredBrandedToken = null; + var nonceBT = null; + var uuidSTP = null; + var nonceSTP = null; + var stakingIntentHash = null; + var unlockHeight = null; + var redemptionIntentHash = null; + var redeemedAmountST = null; + + before(async () => { + var contracts = await ProtocolUtils.deployOpenSTProtocol(artifacts, accounts); + simpleToken = contracts.token; + registrarVC = contracts.registrarVC; + registrarUC = contracts.registrarUC; + openSTValue = contracts.openSTValue; + openSTUtility = contracts.openSTUtility; + // core on VC to represent UC + coreVC = contracts.coreVC; + stPrime = contracts.stPrime; + }); + + context('deploy and configure utility chain', function() { + + it("add core to represent utility chain", async () => { + const o = await registrarVC.addCore(openSTValue.address, coreVC.address, { from: intercommVC }); + Assert.ok(o); + utils.logResponse(o, "RegistrarVC.addCore"); + Assert.equal(await openSTValue.core.call(CHAINID_UTILITY), coreVC.address); + }); + + it("register Simple Token Prime", async () => { + const uuidSTP = await openSTUtility.uuidSTPrime.call(); + Assert.notEqual(uuidSTP, ""); + + const o = await registrarVC.registerUtilityToken(openSTValue.address, STPRIME_SYMBOL, STPRIME_NAME, + STPRIME_CONVERSION_RATE, STPRIME_CONVERSION_RATE_DECIMALS, CHAINID_UTILITY, 0, uuidSTP, { from: intercommVC }); + + utils.logResponse(o, "RegistrarVC.registerUtilityToken (STP)"); + + var formattedDecodedEvents = web3EventsDecoder.perform(o.receipt, openSTValue.address, openSTValueArtifacts.abi); + + openSTValueUtils.checkUtilityTokenRegisteredEventOnProtocol(formattedDecodedEvents, uuidSTP, + STPRIME_SYMBOL, STPRIME_NAME, TOKEN_DECIMALS, STPRIME_CONVERSION_RATE, CHAINID_UTILITY, 0); + + var event = formattedDecodedEvents['UtilityTokenRegistered']; + + stPrimeSimpleStakeContractAddress = event.stake; + + Assert.notEqual((await openSTValue.utilityTokens.call(uuidSTP))[5], utils.NullAddress); + }); + + // Initialize Transfer to ST' Contract Address + it("initialize transfer to Simple Token Prime contract address", async () => { + Assert.equal(await web3.eth.getBalance(stPrime.address), 0); + + const o = await stPrime.initialize({ from: deployMachine, value: TOKENS_MAX}); + utils.logResponse(o, "STPrime.initialize"); + var stPrimeContractBalanceAfterTransfer = await web3.eth.getBalance(stPrime.address).toNumber(); + Assert.equal(stPrimeContractBalanceAfterTransfer, TOKENS_MAX); + }); + + it("report gas usage: deployment and setup", async () => { + utils.printGasStatistics(); + utils.clearReceipts(); + }); + }); + + context('stake Simple Token for Simple Token Prime', function() { + + const lockSTP = HashLock.getHashLock(); + + it("stake Simple Token", async () => { + uuidSTP = await openSTUtility.uuidSTPrime.call(); + // transfer ST to staker account + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); + // staker sets allowance for OpenSTValue + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); + // for testing purpose query nonceSTP in advance + nonceSTP = await openSTValue.getNextNonce.call(stakerVC); + Assert.equal(nonceSTP, 1); + // staker calls OpenSTValue.stake to initiate the staking for ST' with uuidSTP + // with staker as the beneficiary + const o = await openSTValue.stake(uuidSTP, AMOUNT_ST, beneficiary, lockSTP.l, stakerVC, { from: stakerVC }); + utils.logResponse(o, "OpenSTValue.stake"); + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(o.logs[0], uuidSTP, stakerVC, nonceSTP, beneficiary, + AMOUNT_ST, AMOUNT_ST, CHAINID_UTILITY); + stakingIntentHash = o.logs[0].args._stakingIntentHash; + unlockHeight = o.logs[0].args._unlockHeight; + }); + + it("confirm staking intent for Simple Token Prime", async () => { + // registrar registers staking intent on utility chain + const o = await registrarUC.confirmStakingIntent(openSTUtility.address, uuidSTP, stakerVC, nonceSTP, + beneficiary, AMOUNT_ST, AMOUNT_ST, unlockHeight, lockSTP.l, stakingIntentHash, { from: intercommUC }); + utils.logResponse(o, "OpenSTUtility.confirmStakingIntent"); + }); + + it("process staking", async () => { + const o = await openSTValue.processStaking(stakingIntentHash, lockSTP.s, { from: stakerVC }); + utils.logResponse(o, "OpenSTValue.processStaking"); + }); + + it("process minting", async () => { + // the stakerVC no longer needs to be the one calling processMinting on the value chain, + // to illustrate this we explicitly use a new key stakerUC + const o = await openSTUtility.processMinting(stakingIntentHash, lockSTP.s, { from: stakerUC }); + utils.logResponse(o, "OpenSTUtility.processMinting"); + }); + + it("claim Simple Token Prime", async () => { + var balanceBefore = await web3.eth.getBalance(beneficiary); + const o = await stPrime.claim(beneficiary, { from: intercommUC }); + utils.logResponse(o, "STPrime.claim"); + var balanceAfter = await web3.eth.getBalance(beneficiary); + var totalSupply = await stPrime.totalSupply.call(); + Assert.equal(totalSupply.toNumber(), AMOUNT_ST.toNumber()); + Assert.equal(balanceAfter.sub(balanceBefore).toNumber(), AMOUNT_ST.toNumber()); + }); + + it("report gas usage: staking Simple Token Prime", async () => { + utils.printGasStatistics(); + utils.clearReceipts(); + }); + }); + + context('propose and register branded token', function() { + + it("propose branded token for member company", async() => { + + const result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals, {from: requester}); + var eventLog = result.logs[0]; + + openSTUtilityUtils.validateProposedBrandedTokenEvent(eventLog, requester, symbol, name, conversionRate); + + registeredBrandedTokenUuid = eventLog.args._uuid; + registeredBrandedToken = eventLog.args._token; + brandedToken = BrandedToken.at(registeredBrandedToken); + + utils.logResponse(result, "OpenSTUtility.proposeBrandedToken"); + }); + + // register Branded Token on Utility Chain + + it("register branded token on utility chain", async() => { + + const result = await registrarUC.registerBrandedToken(openSTUtility.address, symbol, name, + conversionRate, conversionRateDecimals, requester, registeredBrandedToken, registeredBrandedTokenUuid, { from: intercommUC }); + + var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); + + openSTUtilityUtils.checkRegisteredBrandedTokenEventOnProtocol(formattedDecodedEvents, registrarUC.address, + registeredBrandedToken, registeredBrandedTokenUuid, symbol, name, conversionRate, requester); + + utils.logResponse(result, "OpenSTUtility.registerBrandedToken"); + }); + + // register Utility Token on Value Chain + + it("register utility token on value chain", async() => { + + const result = await registrarVC.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, + CHAINID_UTILITY, stakerVC, registeredBrandedTokenUuid, { from: intercommVC }); + + var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTValue.address, openSTValueArtifacts.abi); + + openSTValueUtils.checkUtilityTokenRegisteredEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, + symbol, name, TOKEN_DECIMALS, conversionRate, CHAINID_UTILITY, stakerVC); + + var event = formattedDecodedEvents['UtilityTokenRegistered']; + + btSimpleStakeContractAddress = event.stake; + + btSimpleStake = SimpleStake.at(btSimpleStakeContractAddress); + + utils.logResponse(result, "OpenSTValue.registerUtilityToken"); + + }); + + it("report gas usage: register and propose branded token", async () => { + utils.printGasStatistics(); + utils.clearReceipts(); + }); + + }); + + context('stake Simple Token for Branded Token', function() { + + const lockBT = HashLock.getHashLock(); + + it("approve and stake Simple Token", async() => { + // transfer ST to stakerVC account + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); + // Check for stakerVC simpleToken Balance + var balanceOfStaker = await simpleToken.balanceOf(stakerVC); + Assert.equal(balanceOfStaker, AMOUNT_ST.toNumber()); + // stakerVC sets allowance for OpenSTValue + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); + + // Query nonceBT in advance + nonceBT = await openSTValue.getNextNonce.call(stakerVC); + Assert.equal(nonceBT, 2); + // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid + // with beneficiary + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockBT.l, stakerVC, { from: stakerVC }); + + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, + beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + + stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; + unlockHeight = stakeResult.logs[0].args._unlockHeight; + nonceBT = stakeResult.logs[0].args._stakerNonce; + + utils.logResponse(stakeResult, "OpenSTUtility.approveAndStake"); + + }); + + it("confirm staking intent for Branded Token", async() => { + + const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockBT.l, stakingIntentHash, { from: intercommUC }); + + var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); + + openSTUtilityUtils.checkStakingIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, + stakingIntentHash, stakerVC, beneficiary, AMOUNT_ST, AMOUNT_BT); + + utils.logResponse(result, "OpenSTUtility.confirmStakingIntent"); + + }); + + it("process staking", async() => { + const result = await openSTValue.processStaking(stakingIntentHash, lockBT.s, { from: stakerVC }); + + openSTValueUtils.checkProcessedStakeEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, + btSimpleStakeContractAddress, stakerVC, AMOUNT_ST, AMOUNT_BT, lockBT.s); + + utils.logResponse(result, "OpenSTValue.processStaking"); + + }); + + it("process minting", async() => { + + const result = await openSTUtility.processMinting(stakingIntentHash, lockBT.s, { from: stakerUC }); + + openSTUtilityUtils.checkProcessedMintEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, + registeredBrandedToken, stakerVC, beneficiary, AMOUNT_BT, lockBT.s); + + utils.logResponse(result, "OpenSTValue.processminting"); + }); + + it("claim Branded Token", async() => { + var balanceBefore = await brandedToken.balanceOf(beneficiary); + const o = await brandedToken.claim(beneficiary, { from: stakerUC }); + var balanceAfter = await brandedToken.balanceOf(beneficiary); + var totalSupply = await brandedToken.totalSupply.call(); + Assert.equal(totalSupply.toNumber(), AMOUNT_BT.toNumber()); + Assert.equal(balanceAfter.sub(balanceBefore).toNumber(), AMOUNT_BT.toNumber()); + }); + + it("report gas usage: stake Simple Token for Branded Token", async () => { + utils.printGasStatistics(); + utils.clearReceipts(); + }); + + }); + + context('Transfer Branded Token and STPrime to Redeemer', function() { + + it("transfer branded token from Requester to Redeemer", async() => { + + var result = await brandedToken.transfer(redeemer, REDEEM_AMOUNT_BT, { from: beneficiary }); + Assert.ok(result); + var balanceOfRedeemer = await brandedToken.balanceOf(redeemer); + Assert.equal(balanceOfRedeemer, REDEEM_AMOUNT_BT.toNumber()); + + utils.logResponse(result, "brandedToken.transfer"); + + }); + + it("transfer STPrime to Redeemer", async() => { + + var redeemerBalanceBeforeTransfer = await web3.eth.getBalance(redeemer).toNumber(); + result = await web3.eth.sendTransaction({ from: stakerVC, to: redeemer, value: FUND_AMOUNT_STPRIME ,gasPrice: '0x12A05F200' }); + var redeemerBalanceAfterTransfer = await web3.eth.getBalance(redeemer).toNumber(); + Assert.equal((redeemerBalanceBeforeTransfer+(FUND_AMOUNT_STPRIME.toNumber())), redeemerBalanceAfterTransfer); + + }); + + it("report gas usage: Transfer Branded Token and STPrime to Redeemer", async () => { + + utils.printGasStatistics(); + utils.clearReceipts(); + + }); + + }); + + context('Redeem and Unstake Branded Token', function() { + const lockRedeem = HashLock.getHashLock(); + + it("approve branded token", async() => { + + var approveResult = await brandedToken.approve(openSTUtility.address, REDEEM_AMOUNT_BT, { from: redeemer }) + Assert.ok(approveResult); + utils.logResponse(approveResult, "OpenSTUtility.approveResult"); + + }); + + it("call redeem", async() => { + + nonce = await openSTValue.getNextNonce.call(redeemer); + var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer }); + redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; + unlockHeight = redeemResult.logs[0].args._unlockHeight; + openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, brandedToken.address, + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, CHAINID_VALUE); + utils.logResponse(redeemResult, "OpenSTUtility.redeem"); + + }); + + it("confirm redemption intent", async() => { + + var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); + + var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); + redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); + openSTValueUtils.checkRedemptionIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, + redemptionIntentHash, redeemer, redeemBeneficiary, redeemedAmountST, REDEEM_AMOUNT_BT); + + utils.logResponse(confirmRedemptionResult, "OpenSTValue.confirmRedemptionIntent"); + + }); + + it("process redemption", async() => { + + var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, lockRedeem.s, { from: redeemer }); + + openSTUtilityUtils.checkProcessedRedemptionEvent(processRedeemingResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + brandedToken.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_BT, lockRedeem.s) + + utils.logResponse(processRedeemingResult, "openSTUtility.processRedeeming"); + + }); + + it("process unstake", async() => { + + var processUnstakeResult = await openSTValue.processUnstaking(redemptionIntentHash, lockRedeem.s, { from: redeemer }); + + openSTValueUtils.checkProcessedUnstakeEvent(processUnstakeResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + btSimpleStakeContractAddress, redeemer, redeemBeneficiary, redeemedAmountST, lockRedeem.s); + + utils.logResponse(processUnstakeResult, "openSTValue.processUnstaking"); + + }); + + it("report gas usage: Redeem and Unstake Branded Token", async () => { + + utils.printGasStatistics(); + utils.clearReceipts(); + + }); + + }); + + context('Redeem and Unstake STPrime', function() { + const lockRedeem = HashLock.getHashLock(); + + it("call redeem", async() => { + + nonce = await openSTValue.getNextNonce.call(redeemer); + var redeemResult = await openSTUtility.redeemSTPrime(nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer, value: REDEEM_AMOUNT_STPRIME }); + redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; + unlockHeight = redeemResult.logs[0].args._unlockHeight; + openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], uuidSTP, redemptionIntentHash, stPrime.address, + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_STPRIME, unlockHeight, CHAINID_VALUE); + + utils.logResponse(redeemResult, "OpenSTUtility.STPrime.redeem"); + + }); + + it("confirm redemption intent", async() => { + + var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, uuidSTP, redeemer, nonce, redeemBeneficiary, + REDEEM_AMOUNT_STPRIME, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); + + var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, + openSTValue.address, openSTValueArtifacts.abi); + openSTValueUtils.checkRedemptionIntentConfirmedEventOnProtocol(formattedDecodedEvents, uuidSTP, + redemptionIntentHash, redeemer, redeemBeneficiary, REDEEM_AMOUNT_STPRIME, REDEEM_AMOUNT_STPRIME); + + utils.logResponse(confirmRedemptionResult, "OpenSTValue.STPrime.confirmRedemptionIntent"); + + }); + + it("process redemption", async() => { + + var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, lockRedeem.s, { from: redeemer }); + + openSTUtilityUtils.checkProcessedRedemptionEvent(processRedeemingResult.logs[0], uuidSTP, redemptionIntentHash, + stPrime.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_STPRIME, lockRedeem.s) + + utils.logResponse(processRedeemingResult, "openSTUtility.STPrime.processRedeeming"); + + }); + + it("process unstake", async() => { + + var processUnstakeResult = await openSTValue.processUnstaking(redemptionIntentHash, lockRedeem.s, { from: redeemer }); + + var event = processUnstakeResult.logs[0]; + openSTValueUtils.checkProcessedUnstakeEvent(event, uuidSTP, redemptionIntentHash, + stPrimeSimpleStakeContractAddress, redeemer, redeemBeneficiary, REDEEM_AMOUNT_STPRIME, lockRedeem.s); + utils.logResponse(processUnstakeResult, "openSTValue.STPrime.processUnstaking"); + + }); + + it("report gas usage: Redeem and Unstake Simple Token Prime", async () => { + + utils.printGasStatistics(); + utils.clearReceipts(); + + }); + + }); + + context('Revert stake', function() { + + const lockR = HashLock.getHashLock(); + + it("call stake", async() => { + // transfer ST to stakerVC account + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); + // Check for stakerVC simpleToken Balance + var balanceOfRequester = await simpleToken.balanceOf(stakerVC); + Assert.equal(balanceOfRequester, AMOUNT_ST.toNumber()); + // stakerVC sets allowance for OpenSTValue + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); + + nonceBT = await openSTValue.getNextNonce.call(stakerVC); + // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid + // with beneficiary + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockR.l, stakerVC, { from: stakerVC }); + + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, + beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + + stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; + + }); + + // Before wait time as passed + it('fails to revertStaking before waiting period ends', async () => { + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + const amount = new BigNumber(1); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + for (var i = 0; i < waitTime/2 ; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); + + it("revert staking after unlocking block height", async() => { + // Revert staking from staker user as it can called from any external user. + // If we put this as a contrain this test case will fail + var result = await openSTValue.revertStaking(stakingIntentHash, {from: stakerVC}); + openSTValueUtils.checkRevertStakingEventProtocol(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, stakerVC, + AMOUNT_ST, AMOUNT_BT) + }); + }); + + context('Revert minting', function() { + + const lockR = HashLock.getHashLock(); + + it("call stake ", async() => { + // transfer ST to requester account + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); + // requester sets allowance for OpenSTValue + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); + + nonceBT = await openSTValue.getNextNonce.call(stakerVC); + // requester calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid + // with requester as the beneficiary + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockR.l, stakerVC, { from: stakerVC }); + + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, + beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + + stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; + unlockHeight = stakeResult.logs[0].args._unlockHeight; + nonceBT = stakeResult.logs[0].args._stakerNonce; + + }); + + it("confirm staking intent for Branded Token", async() => { + + const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockR.l, stakingIntentHash, { from: intercommUC }); + + var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); + + openSTUtilityUtils.checkStakingIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, + stakingIntentHash, stakerVC, beneficiary, AMOUNT_ST, AMOUNT_BT); + + utils.logResponse(result, "OpenSTUtility.confirmStakingIntent"); + + }); + + it('fails to revertStaking before waiting period ends', async () => { + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + const amount = new BigNumber(1); + for (var i = 0; i < waitTime/2; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); + + it("revert staking after unlocking block height", async() => { + // Revert staking from staker user as it can called from any external user. + // If we put this as a contraint this test case will fail + var result = await openSTValue.revertStaking(stakingIntentHash, {from: stakerVC}); + openSTValueUtils.checkRevertStakingEventProtocol(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, stakerVC, + AMOUNT_ST, AMOUNT_BT) + }); + + // Before wait time as passed + it('fails to revertMinting before expiration block', async () => { + var waitTime = await openSTUtility.blocksToWaitShort.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + const amount = new BigNumber(1); + for (var i = 0; i < waitTime/2; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); + + it("revert minting after expiring block height", async() => { + // Revert minting from staker user as it can called from any external user. + // If we put this as a contraint this test case will fail + var result = await openSTUtility.revertMinting(stakingIntentHash, {from: stakerVC}); + openSTUtilityUtils.checkRevertedMintEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, + stakerVC, beneficiary, AMOUNT_BT) + }); + }); + + // // After process staking, revertStake cannot be called but revertMinting can still be called. + // // As of now ST get stuck in SimpleStake Contract for the staker which should ideally be returned after revertMinting + // // Checking the ST balance in SimpleStake as non zero which will start failing once we fix the issue of + // // releasing ST after revertMinting as well + context('Revert minting after process Staking', function() { + + const lockStake = HashLock.getHashLock(); + var previousSTBalance = null; + + it("previous balance on simple stake", async() => { + previousSTBalance = await btSimpleStake.getTotalStake.call(); + }); + + it("call stake", async() => { + + // transfer ST to requester account + Assert.ok(await simpleToken.transfer(stakerVC, AMOUNT_ST, { from: deployMachine })); + Assert.ok(await simpleToken.approve(openSTValue.address, AMOUNT_ST, { from: stakerVC })); + + nonceBT = await openSTValue.getNextNonce.call(stakerVC); + // stakerVC calls OpenSTValue.stake to initiate the staking for Branded Token with registeredBrandedTokenUuid + // with stakerVC as the beneficiary + var stakeResult = await openSTValue.stake(registeredBrandedTokenUuid, AMOUNT_ST, beneficiary, lockStake.l, stakerVC, { from: stakerVC }); + + openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, + beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + + stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; + unlockHeight = stakeResult.logs[0].args._unlockHeight; + nonceBT = stakeResult.logs[0].args._stakerNonce; + + }); + + it("confirm staking intent for Branded Token", async() => { + + const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockStake.l, stakingIntentHash, { from: intercommUC }); + + var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); + + openSTUtilityUtils.checkStakingIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, + stakingIntentHash, stakerVC, beneficiary, AMOUNT_ST, AMOUNT_BT); + + utils.logResponse(result, "OpenSTUtility.confirmStakingIntent"); + + }); + + it("process staking", async () => { + const o = await openSTValue.processStaking(stakingIntentHash, lockStake.s, { from: stakerVC }); + utils.logResponse(o, "OpenSTValue.processStaking"); + }); + + // Before wait time as passed + it('fails to revertMinting before expiration block', async () => { + var waitTime = await openSTUtility.blocksToWaitShort.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + + const amount = new BigNumber(1); + for (var i = 0; i < waitTime/2; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); + + // Before wait time as passed + // Revert staking called after unlock block + it('fails to revertStaking before waiting period ends', async () => { + var waitTime = await openSTValue.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + // Wait time less 1 block for preceding test case and 1 block because condition is <= + const amount = new BigNumber(1); + for (var i = 0; i < waitTime/2; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amount }); + await web3.eth.sendTransaction({ from: admin, to: owner, value: amount }); + } + }); + + it("revert staking should not be allowed after processStaking", async() => { + await utils.expectThrow(openSTValue.revertStaking(stakingIntentHash, { from: stakerVC })); + }); + + it("revert minting after expiring block height", async() => { + // Revert minting from staker user as it can be called from any external user. + // If we put this as a contraint this test case will fail + var result = await openSTUtility.revertMinting(stakingIntentHash, { from: stakerVC }); + openSTUtilityUtils.checkRevertedMintEvent(result.logs[0], registeredBrandedTokenUuid, stakingIntentHash, + stakerVC, beneficiary, AMOUNT_BT); + }); + + it ("validate if the ST is stuck in Simple Stake", async() => { + var currentStBalance = await btSimpleStake.getTotalStake.call() + var tobeBalance = previousSTBalance.toNumber() + AMOUNT_ST.toNumber(); + Assert.equal(currentStBalance.toNumber(), tobeBalance) + }); + + }); + + // SEQUENCE OF EVENTS + // Call Redeem => Call RevertRedemption + // + context('call redeem then revertRedemption', function() { + const lockRedeem = HashLock.getHashLock(); + + // Redeemer should have some branded token + it("transfers branded token to redeemer", async() => { + + var result = await brandedToken.transfer(redeemer, REDEEM_AMOUNT_BT, { from: beneficiary }); + Assert.ok(result); + var balanceOfRedeemer = await brandedToken.balanceOf(redeemer); + Assert.equal(balanceOfRedeemer, REDEEM_AMOUNT_BT.toNumber()); + + utils.logResponse(result, "OpenSTUtility.revertRedemption.transfer"); + + }); + + // Call redeem + it("gives allowance and calls redeem", async() => { + + var approveResult = await brandedToken.approve(openSTUtility.address, REDEEM_AMOUNT_BT, { from: redeemer }); + Assert.ok(approveResult); + + nonce = await openSTValue.getNextNonce.call(redeemer); + var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer }); + redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; + unlockHeight = redeemResult.logs[0].args._unlockHeight; + openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + brandedToken.address, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, CHAINID_VALUE); + + utils.logResponse(redeemResult, "OpenSTUtility.revertRedemption.redeem"); + + }); + + // Wait though fake transactions so that redeem is expired + it('waits till redeem is expired', async () => { + var waitTime = await openSTUtility.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + // Mock transactions so that block number increases + for (var i = 0; i < waitTime; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amountToTransfer, gasPrice: '0x12A05F200' }); + } + }); + + // after redeem, revert redemption can be called + it("revert redemption", async() => { + + var revertResult = await openSTUtility.revertRedemption(redemptionIntentHash, { from: redeemer }); + openSTUtilityUtils.checkRevertedRedemption(revertResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, redeemer, + redeemBeneficiary, REDEEM_AMOUNT_BT); + + utils.logResponse(revertResult, "OpenSTUtility.redeem.revertRedemption"); + + }); + + // Reports gas usage + it("report gas usage: revert redemption", async () => { + + utils.printGasStatistics(); + utils.clearReceipts(); + + }); + + }); + + // SEQUENCE OF EVENTS + // Redeem => confirmRedemptionIntent => revertRedemption => revertUnstaking + // + context('call redeem then confirmRedemptionIntent then revertRedemption then revertUnstaking', function() { + const lockRedeem = HashLock.getHashLock(); + + // Since we reverted redemption in above case we don't need to transfer again as redeemer will already have REDEEM_AMOUNT_BT balance + it("check branded token balance of redeemer", async() => { + + var balanceOfRedeemer = await brandedToken.balanceOf(redeemer); + Assert.equal(balanceOfRedeemer, REDEEM_AMOUNT_BT.toNumber()); + + }); + + // Gives allawance and call redeem + it("gives allowance and calls redeem", async() => { + + var approveResult = await brandedToken.approve(openSTUtility.address, REDEEM_AMOUNT_BT, { from: redeemer }) + Assert.ok(approveResult); + + nonce = await openSTValue.getNextNonce.call(redeemer); + var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer }); + redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; + unlockHeight = redeemResult.logs[0].args._unlockHeight; + openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + brandedToken.address, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, CHAINID_VALUE); + + utils.logResponse(redeemResult, "OpenSTUtility.revertUnstake.redeem"); + + }); + + // Call confirmRedemptionIntent + it("calls confirmRedemptionIntent", async() => { + + var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); + var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); + redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); + openSTValueUtils.checkRedemptionIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, + redemptionIntentHash, redeemer, redeemBeneficiary, redeemedAmountST, REDEEM_AMOUNT_BT); + utils.logResponse(confirmRedemptionResult, "OpenSTUtility.revertUnstake.confirmRedemptionIntent"); + + }); + + // Fake transactions so that redeem is expired and revertRedemption can be called + it('waits till redeem is expired', async () => { + var waitTime = await openSTUtility.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + // Mock transactions so that block number increases + for (var i = 0; i < waitTime; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amountToTransfer, gasPrice: '0x12A05F200' }); + } + }); + + // Revert Redemption + it("reverts redemption", async() => { + + var revertRedemptionResult = await openSTUtility.revertRedemption(redemptionIntentHash, { from: redeemer }); + openSTUtilityUtils.checkRevertedRedemption(revertRedemptionResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + redeemer, redeemBeneficiary, REDEEM_AMOUNT_BT); + + utils.logResponse(revertRedemptionResult, "OpenSTUtility.revertUnstake.revertRedemption"); + + }); + + // Fake transactions so that unstakes is expired and revertUnstakes can be called + it('waits till unstake is expired', async () => { + var waitTime = await openSTValue.blocksToWaitShort.call(); + waitTime = waitTime.toNumber(); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + // Mock transactions so that block number increases + for (var i = 0; i < waitTime; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amountToTransfer, gasPrice: '0x12A05F200' }); + } + }); + + // Revert unstakes + it("reverts unstake", async() => { + + var revertUnstakingResult = await openSTValue.revertUnstaking(redemptionIntentHash, { from: redeemer }); + openSTValueUtils.checkRevertedUnstake(revertUnstakingResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + redeemer, redeemBeneficiary, redeemedAmountST); + utils.logResponse(revertUnstakingResult, "OpenSTUtility.revertUnstake.revertUnstaking"); + + }); + + // Report Gas usages + it("report gas usage: revert unstake", async () => { + + utils.printGasStatistics(); + utils.clearReceipts(); + + }); + + }); + + // SEQUENCE OF EVENTS + // Redeem => confirmRedemptionIntent => ProcessRedemption => revertRedemption => revertUnstaking + // + context('call redeem then confirmRedemptionIntent then ProcessRedemption then revertRedemption then revertUnstaking', function() { + const lockRedeem = HashLock.getHashLock(); + var previousSTBalance = null; + + it("previous balance on simple stake contract", async() => { + + previousSTBalance = await btSimpleStake.getTotalStake.call(); + + }); + + // Since we reverted redemption in above case we don't need to transfer again as redeemer will already have REDEEM_AMOUNT_BT balance + it("check branded token balance of redeemer", async() => { + + var balanceOfRedeemer = await brandedToken.balanceOf(redeemer); + Assert.equal(balanceOfRedeemer, REDEEM_AMOUNT_BT.toNumber()); + + }); + + // Gives allawance and call redeem + it("gives allowance and calls redeem", async() => { + + var approveResult = await brandedToken.approve(openSTUtility.address, REDEEM_AMOUNT_BT, { from: redeemer }) + Assert.ok(approveResult); + + nonce = await openSTValue.getNextNonce.call(redeemer); + var redeemResult = await openSTUtility.redeem(registeredBrandedTokenUuid, REDEEM_AMOUNT_BT, nonce, redeemBeneficiary, lockRedeem.l, { from: redeemer }); + redemptionIntentHash = redeemResult.logs[0].args._redemptionIntentHash; + unlockHeight = redeemResult.logs[0].args._unlockHeight; + openSTUtilityUtils.checkRedemptionIntentDeclaredEvent(redeemResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + brandedToken.address, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, CHAINID_VALUE); + + utils.logResponse(redeemResult, "OpenSTUtility.revertUnstake.redeem"); + + }); + + // Call confirmRedemptionIntent + it("calls confirmRedemptionIntent", async() => { + + var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); + var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); + redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); + openSTValueUtils.checkRedemptionIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, + redemptionIntentHash, redeemer, redeemBeneficiary, redeemedAmountST, REDEEM_AMOUNT_BT); + utils.logResponse(confirmRedemptionResult, "OpenSTUtility.revertUnstake.confirmRedemptionIntent"); + + }); + + it("process redemption", async() => { + + var processRedeemingResult = await openSTUtility.processRedeeming(redemptionIntentHash, lockRedeem.s, { from: redeemer }); + + openSTUtilityUtils.checkProcessedRedemptionEvent(processRedeemingResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + brandedToken.address, redeemer, redeemBeneficiary, REDEEM_AMOUNT_BT, lockRedeem.s) + + utils.logResponse(processRedeemingResult, "openSTUtility.revertUnstake.processRedeeming"); + + }); + + // Fake transactions so that redeem is expired and revertRedemption can be called + it('waits till redeem is expired', async () => { + + var waitTime = await openSTUtility.blocksToWaitLong.call(); + waitTime = waitTime.toNumber(); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + + // Mock transactions so that block number increases + for (var i = 0; i < waitTime; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amountToTransfer, gasPrice: '0x12A05F200' }); + } + + }); + + // Revert Redemption + it("reverts redemption", async() => { + + await utils.expectThrow(openSTUtility.revertRedemption(redemptionIntentHash, { from: redeemer })); + + }); + + // Fake transactions so that unstakes is expired and revertUnstakes can be called + it('waits till unstake is expired', async () => { + + var waitTime = await openSTValue.blocksToWaitShort.call(); + waitTime = waitTime.toNumber(); + var amountToTransfer = new BigNumber(web3.toWei(0.000001, "ether")); + + // Mock transactions so that block number increases + for (var i = 0; i < waitTime; i++) { + await web3.eth.sendTransaction({ from: owner, to: admin, value: amountToTransfer, gasPrice: '0x12A05F200' }); + } + + }); + + // Revert unstakes + it("reverts unstake", async() => { + + var revertUnstakingResult = await openSTValue.revertUnstaking(redemptionIntentHash, { from: redeemer }); + openSTValueUtils.checkRevertedUnstake(revertUnstakingResult.logs[0], registeredBrandedTokenUuid, redemptionIntentHash, + redeemer, redeemBeneficiary, redeemedAmountST); + utils.logResponse(revertUnstakingResult, "OpenSTUtility.revertUnstake.revertUnstaking"); + + }); + + + it("checks that branded token has been burned but SimpleToken has not been releases to redeemer", async() => { + + // Branded token has burned so balance will be 0 + var balanceOfRedeemer = await brandedToken.balanceOf(redeemer); + Assert.equal(balanceOfRedeemer, 0); + + // Simple Token has not been released so previous and current balance is same + var currentStBalance = await btSimpleStake.getTotalStake.call(); + Assert.equal(previousSTBalance.toNumber(), currentStBalance.toNumber()); + + }); + + // Report Gas usages + it("report gas usage: revert unstake", async () => { + + utils.printGasStatistics(); + utils.clearReceipts(); + + }); + + }); + }); +}); diff --git a/test/ProtocolVersioned.js b/test/ProtocolVersioned.js new file mode 100644 index 00000000..1afedd05 --- /dev/null +++ b/test/ProtocolVersioned.js @@ -0,0 +1,177 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: ProtocolVersioned.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const ProtocolVersioned_utils = require('./ProtocolVersioned_utils.js'); + +/// +/// Test stories +/// +/// Properties +/// has openSTprotocol +/// +/// InitiateProtocolTransfer +/// fails to initiate by non-openSTProtocol +/// fails to initiate by openSTProtocol with null proposedProtocol +/// fails to initiate if openSTProtocol is same as proposedProtocol +/// successfully initiates protocol transfer +/// fails to initiate if proposedProtocol is not null +/// +/// CompleteProtocolTransfer +/// fails to complete by non-proposedProtocol +/// fails to complete by proposedProtocol before waiting period ends +/// successfully completes protocol transfer +/// +/// RevokeProtocolTransfer +/// fails to revoke by non-openSTProtocol +/// fails to revoke by protocol if proposedProtocol is null +/// successfully revokes protocol transfer +/// + +contract('ProtocolVersioned', function(accounts) { + const openSTProtocol = accounts[1]; + const proposedProtocol = accounts[2]; + const PROTOCOL_TRANSFER_BLOCKS_TO_WAIT = 3; + + var result = null; + var earliestTransferHeight = null; + + describe ('Properties', async () => { + before(async () => { + contracts = await ProtocolVersioned_utils.deployProtocolVersioned(artifacts, accounts); + protocolVersioned = contracts.protocolVersioned; + }) + + it('has openSTProtocol', async () => { + assert.equal(await protocolVersioned.openSTProtocol.call(), openSTProtocol); + }) + }); + + describe ('InitiateProtocolTransfer', async () => { + before(async () => { + contracts = await ProtocolVersioned_utils.deployProtocolVersioned(artifacts, accounts); + protocolVersioned = contracts.protocolVersioned; + }) + + it ('fails to initiate by non-openSTProtocol', async () => { + await Utils.expectThrow(protocolVersioned.initiateProtocolTransfer(proposedProtocol, { from: accounts[0] })); + }) + + it ('fails to initiate by openSTProtocol with null proposedProtocol', async () => { + await Utils.expectThrow(protocolVersioned.initiateProtocolTransfer(0, { from: openSTProtocol })); + }) + + it ('fails to initiate if openSTProtocol is same as proposedProtocol', async () => { + await Utils.expectThrow(protocolVersioned.initiateProtocolTransfer(openSTProtocol, { from: openSTProtocol })); + }) + + it ('successfully initiates protocol transfer', async () => { + assert.ok(Utils.isNullAddress(await protocolVersioned.proposedProtocol.call())); + assert.equal(await protocolVersioned.initiateProtocolTransfer.call(proposedProtocol, { from: openSTProtocol }), true); + result = await protocolVersioned.initiateProtocolTransfer(proposedProtocol, { from: openSTProtocol }); + + earliestTransferHeight = await protocolVersioned.earliestTransferHeight.call(); + assert.equal(await protocolVersioned.proposedProtocol.call(), proposedProtocol); + assert.equal(await protocolVersioned.openSTProtocol.call(), openSTProtocol); + assert.equal(earliestTransferHeight.toNumber(), (result.receipt.blockNumber + PROTOCOL_TRANSFER_BLOCKS_TO_WAIT)); + ProtocolVersioned_utils.checkProtocolTransferInitiatedEvent(result.logs[0], openSTProtocol, proposedProtocol, earliestTransferHeight); + }) + + it ('fails to initiate if proposedProtocol is not null', async () => { + await Utils.expectThrow(protocolVersioned.initiateProtocolTransfer(proposedProtocol, { from: openSTProtocol })); + }) + }); + + /** + * @dev commented because the wait time is set to 1 week (40320 blocks) + * needs to be mocked in v0.9.2 + * https://github.com/OpenSTFoundation/openst-protocol/issues/57 + */ + + describe ('CompleteProtocolTransfer', async () => { + before(async () => { + contracts = await ProtocolVersioned_utils.deployProtocolVersioned(artifacts, accounts); + protocolVersioned = contracts.protocolVersioned; + await protocolVersioned.initiateProtocolTransfer(proposedProtocol, { from: openSTProtocol }); + }) + + it('fails to complete by non-proposedProtocol', async () => { + await Utils.expectThrow(protocolVersioned.completeProtocolTransfer({ from: accounts[0] })); + }) + + // Before wait time as passed + it('fails to complete by proposedProtocol before waiting period ends', async () => { + // Wait time less 1 block for preceding test case and 1 block because condition is <= + var wait = PROTOCOL_TRANSFER_BLOCKS_TO_WAIT - 2; + + for (var i = 0; i < wait; i++) { + await Utils.expectThrow(protocolVersioned.completeProtocolTransfer({ from: proposedProtocol })); + } + }) + + // 1 block after preceding test cases == earliest completion is possible + it('successfully completes protocol transfer', async () => { + earliestTransferHeight = await protocolVersioned.earliestTransferHeight.call(); + + assert.equal(await protocolVersioned.proposedProtocol.call(), proposedProtocol); + assert.equal(await protocolVersioned.openSTProtocol.call(), openSTProtocol); + result = await protocolVersioned.completeProtocolTransfer({ from: proposedProtocol }); + + var newTransferHeight = await protocolVersioned.earliestTransferHeight.call(); + assert.equal(await protocolVersioned.openSTProtocol.call(), proposedProtocol); + assert.ok(Utils.isNullAddress(await protocolVersioned.proposedProtocol.call())); + assert.notEqual(earliestTransferHeight.toNumber(), newTransferHeight.toNumber()); + assert.equal(newTransferHeight.toNumber(), 0); + ProtocolVersioned_utils.checkProtocolTransferCompletedEvent(result.logs[0], proposedProtocol); + }) + + }); + + describe ('RevokeProtocolTransfer', async () => { + before(async () => { + contracts = await ProtocolVersioned_utils.deployProtocolVersioned(artifacts, accounts); + protocolVersioned = contracts.protocolVersioned; + }) + + it ('fails to revoke by non-openSTProtocol', async () => { + await Utils.expectThrow(protocolVersioned.revokeProtocolTransfer({ from: accounts[0] })); + }) + + it ('fails to revoke by protocol if proposedProtocol is null', async () => { + assert.ok(Utils.isNullAddress(await protocolVersioned.proposedProtocol.call())); + await Utils.expectThrow(protocolVersioned.revokeProtocolTransfer({ from: openSTProtocol })); + }) + + it ('successfully revokes protocol transfer', async () => { + await protocolVersioned.initiateProtocolTransfer(proposedProtocol, { from: openSTProtocol }); + assert.equal(await protocolVersioned.proposedProtocol.call(), proposedProtocol); + assert.equal(await protocolVersioned.revokeProtocolTransfer.call({ from: openSTProtocol }), true); + result = await protocolVersioned.revokeProtocolTransfer({ from: openSTProtocol }); + + assert.ok(Utils.isNullAddress(await protocolVersioned.proposedProtocol.call())); + assert.equal(await protocolVersioned.openSTProtocol.call(), openSTProtocol); + earliestTransferHeight = await protocolVersioned.earliestTransferHeight.call(); + assert.equal(earliestTransferHeight.toNumber(), 0); + ProtocolVersioned_utils.checkProtocolTransferRevokedEvent(result.logs[0], openSTProtocol, proposedProtocol); + }) + }); +}) diff --git a/test/ProtocolVersioned_utils.js b/test/ProtocolVersioned_utils.js new file mode 100644 index 00000000..eefd9353 --- /dev/null +++ b/test/ProtocolVersioned_utils.js @@ -0,0 +1,53 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: ProtocolVersioned_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +var ProtocolVersioned = artifacts.require("./ProtocolVersionedMock.sol"); + +/// @dev Deploy +module.exports.deployProtocolVersioned = async (artifacts, accounts) => { + const protocolVersioned = await ProtocolVersioned.new(accounts[1], { from: accounts[0], gas: 3500000 }); + + return { + protocolVersioned : protocolVersioned + }; +}; + +module.exports.checkProtocolTransferInitiatedEvent = (event, _existingProtocol, _proposedProtocol, _activationHeight) => { + if (Number.isInteger(_activationHeight)) { + _activationHeight = new BigNumber(_activationHeight); + } + + assert.equal(event.event, "ProtocolTransferInitiated"); + assert.equal(event.args._existingProtocol, _existingProtocol); + assert.equal(event.args._proposedProtocol, _proposedProtocol); + assert.equal(event.args._activationHeight.toNumber(), _activationHeight.toNumber()); +} + +module.exports.checkProtocolTransferCompletedEvent = (event, _newProtocol) => { + assert.equal(event.event, "ProtocolTransferCompleted"); + assert.equal(event.args._newProtocol, _newProtocol); +} + +module.exports.checkProtocolTransferRevokedEvent = (event, _existingProtocol, _revokedProtocol) => { + assert.equal(event.event, "ProtocolTransferRevoked"); + assert.equal(event.args._existingProtocol, _existingProtocol); + assert.equal(event.args._revokedProtocol, _revokedProtocol); +} diff --git a/test/Protocol_utils.js b/test/Protocol_utils.js new file mode 100644 index 00000000..adecc535 --- /dev/null +++ b/test/Protocol_utils.js @@ -0,0 +1,132 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Protocol_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +const Assert = require('assert'); + +const utils = require("./lib/utils.js"); +const openSTValueUtils = require("./OpenSTValue_utils.js"); + +var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); +var Registrar = artifacts.require("./Registrar.sol"); +var Core = artifacts.require("./Core.sol"); +var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); +var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); +var STPrime = artifacts.require("./STPrime.sol"); +var Workers = artifacts.require("./Workers.sol"); + +const CHAINID_VALUE = 2001; +const CHAINID_UTILITY = 2002; + +module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { + + const deployMachine = accounts[0]; + const owner = accounts[1]; + const admin = accounts[2]; + const ops = accounts[3]; + const intercommVC = accounts[4]; + const intercommUC = accounts[5]; + const workerDeactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); + + var res = null; + + const simpleToken = await SimpleToken.new({ from: deployMachine }); + await utils.logTransaction(simpleToken.transactionHash, "SimpleToken.new"); + // finalize the tokens + utils.logResponse(await simpleToken.setAdminAddress(admin, { from: deployMachine }), + "SimpleToken.setAdminAddress"); + utils.logResponse(await simpleToken.finalize({ from: admin }), + "SimpleToken.finalize"); + // transfer ownership + utils.logResponse(await simpleToken.initiateOwnershipTransfer(owner, { from: deployMachine }), + "SimpleToken.initiateOwnershipTransfer"); + utils.logResponse(await simpleToken.completeOwnershipTransfer({ from: owner }), + "SimpleToken.completeOwnershipTransfer"); + + const registrarVC = await Registrar.new({ from: deployMachine }); + await utils.logTransaction(registrarVC.transactionHash, "RegistrarVC.new"); + // set Ops of registrar to Intercom account on value chain + utils.logResponse(await registrarVC.setOpsAddress(intercommVC, { from: deployMachine }), + "Registrar.setOpsAddress"); + utils.logResponse(await registrarVC.initiateOwnershipTransfer(owner, { from: deployMachine }), + "Registrar.initiateOwnershipTransfer"); + utils.logResponse(await registrarVC.completeOwnershipTransfer({ from: owner }), + "Registrar.completeOwnershipTransfer"); + + const registrarUC = await Registrar.new({ from: deployMachine }); + await utils.logTransaction(registrarUC.transactionHash, "RegistrarUC.new"); + // set Ops of registrar to Intercom account on utility chain + utils.logResponse(await registrarUC.setOpsAddress(intercommUC, { from: deployMachine }), + "Registrar.setOpsAddress"); + utils.logResponse(await registrarUC.initiateOwnershipTransfer(owner, { from: deployMachine }), + "Registrar.initiateOwnershipTransfer"); + utils.logResponse(await registrarUC.completeOwnershipTransfer({ from: owner }), + "Registrar.completeOwnershipTransfer"); + + const openSTValue = await OpenSTValue.new(CHAINID_VALUE, simpleToken.address, + registrarVC.address); + await utils.logTransaction(openSTValue.transactionHash, "OpenSTValue.new"); + utils.logResponse(await openSTValue.initiateOwnershipTransfer(owner, { from: deployMachine }), + "OpenSTValue.initiateOwnershipTransfer"); + utils.logResponse(await openSTValue.completeOwnershipTransfer({ from: owner }), + "OpenSTValue.completeOwnershipTransfer"); + + const openSTUtility = await OpenSTUtility.new(CHAINID_VALUE, CHAINID_UTILITY, + registrarUC.address, { from: deployMachine, gas: 8500000 }); + await utils.logTransaction(openSTUtility.transactionHash, "OpenSTUtility.new"); + utils.logResponse(await openSTUtility.initiateOwnershipTransfer(owner, { from: deployMachine }), + "OpenSTUtility.initiateOwnershipTransfer"); + utils.logResponse(await openSTUtility.completeOwnershipTransfer({ from: owner }), + "OpenSTUtility.completeOwnershipTransfer"); + + // Deploy worker contract + const workers = await Workers.new(simpleToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, workerDeactivationHeight, {from:ops}); + + // only setup a core for the Value Chain to track the Utility Chain for v0.9.1 + const coreVC = await Core.new(registrarVC.address, CHAINID_VALUE, CHAINID_UTILITY, + openSTUtility.address, workers.address); + await utils.logTransaction(coreVC.transactionHash, "CoreVC.new"); + + const stpContractAddress = await openSTUtility.simpleTokenPrime.call(); + Assert.notEqual(stpContractAddress, utils.NullAddress); + const stPrime = STPrime.at(stpContractAddress); + + // console.log("Simple Token:", simpleToken.address); + // console.log("Registrar VC:", registrarVC.address); + // console.log("Registrar UC:", registrarUC.address); + // console.log("OpenSTValue:", openSTValue.address); + // console.log("OpenSTUtility:", openSTUtility.address); + // console.log("CoreVC:", coreVC.address); + + return { + token : simpleToken, + registrarVC : registrarVC, + registrarUC : registrarUC, + openSTValue : openSTValue, + openSTUtility : openSTUtility, + coreVC : coreVC, + stPrime : stPrime + }; +} \ No newline at end of file diff --git a/test/Registrar.js b/test/Registrar.js new file mode 100644 index 00000000..137cb1d5 --- /dev/null +++ b/test/Registrar.js @@ -0,0 +1,236 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Registrar.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const HashLock = require('./lib/hash_lock.js'); +const Registrar_utils = require('./Registrar_utils.js'); + +/// +/// Test stories +/// +/// RegisterBrandedToken +/// fails to register by non-adminOrOps +/// successfully registers core +/// +/// AddCore +/// fails to add by non-adminOrOps +/// successfully adds core +/// +/// RegisterUtilityToken +/// fails to register if non-adminOrOps +/// successfully registers +/// +/// ConfirmStakingIntent +/// fails to confirm by non-ops +/// successfully confirms +/// +/// ConfirmRedemptionIntent +/// fails to confirm by non-ops +/// successfully confirms +/// + +contract('Registrar', function(accounts) { + const chainIdValue = 3; + const chainIdUtility = 1410; + const ops = accounts[1]; + const admin = accounts[3]; + const staker = accounts[2]; + const redeemBeneficiary = accounts[4]; + const symbol = "MCC"; + const name = "Member Company Coin"; + const conversionRateDecimals = 5; + const conversionRate = new BigNumber(10 * (10**conversionRateDecimals)); // Conversion rate => 10 + const amountST = new BigNumber(web3.toWei(2, "ether"));; + + describe('RegisterBrandedToken for utility chain', async() => { + var contracts = null; + var registrar = null; + var openSTUtility = null; + var uuid = null; + var brandedToken = null; + + before(async() => { + contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); + registrar = contracts.registrar; + openSTUtility = contracts.openSTUtility; + uuid = await openSTUtility.proposeBrandedToken.call(symbol, name, conversionRate, conversionRateDecimals, { from: staker }); + result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals, { from: staker }); + brandedToken = result.logs[0].args._token; + }) + + it('fails to register by non-adminOrOps', async () => { + await Utils.expectThrow(registrar.registerBrandedToken(openSTUtility.address, symbol, name, conversionRate, conversionRateDecimals, staker, brandedToken, uuid)); + }) + + it('successfully resgisters', async () => { + assert.equal(await registrar.registerBrandedToken.call(openSTUtility.address, symbol, name, conversionRate, conversionRateDecimals, staker, brandedToken, uuid, { from: ops }), uuid); + }) + }) + + describe('AddCore for value chain', async() => { + var contracts = null; + var registrar = null; + var openSTValue = null; + var core = null; + + before(async() => { + contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); + registrar = contracts.registrar; + openSTValue = contracts.openSTValue; + core = contracts.core; + }) + + it('fails to add by non-adminOrOps', async () => { + await Utils.expectThrow(registrar.addCore(openSTValue.address, core.address)); + }) + + it('successfully adds core', async () => { + assert.equal(await registrar.addCore.call(openSTValue.address, core.address, { from: ops }), true); + }) + }) + + describe('RegisterUtilityToken for value chain', async() => { + var contracts = null; + var registrar = null; + var openSTValue = null; + var core = null; + var uuid = null; + + before(async() => { + contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); + registrar = contracts.registrar; + openSTUtility = contracts.openSTUtility; + openSTValue = contracts.openSTValue; + core = contracts.core; + uuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + + await registrar.addCore(openSTValue.address, core.address, { from: ops }); + }) + + it('fails to register if non-adminOrOps', async () => { + await Utils.expectThrow(registrar.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid)); + }) + + it('successfully registers', async () => { + assert.equal(await registrar.registerUtilityToken.call(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid, { from: ops }), uuid); + }) + }) + + describe('ConfirmStakingIntent for utility chain', async() => { + var contracts = null; + var valueToken = null; + var registrar = null; + var openSTUtility = null; + var openSTValue = null; + var core = null; + var uuid = null; + var brandedToken = null; + var nonce = null; + var amountUT = null; + var unlockHeight = null; + var stakingIntentHash = null; + + const lock = HashLock.getHashLock(); + + before(async() => { + contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); + valueToken = contracts.valueToken; + registrar = contracts.registrar; + openSTUtility = contracts.openSTUtility; + openSTValue = contracts.openSTValue; + core = contracts.core; + uuid = await openSTUtility.proposeBrandedToken.call(symbol, name, conversionRate, conversionRateDecimals, { from: staker }); + var result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals, { from: staker }); + brandedToken = result.logs[0].args._token; + + await registrar.registerBrandedToken(openSTUtility.address, symbol, name, conversionRate, conversionRateDecimals, staker, brandedToken, uuid, { from: ops }) + await registrar.addCore(openSTValue.address, core.address, { from: ops }); + await registrar.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid, { from: ops }); + await valueToken.approve(openSTValue.address, amountST, { from: staker }); + result = await openSTValue.stake(uuid, amountST, staker, lock.l, staker, { from: staker }); + nonce = result.logs[0].args._stakerNonce; + amountUT = result.logs[0].args._amountUT; + unlockHeight = result.logs[0].args._unlockHeight; + stakingIntentHash = result.logs[0].args._stakingIntentHash; + }) + + it('fails to confirm by non-ops', async () => { + await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash)); + await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash, { from: admin })); + }) + + it('successfully confirms', async () => { + var BLOCKS_TO_WAIT_SHORT = 240; + var expirationHeight = await registrar.confirmStakingIntent.call(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash, { from: ops }); + + assert.ok(expirationHeight > BLOCKS_TO_WAIT_SHORT); + }) + }) + + describe('ConfirmRedemptionIntent for value chain', async() => { + var contracts = null; + var valueToken = null; + var registrar = null; + var openSTUtility = null; + var openSTValue = null; + var core = null; + var uuid = null; + var nonce = null; + var redemptionIntentHash = null; + const BLOCKS_TO_WAIT_LONG = 80667; + const amountUTRedeemed = (conversionRate / (10**conversionRateDecimals)); + const lock = HashLock.getHashLock(); + const lockR = HashLock.getHashLock(); + + before(async() => { + contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); + valueToken = contracts.valueToken; + registrar = contracts.registrar; + openSTUtility = contracts.openSTUtility; + openSTValue = contracts.openSTValue; + core = contracts.core; + uuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); + + await registrar.addCore(openSTValue.address, core.address, { from: ops }); + await registrar.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid, { from: ops }); + await valueToken.approve(openSTValue.address, amountST, { from: staker }); + var result = await openSTValue.stake(uuid, amountST, staker, lock.l, staker, { from: staker }); + var stakingIntentHash = result.logs[0].args._stakingIntentHash; + await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); + nonce = await openSTValue.getNextNonce.call(staker); + redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l); + }) + + it('fails to confirm by non-ops', async () => { + await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash)); + await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash, { from: admin })); + }) + + it('successfully confirms', async () => { + var BLOCKS_TO_WAIT_SHORT = 240; + + var confirmReturns = await registrar.confirmRedemptionIntent.call(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash, { from: ops }); + assert.equal(confirmReturns[0], (amountUTRedeemed * (10**conversionRateDecimals))/conversionRate); + assert.ok(confirmReturns[1] > BLOCKS_TO_WAIT_SHORT); + }) + }) +}) diff --git a/test/Registrar_utils.js b/test/Registrar_utils.js new file mode 100644 index 00000000..c9504e79 --- /dev/null +++ b/test/Registrar_utils.js @@ -0,0 +1,71 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Registrar_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); + +var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); +var Registrar = artifacts.require("./Registrar.sol"); +var OpenSTUtility = artifacts.require("./OpenSTUtility.sol"); +var OpenSTValue = artifacts.require("./OpenSTValue.sol"); +var Core = artifacts.require("./Core.sol"); +var Workers = artifacts.require("./Workers.sol") + +/// @dev Deploy +module.exports.deployRegistrar = async (artifacts, accounts) => { + const chainIdValue = 3; + const chainIdUtility = 1410; + const valueToken = await SimpleToken.new(); + const registrar = await Registrar.new(); + const staker = accounts[2]; + const amountST = new BigNumber(web3.toWei(2, "ether")); + const deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); + const admin = accounts[3]; + const ops = accounts[2]; + + // Registrar is OpsManaged + await registrar.setOpsAddress(accounts[1]); + await registrar.setAdminAddress(accounts[3]); + + // Set SimpleToken admin to in order to finalize SimpleToken + await valueToken.setAdminAddress(accounts[3]); + // SimpleToken must be finalized to permit certain transfers + await valueToken.finalize({ from: accounts[3] }); + await valueToken.transfer(staker, amountST); + + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); + + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, { gas: 10000000 }); + const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address); + const core = await Core.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address, workers.address); + + return { + valueToken : valueToken, + registrar : registrar, + openSTUtility : openSTUtility, + openSTValue : openSTValue, + core : core + } +} diff --git a/test/STPrime.js b/test/STPrime.js new file mode 100644 index 00000000..b10fa5d8 --- /dev/null +++ b/test/STPrime.js @@ -0,0 +1,136 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: STPrime.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const HashLock = require('./lib/hash_lock.js'); +const STPrime_utils = require('./STPrime_utils.js'); + +/// +/// Test stories +/// +/// Mint, Claim, Burn +/// fails to mint by non-openSTProtocol +/// fails to mint by openSTProtocol when not initialized +/// successfully mints +/// successfully claims +/// fails to burn by non-openSTProtocol +/// fails to burn by openSTProtocol if msg.value != amount +/// successfully burns +/// + +// N.B.: BECAUSE THIS TEST AFFECTS THE EXTERNAL ACCOUNTS ON THE CHAIN, IT SHOULD BE RUN SEPARATELY +// AS ITS CHANGES TO ACCOUNT VALUES LAST BETWEEN RUNS +// TODO: Make contracts with necessary functionality to mock external accounts +contract('STPrime', function(accounts) { + const openSTProtocol = accounts[4]; + + const beneficiary = accounts[19]; // set to 0 balance in runTestRpc.sh + const ST1 = new BigNumber(web3.toWei(1, "ether")); + const ST2 = new BigNumber(web3.toWei(2, "ether")); + const ST800M = new BigNumber(web3.toWei(800000000, "ether")); + const sendGas = new BigNumber(21000); + + var result = null; + var totalBase = null; + var totalSupply = null; + var startingBalance = null; + var unclaimed = null; + + describe ('Mint, Claim, Burn', async () => { + before(async () => { + contracts = await STPrime_utils.deploySTPrime(artifacts, accounts); + stPrime = contracts.stPrime; + }) + + it('fails to mint by non-openSTProtocol', async () => { + await Utils.expectThrow(stPrime.mint(beneficiary, ST2, { from: accounts[0] })); + }) + + it('fails to mint by openSTProtocol when not initialized', async () => { + await Utils.expectThrow(stPrime.mint(beneficiary, ST2, { from: openSTProtocol })); + }) + + it('successfully mints', async () => { + await stPrime.initialize({ from: accounts[1], value: ST800M }); + + assert.equal(await stPrime.totalSupply.call(), 0); + beneficiaryBalance = await web3.eth.getBalance(beneficiary); + assert.equal(beneficiaryBalance.toNumber(), 0); + assert.equal(await stPrime.unclaimed.call(beneficiary), 0); + assert.equal(await stPrime.mint.call(beneficiary, ST2, { from: openSTProtocol }), true); + result = await stPrime.mint(beneficiary, ST2, { from: openSTProtocol }); + + var postMintBase = await web3.eth.getBalance(stPrime.address); + totalSupply = await stPrime.totalSupply.call(); + unclaimed = await stPrime.unclaimed.call(beneficiary); + beneficiaryBalance = await web3.eth.getBalance(beneficiary); + + assert.equal(postMintBase.toNumber(), ST800M); + assert.equal(totalSupply.toNumber(), ST2); + assert.equal(unclaimed.toNumber(), ST2); + assert.equal(beneficiaryBalance.toNumber(), 0); + }) + + it('successfully claims', async () => { + assert.equal(await stPrime.claim.call(beneficiary, { from: openSTProtocol }), true); + result = await stPrime.claim(beneficiary, { from: openSTProtocol }); + + var postClaimBase = await web3.eth.getBalance(stPrime.address); + totalSupply = await stPrime.totalSupply.call(); + unclaimed = await stPrime.unclaimed.call(beneficiary); + beneficiaryBalance = await web3.eth.getBalance(beneficiary); + + assert.equal(postClaimBase.toNumber(), ST800M.minus(ST2).toNumber()); + assert.equal(totalSupply.toNumber(), ST2); + assert.equal(unclaimed.toNumber(), 0); + assert.equal(beneficiaryBalance.toNumber(), ST2); + }) + + it('fails to burn by non-openSTProtocol', async () => { + await Utils.expectThrow(stPrime.burn(beneficiary, ST2, { from: accounts[0] })); + }) + + it('fails to burn by openSTProtocol if msg.value != amount', async () => { + const STValue = new BigNumber(web3.toWei(1, "ether")); + await Utils.expectThrow(stPrime.burn(beneficiary, ST2, { from: openSTProtocol, value: STValue })); + }) + + it('successfully burns', async () => { + // Protocol must hold STPrime in order to burn STPrime + await web3.eth.sendTransaction({ from: beneficiary, to: openSTProtocol, value: ST1 }); + assert.equal(await stPrime.burn.call(beneficiary, ST1, { from: openSTProtocol, value: ST1 }), true); + result = await stPrime.burn(beneficiary, ST1, { from: openSTProtocol, value: ST1 }); + + var postBurnBase = await web3.eth.getBalance(stPrime.address); + totalSupply = await stPrime.totalSupply.call(); + beneficiaryBalance = await web3.eth.getBalance(beneficiary); + + assert.equal(postBurnBase.toNumber(), ST800M.minus(ST1).toNumber()); + assert.equal(totalSupply.toNumber(), ST1); + + // beneficiary balance is down the transfer plus the cost of the transfer + // the certain calculation of which has proved difficult + assert.ok(beneficiaryBalance.toNumber() < ST1); + assert.ok(beneficiaryBalance.toNumber() > 0); + }) + }) +}) diff --git a/test/STPrime_utils.js b/test/STPrime_utils.js new file mode 100644 index 00000000..590e86c7 --- /dev/null +++ b/test/STPrime_utils.js @@ -0,0 +1,48 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: STPrime_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); +const BigNumber = require('bignumber.js'); + +var Hasher = artifacts.require("./Hasher.sol"); +var STPrimeConfig = artifacts.require("./STPrimeConfig.sol"); +var STPrime = artifacts.require("./STPrime.sol"); + +/// @dev Deploy +module.exports.deploySTPrime = async (artifacts, accounts) => { + const hasher = await Hasher.new(); + const stPrimeConfig = await STPrimeConfig.new(); + /// mock OpenST protocol contract address with an external account + const openSTProtocol = accounts[4]; + const conversionRateDecimals = 5; + const conversionRate = new BigNumber(10 * (10**conversionRateDecimals)); + const genesisChainIdValue = 3; + const genesisChainIdUtility = 1410; + const stPrimeSymbol = await stPrimeConfig.STPRIME_SYMBOL.call(); + const stPrimeName = await stPrimeConfig.STPRIME_NAME.call(); + const UUID = await hasher.hashUuid.call(stPrimeSymbol, stPrimeName, genesisChainIdValue, genesisChainIdUtility, openSTProtocol, conversionRate, conversionRateDecimals); + + const stPrime = await STPrime.new(UUID, genesisChainIdValue, genesisChainIdUtility, conversionRate, conversionRateDecimals, { from: openSTProtocol }); + + return { + stPrime : stPrime + } +} diff --git a/test/SafeMath.js b/test/SafeMath.js new file mode 100644 index 00000000..7223a1e0 --- /dev/null +++ b/test/SafeMath.js @@ -0,0 +1,80 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: OpenSTUtility +// +// http://www.simpletoken.org/ +// +// Based on the SafeMath library by the OpenZeppelin team. +// Copyright (c) 2016 Smart Contract Solutions, Inc. +// https://github.com/OpenZeppelin/zeppelin-solidity +// The MIT License. +// ---------------------------------------------------------------------------- + +const Utils = require('./lib/utils.js'); + +var SafeMathMock = artifacts.require('./SafeMathMock.sol'); + +contract('SafeMath', function (accounts) { + let safeMath; + + before(async function () { + safeMath = await SafeMathMock.new(); + }); + + it('multiplies correctly', async function () { + let a = 5678; + let b = 1234; + await safeMath.multiply(a, b); + let result = await safeMath.result(); + assert.equal(result, a * b); + }); + + it('adds correctly', async function () { + let a = 5678; + let b = 1234; + await safeMath.add(a, b); + let result = await safeMath.result(); + + assert.equal(result, a + b); + }); + + it('subtracts correctly', async function () { + let a = 5678; + let b = 1234; + await safeMath.subtract(a, b); + let result = await safeMath.result(); + + assert.equal(result, a - b); + }); + + it('should throw an error if subtraction result would be negative', async function () { + let a = 1234; + let b = 5678; + await Utils.expectThrow(safeMath.subtract(a, b)) + }); + + it('should throw an error on addition overflow', async function () { + let a = 115792089237316195423570985008687907853269984665640564039457584007913129639935; + let b = 1; + await Utils.expectThrow(safeMath.add(a, b)); + }); + + it('should throw an error on multiplication overflow', async function () { + let a = 115792089237316195423570985008687907853269984665640564039457584007913129639933; + let b = 2; + await Utils.expectThrow(safeMath.multiply(a, b)); + }); +}); \ No newline at end of file diff --git a/test/SimpleStake.js b/test/SimpleStake.js new file mode 100644 index 00000000..3c2cbdb7 --- /dev/null +++ b/test/SimpleStake.js @@ -0,0 +1,90 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: SimpleStake.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const SimpleStake_utils = require('./SimpleStake_utils.js'); + +/// +/// Test stories +/// +/// Properties +/// has eip20Token +/// has uuid +/// +/// ReleaseTo +/// fails to release by non-openSTProtocol +/// fails to release by openSTProtocol with null to +/// successfully releases to +/// + +contract('SimpleStake', function(accounts) { + const UUID = "0xbce8a3809c9356cf0e5178a2aef207f50df7d32b388c8fceb8e363df00efce31"; + const openSTProtocol = accounts[4]; + const to = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; + const ST1 = new BigNumber(web3.toWei(1, "ether")); + const ST2 = new BigNumber(web3.toWei(2, "ether")); + + describe ('Properties', async () => { + before(async () => { + contracts = await SimpleStake_utils.deploySimpleStake(artifacts, accounts); + token = contracts.token; + simpleStake = contracts.simpleStake; + }) + + it('has eip20Token', async () => { + assert.equal(await simpleStake.eip20Token.call(), token.address); + }) + + it('has uuid', async () => { + assert.equal(await simpleStake.uuid.call(), UUID); + }) + }) + + describe('ReleaseTo', async () => { + before(async () => { + contracts = await SimpleStake_utils.deploySimpleStake(artifacts, accounts); + token = contracts.token; + simpleStake = contracts.simpleStake; + await token.transfer(simpleStake.address, ST2, { from: accounts[0] }); + }) + + it('fails to release by non-openSTProtocol', async () => { + await Utils.expectThrow(simpleStake.releaseTo(to, ST1, { from: accounts[0] })); + }); + + it('fails to release by openSTProtocol with null to', async () => { + await Utils.expectThrow(simpleStake.releaseTo(0, ST1, { from: openSTProtocol })); + }); + + it('successfully releases to', async () => { + var stake = await simpleStake.getTotalStake.call(); + assert.equal(stake.toNumber(), ST2.toNumber()); + assert.equal(await simpleStake.releaseTo.call(to, ST1, { from: openSTProtocol }), true); + result = await simpleStake.releaseTo(to, ST1, { from: openSTProtocol }); + + var updatedStake = await simpleStake.getTotalStake.call(); + assert.equal(updatedStake.toNumber(), stake.minus(ST1).toNumber()); + SimpleStake_utils.checkReleasedEventGroup(result, openSTProtocol, to, ST1); + }); + }) +}) + diff --git a/test/SimpleStake_integrated.js b/test/SimpleStake_integrated.js new file mode 100644 index 00000000..a6990bb4 --- /dev/null +++ b/test/SimpleStake_integrated.js @@ -0,0 +1,138 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: SimpleStake_integrated.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const SimpleStakeUtils = require('./SimpleStake_utils.js') + +/// +/// Test stories +/// +/// Test SimpleStake in isolation from OpenST protocol +/// - + +contract('SimpleStake', function(accounts) { + + /// mock unique identifier for utility token + const UUID = "0xbce8a3809c9356cf0e5178a2aef207f50df7d32b388c8fceb8e363df00efce31"; + /// mock OpenST protocol contract address with an external account + const openSTProtocol = accounts[4]; + /// mock upgraded OpenST protocol contract address with an external account + const upgradedOpenSTProtocol = accounts[5]; + /// constant protocol wait time for protocol transfer in blocks + const PROTOCOL_TRANSFER_BLOCKS_TO_WAIT = 40320; + + describe('in isolation', async () => { + + var token = null; + var simpleStake = null; + var totalSupply = new BigNumber(0); + + const ST0 = new BigNumber(web3.toWei(0, "ether")); + const ST2 = new BigNumber(web3.toWei(2, "ether")); + const ST3 = new BigNumber(web3.toWei(3, "ether")); + const ST5 = new BigNumber(web3.toWei(5, "ether")); + + before(async () => { + var contracts = + await SimpleStakeUtils.deploySimpleStake( + artifacts, accounts); + + token = contracts.token; + simpleStake = contracts.simpleStake; + + totalSupply = new BigNumber(await token.balanceOf.call(accounts[0])); + Assert.ok(totalSupply.toNumber() >= ST5.toNumber()); + }); + + context("on construction", async () => { + + it("should store a UUID", async() => { + Assert.equal(await simpleStake.uuid.call(), UUID); + }); + + it("should have an EIP20Token contract", async() => { + Assert.equal(await simpleStake.eip20Token.call(), token.address); + }); + + it("should have a well-defined OpenSTProtocol", async() => { + // assert protocol contract address is set + Assert.equal(await simpleStake.openSTProtocol.call(), openSTProtocol); + // assert no new protocol contract address is proposed + Assert.ok(Utils.isNullAddress(await simpleStake.proposedProtocol.call())); + // assert transfer height is zero + Assert.equal(await simpleStake.earliestTransferHeight.call(), 0); + }); + + it("should hold a zero balance", async() => { + Assert.equal(await simpleStake.getTotalStake.call(), 0); + }); + + it("Protocol transfer wait blocktime", async() => { + Assert.equal(await simpleStake.blocksToWaitForProtocolTransfer.call(), + PROTOCOL_TRANSFER_BLOCKS_TO_WAIT); + }); + }); + + context('before protocol transfer', async () => { + + it("can stake 5ST", async () => { + Assert.ok(await token.transfer(simpleStake.address, ST5, { from: accounts[0] })); + await SimpleStakeUtils.checkTotalStaked(simpleStake, token, ST5); + Assert.equal((await token.balanceOf.call(accounts[0])).toNumber(), totalSupply.sub(ST5).toNumber()); + }); + + it("can release 3ST", async () => { + const result = await simpleStake.releaseTo(accounts[0], ST3, { from: openSTProtocol }); + await SimpleStakeUtils.checkTotalStaked(simpleStake, token, ST2); + Assert.equal((await token.balanceOf(accounts[0])).toNumber(), totalSupply.sub(ST2).toNumber()); + SimpleStakeUtils.checkReleasedEventGroup(result, openSTProtocol, accounts[0], ST3); + }); + + it("must fail to release 3ST", async () => { + await Utils.expectThrow(simpleStake.releaseTo(accounts[0], ST3, { from: openSTProtocol })); + await SimpleStakeUtils.checkTotalStaked(simpleStake, token, ST2); + Assert.equal((await token.balanceOf(accounts[0])).toNumber(), totalSupply.sub(ST2).toNumber()); + }); + + it("can release all remaining stake", async () => { + var remainingStake = await simpleStake.getTotalStake.call(); + Assert.ok(await simpleStake.releaseTo(accounts[0], remainingStake, { from: openSTProtocol })); + await SimpleStakeUtils.checkTotalStaked(simpleStake, token, ST0); + Assert.equal((await token.balanceOf(accounts[0])).toNumber(), totalSupply.toNumber()); + }); + }); + + // TODO: [ben] + // - test protocol transfers + // - test staking and releasing during protocol transfers + // - test the time to wait by calling repeatedly complete and expect it to fail if + // blockheight is not yet reached - find better way to test this + + // context('during protocol transfer', async () => { + + // it('can initiate protocol transfer', async () => { + // Assert.ok(await ); + // }); + // }); + }) +}); \ No newline at end of file diff --git a/test/SimpleStake_utils.js b/test/SimpleStake_utils.js new file mode 100644 index 00000000..43f05520 --- /dev/null +++ b/test/SimpleStake_utils.js @@ -0,0 +1,81 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: SimpleStake_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); + +var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); +var SimpleStake = artifacts.require("./SimpleStake.sol"); + +/// @dev Deploy +module.exports.deploySimpleStake = async (artifacts, accounts) => { + /// mock unique identifier for utility token + const UUID = "0xbce8a3809c9356cf0e5178a2aef207f50df7d32b388c8fceb8e363df00efce31"; + /// mock OpenST protocol contract address with an external account + const openSTProtocol = accounts[4]; + + const token = await SimpleToken.new({ from: accounts[0], gas: 3500000 }); + // Set Simple Token admin to account[1] + await token.setAdminAddress(accounts[1]); + // and finalize Simple Token + Assert.ok(await token.finalize({ from: accounts[1] })); + + const simpleStake = await SimpleStake.new(token.address, openSTProtocol, UUID, { from: accounts[0] }); + + return { + token : token, + simpleStake : simpleStake + }; +}; + +/// @dev Check staked balance +module.exports.checkTotalStaked = async (stake, token, amount) => { + Assert.equal((await stake.getTotalStake.call()).toNumber(), amount.toNumber()); + Assert.equal((await token.balanceOf.call(stake.address)).toNumber(), amount.toNumber()); +}; + +/* + * Event checks + */ + +/// @dev Check stake release events +module.exports.checkReleasedEventGroup = (result, _protocol, _to, _amount) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + }; + // TODO: [ben] parse result.receipt.logs for EIP20.Transfer event too + Assert.equal(result.logs.length, 1); + + const releaseEvent = result.logs[0]; + Assert.equal(releaseEvent.event, "ReleasedStake"); + Assert.equal(releaseEvent.args._protocol, _protocol); + Assert.equal(releaseEvent.args._to, _to); + Assert.equal(releaseEvent.args._amount.toNumber(), _amount.toNumber()); +}; + +module.exports.checkTransferEvent = (event, _from, _to, _value) => { + if (Number.isInteger(_value)) { + _value = new BigNumber(_value); + } + Assert.equal(event.event, "Transfer"); + Assert.equal(event.args._from, _from); + Assert.equal(event.args._to, _to); + Assert.equal(event.args._value.toNumber(), _value.toNumber()); +} \ No newline at end of file diff --git a/test/SimpleToken.js b/test/SimpleToken.js new file mode 100644 index 00000000..158994ab --- /dev/null +++ b/test/SimpleToken.js @@ -0,0 +1,478 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: SimpleToken.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); +// const Web3 = require('web3'); +const Moment = require('moment'); +const BigNumber = require('bignumber.js'); + +const Utils = require('./lib/utils.js'); +const SimpleTokenUtils = require('./SimpleToken_utils.js') +const EIP20Token_utils = require('./EIP20Token_utils.js') +const web3EventsDecoder = require('./lib/event_decoder.js'); + + +const SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") + + +// +// Basic properties +// name +// symbol +// decimals +// totalSupply +// balances is private +// Constructor raised transfer event +// +// transfer before finalize +// transfer from owner to other +// transfer 0 tokens +// transfer > balance +// transfer = balance +// transfer 1 token +// transfer 10000 tokens +// +// transfer after finalize +// transfer 0 tokens +// transfer > balance +// transfer = balance +// transfer 1 token +// transfer 10000 tokens +// +// transferFrom +// transfer 0 from account 0 -> 1 with 0 allowance +// transfer 1000 from account 0 -> 1 without allowance +// transfer 1000 from account 0 -> 1 with 10 allowance +// transfer 1000 from account 0 -> 1 with 1000 allowance +// transfer 50+50 from account 0 -> 1 with 100 allowance +// transfer 1000 from account 0 -> 1 with 999 allowance +// transfer 1 from account 0 -> 1 with 0 allowance +// +// transferFrom after finalize +// transfer 0 from account 0 -> 1 with 0 allowance +// transfer 1000 from account 0 -> 1 without allowance +// transfer 1000 from account 0 -> 1 with 10 allowance +// transfer 1000 from account 0 -> 1 with 1000 allowance +// transfer 50+50 from account 0 -> 1 with 100 allowance +// transfer 1000 from account 0 -> 1 with 999 allowance +// transfer 1 from account 0 -> 1 with 0 allowance +// +// approve +// balanceOf +// allowance +// * covered indirectly by testing the other functions +// +// burn +// burn greater than balance +// burn less than or equal to balance +// +// balances +// check if balances is exposed publicly +// +// owner and operations +// - owner is set +// - admin is 0 +// - operations is 0 +// - set operations key +// - set operations key +// - finalize (owner + ops) +// +// finalize +// - check properties before and after finalize +// - try to finalize a 2nd time +// * other cases covered indirectly by testing other functions +// + +contract('SimpleToken', (accounts) => { + + const SYMBOL = "ST" + const NAME = "Simple Token" + const DECIMALS = 18 + const TOTAL_SUPPLY = new BigNumber(web3.toWei(800000000, "ether")); + + const ST10000 = new BigNumber(web3.toWei(10000, "ether")); + const ST9000 = new BigNumber(web3.toWei(9000, "ether")); + const ST1000 = new BigNumber(web3.toWei(1000, "ether")); + const ST10 = new BigNumber(web3.toWei(10, "ether")); + const ST1 = new BigNumber(web3.toWei(1, "ether")); + + const owner = accounts[0] + const admin = accounts[1] + const ops = accounts[2] + + async function createToken() { + return await SimpleToken.new() + } + + + describe('Basic properties', async () => { + + var token = null + + before(async () => { + token = await createToken() + }) + + + it("name", async () => { + assert.equal(await token.name.call(), NAME) + }) + + it("symbol", async () => { + assert.equal(await token.symbol.call(), SYMBOL) + }) + + it("decimals", async () => { + assert.equal(await token.decimals.call(), DECIMALS) + }) + + it("totalSupply", async () => { + assert.equal((await token.totalSupply.call()).toNumber(), TOTAL_SUPPLY.toNumber()) + }) + + it("balances is private", async () => { + assert.isTrue(typeof(token.balances) == 'undefined') + }) + + it('Constructor raised transfer event', async () => { + const receipt = await web3.eth.getTransactionReceipt(token.transactionHash) + assert.equal(receipt.logs.length, 1) + const logs = web3EventsDecoder.perform(receipt, token.address, token.abi); + EIP20Token_utils.checkTransferEventAbiDecoder(logs, 0, accounts[0], TOTAL_SUPPLY) + }) + // it('Constructor raised transfer event', async () => { + // const receipt = await web3.eth.getTransactionReceipt(token.transactionHash) + // assert.equal(receipt.logs.length, 1) + // console.log("Simple Token -------- token.abi"); + // console.log(token.abi.length) + // console.log(JSON.stringify(token.abi[32], null, 4)); + // console.log("Simple Token -------- receipt.logs[0]"); + // console.log(receipt.logs[0]) + // console.log("Simple Token -------- receipt.logs[0].topics"); + // console.log(receipt.logs[0].topics) + // // @dev SimpleToken abi[32] is 'Transfer' event; + // // solve this better for moving to web3 v1.0.0 + // // var inputs = token.abi[32].inputs; + // // var data = receipt.logs[0].data; + // // var topics = receipt.logs[0].topics; + // // const logs = Web3.eth.abi.decodeLog(inputs, data, topics) + // // console.log(JSON.stringify(logs, null, 4)); + // // Utils.checkTransferEvent(logs, 0, accounts[0], TOTAL_SUPPLY) + // }) + }) + + + describe('transfer function after finalize', async () => { + + var token = null + + before(async () => { + token = await createToken() + + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) + + await token.finalize({from: admin}) + }) + + it("transfer tokens from owner to other", async () => { + var res = await token.transfer(accounts[1], ST1000); + EIP20Token_utils.checkTransferEventGroup(await token.transfer(accounts[1], ST1000), accounts[0], accounts[1], ST1000) + }) + + it("transfer 0 tokens", async () => { + assert.equal(await token.transfer.call(accounts[2], 0, {from: accounts[1]}), true) + EIP20Token_utils.checkTransferEventGroup(await token.transfer(accounts[2], 0, {from: accounts[1]}), accounts[1], accounts[2], 0) + }) + + it("transfer > balance", async () => { + const balance = await token.balanceOf.call(accounts[1]) + await Utils.expectThrow(token.transfer.call(accounts[2], balance.add(ST1), {from: accounts[1]})) + }) + + it("transfer = balance", async () => { + const balance1Before = await token.balanceOf.call(accounts[1]) + const balance2Before = await token.balanceOf.call(accounts[2]) + + assert.equal(await token.transfer.call(accounts[2], balance1Before, {from: accounts[1]}), true) + await token.transfer(accounts[2], balance1Before, {from: accounts[1]}) + + const balance1After = await token.balanceOf.call(accounts[1]) + const balance2After = await token.balanceOf.call(accounts[2]) + + assert.equal(balance1After.toNumber(), 0) + assert.equal(balance2After.sub(balance2Before).toNumber(), balance1Before.sub(balance1After).toNumber(), balance1Before.toNumber()) + }) + + it("transfer 1 token", async () => { + const balance1Before = await token.balanceOf.call(accounts[1]) + const balance2Before = await token.balanceOf.call(accounts[2]) + + assert.equal(await token.transfer.call(accounts[1], ST1, {from: accounts[2]}), true) + await token.transfer(accounts[1], ST1, {from: accounts[2]}) + + const balance1After = await token.balanceOf.call(accounts[1]) + const balance2After = await token.balanceOf.call(accounts[2]) + + assert.equal(balance1After.toNumber(), ST1.toNumber()) + assert.equal(balance2After.toNumber(), balance2Before.sub(ST1).toNumber()) + }) + }) + + + describe('transferFrom function before finalize', async () => { + + var token = null + + before(async () => { + token = await createToken() + + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) + + await token.transfer(accounts[4], ST10000) + }) + + + it("transfer 0 from account 1 -> 2 with 0 allowance", async () => { + assert.equal(await token.approve.call(accounts[2], 0, {from: accounts[4]}), true) + assert.equal(await token.allowance.call(accounts[4], accounts[2]), 0) + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST10, {from: accounts[2]})) + }) + + it("transfer 1000 from account 1 -> 2 without allowance", async () => { + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, {from: accounts[4]})) + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, {from: accounts[2]})) + }) + + it("transfer 1000 from account 1 -> 2 with 10 allowance", async () => { + assert.equal(await token.approve.call(accounts[2], ST10, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(accounts[2], ST10, {from: accounts[4]}), accounts[4], accounts[2], ST10) + + assert.equal((await token.allowance.call(accounts[4], accounts[2], {from: accounts[4]})).toNumber(), ST10.toNumber()) + + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, {from: accounts[4]})) + await Utils.expectThrow(token.transferFrom.call(accounts[4], accounts[2], ST1000, {from: accounts[2]})) + }) + + it("transfer 1000 from account 1 -> 2 with 1000 allowance (as ops)", async () => { + // We first need to bring approval to 0 + assert.equal(await token.approve.call(ops, 0, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(ops, 0, {from: accounts[4]}), accounts[4], ops, 0) + + assert.equal(await token.allowance.call(accounts[4], ops, {from: accounts[4]}), 0) + + assert.equal(await token.approve.call(ops, ST1000, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(ops, ST1000, {from: accounts[4]}), accounts[4], ops, ST1000) + + assert.equal(await token.allowance.call(accounts[4], ops), ST1000.toNumber(), {from: accounts[4]}) + + await Utils.expectThrow(token.transferFrom.call(accounts[4], ops, ST1000, {from: accounts[4]})) + assert.equal(await token.transferFrom.call(accounts[4], ops, ST1000, {from: ops}), true) + await token.transferFrom(accounts[4], ops, ST1000, {from: ops}) + + assert.equal((await token.balanceOf.call(accounts[4])).toNumber(), ST9000.toNumber()) + assert.equal((await token.balanceOf.call(ops)).toNumber(), ST1000.toNumber()) + }) + + it("transfer 1000 from account 1 -> 2 with 1000 allowance (as admin)", async () => { + // We first need to bring approval to 0 + assert.equal(await token.approve.call(admin, 0, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(admin, 0, {from: accounts[4]}), accounts[4], admin, 0) + + assert.equal(await token.allowance.call(accounts[4], admin, {from: accounts[4]}), 0) + + assert.equal(await token.approve.call(admin, ST1000, {from: accounts[4]}), true) + EIP20Token_utils.checkApprovalEventGroup(await token.approve(admin, ST1000, {from: accounts[4]}), accounts[4], admin, ST1000) + + assert.equal(await token.allowance.call(accounts[4], admin), ST1000.toNumber(), {from: accounts[4]}) + + await Utils.expectThrow(token.transferFrom.call(accounts[4], admin, ST1000, {from: accounts[4]})) + await Utils.expectThrow(token.transferFrom.call(accounts[4], admin, ST1000, {from: admin})) + }) + }) + + + describe('transferFrom function after finalize', async () => { + + var token = null + + before(async () => { + token = await createToken() + + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) + + await token.transfer(accounts[1], ST10000) + + token.finalize({from: admin}) + }) + + + it("transfer 0 from account 1 -> 2 with 0 allowance", async () => { + assert.equal(await token.approve.call(accounts[2], 0, {from: accounts[1]}), true) + assert.equal(await token.allowance.call(accounts[1], accounts[2]), 0) + assert.equal(await token.transferFrom.call(accounts[1], accounts[2], 0, {from: accounts[1]}), true) + assert.equal(await token.transferFrom.call(accounts[1], accounts[2], 0, {from: accounts[2]}), true) + }) + + it("transfer 1000 from account 1 -> 2 without allowance", async () => { + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[1]})) + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[2]})) + }) + + it("transfer 1000 from account 1 -> 2 with 10 allowance", async () => { + assert.equal(await token.approve.call(accounts[2], ST10, {from: accounts[1]}), true) + await token.approve(accounts[2], ST10, {from: accounts[1]}) + assert.equal(await token.allowance.call(accounts[1], accounts[2]), ST10.toNumber()) + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[1]})) + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[2]})) + }) + + it("transfer 1000 from account 1 -> 2 with 1000 allowance", async () => { + // We first need to bring approval to 0 + assert.equal(await token.approve.call(accounts[2], 0, {from: accounts[1]}), true) + await token.approve(accounts[2], 0, {from: accounts[1]}) + assert.equal(await token.allowance.call(accounts[1], accounts[2]), 0) + + assert.equal(await token.approve.call(accounts[2], ST1000, {from: accounts[1]}), true) + await token.approve(accounts[2], ST1000, {from: accounts[1]}) + assert.equal(await token.allowance.call(accounts[1], accounts[2]), ST1000.toNumber()) + + await Utils.expectThrow(token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[1]})) + assert.equal(await token.transferFrom.call(accounts[1], accounts[2], ST1000, {from: accounts[2]}), true) + await token.transferFrom(accounts[1], accounts[2], ST1000, {from: accounts[2]}) + + assert.equal((await token.balanceOf.call(accounts[1])).toNumber(), ST9000.toNumber()) + assert.equal((await token.balanceOf.call(accounts[2])).toNumber(), ST1000.toNumber()) + }) + }) + + + describe('owner and operations', async () => { + + var token = null + + + before(async () => { + token = await createToken() + + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) + + await token.transfer(accounts[1], ST10000) + await token.transfer(accounts[2], ST1000) + }) + + + it("check initial owner", async () => { + assert.equal(await token.owner.call(), accounts[0]) + }) + + it("check initial admin", async () => { + assert.equal(await token.adminAddress.call(), accounts[1]) + }) + + it("check initial ops", async () => { + assert.equal(await token.opsAddress.call(), accounts[2]) + }) + + it("change ops address to some account", async () => { + assert.equal(await token.setOpsAddress.call(accounts[5]), true) + await token.setOpsAddress(accounts[5]) + }) + + it("change ops address to 0", async () => { + assert.equal(await token.setOpsAddress.call(0), true) + await token.setOpsAddress(0) + }) + + it("change ops address to account 3", async () => { + assert.equal(await token.setOpsAddress.call(accounts[3]), true) + await token.setOpsAddress(accounts[3]) + }) + + it("finalize as normal", async () => { + await Utils.expectThrow(token.finalize.call({from: accounts[4]})) + }) + + it("finalize as ops", async () => { + await Utils.expectThrow(token.finalize.call({from: ops})) + }) + + it("finalize as admin", async () => { + assert.equal(await token.finalize.call({from: admin}), true) + }) + }) + + + describe('finalize function', async () => { + + var token = null + + before(async () => { + token = await createToken() + + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) + }) + + + it("check properties before and after finalize", async () => { + assert.equal(await token.finalized.call(), false) + SimpleTokenUtils.checkFinalizedEventGroup(await token.finalize({from: admin})) + assert.equal(await token.finalized.call(), true) + }) + + it("try to finalize a 2nd time", async () => { + await Utils.expectThrow(token.finalize.call({from: admin})) + }) + }) + + + describe('burn function', async () => { + + var token = null + + before(async () => { + token = await createToken() + + await token.setOpsAddress(ops) + await token.setAdminAddress(admin) + }) + + it("burn greater than balance", async () => { + await Utils.expectThrow(token.burn.call((TOTAL_SUPPLY.plus(ST1)), {from: accounts[0]})) + }) + + it("burn less than or equal to balance", async () => { + const balanceBefore = await token.balanceOf(accounts[0]) + + SimpleTokenUtils.checkBurntEventGroup(await token.burn(ST1000, {from: accounts[0]})) + + const currentBalance = await token.balanceOf(accounts[0]) + const currentSupply = await token.totalSupply.call() + + assert.equal(balanceBefore.minus(currentBalance).toNumber(), ST1000.toNumber()) + assert.equal(TOTAL_SUPPLY.minus(currentSupply).toNumber(), ST1000.toNumber()) + }) + }) +}) diff --git a/test/SimpleToken_utils.js b/test/SimpleToken_utils.js new file mode 100644 index 00000000..85be9fb2 --- /dev/null +++ b/test/SimpleToken_utils.js @@ -0,0 +1,54 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: SimpleToken_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); +const BigNumber = require('bignumber.js'); + +var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); + +/// @dev Deploy +module.exports.deploySimpleToken = async (artifacts, accounts) => { + + const token = await SimpleToken.new({ from: accounts[0], gas: 3500000 }); + + return { + token : token + } +} + +module.exports.checkFinalizedEventGroup = (result) => { + assert.equal(result.logs.length, 1) + + const event = result.logs[0] + + assert.equal(event.event, "Finalized") +} + + +module.exports.checkBurntEventGroup = (result, _from, _value) => { + assert.equal(result.logs.length, 1) + + const event = result.logs[0] + + assert.equal(event.event, "Burnt") + assert.equal(event._from, _from) + assert.equal(event._value, _value) +} \ No newline at end of file diff --git a/test/UtilityTokenAbstract.js b/test/UtilityTokenAbstract.js new file mode 100644 index 00000000..fdc40e46 --- /dev/null +++ b/test/UtilityTokenAbstract.js @@ -0,0 +1,205 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: UtilityTokenAbstract.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +const Utils = require('./lib/utils.js'); +const UtilityTokenAbstract_utils = require('./UtilityTokenAbstract_utils.js'); + +const UtilityTokenAbstract = artifacts.require("./UtilityTokenAbstractMock.sol"); + +/// +/// Test stories +/// +/// Construction +/// fails to deploy if UUID is bad +/// +/// Properties +/// has uuid +/// has conversionRate +/// has conversionRateDecimals +/// has genesisChainIdValue +/// has genesisChainIdUtility +/// has genesisOpenSTUtility +/// +/// MintInternal, ClaimInternal, and BurnInternal +/// successfully mints +/// successfully claims +/// successfully burns +/// + +contract('UtilityTokenAbstract', function(accounts) { + const openSTProtocol = accounts[4]; + const conversionRateDecimals = 5; + const conversionRate = new BigNumber(10 * (10**conversionRateDecimals)); // conversion rate => 10 + const genesisChainIdValue = 3; + const genesisChainIdUtility = 1410; + const beneficiary1 = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; + const beneficiary2 = '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; + const ST1 = new BigNumber(web3.toWei(1, "ether")); + const ST2 = new BigNumber(web3.toWei(2, "ether")); + const ST3 = new BigNumber(web3.toWei(3, "ether")); + const ST4 = new BigNumber(web3.toWei(4, "ether")); + + var contracts = null; + var hasher = null; + var utilityTokenAbstract = null; + var uuid = null; + var totalSupply = null; + var unclaimed = null; + var result = null; + var amount = null; + + describe ('Construction', async () => { + it('fails to deploy if UUID is bad', async () => { + await Utils.expectThrow(UtilityTokenAbstract.new("bad uuid", "symbol", "name", genesisChainIdValue, genesisChainIdUtility, conversionRate, conversionRateDecimals, { from: openSTProtocol })); + }) + }) + + describe ('Properties', async () => { + before(async () => { + contracts = await UtilityTokenAbstract_utils.deployUtilityTokenAbstract(artifacts, accounts); + hasher = contracts.hasher; + utilityTokenAbstract = contracts.utilityTokenAbstract; + }) + + it('has uuid', async () => { + uuid = await hasher.hashUuid.call("symbol", "name", genesisChainIdValue, genesisChainIdUtility, openSTProtocol, conversionRate, conversionRateDecimals); + assert.equal(await utilityTokenAbstract.uuid.call(), uuid); + }) + + it ('has conversionRate', async () => { + const contractConversionRate = await utilityTokenAbstract.conversionRate.call(); + assert.equal(contractConversionRate.toNumber(), conversionRate.toNumber()); + }) + + it ('has conversionRateDecimals', async () => { + const contractConversionRateDecimals = await utilityTokenAbstract.conversionRateDecimals.call(); + assert.equal(contractConversionRateDecimals, conversionRateDecimals); + }) + + it ('has genesisChainIdValue', async () => { + assert.equal(await utilityTokenAbstract.genesisChainIdValue.call(), genesisChainIdValue); + }) + + it ('has genesisChainIdUtility', async () => { + assert.equal(await utilityTokenAbstract.genesisChainIdUtility.call(), genesisChainIdUtility); + }) + + it ('has genesisOpenSTUtility', async () => { + assert.equal(await utilityTokenAbstract.genesisOpenSTUtility.call(), openSTProtocol); + }) + }) + + describe ('MintInternal, ClaimInternal, and BurnInternal', async () => { + before(async () => { + contracts = await UtilityTokenAbstract_utils.deployUtilityTokenAbstract(artifacts, accounts); + utilityTokenAbstract = contracts.utilityTokenAbstract; + }) + + it('successfully mints', async () => { + totalSupply = await utilityTokenAbstract.totalSupply.call(); + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary1); + assert.equal(totalSupply.toNumber(), 0); + assert.equal(unclaimed.toNumber(), 0); + assert.equal(await utilityTokenAbstract.mintInternalPublic.call(beneficiary1, ST2), true); + + // Mint for beneficiary1 + result = await utilityTokenAbstract.mintInternalPublic(beneficiary1, ST2); + + totalSupply = await utilityTokenAbstract.totalSupply.call(); + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary1); + assert.equal(totalSupply.toNumber(), ST2.toNumber()); + assert.equal(unclaimed.toNumber(), ST2.toNumber()); + UtilityTokenAbstract_utils.checkMintedEvent(result.logs[0], uuid, beneficiary1, ST2, ST2, ST2); + + // Mint again for beneficiary1 + result = await utilityTokenAbstract.mintInternalPublic(beneficiary1, ST1); + + totalSupply = await utilityTokenAbstract.totalSupply.call(); + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary1); + assert.equal(totalSupply.toNumber(), ST3.toNumber()); + assert.equal(unclaimed.toNumber(), ST3.toNumber()); + UtilityTokenAbstract_utils.checkMintedEvent(result.logs[0], uuid, beneficiary1, ST1, ST3, ST3); + + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary2); + assert.equal(unclaimed.toNumber(), 0); + assert.equal(await utilityTokenAbstract.mintInternalPublic.call(beneficiary2, ST1), true); + + // Mint for beneficiary2 + result = await utilityTokenAbstract.mintInternalPublic(beneficiary2, ST1); + + totalSupply = await utilityTokenAbstract.totalSupply.call(); + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary2); + assert.equal(totalSupply.toNumber(), ST4.toNumber()); + assert.equal(unclaimed.toNumber(), ST1.toNumber()); + UtilityTokenAbstract_utils.checkMintedEvent(result.logs[0], uuid, beneficiary2, ST1, ST1, ST4); + }) + + it('successfully claims', async () => { + // Claim for beneficiary1 + totalSupply = await utilityTokenAbstract.totalSupply.call(); + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary1); + amount = await utilityTokenAbstract.claimInternalPublic.call(beneficiary1); + assert.equal(unclaimed.toNumber(), amount.toNumber()); + result = await utilityTokenAbstract.claimInternalPublic(beneficiary1); + + var postClaimTotalSupply = await utilityTokenAbstract.totalSupply.call(); + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary1); + assert.equal(totalSupply.toNumber(), postClaimTotalSupply.toNumber()); + assert.equal(unclaimed.toNumber(), 0); + + // Claim for beneficiary2 + totalSupply = await utilityTokenAbstract.totalSupply.call(); + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary2); + amount = await utilityTokenAbstract.claimInternalPublic.call(beneficiary2); + assert.equal(unclaimed.toNumber(), amount.toNumber()); + result = await utilityTokenAbstract.claimInternalPublic(beneficiary2); + + postClaimTotalSupply = await utilityTokenAbstract.totalSupply.call(); + unclaimed = await utilityTokenAbstract.unclaimed.call(beneficiary2); + assert.equal(totalSupply.toNumber(), postClaimTotalSupply.toNumber()); + assert.equal(unclaimed.toNumber(), 0); + }) + + it('successfully burns', async () => { + // Burn for beneficiary1 + totalSupply = await utilityTokenAbstract.totalSupply.call(); + amount = ST2; + assert.equal(await utilityTokenAbstract.burnInternalPublic.call(beneficiary1, amount), true); + result = await utilityTokenAbstract.burnInternalPublic(beneficiary1, amount); + + var postBurnTotalSupply = await utilityTokenAbstract.totalSupply.call(); + assert.equal(postBurnTotalSupply.toNumber(), totalSupply.minus(amount).toNumber()); + UtilityTokenAbstract_utils.checkBurntEvent(result.logs[0], uuid, beneficiary1, amount, postBurnTotalSupply); + + // Burn 7 for 0x0 to reflect that this function + // is only concerned with reducing totalTokenSupply + totalSupply = postBurnTotalSupply; + amount = new BigNumber(7); + assert.equal(await utilityTokenAbstract.burnInternalPublic.call(0, amount), true); + result = await utilityTokenAbstract.burnInternalPublic(0, amount); + + postBurnTotalSupply = await utilityTokenAbstract.totalSupply.call(); + assert.equal(postBurnTotalSupply.toNumber(), totalSupply.minus(amount).toNumber()); + UtilityTokenAbstract_utils.checkBurntEvent(result.logs[0], uuid, 0, amount, postBurnTotalSupply); + }) + }) +}) diff --git a/test/UtilityTokenAbstract_utils.js b/test/UtilityTokenAbstract_utils.js new file mode 100644 index 00000000..378c85da --- /dev/null +++ b/test/UtilityTokenAbstract_utils.js @@ -0,0 +1,85 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: UtilityTokenAbstract_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const BigNumber = require('bignumber.js'); +var Hasher = artifacts.require("./Hasher.sol"); +var UtilityTokenAbstract = artifacts.require("./UtilityTokenAbstractMock.sol"); + +/// @dev Deploy +module.exports.deployUtilityTokenAbstract = async (artifacts, accounts) => { + const hasher = await Hasher.new(); + /// mock OpenST protocol contract address with an external account + const openSTProtocol = accounts[4]; + const conversionRateDecimals = 5; + const conversionRate = new BigNumber(10*(10**conversionRateDecimals)); // conversaion rate => 10 + const genesisChainIdValue = 3; + const genesisChainIdUtility = 1410; + const UUID = await hasher.hashUuid.call("symbol", "name", genesisChainIdValue, genesisChainIdUtility, openSTProtocol, conversionRate, conversionRateDecimals); + const utilityTokenAbstract = await UtilityTokenAbstract.new(UUID, "symbol", "name", genesisChainIdValue, genesisChainIdUtility, conversionRate, conversionRateDecimals, { from: openSTProtocol }); + + return { + hasher : hasher, + utilityTokenAbstract : utilityTokenAbstract + }; +}; + +/* + * Event checks + */ + +/// @dev Check Minted event +module.exports.checkMintedEvent = (event, _uuid, _beneficiary, _amount, _unclaimed, _totalSupply) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + }; + + if (Number.isInteger(_unclaimed)) { + _unclaimed = new BigNumber(_unclaimed); + }; + + if (Number.isInteger(_totalSupply)) { + _totalSupply = new BigNumber(_totalSupply); + }; + + assert.equal(event.event, "Minted"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._amount.toNumber(), _amount.toNumber()); + assert.equal(event.args._unclaimed.toNumber(), _unclaimed.toNumber()); + assert.equal(event.args._totalSupply.toNumber(), _totalSupply.toNumber()); +}; + +/// @dev Check Burnt event +module.exports.checkBurntEvent = (event, _uuid, _account, _amount, _totalSupply) => { + if (Number.isInteger(_amount)) { + _amount = new BigNumber(_amount); + }; + + if (Number.isInteger(_totalSupply)) { + _totalSupply = new BigNumber(_totalSupply); + }; + + assert.equal(event.event, "Burnt"); + assert.equal(event.args._uuid, _uuid); + assert.equal(event.args._account, _account); + assert.equal(event.args._amount.toNumber(), _amount.toNumber()); + assert.equal(event.args._totalSupply.toNumber(), _totalSupply.toNumber()); +}; diff --git a/test/lib/event_decoder.js b/test/lib/event_decoder.js new file mode 100644 index 00000000..bfe65e46 --- /dev/null +++ b/test/lib/event_decoder.js @@ -0,0 +1,89 @@ +"use strict"; + +const web3EventsDecoder = function () {}; + +web3EventsDecoder.prototype = { + + getFormattedEvents: function(eventsData) { + var formattedEvents = {}; + + var eventDataValues = {}; + + for (var i = 0; i < eventsData.length; i++) { + var currEvent = eventsData[i] + , currEventName = currEvent.name + , currEventAddr = currEvent.address + , currEventParams = currEvent.events; + + formattedEvents[currEventName] = {address: currEventAddr}; + + for (var j = 0; j < currEventParams.length; j++) { + var p = currEventParams[j]; + formattedEvents[currEventName][p.name] = p.value; + } + + } + + return formattedEvents; + }, + + // decode logs from a transaction receipt + perform: function(txReceipt, contractAddr, contractAbi) { + //console.log(txReceipt); + //console.log(contractAddr); + //console.log(contractAbi); + var decodedEvents = []; + + // Transaction receipt not found + if (!txReceipt) { + console.error(" Transaction receipt was not found."); + return; + } + + // Block not yet mined + if (!txReceipt.blockNumber) { + console.error(" Transaction not yet mined. Please try after some time. "); + return; + } + + const toAddr = txReceipt.to; + + // if the address is a known address + if ( txReceipt.logs.length > 0) { + + var abiDecoder = require('abi-decoder') + , relevantLogs = []; + + for (var i = 0; i < txReceipt.logs.length; i++) { + + var currContractAddrFromReciept = txReceipt.logs[i].address; + + console.debug('**** contract address: ' + txReceipt.logs[i].address + ' at log index(' + i + ') in TxHash: ' + txReceipt.transactionHash + ''); + + if (!currContractAddrFromReciept) { + console.error('**** No contract found for contract address: ' + txReceipt.logs[i].address + ' at log index(' + i + ') in TxHash: ' + txReceipt.transactionHash + ''); + continue; + } + + // ABI not found + if (!contractAbi) { + console.error("ABI not found for contract: "+contractAddr); + return; + } + + relevantLogs.push(txReceipt.logs[i]); + abiDecoder.addABI(contractAbi); + } + + if(relevantLogs.length > 0) { + decodedEvents = abiDecoder.decodeLogs(relevantLogs); + } + + } + + return this.getFormattedEvents(decodedEvents); + } + +}; + +module.exports = new web3EventsDecoder(); \ No newline at end of file diff --git a/test/lib/hash_lock.js b/test/lib/hash_lock.js new file mode 100644 index 00000000..e548a0ad --- /dev/null +++ b/test/lib/hash_lock.js @@ -0,0 +1,32 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: lib/hash_lock.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const crypto = require('crypto'), + keccak256 = require('keccak'); + +/// for testing purposes produce a random secret and its hash +module.exports.getHashLock = () => { + // NOTE: for openst-platform encrypt secret + var secretBytes = crypto.randomBytes(32); + var lock = "0x" + keccak256('keccak256').update(secretBytes).digest('hex'); + var unlockSecret = "0x" + secretBytes.toString('hex'); + return {s: unlockSecret, l: lock}; +} diff --git a/test/lib/utils.js b/test/lib/utils.js new file mode 100644 index 00000000..a473b49e --- /dev/null +++ b/test/lib/utils.js @@ -0,0 +1,139 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: lib/utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Assert = require('assert'); + +const NullAddress = "0x0000000000000000000000000000000000000000"; + +/* + * Tracking Gas Usage + */ + +const receipts = []; + +module.exports.logResponse = (response, description) => { + receipts.push({ + receipt : response.receipt, + description : description, + response : response + }); +} + +module.exports.logReceipt = (receipt, description) => { + receipts.push({ + receipt : receipt, + description : description, + response : null + }) +} + +module.exports.logTransaction = async (hash, description) => { + const receipt = await web3.eth.getTransactionReceipt(hash) + await this.logReceipt(receipt, description) +} + +module.exports.printGasStatistics = () => { + var totalGasUsed = 0 + + console.log(" -----------------------------------------------------"); + console.log(" Report gas usage\n"); + + for (i = 0; i < receipts.length; i++) { + const entry = receipts[i] + + totalGasUsed += entry.receipt.gasUsed + + console.log(" " + entry.description.padEnd(45) + entry.receipt.gasUsed) + } + + console.log(" -----------------------------------------------------") + console.log(" " + "Total gas logged: ".padEnd(45) + totalGasUsed + "\n") +} + +module.exports.clearReceipts = () => { + receipts.splice( 0, receipts.length ); +} + + +/* + * General event checks + */ +module.exports.expectNoEvents = (result) => { + Assert.equal(result.receipt.logs.length, 0, "expected empty array of logs") +} + +/* + * Basic Ethereum checks + */ + +/// @dev Compare to null address +module.exports.isNullAddress = function (address) { + Assert.strictEqual(typeof address, 'string', `address must be of type 'string'`); + return (address == NullAddress); +} + +/// @dev Expect failure from invalid opcode or out of gas, +/// but returns error instead +module.exports.expectThrow = async (promise) => { + try { + await promise; + } catch (error) { + const invalidOpcode = error.message.search('invalid opcode') > -1; + + const outOfGas = error.message.search('out of gas') > -1; + + // Latest TestRPC has trouble with require + const revertInstead = error.message.search('revert') > -1; + + assert(invalidOpcode || outOfGas || revertInstead, `Expected throw, but got ${error} instead`); + + return; + } + + assert(false, "Did not throw as expected"); +}; + +/// @dev Get account balance +module.exports.getBalance = function (address) { + return new Promise (function (resolve, reject) { + web3.eth.getBalance(address, function (error, result) { + if (error) { + reject(error); + } else { + resolve(result); + } + }) + }) +} + +/// @dev Get gas price +module.exports.getGasPrice = function () { + return new Promise (function (resolve, reject) { + web3.eth.getGasPrice(function (error, result) { + if (error) { + reject(error); + } else { + resolve(result); + } + }) + }) +} + diff --git a/tools/runTestRpc.sh b/tools/runTestRpc.sh new file mode 100755 index 00000000..7c16eb20 --- /dev/null +++ b/tools/runTestRpc.sh @@ -0,0 +1,2 @@ +#!/bin/bash +testrpc --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea9,0" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb9,0" --gasLimit 12000000 diff --git a/truffle.js b/truffle.js new file mode 100644 index 00000000..2083abb8 --- /dev/null +++ b/truffle.js @@ -0,0 +1,18 @@ +module.exports = { + networks: { + development: { + host: "localhost", + port: 8545, + network_id: "*" // Match any network id + } + }, + solc: { + optimizer: { + enabled: true, + // set to same number of runs as openst-platform + // so that integration tests on openst-protocol + // give accurate gas measurements + runs: 200 + } + } +}; diff --git a/truffle/contracts/ConvertLib.sol b/truffle/contracts/ConvertLib.sol new file mode 100644 index 00000000..b97c88d7 --- /dev/null +++ b/truffle/contracts/ConvertLib.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.4.4; + +library ConvertLib{ + function convert(uint amount,uint conversionRate) returns (uint convertedAmount) + { + return amount * conversionRate; + } +} diff --git a/truffle/contracts/MetaCoin.sol b/truffle/contracts/MetaCoin.sol new file mode 100644 index 00000000..c48f3c54 --- /dev/null +++ b/truffle/contracts/MetaCoin.sol @@ -0,0 +1,34 @@ +pragma solidity ^0.4.4; + +import "./ConvertLib.sol"; + +// This is just a simple example of a coin-like contract. +// It is not standards compatible and cannot be expected to talk to other +// coin/token contracts. If you want to create a standards-compliant +// token, see: https://github.com/ConsenSys/Tokens. Cheers! + +contract MetaCoin { + mapping (address => uint) balances; + + event Transfer(address indexed _from, address indexed _to, uint256 _value); + + constructor() { + balances[tx.origin] = 10000; + } + + function sendCoin(address receiver, uint amount) returns(bool sufficient) { + if (balances[msg.sender] < amount) return false; + balances[msg.sender] -= amount; + balances[receiver] += amount; + Transfer(msg.sender, receiver, amount); + return true; + } + + function getBalanceInEth(address addr) returns(uint){ + return ConvertLib.convert(getBalance(addr),2); + } + + function getBalance(address addr) returns(uint) { + return balances[addr]; + } +} diff --git a/truffle/contracts/Migrations.sol b/truffle/contracts/Migrations.sol new file mode 100644 index 00000000..c7d09bd2 --- /dev/null +++ b/truffle/contracts/Migrations.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.4.4; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + modifier restricted() { + if (msg.sender == owner) _; + } + + constructor() { + owner = msg.sender; + } + + function setCompleted(uint completed) restricted { + last_completed_migration = completed; + } + + function upgrade(address new_address) restricted { + Migrations upgraded = Migrations(new_address); + upgraded.setCompleted(last_completed_migration); + } +} diff --git a/truffle/test/TestMetacoin.sol b/truffle/test/TestMetacoin.sol new file mode 100644 index 00000000..96ccc1e2 --- /dev/null +++ b/truffle/test/TestMetacoin.sol @@ -0,0 +1,25 @@ +pragma solidity ^0.4.2; + +import "truffle/Assert.sol"; +import "truffle/DeployedAddresses.sol"; +import "../contracts/MetaCoin.sol"; + +contract TestMetacoin { + + function testInitialBalanceUsingDeployedContract() { + MetaCoin meta = MetaCoin(DeployedAddresses.MetaCoin()); + + uint expected = 10000; + + Assert.equal(meta.getBalance(tx.origin), expected, "Owner should have 10000 MetaCoin initially"); + } + + function testInitialBalanceWithNewMetaCoin() { + MetaCoin meta = new MetaCoin(); + + uint expected = 10000; + + Assert.equal(meta.getBalance(tx.origin), expected, "Owner should have 10000 MetaCoin initially"); + } + +} diff --git a/truffle/test/metacoin.js b/truffle/test/metacoin.js new file mode 100644 index 00000000..c61c0937 --- /dev/null +++ b/truffle/test/metacoin.js @@ -0,0 +1,63 @@ +var MetaCoin = artifacts.require("./MetaCoin.sol"); + +contract('MetaCoin', function(accounts) { + it("should put 10000 MetaCoin in the first account", function() { + return MetaCoin.deployed().then(function(instance) { + return instance.getBalance.call(accounts[0]); + }).then(function(balance) { + assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account"); + }); + }); + it("should call a function that depends on a linked library", function() { + var meta; + var metaCoinBalance; + var metaCoinEthBalance; + + return MetaCoin.deployed().then(function(instance) { + meta = instance; + return meta.getBalance.call(accounts[0]); + }).then(function(outCoinBalance) { + metaCoinBalance = outCoinBalance.toNumber(); + return meta.getBalanceInEth.call(accounts[0]); + }).then(function(outCoinBalanceEth) { + metaCoinEthBalance = outCoinBalanceEth.toNumber(); + }).then(function() { + assert.equal(metaCoinEthBalance, 2 * metaCoinBalance, "Library function returned unexpected function, linkage may be broken"); + }); + }); + it("should send coin correctly", function() { + var meta; + + // Get initial balances of first and second account. + var account_one = accounts[0]; + var account_two = accounts[1]; + + var account_one_starting_balance; + var account_two_starting_balance; + var account_one_ending_balance; + var account_two_ending_balance; + + var amount = 10; + + return MetaCoin.deployed().then(function(instance) { + meta = instance; + return meta.getBalance.call(account_one); + }).then(function(balance) { + account_one_starting_balance = balance.toNumber(); + return meta.getBalance.call(account_two); + }).then(function(balance) { + account_two_starting_balance = balance.toNumber(); + return meta.sendCoin(account_two, amount, {from: account_one}); + }).then(function() { + return meta.getBalance.call(account_one); + }).then(function(balance) { + account_one_ending_balance = balance.toNumber(); + return meta.getBalance.call(account_two); + }).then(function(balance) { + account_two_ending_balance = balance.toNumber(); + + assert.equal(account_one_ending_balance, account_one_starting_balance - amount, "Amount wasn't correctly taken from the sender"); + assert.equal(account_two_ending_balance, account_two_starting_balance + amount, "Amount wasn't correctly sent to the receiver"); + }); + }); +}); From 31360596778f5e6e71677d30cbb6b9f738c98138 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 25 Jun 2018 18:14:39 +0530 Subject: [PATCH 0148/1361] updated test cases. MOSA-68 --- contracts/OpenSTValueInterface.sol | 3 ++- contracts/Registrar.sol | 6 ++++-- test/Protocol.js | 16 +++++++++------- test/Registrar.js | 24 ++++++++++++++---------- test/Registrar_utils.js | 4 ++-- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol index d261690b..07c6194f 100644 --- a/contracts/OpenSTValueInterface.sol +++ b/contracts/OpenSTValueInterface.sol @@ -41,7 +41,8 @@ contract OpenSTValueInterface { uint256 _amountUT, uint256 _redemptionUnlockHeight, bytes32 _hashLock, - bytes32 _redemptionIntentHash) + uint256 _blockHeight, + bytes _rlpParentNodes) external returns ( uint256 amountST, diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index c7473194..ea54feda 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -56,7 +56,8 @@ contract Registrar is OpsManaged { uint256 _amountUT, uint256 _redemptionUnlockHeight, bytes32 _hashLock, - bytes32 _redemptionIntentHash) + uint256 _blockHeight, + bytes _rlpParentNodes) external onlyOps returns ( @@ -71,7 +72,8 @@ contract Registrar is OpsManaged { _amountUT, _redemptionUnlockHeight, _hashLock, - _redemptionIntentHash); + _blockHeight, + _rlpParentNodes); return (amountST, expirationHeight); } diff --git a/test/Protocol.js b/test/Protocol.js index 566a1c49..f80fa1e2 100644 --- a/test/Protocol.js +++ b/test/Protocol.js @@ -98,6 +98,7 @@ contract('OpenST', function(accounts) { var unlockHeight = null; var redemptionIntentHash = null; var redeemedAmountST = null; + var validRLPParentNodes = null; before(async () => { var contracts = await ProtocolUtils.deployOpenSTProtocol(artifacts, accounts); @@ -411,9 +412,10 @@ contract('OpenST', function(accounts) { }); it("confirm redemption intent", async() => { + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, - redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); @@ -472,9 +474,9 @@ contract('OpenST', function(accounts) { }); it("confirm redemption intent", async() => { - + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, uuidSTP, redeemer, nonce, redeemBeneficiary, - REDEEM_AMOUNT_STPRIME, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); + REDEEM_AMOUNT_STPRIME, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); @@ -838,9 +840,9 @@ contract('OpenST', function(accounts) { // Call confirmRedemptionIntent it("calls confirmRedemptionIntent", async() => { - + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, - redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); openSTValueUtils.checkRedemptionIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, @@ -942,9 +944,9 @@ contract('OpenST', function(accounts) { // Call confirmRedemptionIntent it("calls confirmRedemptionIntent", async() => { - + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, - redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, redemptionIntentHash, { from: intercommVC }); + redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); redeemedAmountST = (REDEEM_AMOUNT_BT.mul(new BigNumber(10**conversionRateDecimals))).div(conversionRate); openSTValueUtils.checkRedemptionIntentConfirmedEventOnProtocol(formattedDecodedEvents, registeredBrandedTokenUuid, diff --git a/test/Registrar.js b/test/Registrar.js index 137cb1d5..dfa9c015 100644 --- a/test/Registrar.js +++ b/test/Registrar.js @@ -154,10 +154,10 @@ contract('Registrar', function(accounts) { before(async() => { contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); valueToken = contracts.valueToken; - registrar = contracts.registrar; + registrar = contracts.registrar; openSTUtility = contracts.openSTUtility; openSTValue = contracts.openSTValue; - core = contracts.core; + core = contracts.core; uuid = await openSTUtility.proposeBrandedToken.call(symbol, name, conversionRate, conversionRateDecimals, { from: staker }); var result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals, { from: staker }); brandedToken = result.logs[0].args._token; @@ -179,7 +179,7 @@ contract('Registrar', function(accounts) { }) it('successfully confirms', async () => { - var BLOCKS_TO_WAIT_SHORT = 240; + var BLOCKS_TO_WAIT_SHORT = 5; var expirationHeight = await registrar.confirmStakingIntent.call(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash, { from: ops }); assert.ok(expirationHeight > BLOCKS_TO_WAIT_SHORT); @@ -196,7 +196,9 @@ contract('Registrar', function(accounts) { var uuid = null; var nonce = null; var redemptionIntentHash = null; - const BLOCKS_TO_WAIT_LONG = 80667; + var validRLPParentNodes = null; + + const BLOCKS_TO_WAIT_LONG = 8; const amountUTRedeemed = (conversionRate / (10**conversionRateDecimals)); const lock = HashLock.getHashLock(); const lockR = HashLock.getHashLock(); @@ -204,10 +206,12 @@ contract('Registrar', function(accounts) { before(async() => { contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); valueToken = contracts.valueToken; - registrar = contracts.registrar; + registrar = contracts.registrar; openSTUtility = contracts.openSTUtility; openSTValue = contracts.openSTValue; - core = contracts.core; + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + + core = contracts.core; uuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); await registrar.addCore(openSTValue.address, core.address, { from: ops }); @@ -221,14 +225,14 @@ contract('Registrar', function(accounts) { }) it('fails to confirm by non-ops', async () => { - await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash)); - await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash, { from: admin })); + await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, 0, validRLPParentNodes)); + await Utils.expectThrow(registrar.confirmRedemptionIntent(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, 0, validRLPParentNodes, { from: admin })); }) it('successfully confirms', async () => { - var BLOCKS_TO_WAIT_SHORT = 240; + var BLOCKS_TO_WAIT_SHORT = 5; - var confirmReturns = await registrar.confirmRedemptionIntent.call(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, redemptionIntentHash, { from: ops }); + var confirmReturns = await registrar.confirmRedemptionIntent.call(openSTValue.address, uuid, staker, nonce, redeemBeneficiary, amountUTRedeemed, BLOCKS_TO_WAIT_LONG, lockR.l, 0, validRLPParentNodes, { from: ops }); assert.equal(confirmReturns[0], (amountUTRedeemed * (10**conversionRateDecimals))/conversionRate); assert.ok(confirmReturns[1] > BLOCKS_TO_WAIT_SHORT); }) diff --git a/test/Registrar_utils.js b/test/Registrar_utils.js index c9504e79..9458b549 100644 --- a/test/Registrar_utils.js +++ b/test/Registrar_utils.js @@ -23,8 +23,8 @@ const BigNumber = require('bignumber.js'); var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); var Registrar = artifacts.require("./Registrar.sol"); -var OpenSTUtility = artifacts.require("./OpenSTUtility.sol"); -var OpenSTValue = artifacts.require("./OpenSTValue.sol"); +var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); +var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); var Core = artifacts.require("./Core.sol"); var Workers = artifacts.require("./Workers.sol") From 186a85c7e59b5c10d5fae934c8239caa1516195a Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 25 Jun 2018 18:20:26 +0530 Subject: [PATCH 0149/1361] removed util from OpenSTValue --- contracts/OpenSTValue.sol | 4 ++-- contracts/OpenSTValueMock.sol | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 16ef1a4f..c926c92d 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -33,10 +33,10 @@ import "./ProtocolVersioned.sol"; import "./SimpleStake.sol"; import "./OpenSTUtils.sol"; -import "./util.sol"; +//import "./util.sol"; /// @title OpenSTValue - value staking contract for OpenST -contract OpenSTValue is OpsManaged, Hasher, Util { +contract OpenSTValue is OpsManaged, Hasher { using SafeMath for uint256; /* diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index f35058ed..8bb46a86 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -58,7 +58,7 @@ contract OpenSTValueMock is OpenSTValue { view returns (bool) { - bytes memory mockedValidValue = bytes32ToBytes(keccak256(1)); + bytes memory mockedValidValue = OpenSTUtils.bytes32ToBytes(keccak256(1)); return (keccak256(mockedValidValue) == keccak256(_rlpParentNodes)); } @@ -70,10 +70,10 @@ contract OpenSTValueMock is OpenSTValue { returns (bytes /* mock RLP encoded parent nodes*/) { if(isValid) { - bytes memory mockedValidValue = bytes32ToBytes(keccak256(1)); + bytes memory mockedValidValue = OpenSTUtils.bytes32ToBytes(keccak256(1)); return mockedValidValue; } - bytes memory mockedInvalidValue = bytes32ToBytes(keccak256(0)); + bytes memory mockedInvalidValue = OpenSTUtils.bytes32ToBytes(keccak256(0)); return mockedInvalidValue; } From f9ca9143a0b08d7faf3c7f2fbd96754327c0927a Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 25 Jun 2018 19:45:32 +0530 Subject: [PATCH 0150/1361] updated core for block time --- contracts/Core.sol | 18 ++++++++++++------ contracts/CoreInterface.sol | 2 ++ contracts/OpenSTUtility.sol | 6 +----- contracts/OpenSTUtilityMock.sol | 2 -- contracts/OpenSTValue.sol | 6 +----- contracts/OpenSTValueMock.sol | 2 -- test/Registrar_utils.js | 2 +- 7 files changed, 17 insertions(+), 21 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index 085589d3..0a6cb560 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -26,6 +26,7 @@ import "./MerklePatriciaProof.sol"; import "./util.sol"; import "./WorkersInterface.sol"; import "./RLP.sol"; +import "./SafeMath.sol"; /** * @title Core contract which implements CoreInterface @@ -34,6 +35,7 @@ import "./RLP.sol"; * the utility chain to validate itself against */ contract Core is CoreInterface, Util { + using SafeMath for uint256; /* Events */ @@ -83,11 +85,11 @@ contract Core is CoreInterface, Util { } // ~5Days - uint256 private constant TIME_TO_WAIT_MEDIUM = 432000; + uint256 private constant TIME_TO_WAIT = 432000; - uint256 public remoteBlockTime; + uint256 private remoteBlockTime; - uint256 public blocksToWaitMedium; + uint256 private blocksToWait; /* * Public functions @@ -108,6 +110,7 @@ contract Core is CoreInterface, Util { uint256 _chainIdOrigin, uint256 _chainIdRemote, address _openSTRemote, + uint256 _blockTimeRemote, WorkersInterface _workers) public { @@ -116,11 +119,14 @@ contract Core is CoreInterface, Util { require(_chainIdRemote != 0, "Remote chain Id is 0"); require(_openSTRemote != address(0), "OpenSTRemote address is 0"); require(_workers != address(0), "Workers contract address is 0"); + require(_blockTimeRemote != uint256(0), "Remote block time is 0"); coreRegistrar = _registrar; coreChainIdOrigin = _chainIdOrigin; coreChainIdRemote = _chainIdRemote; coreOpenSTRemote = _openSTRemote; workers = _workers; + remoteBlockTime = _blockTimeRemote; + blocksToWait = TIME_TO_WAIT.div(_blockTimeRemote); // Encoded remote path. encodedOpenSTRemotePath = bytes32ToBytes(keccak256(coreOpenSTRemote)); } @@ -164,12 +170,12 @@ contract Core is CoreInterface, Util { return coreOpenSTRemote; } - function safeUnlockTime() + function safeUnlockHeight() external view - returns (uint256 unlockTime) + returns (uint256 safeUnlockHeight) { - return blocksToWaitMedium + block.number; + return blocksToWait + latestStateRootBlockHeight; } /** diff --git a/contracts/CoreInterface.sol b/contracts/CoreInterface.sol index 4d34ffef..d0c29767 100644 --- a/contracts/CoreInterface.sol +++ b/contracts/CoreInterface.sol @@ -47,4 +47,6 @@ contract CoreInterface { function getStorageRoot(uint256 _blockHeight) public view returns (bytes32 /* storage root */); + function safeUnlockHeight() external view returns (uint256 /* safeUnlockHeight */); + } \ No newline at end of file diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 13a4a104..f0d053b5 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -73,8 +73,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { */ // ~2 weeks uint256 private constant TIME_TO_WAIT_LONG = 1209600; - // ~5Days - uint256 private constant TIME_TO_WAIT_MEDIUM = 432000; // ~1hour uint256 private constant TIME_TO_WAIT_SHORT = 3600; @@ -107,7 +105,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 public chainIdUtility; address public registrar; uint256 public blocksToWaitShort; - uint256 public blocksToWaitMedium; uint256 public blocksToWaitLong; bytes32[] public uuids; @@ -162,7 +159,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_blockTime != 0); blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); - blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); chainIdValue = _chainIdValue; @@ -226,7 +222,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_stakingUnlockHeight > 0); require(_stakingIntentHash != ""); - require(core.safeUnlockTime() < _stakingUnlockHeight); + require(core.safeUnlockHeight() < _stakingUnlockHeight); expirationHeight = block.number + blocksToWaitShort; nonces[_staker] = _stakerNonce; diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol index 8438694b..012ce7b2 100644 --- a/contracts/OpenSTUtilityMock.sol +++ b/contracts/OpenSTUtilityMock.sol @@ -28,7 +28,6 @@ import "./OpenSTUtility.sol"; contract OpenSTUtilityMock is OpenSTUtility { uint256 private constant TIME_TO_WAIT_LONG = 16; - uint256 private constant TIME_TO_WAIT_MEDIUM = 14; uint256 private constant TIME_TO_WAIT_SHORT = 10; /* @@ -43,7 +42,6 @@ contract OpenSTUtilityMock is OpenSTUtility { public { blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); - blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); } diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 7a454f1f..705d0c83 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -71,8 +71,6 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 public constant DECIMALSFACTOR = 10**uint256(TOKEN_DECIMALS); // ~2 weeks uint256 private constant TIME_TO_WAIT_LONG = 1209600; - // ~5Days - uint256 private constant TIME_TO_WAIT_MEDIUM = 432000; // ~1hour uint256 private constant TIME_TO_WAIT_SHORT = 3600; @@ -95,7 +93,6 @@ contract OpenSTValue is OpsManaged, Hasher { EIP20Interface public valueToken; address public registrar; uint256 public blocksToWaitShort; - uint256 public blocksToWaitMedium; uint256 public blocksToWaitLong; bytes32[] public uuids; @@ -158,7 +155,6 @@ contract OpenSTValue is OpsManaged, Hasher { require(_blockTime != 0); blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); - blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); chainIdValue = _chainIdValue; @@ -328,7 +324,7 @@ contract OpenSTValue is OpsManaged, Hasher { require(_redemptionUnlockHeight > 0); require(_redemptionIntentHash != ""); - require(cores[utilityTokens[_uuid].chainIdUtility].safeUnlockTime() < _redemptionUnlockHeight); + require(cores[utilityTokens[_uuid].chainIdUtility].safeUnlockHeight() < _redemptionUnlockHeight); require(nonces[_redeemer] + 1 == _redeemerNonce); nonces[_redeemer]++; diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index fec61ebb..b96b69ab 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -27,7 +27,6 @@ import "./OpenSTValue.sol"; /// @dev Overrides certain durational constants and getters to ease testing OpenSTValue contract OpenSTValueMock is OpenSTValue { uint256 private constant TIME_TO_WAIT_LONG = 120; - uint256 private constant TIME_TO_WAIT_MEDIUM = 90; uint256 private constant TIME_TO_WAIT_SHORT = 75; /* @@ -42,7 +41,6 @@ contract OpenSTValueMock is OpenSTValue { public { blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); - blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); } diff --git a/test/Registrar_utils.js b/test/Registrar_utils.js index d24c11de..c9b65062 100644 --- a/test/Registrar_utils.js +++ b/test/Registrar_utils.js @@ -64,7 +64,7 @@ module.exports.deployRegistrar = async (artifacts, accounts) => { const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, constants.UTILITY_CHAIN_BLOCK_TIME, { gas: 10000000 }); const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address, constants.VALUE_CHAIN_BLOCK_TIME); const core = await Core.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address, workers.address); - + return { valueToken : valueToken, registrar : registrar, From b4161b5bf6f7c4c6defb6135acdc62902091ce3d Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Mon, 25 Jun 2018 20:12:17 +0530 Subject: [PATCH 0151/1361] Changes done as per merge --- contracts/MerklePatriciaProofMock.sol | 23 +++++++++++++++++++ contracts/OpenSTUtility.sol | 12 +++++----- contracts/OpenSTUtilityMock.sol | 5 +++-- test/MerklePatricia.js | 32 +++++++++++++++++++++++++++ test/data/AccountInfo | 0 test/data/AccountInfo.json | 6 +++++ 6 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 contracts/MerklePatriciaProofMock.sol create mode 100644 test/MerklePatricia.js create mode 100644 test/data/AccountInfo create mode 100644 test/data/AccountInfo.json diff --git a/contracts/MerklePatriciaProofMock.sol b/contracts/MerklePatriciaProofMock.sol new file mode 100644 index 00000000..c62823c0 --- /dev/null +++ b/contracts/MerklePatriciaProofMock.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.4.23; + +import "./MerklePatriciaProof.sol"; +import "./util.sol"; +contract MerklePatriciaProofMock is Util{ + + + + function verify(bytes32 value, address encodedPath, bytes rlpParentNodes, bytes32 root) returns (bool){ + + + bytes memory encodedPathToBytes = bytes32ToBytes(keccak256(encodedPath)); + return MerklePatriciaProof.verify(value,encodedPathToBytes,rlpParentNodes,root); + + + + + + } + + + +} \ No newline at end of file diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index d3403b67..39f706dc 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -34,6 +34,7 @@ import "./UtilityTokenInterface.sol"; import "./ProtocolVersioned.sol"; import "./Core.sol"; import "./MerklePatriciaProof.sol"; +import "./OpenSTUtils.sol"; /// @title OpenST Utility contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { @@ -50,7 +51,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint8 _conversionRateDecimals, address _requester); event StakingIntentConfirmed(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, - address _staker, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight,bytes32 blockHeight,bytes32 storageRoot); + address _staker, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight,uint256 blockHeight,bytes32 storageRoot); event ProcessedMint(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, address _token, address _staker, address _beneficiary, uint256 _amount, bytes32 _unlockSecret); @@ -210,7 +211,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 _stakingUnlockHeight, bytes32 _hashLock, bytes32 _stakingIntentHash, - bytes32 _blockHeight, + uint256 _blockHeight, bytes rlpParentNodes) external returns (uint256 expirationHeight) @@ -240,9 +241,9 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { ); require(stakingIntentHash == _stakingIntentHash); - bytes32 storageRoot = core.storageRoots(_blockHeight); - - require(MerklePatriciaProof.verify(keccak256(stakingIntentHash),OpenSTUtils.storagePath(5, keccak256(staker,stakerNonce)) ,rlpParentNodes,storageRoot)); + bytes32 storageRoot = core.getStorageRoot(_blockHeight); + bytes memory encodedPathToMerkle = OpenSTUtils.bytes32ToBytes(OpenSTUtils.storagePath(5, keccak256(_staker,_stakerNonce))); + require(MerklePatriciaProof.verify(keccak256(stakingIntentHash), encodedPathToMerkle,rlpParentNodes,storageRoot)); mints[stakingIntentHash] = Mint({ uuid: _uuid, @@ -259,6 +260,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { return expirationHeight; } + function processMinting( bytes32 _stakingIntentHash, bytes32 _unlockSecret) diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol index 8b99628a..685e2af4 100644 --- a/contracts/OpenSTUtilityMock.sol +++ b/contracts/OpenSTUtilityMock.sol @@ -35,8 +35,9 @@ contract OpenSTUtilityMock is OpenSTUtility { constructor( uint256 _chainIdValue, uint256 _chainIdUtility, - address _registrar) - OpenSTUtility(_chainIdValue, _chainIdUtility, _registrar) + address _registrar, + CoreInterface _core) + OpenSTUtility(_chainIdValue, _chainIdUtility, _registrar, _core) public { } function blocksToWaitLong() public pure returns (uint256) { diff --git a/test/MerklePatricia.js b/test/MerklePatricia.js new file mode 100644 index 00000000..dfb91640 --- /dev/null +++ b/test/MerklePatricia.js @@ -0,0 +1,32 @@ +const MerklePatriciaProofMock = artifacts.require("./MerklePatriciaProofMock.sol"); +const accountInfo = require("./data/AccountInfo.json"); +var ethutil = require ("ethereumjs-util"); + + +contract('MerklePatriciaProof', function(accounts) { + + + var merkle= null; + + describe('Test Cases', async () => { + before(async () => { + merkleMock = await MerklePatriciaProofMock.new(); + }) + + it('verify', async () => { + //console.log(merkleMock); + // console.log("AccountInfo",accountInfo); + //value - apply keccak on value parameter and then pass it + let encodedValue = '0x'+ethutil.sha3(accountInfo.value).toString('hex'); + console.log("EncodedValue",encodedValue); + // encodedPath - apply keccak and convert from bytes32 to bytes + // let encodedPath = ethutil.sha3(Buffer.from(accountInfo.encodedPath),'hex'); + + let someValue = await merkleMock.verify.call(encodedValue, accountInfo.encodedPath, accountInfo.rlpParentNodes, accountInfo.stateRoot); + assert.equal(someValue,true); + }) + + + }) + +}) \ No newline at end of file diff --git a/test/data/AccountInfo b/test/data/AccountInfo new file mode 100644 index 00000000..e69de29b diff --git a/test/data/AccountInfo.json b/test/data/AccountInfo.json new file mode 100644 index 00000000..3c643e8e --- /dev/null +++ b/test/data/AccountInfo.json @@ -0,0 +1,6 @@ +{ + "value": "0xf8468206fb80a036ed801abf5678f1506f1fa61e5ccda1f4de53cc7cd03224e3b2a03159b6460da05b7534dec07bb70fb401032a60cb5a9d67f2bd2f50dfad5f2656c3c2fe8f2675", + "encodedPath": "0x01dB94fdCa0FFeDc40A6965DE97790085d71b412", + "rlpParentNodes": "0xf908cef90211a0f113fc83479a9dcb7a7b5c98cdb42f24260f4d12b82003c3a99c0396d58918e4a007da904438ce6e90091514622c5f43816ebda4b28edb7d28c185af95b0b5d0bba0fa08a20a1e7b354aea4186ce7a56c66f08e0bad3d384ccbec3308b86a048f28da082faa84d23c856e00add29d83dffd20c640f7c4cb500a2f1b6ec345730518090a0db06fd0cd48958bdadc30f163ea9bb95d5cd1ca5605b649bca7a94f51e629b86a001cb1bae18830ad03bffb1ed8ad4c2c0338dfb6d4edc734b60d4751c838cf6d1a0b549ccb01890070dde0c2339fe189a54c3f9b5d6c0dee5c3228ec13ea8154f08a0fa860a8dd11a45a645c8f2add444311d0ce77e0e0153af518a8c82cd2a4e530ca0582c96d90db5da3e59dee0bb2ca191d97613717000c24f012539b61be5d777a9a0bc30df4754a90bde3a6f795a03f6cb2747f9180fa13087a249eda1993e38213ba04030ae5f6e34465c29bf9f164bd168e291fea360fa9ac6e2a01bcfaa29c97837a028f4323329a54f02e9fa6c65b9992b380602ce8d86f3c4ea6d1f799376eede97a099728882f75d2777db12440f90756cad8ce90637726e2949cc3039a310c0d26ba015e593e9d83137f2a6b3d6e79f3efdb62b7c2e0d4885f242392903c458adbecba0a022e3488e55dcdd8ff64c000e33f45c51a5fce1225647042ee26e512cfaf8aea03c35754a8a080ec63632e7b3d5fd2b653b4d217116dc74ec44c1eee04d2f611280f90211a056236df72b2a3baf3c4b110622911d48e8134dce5fab96dc4aa0e86bf1345f38a0e02f83a4f33cc5e624d7243d341d4b4d06a91e074250dbf2caebfa2c3e4765d0a0a72d49adff0c5e77dc9d95b4191d8d6668971f74077797659f83d415cd0fd1d1a0c60abc4f0a940d618cf9cea13adfaa4c03e3061bd702986daf5237d1065ef788a05d962c16915d89ede187bd317d3b90c6e4fdd076e53267e1857102cefadf22eda0926dc3780e5eefb8e262d98db26df3429404beb9ae838e69ba7c071d09891791a0a5f7008f700c2d6f10e14071c6471f62005f8409ed6af67a955ad7fb939c27caa0b558c2fee610404a708a543aebd8a729da27434f5608cbaa4691462c72874056a0faa4cce3c8599c6d984e9577ab6bd9b0c006068c31d9e03215cc8908114d7757a0a3d6d16c957326cd262da81bad6b7dee022e4dbd202adff5d7ccc4342a61d21fa0d55c004ac2e9eaec20c2cffef567de49df83fde291e52abc815db781dac5456ba06ab98c39c210c5e2a9ffb994afdefd5ca02bdceff8cfd8e60d68c199d864b94ca0522232d286697b81da8721463bce6e8dedff3330bc13c02937b78fe1afa9005ba0c3bf8ac2260dab7d0108b546f94e2c714aaea8b2274745b7575ded129520304ea0a481df0f7947c98bd4ea7738f706826df3031ae129e362fcfeca937e8651eb4ea05193d68afbd4b7509f77498f1587ea9e090697c2e95c4d2bafbb52a8cf9bd62480f90211a011561aaab4838e5fa61b9e6debfdba192744c612d2ba76ab61deb015746aa5a0a00026c65c973bbd95e6c0e980f4d22e4627715e5e9f421c80fc49f1f67f7b971fa00d119e6b55db30543e2065bc456dbe0828b97c1b0d217846c4ee787bee670d79a0bc563733a582905db3b2eb375218ff1b64cc9a12abc84ec663086a460a625394a093ff057cda650d4808cb25651fe2f77652107c4c56d9647fe75c8c0a3d2d0d64a06cf305021c9a1a175e01fe56f8ef8f527f8a69fc9042e9b1b0a4ba53ea3b0025a078a50de369a7bddf71b0f8bab722b4c34c56918eb051776a7cb8598c0011170ba0699884e0545d810a93c1c80a6ba48020ade2ada6b556764f937712c8628c033da00d02491b26b79333b5a3ec8ffd455921600cc327183d260ad4d4ed5d63fc2aa6a02d9468383a418e9303989bbad1845e3c48ef803bacea406e1fd68e25a565a9d2a0a4453049a044659669a5ff8c56229d339ea860b934ad895bab0ef865cce2fffea0d654be53e9c8fc64a068ef9cd7768eadbeb52bcaa764cececfa6be01b8e074f2a087f0f15350b42c7a8efe19eb64bf8b7ab13daeeebb40f4f3f8b3685b0fc0031ea0ce410da15fc84e9b8caf8d6785f241c74a6b70d5b62f71ba4a1d09ff47921d8da0fcf5effb792c9b1ca3fbffe251cdb27c0facf30d3445b3e230537df48399da69a042acf9ab2c371e984f2c280566ba342a4e0a081e555bbec957aab3296fb4af1980f901d1a07c6a2cff79b45c222da90c55b00dca5f51b62b0cbeff1a0c1f6984851be684daa097fa80b5e381a5d49663a6b86e8721843b93e534da0db48e1db74967c28d7e82a045009364e98f5b0ead865504e8209ccffb7fb63b2a28464717504a78141f518fa039bcfc875dbca2f973a7f5f2f19b55b3bc22f80f387413a12ee0dab5e0254107a009c6f751027ce16b579633a060bee4028dd0ba87567fadf0a887811d9ed7e594a0d0eba05cdd60831f8532710718106860bc2853dc628e55e286c78afe6f3891d0a0904d4bf3896ac04520fd93e47169b6bfff4c7cdf25420b342784abd7090f2dd4a0feb4a9be9f299e0f58645e4ae2f8e2c2082368d2e08a9cec0c6ae37411c56de9a0e30f69e6968d9611a3d52d210a282244316d31367642f2c4f159161fec71e269a0a665c800370015f89a458e68e95b96c4e6976347a6a5f76df6b58f1451bb8948a0120a7594596f36b628223057eb375c73653dfa6fcbfc3ec8d2ce201a685aaa9680a0c7bbde5d654a3bf527ae035eeba861d25280b88b7a0376bf7c39625d9ffd9879a005d5ae3d04a79a90f21af570116b6e4c29e6e606c877bf9b015a5f03e18d1e24a0b2b77afc6c3b77c6a171e5f49bd6508f455fbe93864c7c832a02b303e4f227e48080f8518080808080a081dc71924e3436de3a7ddd7cd6abcc0d7f8beb7d7186e388c7dabc158ad6e0b1808080808080a011947a5a80ea783ca7627105736c527e60b5565bb4af2a1fd594f7d9adc01e5d80808080f8699e3e4ced21ae7bedd22cd1f49238c2280cf1e50a14e8f5d2038e29f59f37afb848f8468206fb80a036ed801abf5678f1506f1fa61e5ccda1f4de53cc7cd03224e3b2a03159b6460da05b7534dec07bb70fb401032a60cb5a9d67f2bd2f50dfad5f2656c3c2fe8f2675", + "stateRoot": "0x58810687b84d5bddc1e9e68b2733caa4a8c6c9e7dd5d0b2f9c28b4bbf5c6f850" +} \ No newline at end of file From 737f91c506d2488f604f89f69bd2e0fef00f915f Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 25 Jun 2018 20:32:38 +0530 Subject: [PATCH 0152/1361] Added comments. MOSA-68 --- contracts/OpenSTUtils.sol | 23 +++++++++++++++++++-- contracts/OpenSTValue.sol | 43 +++++++++++++++++++++++++++++++++------ test/OpenSTUtility.js | 2 +- 3 files changed, 59 insertions(+), 9 deletions(-) diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol index 9da9da4f..3addf914 100644 --- a/contracts/OpenSTUtils.sol +++ b/contracts/OpenSTUtils.sol @@ -15,12 +15,20 @@ library OpenSTUtils { return res; } + /** + * @notice Get the storage path of the variable + * + * @param _index Index of variable + * @param _key Key of variable incase of mapping + * + * @return bytes32 Storage path of the variable + */ function storagePath( uint8 _index, bytes32 _key) internal pure - returns(bytes32) + returns(bytes32 /* storage path */) { bytes memory indexBytes = BytesLib.leftPad(bytes32ToBytes(bytes32(_index))); bytes memory keyBytes = BytesLib.leftPad(bytes32ToBytes(_key)); @@ -28,6 +36,17 @@ library OpenSTUtils { return keccak256(keccak256(path)); } + /** + * @notice Verify storage of intent hash + * + * @param _intentIndex Index of variable + * @param _address Account address + * @param _addressNonce Nonce for account address + * @param _blockHeight Block height at which the Merkle proof was generated + * @param _rlpParentNodes RLP encoded parent nodes for proof verification + * + * @return bool status if the storage of intent hash was verified + */ function verifyIntentStorage( uint8 _intentIndex, address _address, @@ -37,7 +56,7 @@ library OpenSTUtils { bytes _rlpParentNodes) internal pure - returns (bool) + returns (bool /* verification status */) { bytes32 keyPath = storagePath(_intentIndex, keccak256(_address, _addressNonce)); bytes memory path = bytes32ToBytes(keccak256(keyPath)); diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index c926c92d..fd91ec69 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -31,9 +31,7 @@ import "./ProtocolVersioned.sol"; // value chain contracts import "./SimpleStake.sol"; - import "./OpenSTUtils.sol"; -//import "./util.sol"; /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is OpsManaged, Hasher { @@ -296,6 +294,26 @@ contract OpenSTValue is OpsManaged, Hasher { return (uuid, amountST, staker); } + /** + * @notice Confirm redemption intent on value chain. + * + * @dev RedemptionIntentHash is generated in Utility chain, the paramerters are that were used for hash generation + * is passed in this function along with rpl encoded parent nodes of merkle pactritia tree proof + * for RedemptionIntentHash. + * + * @param _uuid UUID for utility token + * @param _redeemer Redeemer address + * @param _redeemerNonce Nonce for redeemer account + * @param _beneficiary Beneficiary address + * @param _amountUT Amount of utility token + * @param _redemptionUnlockHeight Unlock height for redemption + * @param _hashLock Hash lock + * @param _blockHeight Block height at which the Merkle proof was generated + * @param _rlpParentNodes RLP encoded parent nodes for proof verification + * + * @return bytes32 amount of OST + * @return uint256 expiration height + */ function confirmRedemptionIntent( bytes32 _uuid, address _redeemer, @@ -311,7 +329,6 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 amountST, uint256 expirationHeight) { - UtilityToken storage utilityToken = utilityTokens[_uuid]; require(utilityToken.simpleStake != address(0)); require(_amountUT > 0); @@ -342,7 +359,7 @@ contract OpenSTValue is OpsManaged, Hasher { require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); - require(verifyIntentStorage( + require(verifyRedemptionIntentHashStorage( _uuid, _redeemer, _redeemerNonce, @@ -366,7 +383,18 @@ contract OpenSTValue is OpsManaged, Hasher { return (amountST, expirationHeight); } - function verifyIntentStorage( + /** + * @notice Verify storage of redemption intent hash + * + * @param _uuid UUID for utility token + * @param _redeemer Redeemer address + * @param _redeemerNonce Nonce for redeemer account + * @param _blockHeight Block height at which the Merkle proof was generated + * @param _rlpParentNodes RLP encoded parent nodes for proof verification + * + * @return bool status if the storage of intent hash was verified + */ + function verifyRedemptionIntentHashStorage( bytes32 _uuid, address _redeemer, uint256 _redeemerNonce, @@ -375,9 +403,12 @@ contract OpenSTValue is OpsManaged, Hasher { bytes _rlpParentNodes) internal view - returns (bool) + returns (bool /* verification status */) { + // get storageRoot from core for the given block height bytes32 storageRoot = CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoot(_blockHeight); + + // storageRoot cannot be 0 require(storageRoot != bytes32(0)); require(OpenSTUtils.verifyIntentStorage( diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index 76bbad5b..d71fd100 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -269,7 +269,7 @@ contract('OpenSTUtility', function(accounts) { expirationHeight = await openSTUtility.confirmStakingIntent.call(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); // call block number is one less than send block number - expirationHeight = expirationHeight.plus(1) + expirationHeight = expirationHeight.plus(1); result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); await OpenSTUtility_utils.checkStakingIntentConfirmedEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, accounts[0], accounts[0], amountST, amountUT, expirationHeight); }) From d4440e00492a28f8738245cff064ae20baa1d387 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 25 Jun 2018 20:50:06 +0530 Subject: [PATCH 0153/1361] Enabled travis test --- .travis.yml | 1 + contracts/OpenSTUtils.sol | 3 ++- contracts/OpenSTValueMock.sol | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7a586036..801a17ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ branches: only: - master - develop + - deepesh/MOSA-68 notifications: email: recipients: diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol index 3addf914..8dac91a5 100644 --- a/contracts/OpenSTUtils.sol +++ b/contracts/OpenSTUtils.sol @@ -42,7 +42,8 @@ library OpenSTUtils { * @param _intentIndex Index of variable * @param _address Account address * @param _addressNonce Nonce for account address - * @param _blockHeight Block height at which the Merkle proof was generated + * @param _storageRoot Storage root + * @param _intentHash Intent hash * @param _rlpParentNodes RLP encoded parent nodes for proof verification * * @return bool status if the storage of intent hash was verified diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 8bb46a86..8a636179 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -58,7 +58,7 @@ contract OpenSTValueMock is OpenSTValue { view returns (bool) { - bytes memory mockedValidValue = OpenSTUtils.bytes32ToBytes(keccak256(1)); + bytes memory mockedValidValue = OpenSTUtils.bytes32ToBytes(keccak256(uint8(1))); return (keccak256(mockedValidValue) == keccak256(_rlpParentNodes)); } @@ -70,10 +70,10 @@ contract OpenSTValueMock is OpenSTValue { returns (bytes /* mock RLP encoded parent nodes*/) { if(isValid) { - bytes memory mockedValidValue = OpenSTUtils.bytes32ToBytes(keccak256(1)); + bytes memory mockedValidValue = OpenSTUtils.bytes32ToBytes(keccak256(uint8(1))); return mockedValidValue; } - bytes memory mockedInvalidValue = OpenSTUtils.bytes32ToBytes(keccak256(0)); + bytes memory mockedInvalidValue = OpenSTUtils.bytes32ToBytes(keccak256(uint8(0))); return mockedInvalidValue; } From 2f3ed51f26e72f631094ec2330664be689f03de0 Mon Sep 17 00:00:00 2001 From: Deepesh Kumar Nath Date: Mon, 25 Jun 2018 23:13:56 +0530 Subject: [PATCH 0154/1361] fixed failing tests. MOSA-68 --- contracts/OpenSTValueMock.sol | 2 +- package-lock.json | 5395 +++++++-------------------------- 2 files changed, 1139 insertions(+), 4258 deletions(-) diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 8a636179..92cca93e 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -47,7 +47,7 @@ contract OpenSTValueMock is OpenSTValue { return BLOCKS_TO_WAIT_SHORT; } - function verifyIntentStorage( + function verifyRedemptionIntentHashStorage( bytes32 _uuid, address _redeemer, uint256 _redeemerNonce, diff --git a/package-lock.json b/package-lock.json index 9ab51e95..fd287327 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,57 +4,25 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz", - "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==", - "dev": true - }, - "@samverschueren/stream-to-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", - "dev": true, - "requires": { - "any-observable": "^0.3.0" - } - }, - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", - "dev": true - }, "abi-decoder": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.1.0.tgz", "integrity": "sha512-nvLArBx0XOJufWyaghMKtIofZDBwEMdVZoqcetQOIe1qYeKZk4+kRYGPEJ5lt7dD3MLulw//amUzOJLM8eW5RA==", "dev": true, "requires": { - "babel-core": "^6.23.1", - "babel-loader": "^6.3.2", - "babel-plugin-add-module-exports": "^0.2.1", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-es2015": "^6.22.0", - "chai": "^3.5.0", - "web3": "^0.18.4", - "webpack": "^2.7.0" + "babel-core": "6.26.3", + "babel-loader": "6.4.1", + "babel-plugin-add-module-exports": "0.2.1", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-runtime": "6.23.0", + "babel-preset-es2015": "6.24.1", + "chai": "3.5.0", + "web3": "0.18.4", + "webpack": "2.7.0" }, "dependencies": { "bignumber.js": { "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", "dev": true }, "web3": { @@ -64,10 +32,10 @@ "dev": true, "requires": { "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "^3.1.4", - "utf8": "^2.1.1", - "xhr2": "*", - "xmlhttprequest": "*" + "crypto-js": "3.1.8", + "utf8": "2.1.1", + "xhr2": "0.1.4", + "xmlhttprequest": "1.8.0" } } } @@ -77,7 +45,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "~2.1.18", + "mime-types": "2.1.18", "negotiator": "0.6.1" } }, @@ -93,7 +61,7 @@ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "dev": true, "requires": { - "acorn": "^4.0.3" + "acorn": "4.0.13" }, "dependencies": { "acorn": { @@ -109,10 +77,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { @@ -127,17 +95,11 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" } }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -149,12 +111,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true - }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -166,8 +122,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" } }, "arr-diff": { @@ -188,44 +144,17 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -236,9 +165,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "bn.js": "4.11.8", + "inherits": "2.0.1", + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -266,19 +195,13 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-types": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.5.tgz", - "integrity": "sha512-oJjo+5e7/vEc2FBK8gUalV0pba4L3VdBIs2EKhOLHLcOd2FgQIVQN9xb0eZ9IjEWyAL7vq6fGJxOvVvdCHNyMw==", - "dev": true - }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "4.17.10" } }, "async-each": { @@ -319,9 +242,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" } }, "babel-core": { @@ -330,25 +253,25 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" }, "dependencies": { "debug": { @@ -368,36 +291,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" } }, "babel-helper-call-delegate": { @@ -406,10 +307,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-define-map": { @@ -418,33 +319,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-helper-function-name": { @@ -453,11 +331,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -466,8 +344,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -476,8 +354,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-optimise-call-expression": { @@ -486,8 +364,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { @@ -496,22 +374,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-helper-replace-supers": { @@ -520,12 +385,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -534,8 +399,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-loader": { @@ -544,10 +409,10 @@ "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", "dev": true, "requires": { - "find-cache-dir": "^0.1.1", - "loader-utils": "^0.2.16", - "mkdirp": "^0.5.1", - "object-assign": "^4.0.1" + "find-cache-dir": "0.1.1", + "loader-utils": "0.2.17", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" } }, "babel-messages": { @@ -556,7 +421,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-add-module-exports": { @@ -571,131 +436,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", - "dev": true - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true, - "requires": { - "babel-plugin-syntax-class-constructor-call": "^6.18.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -704,7 +445,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -713,7 +454,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -722,11 +463,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-plugin-transform-es2015-classes": { @@ -735,15 +476,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -752,8 +493,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -762,7 +503,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -771,8 +512,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-for-of": { @@ -781,7 +522,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -790,9 +531,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-literals": { @@ -801,7 +542,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -810,9 +551,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -821,10 +562,10 @@ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -833,9 +574,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -844,9 +585,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-object-super": { @@ -855,8 +596,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -865,12 +606,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -879,8 +620,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -889,7 +630,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -898,9 +639,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -909,7 +650,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -918,7 +659,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -927,50 +668,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true, - "requires": { - "babel-plugin-syntax-export-extensions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" } }, "babel-plugin-transform-regenerator": { @@ -979,7 +679,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "^0.10.0" + "regenerator-transform": "0.10.1" } }, "babel-plugin-transform-runtime": { @@ -988,7 +688,7 @@ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-strict-mode": { @@ -997,8 +697,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-preset-es2015": { @@ -1007,66 +707,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true, - "requires": { - "babel-plugin-transform-class-constructor-call": "^6.24.1", - "babel-plugin-transform-export-extensions": "^6.22.0", - "babel-preset-stage-2": "^6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" } }, "babel-register": { @@ -1075,13 +739,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" } }, "babel-runtime": { @@ -1090,8 +754,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" } }, "babel-template": { @@ -1100,11 +764,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" } }, "babel-traverse": { @@ -1113,15 +777,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" }, "dependencies": { "debug": { @@ -1141,10 +805,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" } }, "babylon": { @@ -1164,13 +828,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -1179,7 +843,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -1188,7 +852,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1197,7 +861,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1206,9 +870,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -1230,7 +894,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "big.js": { @@ -1255,12 +919,6 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, - "binaryextensions": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", - "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", - "dev": true - }, "bindings": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", @@ -1271,8 +929,8 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" } }, "block-stream": { @@ -1280,7 +938,7 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.1" } }, "bluebird": { @@ -1299,15 +957,15 @@ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.2", "raw-body": "2.3.3", - "type-is": "~1.6.16" + "type-is": "1.6.16" }, "dependencies": { "debug": { @@ -1325,7 +983,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1335,16 +993,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -1353,7 +1011,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1373,12 +1031,12 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.1", + "safe-buffer": "5.1.2" } }, "browserify-cipher": { @@ -1386,9 +1044,9 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "browserify-aes": "1.2.0", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.3" } }, "browserify-des": { @@ -1396,9 +1054,9 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.1" } }, "browserify-rsa": { @@ -1406,8 +1064,8 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "bn.js": "4.11.8", + "randombytes": "2.0.6" } }, "browserify-sha3": { @@ -1415,7 +1073,7 @@ "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", "requires": { - "js-sha3": "^0.3.1" + "js-sha3": "0.3.1" } }, "browserify-sign": { @@ -1423,13 +1081,13 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.0", + "inherits": "2.0.1", + "parse-asn1": "5.1.1" } }, "browserify-zlib": { @@ -1438,7 +1096,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "~1.0.5" + "pako": "1.0.6" } }, "buffer": { @@ -1446,8 +1104,8 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "1.3.0", + "ieee754": "1.1.12" } }, "buffer-alloc": { @@ -1455,8 +1113,8 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" } }, "buffer-alloc-unsafe": { @@ -1474,12 +1132,6 @@ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true - }, "buffer-to-arraybuffer": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", @@ -1513,46 +1165,17 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" } }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "dev": true, - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -1569,8 +1192,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chai": { @@ -1579,9 +1202,9 @@ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", "dev": true, "requires": { - "assertion-error": "^1.0.1", - "deep-eql": "^0.1.3", - "type-detect": "^1.0.0" + "assertion-error": "1.1.0", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" } }, "chalk": { @@ -1590,11 +1213,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" }, "dependencies": { "ansi-regex": { @@ -1609,7 +1232,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "supports-color": { @@ -1620,31 +1243,25 @@ } } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.1", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.1.0" } }, "cipher-base": { @@ -1652,8 +1269,8 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.1", + "safe-buffer": "5.1.2" } }, "class-utils": { @@ -1662,10 +1279,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -1674,142 +1291,19 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" + "is-descriptor": "0.1.6" } } } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" } }, "co": { @@ -1828,37 +1322,16 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - }, - "colors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", - "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", - "dev": true - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -1889,7 +1362,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "^0.1.4" + "date-now": "0.1.4" } }, "constants-browserify": { @@ -1946,8 +1419,8 @@ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", "requires": { - "object-assign": "^4", - "vary": "^1" + "object-assign": "4.1.1", + "vary": "1.1.2" } }, "create-ecdh": { @@ -1955,8 +1428,8 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "bn.js": "4.11.8", + "elliptic": "6.4.0" } }, "create-hash": { @@ -1964,11 +1437,11 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "cipher-base": "1.0.4", + "inherits": "2.0.1", + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { @@ -1976,12 +1449,12 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.1", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "cross-spawn": { @@ -1989,9 +1462,9 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "crypto-browserify": { @@ -1999,17 +1472,17 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.1", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, "crypto-js": { @@ -2018,47 +1491,20 @@ "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", "dev": true }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "dargs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", - "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", - "dev": true - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -2082,14 +1528,14 @@ "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" + "decompress-tar": "4.1.1", + "decompress-tarbz2": "4.1.1", + "decompress-targz": "4.1.1", + "decompress-unzip": "4.0.1", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "pify": "2.3.0", + "strip-dirs": "2.1.0" } }, "decompress-response": { @@ -2097,7 +1543,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "1.0.0" } }, "decompress-tar": { @@ -2105,9 +1551,9 @@ "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" + "file-type": "5.2.0", + "is-stream": "1.1.0", + "tar-stream": "1.6.1" } }, "decompress-tarbz2": { @@ -2115,11 +1561,11 @@ "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" + "decompress-tar": "4.1.1", + "file-type": "6.2.0", + "is-stream": "1.1.0", + "seek-bzip": "1.0.5", + "unbzip2-stream": "1.2.5" }, "dependencies": { "file-type": { @@ -2134,9 +1580,9 @@ "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" + "decompress-tar": "4.1.1", + "file-type": "5.2.0", + "is-stream": "1.1.0" } }, "decompress-unzip": { @@ -2144,10 +1590,10 @@ "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" + "file-type": "3.9.0", + "get-stream": "2.3.1", + "pify": "2.3.0", + "yauzl": "2.9.2" }, "dependencies": { "file-type": { @@ -2160,8 +1606,8 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" } } } @@ -2183,20 +1629,14 @@ } } }, - "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", - "dev": true - }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2205,7 +1645,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -2214,7 +1654,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -2223,9 +1663,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -2251,8 +1691,8 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.1", + "minimalistic-assert": "1.0.1" } }, "destroy": { @@ -2260,19 +1700,13 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "detect-conflict": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", - "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", - "dev": true - }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "diff": { @@ -2285,36 +1719,9 @@ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" } }, "dom-walk": { @@ -2339,44 +1746,26 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, - "editions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", - "dev": true - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, "elliptic": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.4", + "hmac-drbg": "1.0.1", + "inherits": "2.0.1", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "emojis-list": { @@ -2395,7 +1784,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "enhanced-resolve": { @@ -2404,35 +1793,19 @@ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" } }, - "envinfo": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-5.10.0.tgz", - "integrity": "sha512-rXbzXWvnQxy+TcqZlARbWVQwgGVVouVJgFZhLVN5htjLxl1thstrP2ZGi0pXC309AbK7gVOPU+ulz/tmpCI7iw==", - "dev": true - }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "~1.0.1" - } - }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "dev": true, - "requires": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" + "prr": "1.0.1" } }, "error-ex": { @@ -2441,78 +1814,7 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "is-arrayish": "0.2.1" } }, "escape-html": { @@ -2525,39 +1827,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -2574,221 +1843,13 @@ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "keccakjs": "^0.2.1", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ethereumjs-testrpc": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", - "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", - "dev": true, - "requires": { - "webpack": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", - "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "webpack": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - } - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "bn.js": "4.11.8", + "elliptic": "6.4.0", + "keccakjs": "0.2.1", + "nano-json-stream-parser": "0.1.2", + "servify": "0.1.12", + "ws": "3.3.3", + "xhr-request-promise": "0.1.2" } }, "ethjs-unit": { @@ -2807,16 +1868,6 @@ } } }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "eventemitter3": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", @@ -2833,8 +1884,8 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "md5.js": "1.3.4", + "safe-buffer": "5.1.2" } }, "execa": { @@ -2842,34 +1893,28 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "debug": { @@ -2887,7 +1932,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -2896,97 +1941,46 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" + "is-extendable": "0.1.1" } } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "express": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "~1.3.5", + "accepts": "1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "~1.0.4", + "content-type": "1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", + "proxy-addr": "2.0.3", "qs": "6.5.1", - "range-parser": "~1.2.0", + "range-parser": "1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "statuses": "1.4.0", + "type-is": "1.6.16", "utils-merge": "1.0.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "body-parser": { @@ -2995,15 +1989,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "~1.6.15" + "type-is": "1.6.16" } }, "debug": { @@ -3053,7 +2047,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "statuses": "1.4.0" } }, "setprototypeof": { @@ -3086,8 +2080,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -3096,36 +2090,25 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -3134,7 +2117,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -3143,7 +2126,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -3152,7 +2135,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -3161,7 +2144,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -3170,9 +2153,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -3193,20 +2176,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, - "fast-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", - "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.0.1", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.1", - "micromatch": "^3.1.10" - } - }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -3217,16 +2186,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" + "pend": "1.2.0" } }, "file-type": { @@ -3234,22 +2194,16 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -3258,7 +2212,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -3269,12 +2223,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" }, "dependencies": { "debug": { @@ -3298,9 +2252,9 @@ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" } }, "find-up": { @@ -3308,30 +2262,15 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, - "first-chunk-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "flow-parser": { - "version": "0.75.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.75.0.tgz", - "integrity": "sha512-QEyV/t9TERBOSI/zSx0zhKH6924135WPI7pMmug2n/n/4puFm4mdAq1QaKPA3IPhXDRtManbySkKhRqws5UUGA==", - "dev": true - }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "requires": { - "is-callable": "^1.1.3" + "is-callable": "1.1.3" } }, "for-in": { @@ -3340,15 +2279,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3359,9 +2289,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.18" } }, "forwarded": { @@ -3375,7 +2305,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fresh": { @@ -3383,16 +2313,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -3403,8 +2323,8 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0" + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0" } }, "fs-promise": { @@ -3412,10 +2332,10 @@ "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", "requires": { - "any-promise": "^1.3.0", - "fs-extra": "^2.0.0", - "mz": "^2.6.0", - "thenify-all": "^1.6.0" + "any-promise": "1.3.0", + "fs-extra": "2.1.2", + "mz": "2.7.0", + "thenify-all": "1.6.0" } }, "fs.realpath": { @@ -3430,8 +2350,8 @@ "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "2.10.0", + "node-pre-gyp": "0.10.0" }, "dependencies": { "abbrev": { @@ -3457,8 +2377,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "balanced-match": { @@ -3471,7 +2391,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -3535,7 +2455,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.2.4" } }, "fs.realpath": { @@ -3550,14 +2470,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" } }, "glob": { @@ -3566,12 +2486,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "has-unicode": { @@ -3586,7 +2506,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": "2.1.2" } }, "ignore-walk": { @@ -3595,7 +2515,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" } }, "inflight": { @@ -3604,8 +2524,8 @@ "dev": true, "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -3624,7 +2544,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "isarray": { @@ -3638,7 +2558,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -3651,8 +2571,8 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, "minizlib": { @@ -3661,7 +2581,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.2.4" } }, "mkdirp": { @@ -3684,9 +2604,9 @@ "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" } }, "node-pre-gyp": { @@ -3695,16 +2615,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" } }, "nopt": { @@ -3713,8 +2633,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "npm-bundled": { @@ -3729,8 +2649,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" } }, "npmlog": { @@ -3739,10 +2659,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -3761,7 +2681,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "os-homedir": { @@ -3782,8 +2702,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "path-is-absolute": { @@ -3804,10 +2724,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -3824,13 +2744,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "rimraf": { @@ -3839,7 +2759,7 @@ "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-buffer": { @@ -3882,9 +2802,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -3893,7 +2813,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } }, "strip-ansi": { @@ -3901,7 +2821,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-json-comments": { @@ -3916,13 +2836,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, "util-deprecate": { @@ -3937,7 +2857,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" } }, "wrappy": { @@ -3957,38 +2877,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "ganache-cli": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.3.tgz", - "integrity": "sha512-6g/jPkhEMBlefOUQR0AXQooTCsLFD4iOvTDmsqi/B3XOktB9KGSioDaEy5lCcgzJczzUHT1YCZXhrZcUgtNkkg==", - "dev": true, - "requires": { - "source-map-support": "^0.5.3", - "webpack-cli": "^2.0.9" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } + "graceful-fs": "4.1.11", + "inherits": "2.0.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" } }, "get-caller-file": { @@ -4012,26 +2904,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" - } - }, - "gh-got": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", - "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", - "dev": true, - "requires": { - "got": "^7.0.0", - "is-plain-obj": "^1.1.0" - } - }, - "github-username": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", - "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", - "dev": true, - "requires": { - "gh-got": "^6.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -4039,75 +2912,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-all": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", - "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", - "dev": true, - "requires": { - "glob": "^7.0.5", - "yargs": "~1.2.6" - }, - "dependencies": { - "minimist": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", - "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", - "dev": true - }, - "yargs": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", - "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", - "dev": true, - "requires": { - "minimist": "^0.1.0" - } - } - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.1", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-parent": { @@ -4116,8 +2926,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" }, "dependencies": { "is-glob": { @@ -4126,48 +2936,18 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, "global": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "min-document": "2.19.0", + "process": "0.5.2" } }, "globals": { @@ -4176,48 +2956,25 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" } }, "graceful-fs": { @@ -4230,15 +2987,6 @@ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, - "grouped-queue": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", - "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", - "dev": true, - "requires": { - "lodash": "^4.17.2" - } - }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", @@ -4254,8 +3002,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has-ansi": { @@ -4264,7 +3012,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -4275,12 +3023,6 @@ } } }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -4296,7 +3038,7 @@ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "requires": { - "has-symbol-support-x": "^1.4.1" + "has-symbol-support-x": "1.4.2" } }, "has-value": { @@ -4305,9 +3047,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -4316,8 +3058,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -4326,7 +3068,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4336,8 +3078,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.1", + "safe-buffer": "5.1.2" } }, "hash.js": { @@ -4345,8 +3087,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz", "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==", "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" }, "dependencies": { "inherits": { @@ -4366,9 +3108,9 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "hash.js": "1.1.4", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "home-or-tmp": { @@ -4377,17 +3119,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "hosted-git-info": { @@ -4396,21 +3129,15 @@ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", "dev": true }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.5.0" }, "dependencies": { "inherits": { @@ -4430,9 +3157,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "https-browserify": { @@ -4446,7 +3173,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "ieee754": { @@ -4454,48 +3181,6 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -4507,8 +3192,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -4516,93 +3201,19 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "dev": true, - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "invert-kv": { @@ -4621,7 +3232,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-arrayish": { @@ -4636,7 +3247,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "1.11.0" } }, "is-buffer": { @@ -4651,7 +3262,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-callable": { @@ -4665,7 +3276,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-descriptor": { @@ -4674,9 +3285,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -4687,21 +3298,6 @@ } } }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4720,7 +3316,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { @@ -4739,7 +3335,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } }, "is-hex-prefixed": { @@ -4758,7 +3354,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-object": { @@ -4766,30 +3362,13 @@ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "requires": { - "symbol-observable": "^1.1.0" - }, - "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - } - } - }, "is-odd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -4811,41 +3390,14 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, - "is-scoped": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", - "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", - "dev": true, - "requires": { - "scoped-regex": "^1.0.0" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4873,12 +3425,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4895,24 +3441,13 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "istextorbinary": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", - "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", - "dev": true, - "requires": { - "binaryextensions": "2", - "editions": "^1.3.3", - "textextensions": "2" - } - }, "isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" } }, "js-sha3": { @@ -4932,141 +3467,18 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, - "jscodeshift": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.1.tgz", - "integrity": "sha512-sRMollbhbmSDrR79JMAnhEjyZJlQQVozeeY9A6/KNuV26DNcuB3mGSCWXp0hks9dcwRNOELbNOiwraZaXXRk5Q==", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.8.0", - "babel-preset-es2015": "^6.9.0", - "babel-preset-stage-1": "^6.5.0", - "babel-register": "^6.9.0", - "babylon": "^7.0.0-beta.47", - "colors": "^1.1.2", - "flow-parser": "^0.*", - "lodash": "^4.13.1", - "micromatch": "^2.3.7", - "neo-async": "^2.5.0", - "node-dir": "0.1.8", - "nomnom": "^1.8.1", - "recast": "^0.15.0", - "temp": "^0.8.1", - "write-file-atomic": "^1.2.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "babylon": { - "version": "7.0.0-beta.47", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", - "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } - } - }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -5083,7 +3495,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "~0.0.0" + "jsonify": "0.0.0" } }, "json-stringify-safe": { @@ -5102,7 +3514,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "4.1.11" } }, "jsonify": { @@ -5127,10 +3539,10 @@ "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "bindings": "1.3.0", + "inherits": "2.0.3", + "nan": "2.10.0", + "safe-buffer": "5.1.2" }, "dependencies": { "inherits": { @@ -5145,17 +3557,8 @@ "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", "requires": { - "browserify-sha3": "^0.0.1", - "sha3": "^1.1.0" - } - }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" + "browserify-sha3": "0.0.1", + "sha3": "1.2.2" } }, "kind-of": { @@ -5164,7 +3567,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "klaw": { @@ -5173,7 +3576,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "^4.1.9" + "graceful-fs": "4.1.11" } }, "lazy-cache": { @@ -5187,189 +3590,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^1.0.0" - } - }, - "listr": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.1.tgz", - "integrity": "sha512-MSMUUVN1f8aRnPi4034RkOqdiUlpYW+FqwFE3aL0uYNPRavkt2S2SsSpDDofn8BDpqv2RNnsdOcCHWsChcq77A==", - "dev": true, - "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "cli-truncate": "^0.2.1", - "figures": "^1.7.0", - "indent-string": "^2.1.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.4.0", - "listr-verbose-renderer": "^0.4.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "ora": "^0.2.3", - "p-map": "^1.1.1", - "rxjs": "^6.1.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "rxjs": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", - "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", - "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" - }, - "dependencies": { - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - } + "invert-kv": "1.0.0" } }, "load-json-file": { @@ -5378,11 +3599,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "loader-runner": { @@ -5397,10 +3618,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" } }, "locate-path": { @@ -5408,8 +3629,8 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -5430,95 +3651,6 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "log-update": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", - "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", - "dev": true, - "requires": { - "ansi-escapes": "^1.0.0", - "cli-cursor": "^1.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - } - } - }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -5531,7 +3663,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "lowercase-keys": { @@ -5544,8 +3676,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "make-dir": { @@ -5553,7 +3685,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" }, "dependencies": { "pify": { @@ -5575,22 +3707,16 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "3.0.4", + "inherits": "2.0.1" } }, "media-typer": { @@ -5603,71 +3729,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "^1.0.0" - } - }, - "mem-fs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", - "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", - "dev": true, - "requires": { - "through2": "^2.0.0", - "vinyl": "^1.1.0", - "vinyl-file": "^2.0.0" - } - }, - "mem-fs-editor": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz", - "integrity": "sha512-QHvdXLLNmwJXxKdf7x27aNUren6IoPxwcM8Sfd+S6/ddQQMcYdEtVKsh6ilpqMrU18VQuKZEaH0aCGt3JDbA0g==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "deep-extend": "^0.5.1", - "ejs": "^2.5.9", - "glob": "^7.0.3", - "globby": "^8.0.0", - "isbinaryfile": "^3.0.2", - "mkdirp": "^0.5.0", - "multimatch": "^2.0.0", - "rimraf": "^2.2.8", - "through2": "^2.0.0", - "vinyl": "^2.0.1" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } + "mimic-fn": "1.2.0" } }, "memory-fs": { @@ -5676,8 +3738,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "errno": "0.1.7", + "readable-stream": "2.3.6" } }, "memorystream": { @@ -5691,12 +3753,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "merge2": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", - "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", - "dev": true - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -5708,19 +3764,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "kind-of": { @@ -5736,8 +3792,8 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "bn.js": "4.11.8", + "brorand": "1.1.0" } }, "mime": { @@ -5755,7 +3811,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "mimic-fn": { @@ -5773,7 +3829,7 @@ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "requires": { - "dom-walk": "^0.1.0" + "dom-walk": "0.1.1" } }, "minimalistic-assert": { @@ -5791,7 +3847,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -5805,8 +3861,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -5815,7 +3871,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -5833,7 +3889,7 @@ "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", "requires": { - "mkdirp": "*" + "mkdirp": "0.5.1" } }, "mocha": { @@ -5873,32 +3929,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "any-promise": "1.3.0", + "object-assign": "4.1.1", + "thenify-all": "1.6.0" } }, "nan": { @@ -5917,18 +3955,18 @@ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "kind-of": { @@ -5950,52 +3988,34 @@ "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", - "dev": true - }, - "node-dir": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", - "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", - "dev": true - }, "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", + "url": "0.11.0", + "util": "0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -6005,9 +4025,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "1.3.0", + "ieee754": "1.1.12", + "isarray": "1.0.0" } }, "process": { @@ -6018,57 +4038,16 @@ } } }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "dev": true, - "requires": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "normalize-path": { @@ -6077,26 +4056,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - } + "remove-trailing-separator": "1.1.0" } }, "npm-run-path": { @@ -6104,7 +4064,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "number-is-nan": { @@ -6144,9 +4104,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -6155,7 +4115,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -6166,17 +4126,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "^3.0.0" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "isobject": "3.0.1" } }, "object.pick": { @@ -6185,7 +4135,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "oboe": { @@ -6193,7 +4143,7 @@ "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", "requires": { - "http-https": "^1.0.0" + "http-https": "1.0.0" } }, "on-finished": { @@ -6209,55 +4159,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "ora": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", - "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "cli-cursor": "^1.0.2", - "cli-spinners": "^0.1.2", - "object-assign": "^4.0.1" - }, - "dependencies": { - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - } + "wrappy": "1.0.2" } }, "original-require": { @@ -6283,9 +4185,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "os-tmpdir": { @@ -6299,38 +4201,17 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-lazy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", - "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -6338,27 +4219,15 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.3.0" } }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, "p-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "requires": { - "p-finally": "^1.0.0" + "p-finally": "1.0.0" } }, "p-try": { @@ -6377,40 +4246,11 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.16" } }, "parse-headers": { @@ -6418,7 +4258,7 @@ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", "requires": { - "for-each": "^0.3.2", + "for-each": "0.3.3", "trim": "0.0.1" } }, @@ -6428,15 +4268,9 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.2" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -6475,12 +4309,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -6492,9 +4320,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pbkdf2": { @@ -6502,11 +4330,11 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "pegjs": { @@ -6539,7 +4367,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -6548,7 +4376,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" }, "dependencies": { "find-up": { @@ -6557,8 +4385,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -6567,7 +4395,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } } } @@ -6583,24 +4411,6 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.5.tgz", - "integrity": "sha512-4M90mfvLz6yRf2Dhzd+xPIE6b4xkI8nHMJhsSm9IlfG17g6wujrrm7+H1X8x52tC4cSNm6HmuhCUSNe6Hd5wfw==", - "dev": true - }, - "pretty-bytes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", - "dev": true - }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -6622,7 +4432,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.1.2", "ipaddr.js": "1.6.0" } }, @@ -6642,11 +4452,11 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" } }, "punycode": { @@ -6664,9 +4474,9 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" } }, "querystring": { @@ -6681,37 +4491,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, "randombytes": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { - "safe-buffer": "^5.1.0" + "safe-buffer": "5.1.2" } }, "randomfill": { @@ -6719,8 +4504,8 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" } }, "randomhex": { @@ -6744,33 +4529,15 @@ "unpipe": "1.0.0" } }, - "read-chunk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", - "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", - "dev": true, - "requires": { - "pify": "^3.0.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -6779,8 +4546,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" }, "dependencies": { "find-up": { @@ -6789,8 +4556,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -6799,7 +4566,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } } } @@ -6809,13 +4576,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" }, "dependencies": { "inherits": { @@ -6831,39 +4598,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - } - }, - "recast": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.15.0.tgz", - "integrity": "sha512-47C2mIxQYvFICrTNuV4+xGgBa1nAoq42ANN5oDTSBIJ50NX7jcki7gAC6HWYptnQgHmqIRTHJq8OKdi3fwgyNQ==", - "dev": true, - "requires": { - "ast-types": "0.11.5", - "esprima": "~4.0.0", - "private": "~0.1.5", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" } }, "regenerate": { @@ -6884,18 +4622,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" } }, "regex-not": { @@ -6904,8 +4633,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "regexpu-core": { @@ -6914,9 +4643,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, "regjsgen": { @@ -6931,7 +4660,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" }, "dependencies": { "jsesc": { @@ -6966,40 +4695,34 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.0.2" } }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, "request": { "version": "2.87.0", "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" } }, "require-directory": { @@ -7018,65 +4741,12 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -7089,7 +4759,7 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "^0.1.1" + "align-text": "0.1.4" } }, "rimraf": { @@ -7097,7 +4767,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "ripemd160": { @@ -7105,26 +4775,8 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" + "hash-base": "3.0.4", + "inherits": "2.0.1" } }, "safe-buffer": { @@ -7138,7 +4790,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -7146,18 +4798,12 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "scoped-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", - "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", - "dev": true - }, "scrypt": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", "requires": { - "nan": "^2.0.8" + "nan": "2.10.0" } }, "scrypt.js": { @@ -7165,8 +4811,8 @@ "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", "requires": { - "scrypt": "^6.0.2", - "scryptsy": "^1.2.1" + "scrypt": "6.0.3", + "scryptsy": "1.2.1" } }, "scryptsy": { @@ -7174,7 +4820,7 @@ "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", "requires": { - "pbkdf2": "^3.0.3" + "pbkdf2": "3.0.16" } }, "seek-bzip": { @@ -7182,7 +4828,7 @@ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", "requires": { - "commander": "~2.8.1" + "commander": "2.8.1" }, "dependencies": { "commander": { @@ -7190,7 +4836,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "requires": { - "graceful-readlink": ">= 1.0.0" + "graceful-readlink": "1.0.1" } } } @@ -7207,18 +4853,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", + "http-errors": "1.6.3", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" }, "dependencies": { "debug": { @@ -7241,9 +4887,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", "send": "0.16.2" } }, @@ -7252,11 +4898,11 @@ "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" + "body-parser": "1.18.3", + "cors": "2.8.4", + "express": "4.16.3", + "request": "2.87.0", + "xhr": "2.5.0" } }, "set-blocking": { @@ -7276,10 +4922,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -7288,7 +4934,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7308,8 +4954,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.1", + "safe-buffer": "5.1.2" } }, "sha3": { @@ -7325,7 +4971,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -7333,17 +4979,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, - "shelljs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", - "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -7359,9 +4994,9 @@ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "decompress-response": "3.3.0", + "once": "1.4.0", + "simple-concat": "1.0.0" } }, "slash": { @@ -7370,32 +5005,20 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" }, "dependencies": { "debug": { @@ -7413,7 +5036,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -7422,7 +5045,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7433,9 +5056,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -7444,7 +5067,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -7453,7 +5076,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -7462,7 +5085,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -7471,9 +5094,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -7490,7 +5113,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" } }, "solc": { @@ -7499,11 +5122,11 @@ "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", "dev": true, "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" + "fs-extra": "0.30.0", + "memorystream": "0.3.1", + "require-from-string": "1.2.1", + "semver": "5.5.0", + "yargs": "4.8.1" }, "dependencies": { "ansi-regex": { @@ -7524,9 +5147,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "fs-extra": { @@ -7535,11 +5158,11 @@ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" } }, "is-fullwidth-code-point": { @@ -7548,7 +5171,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "os-locale": { @@ -7557,7 +5180,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "^1.0.0" + "lcid": "1.0.0" } }, "string-width": { @@ -7566,9 +5189,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "strip-ansi": { @@ -7577,7 +5200,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "which-module": { @@ -7598,20 +5221,20 @@ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "lodash.assign": "4.2.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "2.4.1" } }, "yargs-parser": { @@ -7620,8 +5243,8 @@ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dev": true, "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" + "camelcase": "3.0.0", + "lodash.assign": "4.2.0" } } } @@ -7631,18 +5254,9 @@ "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", "requires": { - "mocha": "^4.0.1", - "pegjs": "^0.10.0", - "yargs": "^10.0.3" - } - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" + "mocha": "4.1.0", + "pegjs": "0.10.0", + "yargs": "10.1.2" } }, "source-list-map": { @@ -7663,11 +5277,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-support": { @@ -7676,7 +5290,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "^0.5.6" + "source-map": "0.5.7" } }, "source-map-url": { @@ -7691,8 +5305,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, "spdx-exceptions": { @@ -7707,8 +5321,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, "spdx-license-ids": { @@ -7723,7 +5337,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" } }, "sshpk": { @@ -7731,15 +5345,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "static-extend": { @@ -7748,8 +5362,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -7758,7 +5372,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -7774,8 +5388,8 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "2.0.1", + "readable-stream": "2.3.6" } }, "stream-http": { @@ -7784,11 +5398,11 @@ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "builtin-status-codes": "3.0.0", + "inherits": "2.0.1", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" } }, "strict-uri-encode": { @@ -7796,19 +5410,13 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "string_decoder": { @@ -7816,7 +5424,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "strip-ansi": { @@ -7824,7 +5432,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "strip-bom": { @@ -7833,17 +5441,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", - "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", - "dev": true, - "requires": { - "first-chunk-stream": "^2.0.0", - "strip-bom": "^2.0.0" + "is-utf8": "0.2.1" } }, "strip-dirs": { @@ -7851,7 +5449,7 @@ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "requires": { - "is-natural-number": "^4.0.1" + "is-natural-number": "4.0.1" } }, "strip-eof": { @@ -7872,7 +5470,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "swarm-js": { @@ -7880,26 +5478,20 @@ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "decompress": "^4.0.0", - "eth-lib": "^0.1.26", - "fs-extra": "^2.1.2", - "fs-promise": "^2.0.0", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar.gz": "^1.0.5", - "xhr-request-promise": "^0.1.2" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true + "bluebird": "3.5.1", + "buffer": "5.1.0", + "decompress": "4.2.0", + "eth-lib": "0.1.27", + "fs-extra": "2.1.2", + "fs-promise": "2.0.3", + "got": "7.1.0", + "mime-types": "2.1.18", + "mkdirp-promise": "5.0.1", + "mock-fs": "4.5.0", + "setimmediate": "1.0.5", + "tar.gz": "1.0.7", + "xhr-request-promise": "0.1.2" + } }, "tapable": { "version": "0.2.8", @@ -7912,9 +5504,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.1" } }, "tar-stream": { @@ -7922,13 +5514,13 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.1.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.0", - "xtend": "^4.0.0" + "bl": "1.2.2", + "buffer-alloc": "1.2.0", + "end-of-stream": "1.4.1", + "fs-constants": "1.0.0", + "readable-stream": "2.3.6", + "to-buffer": "1.1.1", + "xtend": "4.0.1" } }, "tar.gz": { @@ -7936,11 +5528,11 @@ "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", "requires": { - "bluebird": "^2.9.34", - "commander": "^2.8.1", - "fstream": "^1.0.8", - "mout": "^0.11.0", - "tar": "^2.1.1" + "bluebird": "2.11.0", + "commander": "2.11.0", + "fstream": "1.0.11", + "mout": "0.11.1", + "tar": "2.2.1" }, "dependencies": { "bluebird": { @@ -7950,42 +5542,12 @@ } } }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textextensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", - "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", - "dev": true - }, "thenify": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", "requires": { - "any-promise": "^1.0.0" + "any-promise": "1.3.0" } }, "thenify-all": { @@ -7993,7 +5555,7 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", "requires": { - "thenify": ">= 3.1.0 < 4" + "thenify": "3.3.0" } }, "through": { @@ -8001,16 +5563,6 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -8022,16 +5574,7 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "^1.0.4" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" + "setimmediate": "1.0.5" } }, "to-arraybuffer": { @@ -8057,7 +5600,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "to-regex": { @@ -8066,10 +5609,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -8078,8 +5621,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "tough-cookie": { @@ -8087,7 +5630,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" } }, "trim": { @@ -8107,17 +5650,11 @@ "integrity": "sha1-9F9LbBzhWGX817v19jNA9eFuKVA=", "dev": true, "requires": { - "mocha": "^4.1.0", + "mocha": "4.1.0", "original-require": "1.0.1", "solc": "0.4.24" } }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -8129,7 +5666,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -8150,7 +5687,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.18" } }, "typedarray-to-buffer": { @@ -8158,7 +5695,7 @@ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "requires": { - "is-typedarray": "^1.0.0" + "is-typedarray": "1.0.0" } }, "uglify-js": { @@ -8167,9 +5704,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "camelcase": { @@ -8184,8 +5721,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", + "center-align": "0.1.3", + "right-align": "0.1.3", "wordwrap": "0.0.2" } }, @@ -8195,9 +5732,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -8210,17 +5747,6 @@ "dev": true, "optional": true }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - } - }, "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", @@ -8231,8 +5757,8 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", "requires": { - "buffer": "^3.0.1", - "through": "^2.3.6" + "buffer": "3.6.0", + "through": "2.3.8" }, "dependencies": { "base64-js": { @@ -8246,8 +5772,8 @@ "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", "requires": { "base64-js": "0.0.8", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "ieee754": "1.1.12", + "isarray": "1.0.0" } } } @@ -8263,10 +5789,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "extend-shallow": { @@ -8275,7 +5801,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -8284,10 +5810,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -8303,8 +5829,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -8313,9 +5839,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -8337,35 +5863,12 @@ } } }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", - "dev": true - }, "upath": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -8395,7 +5898,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "1.0.4" } }, "url-set-query": { @@ -8414,7 +5917,7 @@ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" }, "dependencies": { "kind-of": { @@ -8453,20 +5956,14 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, - "v8-compile-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", - "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "vary": { @@ -8479,34 +5976,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", - "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.3.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^2.0.0", - "vinyl": "^1.1.0" + "extsprintf": "1.3.0" } }, "vm-browserify": { @@ -8524,9 +5996,9 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "chokidar": "2.0.4", + "graceful-fs": "4.1.11", + "neo-async": "2.5.1" } }, "web3": { @@ -8676,9 +6148,9 @@ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" + "bn.js": "4.11.8", + "elliptic": "6.4.0", + "xhr-request-promise": "0.1.2" } }, "uuid": { @@ -8808,27 +6280,27 @@ "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", "dev": true, "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^4.7.0", - "ajv-keywords": "^1.1.1", - "async": "^2.1.2", - "enhanced-resolve": "^3.3.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^0.2.16", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^3.1.0", - "tapable": "~0.2.5", - "uglify-js": "^2.8.27", - "watchpack": "^1.3.1", - "webpack-sources": "^1.0.1", - "yargs": "^6.0.0" + "acorn": "5.7.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "async": "2.6.1", + "enhanced-resolve": "3.4.1", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "0.2.17", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "3.2.3", + "tapable": "0.2.8", + "uglify-js": "2.8.29", + "watchpack": "1.6.0", + "webpack-sources": "1.1.0", + "yargs": "6.6.0" }, "dependencies": { "ajv": { @@ -8837,8 +6309,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, "ansi-regex": { @@ -8859,9 +6331,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "has-flag": { @@ -8876,7 +6348,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "os-locale": { @@ -8885,7 +6357,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "^1.0.0" + "lcid": "1.0.0" } }, "string-width": { @@ -8894,9 +6366,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "strip-ansi": { @@ -8905,7 +6377,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "supports-color": { @@ -8914,7 +6386,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } }, "which-module": { @@ -8929,19 +6401,19 @@ "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" } }, "yargs-parser": { @@ -8950,360 +6422,7 @@ "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "webpack-addons": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", - "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", - "dev": true, - "requires": { - "jscodeshift": "^0.4.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "ast-types": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", - "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "jscodeshift": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", - "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", - "dev": true, - "requires": { - "async": "^1.5.0", - "babel-plugin-transform-flow-strip-types": "^6.8.0", - "babel-preset-es2015": "^6.9.0", - "babel-preset-stage-1": "^6.5.0", - "babel-register": "^6.9.0", - "babylon": "^6.17.3", - "colors": "^1.1.2", - "flow-parser": "^0.*", - "lodash": "^4.13.1", - "micromatch": "^2.3.7", - "node-dir": "0.1.8", - "nomnom": "^1.8.1", - "recast": "^0.12.5", - "temp": "^0.8.1", - "write-file-atomic": "^1.2.0" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "recast": { - "version": "0.12.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", - "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", - "dev": true, - "requires": { - "ast-types": "0.10.1", - "core-js": "^2.4.1", - "esprima": "~4.0.0", - "private": "~0.1.5", - "source-map": "~0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.5.tgz", - "integrity": "sha512-CiWQR+1JS77rmyiO6y1q8Kt/O+e8nUUC9YfJ25JtSmzDwbqJV7vIsh3+QKRHVTbTCa0DaVh8iY1LBiagUIDB3g==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "diff": "^3.5.0", - "enhanced-resolve": "^4.0.0", - "envinfo": "^5.7.0", - "glob-all": "^3.1.0", - "global-modules": "^1.0.0", - "got": "^8.3.1", - "import-local": "^1.0.0", - "inquirer": "^5.2.0", - "interpret": "^1.1.0", - "jscodeshift": "^0.5.0", - "listr": "^0.14.1", - "loader-utils": "^1.1.0", - "lodash": "^4.17.10", - "log-symbols": "^2.2.0", - "mkdirp": "^0.5.1", - "p-each-series": "^1.0.0", - "p-lazy": "^1.0.0", - "prettier": "^1.12.1", - "supports-color": "^5.4.0", - "v8-compile-cache": "^2.0.0", - "webpack-addons": "^1.1.5", - "yargs": "^11.1.0", - "yeoman-environment": "^2.1.1", - "yeoman-generator": "^2.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "enhanced-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", - "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "got": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", - "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", - "dev": true - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" + "camelcase": "3.0.0" } } } @@ -9314,8 +6433,8 @@ "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "source-list-map": "2.0.0", + "source-map": "0.6.1" }, "dependencies": { "source-map": { @@ -9328,12 +6447,11 @@ }, "websocket": { "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" + "debug": "2.6.9", + "nan": "2.10.0", + "typedarray-to-buffer": "3.1.5", + "yaeti": "0.0.6" }, "dependencies": { "debug": { @@ -9351,7 +6469,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -9376,8 +6494,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "ansi-regex": { @@ -9390,7 +6508,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -9398,9 +6516,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "strip-ansi": { @@ -9408,7 +6526,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } } } @@ -9418,25 +6536,14 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, "ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "async-limiter": "1.0.0", + "safe-buffer": "5.1.2", + "ultron": "1.1.1" } }, "xhr": { @@ -9444,10 +6551,10 @@ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "global": "4.3.2", + "is-function": "1.0.1", + "parse-headers": "2.0.1", + "xtend": "4.0.1" } }, "xhr-request": { @@ -9455,13 +6562,13 @@ "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" + "buffer-to-arraybuffer": "0.0.5", + "object-assign": "4.1.1", + "query-string": "5.1.1", + "simple-get": "2.8.1", + "timed-out": "4.0.1", + "url-set-query": "1.0.0", + "xhr": "2.5.0" } }, "xhr-request-promise": { @@ -9469,7 +6576,7 @@ "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", "requires": { - "xhr-request": "^1.0.1" + "xhr-request": "1.1.0" } }, "xhr2": { @@ -9508,18 +6615,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" } }, "yargs-parser": { @@ -9527,7 +6634,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } }, "yauzl": { @@ -9535,234 +6642,8 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.2.tgz", "integrity": "sha1-T7G8euH8L1cDe1SvasyP4QMcW3c=", "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yeoman-environment": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.2.0.tgz", - "integrity": "sha512-gQ+hIW8QRlUo4jGBDCm++qg01SXaIVJ7VyLrtSwk2jQG4vtvluWpsGIl7V8DqT2jGiqukdec0uEyffVEyQgaZA==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "diff": "^3.3.1", - "escape-string-regexp": "^1.0.2", - "globby": "^8.0.1", - "grouped-queue": "^0.3.3", - "inquirer": "^5.2.0", - "is-scoped": "^1.0.0", - "lodash": "^4.17.10", - "log-symbols": "^2.1.0", - "mem-fs": "^1.1.0", - "strip-ansi": "^4.0.0", - "text-table": "^0.2.0", - "untildify": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "yeoman-generator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", - "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", - "dev": true, - "requires": { - "async": "^2.6.0", - "chalk": "^2.3.0", - "cli-table": "^0.3.1", - "cross-spawn": "^6.0.5", - "dargs": "^5.1.0", - "dateformat": "^3.0.3", - "debug": "^3.1.0", - "detect-conflict": "^1.0.0", - "error": "^7.0.2", - "find-up": "^2.1.0", - "github-username": "^4.0.0", - "istextorbinary": "^2.2.1", - "lodash": "^4.17.10", - "make-dir": "^1.1.0", - "mem-fs-editor": "^4.0.0", - "minimist": "^1.2.0", - "pretty-bytes": "^4.0.2", - "read-chunk": "^2.1.0", - "read-pkg-up": "^3.0.0", - "rimraf": "^2.6.2", - "run-async": "^2.0.0", - "shelljs": "^0.8.0", - "text-table": "^0.2.0", - "through2": "^2.0.0", - "yeoman-environment": "^2.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "buffer-crc32": "0.2.13", + "fd-slicer": "1.1.0" } } } From f0e4f31a35f34cd778dc635dcdd26a2eb8eb4c34 Mon Sep 17 00:00:00 2001 From: Deepesh Kumar Nath Date: Mon, 25 Jun 2018 23:28:14 +0530 Subject: [PATCH 0155/1361] Indentation fixes --- contracts/Registrar.sol | 4 ++-- test/OpenSTValue.js | 14 +++++++------- test/Protocol.js | 10 +++++----- test/Registrar.js | 11 +++++------ 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index ea54feda..c7d249cd 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -72,8 +72,8 @@ contract Registrar is OpsManaged { _amountUT, _redemptionUnlockHeight, _hashLock, - _blockHeight, - _rlpParentNodes); + _blockHeight, + _rlpParentNodes); return (amountST, expirationHeight); } diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 03c753ac..073a26b7 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -406,9 +406,9 @@ contract('OpenSTValue', function(accounts) { await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) - it('fails to confirm when RLPParentNodes are invalid', async () => { - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, invalidRLPParentNodes, { from: registrar })); - }) + it('fails to confirm when RLPParentNodes are invalid', async () => { + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, invalidRLPParentNodes, { from: registrar })); + }) it('successfully confirms', async () => { await valueToken.approve(openSTValue.address, 2, { from: accounts[0] }); @@ -421,8 +421,8 @@ contract('OpenSTValue', function(accounts) { var amountST = confirmReturns[0]; assert.equal(amountST, (amountUT / conversionRate)*10**conversionRateDecimals); - result = await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar }); - var blocks_to_wait_short = await openSTValue.blocksToWaitShort.call(); + result = await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar }); + var blocks_to_wait_short = await openSTValue.blocksToWaitShort.call(); var blockNumber = web3.eth.blockNumber; var expirationHeight = blockNumber + blocks_to_wait_short.toNumber(); @@ -447,7 +447,7 @@ contract('OpenSTValue', function(accounts) { describe('ProcessUnstaking', async () => { var redeemer = accounts[2]; - var redeemBeneficiary = accounts[3]; + var redeemBeneficiary = accounts[3]; var notRedeemer = accounts[5]; var redemptionIntentHash = null; var redemptionUnlockHeight = 80668; @@ -661,7 +661,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); diff --git a/test/Protocol.js b/test/Protocol.js index 900225b7..a1d01165 100644 --- a/test/Protocol.js +++ b/test/Protocol.js @@ -99,7 +99,7 @@ contract('OpenST', function(accounts) { var unlockHeight = null; var redemptionIntentHash = null; var redeemedAmountST = null; - var validRLPParentNodes = null; + var validRLPParentNodes = null; before(async () => { var contracts = await ProtocolUtils.deployOpenSTProtocol(artifacts, accounts); @@ -416,7 +416,7 @@ contract('OpenST', function(accounts) { }); it("confirm redemption intent", async() => { - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); @@ -478,7 +478,7 @@ contract('OpenST', function(accounts) { }); it("confirm redemption intent", async() => { - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, uuidSTP, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_STPRIME, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); @@ -847,7 +847,7 @@ contract('OpenST', function(accounts) { // Call confirmRedemptionIntent it("calls confirmRedemptionIntent", async() => { - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); @@ -951,7 +951,7 @@ contract('OpenST', function(accounts) { // Call confirmRedemptionIntent it("calls confirmRedemptionIntent", async() => { - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); diff --git a/test/Registrar.js b/test/Registrar.js index dfa9c015..9c496763 100644 --- a/test/Registrar.js +++ b/test/Registrar.js @@ -154,7 +154,7 @@ contract('Registrar', function(accounts) { before(async() => { contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); valueToken = contracts.valueToken; - registrar = contracts.registrar; + registrar = contracts.registrar; openSTUtility = contracts.openSTUtility; openSTValue = contracts.openSTValue; core = contracts.core; @@ -196,7 +196,7 @@ contract('Registrar', function(accounts) { var uuid = null; var nonce = null; var redemptionIntentHash = null; - var validRLPParentNodes = null; + var validRLPParentNodes = null; const BLOCKS_TO_WAIT_LONG = 8; const amountUTRedeemed = (conversionRate / (10**conversionRateDecimals)); @@ -206,12 +206,11 @@ contract('Registrar', function(accounts) { before(async() => { contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); valueToken = contracts.valueToken; - registrar = contracts.registrar; + registrar = contracts.registrar; openSTUtility = contracts.openSTUtility; openSTValue = contracts.openSTValue; - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); - - core = contracts.core; + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + core = contracts.core; uuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); await registrar.addCore(openSTValue.address, core.address, { from: ops }); From 83731efaffe652a477559470e7bf089f97c8e606 Mon Sep 17 00:00:00 2001 From: Deepesh Kumar Nath Date: Tue, 26 Jun 2018 15:22:12 +0530 Subject: [PATCH 0156/1361] code cleanup --- .travis.yml | 1 - contracts/BytesLib.sol | 2 +- contracts/OpenSTUtils.sol | 22 +++++++++++++++------- contracts/OpenSTValue.sol | 6 +++--- contracts/OpenSTValueMock.sol | 3 ++- contracts/ProofUtil.sol | 33 --------------------------------- contracts/RLPEncode.sol | 2 +- contracts/Registrar.sol | 2 +- test/OpenSTValue.js | 4 ++-- test/Registrar.js | 2 +- 10 files changed, 26 insertions(+), 51 deletions(-) delete mode 100644 contracts/ProofUtil.sol diff --git a/.travis.yml b/.travis.yml index 801a17ea..7a586036 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,6 @@ branches: only: - master - develop - - deepesh/MOSA-68 notifications: email: recipients: diff --git a/contracts/BytesLib.sol b/contracts/BytesLib.sol index f45705f5..c6f12b97 100644 --- a/contracts/BytesLib.sol +++ b/contracts/BytesLib.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; library BytesLib { function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes) { diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol index 8dac91a5..103eaed0 100644 --- a/contracts/OpenSTUtils.sol +++ b/contracts/OpenSTUtils.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.0; +pragma solidity ^0.4.23; import "./BytesLib.sol"; import "./MerklePatriciaProof.sol"; @@ -7,6 +7,13 @@ import "./RLPEncode.sol"; library OpenSTUtils { + /** + * @notice Convert bytes32 to bytes + * + * @param a bytes32 value + * + * @return bytes value + */ function bytes32ToBytes(bytes32 a) internal pure returns (bytes) { bytes memory res = new bytes(32); assembly { @@ -43,7 +50,7 @@ library OpenSTUtils { * @param _address Account address * @param _addressNonce Nonce for account address * @param _storageRoot Storage root - * @param _intentHash Intent hash + * @param _intentHash Intent hash * @param _rlpParentNodes RLP encoded parent nodes for proof verification * * @return bool status if the storage of intent hash was verified @@ -61,11 +68,12 @@ library OpenSTUtils { { bytes32 keyPath = storagePath(_intentIndex, keccak256(_address, _addressNonce)); bytes memory path = bytes32ToBytes(keccak256(keyPath)); - require(MerklePatriciaProof.verify( - keccak256(RLPEncode.encodeItem(bytes32ToBytes(_intentHash))), - path, - _rlpParentNodes, - _storageRoot), "Failed to verify storage path"); + + return MerklePatriciaProof.verify( + keccak256(RLPEncode.encodeItem(bytes32ToBytes(_intentHash))), + path, + _rlpParentNodes, + _storageRoot); } } diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index dcabb404..1e6fd518 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -378,7 +378,7 @@ contract OpenSTValue is OpsManaged, Hasher { _redeemerNonce, _blockHeight, redemptionIntentHash, - _rlpParentNodes)); + _rlpParentNodes), "RedemptionIntentHash storage verification failed"); unstakes[redemptionIntentHash] = Unstake({ uuid: _uuid, @@ -422,7 +422,7 @@ contract OpenSTValue is OpsManaged, Hasher { bytes32 storageRoot = CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoot(_blockHeight); // storageRoot cannot be 0 - require(storageRoot != bytes32(0)); + require(storageRoot != bytes32(0), "storageRoot not found for given blockHeight"); require(OpenSTUtils.verifyIntentStorage( INTENT_INDEX, @@ -430,7 +430,7 @@ contract OpenSTValue is OpsManaged, Hasher { _redeemerNonce, storageRoot, _redemptionIntentHash, - _rlpParentNodes)); + _rlpParentNodes), "RedemptionIntentHash storage verification failed"); return true; } diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 92cca93e..6577f316 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -47,6 +47,7 @@ contract OpenSTValueMock is OpenSTValue { return BLOCKS_TO_WAIT_SHORT; } + // mocked verifyRedemptionIntentHashStorage function for testing only function verifyRedemptionIntentHashStorage( bytes32 _uuid, address _redeemer, @@ -62,7 +63,7 @@ contract OpenSTValueMock is OpenSTValue { return (keccak256(mockedValidValue) == keccak256(_rlpParentNodes)); } - // mock function for testing only + // mock function for testing only to get parent nodes function getMockRLPParentNodes( bool isValid) external diff --git a/contracts/ProofUtil.sol b/contracts/ProofUtil.sol deleted file mode 100644 index 2f062e57..00000000 --- a/contracts/ProofUtil.sol +++ /dev/null @@ -1,33 +0,0 @@ -pragma solidity ^0.4.23; - -import "./BytesLib.sol"; -import "./util.sol"; - -contract ProofUtil is Util { - - event StoragePath(uint256 index, bytes32 key, bytes indexBytes, bytes keyBytes, bytes k, bytes32 path); - - constructor(){} - - function getStoragePath( - uint256 _index, - bytes32 _key) - returns(bytes32 storagePath) - { - bytes memory indexBytes = BytesLib.leftPad(bytes32ToBytes(bytes32(_index))); - bytes memory keyBytes = BytesLib.leftPad(bytes32ToBytes(_key)); - bytes memory k = BytesLib.concat(keyBytes, indexBytes); - storagePath = keccak256(keccak256(k)); - emit StoragePath(_index, _key, indexBytes, keyBytes, k, storagePath); - return storagePath; - } - - function addressToBytes(address a) constant returns (bytes b){ - assembly { - let m := mload(0x40) - mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, a)) - mstore(0x40, add(m, 52)) - b := m - } - } -} diff --git a/contracts/RLPEncode.sol b/contracts/RLPEncode.sol index 8fa67936..531fd14c 100644 --- a/contracts/RLPEncode.sol +++ b/contracts/RLPEncode.sol @@ -1,7 +1,7 @@ // Library for RLP encoding a list of bytes arrays. // Modeled after ethereumjs/rlp (https://github.com/ethereumjs/rlp) // [Very] modified version of Sam Mayo's library. -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./BytesLib.sol"; library RLPEncode { diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index c7d249cd..ed2c9b87 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -57,7 +57,7 @@ contract Registrar is OpsManaged { uint256 _redemptionUnlockHeight, bytes32 _hashLock, uint256 _blockHeight, - bytes _rlpParentNodes) + bytes _rlpParentNodes) external onlyOps returns ( diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 073a26b7..62b16949 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -365,7 +365,7 @@ contract('OpenSTValue', function(accounts) { stake = result.logs[0].args.stake; nonce = await openSTValue.getNextNonce.call(redeemer); validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); - invalidRLPParentNodes = await openSTValue.getMockRLPParentNodes(false); + invalidRLPParentNodes = await openSTValue.getMockRLPParentNodes(false); }) it('fails to confirm by non-registrar', async () => { @@ -447,7 +447,7 @@ contract('OpenSTValue', function(accounts) { describe('ProcessUnstaking', async () => { var redeemer = accounts[2]; - var redeemBeneficiary = accounts[3]; + var redeemBeneficiary = accounts[3]; var notRedeemer = accounts[5]; var redemptionIntentHash = null; var redemptionUnlockHeight = 80668; diff --git a/test/Registrar.js b/test/Registrar.js index 9c496763..793b5535 100644 --- a/test/Registrar.js +++ b/test/Registrar.js @@ -196,7 +196,7 @@ contract('Registrar', function(accounts) { var uuid = null; var nonce = null; var redemptionIntentHash = null; - var validRLPParentNodes = null; + var validRLPParentNodes = null; const BLOCKS_TO_WAIT_LONG = 8; const amountUTRedeemed = (conversionRate / (10**conversionRateDecimals)); From fa3d619ac6276451a0789a74daaebcc19fb30a55 Mon Sep 17 00:00:00 2001 From: Deepesh Kumar Nath Date: Tue, 26 Jun 2018 16:45:47 +0530 Subject: [PATCH 0157/1361] Updated comments using natspec format --- contracts/Gate.sol | 350 +++++++++++++++++++++++---------------------- 1 file changed, 179 insertions(+), 171 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 05cc33b4..be2bf526 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -28,22 +28,27 @@ import "./EIP20Interface.sol"; import "./Owned.sol"; import "./WorkersInterface.sol"; +/** + * @title Gate contract which implements ProtocolVersioned, Owned + * + * @notice Gate contract is staking gate that seperates the concerns of staker and staking processor. + * Stake process is executed through Gate contract rather than directly with the protocol contract. + * The Gate contract will server the role of staking account rather than an external account. + */ contract Gate is ProtocolVersioned, Owned { - /* - * Events - */ + /* Events */ - /** event triggered after successful execution of requestStake */ + /** Below event is emitted after successful execution of requestStake */ event StakeRequested(address _staker, uint256 _amount, address _beneficiary); - /** event triggered after successful execution of revertStakeRequest */ + /** Below event is emitted after successful execution of revertStakeRequest */ event StakeRequestReverted(address _staker, uint256 _amount); - /** event triggered after successful execution of rejectStakeRequest */ + /** Below event is emitted after successful execution of rejectStakeRequest */ event StakeRequestRejected(address _staker, uint256 _amount, uint8 _reason); - /** event triggered after successful execution of acceptStakeRequest */ + /** Below event is emitted after successful execution of acceptStakeRequest */ event StakeRequestAccepted( address _staker, uint256 _amountST, @@ -53,6 +58,8 @@ contract Gate is ProtocolVersioned, Owned { bytes32 _stakingIntentHash); + /* Storage */ + /** Storing stake requests */ mapping(address /*staker */ => StakeRequest) public stakeRequests; @@ -65,9 +72,7 @@ contract Gate is ProtocolVersioned, Owned { /** Storing utility token UUID */ bytes32 public uuid; - /* - * Structures - */ + /* Structures */ struct StakeRequest { uint256 amount; uint256 unlockHeight; @@ -75,19 +80,16 @@ contract Gate is ProtocolVersioned, Owned { bytes32 hashLock; } - /* - * Public functions - */ - - /** - * @dev Contract constructor. - * - * @param _workers worker contract address. - * @param _bounty bounty amount that worker address stakes while accepting stake request. - * @param _uuid UUID of utility token. - * @param _openSTProtocol OpenSTProtocol contract that governs staking. - */ + /* Public functions */ + /** + * @notice Contract constructor. + * + * @param _workers worker contract address. + * @param _bounty bounty amount that worker address stakes while accepting stake request. + * @param _uuid UUID of utility token. + * @param _openSTProtocol OpenSTProtocol contract that governs staking. + */ constructor( WorkersInterface _workers, uint256 _bounty, @@ -106,17 +108,18 @@ contract Gate is ProtocolVersioned, Owned { } - /** - * @dev Request stake. - * In order to request stake the staker needs to approve gate contract for stake amount. - * This can be called by staker - * Staked amount is transferred from staker address to Gate contract - * - * @param _amount staking amount. - * @param _beneficiary beneficiary address. - * - * @return success, boolean that specifies status of the execution. - */ + /** + * @notice external function requestStake + * + * @dev In order to request stake the staker needs to approve gate contract for stake amount. + * This can be called by staker + * Staked amount is transferred from staker address to Gate contract + * + * @param _amount staking amount. + * @param _beneficiary beneficiary address. + * + * @return success, boolean that specifies status of the execution. + */ function requestStake( uint256 _amount, address _beneficiary) @@ -144,13 +147,14 @@ contract Gate is ProtocolVersioned, Owned { return true; } - /** - * @dev Revert stake request. - * This can be called only by staker - * Staked amount is transferred back to staker address from Gate contract - * - * @return stakeRequestAmount staking amount. - */ + /** + * @notice external function to revert requested stake. + * + * @dev This can be called only by staker + * Staked amount is transferred back to staker address from Gate contract + * + * @return stakeRequestAmount staking amount. + */ function revertStakeRequest() external returns (uint256 stakeRequestAmount) @@ -174,16 +178,17 @@ contract Gate is ProtocolVersioned, Owned { return stakeRequestAmount; } - /** - * @dev Reject stake request. - * This can be called only by whitelisted worker address - * Staked amount is transferred back to staker address from Gate contract - * - * @param _staker staker address. - * @param _reason reason for rejection. - * - * @return stakeRequestAmount staking amount. - */ + /** + * @notice external function to reject requested stake. + * + * @dev This can be called only by whitelisted worker address + * Staked amount is transferred back to staker address from Gate contract + * + * @param _staker staker address. + * @param _reason reason for rejection. + * + * @return stakeRequestAmount staking amount. + */ function rejectStakeRequest(address _staker, uint8 _reason) external returns (uint256 stakeRequestAmount) @@ -211,21 +216,22 @@ contract Gate is ProtocolVersioned, Owned { return stakeRequestAmount; } - /** - * @dev Accept stake request. - * In order to accept stake the staker needs to approve gate contract for bounty amount. - * This can be called only by whitelisted worker address - * OpenSTProtocol is approved for staking amount by Gate contract. - * Bounty amount is transferred from msg.sender to Gate contract - * - * @param _staker staker address. - * @param _hashLock hash lock. - * - * @return amountUT branded token amount. - * @return nonce staker nonce count. - * @return unlockHeight height till what the amount is locked. - * @return stakingIntentHash staking intent hash. - */ + /** + * @notice external function to accept requested stake. + * + * @dev In order to accept stake the staker needs to approve gate contract for bounty amount. + * This can be called only by whitelisted worker address + * OpenSTProtocol is approved for staking amount by Gate contract. + * Bounty amount is transferred from msg.sender to Gate contract + * + * @param _staker staker address. + * @param _hashLock hash lock. + * + * @return amountUT branded token amount. + * @return nonce staker nonce count. + * @return unlockHeight height till what the amount is locked. + * @return stakingIntentHash staking intent hash. + */ function acceptStakeRequest(address _staker, bytes32 _hashLock) external returns ( @@ -273,110 +279,112 @@ contract Gate is ProtocolVersioned, Owned { return (amountUT, nonce, unlockHeight, stakingIntentHash); } - /** - * @dev Process staking. - * Bounty amount is to msg.sender if its not whitelisted worker - * Bounty amount is to workers contract if msg.sender is whitelisted worker - * - * @param _stakingIntentHash staking intent hash. - * @param _unlockSecret unlock secret. - * - * @return stakeRequestAmount stake amount. - */ - function processStaking( - bytes32 _stakingIntentHash, - bytes32 _unlockSecret) - external - returns (uint256 stakeRequestAmount) - { - // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender)); - - require(_stakingIntentHash != bytes32(0)); - - //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; - //but all staking stateful information will move to the gate contract in v0.9.4 (making OpenST a library call) - //and making this call obsolete - address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); - - StakeRequest storage stakeRequest = stakeRequests[staker]; - - // check if the stake request exists - require(stakeRequest.beneficiary != address(0)); - - // check if the stake request was accepted - require(stakeRequest.hashLock != bytes32(0)); - - // we call processStaking for OpenSTValue and get the stakeAddress on success. - address stakerAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); - - // check if the stake address is not 0 - require(stakerAddress != address(0)); - - //If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract - //else transfer the bounty to msg.sender. - if (workers.isWorker(msg.sender)) { - // Transfer bounty amount to the workers contract address - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); - } else { - //Transfer bounty amount to the msg.sender account - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); - } - stakeRequestAmount = stakeRequest.amount; - // delete the stake request from the mapping storage - delete stakeRequests[staker]; - - return stakeRequestAmount; - } - - /** - * @dev Revert staking. - * Caller must be the whitelisted worker. - * Staked amount is transferred the staker address. - * Bounty amount is to workers contract. - * - * @param _stakingIntentHash staking intent hash. - * - * @return stakeRequestAmount staking amount. - */ - function revertStaking( - bytes32 _stakingIntentHash) - external - returns (uint256 stakeRequestAmount) - { - - // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender)); - - require(_stakingIntentHash != bytes32(0)); - - //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; - //but all staking stateful information will move to the gate contract in v0.9.4 (making OpenST a library call) - //and making this call obsolete - address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); - - StakeRequest storage stakeRequest = stakeRequests[staker]; - - // check if the stake request exists - require(stakeRequest.beneficiary != address(0)); - - // check if the stake request was accepted - require(stakeRequest.hashLock != bytes32(0)); - - bytes32 uuidR = bytes32(0); - uint256 amountST = uint256(0); - address stakerAddress = address(0); - (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash); - - // check if the stake address is not 0 - require(stakerAddress != address(0)); - - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); - - stakeRequestAmount = stakeRequest.amount; - // delete the stake request from the mapping storage - delete stakeRequests[staker]; - - return stakeRequestAmount; - } + /** + * @notice external function to process staking. + * + * @dev Bounty amount is to msg.sender if its not whitelisted worker + * Bounty amount is to workers contract if msg.sender is whitelisted worker + * + * @param _stakingIntentHash staking intent hash. + * @param _unlockSecret unlock secret. + * + * @return stakeRequestAmount stake amount. + */ + function processStaking( + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) + external + returns (uint256 stakeRequestAmount) + { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + + require(_stakingIntentHash != bytes32(0)); + + //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; + //but all staking stateful information will move to the gate contract in v0.9.4 (making OpenST a library call) + //and making this call obsolete + address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); + + StakeRequest storage stakeRequest = stakeRequests[staker]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was accepted + require(stakeRequest.hashLock != bytes32(0)); + + // we call processStaking for OpenSTValue and get the stakeAddress on success. + address stakerAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); + + // check if the stake address is not 0 + require(stakerAddress != address(0)); + + //If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract + //else transfer the bounty to msg.sender. + if (workers.isWorker(msg.sender)) { + // Transfer bounty amount to the workers contract address + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + } else { + //Transfer bounty amount to the msg.sender account + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); + } + stakeRequestAmount = stakeRequest.amount; + // delete the stake request from the mapping storage + delete stakeRequests[staker]; + + return stakeRequestAmount; + } + + /** + * @notice external function to revert staking. + * + * @dev Caller must be the whitelisted worker. + * Staked amount is transferred the staker address. + * Bounty amount is to workers contract. + * + * @param _stakingIntentHash staking intent hash. + * + * @return stakeRequestAmount staking amount. + */ + function revertStaking( + bytes32 _stakingIntentHash) + external + returns (uint256 stakeRequestAmount) + { + + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + + require(_stakingIntentHash != bytes32(0)); + + //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; + //but all staking stateful information will move to the gate contract in v0.9.4 (making OpenST a library call) + //and making this call obsolete + address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); + + StakeRequest storage stakeRequest = stakeRequests[staker]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was accepted + require(stakeRequest.hashLock != bytes32(0)); + + bytes32 uuidR = bytes32(0); + uint256 amountST = uint256(0); + address stakerAddress = address(0); + (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash); + + // check if the stake address is not 0 + require(stakerAddress != address(0)); + + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + + stakeRequestAmount = stakeRequest.amount; + // delete the stake request from the mapping storage + delete stakeRequests[staker]; + + return stakeRequestAmount; + } } \ No newline at end of file From 1f9ace77d95d9a8a118341fbe0d294e83c6f4ccb Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Tue, 26 Jun 2018 20:14:18 +0530 Subject: [PATCH 0158/1361] Changes related to storage proof.MOSA-63 --- contracts/OpenSTUtility.sol | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 39f706dc..10dd9682 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -32,7 +32,7 @@ import "./STPrimeConfig.sol"; import "./BrandedToken.sol"; import "./UtilityTokenInterface.sol"; import "./ProtocolVersioned.sol"; -import "./Core.sol"; +import "./CoreInterface.sol"; import "./MerklePatriciaProof.sol"; import "./OpenSTUtils.sol"; @@ -198,6 +198,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { // @dev read STPrime address and uuid from contract } + /* * External functions */ @@ -210,7 +211,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 _amountUT, uint256 _stakingUnlockHeight, bytes32 _hashLock, - bytes32 _stakingIntentHash, uint256 _blockHeight, bytes rlpParentNodes) external @@ -223,8 +223,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_amountUT > 0); // stakingUnlockheight needs to be checked against the core that tracks the value chain require(_stakingUnlockHeight > 0); - require(_stakingIntentHash != ""); - expirationHeight = block.number + blocksToWaitShort(); nonces[_staker] = _stakerNonce; @@ -239,12 +237,10 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _stakingUnlockHeight, _hashLock ); - - require(stakingIntentHash == _stakingIntentHash); - bytes32 storageRoot = core.getStorageRoot(_blockHeight); - bytes memory encodedPathToMerkle = OpenSTUtils.bytes32ToBytes(OpenSTUtils.storagePath(5, keccak256(_staker,_stakerNonce))); - require(MerklePatriciaProof.verify(keccak256(stakingIntentHash), encodedPathToMerkle,rlpParentNodes,storageRoot)); - + //bytes32 storageRoot = core.getStorageRoot(_blockHeight); + // bytes memory encodedPathToMerkle = OpenSTUtils.bytes32ToBytes(OpenSTUtils.storagePath(5, keccak256(_staker,_stakerNonce))); + //require(MerklePatriciaProof.verify(keccak256(stakingIntentHash), encodedPathToMerkle,rlpParentNodes,storageRoot)); + require(merkleVerificationOfStake(_staker, _stakerNonce, stakingIntentHash, rlpParentNodes, core.getStorageRoot(_blockHeight))); mints[stakingIntentHash] = Mint({ uuid: _uuid, staker: _staker, @@ -255,12 +251,21 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { }); emit StakingIntentConfirmed(_uuid, stakingIntentHash, _staker, _beneficiary, _amountST, - _amountUT, expirationHeight, _blockHeight ,storageRoot); + _amountUT, expirationHeight, _blockHeight ,core.getStorageRoot(_blockHeight)); return expirationHeight; } + function merkleVerificationOfStake(address _staker, uint256 _stakerNonce, bytes32 stakingIntentHash, bytes rlpParentNodes, bytes32 storageRoot) private returns(bool /* MerkleProofStatus*/){ + + bytes memory encodedPathInMerkle = OpenSTUtils.bytes32ToBytes(OpenSTUtils.storagePath(5, keccak256(_staker,_stakerNonce))); + return MerklePatriciaProof.verify(keccak256(stakingIntentHash), encodedPathInMerkle,rlpParentNodes,storageRoot); + + + + } + function processMinting( bytes32 _stakingIntentHash, bytes32 _unlockSecret) From 14fb032c2a7ec4fd96ced100d33268d1333e785f Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Wed, 27 Jun 2018 15:29:13 +0530 Subject: [PATCH 0159/1361] [MOSA-62] Removed ProofVerificationSkipped event Removed parameter hashedAccount from event signature of OpenSTProven Added parameter wasAlreadyProved in event signature of OpenSTProven --- contracts/Core.sol | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index a59db846..f03b4ecf 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -39,10 +39,8 @@ contract Core is CoreInterface, Util { event StateRootCommitted(uint256 blockHeight, bytes32 stateRoot); - event OpenSTProven(uint256 blockHeight, bytes32 storageRoot, bytes32 hashedAccount); - - /** Below event emitted to differentiate replay call of proveOpenST function for same block height */ - event ProofVerificationSkipped(uint256 blockHeight, bytes32 storageRoot); + /** wasAlreadyProved parameter differentiates between first call and replay call of proveOpenST method for same block height */ + event OpenSTProven(uint256 blockHeight, bytes32 storageRoot, bool wasAlreadyProved); /* Storage */ @@ -226,9 +224,8 @@ contract Core is CoreInterface, Util { if (provenStorageRoot != bytes32(0)) { // Check extracted storage root is matching with existing stored storage root require(provenStorageRoot == storageRoot, "Storage root mismatch when account is already proven"); - emit OpenSTProven(_blockHeight, storageRoot, hashedAccount); - // Below event needed to differentiate single call VS multiple call of proveOpenST function for same block height - emit ProofVerificationSkipped(_blockHeight, storageRoot); + // wasAlreadyProved is true here since proveOpenST is replay call for same block height + emit OpenSTProven(_blockHeight, storageRoot, true); // return true return true; } @@ -238,8 +235,8 @@ contract Core is CoreInterface, Util { // After verification update storageRoots mapping storageRoots[_blockHeight] = storageRoot; - // Emit event - emit OpenSTProven(_blockHeight, storageRoot, hashedAccount); + // wasAlreadyProved is false since proveOpenST is called for the first time for a block height + emit OpenSTProven(_blockHeight, storageRoot, false); return true; } From 6ab9f183cab2fa872d27e5ad00512d150f49252e Mon Sep 17 00:00:00 2001 From: Deepesh Kumar Nath Date: Wed, 27 Jun 2018 16:27:36 +0530 Subject: [PATCH 0160/1361] updated code related to core. MOSA-65 --- contracts/Core.sol | 17 +++++--- contracts/CoreMock.sol | 76 +++++++++++++++++++++++++++++++++ contracts/OpenSTUtility.sol | 19 ++++----- contracts/OpenSTUtilityMock.sol | 3 +- contracts/OpenSTValue.sol | 6 +-- test/Core_utils.js | 5 ++- test/Gate_utils.js | 2 +- test/Protocol_utils.js | 2 +- test/Registrar_utils.js | 12 +++--- 9 files changed, 112 insertions(+), 30 deletions(-) create mode 100644 contracts/CoreMock.sol diff --git a/contracts/Core.sol b/contracts/Core.sol index 0a6cb560..568b03cb 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -84,16 +84,14 @@ contract Core is CoreInterface, Util { _; } - // ~5Days + // ~5Days in seconds uint256 private constant TIME_TO_WAIT = 432000; - uint256 private remoteBlockTime; + uint256 public remoteBlockTime; - uint256 private blocksToWait; + uint256 public blocksToWait; - /* - * Public functions - */ + /* Public functions */ /** * @notice Contract constructor @@ -170,10 +168,15 @@ contract Core is CoreInterface, Util { return coreOpenSTRemote; } + /** + * @notice Get safe unlock height + * + * @return uint256 safeUnlockHeight + */ function safeUnlockHeight() external view - returns (uint256 safeUnlockHeight) + returns (uint256 /* safeUnlockHeight */) { return blocksToWait + latestStateRootBlockHeight; } diff --git a/contracts/CoreMock.sol b/contracts/CoreMock.sol new file mode 100644 index 00000000..0df80128 --- /dev/null +++ b/contracts/CoreMock.sol @@ -0,0 +1,76 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: Core +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./Core.sol"; + +/** + * @title CoreMock contract + * + * @notice Used for test only + */ +contract CoreMock is Core { + + // ~5Days in seconds + uint256 private constant TIME_TO_WAIT = 6; + + /* Public functions */ + + /** + * @notice Contract constructor + * + * @dev bytes32ToBytes is util contract method + * + * @param _registrar registrar address + * @param _chainIdOrigin origin chain id + * @param _chainIdRemote remote chain id + * @param _openSTRemote remote openSTUtility/openSTValue contract address + */ + constructor( + address _registrar, + uint256 _chainIdOrigin, + uint256 _chainIdRemote, + address _openSTRemote, + uint256 _blockTimeRemote, + WorkersInterface _workers) + Core(_registrar, _chainIdOrigin, _chainIdRemote, _openSTRemote, _blockTimeRemote, _workers) + public + { + blocksToWait = TIME_TO_WAIT.div(_blockTimeRemote); + } + + /** + * @notice Get safe unlock height + * + * @return uint256 safeUnlockHeight + */ + function safeUnlockHeight() + external + view + returns (uint256 /* safeUnlockHeight */) + { + return blocksToWait + block.number; + } + + + +} \ No newline at end of file diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index f031834b..60faa820 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -32,6 +32,7 @@ import "./STPrimeConfig.sol"; import "./BrandedToken.sol"; import "./UtilityTokenInterface.sol"; import "./ProtocolVersioned.sol"; +import "./CoreInterface.sol"; /// @title OpenST Utility @@ -68,17 +69,13 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { address _redeemer, address _beneficiary, uint256 _amountUT); - /* - * Constants - */ - // ~2 weeks + /* Constants */ + // ~2 weeks in seconds uint256 private constant TIME_TO_WAIT_LONG = 1209600; - // ~1hour + // ~1hour in seconds uint256 private constant TIME_TO_WAIT_SHORT = 3600; - /* - * Storage - */ + /* Storage */ // storage for staking intent hash of active staking intents mapping(bytes32 /* intentHash */ => bytes32) public intents; @@ -107,12 +104,11 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /// chainId of the current utility chain uint256 public chainIdUtility; address public registrar; + CoreInterface public core; uint256 public blocksToWaitShort; uint256 public blocksToWaitLong; bytes32[] public uuids; - - /// registered branded tokens /* * Structures @@ -153,6 +149,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 _chainIdValue, uint256 _chainIdUtility, address _registrar, + CoreInterface _core, uint256 _blockTime) public OpsManaged() @@ -160,6 +157,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_chainIdValue != 0); require(_chainIdUtility != 0); require(_registrar != address(0)); + require(_core != address(0), "Core address cannot be null"); require(_blockTime != 0); blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); @@ -168,6 +166,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { chainIdValue = _chainIdValue; chainIdUtility = _chainIdUtility; registrar = _registrar; + core = _core; uuidSTPrime = hashUuid( STPRIME_SYMBOL, diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol index 012ce7b2..8735a06e 100644 --- a/contracts/OpenSTUtilityMock.sol +++ b/contracts/OpenSTUtilityMock.sol @@ -37,8 +37,9 @@ contract OpenSTUtilityMock is OpenSTUtility { uint256 _chainIdValue, uint256 _chainIdUtility, address _registrar, + CoreInterface _core, uint256 _blockTime) - OpenSTUtility(_chainIdValue, _chainIdUtility, _registrar, _blockTime) + OpenSTUtility(_chainIdValue, _chainIdUtility, _registrar, _core, _blockTime) public { blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 41d8d39a..4c121fa7 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -70,9 +70,9 @@ contract OpenSTValue is OpsManaged, Hasher { uint8 public constant TOKEN_DECIMALS = 18; uint256 public constant DECIMALSFACTOR = 10**uint256(TOKEN_DECIMALS); - // ~2 weeks + // ~2 weeks in seconds uint256 private constant TIME_TO_WAIT_LONG = 1209600; - // ~1hour + // ~1hour in seconds uint256 private constant TIME_TO_WAIT_SHORT = 3600; uint8 private constant INTENT_INDEX = 3; @@ -359,7 +359,7 @@ contract OpenSTValue is OpsManaged, Hasher { // utility chain require(_redemptionUnlockHeight > 0); - require(cores[utilityTokens[_uuid].chainIdUtility].safeUnlockHeight() < _redemptionUnlockHeight); + require(cores[utilityToken.chainIdUtility].safeUnlockHeight() < _redemptionUnlockHeight); require(nonces[_redeemer] + 1 == _redeemerNonce); nonces[_redeemer]++; diff --git a/test/Core_utils.js b/test/Core_utils.js index 33c0a4d1..34a0ccc5 100644 --- a/test/Core_utils.js +++ b/test/Core_utils.js @@ -26,6 +26,9 @@ const Core = artifacts.require("./Core.sol") const BigNumber = require('bignumber.js') ; +const rootPrefix = ".." + , constants = require(rootPrefix + '/test/lib/constants') +; /// @dev Deploy @@ -49,7 +52,7 @@ module.exports.deployCore = async (artifacts, accounts) => { await workers.setAdminAddress(admin); await workers.setOpsAddress(ops); await workers.setWorker(worker1, deactivationHeight, {from:ops}); - const core = await Core.new(registrar, chainIdOrigin, chainIdRemote, openSTRemote, workers.address, {from:accounts[0]}); + const core = await Core.new(registrar, chainIdOrigin, chainIdRemote, openSTRemote, constants.UTILITY_CHAIN_BLOCK_TIME, workers.address, {from:accounts[0]}); return { core : core } diff --git a/test/Gate_utils.js b/test/Gate_utils.js index 298d5049..f63fd8a8 100644 --- a/test/Gate_utils.js +++ b/test/Gate_utils.js @@ -70,7 +70,7 @@ module.exports.deployGate = async (artifacts, accounts) => { await workers.setOpsAddress(ops); await workers.setWorker(worker1, new BigNumber(web3.toWei(10, "ether")), {from:ops}); - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, constants.UTILITY_CHAIN_BLOCK_TIME, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); diff --git a/test/Protocol_utils.js b/test/Protocol_utils.js index 072600ec..049a9d65 100644 --- a/test/Protocol_utils.js +++ b/test/Protocol_utils.js @@ -110,7 +110,7 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { // only setup a core for the Value Chain to track the Utility Chain for v0.9.1 const coreVC = await Core.new(registrarVC.address, CHAINID_VALUE, CHAINID_UTILITY, - openSTUtility.address, workers.address); + openSTUtility.address, constants.UTILITY_CHAIN_BLOCK_TIME, workers.address); await utils.logTransaction(coreVC.transactionHash, "CoreVC.new"); const stpContractAddress = await openSTUtility.simpleTokenPrime.call(); diff --git a/test/Registrar_utils.js b/test/Registrar_utils.js index 44734712..194f8b75 100644 --- a/test/Registrar_utils.js +++ b/test/Registrar_utils.js @@ -29,8 +29,8 @@ var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); var Registrar = artifacts.require("./Registrar.sol"); var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); -var Core = artifacts.require("./Core.sol"); -var Workers = artifacts.require("./Workers.sol") +var CoreMock = artifacts.require("./CoreMock.sol"); +var Workers = artifacts.require("./Workers.sol"); /// @dev Deploy module.exports.deployRegistrar = async (artifacts, accounts) => { @@ -61,10 +61,10 @@ module.exports.deployRegistrar = async (artifacts, accounts) => { await workers.setOpsAddress(ops); await workers.setWorker(worker1, deactivationHeight, {from:ops}); - const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, constants.UTILITY_CHAIN_BLOCK_TIME, { gas: 10000000 }); - const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address, constants.VALUE_CHAIN_BLOCK_TIME); - const core = await Core.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address, workers.address); - + const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address, constants.VALUE_CHAIN_BLOCK_TIME); + const coreForOpenSTUtility = await CoreMock.new(registrar.address, chainIdUtility, chainIdValue, openSTValue.address, constants.VALUE_CHAIN_BLOCK_TIME, workers.address); + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, coreForOpenSTUtility.address ,constants.UTILITY_CHAIN_BLOCK_TIME, { gas: 10000000 }); + const core = await CoreMock.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address, constants.UTILITY_CHAIN_BLOCK_TIME, workers.address); return { valueToken : valueToken, registrar : registrar, From ce19963e260ad8fd028b7327849ba7a9f8f4a257 Mon Sep 17 00:00:00 2001 From: Deepesh Kumar Nath Date: Wed, 27 Jun 2018 18:12:53 +0530 Subject: [PATCH 0161/1361] removed check if whitelisted worker in Gate::processStaking. MOSA-121 --- contracts/Gate.sol | 3 --- test/Gate.js | 33 +++++++++++++++++++-------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 9f44b013..a758c417 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -221,9 +221,6 @@ contract Gate is ProtocolVersioned, Owned { external returns (uint256 stakeRequestAmount) { - // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender)); - require(_stakingIntentHash != bytes32(0)); //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; diff --git a/test/Gate.js b/test/Gate.js index 524aff79..4795288b 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -204,7 +204,7 @@ contract('Gate', function(accounts) { return {lock: lock, stakingIntentHash: stakingIntentHash} ; }; - const processStaking = async function (stakingIntentHash, unlockSecret, messageSender, isSuccessCase) { + const processStaking = async function (stakingIntentHash, unlockSecret, messageSender, isSuccessCase, isWhitelistedWorker) { let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) , initialWorkerBalance = await valueToken.balanceOf.call(workers) @@ -230,8 +230,13 @@ contract('Gate', function(accounts) { if (isSuccessCase) { // check balances - assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); - assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); + if(isWhitelistedWorker){ + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); + } else { + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.plus(bountyAmount)), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance), true); + } assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); } else { // check balances @@ -525,31 +530,31 @@ contract('Gate', function(accounts) { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; - await processStaking(stakingIntentHash, lock.s, workerAddress1, true); + await processStaking(stakingIntentHash, lock.s, workerAddress1, true, true); }); - it('fails to processes when the worker address is not whitelisted', async () => { + it('successfully processes when the worker address is not whitelisted', async () => { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; let workerAddress = accounts[10]; - await processStaking(stakingIntentHash, lock.s, workerAddress, false); + await processStaking(stakingIntentHash, lock.s, workerAddress, true, false); }); it('fails to processes when stakingIntentHash is 0', async () => { await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); - await processStaking(0, lock.s, workerAddress1, false); + await processStaking(0, lock.s, workerAddress1, false, true); }); it('fails to processes when stakingIntentHash is invalid', async () => { await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); - await processStaking(beneficiaryAccount, lock.s, workerAddress1, false); + await processStaking(beneficiaryAccount, lock.s, workerAddress1, false, true); }); @@ -558,7 +563,7 @@ contract('Gate', function(accounts) { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; - await processStaking(stakingIntentHash, 0, workerAddress1, false); + await processStaking(stakingIntentHash, 0, workerAddress1, false, true); }); @@ -567,14 +572,14 @@ contract('Gate', function(accounts) { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; - await processStaking(stakingIntentHash, beneficiaryAccount, workerAddress1, false); + await processStaking(stakingIntentHash, beneficiaryAccount, workerAddress1, false, true); }); it('fails to processes when stakeRequest was not accepted', async () => { let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); - await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false, true); }); @@ -583,7 +588,7 @@ contract('Gate', function(accounts) { let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await rejectStakeRequest(stakerAccount, stakeAmount, 0, workerAddress1, true); - await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false, true); }); @@ -592,7 +597,7 @@ contract('Gate', function(accounts) { let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await revertStakeRequest(stakerAccount, stakeAmount ,true); - await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); + await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false, true); }); @@ -627,7 +632,7 @@ contract('Gate', function(accounts) { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; - await processStaking(stakingIntentHash, lock.s, workerAddress1, true); + await processStaking(stakingIntentHash, lock.s, workerAddress1, true, true); await revertStaking(stakingIntentHash, workerAddress1, false); From 740e5e397d0dd42285167f2017bcc043d2b3f43a Mon Sep 17 00:00:00 2001 From: Deepesh Kumar Nath Date: Wed, 27 Jun 2018 18:56:45 +0530 Subject: [PATCH 0162/1361] fixed typo in Gate:processStaking. MOSA-124 --- contracts/Gate.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 9f44b013..63525bf5 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -240,10 +240,10 @@ contract Gate is ProtocolVersioned, Owned { require(stakeRequest.hashLock != bytes32(0)); // we call processStaking for OpenSTValue and get the stakeAddress on success. - address stakerAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); + address stakeAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); // check if the stake address is not 0 - require(stakerAddress != address(0)); + require(stakeAddress != address(0)); //If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract //else transfer the bounty to msg.sender. From 74f610c9cea67610071caf9ddfd189106aab26d1 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Wed, 27 Jun 2018 16:26:15 +0200 Subject: [PATCH 0163/1361] contracts, test: created unit test in OpenSTValue.js using OpenSTValue mock --- contracts/OpenSTValueMock.sol | 75 +++++++++++++++++++++++++++++++++++ test/OpenSTValue.js | 10 +++++ 2 files changed, 85 insertions(+) diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 0812e7aa..add9d66a 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -28,6 +28,10 @@ import "./OpenSTValue.sol"; contract OpenSTValueMock is OpenSTValue { uint256 private constant BLOCKS_TO_WAIT_LONG = 8; uint256 private constant BLOCKS_TO_WAIT_SHORT = 5; + uint256 public intentsIndexPosition = 4; + bytes32 public intentsMappingKey = keccak256(0); + bytes32 public intentsMappingValue = keccak256(1); + bytes32 public intentsMappingStorageKey = keccak256(bytes32(intentsMappingKey), uint256(intentsIndexPosition)); /* * Public functions @@ -39,6 +43,77 @@ contract OpenSTValueMock is OpenSTValue { OpenSTValue(_chainIdValue, _eip20token, _registrar) public { } + function stake( + bytes32 _uuid, + uint256 _amountST, + address _beneficiary, + bytes32 _hashLock, + address _staker) + external + returns ( + uint256 amountUT, + uint256 nonce, + uint256 unlockHeight, + bytes32 stakingIntentHash) + /* solhint-disable-next-line function-max-lines */ + { + /* solhint-disable avoid-tx-origin */ + // check the staking contract has been approved to spend the amount to stake + // OpenSTValue needs to be able to transfer the stake into its balance for + // keeping until the two-phase process is completed on both chains. + require(_amountST > uint256(0)); + + require(utilityTokens[_uuid].simpleStake != address(0)); + require(_beneficiary != address(0)); + require(_staker != address(0)); + + UtilityToken storage utilityToken = utilityTokens[_uuid]; + + // if the staking account is set to a non-zero address, + // then all transactions have come (from/over) the staking account + if (utilityToken.stakingAccount != address(0)) require(msg.sender == utilityToken.stakingAccount); + require(valueToken.transferFrom(msg.sender, address(this), _amountST)); + + amountUT = (_amountST.mul(utilityToken.conversionRate)) + .div(10**uint256(utilityToken.conversionRateDecimals)); + unlockHeight = block.number + blocksToWaitLong(); + + nonces[_staker]++; + nonce = nonces[_staker]; + + stakingIntentHash = hashStakingIntent( + _uuid, + _staker, + nonce, + _beneficiary, + _amountST, + amountUT, + unlockHeight, + _hashLock + ); + + stakes[stakingIntentHash] = Stake({ + uuid: _uuid, + staker: _staker, + beneficiary: _beneficiary, + nonce: nonce, + amountST: _amountST, + amountUT: amountUT, + unlockHeight: unlockHeight, + hashLock: _hashLock + }); + + // store the staking intent hash directly in storage of OpenSTValue + // so that a Merkle proof can be generated for active staking intents + bytes32 intentKeyHash = hashIntentKey(_staker, nonce); + intents[intentsMappingKey] = intentsMappingValue; + emit StakingIntentDeclared(_uuid, _staker, nonce, intentKeyHash, _beneficiary, + _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); + + return (amountUT, nonce, unlockHeight, stakingIntentHash); + /* solhint-enable avoid-tx-origin */ + } + function blocksToWaitLong() public pure returns (uint256) { return BLOCKS_TO_WAIT_LONG; } diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index d997a97f..c41b3d11 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -243,6 +243,16 @@ contract('OpenSTValue', function(accounts) { await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, 0, lock.l, accounts[0], { from: accounts[0] })); }) + it('successfully checks index position of intents mapping', async () => { + var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + + var intentsMappingStoredValue = await openSTValue._eth.getStorageAt(openSTValue.address, openSTValue.intentsMappingStorageKey.call()); + assert.equal((await openSTValue.intentsMappingValue.call(), intentsMappingStoredValue); + + }) + + + it('successfully stakes', async () => { var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); var amountUT = stakeReturns[0].toNumber(); From ca42a51ef49345f793ab49a6fd1e0c77a20d3a89 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Wed, 27 Jun 2018 17:54:16 +0200 Subject: [PATCH 0164/1361] contracts: updates test struct --- contracts/OpenSTValueMock.sol | 81 ++++------------------------------- test/OpenSTValue.js | 9 ++-- 2 files changed, 13 insertions(+), 77 deletions(-) diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index add9d66a..58fb9ccb 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -29,9 +29,9 @@ contract OpenSTValueMock is OpenSTValue { uint256 private constant BLOCKS_TO_WAIT_LONG = 8; uint256 private constant BLOCKS_TO_WAIT_SHORT = 5; uint256 public intentsIndexPosition = 4; - bytes32 public intentsMappingKey = keccak256(0); - bytes32 public intentsMappingValue = keccak256(1); - bytes32 public intentsMappingStorageKey = keccak256(bytes32(intentsMappingKey), uint256(intentsIndexPosition)); + bytes32 public intentsMappingKey = keccak256(abi.encodePacked(uint256(0))); + bytes32 public intentsMappingValue = keccak256(abi.encodePacked(uint256(1))); + bytes32 public intentsMappingStorageKey = keccak256(abi.encodePacked(intentsMappingKey, intentsIndexPosition)); /* * Public functions @@ -43,76 +43,13 @@ contract OpenSTValueMock is OpenSTValue { OpenSTValue(_chainIdValue, _eip20token, _registrar) public { } - function stake( - bytes32 _uuid, - uint256 _amountST, - address _beneficiary, - bytes32 _hashLock, - address _staker) - external - returns ( - uint256 amountUT, - uint256 nonce, - uint256 unlockHeight, - bytes32 stakingIntentHash) - /* solhint-disable-next-line function-max-lines */ - { - /* solhint-disable avoid-tx-origin */ - // check the staking contract has been approved to spend the amount to stake - // OpenSTValue needs to be able to transfer the stake into its balance for - // keeping until the two-phase process is completed on both chains. - require(_amountST > uint256(0)); + function testIntentsMapping() public { + intents[intentsMappingKey] = intentsMappingValue; + } - require(utilityTokens[_uuid].simpleStake != address(0)); - require(_beneficiary != address(0)); - require(_staker != address(0)); - - UtilityToken storage utilityToken = utilityTokens[_uuid]; - - // if the staking account is set to a non-zero address, - // then all transactions have come (from/over) the staking account - if (utilityToken.stakingAccount != address(0)) require(msg.sender == utilityToken.stakingAccount); - require(valueToken.transferFrom(msg.sender, address(this), _amountST)); - - amountUT = (_amountST.mul(utilityToken.conversionRate)) - .div(10**uint256(utilityToken.conversionRateDecimals)); - unlockHeight = block.number + blocksToWaitLong(); - - nonces[_staker]++; - nonce = nonces[_staker]; - - stakingIntentHash = hashStakingIntent( - _uuid, - _staker, - nonce, - _beneficiary, - _amountST, - amountUT, - unlockHeight, - _hashLock - ); - - stakes[stakingIntentHash] = Stake({ - uuid: _uuid, - staker: _staker, - beneficiary: _beneficiary, - nonce: nonce, - amountST: _amountST, - amountUT: amountUT, - unlockHeight: unlockHeight, - hashLock: _hashLock - }); - - // store the staking intent hash directly in storage of OpenSTValue - // so that a Merkle proof can be generated for active staking intents - bytes32 intentKeyHash = hashIntentKey(_staker, nonce); - intents[intentsMappingKey] = intentsMappingValue; - emit StakingIntentDeclared(_uuid, _staker, nonce, intentKeyHash, _beneficiary, - _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); - - return (amountUT, nonce, unlockHeight, stakingIntentHash); - /* solhint-enable avoid-tx-origin */ - } + function deleteIntentsMapping() public { + delete intents[intentsMappingKey]; + } function blocksToWaitLong() public pure returns (uint256) { return BLOCKS_TO_WAIT_LONG; diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index c41b3d11..8e38dfea 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -244,14 +244,13 @@ contract('OpenSTValue', function(accounts) { }) it('successfully checks index position of intents mapping', async () => { - var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + await openSTValue.testIntentsMapping.call(); var intentsMappingStoredValue = await openSTValue._eth.getStorageAt(openSTValue.address, openSTValue.intentsMappingStorageKey.call()); - assert.equal((await openSTValue.intentsMappingValue.call(), intentsMappingStoredValue); - - }) + assert.equal(await openSTValue.intentsMappingValue.call(), intentsMappingStoredValue); + }) it('successfully stakes', async () => { var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); @@ -284,7 +283,7 @@ contract('OpenSTValue', function(accounts) { it('fails to stake when msg.sender is not the stakingAccount', async () => { await Utils.expectThrow(openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[1], { from: accounts[1] })); - }) + }) it('successfully stakes', async () => { var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); From c623fb53b35aff491bab8ac08be8074709f83749 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Wed, 27 Jun 2018 21:15:15 +0200 Subject: [PATCH 0165/1361] tests: web3.getStorageAt failing --- contracts/OpenSTValueMock.sol | 99 +++++++++++++++++++++++++++++++---- test/OpenSTValue.js | 54 +++++++++++++++++-- 2 files changed, 139 insertions(+), 14 deletions(-) diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 58fb9ccb..bfa07a89 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -28,10 +28,13 @@ import "./OpenSTValue.sol"; contract OpenSTValueMock is OpenSTValue { uint256 private constant BLOCKS_TO_WAIT_LONG = 8; uint256 private constant BLOCKS_TO_WAIT_SHORT = 5; - uint256 public intentsIndexPosition = 4; - bytes32 public intentsMappingKey = keccak256(abi.encodePacked(uint256(0))); - bytes32 public intentsMappingValue = keccak256(abi.encodePacked(uint256(1))); - bytes32 public intentsMappingStorageKey = keccak256(abi.encodePacked(intentsMappingKey, intentsIndexPosition)); + bytes32 public intentsIndexPosition = 4; + bytes32 public intentsMappingKey = keccak256(abi.encodePacked(uint256(1))); + bytes32 public intentsMappingValue = keccak256(abi.encodePacked(uint256(2))); + + + //bytes32 public concateValue = intentsMappingKey + intentsIndexPosition; + //bytes32 public intentsMappingStorageKey = keccak256(abi.encodePacked(intentsMappingKey, intentsIndexPosition)); /* * Public functions @@ -41,16 +44,90 @@ contract OpenSTValueMock is OpenSTValue { EIP20Interface _eip20token, address _registrar) OpenSTValue(_chainIdValue, _eip20token, _registrar) - public { } - - function testIntentsMapping() public { + public { intents[intentsMappingKey] = intentsMappingValue; - } - - function deleteIntentsMapping() public { - delete intents[intentsMappingKey]; } + // function stake( + // bytes32 _uuid, + // uint256 _amountST, + // address _beneficiary, + // bytes32 _hashLock, + // address _staker) + // external + // returns ( + // uint256 amountUT, + // uint256 nonce, + // uint256 unlockHeight, + // bytes32 stakingIntentHash) + // /* solhint-disable-next-line function-max-lines */ + // { + // /* solhint-disable avoid-tx-origin */ + // // check the staking contract has been approved to spend the amount to stake + // // OpenSTValue needs to be able to transfer the stake into its balance for + // // keeping until the two-phase process is completed on both chains. + // require(_amountST > uint256(0)); + + // require(utilityTokens[_uuid].simpleStake != address(0)); + // require(_beneficiary != address(0)); + // require(_staker != address(0)); + + // UtilityToken storage utilityToken = utilityTokens[_uuid]; + + // // if the staking account is set to a non-zero address, + // // then all transactions have come (from/over) the staking account + // if (utilityToken.stakingAccount != address(0)) require(msg.sender == utilityToken.stakingAccount); + // require(valueToken.transferFrom(msg.sender, address(this), _amountST)); + + // amountUT = (_amountST.mul(utilityToken.conversionRate)) + // .div(10**uint256(utilityToken.conversionRateDecimals)); + // unlockHeight = block.number + blocksToWaitLong(); + + // nonces[_staker]++; + // nonce = nonces[_staker]; + + // stakingIntentHash = hashStakingIntent( + // _uuid, + // _staker, + // nonce, + // _beneficiary, + // _amountST, + // amountUT, + // unlockHeight, + // _hashLock + // ); + + // stakes[stakingIntentHash] = Stake({ + // uuid: _uuid, + // staker: _staker, + // beneficiary: _beneficiary, + // nonce: nonce, + // amountST: _amountST, + // amountUT: amountUT, + // unlockHeight: unlockHeight, + // hashLock: _hashLock + // }); + + // // store the staking intent hash directly in storage of OpenSTValue + // // so that a Merkle proof can be generated for active staking intents + // bytes32 intentKeyHash = hashIntentKey(_staker, nonce); + // intents[intentsMappingKey] = intentsMappingValue; + + // emit StakingIntentDeclared(_uuid, _staker, nonce, intentKeyHash, _beneficiary, + // _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); + + // return (amountUT, nonce, unlockHeight, stakingIntentHash); + // /* solhint-enable avoid-tx-origin */ + // } + + //function testIntentsMapping(uint256 number) public { + // intents[keccak256(abi.encodePacked(number))] = keccak256(abi.encodePacked(number+1)); + //} + + // function deleteIntentsMapping() public { + // delete intents[intentsMappingKey]; + // } + function blocksToWaitLong() public pure returns (uint256) { return BLOCKS_TO_WAIT_LONG; } diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 8e38dfea..40ac5772 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -25,6 +25,8 @@ const OpenSTValue_utils = require('./OpenSTValue_utils.js'); const Core = artifacts.require("./Core.sol"); const SimpleStake = artifacts.require("./SimpleStake.sol"); const BigNumber = require('bignumber.js'); +const Web3 = require('Web3'); + /// /// Test stories @@ -244,11 +246,57 @@ contract('OpenSTValue', function(accounts) { }) it('successfully checks index position of intents mapping', async () => { - await openSTValue.testIntentsMapping.call(); + //await openSTValue.testIntentsMapping.call(1); + //var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + + var intentsMappingKey1 = await openSTValue.intentsMappingKey.call(); + var intentsMappingValue1 = await openSTValue.intentsMappingValue.call(); + //var intentsIndexPosition = await openSTValue.intentsIndexPosition.call(); + + console.log(intentsMappingKey1,intentsMappingValue1); + + var intentsMappingKey = Web3.utils.soliditySha3("1"); + var intentsMappingValue = Web3.utils.soliditySha3("2"); + + var fullKey = intentsMappingKey+"0000000000000000000000000000000000000000000000000000000000000004"; + + console.log("full concatenated key", fullKey); + + var storageKeyHex = Web3.utils.soliditySha3(String(fullKey), {"encoding":"hex"}); + + var storageKey = Web3.utils.soliditySha3(String(fullKey)); + + console.log(intentsMappingKey, intentsMappingValue); + + console.log("storage key and storage key hex", storageKey, storageKeyHex); + + var address = openSTValue.address; + + console.log("address", address); + + //concateValue = await openSTValue.concateValue.call(); + //intentsMappingStorageKey = await openSTValue.intentsMappingStorageKey.call(); + //intentsMappingStorageKey = Web3.utils.soliditySha3(intentsMappingKey+intentsMappingValue); + + intentValue = await openSTValue.intents.call(intentsMappingKey); + + actualStoredValue = await web3.eth.getStorageAt(String(address), storageKey) + + // console.log("actul mock mapping Key", intentsMappingKey); + + // console.log("actual mock mapping value from mock contract", intentsMappingValue); + + // console.log("concatenated string for key", concateValue) + + console.log("calculated mock storage key", storageKey); + + console.log("value determined directly from intents mapping", intentValue); + + console.log("getting storage value from contract using calculated key", actualStoredValue ); - var intentsMappingStoredValue = await openSTValue._eth.getStorageAt(openSTValue.address, openSTValue.intentsMappingStorageKey.call()); + // var intentsMappingStoredValue = await web3.eth.getStorageAt(openSTValue.address, intentsMappingStorageKey); - assert.equal(await openSTValue.intentsMappingValue.call(), intentsMappingStoredValue); + assert.equal(await intentValue, actualStoredValue); }) From 0412eb380f5c9e4ce86b66bf6b7598acd3708358 Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Thu, 28 Jun 2018 15:08:00 +0530 Subject: [PATCH 0166/1361] Removed becoz these files not needed for this story --- contracts/MerklePatriciaProofMock.sol | 23 ------------------- test/MerklePatricia.js | 32 --------------------------- test/data/AccountInfo.json | 6 ----- 3 files changed, 61 deletions(-) delete mode 100644 contracts/MerklePatriciaProofMock.sol delete mode 100644 test/MerklePatricia.js delete mode 100644 test/data/AccountInfo.json diff --git a/contracts/MerklePatriciaProofMock.sol b/contracts/MerklePatriciaProofMock.sol deleted file mode 100644 index c62823c0..00000000 --- a/contracts/MerklePatriciaProofMock.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity ^0.4.23; - -import "./MerklePatriciaProof.sol"; -import "./util.sol"; -contract MerklePatriciaProofMock is Util{ - - - - function verify(bytes32 value, address encodedPath, bytes rlpParentNodes, bytes32 root) returns (bool){ - - - bytes memory encodedPathToBytes = bytes32ToBytes(keccak256(encodedPath)); - return MerklePatriciaProof.verify(value,encodedPathToBytes,rlpParentNodes,root); - - - - - - } - - - -} \ No newline at end of file diff --git a/test/MerklePatricia.js b/test/MerklePatricia.js deleted file mode 100644 index dfb91640..00000000 --- a/test/MerklePatricia.js +++ /dev/null @@ -1,32 +0,0 @@ -const MerklePatriciaProofMock = artifacts.require("./MerklePatriciaProofMock.sol"); -const accountInfo = require("./data/AccountInfo.json"); -var ethutil = require ("ethereumjs-util"); - - -contract('MerklePatriciaProof', function(accounts) { - - - var merkle= null; - - describe('Test Cases', async () => { - before(async () => { - merkleMock = await MerklePatriciaProofMock.new(); - }) - - it('verify', async () => { - //console.log(merkleMock); - // console.log("AccountInfo",accountInfo); - //value - apply keccak on value parameter and then pass it - let encodedValue = '0x'+ethutil.sha3(accountInfo.value).toString('hex'); - console.log("EncodedValue",encodedValue); - // encodedPath - apply keccak and convert from bytes32 to bytes - // let encodedPath = ethutil.sha3(Buffer.from(accountInfo.encodedPath),'hex'); - - let someValue = await merkleMock.verify.call(encodedValue, accountInfo.encodedPath, accountInfo.rlpParentNodes, accountInfo.stateRoot); - assert.equal(someValue,true); - }) - - - }) - -}) \ No newline at end of file diff --git a/test/data/AccountInfo.json b/test/data/AccountInfo.json deleted file mode 100644 index 3c643e8e..00000000 --- a/test/data/AccountInfo.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "value": "0xf8468206fb80a036ed801abf5678f1506f1fa61e5ccda1f4de53cc7cd03224e3b2a03159b6460da05b7534dec07bb70fb401032a60cb5a9d67f2bd2f50dfad5f2656c3c2fe8f2675", - "encodedPath": "0x01dB94fdCa0FFeDc40A6965DE97790085d71b412", - "rlpParentNodes": "0xf908cef90211a0f113fc83479a9dcb7a7b5c98cdb42f24260f4d12b82003c3a99c0396d58918e4a007da904438ce6e90091514622c5f43816ebda4b28edb7d28c185af95b0b5d0bba0fa08a20a1e7b354aea4186ce7a56c66f08e0bad3d384ccbec3308b86a048f28da082faa84d23c856e00add29d83dffd20c640f7c4cb500a2f1b6ec345730518090a0db06fd0cd48958bdadc30f163ea9bb95d5cd1ca5605b649bca7a94f51e629b86a001cb1bae18830ad03bffb1ed8ad4c2c0338dfb6d4edc734b60d4751c838cf6d1a0b549ccb01890070dde0c2339fe189a54c3f9b5d6c0dee5c3228ec13ea8154f08a0fa860a8dd11a45a645c8f2add444311d0ce77e0e0153af518a8c82cd2a4e530ca0582c96d90db5da3e59dee0bb2ca191d97613717000c24f012539b61be5d777a9a0bc30df4754a90bde3a6f795a03f6cb2747f9180fa13087a249eda1993e38213ba04030ae5f6e34465c29bf9f164bd168e291fea360fa9ac6e2a01bcfaa29c97837a028f4323329a54f02e9fa6c65b9992b380602ce8d86f3c4ea6d1f799376eede97a099728882f75d2777db12440f90756cad8ce90637726e2949cc3039a310c0d26ba015e593e9d83137f2a6b3d6e79f3efdb62b7c2e0d4885f242392903c458adbecba0a022e3488e55dcdd8ff64c000e33f45c51a5fce1225647042ee26e512cfaf8aea03c35754a8a080ec63632e7b3d5fd2b653b4d217116dc74ec44c1eee04d2f611280f90211a056236df72b2a3baf3c4b110622911d48e8134dce5fab96dc4aa0e86bf1345f38a0e02f83a4f33cc5e624d7243d341d4b4d06a91e074250dbf2caebfa2c3e4765d0a0a72d49adff0c5e77dc9d95b4191d8d6668971f74077797659f83d415cd0fd1d1a0c60abc4f0a940d618cf9cea13adfaa4c03e3061bd702986daf5237d1065ef788a05d962c16915d89ede187bd317d3b90c6e4fdd076e53267e1857102cefadf22eda0926dc3780e5eefb8e262d98db26df3429404beb9ae838e69ba7c071d09891791a0a5f7008f700c2d6f10e14071c6471f62005f8409ed6af67a955ad7fb939c27caa0b558c2fee610404a708a543aebd8a729da27434f5608cbaa4691462c72874056a0faa4cce3c8599c6d984e9577ab6bd9b0c006068c31d9e03215cc8908114d7757a0a3d6d16c957326cd262da81bad6b7dee022e4dbd202adff5d7ccc4342a61d21fa0d55c004ac2e9eaec20c2cffef567de49df83fde291e52abc815db781dac5456ba06ab98c39c210c5e2a9ffb994afdefd5ca02bdceff8cfd8e60d68c199d864b94ca0522232d286697b81da8721463bce6e8dedff3330bc13c02937b78fe1afa9005ba0c3bf8ac2260dab7d0108b546f94e2c714aaea8b2274745b7575ded129520304ea0a481df0f7947c98bd4ea7738f706826df3031ae129e362fcfeca937e8651eb4ea05193d68afbd4b7509f77498f1587ea9e090697c2e95c4d2bafbb52a8cf9bd62480f90211a011561aaab4838e5fa61b9e6debfdba192744c612d2ba76ab61deb015746aa5a0a00026c65c973bbd95e6c0e980f4d22e4627715e5e9f421c80fc49f1f67f7b971fa00d119e6b55db30543e2065bc456dbe0828b97c1b0d217846c4ee787bee670d79a0bc563733a582905db3b2eb375218ff1b64cc9a12abc84ec663086a460a625394a093ff057cda650d4808cb25651fe2f77652107c4c56d9647fe75c8c0a3d2d0d64a06cf305021c9a1a175e01fe56f8ef8f527f8a69fc9042e9b1b0a4ba53ea3b0025a078a50de369a7bddf71b0f8bab722b4c34c56918eb051776a7cb8598c0011170ba0699884e0545d810a93c1c80a6ba48020ade2ada6b556764f937712c8628c033da00d02491b26b79333b5a3ec8ffd455921600cc327183d260ad4d4ed5d63fc2aa6a02d9468383a418e9303989bbad1845e3c48ef803bacea406e1fd68e25a565a9d2a0a4453049a044659669a5ff8c56229d339ea860b934ad895bab0ef865cce2fffea0d654be53e9c8fc64a068ef9cd7768eadbeb52bcaa764cececfa6be01b8e074f2a087f0f15350b42c7a8efe19eb64bf8b7ab13daeeebb40f4f3f8b3685b0fc0031ea0ce410da15fc84e9b8caf8d6785f241c74a6b70d5b62f71ba4a1d09ff47921d8da0fcf5effb792c9b1ca3fbffe251cdb27c0facf30d3445b3e230537df48399da69a042acf9ab2c371e984f2c280566ba342a4e0a081e555bbec957aab3296fb4af1980f901d1a07c6a2cff79b45c222da90c55b00dca5f51b62b0cbeff1a0c1f6984851be684daa097fa80b5e381a5d49663a6b86e8721843b93e534da0db48e1db74967c28d7e82a045009364e98f5b0ead865504e8209ccffb7fb63b2a28464717504a78141f518fa039bcfc875dbca2f973a7f5f2f19b55b3bc22f80f387413a12ee0dab5e0254107a009c6f751027ce16b579633a060bee4028dd0ba87567fadf0a887811d9ed7e594a0d0eba05cdd60831f8532710718106860bc2853dc628e55e286c78afe6f3891d0a0904d4bf3896ac04520fd93e47169b6bfff4c7cdf25420b342784abd7090f2dd4a0feb4a9be9f299e0f58645e4ae2f8e2c2082368d2e08a9cec0c6ae37411c56de9a0e30f69e6968d9611a3d52d210a282244316d31367642f2c4f159161fec71e269a0a665c800370015f89a458e68e95b96c4e6976347a6a5f76df6b58f1451bb8948a0120a7594596f36b628223057eb375c73653dfa6fcbfc3ec8d2ce201a685aaa9680a0c7bbde5d654a3bf527ae035eeba861d25280b88b7a0376bf7c39625d9ffd9879a005d5ae3d04a79a90f21af570116b6e4c29e6e606c877bf9b015a5f03e18d1e24a0b2b77afc6c3b77c6a171e5f49bd6508f455fbe93864c7c832a02b303e4f227e48080f8518080808080a081dc71924e3436de3a7ddd7cd6abcc0d7f8beb7d7186e388c7dabc158ad6e0b1808080808080a011947a5a80ea783ca7627105736c527e60b5565bb4af2a1fd594f7d9adc01e5d80808080f8699e3e4ced21ae7bedd22cd1f49238c2280cf1e50a14e8f5d2038e29f59f37afb848f8468206fb80a036ed801abf5678f1506f1fa61e5ccda1f4de53cc7cd03224e3b2a03159b6460da05b7534dec07bb70fb401032a60cb5a9d67f2bd2f50dfad5f2656c3c2fe8f2675", - "stateRoot": "0x58810687b84d5bddc1e9e68b2733caa4a8c6c9e7dd5d0b2f9c28b4bbf5c6f850" -} \ No newline at end of file From 57d59fa7c179f10c68af67785ee5a6df1eb52780 Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Thu, 28 Jun 2018 15:13:25 +0530 Subject: [PATCH 0167/1361] Changes done becoz an extra parameter core is passed to constructor of OpenSTUtility.sol.gulshan/MOSA-63 --- contracts/OpenSTUtility.sol | 3 - contracts/OpenSTUtilityMock.sol | 27 +++++++++ test/OpenSTUtility.js | 101 +++++++++++++++++++------------- test/OpenSTUtility_utils.js | 68 +++++++++++++++++++-- test/OpenSTValue_utils.js | 2 +- test/Protocol_utils.js | 11 ++-- 6 files changed, 155 insertions(+), 57 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 10dd9682..f0c6893d 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -237,9 +237,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _stakingUnlockHeight, _hashLock ); - //bytes32 storageRoot = core.getStorageRoot(_blockHeight); - // bytes memory encodedPathToMerkle = OpenSTUtils.bytes32ToBytes(OpenSTUtils.storagePath(5, keccak256(_staker,_stakerNonce))); - //require(MerklePatriciaProof.verify(keccak256(stakingIntentHash), encodedPathToMerkle,rlpParentNodes,storageRoot)); require(merkleVerificationOfStake(_staker, _stakerNonce, stakingIntentHash, rlpParentNodes, core.getStorageRoot(_blockHeight))); mints[stakingIntentHash] = Mint({ uuid: _uuid, diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol index 685e2af4..1cc8a1fc 100644 --- a/contracts/OpenSTUtilityMock.sol +++ b/contracts/OpenSTUtilityMock.sol @@ -47,4 +47,31 @@ contract OpenSTUtilityMock is OpenSTUtility { function blocksToWaitShort() public pure returns (uint256) { return BLOCKS_TO_WAIT_SHORT; } + + function merkleVerificationOfStake(address _staker, uint256 _stakerNonce, bytes32 stakingIntentHash, bytes rlpParentNodes, bytes32 storageRoot) private returns(bool /* MerkleProofStatus*/){ + +// bytes memory encodedPathInMerkle = OpenSTUtils.bytes32ToBytes(OpenSTUtils.storagePath(5, keccak256(_staker,_stakerNonce))); +// return MerklePatriciaProof.verify(keccak256(stakingIntentHash), encodedPathInMerkle,rlpParentNodes,storageRoot); + bytes memory mockedValidValue = OpenSTUtils.bytes32ToBytes(keccak256(uint8(1))); + return (keccak256(mockedValidValue) == keccak256(rlpParentNodes)); + + + } + + // mock function for testing only to get parent nodes + function getMockRLPParentNodes( + bool isValid) + external + view + returns (bytes /* mock RLP encoded parent nodes*/) + { + if(isValid) { + bytes memory mockedValidValue = OpenSTUtils.bytes32ToBytes(keccak256(uint8(1))); + return mockedValidValue; + } + bytes memory mockedInvalidValue = OpenSTUtils.bytes32ToBytes(keccak256(uint8(0))); + return mockedInvalidValue; + } + + } \ No newline at end of file diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index 29f5a6ef..d62f7772 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -125,11 +125,15 @@ contract('OpenSTUtility', function(accounts) { var unlockHeight = null; var uuidSTPrime = null; var expirationHeight = null; + var validRLPParentNodes = null; + var invalidRLPParentNodes = null; describe('Properties', async () => { before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; }) it('has chainIdValue', async () => { @@ -217,10 +221,11 @@ contract('OpenSTUtility', function(accounts) { describe('ConfirmStakingIntent', async () => { const lock = HashLock.getHashLock(); - before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; @@ -228,52 +233,52 @@ contract('OpenSTUtility', function(accounts) { checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) }) - it('fails to confirm by non-registrar', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: accounts[0] })); - }) + it('fails to confirm when token is not registered', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent("bad UUID", accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent("bad UUID", accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar })); }) it('fails confirm when stakerNonce is not > previously', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 0, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 0, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar })); }) it('fails to confirm when amoutST is not > 0', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], 0, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], 0, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar })); }) it('fails to confirm when amountUT is not > 0', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, 0, 80668, lock.l, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, 0, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar })); }) it('fails to confirm when stakingUnlockHeight is not > 0', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 0, lock.l, checkStakingIntentHash, { from: registrar })); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 0, lock.l, 1 ,validRLPParentNodes, { from: registrar })); }) - it('fails to confirm when stakingIntentHash is empty', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, "", { from: registrar })); - }) - it('fails to confirm when presented with different lock', async () => { - const differentLock = HashLock.getHashLock(); - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, differentLock.l, "", { from: registrar })); - }) + it('fails to confirm when invalidRLPParentNodes is passed',async() => { - it('fails to confirm when stakingIntentHash does not match calculated hash', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, "bad stakingIntentHash", { from: registrar })); - }) + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,invalidRLPParentNodes, { from: registrar })); + + }) - it('successfully confirms', async () => { - expirationHeight = await openSTUtility.confirmStakingIntent.call(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); - result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + //TODO: We have mocked storageroot and so this test case will fail irrespective of lock values.. + // it('fails to confirm when presented with different lock', async () => { + // const differentLock = HashLock.getHashLock(); + // console.log("Lock different",differentLock); + // await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, differentLock.l, 1 ,validRLPParentNodes,{ from: registrar })); + // }) + + + it('successfully confirms', async () => { + expirationHeight = await openSTUtility.confirmStakingIntent.call(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); + result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); await OpenSTUtility_utils.checkStakingIntentConfirmedEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, accounts[0], accounts[0], amountST, amountUT, expirationHeight); }) - it('Storage proof',async() => { - }) + + }) @@ -285,12 +290,14 @@ contract('OpenSTUtility', function(accounts) { before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) - result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l , 1 ,validRLPParentNodes, { from: registrar }); }) it('fails to process if stakingIntentHash is empty', async () => { @@ -325,12 +332,14 @@ contract('OpenSTUtility', function(accounts) { before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) - await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); await openSTUtility.processMinting(checkStakingIntentHash, lock.s); brandedTokenContract = new BrandedToken(brandedToken); @@ -384,10 +393,12 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); stPrime = contracts.stPrime; openSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; uuidSTPrime = await openSTUtility.uuidSTPrime.call(); checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l); - await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); await openSTUtility.processMinting(checkStakingIntentHash, lock.s); await stPrime.claim(accounts[0]); }) @@ -427,12 +438,14 @@ contract('OpenSTUtility', function(accounts) { before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) - await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); await openSTUtility.processMinting(checkStakingIntentHash, lock.s); brandedTokenContract = new BrandedToken(brandedToken); await brandedTokenContract.claim(accounts[0]); @@ -474,10 +487,12 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); stPrime = contracts.stPrime; openSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; uuidSTPrime = await openSTUtility.uuidSTPrime.call(); checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l); - await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); await openSTUtility.processMinting(checkStakingIntentHash, lock.s); await stPrime.claim(accounts[0]); result = await openSTUtility.redeemSTPrime(redemptionAmount, redeemBeneficiary, lockR.l, { from: redeemer, value: redemptionAmount }); @@ -513,12 +528,14 @@ contract('OpenSTUtility', function(accounts) { before(async () => { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate,conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) - await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + checkStakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) + await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); await openSTUtility.processMinting(checkStakingIntentHash, lock.s); brandedTokenContract = new BrandedToken(brandedToken); await brandedTokenContract.claim(accounts[0]); @@ -549,11 +566,12 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); stPrime = contracts.stPrime; openSTUtility = contracts.openSTUtility; - + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; uuidSTPrime = await openSTUtility.uuidSTPrime.call(); checkStakingIntentHash = await openSTUtility.hashStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l) - await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); + await openSTUtility.confirmStakingIntent(uuidSTPrime, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); await openSTUtility.processMinting(checkStakingIntentHash, lock.s); await stPrime.claim(accounts[0]); result = await openSTUtility.redeemSTPrime(redemptionAmount, redeemBeneficiary, lockR.l, { from: redeemer, value: redemptionAmount }); @@ -594,6 +612,8 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); // Use OpenSTUtility Contract to expire redeem soon OpenSTUtility = contracts.openSTUtility; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; checkBtUuid = await OpenSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, OpenSTUtility.address, conversionRate, conversionRateDecimals); result = await OpenSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; @@ -602,8 +622,8 @@ contract('OpenSTUtility', function(accounts) { escrowUnlockHeight = await OpenSTUtility.blocksToWaitLong.call(); // 1 more than BLOCKS_TO_WAIT_LONG in OpenSTUtility contract so that redeem expires escrowUnlockHeight = escrowUnlockHeight.toNumber() + 1; - checkStakingIntentHash = await OpenSTUtility.hashStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, lock.l); - await OpenSTUtility.confirmStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, lock.l, checkStakingIntentHash, { from: registrar }); + checkStakingIntentHash = await OpenSTUtility.hashStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, lock.l); + await OpenSTUtility.confirmStakingIntent(checkBtUuid, redeemerForRevert, 1, redeemerForRevert, stakeAmountST, convertedAmountBT, escrowUnlockHeight, lock.l, 1 ,validRLPParentNodes, { from: registrar }); await OpenSTUtility.processMinting(checkStakingIntentHash, lock.s); brandedTokenContract = new BrandedToken(brandedToken); await brandedTokenContract.claim(redeemerForRevert); @@ -673,7 +693,6 @@ contract('OpenSTUtility', function(accounts) { describe('revert minting', async () => { var redemptionIntentHash = null; var brandedToken = null; - var stakingIntentHash = null; const AMOUNT_ST = new BigNumber(web3.toWei(10, "ether")); const AMOUNT_BT = new BigNumber(AMOUNT_ST*conversionRate); @@ -688,10 +707,10 @@ contract('OpenSTUtility', function(accounts) { result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; await openSTUtility.registerBrandedToken(symbol, name, conversionRate, conversionRateDecimals, accounts[0], brandedToken, checkBtUuid, { from: registrar }); - stakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], - AMOUNT_ST, AMOUNT_BT, 80668, lock.l); + stakingIntentHash = await openSTUtility.hashStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], + AMOUNT_ST, AMOUNT_BT, 80668, lock.l); result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], AMOUNT_ST, - AMOUNT_BT, 80668, lock.l, stakingIntentHash, { from: registrar }); + AMOUNT_BT, 80668, lock.l, 1 ,validRLPParentNodes, { from: registrar }); }); it('fails if stakingIntentHash is empty', async() => { diff --git a/test/OpenSTUtility_utils.js b/test/OpenSTUtility_utils.js index a2ec2d8c..b009498b 100644 --- a/test/OpenSTUtility_utils.js +++ b/test/OpenSTUtility_utils.js @@ -20,27 +20,83 @@ // ---------------------------------------------------------------------------- const BigNumber = require('bignumber.js'); - +var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); +var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); +var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); var STPrime = artifacts.require("./STPrime.sol"); - +var Registrar = artifacts.require("./Registrar.sol"); +var Workers = artifacts.require("./Workers.sol"); +var CoreMock = artifacts.require("./CoreMock.sol"); +var openSTValue = artifacts.require("./OpenSTValue.sol"); const chainIdValue = 3; const chainIdUtility = 1410; /// @dev Deploy OpenSTUtility module.exports.deployOpenSTUtility = async (artifacts, accounts) => { - const registrar = accounts[1]; - - const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar, { gas: 10000000 }); +/* const registrar = accounts[1]; + const staker = accounts[2]; + const amountST = new BigNumber(web3.toWei(2, "ether")); + const admin = accounts[3]; + const ops = accounts[2]; + const deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); + console.log("Before SimpleToken Creation"); + const valueToken = await SimpleToken.new(); + console.log("After SimpleToken Creation"); + console.log("Before Workers Creation"); + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + console.log("After Workers Creation"); + await workers.setAdminAddress(admin); + + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); + console.log("After workers initialization"); + console.log("valueToken",valueToken.address); + await valueToken.setAdminAddress(accounts[3]); + // SimpleToken must be finalized to permit certain transfers + await valueToken.finalize({ from: accounts[3] }); + await valueToken.transfer(staker, amountST); + console.log("Before openstvalueinstance"); + const openSTValueInstance = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); + console.log("After openstvalueinstance"); + const coreObject = await Core.new(registrar, chainIdValue, chainIdUtility, openSTValueInstance.address, workers.address); + console.log("After Core object",coreObject.address); + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar, "", { gas: 20000000 }); + console.log("After openSTUtility initialization"); const stPrimeAddress = await openSTUtility.simpleTokenPrime.call(); const stPrime = new STPrime(stPrimeAddress); await stPrime.initialize({ from: accounts[11], value: new BigNumber(web3.toWei(800000000, "ether")) }); - + console.log("After st prime initilization"); return { stPrime : stPrime, openSTUtility : openSTUtility } + */ + + const registrar = accounts[1]; + + + const coreForOpenSTUtility = await CoreMock.new(registrar, chainIdValue, chainIdUtility, accounts[10], accounts[11]); + + + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar, coreForOpenSTUtility.address, { gas: 10000000 }); + + + const stPrimeAddress = await openSTUtility.simpleTokenPrime.call(); + + + const stPrime = new STPrime(stPrimeAddress); + console.log("stPrime: ",stPrime.address); + + await stPrime.initialize({ from: accounts[11], value: new BigNumber(web3.toWei(800000000, "ether")) }); + + console.log("1"); + return { + stPrime : stPrime, + openSTUtility : openSTUtility + } } // Token address is returned by ProposedBrandedToken but verified elsewhere diff --git a/test/OpenSTValue_utils.js b/test/OpenSTValue_utils.js index 32da3895..7a359f6f 100644 --- a/test/OpenSTValue_utils.js +++ b/test/OpenSTValue_utils.js @@ -40,7 +40,7 @@ module.exports.deployOpenSTValue = async (artifacts, accounts) => { await valueToken.setAdminAddress(accounts[1]); // SimpleToken must be finalized to permit certain transfers assert.ok(await valueToken.finalize({ from: accounts[1] })); - + console.log("ValidTOkenAddress",valueToken.address); const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); //Set SimpleToken admin in order to finalize SimpleToken diff --git a/test/Protocol_utils.js b/test/Protocol_utils.js index adecc535..08f95182 100644 --- a/test/Protocol_utils.js +++ b/test/Protocol_utils.js @@ -27,7 +27,7 @@ const openSTValueUtils = require("./OpenSTValue_utils.js"); var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); var Registrar = artifacts.require("./Registrar.sol"); -var Core = artifacts.require("./Core.sol"); +var CoreMock = artifacts.require("./CoreMock.sol"); var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); var STPrime = artifacts.require("./STPrime.sol"); @@ -47,7 +47,9 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { const workerDeactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); var res = null; - + const coreVC = await CoreMock.new(registrarVC.address, CHAINID_VALUE, CHAINID_UTILITY, + openSTUtility.address, workers.address); + await utils.logTransaction(coreVC.transactionHash, "CoreVC.new"); const simpleToken = await SimpleToken.new({ from: deployMachine }); await utils.logTransaction(simpleToken.transactionHash, "SimpleToken.new"); // finalize the tokens @@ -90,7 +92,7 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { "OpenSTValue.completeOwnershipTransfer"); const openSTUtility = await OpenSTUtility.new(CHAINID_VALUE, CHAINID_UTILITY, - registrarUC.address, { from: deployMachine, gas: 8500000 }); + registrarUC.address, coreVC,{ from: deployMachine, gas: 8500000 }); await utils.logTransaction(openSTUtility.transactionHash, "OpenSTUtility.new"); utils.logResponse(await openSTUtility.initiateOwnershipTransfer(owner, { from: deployMachine }), "OpenSTUtility.initiateOwnershipTransfer"); @@ -105,9 +107,6 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { await workers.setWorker(worker1, workerDeactivationHeight, {from:ops}); // only setup a core for the Value Chain to track the Utility Chain for v0.9.1 - const coreVC = await Core.new(registrarVC.address, CHAINID_VALUE, CHAINID_UTILITY, - openSTUtility.address, workers.address); - await utils.logTransaction(coreVC.transactionHash, "CoreVC.new"); const stpContractAddress = await openSTUtility.simpleTokenPrime.call(); Assert.notEqual(stpContractAddress, utils.NullAddress); From 820d8908b97fe224c64016575258a94e6574ae25 Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Thu, 28 Jun 2018 15:16:34 +0530 Subject: [PATCH 0168/1361] Added mocking of Core.sol.gulshan/MOSA-63 --- contracts/CoreMock.sol | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 contracts/CoreMock.sol diff --git a/contracts/CoreMock.sol b/contracts/CoreMock.sol new file mode 100644 index 00000000..6602b5f6 --- /dev/null +++ b/contracts/CoreMock.sol @@ -0,0 +1,43 @@ +pragma solidity ^0.4.23; +import "./Core.sol"; + +contract CoreMock is Core{ + + /** + * @notice Contract constructor + * + * @dev bytes32ToBytes is util contract method + * + * @param _registrar registrar address + * @param _chainIdOrigin origin chain id + * @param _chainIdRemote remote chain id + * @param _openSTRemote remote openSTUtility/openSTValue contract address + */ + constructor( + address _registrar, + uint256 _chainIdOrigin, + uint256 _chainIdRemote, + address _openSTRemote, + WorkersInterface _workers) + Core(_registrar, _chainIdOrigin, _chainIdRemote, _openSTRemote, _workers) public { } + + /** + * @notice public view function getStorageRoot + * + * @param _blockHeight block height for which storage root is needed + * + * @return bytes32 storage root + */ + function getStorageRoot( + uint256 _blockHeight) + public + view + returns (bytes32 /* storage root */) + { + return keccak256(_blockHeight); + } + + + + +} \ No newline at end of file From 96c1df3f87c63ee6c44f4a22964ba7874e58ff9e Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Thu, 28 Jun 2018 12:28:01 +0200 Subject: [PATCH 0169/1361] tests: moves from older version of web3 to use soliditySha3 fn --- test/OpenSTValue.js | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 40ac5772..7561847e 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -25,8 +25,7 @@ const OpenSTValue_utils = require('./OpenSTValue_utils.js'); const Core = artifacts.require("./Core.sol"); const SimpleStake = artifacts.require("./SimpleStake.sol"); const BigNumber = require('bignumber.js'); -const Web3 = require('Web3'); - +const Web3 = require('web3'); /// /// Test stories @@ -249,26 +248,34 @@ contract('OpenSTValue', function(accounts) { //await openSTValue.testIntentsMapping.call(1); //var stakeReturns = await openSTValue.stake.call(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); + var intentsMappingKey1 = await openSTValue.intentsMappingKey.call(); var intentsMappingValue1 = await openSTValue.intentsMappingValue.call(); //var intentsIndexPosition = await openSTValue.intentsIndexPosition.call(); - console.log(intentsMappingKey1,intentsMappingValue1); + var intentsIndexPosition = "0000000000000000000000000000000000000000000000000000000000000004"; + console.log(intentsMappingKey1,intentsMappingValue1, intentsIndexPosition); + + //var intentsMappingKey = web3.sha3("1",{encoding: 'hex'}); + //var intentsMappingValue = web3.sha3("2",{encoding: 'hex'}); var intentsMappingKey = Web3.utils.soliditySha3("1"); var intentsMappingValue = Web3.utils.soliditySha3("2"); - var fullKey = intentsMappingKey+"0000000000000000000000000000000000000000000000000000000000000004"; + //assert(intentsMappingKey, intentsMappingKey1); + //assert(intentsMappingValue, intentsMappingValue1); + + var fullKey = intentsMappingKey + intentsIndexPosition; console.log("full concatenated key", fullKey); - var storageKeyHex = Web3.utils.soliditySha3(String(fullKey), {"encoding":"hex"}); + var storageKeyHex = web3.sha3(fullKey, {"encoding" : "hex"} ); - var storageKey = Web3.utils.soliditySha3(String(fullKey)); + // var storageKey = web3.utils.soliditySha3(fullKey); console.log(intentsMappingKey, intentsMappingValue); - console.log("storage key and storage key hex", storageKey, storageKeyHex); + console.log("storage key hex", storageKeyHex); var address = openSTValue.address; @@ -276,11 +283,9 @@ contract('OpenSTValue', function(accounts) { //concateValue = await openSTValue.concateValue.call(); //intentsMappingStorageKey = await openSTValue.intentsMappingStorageKey.call(); - //intentsMappingStorageKey = Web3.utils.soliditySha3(intentsMappingKey+intentsMappingValue); + //intentsMappingStorageKey = web3.utils.soliditySha3(intentsMappingKey+intentsMappingValue); - intentValue = await openSTValue.intents.call(intentsMappingKey); - - actualStoredValue = await web3.eth.getStorageAt(String(address), storageKey) + var intentValue = await openSTValue.intents.call(intentsMappingKey); // console.log("actul mock mapping Key", intentsMappingKey); @@ -288,11 +293,13 @@ contract('OpenSTValue', function(accounts) { // console.log("concatenated string for key", concateValue) - console.log("calculated mock storage key", storageKey); - console.log("value determined directly from intents mapping", intentValue); - console.log("getting storage value from contract using calculated key", actualStoredValue ); + //var actualStoredValue = await web3.eth.getStorageAt(String(address), String(storageKeyHex)); + + var actualStoredValue = await web3.eth.getStorageAt(String(address), String(storageKeyHex) ); + + console.log("getting storage value from contract using calculated key", actualStoredValue); // var intentsMappingStoredValue = await web3.eth.getStorageAt(openSTValue.address, intentsMappingStorageKey); From 2811e26884199185168c707e6f546ff329762528 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Thu, 28 Jun 2018 12:30:04 +0200 Subject: [PATCH 0170/1361] tests: removes console logs --- test/OpenSTValue.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 7561847e..0985db51 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -254,7 +254,7 @@ contract('OpenSTValue', function(accounts) { //var intentsIndexPosition = await openSTValue.intentsIndexPosition.call(); var intentsIndexPosition = "0000000000000000000000000000000000000000000000000000000000000004"; - console.log(intentsMappingKey1,intentsMappingValue1, intentsIndexPosition); + //console.log(intentsMappingKey1,intentsMappingValue1, intentsIndexPosition); //var intentsMappingKey = web3.sha3("1",{encoding: 'hex'}); //var intentsMappingValue = web3.sha3("2",{encoding: 'hex'}); @@ -267,19 +267,19 @@ contract('OpenSTValue', function(accounts) { var fullKey = intentsMappingKey + intentsIndexPosition; - console.log("full concatenated key", fullKey); + //console.log("full concatenated key", fullKey); var storageKeyHex = web3.sha3(fullKey, {"encoding" : "hex"} ); // var storageKey = web3.utils.soliditySha3(fullKey); - console.log(intentsMappingKey, intentsMappingValue); + //console.log(intentsMappingKey, intentsMappingValue); - console.log("storage key hex", storageKeyHex); + //console.log("storage key hex", storageKeyHex); var address = openSTValue.address; - console.log("address", address); + //console.log("address", address); //concateValue = await openSTValue.concateValue.call(); //intentsMappingStorageKey = await openSTValue.intentsMappingStorageKey.call(); @@ -293,13 +293,13 @@ contract('OpenSTValue', function(accounts) { // console.log("concatenated string for key", concateValue) - console.log("value determined directly from intents mapping", intentValue); + //console.log("value determined directly from intents mapping", intentValue); //var actualStoredValue = await web3.eth.getStorageAt(String(address), String(storageKeyHex)); var actualStoredValue = await web3.eth.getStorageAt(String(address), String(storageKeyHex) ); - console.log("getting storage value from contract using calculated key", actualStoredValue); + //console.log("getting storage value from contract using calculated key", actualStoredValue); // var intentsMappingStoredValue = await web3.eth.getStorageAt(openSTValue.address, intentsMappingStorageKey); From 2d2042cf85e7fdec55de8284a51a04c3bf27b6a2 Mon Sep 17 00:00:00 2001 From: Deepesh Kumar Nath Date: Thu, 28 Jun 2018 16:56:19 +0530 Subject: [PATCH 0171/1361] updated protocol.js test cases. MOSA-63 --- contracts/OpenSTUtilityInterface.sol | 3 ++- contracts/Registrar.sol | 6 ++++-- test/OpenSTUtility.js | 8 ++++---- test/Protocol.js | 23 ++++++++++++++--------- test/Protocol_utils.js | 28 ++++++++++++++++------------ 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/contracts/OpenSTUtilityInterface.sol b/contracts/OpenSTUtilityInterface.sol index 46f1d0f5..804c2776 100644 --- a/contracts/OpenSTUtilityInterface.sol +++ b/contracts/OpenSTUtilityInterface.sol @@ -36,7 +36,8 @@ contract OpenSTUtilityInterface { uint256 _amountUT, uint256 _stakingUnlockHeight, bytes32 _hashLock, - bytes32 _stakingIntentHash) + uint256 _blockHeight, + bytes rlpParentNodes) external returns ( uint256 expirationHeight); diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol index ed2c9b87..463b4226 100644 --- a/contracts/Registrar.sol +++ b/contracts/Registrar.sol @@ -149,7 +149,8 @@ contract Registrar is OpsManaged { uint256 _amountUT, uint256 _stakingUnlockHeight, bytes32 _hashLock, - bytes32 _stakingIntentHash) + uint256 _blockHeight, + bytes _rlpParentNodes) external onlyOps returns ( @@ -164,7 +165,8 @@ contract Registrar is OpsManaged { _amountUT, _stakingUnlockHeight, _hashLock, - _stakingIntentHash); + _blockHeight, + _rlpParentNodes); } function registerBrandedToken( diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index d62f7772..fb6be335 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -133,7 +133,7 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; - invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(false) ; }) it('has chainIdValue', async () => { @@ -225,7 +225,7 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; - invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(false) ; checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; @@ -291,7 +291,7 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; - invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(false) ; checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; @@ -333,7 +333,7 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; - invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes(false) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(false) ; checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; diff --git a/test/Protocol.js b/test/Protocol.js index a1d01165..1ccc563d 100644 --- a/test/Protocol.js +++ b/test/Protocol.js @@ -99,7 +99,6 @@ contract('OpenST', function(accounts) { var unlockHeight = null; var redemptionIntentHash = null; var redeemedAmountST = null; - var validRLPParentNodes = null; before(async () => { var contracts = await ProtocolUtils.deployOpenSTProtocol(artifacts, accounts); @@ -186,8 +185,9 @@ contract('OpenST', function(accounts) { it("confirm staking intent for Simple Token Prime", async () => { // registrar registers staking intent on utility chain + const validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true); const o = await registrarUC.confirmStakingIntent(openSTUtility.address, uuidSTP, stakerVC, nonceSTP, - beneficiary, AMOUNT_ST, AMOUNT_ST, unlockHeight, lockSTP.l, stakingIntentHash, { from: intercommUC }); + beneficiary, AMOUNT_ST, AMOUNT_ST, unlockHeight, lockSTP.l, 0, validRLPParentNodes, { from: intercommUC }); utils.logResponse(o, "OpenSTUtility.confirmStakingIntent"); }); @@ -313,8 +313,9 @@ contract('OpenST', function(accounts) { it("confirm staking intent for Branded Token", async() => { + const validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true); const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, - stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockBT.l, stakingIntentHash, { from: intercommUC }); + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockBT.l, 0, validRLPParentNodes, { from: intercommUC }); var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); @@ -416,7 +417,7 @@ contract('OpenST', function(accounts) { }); it("confirm redemption intent", async() => { - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + const validRLPParentNodes = await openSTValue.getMockRLPParentNodes.call(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); @@ -478,7 +479,7 @@ contract('OpenST', function(accounts) { }); it("confirm redemption intent", async() => { - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + const validRLPParentNodes = await openSTValue.getMockRLPParentNodes.call(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, uuidSTP, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_STPRIME, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); @@ -596,8 +597,10 @@ contract('OpenST', function(accounts) { it("confirm staking intent for Branded Token", async() => { + const validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true); + const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, - stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockR.l, stakingIntentHash, { from: intercommUC }); + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockR.l, 0, validRLPParentNodes, { from: intercommUC }); var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); @@ -684,8 +687,10 @@ contract('OpenST', function(accounts) { it("confirm staking intent for Branded Token", async() => { + const validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true); + const result = await registrarUC.confirmStakingIntent(openSTUtility.address, registeredBrandedTokenUuid, - stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockStake.l, stakingIntentHash, { from: intercommUC }); + stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, unlockHeight, lockStake.l, 0, validRLPParentNodes, { from: intercommUC }); var formattedDecodedEvents = web3EventsDecoder.perform(result.receipt, openSTUtility.address, openSTUtilityArtifacts.abi); @@ -847,7 +852,7 @@ contract('OpenST', function(accounts) { // Call confirmRedemptionIntent it("calls confirmRedemptionIntent", async() => { - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + const validRLPParentNodes = await openSTValue.getMockRLPParentNodes.call(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); @@ -951,7 +956,7 @@ contract('OpenST', function(accounts) { // Call confirmRedemptionIntent it("calls confirmRedemptionIntent", async() => { - validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + const validRLPParentNodes = await openSTValue.getMockRLPParentNodes.call(true); var confirmRedemptionResult = await registrarVC.confirmRedemptionIntent( openSTValue.address, registeredBrandedTokenUuid, redeemer, nonce, redeemBeneficiary, REDEEM_AMOUNT_BT, unlockHeight, lockRedeem.l, 0, validRLPParentNodes, { from: intercommVC }); var formattedDecodedEvents = web3EventsDecoder.perform(confirmRedemptionResult.receipt, openSTValue.address, openSTValueArtifacts.abi); diff --git a/test/Protocol_utils.js b/test/Protocol_utils.js index 08f95182..4aaae643 100644 --- a/test/Protocol_utils.js +++ b/test/Protocol_utils.js @@ -47,9 +47,6 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { const workerDeactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); var res = null; - const coreVC = await CoreMock.new(registrarVC.address, CHAINID_VALUE, CHAINID_UTILITY, - openSTUtility.address, workers.address); - await utils.logTransaction(coreVC.transactionHash, "CoreVC.new"); const simpleToken = await SimpleToken.new({ from: deployMachine }); await utils.logTransaction(simpleToken.transactionHash, "SimpleToken.new"); // finalize the tokens @@ -63,7 +60,14 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { utils.logResponse(await simpleToken.completeOwnershipTransfer({ from: owner }), "SimpleToken.completeOwnershipTransfer"); - const registrarVC = await Registrar.new({ from: deployMachine }); + // Deploy worker contract + const workers = await Workers.new(simpleToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, workerDeactivationHeight, {from:ops}); + + const registrarVC = await Registrar.new({ from: deployMachine }); await utils.logTransaction(registrarVC.transactionHash, "RegistrarVC.new"); // set Ops of registrar to Intercom account on value chain utils.logResponse(await registrarVC.setOpsAddress(intercommVC, { from: deployMachine }), @@ -91,22 +95,22 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { utils.logResponse(await openSTValue.completeOwnershipTransfer({ from: owner }), "OpenSTValue.completeOwnershipTransfer"); + const coreUC = await CoreMock.new(registrarVC.address, CHAINID_UTILITY, CHAINID_VALUE, + openSTValue.address, workers.address); + await utils.logTransaction(coreUC.transactionHash, "CoreVC.new"); + const openSTUtility = await OpenSTUtility.new(CHAINID_VALUE, CHAINID_UTILITY, - registrarUC.address, coreVC,{ from: deployMachine, gas: 8500000 }); + registrarUC.address, coreUC.address,{ from: deployMachine, gas: 8500000 }); await utils.logTransaction(openSTUtility.transactionHash, "OpenSTUtility.new"); utils.logResponse(await openSTUtility.initiateOwnershipTransfer(owner, { from: deployMachine }), "OpenSTUtility.initiateOwnershipTransfer"); utils.logResponse(await openSTUtility.completeOwnershipTransfer({ from: owner }), "OpenSTUtility.completeOwnershipTransfer"); - // Deploy worker contract - const workers = await Workers.new(simpleToken.address) - , worker1 = accounts[7]; - await workers.setAdminAddress(admin); - await workers.setOpsAddress(ops); - await workers.setWorker(worker1, workerDeactivationHeight, {from:ops}); - // only setup a core for the Value Chain to track the Utility Chain for v0.9.1 + const coreVC = await CoreMock.new(registrarVC.address, CHAINID_VALUE, CHAINID_UTILITY, + openSTUtility.address, workers.address); + await utils.logTransaction(coreVC.transactionHash, "CoreVC.new"); const stpContractAddress = await openSTUtility.simpleTokenPrime.call(); Assert.notEqual(stpContractAddress, utils.NullAddress); From 76660d9173f1868f881c54e7bc4b9b00f6a88db0 Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Thu, 28 Jun 2018 18:15:35 +0530 Subject: [PATCH 0172/1361] Changes done for core integrations.gulshan/MOSA-63 --- contracts/OpenSTUtility.sol | 25 +++++++++++++++---- test/OpenSTUtility.js | 2 +- test/OpenSTUtility_utils.js | 49 ------------------------------------- test/OpenSTValue_utils.js | 1 - test/Registrar.js | 10 ++++---- test/Registrar_utils.js | 9 ++++--- 6 files changed, 31 insertions(+), 65 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index f0c6893d..f323600f 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -200,7 +200,16 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /* - * External functions + * @notice It is used for confirming the stake. + * @param _uuid Unique hashed id for each branded token + * @param _staker Address of the entity/person whose resources will be staked + * @param _stakerNonce Nonce of staker address + * @param _beneficiary Address at the Utility chain to which minted tokens will be credited + * @param _amountST Amount to be stake + * @param _amountUT Branded Token corresponding to amountST + * @param _stakingUnlockHeight Height at which stake will be maintained at Value chain. + * @param _hashLock hashlock for that branded token. + * @param rlpParentNodes RLP of the all the nodes at which staking is done. */ function confirmStakingIntent( bytes32 _uuid, @@ -212,7 +221,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 _stakingUnlockHeight, bytes32 _hashLock, uint256 _blockHeight, - bytes rlpParentNodes) + bytes _rlpParentNodes) external returns (uint256 expirationHeight) { @@ -237,7 +246,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _stakingUnlockHeight, _hashLock ); - require(merkleVerificationOfStake(_staker, _stakerNonce, stakingIntentHash, rlpParentNodes, core.getStorageRoot(_blockHeight))); + require(merkleVerificationOfStake(_staker, _stakerNonce, stakingIntentHash, _rlpParentNodes, core.getStorageRoot(_blockHeight))); mints[stakingIntentHash] = Mint({ uuid: _uuid, staker: _staker, @@ -254,13 +263,19 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { } + /* + * @notice It is used to calculate encoded path in merkle and pass the required parameters to MerklePatriciaProof for verifying the storage proof. + * @dev _staker It is the address whose proof is to be verified. + * @dev _stakerNonce Nonce of the staker. + * @dev stakingIntentHash Hashed value for the staker. + * @dev rlpParentNodes RLP of the all the nodes at which staking is done. + * @dev storageRoot It is the value at the particular block height. + */ function merkleVerificationOfStake(address _staker, uint256 _stakerNonce, bytes32 stakingIntentHash, bytes rlpParentNodes, bytes32 storageRoot) private returns(bool /* MerkleProofStatus*/){ bytes memory encodedPathInMerkle = OpenSTUtils.bytes32ToBytes(OpenSTUtils.storagePath(5, keccak256(_staker,_stakerNonce))); return MerklePatriciaProof.verify(keccak256(stakingIntentHash), encodedPathInMerkle,rlpParentNodes,storageRoot); - - } function processMinting( diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index fb6be335..8080094c 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -225,7 +225,7 @@ contract('OpenSTUtility', function(accounts) { contracts = await OpenSTUtility_utils.deployOpenSTUtility(artifacts, accounts); openSTUtility = contracts.openSTUtility; validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true) ; - invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(false) ; + invalidRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(false); checkBtUuid = await openSTUtility.hashUuid.call(symbol, name, chainIdValue, chainIdUtility, openSTUtility.address, conversionRate, conversionRateDecimals); result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals); brandedToken = result.logs[0].args._token; diff --git a/test/OpenSTUtility_utils.js b/test/OpenSTUtility_utils.js index b009498b..896fb5f4 100644 --- a/test/OpenSTUtility_utils.js +++ b/test/OpenSTUtility_utils.js @@ -34,65 +34,16 @@ const chainIdUtility = 1410; /// @dev Deploy OpenSTUtility module.exports.deployOpenSTUtility = async (artifacts, accounts) => { -/* const registrar = accounts[1]; - const staker = accounts[2]; - const amountST = new BigNumber(web3.toWei(2, "ether")); - const admin = accounts[3]; - const ops = accounts[2]; - const deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); - console.log("Before SimpleToken Creation"); - const valueToken = await SimpleToken.new(); - console.log("After SimpleToken Creation"); - console.log("Before Workers Creation"); - const workers = await Workers.new(valueToken.address) - , worker1 = accounts[7]; - console.log("After Workers Creation"); - await workers.setAdminAddress(admin); - - await workers.setOpsAddress(ops); - await workers.setWorker(worker1, deactivationHeight, {from:ops}); - console.log("After workers initialization"); - console.log("valueToken",valueToken.address); - await valueToken.setAdminAddress(accounts[3]); - // SimpleToken must be finalized to permit certain transfers - await valueToken.finalize({ from: accounts[3] }); - await valueToken.transfer(staker, amountST); - console.log("Before openstvalueinstance"); - const openSTValueInstance = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); - console.log("After openstvalueinstance"); - const coreObject = await Core.new(registrar, chainIdValue, chainIdUtility, openSTValueInstance.address, workers.address); - console.log("After Core object",coreObject.address); - const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar, "", { gas: 20000000 }); - console.log("After openSTUtility initialization"); - const stPrimeAddress = await openSTUtility.simpleTokenPrime.call(); - const stPrime = new STPrime(stPrimeAddress); - await stPrime.initialize({ from: accounts[11], value: new BigNumber(web3.toWei(800000000, "ether")) }); - console.log("After st prime initilization"); - return { - stPrime : stPrime, - openSTUtility : openSTUtility - } - */ const registrar = accounts[1]; - - const coreForOpenSTUtility = await CoreMock.new(registrar, chainIdValue, chainIdUtility, accounts[10], accounts[11]); - - const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar, coreForOpenSTUtility.address, { gas: 10000000 }); - - const stPrimeAddress = await openSTUtility.simpleTokenPrime.call(); - - const stPrime = new STPrime(stPrimeAddress); console.log("stPrime: ",stPrime.address); - await stPrime.initialize({ from: accounts[11], value: new BigNumber(web3.toWei(800000000, "ether")) }); - console.log("1"); return { stPrime : stPrime, openSTUtility : openSTUtility diff --git a/test/OpenSTValue_utils.js b/test/OpenSTValue_utils.js index 7a359f6f..e16f0aee 100644 --- a/test/OpenSTValue_utils.js +++ b/test/OpenSTValue_utils.js @@ -40,7 +40,6 @@ module.exports.deployOpenSTValue = async (artifacts, accounts) => { await valueToken.setAdminAddress(accounts[1]); // SimpleToken must be finalized to permit certain transfers assert.ok(await valueToken.finalize({ from: accounts[1] })); - console.log("ValidTOkenAddress",valueToken.address); const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); //Set SimpleToken admin in order to finalize SimpleToken diff --git a/test/Registrar.js b/test/Registrar.js index 793b5535..e3b8adf1 100644 --- a/test/Registrar.js +++ b/test/Registrar.js @@ -150,7 +150,7 @@ contract('Registrar', function(accounts) { var stakingIntentHash = null; const lock = HashLock.getHashLock(); - + var validRLPParentNodes = null; before(async() => { contracts = await Registrar_utils.deployRegistrar(artifacts, accounts); valueToken = contracts.valueToken; @@ -161,7 +161,6 @@ contract('Registrar', function(accounts) { uuid = await openSTUtility.proposeBrandedToken.call(symbol, name, conversionRate, conversionRateDecimals, { from: staker }); var result = await openSTUtility.proposeBrandedToken(symbol, name, conversionRate, conversionRateDecimals, { from: staker }); brandedToken = result.logs[0].args._token; - await registrar.registerBrandedToken(openSTUtility.address, symbol, name, conversionRate, conversionRateDecimals, staker, brandedToken, uuid, { from: ops }) await registrar.addCore(openSTValue.address, core.address, { from: ops }); await registrar.registerUtilityToken(openSTValue.address, symbol, name, conversionRate, conversionRateDecimals, chainIdUtility, staker, uuid, { from: ops }); @@ -171,16 +170,17 @@ contract('Registrar', function(accounts) { amountUT = result.logs[0].args._amountUT; unlockHeight = result.logs[0].args._unlockHeight; stakingIntentHash = result.logs[0].args._stakingIntentHash; + validRLPParentNodes = await openSTUtility.getMockRLPParentNodes.call(true); }) it('fails to confirm by non-ops', async () => { - await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash)); - await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash, { from: admin })); + await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, 0, validRLPParentNodes)); + await Utils.expectThrow(registrar.confirmStakingIntent(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, 0, validRLPParentNodes,{ from: admin })); }) it('successfully confirms', async () => { var BLOCKS_TO_WAIT_SHORT = 5; - var expirationHeight = await registrar.confirmStakingIntent.call(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, stakingIntentHash, { from: ops }); + var expirationHeight = await registrar.confirmStakingIntent.call(openSTUtility.address, uuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l, 0, validRLPParentNodes, { from: ops }); assert.ok(expirationHeight > BLOCKS_TO_WAIT_SHORT); }) diff --git a/test/Registrar_utils.js b/test/Registrar_utils.js index 9458b549..467a4753 100644 --- a/test/Registrar_utils.js +++ b/test/Registrar_utils.js @@ -25,7 +25,7 @@ var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); var Registrar = artifacts.require("./Registrar.sol"); var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); -var Core = artifacts.require("./Core.sol"); +var CoreMock = artifacts.require("./CoreMock.sol"); var Workers = artifacts.require("./Workers.sol") /// @dev Deploy @@ -57,15 +57,16 @@ module.exports.deployRegistrar = async (artifacts, accounts) => { await workers.setOpsAddress(ops); await workers.setWorker(worker1, deactivationHeight, {from:ops}); - const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, { gas: 10000000 }); const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address); - const core = await Core.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address, workers.address); + const coreUC = await CoreMock.new(registrar.address, chainIdUtility, chainIdValue, openSTValue.address, workers.address); + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, coreUC.address, { gas: 10000000 }); + const coreVC = await CoreMock.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address, workers.address); return { valueToken : valueToken, registrar : registrar, openSTUtility : openSTUtility, openSTValue : openSTValue, - core : core + core : coreVC } } From 7688c01d7f988ffefdeabfeb0c10153d407845b3 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Thu, 21 Jun 2018 18:46:14 +0200 Subject: [PATCH 0173/1361] tex: sequence diagram v0.9.3 update --- .../diagrams/v093/stakemint/stakemintv093.pdf | Bin 96457 -> 95262 bytes .../diagrams/v093/stakemint/stakemintv093.tex | 128 +++++++++++------- 2 files changed, 76 insertions(+), 52 deletions(-) diff --git a/docs/diagrams/v093/stakemint/stakemintv093.pdf b/docs/diagrams/v093/stakemint/stakemintv093.pdf index 505019ba3f5098355a7dae18718e0e594aee1053..daa4aee416b627fcff21ec07776c8148560f1738 100644 GIT binary patch delta 70471 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 LF$yImMNdWw!fo)= delta 71720 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¬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

  • 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]{Branded Token Gate}{OST} + % pull OST from Facilitator + \begin{umlcall}[dt=5, fill=green!20, type=return]{Staker}{OST} + \end{umlcall} + \end{umlcall} + + % emit StakeRequested event which Facilitator listens to + \begin{umlcall}[dt=5, type=return, op={emit StakeRequested(staker, amount, tokenHolder)}]{Branded Token Gate}{Facilitator} + \end{umlcall} + \end{umlcall} + + % Facilitator evaluates request against policy (monetary and KYC/AML) + \begin{umlfragment}[type=alt, label=accept, name=policy, inner xsep=2] + \begin{umlcall}[dt=6, op={: approve(gate, bounty)}]{Facilitator}{OST} + \end{umlcall} + % Facilitator accepts request + \begin{umlcall}[op={: acceptRequest(staker, amount, hashLock)}]{Facilitator}{Branded Token Gate} + % Pull Facilitator's bounty into Gate + \begin{umlcall}[fill=green!20, op={: transferFrom(facilitator, gate, bounty)}, return={<>}]{Branded Token Gate}{OST} + % pull OST for bounty from Facilitator + \begin{umlcall}[dt=5, fill=green!20, type=return]{Facilitator}{OST} + \end{umlcall} + \end{umlcall} + % Approve OpenSTValue as spender for Gate + \begin{umlcall}[op={: approve(openSTValue, amount)}]{Branded Token Gate}{OST} + \end{umlcall} + + % Gate calls on to OpenSTValue to stake (later abstract to library call) + \begin{umlcall}[op={: stake(uuid, staker, amount, hashLock, tokenHolder)}, return={nonce, unlockHeight}]{Branded Token Gate}{OpenSTValue} + % check stakingAccount + \begin{umlcallself}[op={require(msg.sender = gate = stakingAccount || stakingAccount = 0x)}]{OpenSTValue} + \end{umlcallself} + % OpenSTValue pulls amount plus bounty from Facilitator to + % its OST account balance + \begin{umlcall}[dt=4, op={: transferFrom(gate, OpenSTValue, amount)}, fill=green!20, return=<>]{OpenSTValue}{OST} + % pull OST for pre-fund amount from Facilitator + \begin{umlcall}[dt=20, fill=green!20, type=return]{Branded Token Gate}{OST} + \end{umlcall} + \end{umlcall} + % store StakingIntentHash in contract storage + \begin{umlcallself}[op={store StakingIntentHash},]{OpenSTValue} + \end{umlcallself} + % HTLC(facilitator, amount+bounty)Facilitator + \begin{umlcallself}[dt=0, op={HTLC(staker, amount)},]{OpenSTValue} + \end{umlcallself} + % emit StakingIntentDeclared + \begin{umlcall}[type=return, op={emit StakingIntentDeclared(nonce, unlockHeight, StakingIntentHash)}]{OpenSTValue}{Facilitator} + \end{umlcall} + \end{umlcall} + % HTLC(facilitator, bounty) + \begin{umlcallself}[op={HTLC(facilitator, bounty)}]{Branded Token Gate} + \end{umlcallself} + \end{umlcall} + + % Facilitator rejects request + \umlfpart[reject] + \begin{umlcall}[dt=5, op={: rejectRequest(staker, amount)}]{Facilitator}{Branded Token Gate} + % transfer amount back to staker + \begin{umlcall}[fill=green!20, op={: transfer(staker, amount)}]{Branded Token Gate}{OST} + % return OST to staker + \begin{umlcall}[type=return, fill=green!20, op=<>]{OST}{Staker} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlfragment} + \umlnote[x=2, y=-7]{policy}{evaluate request against policy (KYC/AML)} + \umlnote[x=30,y=-5, width=200]{policy}{to accept the staking request the facilitator generates a secret, random unlockSecret, and publishes hashLock=Hash(unlockSecret)} + + % optionally, staker can initiate revert after timeout and no action from Facilitator + \begin{umlfragment}[type=opt] + % staker reverts Stake Request after timeout + \begin{umlcall}[dt=12, op={: revertStakeRequest(staker, amount)}, fill=green!20]{Staker}{Branded Token Gate} + % gate checks amount is not locked under HTLC or time-lock is not yet expired + \begin{umlcallself}[op={require(msg.sender=staker and no HTLC)}]{Branded Token Gate} + \end{umlcallself} + % transfer amount back to staker + \begin{umlcall}[fill=green!20, op={: transfer(staker, amount)}]{Branded Token Gate}{OST} + % return OST to staker + \begin{umlcall}[type=return, fill=green!20, op=<>]{OST}{Staker} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlfragment} + + %%% + %%% OpenST Mosaic (Foundation reports respective state root of ) + %%% + + \begin{umlfragment}[type=loop, name=mosaic] + + \begin{umlcall}[dt=175, op={new block(blockHeight, stateRoot)}]{Utility Chain}{Foundation} + % Foundation report state root of Utility chain on CoreUC on value chain + \begin{umlcall}[op={: report(UC, blockHeight, stateRoot)}]{Foundation}{RegistrarVC} + \begin{umlcall}[op={: commit(blockHeight, stateRoot)}]{RegistrarVC}{CoreUC} + % state root of utility chain got reported on value chain + \begin{umlcall}[dt=10, type=return, op={emit CommittedStateRoot(UC, blockHeight, stateRoot)}]{CoreUC}{Facilitator} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlcall} + + % Foundation report state root of Value chain on CoreVC on utility chain + \begin{umlcall}[dt=205, op={new block(blockHeight, stateRoot)}]{Value Chain}{Foundation} + \begin{umlcall}[op={: report(VC, blockHeight, stateRoot}]{Foundation}{RegistrarUC} + % reporting through registrar is instant commit + \begin{umlcall}[op={: commit(blockHeight, stateRoot)}]{RegistrarUC}{CoreVC} + % state root of value chain got reported on utility chain + \begin{umlcall}[dt=10, type=return, op={emit CommittedStateRoot(VC, blockHeight, stateRoot)}]{CoreVC}{Facilitator} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlcall} + + \end{umlfragment} + \umlnote[x=30, y=-26, width=180]{mosaic}{Placeholder for OpenST Mosaic game} + + %%% + %%% Facilitator has observed a committed state root that includes the StakingIntentHash + %%% + + % Facilitator submits claim for StakingIntentHash by presenting Merkle proof + \begin{umlcall}[dt=15, op={: claimStakingIntentHash(StakingIntentHash, merkleProof[], committedBlockHeight)}, return={emit ValidatedStakingIntentHash(StakingIntentHash)}]{Facilitator}{OpenSTUtility} + % OpenSTUtility checks StakingIntentHash against committed state root + \begin{umlcall}[op={: getStateRoot(blockHeight)}, return={stateRoot @ blockHeight}]{OpenSTUtility}{CoreVC} + \end{umlcall} + % OpenSTUtility validate merkle proof + \begin{umlcallself}[op={validate proof}]{OpenSTUtility} + \end{umlcallself} + % OpenSTUtility store valid StakingIntentHash + \begin{umlcallself}[op={store valid StakingIntentHash}]{OpenSTUtility} + \end{umlcallself} + \end{umlcall} + + % Facilitator submits pre-image data for StakingIntentHash + \begin{umlcall}[dt=5, op={: ConfirmStakingIntent(StakingIntentHash, uuid, hashLock, amountST, amountUT, stakingProcessor, stakingProcessorNonce, tokenHolder, unlockHeight)}, return={emit StakingIntentConfirmed(StakingIntentHash, nonce, unlockHeight, expirationHeight)}]{Facilitator}{OpenSTUtility} + % OpenSTUtility asserts valid pre-image data for StakingIntentHash + \begin{umlcallself}[op={assert valid pre-image data}]{OpenSTUtility} + \end{umlcallself} + % OpenSTUtility checks StakingIntentHash against committed state root + \begin{umlcall}[op={: getLatestHeight()}, return={latestHeight}]{OpenSTUtility}{CoreVC} + \end{umlcall} + % OpenSTUtility asserts grace period before unlockHeight + \begin{umlcallself}[op={assert grace period before unlockHeight}]{OpenSTUtility} + \end{umlcallself} + % OpenSTUtility store mint object with StakingIntentHash and expiration Height + \begin{umlcallself}[op={store mint with expirationHeight}]{OpenSTUtility} + \end{umlcallself} + \end{umlcall} + + %%% + %%% Facilitator has moved both value and utility chain to the first stage + %%% and can now either proceed or revert by revealing the hash lock secret or await timeout + %%% + + % Correctly initialised staking information on both systems + \begin{umlfragment}[type=alt, label=proceed, name=phasetwo, inner xsep=6] + \begin{umlcall}[dt=6, fill=green!20, op={: processStaking(StakingIntentHash, unlockSecret)}]{Facilitator}{Branded Token Gate} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{Branded Token Gate} + \end{umlcallself} + % Facilitator first calls processStaking to ensure the bounty is return to him + \begin{umlcall}[dt=4, op={: processStaking(StakingIntentHash, unlockSecret)}]{Branded Token Gate}{OpenSTValue} + % check stakingAccount + \begin{umlcallself}[op={require(msg.sender = gate = stakingAccount || stakingAccount = 0x)}]{OpenSTValue} + \end{umlcallself} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{OpenSTValue} + \end{umlcallself} + % transfer amount OST to SimpleStake + \begin{umlcall}[fill=green!20, op={: transfer(simpleStake, amount)}]{OpenSTValue}{OST} + \begin{umlcall}[dt=5, fill=green!20, type=return, op={<>}]{OST}{SimpleStake} + \end{umlcall} + \end{umlcall} + \begin{umlcall}[dt=5, type=return, op={emit ProcessedStake(StakingIntentHash, unlockSecret)}]{OpenSTValue}{Hunter} + \end{umlcall} + \end{umlcall} + % transfer bounty from gate to facilitator + \begin{umlcall}[dt=5, fill=green!20, op={: transfer(facilitator, bounty)}]{Branded Token Gate}{OST} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{OST}{Facilitator} + \end{umlcall} + \end{umlcall} + \end{umlcall} + + % Facilitator then calls processMinting to mint the utility tokens + \begin{umlcall}[op={: processMinting(StakingIntentHash, unlockSecret)}]{Facilitator}{OpenSTUtility} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{OpenSTUtility} + \end{umlcallself} + % require mint not yet expired + \begin{umlcallself}[op={require(expirationHeight > block.number)}]{OpenSTUtility} + \end{umlcallself} + % mint Branded Tokens + \begin{umlcall}[fill=green!20, op={: mint(amountUT, tokenHolder)}]{OpenSTUtility}{Branded Token} + % store claim + \begin{umlcallself}[op={store claim}]{Branded Token} + \end{umlcallself} + \end{umlcall} + \begin{umlcall}[type=return, op={emit ProcessedMint(StakingIntentHash, unlockSecret)}]{OpenSTUtility}{Hunter} + \end{umlcall} + \end{umlcall} + + % Facilitator (or anyone) can call claim to transfer UT to token holder + \begin{umlcall}[dt=5, op={: claim(tokenHolder)}]{Facilitator}{Branded Token} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{Branded Token}{Token Holder} + \end{umlcall} + \end{umlcall} + + %%% + %%% Hunter + %%% + + \begin{umlfragment}[type=opt, name=bounty, label={ensure completion}, inner xsep=15] + % process staking on gate + \begin{umlcall}[dt=20, fill=green!20, op={: processStaking(StakingIntentHash, unlockSecret)}]{Hunter}{Branded Token Gate} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{Branded Token Gate} + \end{umlcallself} + % Facilitator first calls processStaking to ensure the bounty is return to him + \begin{umlcall}[dt=4, op={: processStaking(StakingIntentHash, unlockSecret)}]{Branded Token Gate}{OpenSTValue} + % check stakingAccount + \begin{umlcallself}[op={require(msg.sender = gate = stakingAccount || stakingAccount = 0x)}]{OpenSTValue} + \end{umlcallself} + % check hashlock + \begin{umlcallself}[op={require(H(unlockSecret) = hashLock)}]{OpenSTValue} + \end{umlcallself} + % transfer amount OST to SimpleStake + \begin{umlcall}[fill=green!20, op={: transfer(simpleStake, amount)}]{OpenSTValue}{OST} + \begin{umlcall}[dt=5, fill=green!20, type=return, op={<>}]{OST}{SimpleStake} + \end{umlcall} + \end{umlcall} + \begin{umlcall}[dt=5, type=return, op={emit ProcessedStake(StakingIntentHash, unlockSecret)}]{OpenSTValue}{Facilitator} + \end{umlcall} + \end{umlcall} + % transfer bounty from gate to facilitator + \begin{umlcall}[dt=5, fill=green!20, op={: transfer(hunter, bounty)}]{Branded Token Gate}{OST} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{OST}{Hunter} + \end{umlcall} + \end{umlcall} + \end{umlcall} + \end{umlfragment} + \umlnote[x=12, y=-64, width=150]{bounty}{If stake was left unprocessed, unlock secret is known through mint. Bounty is always transferred to msg.sender of processStaking()} + + \umlfpart[revert] + + \begin{umlcall}[dt=20, fill=green!20, op={: revertStaking(StakingIntentHash)}]{Facilitator}{Branded Token Gate} + % check unlockHeight is in the past + \begin{umlcallself}[op={require(unlockHeight <= block.number)}]{Branded Token Gate} + \end{umlcallself} + % Facilitator reverts stake to get back amount and bounty + \begin{umlcall}[fill=green!20, op={: revertStaking(StakingIntentHash)}]{Branded Token Gate}{OpenSTValue} + % check stakingAccount + \begin{umlcallself}[op={require(msg.sender = gate = stakingAccount || stakingAccount = 0x)}]{OpenSTValue} + \end{umlcallself} + % check unlockHeight + \begin{umlcallself}[op={require(unlockHeight <= block.number)}]{OpenSTValue} + \end{umlcallself} + % transfer amount and bounty OST to facilitator + \begin{umlcall}[fill=green!20, op={: transfer(staker, amount)}]{OpenSTValue}{OST} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{OST}{Staker} + \end{umlcall} + \end{umlcall} + \end{umlcall} + % transfer bounty from gate to facilitator + \begin{umlcall}[dt=5, fill=green!20, op={: transfer(facilitator, bounty)}]{Branded Token Gate}{OST} + \begin{umlcall}[fill=green!20, type=return, op={<>}]{OST}{Facilitator} + \end{umlcall} + \end{umlcall} + \end{umlcall} + + \begin{umlcall}[op={: revertMinting(StakingIntentHash)}]{Facilitator}{OpenSTUtility} + % require mint not yet expired + \begin{umlcallself}[op={require(expirationHeight <= block.number)}]{OpenSTUtility} + \end{umlcallself} + \end{umlcall} + \end{umlfragment} + \umlnote[x=1, y=-47, width=100]{phasetwo}{With both value chain and utility chain configured correctly for StakingIntentHash, Facilitator can proceed by revealing the unlock secret, or revert by awaiting the unlock height } + \umlnote[x=40, y=-100, width=120]{phasetwo}{Any actor can call revertStaking and the bounty is returned to the facilitator} + + \end{umlseqdiag} +\end{tikzpicture} + + +\end{document} + From ab5ff10ef5ec0d98be3c06c4b8aaba69e9369cd4 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 17 May 2018 13:14:59 +0530 Subject: [PATCH 0062/1361] contract: added checks for worker in revertStake --- contracts/Gate.sol | 13 ++++-------- test/Gate.js | 53 +++++++++++++++++++++------------------------- 2 files changed, 28 insertions(+), 38 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 2ebe040e..71b13b40 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -273,6 +273,9 @@ contract Gate is ProtocolVersioned, Owned { returns (bool /* success */) { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + require(_stakingIntentHash != bytes32(0)); //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; @@ -297,15 +300,7 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake address is not 0 require(stakerAddress != address(0)); - //If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract - //else transfer the bounty to msg.sender. - if (workers.isWorker(msg.sender)) { - // Transfer bounty amount to the workers contract address - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); - } else { - //Transfer bounty amount to the msg.sender account - require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); - } + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); // delete the stake request from the mapping storage delete stakeRequests[staker]; diff --git a/test/Gate.js b/test/Gate.js index 47a50748..a6efedf5 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -245,7 +245,7 @@ contract('Gate', function(accounts) { await Utils.expectThrow(gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender})); }; - const revertStaking = async function (stakingIntentHash, messageSender, isWhiteListedWorker, isSuccessCase) { + const revertStaking = async function (stakingIntentHash, messageSender, isSuccessCase) { let initialworkerAddress1Balance = await valueToken.balanceOf.call(messageSender) , initialWorkerBalance = await valueToken.balanceOf.call(workers) @@ -274,13 +274,8 @@ contract('Gate', function(accounts) { if (isSuccessCase) { // check balances - if (isWhiteListedWorker) { - assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); - assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); - } else { - assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance.plus(bountyAmount)), true); - assert.equal(finalWorkerBalance.equals(initialWorkerBalance), true); - } + assert.equal(finalworkerAddress1Balance.equals(initialworkerAddress1Balance), true); + assert.equal(finalWorkerBalance.equals(initialWorkerBalance.plus(bountyAmount)), true); assert.equal(finalGateBalance.equals(initialGateBalance.sub(bountyAmount)), true); } else { @@ -376,16 +371,16 @@ contract('Gate', function(accounts) { lock = HashLock.getHashLock(); }); - it('successfully processes revert request stake', async () => { + it('successfully processes revert stake request', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); await revertStakeRequest(stakerAccount, stakeAmount ,true); }); - it('fails to processes revert request stake when staker account has not requested stake before', async () => { + it('fails to processes revert stake request when staker account has not requested stake before', async () => { await revertStakeRequest(stakerAccount, stakeAmount ,false); }); - it('fails to processes revert request stake after accepting stake request', async () => { + it('fails to processes revert stake request after stake request was accepted', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); @@ -408,16 +403,16 @@ contract('Gate', function(accounts) { lock = HashLock.getHashLock(); }); - it('successfully processes reject request stake', async () => { + it('successfully processes reject stake request', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); }); - it('fails to processes reject request stake when staker account has not requested stake before', async () => { + it('fails to processes reject stake request when staker account has not requested to stake before', async () => { await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, false); }); - it('fails to processes reject request stake after accepting stake request', async () => { + it('fails to processes reject stake request after stake request was accepted', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); await valueToken.transfer(workerAddress1, new BigNumber(web3.toWei(10000, "ether")),{from: accounts[0]}); @@ -443,7 +438,7 @@ contract('Gate', function(accounts) { lock = HashLock.getHashLock(); }); - it('successfully processes accept request stake', async () => { + it('successfully processes accept stake request', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); @@ -454,7 +449,7 @@ contract('Gate', function(accounts) { }); - it('fails to processes accept request stake when worker is not whitelisted address', async () => { + it('fails to processes accept stake request when worker is not whitelisted address', async () => { let workerAddress = accounts[10]; await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); @@ -466,7 +461,7 @@ contract('Gate', function(accounts) { }); - it('fails to processes accept request stake when staker address is blank', async () => { + it('fails to processes accept stake request when staker address is blank', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); @@ -477,7 +472,7 @@ contract('Gate', function(accounts) { }); - it('fails to processes accept request stake when hash lock is blank', async () => { + it('fails to processes accept stake request when hash lock is blank', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); @@ -624,7 +619,7 @@ contract('Gate', function(accounts) { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; - await revertStaking(stakingIntentHash, workerAddress1, true, true); + await revertStaking(stakingIntentHash, workerAddress1, true); }); @@ -635,35 +630,35 @@ contract('Gate', function(accounts) { await processStaking(stakingIntentHash, lock.s, workerAddress1, true); - await revertStaking(stakingIntentHash, workerAddress1, true, false); + await revertStaking(stakingIntentHash, workerAddress1, false); }); - it('fails to process when already stakingIntentHash is 0', async () => { + it('fails to process when stakingIntentHash is 0', async () => { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; - await revertStaking(0, workerAddress1, true, false); + await revertStaking(0, workerAddress1, false); }); - it('fails to process when already stakingIntentHash is invalid', async () => { + it('fails to process when stakingIntentHash is invalid', async () => { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; - await revertStaking(beneficiaryAccount, workerAddress1, true, false); + await revertStaking(beneficiaryAccount, workerAddress1, false); }); - it('successfully process when worker is not whitelisted', async () => { + it('fails to process when worker is not whitelisted', async () => { let stakeResult = await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); let stakingIntentHash = stakeResult['stakingIntentHash']; let workerAddress = accounts[10]; - await revertStaking(stakingIntentHash, workerAddress, false, true); + await revertStaking(stakingIntentHash, workerAddress, false); }); @@ -671,7 +666,7 @@ contract('Gate', function(accounts) { it('fails to processes when stakeRequest was not accepted', async () => { let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); - await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, true, false); + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, false); }); @@ -680,7 +675,7 @@ contract('Gate', function(accounts) { let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); - await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, true, false); + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, false); }); it('fails to processes when stakeRequest was reverted', async () => { @@ -688,7 +683,7 @@ contract('Gate', function(accounts) { let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); await revertStakeRequest(stakerAccount, stakeAmount ,true); - await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, true, false); + await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, false); }); }) From 4fb35ee59a31ca6b6144267abdec74113695a99c Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 17 May 2018 15:10:12 +0530 Subject: [PATCH 0063/1361] contract: updated rejectStakeRequest to incorporate reason param --- contracts/Gate.sol | 6 +++--- test/Gate.js | 23 ++++++++++++----------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 71b13b40..5f655336 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -35,7 +35,7 @@ contract Gate is ProtocolVersioned, Owned { */ event StakeRequested(address _staker, uint256 _amount, address _beneficiary); event StakeRequestReverted(address _staker, uint256 _amount); - event StakeRequestRejected(address _staker, uint256 _amount); + event StakeRequestRejected(address _staker, uint256 _amount, uint8 _reason); event StakeRequestAccepted( address _staker, uint256 _amountST, @@ -143,7 +143,7 @@ contract Gate is ProtocolVersioned, Owned { return true; } - function rejectStakeRequest(address _staker) + function rejectStakeRequest(address _staker, uint8 _reason) external returns (bool /* success */) { @@ -165,7 +165,7 @@ contract Gate is ProtocolVersioned, Owned { // delete the stake request from the mapping storage delete stakeRequests[msg.sender]; - emit StakeRequestRejected(_staker, stakeRequestAmount); + emit StakeRequestRejected(_staker, stakeRequestAmount, _reason); return true; } diff --git a/test/Gate.js b/test/Gate.js index a6efedf5..787408c7 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -122,7 +122,7 @@ contract('Gate', function(accounts) { await Utils.expectThrow(gate.revertStakeRequest({from: staker})); }; - const rejectStakeRequest = async function (staker, amount, messageSender, isSuccessCase) { + const rejectStakeRequest = async function (staker, amount, reason, messageSender, isSuccessCase) { // load intial account balance let initialStakerAccountBalance = await valueToken.balanceOf.call(staker) @@ -131,14 +131,14 @@ contract('Gate', function(accounts) { if (isSuccessCase) { - let rejectRequestStakeResult = await gate.rejectStakeRequest.call(staker, {from: messageSender}); + let rejectRequestStakeResult = await gate.rejectStakeRequest.call(staker, reason, {from: messageSender}); assert.equal(rejectRequestStakeResult, true); - let rejectRequestStakeResponse = await gate.rejectStakeRequest(staker, {from: messageSender}); - await Gate_utils.checkStakeRequestRejectedEvent(rejectRequestStakeResponse.logs[0],staker, amount); + let rejectRequestStakeResponse = await gate.rejectStakeRequest(staker, reason, {from: messageSender}); + await Gate_utils.checkStakeRequestRejectedEvent(rejectRequestStakeResponse.logs[0],staker, amount, reason); } else { - await Utils.expectThrow(gate.rejectStakeRequest(staker, {from: messageSender})); + await Utils.expectThrow(gate.rejectStakeRequest(staker, reason, {from: messageSender})); } // load balances after execution @@ -157,7 +157,7 @@ contract('Gate', function(accounts) { } // request again should fail - await Utils.expectThrow(gate.rejectStakeRequest(staker, {from: messageSender})); + await Utils.expectThrow(gate.rejectStakeRequest(staker, reason, {from: messageSender})); }; const acceptStakeRequest = async function(staker, amount, lock, messageSender, isSuccessCase) { @@ -396,6 +396,7 @@ contract('Gate', function(accounts) { let bountyAmount = null; let lock = null; + let rejectReason = 2; beforeEach (async () => { await deployGate(); @@ -405,11 +406,11 @@ contract('Gate', function(accounts) { it('successfully processes reject stake request', async () => { await approveGateAndRequestStake(stakeAmount, beneficiaryAccount, stakerAccount, true); - await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); + await rejectStakeRequest(stakerAccount, stakeAmount, rejectReason, workerAddress1, true); }); it('fails to processes reject stake request when staker account has not requested to stake before', async () => { - await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, false); + await rejectStakeRequest(stakerAccount, stakeAmount, rejectReason, workerAddress1, false); }); it('fails to processes reject stake request after stake request was accepted', async () => { @@ -420,7 +421,7 @@ contract('Gate', function(accounts) { await acceptStakeRequest(stakerAccount, stakeAmount, lock, workerAddress1, true); - await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, false); + await rejectStakeRequest(stakerAccount, stakeAmount, rejectReason, workerAddress1, false); }); }); @@ -582,7 +583,7 @@ contract('Gate', function(accounts) { let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); - await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); + await rejectStakeRequest(stakerAccount, stakeAmount, 0, workerAddress1, true); await processStaking(stakingIntentHashParams.stakingIntentHash, stakingIntentHashParams.hashLock, workerAddress1, false); }); @@ -674,7 +675,7 @@ contract('Gate', function(accounts) { let stakingIntentHashParams = await getStakingIntentHashParams(stakerAccount, stakeAmount, lock, workerAddress1); - await rejectStakeRequest(stakerAccount, stakeAmount, workerAddress1, true); + await rejectStakeRequest(stakerAccount, stakeAmount, 0, workerAddress1, true); await revertStaking(stakingIntentHashParams.stakingIntentHash, workerAddress1, false); }); From 78c43dd86c85100e4b26ac4c27f8b7bc2c36597b Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 17 May 2018 15:21:48 +0530 Subject: [PATCH 0064/1361] test: updated gate utils to incorporate reject reason checks for events --- test/Gate_utils.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/Gate_utils.js b/test/Gate_utils.js index 1c6fd421..38402ac8 100644 --- a/test/Gate_utils.js +++ b/test/Gate_utils.js @@ -119,13 +119,17 @@ module.exports.checkStakeRequestRevertedEvent = (event, _staker, _amount) => { assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); }; -module.exports.checkStakeRequestRejectedEvent = (event, _staker, _amount) => { +module.exports.checkStakeRequestRejectedEvent = (event, _staker, _amount, _reason) => { if (Number.isInteger(_amount)) { _amount = new BigNumber(_amount); } + if (Number.isInteger(_reason)) { + _reason = new BigNumber(_reason); + } assert.equal(event.event, "StakeRequestRejected"); assert.equal(event.args._staker, _staker); assert.equal(event.args._amount.toNumber(10), _amount.toNumber(10)); + assert.equal(event.args._reason.toNumber(10), _reason.toNumber(10)); }; From 0d1309a3a3939e3d09a2a0226fd53bd4fdaa4634 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 17 May 2018 16:44:34 +0530 Subject: [PATCH 0065/1361] contract: pull request changes incorporated --- contracts/Gate.sol | 4 +- contracts/Workers.sol | 3 +- package-lock.json | 310 +++++++++++++++++++----------------------- 3 files changed, 143 insertions(+), 174 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 5f655336..311fc74e 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -74,7 +74,7 @@ contract Gate is ProtocolVersioned, Owned { * Public functions */ constructor( - address _workers, + WorkersInterface _workers, uint256 _bounty, bytes32 _uuid, address _openSTProtocol) @@ -85,7 +85,7 @@ contract Gate is ProtocolVersioned, Owned { require(_workers != address(0)); require(_uuid.length != uint8(0)); - workers = WorkersInterface(_workers); + workers = _workers; bounty = _bounty; uuid = _uuid; diff --git a/contracts/Workers.sol b/contracts/Workers.sol index ec3af499..ee095c69 100644 --- a/contracts/Workers.sol +++ b/contracts/Workers.sol @@ -24,9 +24,10 @@ pragma solidity ^0.4.23; import "./SafeMath.sol"; import "./EIP20Interface.sol"; import "./OpsManaged.sol"; +import "./WorkersInterface.sol"; /// A set of authorised workers -contract Workers is OpsManaged { +contract Workers is WorkersInterface, OpsManaged { using SafeMath for uint256; /// EIP20token address is private for now. EIP20Interface private eip20token; diff --git a/package-lock.json b/package-lock.json index e9595c4d..bffaa1cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,12 @@ "glob-to-regexp": "0.3.0" } }, + "@nodelib/fs.stat": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.0.2.tgz", + "integrity": "sha512-vCpf75JDcdomXvUd7Rn6DfYAVqPAFI66FVjxiWGwh85OLdvfo3paBoPJaam5keIYRyUolnS7SleS/ZPCidCvzw==", + "dev": true + }, "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", @@ -1436,7 +1442,7 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", - "fsevents": "1.2.3", + "fsevents": "1.2.4", "glob-parent": "3.1.0", "inherits": "2.0.1", "is-binary-path": "1.0.1", @@ -1444,7 +1450,7 @@ "normalize-path": "2.1.1", "path-is-absolute": "1.0.1", "readdirp": "2.1.0", - "upath": "1.0.5" + "upath": "1.1.0" } }, "cipher-base": { @@ -1615,9 +1621,9 @@ "dev": true }, "colors": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", - "integrity": "sha512-6Y+iBnWmXL+AWtlOp2Vr6R2w5MUlNJRwR0ShVFaAb1CqWzhPOpQg4L0jxD+xpw/Nc8QJwaq3KM79QUCriY8CWQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true }, "commander": { @@ -2179,19 +2185,19 @@ "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", "dev": true, "requires": { - "webpack": "3.11.0" + "webpack": "3.12.0" }, "dependencies": { "ajv": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz", + "integrity": "sha512-VDUX1oSajablmiyFyED9L1DFndg0P9h7p1F+NO8FkIzei6EPrR6Zu1n18rd5P8PqaSRd/FrWv3G1TVBqpM83gA==", "dev": true, "requires": { - "fast-deep-equal": "1.1.0", + "fast-deep-equal": "2.0.1", "fast-json-stable-stringify": "2.0.0", "json-schema-traverse": "0.3.1", - "uri-js": "3.0.2" + "uri-js": "4.2.1" } }, "ajv-keywords": { @@ -2358,14 +2364,14 @@ } }, "webpack": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", - "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "dev": true, "requires": { "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", - "ajv": "6.4.0", + "ajv": "6.5.0", "ajv-keywords": "3.2.0", "async": "2.6.0", "enhanced-resolve": "3.4.1", @@ -2513,18 +2519,18 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "2.2.4" }, "dependencies": { "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", - "randomatic": "1.1.7", + "randomatic": "3.0.0", "repeat-element": "1.1.2", "repeat-string": "1.6.1" } @@ -2662,18 +2668,19 @@ } }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-glob": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.1.tgz", - "integrity": "sha512-wSyW1TBK3ia5V+te0rGPXudeMHoUQW6O5Y9oATiaGhpENmEifPDlOdhpsnlj5HoG6ttIvGiY1DdCmI9X2xGMhg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", + "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", "dev": true, "requires": { "@mrmlnc/readdir-enhanced": "2.2.1", + "@nodelib/fs.stat": "1.0.2", "glob-parent": "3.1.0", "is-glob": "4.0.0", "merge2": "1.2.2", @@ -2755,9 +2762,9 @@ } }, "flow-parser": { - "version": "0.71.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.71.0.tgz", - "integrity": "sha512-rXSvqSBLf8aRI6T3P99jMcUYvZoO1KZcKDkzGJmXvYdNAgRKu7sfGNtxEsn3cX4TgungBuJpX+K8aHRC9/B5MA==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.72.0.tgz", + "integrity": "sha512-kFaDtviKlD/rHi6NRp42KTbnPgz/nKcWUJQhqDnLDeKA8uGcRVSy0YlQjaf9M3pFo5PgC3SNFnCPpQGLtHjH2w==", "dev": true }, "for-in": { @@ -2814,14 +2821,14 @@ "dev": true }, "fsevents": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", - "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, "optional": true, "requires": { "nan": "2.10.0", - "node-pre-gyp": "0.9.1" + "node-pre-gyp": "0.10.0" }, "dependencies": { "abbrev": { @@ -2902,7 +2909,7 @@ } }, "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true, "dev": true, "optional": true @@ -3080,7 +3087,7 @@ } }, "node-pre-gyp": { - "version": "0.9.1", + "version": "0.10.0", "bundled": true, "dev": true, "optional": true, @@ -3091,7 +3098,7 @@ "nopt": "4.0.1", "npm-packlist": "1.1.10", "npmlog": "4.1.2", - "rc": "1.2.6", + "rc": "1.2.7", "rimraf": "2.6.2", "semver": "5.5.0", "tar": "4.4.1" @@ -3189,12 +3196,12 @@ "optional": true }, "rc": { - "version": "1.2.6", + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", + "deep-extend": "0.5.1", "ini": "1.3.5", "minimist": "1.2.0", "strip-json-comments": "2.0.1" @@ -3348,7 +3355,7 @@ "integrity": "sha512-FdTeyk4uLRHGeFiMe+Qnh4Hc5KiTVqvRVVvLDFJEVVKC1P1yHhEgZeh9sp1KhuvxSrxToxgJS25UapYQwH4zHw==", "dev": true, "requires": { - "source-map-support": "0.5.5", + "source-map-support": "0.5.6", "webpack-cli": "2.1.3" }, "dependencies": { @@ -3359,9 +3366,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz", - "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { "buffer-from": "1.0.0", @@ -3596,16 +3603,26 @@ "dev": true }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.2", "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "got": { @@ -4328,9 +4345,9 @@ "babel-preset-es2015": "6.24.1", "babel-preset-stage-1": "6.24.1", "babel-register": "6.26.0", - "babylon": "7.0.0-beta.46", - "colors": "1.2.4", - "flow-parser": "0.71.0", + "babylon": "7.0.0-beta.47", + "colors": "1.2.5", + "flow-parser": "0.72.0", "lodash": "4.17.10", "micromatch": "2.3.11", "neo-async": "2.5.1", @@ -4357,9 +4374,9 @@ "dev": true }, "babylon": { - "version": "7.0.0-beta.46", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", - "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", + "version": "7.0.0-beta.47", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", + "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==", "dev": true }, "braces": { @@ -4949,9 +4966,9 @@ } }, "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { "pify": "3.0.0" @@ -4980,6 +4997,12 @@ "object-visit": "1.0.1" } }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -5041,27 +5064,6 @@ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, - "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.1", - "glob": "7.1.2", - "ignore": "3.3.8", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -5382,7 +5384,7 @@ "querystring-es3": "0.2.1", "readable-stream": "2.3.6", "stream-browserify": "2.0.1", - "stream-http": "2.8.1", + "stream-http": "2.8.2", "string_decoder": "1.1.1", "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", @@ -5962,23 +5964,27 @@ "dev": true }, "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" }, "dependencies": { - "kind-of": { + "is-number": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -6105,9 +6111,9 @@ } }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, "regenerator-runtime": { @@ -6152,7 +6158,7 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", + "regenerate": "1.4.0", "regjsgen": "0.2.0", "regjsparser": "0.1.5" } @@ -6330,21 +6336,6 @@ "is-promise": "2.1.0" } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" - } - }, "rxjs": { "version": "5.5.10", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", @@ -6499,7 +6490,7 @@ "extend-shallow": "2.0.1", "map-cache": "0.2.2", "source-map": "0.5.7", - "source-map-resolve": "0.5.1", + "source-map-resolve": "0.5.2", "use": "3.1.0" }, "dependencies": { @@ -6681,9 +6672,9 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { "atob": "2.1.1", @@ -6781,9 +6772,9 @@ } }, "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", "dev": true, "requires": { "builtin-status-codes": "3.0.0", @@ -7151,15 +7142,15 @@ "dev": true }, "upath": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", - "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", + "integrity": "sha512-jpKCA3HjsBfSDOEgxRDAxQCNyHfCPSbq57PqCkd3gAyBuPb3IWxw54EHncqESznIdqSetHfw3D7ylThu2Kcc9A==", "dev": true, "requires": { "punycode": "2.1.0" @@ -7458,8 +7449,8 @@ "babel-preset-stage-1": "6.24.1", "babel-register": "6.26.0", "babylon": "6.18.0", - "colors": "1.2.4", - "flow-parser": "0.71.0", + "colors": "1.2.5", + "flow-parser": "0.72.0", "lodash": "4.17.10", "micromatch": "2.3.11", "node-dir": "0.1.8", @@ -7541,7 +7532,7 @@ "v8-compile-cache": "1.1.2", "webpack-addons": "1.1.5", "yargs": "11.1.0", - "yeoman-environment": "2.0.6", + "yeoman-environment": "2.1.1", "yeoman-generator": "2.0.5" }, "dependencies": { @@ -7884,22 +7875,24 @@ } }, "yeoman-environment": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz", - "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.1.1.tgz", + "integrity": "sha512-IBLwCUrJrDxBYuwdYm1wuF3O/CR2LpXR0rFS684QOrU6x69DPPrsdd20dZOFaedZ/M9sON7po73WhO3I1CbgNQ==", "dev": true, "requires": { "chalk": "2.4.1", + "cross-spawn": "6.0.5", "debug": "3.1.0", "diff": "3.5.0", "escape-string-regexp": "1.0.5", - "globby": "6.1.0", + "globby": "8.0.1", "grouped-queue": "0.3.3", - "inquirer": "3.3.0", + "inquirer": "5.2.0", "is-scoped": "1.0.0", "lodash": "4.17.10", "log-symbols": "2.2.0", "mem-fs": "1.1.3", + "strip-ansi": "4.0.0", "text-table": "0.2.0", "untildify": "3.0.2" }, @@ -7930,6 +7923,19 @@ "supports-color": "5.4.0" } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -7945,44 +7951,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -8022,7 +7990,7 @@ "github-username": "4.1.0", "istextorbinary": "2.2.1", "lodash": "4.17.10", - "make-dir": "1.2.0", + "make-dir": "1.3.0", "mem-fs-editor": "4.0.2", "minimist": "1.2.0", "pretty-bytes": "4.0.2", @@ -8033,7 +8001,7 @@ "shelljs": "0.8.2", "text-table": "0.2.0", "through2": "2.0.3", - "yeoman-environment": "2.0.6" + "yeoman-environment": "2.1.1" }, "dependencies": { "ansi-styles": { From 2efea66869e2d31f4398ede68d4d19c81a974cfa Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Tue, 22 May 2018 12:04:50 +0200 Subject: [PATCH 0066/1361] contracts: comments for workers contract --- contracts/Workers.sol | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/contracts/Workers.sol b/contracts/Workers.sol index ee095c69..00a08f04 100644 --- a/contracts/Workers.sol +++ b/contracts/Workers.sol @@ -29,7 +29,7 @@ import "./WorkersInterface.sol"; /// A set of authorised workers contract Workers is WorkersInterface, OpsManaged { using SafeMath for uint256; - /// EIP20token address is private for now. + EIP20Interface private eip20token; /* * Storage @@ -130,7 +130,12 @@ contract Workers is WorkersInterface, OpsManaged { { return (workers[_worker] >= block.number); } - + /// @dev Takes _spender and _amount; + /// approves spender to spend amount; + /// external method; + /// @param _spender spender; + /// _amount amount; + /// @return (bool) function approve( address _spender, uint256 _amount) @@ -138,7 +143,6 @@ contract Workers is WorkersInterface, OpsManaged { onlyOps() returns (bool success) { - /// approve the spender for the amount require(eip20token.approve(_spender, _amount)); return true; From 1f2a663569ba0e83b585badd1636298f7f89e21e Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Mon, 28 May 2018 18:35:50 +0530 Subject: [PATCH 0067/1361] Changes done for ganache-cli:MOS-49 --- .travis.yml | 4 ++-- package.json | 2 +- tools/runGanacheCli.sh | 2 ++ tools/runTestRpc.sh | 2 -- 4 files changed, 5 insertions(+), 5 deletions(-) create mode 100755 tools/runGanacheCli.sh delete mode 100755 tools/runTestRpc.sh diff --git a/.travis.yml b/.travis.yml index 8fc288c4..7a586036 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,8 +20,8 @@ before_install: install: - npm install before_script: - - nohup ./tools/runTestRpc.sh /dev/null 2>&1 & + - nohup ./tools/runGanacheCli.sh /dev/null 2>&1 & script: - truffle test after_script: - - kill $(ps aux | grep 'testrpc' | awk '{print $2}') + - kill $(ps aux | grep 'ganache-cli' | awk '{print $2}') diff --git a/package.json b/package.json index c4e140b1..0db8bdde 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "devDependencies": { "truffle": "^4.1.8", - "ganache-cli": "^6.0.3", + "ganache-cli": "^6.1.0", "abi-decoder": "^1.0.9", "ethereumjs-testrpc": "^6.0.3" }, diff --git a/tools/runGanacheCli.sh b/tools/runGanacheCli.sh new file mode 100755 index 00000000..b82eaca6 --- /dev/null +++ b/tools/runGanacheCli.sh @@ -0,0 +1,2 @@ +#!/bin/bash +ganache-cli --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea9,0" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb9,0" --gasLimit 12000000 diff --git a/tools/runTestRpc.sh b/tools/runTestRpc.sh deleted file mode 100755 index 7c16eb20..00000000 --- a/tools/runTestRpc.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -testrpc --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5ea9,0" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb0,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb1,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb2,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb3,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb4,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb5,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb6,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb7,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb8,10000000000000000000000000000000" --account="0x8fbbbaceff30d4eea3e2ffa2dfedc3c053f78c1f53103e4ddc31309e6b1d5eb9,0" --gasLimit 12000000 From 2146f536c38b6feb4a8051684fd27e904a12447f Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Mon, 28 May 2018 19:25:50 +0530 Subject: [PATCH 0068/1361] Changes done for ganache-cli:MOSA-49 --- test/OpenSTUtility.js | 8 +++++--- test/OpenSTValue.js | 14 +++++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index 76bbad5b..ee0db474 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -269,7 +269,7 @@ contract('OpenSTUtility', function(accounts) { expirationHeight = await openSTUtility.confirmStakingIntent.call(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); // call block number is one less than send block number - expirationHeight = expirationHeight.plus(1) + //expirationHeight = expirationHeight.plus(1) //test commenting result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); await OpenSTUtility_utils.checkStakingIntentConfirmedEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, accounts[0], accounts[0], amountST, amountUT, expirationHeight); }) @@ -363,7 +363,8 @@ contract('OpenSTUtility', function(accounts) { var redeemReturns = await openSTUtility.redeem.call(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); // call block number is one less than send block number - unlockHeight = redeemReturns[0].plus(1); + //unlockHeight = redeemReturns[0].plus(1); test commenting + unlockHeight = redeemReturns[0]; var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(checkBtUuid, accounts[0], 2, redeemBeneficiary, redeemAmountUT, unlockHeight, lockR.l); result = await openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); @@ -402,7 +403,8 @@ contract('OpenSTUtility', function(accounts) { var redeemReturns = await openSTUtility.redeemSTPrime.call(redeemSTP.toNumber(), redeemBeneficiary, lockR.l, { from: redeemer, value: 2 }); // call block number is one less than send block number - unlockHeight = redeemReturns[1].plus(1) + //unlockHeight = redeemReturns[1].plus(1); --commenting test + unlockHeight = redeemReturns[1]; var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(uuidSTPrime, redeemer, 2, redeemBeneficiary, redeemSTP, unlockHeight, lockR.l); result = await openSTUtility.redeemSTPrime(redeemSTP, redeemBeneficiary, lockR.l, { from: redeemer, value: redeemSTP }); diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index f7e81778..13b195b3 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -250,8 +250,9 @@ contract('OpenSTValue', function(accounts) { nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - var unlockHeight = stakeReturns[2].plus(1); - stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, + //var unlockHeight = stakeReturns[2].plus(1); --test commenting + var unlockHeight = stakeReturns[2]; + stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); @@ -283,7 +284,8 @@ contract('OpenSTValue', function(accounts) { nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - var unlockHeight = stakeReturns[2].plus(1); + //var unlockHeight = stakeReturns[2].plus(1); --test commenting + var unlockHeight = stakeReturns[2]; stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, { from: accounts[0] }); @@ -534,7 +536,8 @@ contract('OpenSTValue', function(accounts) { nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - unlockHeight = stakeReturns[2].plus(1); + //unlockHeight = stakeReturns[2].plus(1); --test commenting + unlockHeight = stakeReturns[2]; stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); @@ -603,7 +606,8 @@ contract('OpenSTValue', function(accounts) { nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - unlockHeight = stakeReturns[2].plus(1); + //unlockHeight = stakeReturns[2].plus(1); + unlockHeight = stakeReturns[2]; stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); From c6fc6ef2ff157e8edd39cd1d31e4a419e167350f Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Wed, 30 May 2018 15:53:40 +0530 Subject: [PATCH 0069/1361] [MOSA-60] restructuring contract event->constants->mappings->dynamic array->structs --- contracts/OpenSTUtility.sol | 109 ++++++++++++++---------------------- contracts/OpenSTValue.sol | 47 ++++++++-------- 2 files changed, 67 insertions(+), 89 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index f1fea45b..74c37b41 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -38,32 +38,6 @@ import "./ProtocolVersioned.sol"; contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { using SafeMath for uint256; - /* - * Structures - */ - struct RegisteredToken { - UtilityTokenInterface token; - address registrar; - } - - struct Mint { - bytes32 uuid; - address staker; - address beneficiary; - uint256 amount; - uint256 expirationHeight; - bytes32 hashLock; - } - - struct Redemption { - bytes32 uuid; - address redeemer; - address beneficiary; - uint256 amountUT; - uint256 unlockHeight; - bytes32 hashLock; - } - /* * Events */ @@ -93,9 +67,10 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { event RevertedRedemption(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, address _redeemer, address _beneficiary, uint256 _amountUT); + /* - * Constants - */ + * Constants + */ // ~2 weeks, assuming ~15s per block uint256 public constant BLOCKS_TO_WAIT_LONG = 80667; // ~1hour, assuming ~15s per block @@ -104,16 +79,10 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /* * Storage */ - /// store address of Simple Token Prime - address public simpleTokenPrime; - bytes32 public uuidSTPrime; - /// restrict (for now) to a single value chain - uint256 public chainIdValue; - /// chainId of the current utility chain - uint256 public chainIdUtility; - address public registrar; - bytes32[] public uuids; - /// registered branded tokens + + /// store the ongoing mints and redemptions + mapping(bytes32 /* stakingIntentHash */ => Mint) public mints; + mapping(bytes32 /* redemptionIntentHash */ => Redemption) public redemptions; mapping(bytes32 /* uuid */ => RegisteredToken) public registeredTokens; /// name reservation is first come, first serve mapping(bytes32 /* hashName */ => address /* requester */) public nameReservation; @@ -126,10 +95,43 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /// chain the nonce need to strictly increase (as one value chain can have multiple /// utility chains) mapping(address /* (un)staker */ => uint256) internal nonces; - /// store the ongoing mints and redemptions - mapping(bytes32 /* stakingIntentHash */ => Mint) public mints; - mapping(bytes32 /* redemptionIntentHash */ => Redemption) public redemptions; + /// store address of Simple Token Prime + address public simpleTokenPrime; + bytes32 public uuidSTPrime; + /// restrict (for now) to a single value chain + uint256 public chainIdValue; + /// chainId of the current utility chain + uint256 public chainIdUtility; + address public registrar; + + bytes32[] public uuids; + /// registered branded tokens + /* + * Structures + */ + struct RegisteredToken { + UtilityTokenInterface token; + address registrar; + } + + struct Mint { + bytes32 uuid; + address staker; + address beneficiary; + uint256 amount; + uint256 expirationHeight; + bytes32 hashLock; + } + + struct Redemption { + bytes32 uuid; + address redeemer; + address beneficiary; + uint256 amountUT; + uint256 unlockHeight; + bytes32 hashLock; + } /* * Modifiers */ @@ -574,31 +576,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { return uuids.length; } - /* - * Registrar functions - */ - /// @dev for v0.9.1 tracking Ethereum mainnet on the utility chain - /// is not a required feature yet, so the core is simplified - /// to uint256 valueChainId as storage on construction - // function addCore( - // CoreInterface _core) - // public - // onlyRegistrar - // returns (bool /* success */) - // { - // require(address(_core) != address(0)); - // // core constructed with same registrar - // require(registrar == _core.registrar()); - // // on utility chain core only tracks a remote value chain - // uint256 coreChainIdValue = _core.chainIdRemote(); - // require(chainIdUtility != 0); - // // cannot overwrite core for given chainId - // require(cores[coreChainIdValue] == address(0)); - - // cores[coreChainIdValue] = _core; - - // return true; - // } /* solhint-disable-next-line separate-by-one-line-in-contract */ function registerBrandedToken( diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 7eea71bd..b975767a 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -74,15 +74,36 @@ contract OpenSTValue is OpsManaged, Hasher { // ~1hour, assuming ~15s per block uint256 private constant BLOCKS_TO_WAIT_SHORT = 240; + + /// register the active stakes and unstakes + mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; + mapping(uint256 /* chainIdUtility */ => CoreInterface) internal cores; + mapping(bytes32 /* uuid */ => UtilityToken) public utilityTokens; + /// nonce makes the staking process atomic across the two-phased process + /// and protects against replay attack on (un)staking proofs during the process. + /// On the value chain nonces need to strictly increase by one; on the utility + /// chain the nonce need to strictly increase (as one value chain can have multiple + /// utility chains) + mapping(address /* (un)staker */ => uint256) internal nonces; + mapping(bytes32 /* hashRedemptionIntent */ => Unstake) public unstakes; + /* + * Storage + */ + uint256 public chainIdValue; + EIP20Interface public valueToken; + address public registrar; + bytes32[] public uuids; + + /* * Structures */ struct UtilityToken { - string symbol; - string name; + string symbol; + string name; uint256 conversionRate; uint8 conversionRateDecimals; - uint8 decimals; + uint8 decimals; uint256 chainIdUtility; SimpleStake simpleStake; address stakingAccount; @@ -109,26 +130,6 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 expirationHeight; bytes32 hashLock; } - - /* - * Storage - */ - uint256 public chainIdValue; - EIP20Interface public valueToken; - address public registrar; - bytes32[] public uuids; - mapping(uint256 /* chainIdUtility */ => CoreInterface) internal cores; - mapping(bytes32 /* uuid */ => UtilityToken) public utilityTokens; - /// nonce makes the staking process atomic across the two-phased process - /// and protects against replay attack on (un)staking proofs during the process. - /// On the value chain nonces need to strictly increase by one; on the utility - /// chain the nonce need to strictly increase (as one value chain can have multiple - /// utility chains) - mapping(address /* (un)staker */ => uint256) internal nonces; - /// register the active stakes and unstakes - mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; - mapping(bytes32 /* hashRedemptionIntent */ => Unstake) public unstakes; - /* * Modifiers */ From 1b56b682969023ba3c757fceb80eddff544a84ea Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Wed, 30 May 2018 21:13:35 +0530 Subject: [PATCH 0070/1361] Adding tests to verify sequence of statements --- contracts/TestContract.sol | 21 ++ package-lock.json | 505 +++++++++++----------------------- package.json | 1 + test/ContractStructureTest.js | 67 +++++ 4 files changed, 247 insertions(+), 347 deletions(-) create mode 100644 contracts/TestContract.sol create mode 100644 test/ContractStructureTest.js diff --git a/contracts/TestContract.sol b/contracts/TestContract.sol new file mode 100644 index 00000000..f5e2335a --- /dev/null +++ b/contracts/TestContract.sol @@ -0,0 +1,21 @@ +pragma solidity ^0.4.0; + +contract TestContract { + + event TestEvent(); + event TestEvent1(); + uint256 public constant BLOCKS_TO_WAIT_LONG = 80667; + uint variable2; + bytes32[] public uuids; + + + struct RegisteredToken { + address token; + address registrar; + } + + constructor(){ + + } + +} diff --git a/package-lock.json b/package-lock.json index 20ffa8fb..f09b23b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,8 +92,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "2.2.1", @@ -725,8 +724,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { "version": "1.2.1", @@ -771,7 +769,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -797,8 +794,7 @@ "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" }, "browserify-aes": { "version": "1.1.1", @@ -986,17 +982,12 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "commondir": { "version": "1.0.1", @@ -1007,8 +998,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-browserify": { "version": "1.1.0", @@ -1083,7 +1073,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "4.1.1", "shebang-command": "1.2.0", @@ -1112,7 +1101,8 @@ "crypto-js": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", + "dev": true }, "d": { "version": "1.0.0", @@ -1141,8 +1131,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "deep-eql": { "version": "0.1.3", @@ -1181,10 +1170,9 @@ } }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" }, "diffie-hellman": { "version": "5.0.2", @@ -1327,8 +1315,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escope": { "version": "3.6.0", @@ -1646,7 +1633,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -1751,24 +1737,10 @@ "for-in": "1.0.2" } }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.1.3", @@ -2929,20 +2901,17 @@ "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -2983,18 +2952,6 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -3040,8 +2997,7 @@ "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hmac-drbg": { "version": "1.0.1", @@ -3092,7 +3048,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -3121,8 +3076,7 @@ "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "is-arrayish": { "version": "0.2.1", @@ -3194,7 +3148,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "1.0.1" } @@ -3232,8 +3185,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-utf8": { "version": "0.2.1", @@ -3250,8 +3202,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "2.1.0", @@ -3295,27 +3246,12 @@ "jsonify": "0.0.0" } }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -3349,15 +3285,6 @@ "is-buffer": "1.1.6" } }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -3368,7 +3295,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, "requires": { "invert-kv": "1.0.0" } @@ -3408,7 +3334,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -3417,8 +3342,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, @@ -3428,80 +3352,6 @@ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -3521,7 +3371,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -3553,7 +3402,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, "requires": { "mimic-fn": "1.1.0" } @@ -3568,12 +3416,6 @@ "readable-stream": "2.3.3" } }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", @@ -3608,8 +3450,7 @@ "mimic-fn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" }, "minimalistic-assert": { "version": "1.0.0", @@ -3627,7 +3468,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.8" } @@ -3635,54 +3475,57 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } }, "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", "requires": { "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", + "glob": "7.1.2", + "growl": "1.10.3", "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", "mkdirp": "0.5.1", - "supports-color": "3.1.2" + "supports-color": "4.4.0" }, "dependencies": { "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { "ms": "2.0.0" } }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "requires": { - "has-flag": "1.0.0" + "has-flag": "2.0.0" } } } @@ -3695,8 +3538,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nan": { "version": "2.8.0", @@ -3759,7 +3601,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "2.0.1" } @@ -3767,8 +3608,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", @@ -3790,17 +3630,10 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } }, - "original-require": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", - "dev": true - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -3831,14 +3664,12 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, "requires": { "p-try": "1.0.0" } @@ -3847,7 +3678,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "1.2.0" } @@ -3855,8 +3685,7 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "pako": { "version": "1.0.6", @@ -3916,14 +3745,12 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-type": { "version": "1.1.0", @@ -3949,6 +3776,11 @@ "sha.js": "2.4.9" } }, + "pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4012,8 +3844,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "public-encrypt": { "version": "4.0.0", @@ -4258,20 +4089,12 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "right-align": { "version": "0.1.3", @@ -4282,15 +4105,6 @@ "align-text": "0.1.4" } }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.1" - } - }, "ripemd160": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", @@ -4315,8 +4129,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", @@ -4344,7 +4157,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -4352,14 +4164,12 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { "version": "1.0.0", @@ -4367,72 +4177,106 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, - "solc": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.18.tgz", - "integrity": "sha512-Kq+O3PNF9Pfq7fB+lDYAuoqRdghLmZyfngsg0h1Hj38NKAeVHeGPOGeZasn5KqdPeCzbMFvaGyTySxzGv6aXCg==", - "dev": true, + "solparse": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", + "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.4.1", - "yargs": "4.8.1" + "mocha": "4.1.0", + "pegjs": "0.10.0", + "yargs": "10.1.2" }, "dependencies": { - "camelcase": { + "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", "wrap-ansi": "2.1.0" } }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "requires": { - "cliui": "3.2.0", + "cliui": "4.1.0", "decamelize": "1.2.0", + "find-up": "2.1.0", "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", + "os-locale": "2.1.0", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", + "string-width": "2.1.1", + "which-module": "2.0.0", "y18n": "3.2.1", - "yargs-parser": "2.4.1" + "yargs-parser": "8.1.0" } }, "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" + "camelcase": "4.1.0" } } } @@ -4506,7 +4350,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -4526,7 +4369,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -4543,8 +4385,7 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "supports-color": { "version": "2.0.0", @@ -4585,17 +4426,6 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "truffle": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.4.tgz", - "integrity": "sha512-keAkRNNfU3W7yUMRDF3YHoqmqdv6TChXY0g+RuPpxnRHfspXVtIKwuN2pV07jzY/RbDsIKShcSyF7VBV7eZUvg==", - "dev": true, - "requires": { - "mocha": "3.5.3", - "original-require": "1.0.1", - "solc": "0.4.18" - } - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -4672,7 +4502,8 @@ "utf8": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", + "dev": true }, "util": { "version": "0.10.3", @@ -4718,23 +4549,6 @@ "graceful-fs": "4.1.11" } }, - "web3": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.2.tgz", - "integrity": "sha1-xU2sX8DjdzmcBMGm7LsS5FEyeNY=", - "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" - } - } - }, "webpack": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", @@ -4797,7 +4611,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -4824,7 +4637,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { "string-width": "1.0.2", "strip-ansi": "3.0.1" @@ -4833,18 +4645,19 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xhr2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=", + "dev": true }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true }, "xtend": { "version": "4.0.1", @@ -4855,14 +4668,12 @@ "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "6.6.0", diff --git a/package.json b/package.json index c4e140b1..7a5db47d 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "bignumber.js": "^4.1.0", "keccak": "^1.4.0", "moment": "^2.19.2", + "solparse": "^2.2.5", "web3": "^1.0.0-beta.33" }, "devDependencies": { diff --git a/test/ContractStructureTest.js b/test/ContractStructureTest.js new file mode 100644 index 00000000..cc8ea1cd --- /dev/null +++ b/test/ContractStructureTest.js @@ -0,0 +1,67 @@ +let SolidityParser = require("solparse"); + + +function getContract(result) { + return result.body.filter(e => { + if (e.type === "ContractStatement") { + return e; + } + }); +} + +function checkElementType(element) { + if (element.type === "EventDeclaration") { + return 'event'; + } + if (element.type === "StateVariableDeclaration" && element.is_constant) { + return 'constant'; + } + if (element.type === "StateVariableDeclaration" && typeof(element.literal.literal) === 'object' && element.literal.literal.type === "MappingExpression") { + return 'mapping'; + } + + if (element.type === "StateVariableDeclaration" && typeof(element.literal.literal) === 'string' && element.literal.array_parts.length > 0) { + return 'array'; + } + if (element.type === "StateVariableDeclaration" && typeof(element.literal.literal) === 'string') { + return 'variable'; + } + if (element.type === "StructDeclaration") { + return "struct"; + } + return "unknown"; + +} + +describe('Contract Structure Test', async () => { + let validSequence = ["event", "constant", "mapping", "variable", "array", "struct"]; + let types; + before(async () => { + let result = SolidityParser.parseFile("./contracts/TestContract.sol"); + let contract = getContract(result); + let contractBody = contract[0].body; + types = contractBody.map(element => checkElementType(element)).filter(t => t !== 'unknown'); + }); + + for (let i = 0; i < validSequence.length; i++) { + + it('Verify ' + validSequence[i] + ' is declared at right position', async () => { + let currentTypePosition = -1; + let nonCurrentTypePosition = -1; + for (let t = 0; t < types.length; t++) { + if (validSequence[i] === types[t]) { + currentTypePosition = t; + } + else if (validSequence.indexOf(types[t]) > i) { + nonCurrentTypePosition = t; + } + + let message = types[nonCurrentTypePosition] + " is declared before " + types[currentTypePosition]; + assert.equal(nonCurrentTypePosition > -1 && currentTypePosition == -1, false, message) //check if noncurrent type is defined but current type is not defined + assert.equal(nonCurrentTypePosition > currentTypePosition || nonCurrentTypePosition == -1, true, message) + } + + }); + } + +}); \ No newline at end of file From 462ee4fc645d218a19e2241af99e798fc4f76dc8 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Thu, 31 May 2018 18:52:02 +0530 Subject: [PATCH 0071/1361] Adding test case to test variable postions in utility and value contract --- contracts/TestContract.sol | 21 ---------- test/ContractStructureTest.js | 79 +++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 47 deletions(-) delete mode 100644 contracts/TestContract.sol diff --git a/contracts/TestContract.sol b/contracts/TestContract.sol deleted file mode 100644 index f5e2335a..00000000 --- a/contracts/TestContract.sol +++ /dev/null @@ -1,21 +0,0 @@ -pragma solidity ^0.4.0; - -contract TestContract { - - event TestEvent(); - event TestEvent1(); - uint256 public constant BLOCKS_TO_WAIT_LONG = 80667; - uint variable2; - bytes32[] public uuids; - - - struct RegisteredToken { - address token; - address registrar; - } - - constructor(){ - - } - -} diff --git a/test/ContractStructureTest.js b/test/ContractStructureTest.js index cc8ea1cd..604edf69 100644 --- a/test/ContractStructureTest.js +++ b/test/ContractStructureTest.js @@ -9,7 +9,7 @@ function getContract(result) { }); } -function checkElementType(element) { +function checkElementDataType(element) { if (element.type === "EventDeclaration") { return 'event'; } @@ -33,35 +33,62 @@ function checkElementType(element) { } -describe('Contract Structure Test', async () => { - let validSequence = ["event", "constant", "mapping", "variable", "array", "struct"]; - let types; - before(async () => { - let result = SolidityParser.parseFile("./contracts/TestContract.sol"); - let contract = getContract(result); - let contractBody = contract[0].body; - types = contractBody.map(element => checkElementType(element)).filter(t => t !== 'unknown'); - }); +function isDataTypeDeclaredInContract(dataTypesInContract, currentDataType) { + return dataTypesInContract.indexOf(currentDataType) !== -1; +} - for (let i = 0; i < validSequence.length; i++) { +function getContracVariables(parsedFile) { - it('Verify ' + validSequence[i] + ' is declared at right position', async () => { - let currentTypePosition = -1; - let nonCurrentTypePosition = -1; - for (let t = 0; t < types.length; t++) { - if (validSequence[i] === types[t]) { - currentTypePosition = t; - } - else if (validSequence.indexOf(types[t]) > i) { - nonCurrentTypePosition = t; - } + let contract = getContract(parsedFile); + return contract[0].body; +} + +function getListOfDataTypesInContract(file,) { + + let parsedFile = SolidityParser.parseFile(file.path); + let contractBody = getContracVariables(parsedFile); + return contractBody.map(element => checkElementDataType(element)).filter(t => t !== 'unknown'); +} - let message = types[nonCurrentTypePosition] + " is declared before " + types[currentTypePosition]; - assert.equal(nonCurrentTypePosition > -1 && currentTypePosition == -1, false, message) //check if noncurrent type is defined but current type is not defined - assert.equal(nonCurrentTypePosition > currentTypePosition || nonCurrentTypePosition == -1, true, message) - } +describe('Contract Structure Test', async () => { - }); + let validSequence = ["event", "constant", "mapping", "variable", "array", "struct"]; +//todo We can extend this test for all the solidity contracts. + const files = [{ + name: "OpenSTUtility.sol", + path: "./contracts/OpenSTUtility.sol" } + , { + name: "OpenSTValue.sol", + path: "./contracts/OpenSTValue.sol" + } + ]; + + + files.map(file => { + let dataTypesInContract = getListOfDataTypesInContract(file); + for (let i = 0; i < validSequence.length; i++) { + it('In ' + file.name + ' verify ' + validSequence[i] + ' is declared at right position', async () => { + let currentDataType = validSequence[i]; + if (isDataTypeDeclaredInContract(dataTypesInContract, currentDataType)) { + let currentDatatypePosition = -1; + let nonCurrentDataTypePosition = -1; + for (let t = 0; t < dataTypesInContract.length; t++) { + if (currentDataType === dataTypesInContract[t]) { + currentDatatypePosition = t; + } + else if (validSequence.indexOf(dataTypesInContract[t]) > i) { + nonCurrentDataTypePosition = t; + } + let message = `${dataTypesInContract[nonCurrentDataTypePosition]} is declared before ${currentDataType}`; + //check if non current datatype is not defined before current type + assert.equal(nonCurrentDataTypePosition > -1 && currentDatatypePosition === -1, false, message); + //non current data type should be defined after current data type + assert.equal(nonCurrentDataTypePosition > currentDatatypePosition || nonCurrentDataTypePosition === -1, true, message); + } + } + }); + } + }); }); \ No newline at end of file From 2c21b15185a28e7f1aad38681b8150707d1b2b8f Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Thu, 31 May 2018 18:58:34 +0530 Subject: [PATCH 0072/1361] Correcting type in method name --- test/ContractStructureTest.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ContractStructureTest.js b/test/ContractStructureTest.js index 604edf69..bf0a47e5 100644 --- a/test/ContractStructureTest.js +++ b/test/ContractStructureTest.js @@ -37,7 +37,7 @@ function isDataTypeDeclaredInContract(dataTypesInContract, currentDataType) { return dataTypesInContract.indexOf(currentDataType) !== -1; } -function getContracVariables(parsedFile) { +function getContractVariables(parsedFile) { let contract = getContract(parsedFile); return contract[0].body; @@ -46,7 +46,7 @@ function getContracVariables(parsedFile) { function getListOfDataTypesInContract(file,) { let parsedFile = SolidityParser.parseFile(file.path); - let contractBody = getContracVariables(parsedFile); + let contractBody = getContractVariables(parsedFile); return contractBody.map(element => checkElementDataType(element)).filter(t => t !== 'unknown'); } From 58dd28d1d8e1068f299eca9f9afaee4fc7e68c30 Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Fri, 1 Jun 2018 12:31:02 +0530 Subject: [PATCH 0073/1361] Added for merkle proof verification --- contracts/OpenSTUtility.sol | 50 +++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index f1fea45b..9584b3cd 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -32,7 +32,7 @@ import "./STPrimeConfig.sol"; import "./BrandedToken.sol"; import "./UtilityTokenInterface.sol"; import "./ProtocolVersioned.sol"; - +import "./Core.sol"; /// @title OpenST Utility contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { @@ -75,7 +75,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint8 _conversionRateDecimals, address _requester); event StakingIntentConfirmed(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, - address _staker, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight); + address _staker, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight,bytes32 blockHeight,bytes32 storageRoot); event ProcessedMint(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, address _token, address _staker, address _beneficiary, uint256 _amount, bytes32 _unlockSecret); @@ -112,6 +112,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /// chainId of the current utility chain uint256 public chainIdUtility; address public registrar; + CoreInterface public core; bytes32[] public uuids; /// registered branded tokens mapping(bytes32 /* uuid */ => RegisteredToken) public registeredTokens; @@ -142,18 +143,19 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { constructor( uint256 _chainIdValue, uint256 _chainIdUtility, - address _registrar) + address _registrar, + CoreInterface _core ) public OpsManaged() { require(_chainIdValue != 0); require(_chainIdUtility != 0); require(_registrar != address(0)); - + require(_core != address(0),"CoreInterface address cannot be null"); chainIdValue = _chainIdValue; chainIdUtility = _chainIdUtility; registrar = _registrar; - + core = _core; uuidSTPrime = hashUuid( STPRIME_SYMBOL, STPRIME_NAME, @@ -185,6 +187,32 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { // @dev read STPrime address and uuid from contract } + /* + * Registrar functions + */ + function addCore( + CoreInterface _core) + public + onlyRegistrar + returns (bool /* success */) + { + require(address(_core) != address(0)); + // core constructed with same registrar + require(registrar == _core.registrar()); + // on value chain core only tracks a remote utility chain + uint256 chainIdUtility = _core.chainIdRemote(); + require(chainIdUtility != 0); + // cannot overwrite core for given chainId + require(cores[chainIdUtility] == address(0)); + + cores[chainIdUtility] = _core; + + return true; + } + + + + /* * External functions */ @@ -197,9 +225,10 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { uint256 _amountUT, uint256 _stakingUnlockHeight, bytes32 _hashLock, - bytes32 _stakingIntentHash) + bytes32 _stakingIntentHash, + bytes32 _blockHeight, + bytes rlpParentNodes) external - onlyRegistrar returns (uint256 expirationHeight) { require(address(registeredTokens[_uuid].token) != address(0)); @@ -211,9 +240,9 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_stakingUnlockHeight > 0); require(_stakingIntentHash != ""); + expirationHeight = block.number + blocksToWaitShort(); nonces[_staker] = _stakerNonce; - bytes32 stakingIntentHash = hashStakingIntent( _uuid, _staker, @@ -225,7 +254,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _hashLock ); - require(stakingIntentHash == _stakingIntentHash); + bytes32 storageRoot = core.getStorageRoot(_blockHeight); + require(core.verify(stakingIntentHash,hash(staker,stakerNonce) ,rlpParentNodes,storageRoot)); mints[stakingIntentHash] = Mint({ uuid: _uuid, @@ -237,7 +267,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { }); emit StakingIntentConfirmed(_uuid, stakingIntentHash, _staker, _beneficiary, _amountST, - _amountUT, expirationHeight); + _amountUT, expirationHeight, _blockHeight ,storageRoot); return expirationHeight; } From c210dd64600165817f9f8f527a438ba05a0d1689 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Fri, 1 Jun 2018 13:01:58 +0530 Subject: [PATCH 0074/1361] Adding Proof library contracts --- contracts/proof/MerklePatriciaProof.sol | 198 ++++++++++++ contracts/proof/RLP.sol | 389 ++++++++++++++++++++++++ contracts/proof/util.sol | 210 +++++++++++++ 3 files changed, 797 insertions(+) create mode 100644 contracts/proof/MerklePatriciaProof.sol create mode 100644 contracts/proof/RLP.sol create mode 100644 contracts/proof/util.sol diff --git a/contracts/proof/MerklePatriciaProof.sol b/contracts/proof/MerklePatriciaProof.sol new file mode 100644 index 00000000..ba91b07f --- /dev/null +++ b/contracts/proof/MerklePatriciaProof.sol @@ -0,0 +1,198 @@ +/* + * @title MerklePatriciaVerifier + * @author Sam Mayo (sammayo888@gmail.com) + * + * @dev Library for verifing merkle patricia proofs. + */ + +pragma solidity ^0.4.23; + +import "./RLP.sol"; + +library MerklePatriciaProof { + /* + * @dev Verifies a merkle patricia proof. + * @param value The terminating value in the trie. + * @param encodedPath The path in the trie leading to value. + * @param rlpParentNodes The rlp encoded stack of nodes. + * @param root The root hash of the trie. + * @return The boolean validity of the proof. + */ + function verify(bytes32 value, bytes encodedPath, bytes rlpParentNodes, bytes32 root) internal pure returns (bool) { + RLP.RLPItem memory item = RLP.toRLPItem(rlpParentNodes); + RLP.RLPItem[] memory parentNodes = RLP.toList(item); + + bytes memory currentNode; + RLP.RLPItem[] memory currentNodeList; + + bytes32 nodeKey = root; + uint pathPtr = 0; + + bytes memory path = _getNibbleArray2(encodedPath); + if(path.length == 0) {return false;} + + for (uint i=0; i path.length) {return false;} + + currentNode = RLP.toBytes(parentNodes[i]); + if(nodeKey != keccak256(currentNode)) {return false;} + currentNodeList = RLP.toList(parentNodes[i]); + + if(currentNodeList.length == 17) { + if(pathPtr == path.length) { + if(keccak256(RLP.toBytes(currentNodeList[16])) == value) { + return true; + } else { + return false; + } + } + + uint8 nextPathNibble = uint8(path[pathPtr]); + if(nextPathNibble > 16) {return false;} + nodeKey = RLP.toBytes32(currentNodeList[nextPathNibble]); + pathPtr += 1; + } else if(currentNodeList.length == 2) { + pathPtr += _nibblesToTraverse(RLP.toData(currentNodeList[0]), path, pathPtr); + + if(pathPtr == path.length) {//leaf node + if(keccak256(RLP.toData(currentNodeList[1])) == value) { + return true; + } else { + return false; + } + } + //extension node ... test if means that it is empty value + if(_nibblesToTraverse(RLP.toData(currentNodeList[0]), path, pathPtr) == 0) { + return (keccak256() == value); + } + + nodeKey = RLP.toBytes32(currentNodeList[1]); + } else { + return false; + } + } + } + + function verifyDebug(bytes32 value, bytes not_encodedPath, bytes rlpParentNodes, bytes32 root) internal pure returns (bool res, uint loc, bytes path_debug) { + RLP.RLPItem memory item = RLP.toRLPItem(rlpParentNodes); + RLP.RLPItem[] memory parentNodes = RLP.toList(item); + + bytes memory currentNode; + RLP.RLPItem[] memory currentNodeList; + + bytes32 nodeKey = root; + uint pathPtr = 0; + + bytes memory path = _getNibbleArray2(not_encodedPath); + path_debug = path; + if(path.length == 0) { loc = 0; res = false; return;} + + for (uint i=0; i path.length) {loc = 1; res = false; return;} + + currentNode = RLP.toBytes(parentNodes[i]); + if(nodeKey != keccak256(currentNode)) { res = false; loc = 100+i; return;} + currentNodeList = RLP.toList(parentNodes[i]); + + loc = currentNodeList.length; + + if(currentNodeList.length == 17) { + if(pathPtr == path.length) { + if(keccak256(RLP.toBytes(currentNodeList[16])) == value) { + res = true; return; + } else { + loc = 3; + return; + } + } + + uint8 nextPathNibble = uint8(path[pathPtr]); + if(nextPathNibble > 16) { + loc = 4; + return; } + nodeKey = RLP.toBytes32(currentNodeList[nextPathNibble]); + pathPtr += 1; + } else if(currentNodeList.length == 2) { + pathPtr += _nibblesToTraverse(RLP.toData(currentNodeList[0]), path, pathPtr); + + if(pathPtr == path.length) {//leaf node + if(keccak256(RLP.toData(currentNodeList[1])) == value) { + res = true; return; + } else { + loc = 5; + return; + } + } + //extension node + if(_nibblesToTraverse(RLP.toData(currentNodeList[0]), path, pathPtr) == 0) { + loc = 6; + res = (keccak256() == value); + return; + } + + nodeKey = RLP.toBytes32(currentNodeList[1]); + } else { + loc = 7; + return; + } + } + loc = 8; + return; + } + + function _nibblesToTraverse(bytes encodedPartialPath, bytes path, uint pathPtr) private pure returns (uint) { + uint len; + // encodedPartialPath has elements that are each two hex characters (1 byte), but partialPath + // and slicedPath have elements that are each one hex character (1 nibble) + bytes memory partialPath = _getNibbleArray(encodedPartialPath); + bytes memory slicedPath = new bytes(partialPath.length); + + // pathPtr counts nibbles in path + // partialPath.length is a number of nibbles + for(uint i=pathPtr; i0) { + uint8 offset; + uint8 hpNibble = uint8(_getNthNibbleOfBytes(0,b)); + if(hpNibble == 1 || hpNibble == 3) { + nibbles = new bytes(b.length*2-1); + byte oddNibble = _getNthNibbleOfBytes(1,b); + nibbles[0] = oddNibble; + offset = 1; + } else { + nibbles = new bytes(b.length*2-2); + offset = 0; + } + + for(uint i=offset; i 32 || len == 0) + revert(); + assembly { + data := div(mload(rStartPos), exp(256, sub(32, len))) + } + } + + /// @dev Decode an RLPItem into a boolean. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toBool(RLPItem memory self) internal pure returns (bool data) { + require(isData(self)); + var (rStartPos, len) = _decode(self); + require(len == 1); + uint temp; + assembly { + temp := byte(0, mload(rStartPos)) + } + require (temp <= 1); + return temp == 1 ? true : false; + } + + /// @dev Decode an RLPItem into a byte. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toByte(RLPItem memory self) internal pure returns (byte data) { + require(isData(self)); + var (rStartPos, len) = _decode(self); + require(len == 1); + uint temp; + assembly { + temp := byte(0, mload(rStartPos)) + } + return byte(temp); + } + + /// @dev Decode an RLPItem into an int. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toInt(RLPItem memory self) internal pure returns (int data) { + return int(toUint(self)); + } + + /// @dev Decode an RLPItem into a bytes32. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toBytes32(RLPItem memory self) internal pure returns (bytes32 data) { + return bytes32(toUint(self)); + } + + /// @dev Decode an RLPItem into an address. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toAddress(RLPItem memory self) internal pure returns (address data) { + require(isData(self)); + var (rStartPos, len) = _decode(self); + require (len == 20); + assembly { + data := div(mload(rStartPos), exp(256, 12)) + } + } + + // Get the payload offset. + function _payloadOffset(RLPItem memory self) private pure returns (uint) { + if(self._unsafe_length == 0) + return 0; + uint b0; + uint memPtr = self._unsafe_memPtr; + assembly { + b0 := byte(0, mload(memPtr)) + } + if(b0 < DATA_SHORT_START) + return 0; + if(b0 < DATA_LONG_START || (b0 >= LIST_SHORT_START && b0 < LIST_LONG_START)) + return 1; + if(b0 < LIST_SHORT_START) + return b0 - DATA_LONG_OFFSET + 1; + return b0 - LIST_LONG_OFFSET + 1; + } + + // Get the full length of an RLP item. + function _itemLength(uint memPtr) private pure returns (uint len) { + uint b0; + assembly { + b0 := byte(0, mload(memPtr)) + } + if (b0 < DATA_SHORT_START) + len = 1; + else if (b0 < DATA_LONG_START) + len = b0 - DATA_SHORT_START + 1; + else if (b0 < LIST_SHORT_START) { + assembly { + let bLen := sub(b0, 0xB7) // bytes length (DATA_LONG_OFFSET) + let dLen := div(mload(add(memPtr, 1)), exp(256, sub(32, bLen))) // data length + len := add(1, add(bLen, dLen)) // total length + } + } + else if (b0 < LIST_LONG_START) + len = b0 - LIST_SHORT_START + 1; + else { + assembly { + let bLen := sub(b0, 0xF7) // bytes length (LIST_LONG_OFFSET) + let dLen := div(mload(add(memPtr, 1)), exp(256, sub(32, bLen))) // data length + len := add(1, add(bLen, dLen)) // total length + } + } + } + + // Get start position and length of the data. + function _decode(RLPItem memory self) private pure returns (uint memPtr, uint len) { + require(isData(self)); + uint b0; + uint start = self._unsafe_memPtr; + assembly { + b0 := byte(0, mload(start)) + } + if (b0 < DATA_SHORT_START) { + memPtr = start; + len = 1; + return; + } + if (b0 < DATA_LONG_START) { + len = self._unsafe_length - 1; + memPtr = start + 1; + } else { + uint bLen; + assembly { + bLen := sub(b0, 0xB7) // DATA_LONG_OFFSET + } + len = self._unsafe_length - 1 - bLen; + memPtr = start + bLen + 1; + } + return; + } + + // Assumes that enough memory has been allocated to store in target. + function _copyToBytes(uint btsPtr, bytes memory tgt, uint btsLen) private pure { + // Exploiting the fact that 'tgt' was the last thing to be allocated, + // we can write entire words, and just overwrite any excess. + assembly { + let i := 0 // Start at arr + 0x20 + let stopOffset := add(btsLen, 31) + let rOffset := btsPtr + let wOffset := add(tgt, 32) + for {} lt(i, stopOffset) { i := add(i, 32) } + { + mstore(add(wOffset, i), mload(add(rOffset, i))) + } + } + } + + // Check that an RLP item is valid. + function _validate(RLPItem memory self) private pure returns (bool ret) { + // Check that RLP is well-formed. + uint b0; + uint b1; + uint memPtr = self._unsafe_memPtr; + assembly { + b0 := byte(0, mload(memPtr)) + b1 := byte(1, mload(memPtr)) + } + if(b0 == DATA_SHORT_START + 1 && b1 < DATA_SHORT_START) + return false; + return true; + } +} diff --git a/contracts/proof/util.sol b/contracts/proof/util.sol new file mode 100644 index 00000000..39e5a043 --- /dev/null +++ b/contracts/proof/util.sol @@ -0,0 +1,210 @@ +pragma solidity ^0.4.23; + +contract Util { + + function bytesToNibbles(bytes str) internal pure returns (uint8[]) { + uint8[] memory res = new uint8[](str.length*2); + for (uint i = 0; i < str.length; i++) { + uint8 elem = uint8(str[i]); + res[i*2] = (elem / 16) & 15; + res[i*2+1] = elem & 15; + } + return res; + } + + function bytesToBytes32(bytes rlp) internal pure returns (bytes32) { + bytes32 res; + assembly { + res := mload(add(32,rlp)) + } + return res; + } + + function bytes32ToBytes(bytes32 a) internal pure returns (bytes) { + bytes memory res = new bytes(32); + assembly { + mstore(add(32,res), a) + } + return res; + } + + function readSize(bytes rlp, uint idx, uint len) public pure returns (uint) { + uint res = 0; + for (uint i = 0; i < len; i++) res = 256*res + uint8(rlp[idx+i]); + return res; + } + + function readInteger(bytes rlp) public pure returns (uint) { + if (rlp.length == 0) return 0; + uint8 elem = uint8(rlp[0]); + if (elem < 128) return elem; + return readSize(rlp, 1, elem-128); + } + + // length in bytes of the RLP element starting at position idx + function rlpByteLength(bytes rlp, uint idx) public pure returns (uint, uint) { + uint8 elem = uint8(rlp[idx]); + if (elem < 128) return (1, 0); + if (elem == 128) return (0, 1); + if (elem >= 247) { + return (readSize(rlp, idx+1, elem-247), elem-247+1); + } + if (elem >= 192) { + return (elem - 192, 1); + } + if (elem >= 183) { + return (readSize(rlp, idx+1, elem-183), elem-183+1); + } + return (elem - 128, 1); + } + + function rlpSizeLength(bytes rlp, uint idx) public pure returns (uint) { + uint8 elem = uint8(rlp[idx]); + if (elem < 128) return 0; + if (elem == 128) return 1; + if (elem >= 247) { + return elem-247+1; + } + if (elem >= 192) { + return 1; + } + if (elem >= 183) { + return elem-183+1; + } + return 1; + } + + // length in bytes of the RLP element starting at position idx + function rlpByteSkipLength(bytes rlp, uint idx) public pure returns (uint) { + uint8 elem = uint8(rlp[idx]); + if (elem < 128) return 1; + if (elem == 128) return 1; + if (elem >= 247) { + return (readSize(rlp, idx+1, elem-247) + elem-247+1); + } + if (elem >= 192) { + return (elem - 192 + 1); + } + if (elem >= 183) { + return (readSize(rlp, idx+1, elem-183) + elem-183+1); + } + return (elem - 128 + 1); + } + + // how many elements in an RLP array + function rlpArrayLength(bytes rlp, uint idx) public pure returns (uint) { + uint len; + uint szlen; + (len, szlen) = rlpByteLength(rlp, idx); + if (len == 0) return 0; + uint jdx = idx+szlen; + uint res = 0; + while (jdx < len+idx+szlen) { + jdx += rlpByteSkipLength(rlp, jdx); + res++; + } + return res; + } + + function sliceBytes(bytes b, uint idx, uint len) internal pure returns (bytes) { + bytes memory res = new bytes(len); + for (uint i = 0; i < len; i++) res[i] = b[idx+i]; + return res; + } + + function slice(uint8[] storage b, uint idx, uint len) internal view returns (uint8[]) { + uint8[] memory res = new uint8[](len); + for (uint i = 0; i < len; i++) res[i] = b[idx+i]; + return res; + } + + function rlpFindBytes(bytes memory rlp, uint n) public pure returns (bytes) { + uint idx = rlpSizeLength(rlp, 0); + for (uint i = 0; i < n; i++) { + idx += rlpByteSkipLength(rlp, idx); + } + return sliceBytes(rlp, idx, rlpByteSkipLength(rlp, idx)); + } + + function integerLength(uint n) public pure returns (uint8) { + uint8 res = 0; + while (n != 0) { + n = n/256; + res++; + } + return res; + } + + function arrayPrefix(uint len) public pure returns (bytes) { + if (len < 56) { + bytes memory res = new bytes(1); + res[0] = byte(len+192); + return res; + } + else { + uint ilen = integerLength(len); + bytes memory res2 = new bytes(1+ilen); + res2[0] = byte(247+ilen); + for (uint i = 1; i < ilen+1; i++) { + res2[ilen-i+1] = byte(len&0xff); + len = len/256; + } + return res2; + } + } + + function rlpInteger(uint n) public pure returns (bytes) { + bytes memory res; + if (n == 0) { + res = new bytes(1); + res[0] = 0x80; + return res; + } + if (n < 128) { + res = new bytes(1); + res[0] = byte(uint8(n)); + return res; + } + uint ilen = integerLength(n); + res = new bytes(1+ilen); + res[0] = byte(128+ilen); + for (uint i = 1; i < ilen; i++) { + res[ilen-i] = byte(n&0xff); + n = n/256; + } + return res; + } + + // unmangle HP encoding to boolean value and nibbles + function unhp(bytes b) internal pure returns (bool tval, uint8[] res) { + uint8 elem = uint8(b[0]); + uint8 flag = elem/16; + tval = (flag & 0x2 == 1); + bool even = (flag & 0x1 == 0); + uint len = ((b.length-1) / 2) + (even ? 0 : 1); + res = new uint8[](len); + uint idx = 0; + if (!even) { + idx = 1; + res[0] = elem&0xf; + } + for (uint i = 1; i < b.length; i++) { + uint8 elem1 = uint8(b[i]); + res[idx+i*2] = (elem1 / 16) & 15; + res[idx+i*2+1] = elem1 & 15; + } + } + + function matchingNibbleLength(uint8[] a, uint8[] b) internal pure returns (uint) { + uint len = a.length > b.length ? b.length : a.length; + for (uint i = 0; i < len; i++) { + if (a[i] != b[i]) return i; + } + return i; + } + + + +} + + From 5060b991bc318012271d7f7b0a2942066377d0d8 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Fri, 1 Jun 2018 13:52:07 +0530 Subject: [PATCH 0075/1361] Adding v.0.9.3/develop to build --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 196b8578..aa859243 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ branches: - master - develop - gate/develop + - v0.9.3/develop notifications: email: recipients: From 2814e9ed596f65c0253203519296c80d67befd1f Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Fri, 1 Jun 2018 16:31:48 +0530 Subject: [PATCH 0076/1361] [MOSA-91] Added commitStateRoot and commitStorageRoot functions --- contracts/Core.sol | 76 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 10 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index d4c6ad44..c77f4268 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -29,29 +29,43 @@ import "./CoreInterface.sol"; contract Core is CoreInterface { /* - * Structures - */ - // struct stakeTokenTuple { - // address stake; - // address token; - // } + * Events + */ + event CommittedStateRoot(uint256 blockHeight, bytes32 stateRoot); + + event CommittedStorageRoot(uint256 blockHeight, bytes32 storageRoot); + + /** Mapping of block height to state root of the block. */ + mapping (uint /* block height */ => bytes32) public stateRoots; + /** Mapping of block height to storafe root of the block. */ + mapping (uint /* block height */ => bytes32) public storageRoots; + // mapping(bytes32 => address) stakeTokenTuple; /* * Storage */ - /// registrar registers for the two chains - address private coreRegistrar; /// chainIdOrigin stores the chainId this chain uint256 private coreChainIdOrigin; /// chainIdRemote stores the chainId of the remote chain uint256 private coreChainIdRemote; + /// Latest block height of block which state root was committed. + uint256 public latestStateRootBlockHeight; + /// Latest block height of block which storage root was committed. + uint256 public latestStorageRootBlockHeight; /// OpenST remote is the address of the OpenST contract /// on the remote chain address private coreOpenSTRemote; - // /// - // mapping(bytes32 => address) stakeTokenTuple; + /// registrar registers for the two chains + address private coreRegistrar; + /* + * Structures + */ + // struct stakeTokenTuple { + // address stake; + // address token; + // } /* * Public functions @@ -71,6 +85,10 @@ contract Core is CoreInterface { coreChainIdOrigin = _chainIdOrigin; coreChainIdRemote = _chainIdRemote; coreOpenSTRemote = _openSTRemote; + + // Initialize + latestStateRootBlockHeight = 0; + latestStorageRootBlockHeight = 0; } /* @@ -99,4 +117,42 @@ contract Core is CoreInterface { { return coreOpenSTRemote; } + + /** + * Commit new state root for a block height + * + */ + function commitStateRoot( + uint256 _blockHeight, + bytes32 _stateRoot) + external + returns(bytes32 stateRoot) + { + require(_blockHeight > latestStateRootBlockHeight, "Given Block height is lower than latestBlockHeight."); + stateRoots[_blockHeight] = _stateRoot; + latestStateRootBlockHeight = _blockHeight; + + emit CommittedStateRoot(_blockHeight, _stateRoot); + + return stateRoot; + } + + /** + * Commit new storage root for a block height + * + */ + function commitStorageRoot( + uint256 _blockHeight, + bytes32 _storageRoot) + external + returns(bytes32 storageRoot) + { + require(_blockHeight > latestStorageRootBlockHeight, "Given Block height is lower than latestBlockHeight."); + storageRoots[_blockHeight] = _storageRoot; + latestStorageRootBlockHeight = _blockHeight; + + emit CommittedStorageRoot(_blockHeight, _storageRoot); + + return _storageRoot; + } } \ No newline at end of file From d8597c58fe7b6badd9cd41d8063f3da0a3c15c64 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 1 Jun 2018 17:14:57 +0530 Subject: [PATCH 0077/1361] initial commit --- contracts/OpenSTValue.sol | 40 +++++++- contracts/Test.sol | 21 ++++ contracts/proof/BytesLib.sol | 174 ++++++++++++++++++++++++++++++++++ contracts/proof/RLPEncode.sol | 77 +++++++++++++++ 4 files changed, 307 insertions(+), 5 deletions(-) create mode 100644 contracts/Test.sol create mode 100644 contracts/proof/BytesLib.sol create mode 100644 contracts/proof/RLPEncode.sol diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 2a645645..3fa7f52b 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -32,6 +32,11 @@ import "./ProtocolVersioned.sol"; // value chain contracts import "./SimpleStake.sol"; +// proof libraries +import "./proof/MerklePatriciaProof.sol"; +import "./proof/RLPEncode.sol"; +import "./proof/BytesLib.sol"; + /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is OpsManaged, Hasher { @@ -129,6 +134,8 @@ contract OpenSTValue is OpsManaged, Hasher { mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; mapping(bytes32 /* hashRedemptionIntent */ => Unstake) public unstakes; + constant private storageIndex = 3; + /* * Modifiers */ @@ -293,6 +300,17 @@ contract OpenSTValue is OpsManaged, Hasher { return (uuid, amountST, staker); } + function getStoragePath( + uint256 _index, + bytes32 _key) + returns(bytes32 path) + { + bytes memory indexBytes = bytes32ToBytes(bytes32(_index)); + bytes memory keyBytes = bytes32ToBytes(_key); + bytes key = BytesLib.concat(indexBytes, keyBytes); + path = keccak256(key); + return path; + } function confirmRedemptionIntent( bytes32 _uuid, address _redeemer, @@ -301,12 +319,13 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 _amountUT, uint256 _redemptionUnlockHeight, bytes32 _hashLock, - bytes32 _redemptionIntentHash) + uint256 _blockHeight, + bytes _rlpParentNodes) external - onlyRegistrar returns ( uint256 amountST, - uint256 expirationHeight) + uint256 expirationHeight, + bytes32 storageRoot) { require(utilityTokens[_uuid].simpleStake != address(0)); require(_amountUT > 0); @@ -329,8 +348,7 @@ contract OpenSTValue is OpsManaged, Hasher { _hashLock ); - require(_redemptionIntentHash == redemptionIntentHash); - + //require(_redemptionIntentHash == redemptionIntentHash); expirationHeight = block.number + blocksToWaitShort(); UtilityToken storage utilityToken = utilityTokens[_uuid]; @@ -341,6 +359,18 @@ contract OpenSTValue is OpsManaged, Hasher { require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); + storageRoot = cores[utilityTokens[_uuid].chainIdUtility].storageRoot(_blockHeight); + + bytes32 key = keccak256(_redeemer, _redeemerNonce); + bytes32 keyPath = getStoragePath(3, key); + + bytes memory path = bytes32ToBytes(keccak256(keyPath)); + require(MerklePatriciaProof.verify( + keccak256(RLPEncode.encodeItem(redemptionIntentHash)), + path, + _rlpParentNodes, + storageRoot)); + unstakes[redemptionIntentHash] = Unstake({ uuid: _uuid, redeemer: _redeemer, diff --git a/contracts/Test.sol b/contracts/Test.sol new file mode 100644 index 00000000..f0c20f87 --- /dev/null +++ b/contracts/Test.sol @@ -0,0 +1,21 @@ +pragma solidity ^0.4.23; + +import "./proof/BytesLib.sol"; +import "./proof/util.sol"; + +contract Test is Util { + constructor(){} + + function getStoragePath( + uint256 _index, + bytes32 _key) + returns(bytes32 path) + { + bytes memory indexBytes = bytes32ToBytes(bytes32(_index)); + bytes memory keyBytes = bytes32ToBytes(_key); + bytes k = BytesLib.concat(indexBytes, keyBytes); + path = keccak256(k); + return path; + } + +} diff --git a/contracts/proof/BytesLib.sol b/contracts/proof/BytesLib.sol new file mode 100644 index 00000000..f45705f5 --- /dev/null +++ b/contracts/proof/BytesLib.sol @@ -0,0 +1,174 @@ +pragma solidity ^0.4.18; + +library BytesLib { + function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes) { + bytes memory tempBytes; + + assembly { + // Get a location of some free memory and store it in tempBytes as + // Solidity does for memory variables. + tempBytes := mload(0x40) + + // Store the length of the first bytes array at the beginning of + // the memory for tempBytes. + let length := mload(_preBytes) + mstore(tempBytes, length) + + // Maintain a memory counter for the current write location in the + // temp bytes array by adding the 32 bytes for the array length to + // the starting location. + let mc := add(tempBytes, 0x20) + // Stop copying when the memory counter reaches the length of the + // first bytes array. + let end := add(mc, length) + + for { + // Initialize a copy counter to the start of the _preBytes data, + // 32 bytes into its memory. + let cc := add(_preBytes, 0x20) + } lt(mc, end) { + // Increase both counters by 32 bytes each iteration. + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + // Write the _preBytes data into the tempBytes memory 32 bytes + // at a time. + mstore(mc, mload(cc)) + } + + // Add the length of _postBytes to the current length of tempBytes + // and store it as the new length in the first 32 bytes of the + // tempBytes memory. + length := mload(_postBytes) + mstore(tempBytes, add(length, mload(tempBytes))) + + // Move the memory counter back from a multiple of 0x20 to the + // actual end of the _preBytes data. + mc := end + // Stop copying when the memory counter reaches the new combined + // length of the arrays. + end := add(mc, length) + + for { + let cc := add(_postBytes, 0x20) + } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + mstore(mc, mload(cc)) + } + + // Update the free-memory pointer by padding our last write location + // to 32 bytes: add 31 bytes to the end of tempBytes to move to the + // next 32 byte block, then round down to the nearest multiple of + // 32. If the sum of the length of the two arrays is zero then add + // one before rounding down to leave a blank 32 bytes (the length block with 0). + mstore(0x40, and( + add(add(end, iszero(add(length, mload(_preBytes)))), 31), + not(31) // Round down to the nearest 32 bytes. + )) + } + + return tempBytes; + } + + function slice(bytes _bytes, uint _start, uint _length) internal pure returns (bytes) { + require(_bytes.length >= (_start + _length)); + + bytes memory tempBytes; + + assembly { + switch iszero(_length) + case 0 { + // Get a location of some free memory and store it in tempBytes as + // Solidity does for memory variables. + tempBytes := mload(0x40) + + // The first word of the slice result is potentially a partial + // word read from the original array. To read it, we calculate + // the length of that partial word and start copying that many + // bytes into the array. The first word we copy will start with + // data we don't care about, but the last `lengthmod` bytes will + // land at the beginning of the contents of the new array. When + // we're done copying, we overwrite the full first word with + // the actual length of the slice. + let lengthmod := and(_length, 31) + + // The multiplication in the next line is necessary + // because when slicing multiples of 32 bytes (lengthmod == 0) + // the following copy loop was copying the origin's length + // and then ending prematurely not copying everything it should. + let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) + let end := add(mc, _length) + + for { + // The multiplication in the next line has the same exact purpose + // as the one above. + let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) + } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + mstore(mc, mload(cc)) + } + + mstore(tempBytes, _length) + + //update free-memory pointer + //allocating the array padded to 32 bytes like the compiler does now + mstore(0x40, and(add(mc, 31), not(31))) + } + //if we want a zero-length slice let's just return a zero-length array + default { + tempBytes := mload(0x40) + + mstore(0x40, add(tempBytes, 0x20)) + } + } + + return tempBytes; + } + + // Pad a bytes array to 32 bytes + function leftPad(bytes _bytes) internal pure returns (bytes) { + bytes memory newBytes = new bytes(32 - _bytes.length); + return concat(newBytes, _bytes); + } + + function toBytes32(bytes b) internal pure returns (bytes32) { + bytes32 out; + for (uint i = 0; i < 32; i++) { + out |= bytes32(b[i] & 0xFF) >> (i * 8); + } + return out; + } + + function fromBytes32(bytes32 x) internal pure returns (bytes) { + bytes memory b = new bytes(32); + for (uint i = 0; i < 32; i++) { + b[i] = byte(uint8(uint(x) / (2**(8*(19 - i))))); + } + return b; + } + + function toUint(bytes _bytes, uint _start) internal pure returns (uint256) { + require(_bytes.length >= (_start + 32)); + uint256 tempUint; + assembly { + tempUint := mload(add(add(_bytes, 0x20), _start)) + } + return tempUint; + } + + function toAddress(bytes _bytes, uint _start) internal pure returns (address) { + require(_bytes.length >= (_start + 20)); + address tempAddress; + + assembly { + tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) + } + + return tempAddress; + } + +} diff --git a/contracts/proof/RLPEncode.sol b/contracts/proof/RLPEncode.sol new file mode 100644 index 00000000..8fa67936 --- /dev/null +++ b/contracts/proof/RLPEncode.sol @@ -0,0 +1,77 @@ +// Library for RLP encoding a list of bytes arrays. +// Modeled after ethereumjs/rlp (https://github.com/ethereumjs/rlp) +// [Very] modified version of Sam Mayo's library. +pragma solidity ^0.4.18; +import "./BytesLib.sol"; + +library RLPEncode { + + // Encode an item (bytes) + function encodeItem(bytes memory self) internal pure returns (bytes) { + bytes memory encoded; + if(self.length == 1 && uint(self[0]) < 0x80) { + encoded = new bytes(1); + encoded = self; + } else { + encoded = BytesLib.concat(encodeLength(self.length, 128), self); + } + return encoded; + } + + // Encode a list of items + function encodeList(bytes[] memory self) internal pure returns (bytes) { + bytes memory encoded; + for (uint i=0; i < self.length; i++) { + encoded = BytesLib.concat(encoded, encodeItem(self[i])); + } + return BytesLib.concat(encodeLength(encoded.length, 192), encoded); + } + + // Hack to encode nested lists. If you have a list as an item passed here, included + // pass = true in that index. E.g. + // [item, list, item] --> pass = [false, true, false] + function encodeListWithPasses(bytes[] memory self, bool[] pass) internal pure returns (bytes) { + bytes memory encoded; + for (uint i=0; i < self.length; i++) { + if (pass[i] == true) { + encoded = BytesLib.concat(encoded, self[i]); + } else { + encoded = BytesLib.concat(encoded, encodeItem(self[i])); + } + } + return BytesLib.concat(encodeLength(encoded.length, 192), encoded); + } + + // Generate the prefix for an item or the entire list based on RLP spec + function encodeLength(uint256 L, uint256 offset) internal pure returns (bytes) { + if (L < 56) { + bytes memory prefix = new bytes(1); + prefix[0] = byte(L + offset); + return prefix; + } else { + // lenLen is the length of the hex representation of the data length + uint lenLen; + uint i = 0x1; + while(L/i != 0) { + lenLen++; + i *= 0x100; + } + bytes memory prefix0 = getLengthBytes(offset + 55 + lenLen); + bytes memory prefix1 = getLengthBytes(L); + return BytesLib.concat(prefix0, prefix1); + } + } + + function getLengthBytes(uint256 x) internal pure returns (bytes b) { + // Figure out if we need 1 or two bytes to express the length. + // 1 byte gets us to max 255 + // 2 bytes gets us to max 65535 (no payloads will be larger than this) + uint256 nBytes = 1; + if (x > 255) { nBytes = 2; } + b = new bytes(nBytes); + // Encode the length and return it + for (uint i = 0; i < nBytes; i++) { + b[i] = byte(uint8(x / (2**(8*(nBytes - 1 - i))))); + } + } +} From ee5f9bc41393b17a8cb8ad33ce812e6e3a1a2c9b Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Fri, 1 Jun 2018 19:49:40 +0530 Subject: [PATCH 0078/1361] [MOSA-62] proveOpenST function --- contracts/Core.sol | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index c77f4268..264601e8 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -22,11 +22,13 @@ pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- import "./CoreInterface.sol"; +import "./proof/MerklePatriciaProof.sol"; +import "./proof/util.sol"; /// @dev Core is a minimal stub that will become the anchoring and consensus point for /// the utility chain to validate itself against -contract Core is CoreInterface { +contract Core is CoreInterface, Util { /* * Events @@ -35,6 +37,8 @@ contract Core is CoreInterface { event CommittedStorageRoot(uint256 blockHeight, bytes32 storageRoot); + event AccountProved(uint256 blockHeight, bytes32 stateRoot, bytes encodedAddress); + /** Mapping of block height to state root of the block. */ mapping (uint /* block height */ => bytes32) public stateRoots; /** Mapping of block height to storafe root of the block. */ @@ -138,6 +142,7 @@ contract Core is CoreInterface { } /** + * * Commit new storage root for a block height * */ @@ -155,4 +160,33 @@ contract Core is CoreInterface { return _storageRoot; } + + /// @dev Verify account proof + /// @param _blockHeight block Number at which stake happened + /// @param _value rlpencoded => hashed account node value + /// @param _rlpParentNodes RLP encoded value of account proof parent nodes + function proveOpenST( + uint256 _blockHeight, + bytes32 _value, + bytes _rlpParentNodes) + external + returns(bool status) + { + require(_blockHeight != 0); + bytes32 stateRoot = stateRoots[_blockHeight]; + // State root should be present for the block height + require(stateRoot != bytes32(0), "State root missing for given block height"); + + require(_value != bytes32(0), "Node values are missing"); + + // Encode remote address. Storage added because it was generating warning. + bytes memory encodedAddress = bytes32ToBytes(keccak256(coreOpenSTRemote)); + + // Verify proof using library contract + require(MerklePatriciaProof.verify(_value, encodedAddress, _rlpParentNodes, stateRoot), "Account proof not verified."); + + emit AccountProved(_blockHeight, stateRoot, encodedAddress); + + return true; + } } \ No newline at end of file From dd63ea0d77fa0c0ef524332cb26fafdf246de83c Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 4 Jun 2018 12:45:51 +0530 Subject: [PATCH 0079/1361] Added contract code to generate storage path --- contracts/ProofUtil.sol | 33 +++++++++++++++++++++++++ contracts/Test.sol | 21 ---------------- test/ProofUtil.js | 55 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 contracts/ProofUtil.sol delete mode 100644 contracts/Test.sol create mode 100644 test/ProofUtil.js diff --git a/contracts/ProofUtil.sol b/contracts/ProofUtil.sol new file mode 100644 index 00000000..63fa178a --- /dev/null +++ b/contracts/ProofUtil.sol @@ -0,0 +1,33 @@ +pragma solidity ^0.4.23; + +import "./proof/BytesLib.sol"; +import "./proof/util.sol"; + +contract ProofUtil is Util { + + event StoragePath(uint256 index, address key, bytes indexBytes, bytes keyBytes, bytes k, bytes32 path); + + constructor(){} + + function getStoragePath( + uint256 _index, + address _key) + returns(bytes32 storagePath) + { + bytes memory indexBytes = BytesLib.leftPad(bytes32ToBytes(bytes32(_index))); + bytes memory keyBytes = BytesLib.leftPad(addressToBytes(_key)); + bytes memory k = BytesLib.concat(keyBytes, indexBytes); + storagePath = keccak256(keccak256(k)); + emit StoragePath(_index, _key, indexBytes, keyBytes, k, storagePath); + return storagePath; + } + + function addressToBytes(address a) constant returns (bytes b){ + assembly { + let m := mload(0x40) + mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, a)) + mstore(0x40, add(m, 52)) + b := m + } + } +} diff --git a/contracts/Test.sol b/contracts/Test.sol deleted file mode 100644 index f0c20f87..00000000 --- a/contracts/Test.sol +++ /dev/null @@ -1,21 +0,0 @@ -pragma solidity ^0.4.23; - -import "./proof/BytesLib.sol"; -import "./proof/util.sol"; - -contract Test is Util { - constructor(){} - - function getStoragePath( - uint256 _index, - bytes32 _key) - returns(bytes32 path) - { - bytes memory indexBytes = bytes32ToBytes(bytes32(_index)); - bytes memory keyBytes = bytes32ToBytes(_key); - bytes k = BytesLib.concat(indexBytes, keyBytes); - path = keccak256(k); - return path; - } - -} diff --git a/test/ProofUtil.js b/test/ProofUtil.js new file mode 100644 index 00000000..6c9283c2 --- /dev/null +++ b/test/ProofUtil.js @@ -0,0 +1,55 @@ + +const util = require('ethereumjs-util'); +const BigNumber = require('bignumber.js'); +var ProofUtil = artifacts.require("./ProofUtil.sol"); + + +function leftPad(str) { + return ("0000000000000000000000000000000000000000000000000000000000000000" + str).substring(str.length) +} + +function getPath(index, address) { + + let pathBuilder = Buffer.from(leftPad(index.toString('hex')), 'hex'); + console.log("pathBuilder 1: ",pathBuilder); + console.log("pathBuilder 1 toString('hex'): ",pathBuilder.toString('hex')); + pathBuilder = Buffer.concat([Buffer.from(leftPad(address.toString('hex')), 'hex'), pathBuilder]) + console.log("pathBuilder 2: ",pathBuilder); + console.log("pathBuilder 2 toString('hex'): ",pathBuilder.toString('hex')); + pathBuilder = Buffer.from(util.sha3(pathBuilder), 'hex'); + console.log("pathBuilder 3: ",pathBuilder); + console.log("pathBuilder 3 toString('hex'): ",pathBuilder.toString('hex')); + let storagePath = Buffer.from(util.sha3(pathBuilder), 'hex'); + return util.bufferToHex(storagePath); +} + +contract('ProofUtil', function(accounts) { + + describe ('ProofUtil', async () => { + it('Test', async () => { + + + const bn = new BigNumber(2); + const proofContract = await ProofUtil.new(); + console.log("proofContract address: ",proofContract.address); + + + var indexBuffer = new Buffer('02', 'hex');//new Buffer(bn.toNumber(16).toString()); + console.log("indexBuffer: ",indexBuffer); + console.log("indexBuffer.toHex: ",indexBuffer.toString('hex')); + + var addressBuffer = new Buffer('93e342dc604d9e86372fe033625ca7e97dc741fe', 'hex'); + console.log("addressBuffer: ",addressBuffer); + console.log("addressBuffer.toHex: ",addressBuffer.toString('hex')); + + console.log("getPath: ",getPath(indexBuffer,addressBuffer)); + + const callResponse = await proofContract.getStoragePath.call(bn.toNumber(16).toString(),"0x93e342dc604d9e86372fe033625ca7e97dc741fe"); + console.log("callResponse: ",callResponse); + + const response = await proofContract.getStoragePath(bn.toNumber(16).toString(),"0x93e342dc604d9e86372fe033625ca7e97dc741fe"); + console.log("response: ",response.logs[0].args); + + }); + }); +}); From 9d1b97c2421262a5edfcadf46901dc87caeb358f Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 4 Jun 2018 13:01:39 +0530 Subject: [PATCH 0080/1361] code refactored --- contracts/OpenSTValue.sol | 8 ++++---- contracts/ProofUtil.sol | 6 +++--- test/ProofUtil.js | 26 ++++++++++++++------------ 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 3fa7f52b..0e22fe72 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -134,7 +134,7 @@ contract OpenSTValue is OpsManaged, Hasher { mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; mapping(bytes32 /* hashRedemptionIntent */ => Unstake) public unstakes; - constant private storageIndex = 3; +// /constant private storageIndex = 3; /* * Modifiers @@ -300,7 +300,7 @@ contract OpenSTValue is OpsManaged, Hasher { return (uuid, amountST, staker); } - function getStoragePath( + /* function getStoragePath( uint256 _index, bytes32 _key) returns(bytes32 path) @@ -362,7 +362,7 @@ contract OpenSTValue is OpsManaged, Hasher { storageRoot = cores[utilityTokens[_uuid].chainIdUtility].storageRoot(_blockHeight); bytes32 key = keccak256(_redeemer, _redeemerNonce); - bytes32 keyPath = getStoragePath(3, key); + bytes32 keyPath = getStoragePath(storageIndex, key); bytes memory path = bytes32ToBytes(keccak256(keyPath)); require(MerklePatriciaProof.verify( @@ -386,7 +386,7 @@ contract OpenSTValue is OpsManaged, Hasher { return (amountST, expirationHeight); } - +*/ function processUnstaking( bytes32 _redemptionIntentHash, bytes32 _unlockSecret) diff --git a/contracts/ProofUtil.sol b/contracts/ProofUtil.sol index 63fa178a..b3d3a753 100644 --- a/contracts/ProofUtil.sol +++ b/contracts/ProofUtil.sol @@ -5,17 +5,17 @@ import "./proof/util.sol"; contract ProofUtil is Util { - event StoragePath(uint256 index, address key, bytes indexBytes, bytes keyBytes, bytes k, bytes32 path); + event StoragePath(uint256 index, bytes32 key, bytes indexBytes, bytes keyBytes, bytes k, bytes32 path); constructor(){} function getStoragePath( uint256 _index, - address _key) + bytes32 _key) returns(bytes32 storagePath) { bytes memory indexBytes = BytesLib.leftPad(bytes32ToBytes(bytes32(_index))); - bytes memory keyBytes = BytesLib.leftPad(addressToBytes(_key)); + bytes memory keyBytes = BytesLib.leftPad(bytes32ToBytes(_key)); bytes memory k = BytesLib.concat(keyBytes, indexBytes); storagePath = keccak256(keccak256(k)); emit StoragePath(_index, _key, indexBytes, keyBytes, k, storagePath); diff --git a/test/ProofUtil.js b/test/ProofUtil.js index 6c9283c2..f21b4d24 100644 --- a/test/ProofUtil.js +++ b/test/ProofUtil.js @@ -8,12 +8,12 @@ function leftPad(str) { return ("0000000000000000000000000000000000000000000000000000000000000000" + str).substring(str.length) } -function getPath(index, address) { +function getPath(index, key) { let pathBuilder = Buffer.from(leftPad(index.toString('hex')), 'hex'); console.log("pathBuilder 1: ",pathBuilder); console.log("pathBuilder 1 toString('hex'): ",pathBuilder.toString('hex')); - pathBuilder = Buffer.concat([Buffer.from(leftPad(address.toString('hex')), 'hex'), pathBuilder]) + pathBuilder = Buffer.concat([Buffer.from(leftPad(key.toString('hex')), 'hex'), pathBuilder]) console.log("pathBuilder 2: ",pathBuilder); console.log("pathBuilder 2 toString('hex'): ",pathBuilder.toString('hex')); pathBuilder = Buffer.from(util.sha3(pathBuilder), 'hex'); @@ -28,27 +28,29 @@ contract('ProofUtil', function(accounts) { describe ('ProofUtil', async () => { it('Test', async () => { - - const bn = new BigNumber(2); const proofContract = await ProofUtil.new(); console.log("proofContract address: ",proofContract.address); - + const bn = new BigNumber(2); var indexBuffer = new Buffer('02', 'hex');//new Buffer(bn.toNumber(16).toString()); console.log("indexBuffer: ",indexBuffer); console.log("indexBuffer.toHex: ",indexBuffer.toString('hex')); - var addressBuffer = new Buffer('93e342dc604d9e86372fe033625ca7e97dc741fe', 'hex'); - console.log("addressBuffer: ",addressBuffer); - console.log("addressBuffer.toHex: ",addressBuffer.toString('hex')); + var key = "ad7c56403eba8c288188d9f1b9bbc5d67d0119807e4505f73d02d6da76f4181d"; + var keyBuffer = new Buffer(key, 'hex'); + console.log("keyBuffer: ",keyBuffer); + console.log("keyBuffer.toHex: ",keyBuffer.toString('hex')); - console.log("getPath: ",getPath(indexBuffer,addressBuffer)); + var path = getPath(indexBuffer,keyBuffer); + console.log("path from JS: ",path); - const callResponse = await proofContract.getStoragePath.call(bn.toNumber(16).toString(),"0x93e342dc604d9e86372fe033625ca7e97dc741fe"); + const callResponse = await proofContract.getStoragePath.call(bn.toNumber(16).toString(),"0x"+key); console.log("callResponse: ",callResponse); - const response = await proofContract.getStoragePath(bn.toNumber(16).toString(),"0x93e342dc604d9e86372fe033625ca7e97dc741fe"); - console.log("response: ",response.logs[0].args); + const response = await proofContract.getStoragePath(bn.toNumber(16).toString(),"0x"+key); + console.log("path from Contract: ",response.logs[0].args); + + assert.equal(path, response.logs[0].args.path); }); }); From 7dccb80d9ce892c74be6ccf60541078d6d51eaeb Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Mon, 4 Jun 2018 13:03:41 +0530 Subject: [PATCH 0081/1361] [MOSA-62] Workers introduced Whitelisted workers check in commitStateRoot and commitStorageRoot function --- contracts/Core.sol | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index 264601e8..b476f65a 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -24,10 +24,12 @@ pragma solidity ^0.4.23; import "./CoreInterface.sol"; import "./proof/MerklePatriciaProof.sol"; import "./proof/util.sol"; +import "./WorkersInterface.sol"; /// @dev Core is a minimal stub that will become the anchoring and consensus point for /// the utility chain to validate itself against +// TODO - truffle test cases contract Core is CoreInterface, Util { /* @@ -39,16 +41,17 @@ contract Core is CoreInterface, Util { event AccountProved(uint256 blockHeight, bytes32 stateRoot, bytes encodedAddress); + /* + * Storage + */ /** Mapping of block height to state root of the block. */ mapping (uint /* block height */ => bytes32) public stateRoots; /** Mapping of block height to storafe root of the block. */ mapping (uint /* block height */ => bytes32) public storageRoots; + // TODO - Do we need below mapping? // mapping(bytes32 => address) stakeTokenTuple; - /* - * Storage - */ /// chainIdOrigin stores the chainId this chain uint256 private coreChainIdOrigin; /// chainIdRemote stores the chainId of the remote chain @@ -62,7 +65,10 @@ contract Core is CoreInterface, Util { address private coreOpenSTRemote; /// registrar registers for the two chains address private coreRegistrar; + /// Workers contract address + WorkersInterface public workers; + // TODO - do we need below structures /* * Structures */ @@ -78,21 +84,26 @@ contract Core is CoreInterface, Util { address _registrar, uint256 _chainIdOrigin, uint256 _chainIdRemote, - address _openSTRemote) + address _openSTRemote, + WorkersInterface _workers) public { - require(_registrar != address(0)); - require(_chainIdOrigin != 0); - require(_chainIdRemote != 0); - require(_openSTRemote != 0); + require(_registrar != address(0), "Registrar should be valid address"); + require(_chainIdOrigin != 0, "Invalid origin chain ID"); + require(_chainIdRemote != 0, "Invalid remote chain ID"); + require(_openSTRemote != 0, "Invalid openSTRemote contract address"); + require(_workers != address(0), "Workers should be valid contract address"); coreRegistrar = _registrar; coreChainIdOrigin = _chainIdOrigin; coreChainIdRemote = _chainIdRemote; + // TODO - openSTRemote is openSTValue and openSTUtility contract address? coreOpenSTRemote = _openSTRemote; + workers = _workers; // Initialize latestStateRootBlockHeight = 0; latestStorageRootBlockHeight = 0; + // TODO - Do we need to initialize stateRoots and storageRoots mapping? } /* @@ -132,7 +143,13 @@ contract Core is CoreInterface, Util { external returns(bytes32 stateRoot) { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender), "Invalid worker address"); + // State root should be valid + require(_stateRoot != bytes32(0), "Invalid state root"); + // Input block height should be valid require(_blockHeight > latestStateRootBlockHeight, "Given Block height is lower than latestBlockHeight."); + stateRoots[_blockHeight] = _stateRoot; latestStateRootBlockHeight = _blockHeight; @@ -152,7 +169,13 @@ contract Core is CoreInterface, Util { external returns(bytes32 storageRoot) { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender), "Invalid worker address"); + // Storage root should be valid + require(_storageRoot != bytes32(0), "Invalid storage root"); + // Input block height should be valid require(_blockHeight > latestStorageRootBlockHeight, "Given Block height is lower than latestBlockHeight."); + storageRoots[_blockHeight] = _storageRoot; latestStorageRootBlockHeight = _blockHeight; From 7776a7037fbf28e66daf7e95e9739cb928debe7f Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 4 Jun 2018 14:10:19 +0530 Subject: [PATCH 0082/1361] Added openSTUtil.sol library. MOSA-68 --- contracts/OpenSTUtils.sol | 28 ++++++++++++++++++++++++++++ contracts/OpenSTValue.sol | 28 ++++++---------------------- 2 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 contracts/OpenSTUtils.sol diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol new file mode 100644 index 00000000..16a7c1f0 --- /dev/null +++ b/contracts/OpenSTUtils.sol @@ -0,0 +1,28 @@ +pragma solidity ^0.4.0; + +import "./proof/BytesLib.sol"; + +library OpenSTUtils { + + function bytes32ToBytes(bytes32 a) internal pure returns (bytes) { + bytes memory res = new bytes(32); + assembly { + mstore(add(32,res), a) + } + return res; + } + + function storagePath( + uint256 _index, + bytes32 _key) + internal + pure + returns(bytes32) + { + bytes memory indexBytes = BytesLib.leftPad(bytes32ToBytes(bytes32(_index))); + bytes memory keyBytes = BytesLib.leftPad(bytes32ToBytes(_key)); + bytes memory path = BytesLib.concat(keyBytes, indexBytes); + return keccak256(keccak256(path)); + } + +} diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 0e22fe72..112f3ba4 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -35,11 +35,11 @@ import "./SimpleStake.sol"; // proof libraries import "./proof/MerklePatriciaProof.sol"; import "./proof/RLPEncode.sol"; -import "./proof/BytesLib.sol"; - +import "./OpenSTUtils.sol"; +import "./proof/util.sol"; /// @title OpenSTValue - value staking contract for OpenST -contract OpenSTValue is OpsManaged, Hasher { +contract OpenSTValue is OpsManaged, Hasher, Util { using SafeMath for uint256; /* @@ -134,8 +134,6 @@ contract OpenSTValue is OpsManaged, Hasher { mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; mapping(bytes32 /* hashRedemptionIntent */ => Unstake) public unstakes; -// /constant private storageIndex = 3; - /* * Modifiers */ @@ -300,17 +298,6 @@ contract OpenSTValue is OpsManaged, Hasher { return (uuid, amountST, staker); } - /* function getStoragePath( - uint256 _index, - bytes32 _key) - returns(bytes32 path) - { - bytes memory indexBytes = bytes32ToBytes(bytes32(_index)); - bytes memory keyBytes = bytes32ToBytes(_key); - bytes key = BytesLib.concat(indexBytes, keyBytes); - path = keccak256(key); - return path; - } function confirmRedemptionIntent( bytes32 _uuid, address _redeemer, @@ -333,7 +320,6 @@ contract OpenSTValue is OpsManaged, Hasher { // later core will provide a view on the block height of the // utility chain require(_redemptionUnlockHeight > 0); - require(_redemptionIntentHash != ""); require(nonces[_redeemer] + 1 == _redeemerNonce); nonces[_redeemer]++; @@ -361,15 +347,13 @@ contract OpenSTValue is OpsManaged, Hasher { storageRoot = cores[utilityTokens[_uuid].chainIdUtility].storageRoot(_blockHeight); - bytes32 key = keccak256(_redeemer, _redeemerNonce); - bytes32 keyPath = getStoragePath(storageIndex, key); - + bytes32 keyPath = OpenSTUtils.storagePath("3", keccak256(_redeemer, _redeemerNonce)); bytes memory path = bytes32ToBytes(keccak256(keyPath)); require(MerklePatriciaProof.verify( keccak256(RLPEncode.encodeItem(redemptionIntentHash)), path, _rlpParentNodes, - storageRoot)); + storageRoot), "Failed to verify storage path"); unstakes[redemptionIntentHash] = Unstake({ uuid: _uuid, @@ -386,7 +370,7 @@ contract OpenSTValue is OpsManaged, Hasher { return (amountST, expirationHeight); } -*/ + function processUnstaking( bytes32 _redemptionIntentHash, bytes32 _unlockSecret) From c0ac2eac19ac00b76aab9def22f0e9b28aba4009 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Mon, 4 Jun 2018 14:31:32 +0530 Subject: [PATCH 0083/1361] Added return values to methods of gate contract --- contracts/Gate.sol | 24 +++++++++++++----------- test/Gate.js | 17 +++++++++-------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 311fc74e..6c42c008 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -95,7 +95,7 @@ contract Gate is ProtocolVersioned, Owned { uint256 _amount, address _beneficiary) external - returns ( bool /* success */) + returns ( uint256 /* amount */) { require(_amount > uint256(0)); @@ -115,14 +115,14 @@ contract Gate is ProtocolVersioned, Owned { emit StakeRequested(msg.sender, _amount, _beneficiary); - return true; + return _amount; } /// @dev In order to revert stake request the msg.sender should be the staker function revertStakeRequest() external - returns (bool /* success */) + returns (uint256 /* amount */) { // only staker can do revertStakeRequest, msg.sender == staker StakeRequest storage stakeRequest = stakeRequests[msg.sender]; @@ -140,12 +140,12 @@ contract Gate is ProtocolVersioned, Owned { emit StakeRequestReverted(msg.sender, stakeRequestAmount); - return true; + return stakeRequestAmount; } function rejectStakeRequest(address _staker, uint8 _reason) external - returns (bool /* success */) + returns (uint256 /* amount */) { // check if the caller is whitelisted worker require(workers.isWorker(msg.sender)); @@ -167,7 +167,7 @@ contract Gate is ProtocolVersioned, Owned { emit StakeRequestRejected(_staker, stakeRequestAmount, _reason); - return true; + return stakeRequestAmount; } /// @dev In order to accept stake the staker needs to approve gate contract for bounty amount. @@ -224,7 +224,7 @@ contract Gate is ProtocolVersioned, Owned { bytes32 _stakingIntentHash, bytes32 _unlockSecret) external - returns (bool /* success */) + returns (uint /* amount */) { // check if the caller is whitelisted worker require(workers.isWorker(msg.sender)); @@ -238,6 +238,7 @@ contract Gate is ProtocolVersioned, Owned { StakeRequest storage stakeRequest = stakeRequests[staker]; + // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -259,18 +260,18 @@ contract Gate is ProtocolVersioned, Owned { //Transfer bounty amount to the msg.sender account require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); } - + uint256 stakeProcessedAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[staker]; - return true; + return stakeProcessedAmount; } function revertStaking( bytes32 _stakingIntentHash) external - returns (bool /* success */) + returns (uint256 /* amount */) { // check if the caller is whitelisted worker @@ -302,9 +303,10 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + uint256 stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[staker]; - return true; + return stakeRequestAmount; } } \ No newline at end of file diff --git a/test/Gate.js b/test/Gate.js index 787408c7..a3be6dc6 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -58,7 +58,9 @@ contract('Gate', function(accounts) { if (isSuccessCase) { // success case let requestStakeResult = await gate.requestStake.call(amount, beneficiary, {from: staker}); - assert.equal(requestStakeResult, isSuccessCase); + + + assert.equal(amount.eq(requestStakeResult), true); let requestStakeResponse = await gate.requestStake(amount, beneficiary, {from: staker}); await Gate_utils.checkRequestStakeEvent(requestStakeResponse.logs[0],staker, amount, beneficiary); @@ -96,7 +98,7 @@ contract('Gate', function(accounts) { if (isSuccessCase) { // success case steps let revertRequestStakeResult = await gate.revertStakeRequest.call({from: staker}); - assert.equal(revertRequestStakeResult, true); + assert.equal(revertRequestStakeResult.eq(amount), true); let revertRequestStakeResponse = await gate.revertStakeRequest({from: staker}); await Gate_utils.checkStakeRequestRevertedEvent(revertRequestStakeResponse.logs[0],staker, amount); @@ -132,7 +134,7 @@ contract('Gate', function(accounts) { if (isSuccessCase) { let rejectRequestStakeResult = await gate.rejectStakeRequest.call(staker, reason, {from: messageSender}); - assert.equal(rejectRequestStakeResult, true); + assert.equal(rejectRequestStakeResult.eq(amount), true); let rejectRequestStakeResponse = await gate.rejectStakeRequest(staker, reason, {from: messageSender}); await Gate_utils.checkStakeRequestRejectedEvent(rejectRequestStakeResponse.logs[0],staker, amount, reason); @@ -215,7 +217,7 @@ contract('Gate', function(accounts) { if (isSuccessCase) { let processStakingResult = await gate.processStaking.call(stakingIntentHash, unlockSecret, {from: messageSender}); - assert.equal(processStakingResult, true); + assert.equal(stakeAmount.eq(processStakingResult), true); let processStakingResponse = await gate.processStaking(stakingIntentHash, unlockSecret, {from: messageSender}); //await Gate_utils.checkProcessedStakeEvent(processStakingResponse.logs[0],stakerAccount, stakeAmount); @@ -253,15 +255,16 @@ contract('Gate', function(accounts) { , bountyAmount = await gate.bounty.call() ; - var waitTime = await openSTValue.blocksToWaitLong.call(); + let waitTime = await openSTValue.blocksToWaitLong.call(); waitTime = waitTime.toNumber(); // Wait time less 1 block for preceding test case and 1 block because condition is <= - for (var i = 0; i < waitTime-2 ; i++) { + for (let i = 0; i < waitTime - 2; i++) { await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); } if (isSuccessCase) { let revertStakingResponse = await gate.revertStaking(stakingIntentHash, {from: messageSender}); + assert.equal(revertStakingResponse.receipt.status, 1); } else { await Utils.expectThrow(gate.revertStaking(stakingIntentHash, {from: messageSender})); } @@ -311,7 +314,6 @@ contract('Gate', function(accounts) { hashLock: lock.l } }; - describe('Properties', async () => { before (async () => { @@ -599,7 +601,6 @@ contract('Gate', function(accounts) { }); - describe('revertStaking', async () => { let bountyAmount = null; From bf3cdfdababe05b1e9e24b04f6cfe25de6b22098 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Mon, 4 Jun 2018 14:54:45 +0530 Subject: [PATCH 0084/1361] [MOSA-62] After account proof update storage proof in same transaction --- contracts/Core.sol | 66 +++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 39 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index b476f65a..35667b60 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -35,11 +35,9 @@ contract Core is CoreInterface, Util { /* * Events */ - event CommittedStateRoot(uint256 blockHeight, bytes32 stateRoot); + event StateRootCommitted(uint256 blockHeight, bytes32 stateRoot); - event CommittedStorageRoot(uint256 blockHeight, bytes32 storageRoot); - - event AccountProved(uint256 blockHeight, bytes32 stateRoot, bytes encodedAddress); + event AccountProved(uint256 blockHeight, bytes32 stateRoot, bytes encodedAddress, bytes32 storageRoot); /* * Storage @@ -56,15 +54,15 @@ contract Core is CoreInterface, Util { uint256 private coreChainIdOrigin; /// chainIdRemote stores the chainId of the remote chain uint256 private coreChainIdRemote; - /// Latest block height of block which state root was committed. - uint256 public latestStateRootBlockHeight; - /// Latest block height of block which storage root was committed. - uint256 public latestStorageRootBlockHeight; /// OpenST remote is the address of the OpenST contract /// on the remote chain address private coreOpenSTRemote; /// registrar registers for the two chains address private coreRegistrar; + /// Latest block height of block which state root was committed. + uint256 public latestStateRootBlockHeight; + /// Latest block height of block which storage root was committed. + uint256 public latestStorageRootBlockHeight; /// Workers contract address WorkersInterface public workers; @@ -137,6 +135,9 @@ contract Core is CoreInterface, Util { * Commit new state root for a block height * */ + /// @dev Commit new state root for a block height + /// @param _blockHeight block Number for which stateRoots mapping needs to update + /// @param _stateRoot state root of input block height function commitStateRoot( uint256 _blockHeight, bytes32 _stateRoot) @@ -153,49 +154,31 @@ contract Core is CoreInterface, Util { stateRoots[_blockHeight] = _stateRoot; latestStateRootBlockHeight = _blockHeight; - emit CommittedStateRoot(_blockHeight, _stateRoot); + emit StateRootCommitted(_blockHeight, _stateRoot); return stateRoot; } - /** - * - * Commit new storage root for a block height - * - */ - function commitStorageRoot( + /// @dev Verify account proof and update storageRoots mapping + /// @param _blockHeight block Number at which stake happened + /// @param _value rlpencoded => hashed account node object + /// @param _rlpParentNodes RLP encoded value of account proof parent nodes + /// @param _storageRoot storage root received from account proof + function proveOpenST( uint256 _blockHeight, + bytes32 _value, + bytes _rlpParentNodes, bytes32 _storageRoot) external - returns(bytes32 storageRoot) + returns(bool status) { // check if the caller is whitelisted worker require(workers.isWorker(msg.sender), "Invalid worker address"); + // Check for block height + require(_blockHeight != 0, "Invalid block height"); // Storage root should be valid require(_storageRoot != bytes32(0), "Invalid storage root"); - // Input block height should be valid - require(_blockHeight > latestStorageRootBlockHeight, "Given Block height is lower than latestBlockHeight."); - - storageRoots[_blockHeight] = _storageRoot; - latestStorageRootBlockHeight = _blockHeight; - emit CommittedStorageRoot(_blockHeight, _storageRoot); - - return _storageRoot; - } - - /// @dev Verify account proof - /// @param _blockHeight block Number at which stake happened - /// @param _value rlpencoded => hashed account node value - /// @param _rlpParentNodes RLP encoded value of account proof parent nodes - function proveOpenST( - uint256 _blockHeight, - bytes32 _value, - bytes _rlpParentNodes) - external - returns(bool status) - { - require(_blockHeight != 0); bytes32 stateRoot = stateRoots[_blockHeight]; // State root should be present for the block height require(stateRoot != bytes32(0), "State root missing for given block height"); @@ -208,7 +191,12 @@ contract Core is CoreInterface, Util { // Verify proof using library contract require(MerklePatriciaProof.verify(_value, encodedAddress, _rlpParentNodes, stateRoot), "Account proof not verified."); - emit AccountProved(_blockHeight, stateRoot, encodedAddress); + // After verification update storageRoots mapping + storageRoots[_blockHeight] = _storageRoot; + // Update latestStorageRootBlockHeight variable + latestStorageRootBlockHeight = _blockHeight; + // Emit event + emit AccountProved(_blockHeight, stateRoot, encodedAddress, _storageRoot); return true; } From 3bce73e25a24727a318bc3b1558c380ff94359f8 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Mon, 4 Jun 2018 15:40:31 +0530 Subject: [PATCH 0085/1361] Renamed variables based on context --- contracts/Gate.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 6c42c008..14eb2662 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -303,10 +303,10 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); - uint256 stakeRequestAmount = stakeRequest.amount; + uint256 revertedAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[staker]; - return stakeRequestAmount; + return revertedAmount; } } \ No newline at end of file From ca1c73e90f193bfbf03a35ffc37ca8ac8faa8142 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 4 Jun 2018 15:59:03 +0530 Subject: [PATCH 0086/1361] contract: Updated events. MOSA-68 --- contracts/OpenSTUtils.sol | 2 +- contracts/OpenSTValue.sol | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol index 16a7c1f0..b3f932a0 100644 --- a/contracts/OpenSTUtils.sol +++ b/contracts/OpenSTUtils.sol @@ -24,5 +24,5 @@ library OpenSTUtils { bytes memory path = BytesLib.concat(keyBytes, indexBytes); return keccak256(keccak256(path)); } - + } diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 112f3ba4..32fd7a7a 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -61,7 +61,8 @@ contract OpenSTValue is OpsManaged, Hasher, Util { address _staker, uint256 _amountST, uint256 _amountUT); event RedemptionIntentConfirmed(bytes32 indexed _uuid, bytes32 _redemptionIntentHash, - address _redeemer, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight); + address _redeemer, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight, uint256 _blockHeight, + bytes32 _storageRoot); event ProcessedUnstake(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, address stake, address _redeemer, address _beneficiary, uint256 _amountST, bytes32 _unlockSecret); @@ -334,7 +335,6 @@ contract OpenSTValue is OpsManaged, Hasher, Util { _hashLock ); - //require(_redemptionIntentHash == redemptionIntentHash); expirationHeight = block.number + blocksToWaitShort(); UtilityToken storage utilityToken = utilityTokens[_uuid]; @@ -347,6 +347,7 @@ contract OpenSTValue is OpsManaged, Hasher, Util { storageRoot = cores[utilityTokens[_uuid].chainIdUtility].storageRoot(_blockHeight); + //TODO: Update the code to get the Index. bytes32 keyPath = OpenSTUtils.storagePath("3", keccak256(_redeemer, _redeemerNonce)); bytes memory path = bytes32ToBytes(keccak256(keyPath)); require(MerklePatriciaProof.verify( @@ -366,9 +367,9 @@ contract OpenSTValue is OpsManaged, Hasher, Util { }); emit RedemptionIntentConfirmed(_uuid, redemptionIntentHash, _redeemer, - _beneficiary, amountST, _amountUT, expirationHeight); + _beneficiary, amountST, _amountUT, expirationHeight, _blockHeight, storageRoot ); - return (amountST, expirationHeight); + return (amountST, expirationHeight, storageRoot); } function processUnstaking( From 1f5c340d30247e7d4b44ce3987c3898d412fe9d0 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Mon, 4 Jun 2018 16:13:22 +0530 Subject: [PATCH 0087/1361] [MOSA-62] public functions getStateRoot and getStorageRoot --- contracts/Core.sol | 62 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index 35667b60..bc9dab4c 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -43,9 +43,9 @@ contract Core is CoreInterface, Util { * Storage */ /** Mapping of block height to state root of the block. */ - mapping (uint /* block height */ => bytes32) public stateRoots; + mapping (uint /* block height */ => bytes32) private stateRoots; /** Mapping of block height to storafe root of the block. */ - mapping (uint /* block height */ => bytes32) public storageRoots; + mapping (uint /* block height */ => bytes32) private storageRoots; // TODO - Do we need below mapping? // mapping(bytes32 => address) stakeTokenTuple; @@ -60,9 +60,9 @@ contract Core is CoreInterface, Util { /// registrar registers for the two chains address private coreRegistrar; /// Latest block height of block which state root was committed. - uint256 public latestStateRootBlockHeight; + uint256 private latestStateRootBlockHeight; /// Latest block height of block which storage root was committed. - uint256 public latestStorageRootBlockHeight; + uint256 private latestStorageRootBlockHeight; /// Workers contract address WorkersInterface public workers; @@ -107,6 +107,9 @@ contract Core is CoreInterface, Util { /* * Public view functions */ + + /// @dev public function registrar + /// @return address coreRegistrar function registrar() public view @@ -115,6 +118,8 @@ contract Core is CoreInterface, Util { return coreRegistrar; } + /// @dev public function chainIdRemote + /// @return uint256 coreChainIdRemote function chainIdRemote() public view @@ -123,6 +128,8 @@ contract Core is CoreInterface, Util { return coreChainIdRemote; } + /// @dev public function openSTRemote + /// @return address coreOpenSTRemote function openSTRemote() public view @@ -131,6 +138,26 @@ contract Core is CoreInterface, Util { return coreOpenSTRemote; } + /// @dev public function getLatestStateRootBlockHeight + /// @return uint256 latestStateRootBlockHeight + function getLatestStateRootBlockHeight() + public + view + returns (uint256 /* latest state root block height */) + { + return latestStateRootBlockHeight; + } + + /// @dev public function getLatestStorageRootBlockHeight + /// @return uint256 latestStorageRootBlockHeight + function getLatestStorageRootBlockHeight() + public + view + returns (uint256 /* latest storage root block height */) + { + return latestStorageRootBlockHeight; + } + /** * Commit new state root for a block height * @@ -138,6 +165,7 @@ contract Core is CoreInterface, Util { /// @dev Commit new state root for a block height /// @param _blockHeight block Number for which stateRoots mapping needs to update /// @param _stateRoot state root of input block height + /// @return bytes32 stateRoot function commitStateRoot( uint256 _blockHeight, bytes32 _stateRoot) @@ -164,6 +192,7 @@ contract Core is CoreInterface, Util { /// @param _value rlpencoded => hashed account node object /// @param _rlpParentNodes RLP encoded value of account proof parent nodes /// @param _storageRoot storage root received from account proof + /// @return bool status function proveOpenST( uint256 _blockHeight, bytes32 _value, @@ -200,4 +229,29 @@ contract Core is CoreInterface, Util { return true; } + + /// @dev public function returns stateRoot for a blockHeight + /// @param _blockHeight block number + /// @return bytes32 + function getStateRoot( + uint256 _blockHeight) + public + view + returns (bytes32 /* state root */) + { + return stateRoots[_blockHeight]; + } + + /// @dev public function returns storageRoot for a blockHeight + /// @param _blockHeight block number + /// @return bytes32 + function getStorageRoot( + uint256 _blockHeight) + public + view + returns (bytes32 /* storage root */) + { + return storageRoots[_blockHeight]; + } + } \ No newline at end of file From c414f00ea198c283844f5cbd7576768a011272ec Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Mon, 4 Jun 2018 16:16:51 +0530 Subject: [PATCH 0088/1361] Refactoring convert let -> const and fixing indentation --- test/ContractStructureTest.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/ContractStructureTest.js b/test/ContractStructureTest.js index 8435b86b..5d2f0c48 100644 --- a/test/ContractStructureTest.js +++ b/test/ContractStructureTest.js @@ -1,12 +1,13 @@ -let SolidityParser = require("solparse"); +const SolidityParser = require("solparse"); //todo We can extend this test for all the solidity contracts. But it's out of scope for now -const contracts = [{ +const contracts = [ + { name: "OpenSTUtility.sol", path: "./contracts/OpenSTUtility.sol" -} - , { + }, + { name: "OpenSTValue.sol", path: "./contracts/OpenSTValue.sol" } @@ -63,7 +64,7 @@ function getListOfDataTypesInContract(file,) { describe('Contract Structure Test', async () => { - let validSequence = ["event", "constant", "mapping", "variable", "array", "struct"]; + const validSequence = ["event", "constant", "mapping", "variable", "array", "struct"]; contracts.map(file => { let dataTypesInContract = getListOfDataTypesInContract(file); From 5a893fc416de5ec9f1306ddf98220c2ca23bec7f Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Mon, 4 Jun 2018 19:31:28 +0530 Subject: [PATCH 0089/1361] [MOSA-96] - Fixed Warning: Use of the "var" keyword is deprecated in RLP.sol --- contracts/proof/RLP.sol | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/contracts/proof/RLP.sol b/contracts/proof/RLP.sol index e90b4f79..70a8af29 100644 --- a/contracts/proof/RLP.sol +++ b/contracts/proof/RLP.sol @@ -33,8 +33,8 @@ library RLP { function next(Iterator memory self) internal pure returns (RLPItem memory subItem) { require(hasNext(self)); - var ptr = self._unsafe_nextPtr; - var itemLength = _itemLength(ptr); + uint256 ptr = self._unsafe_nextPtr; + uint256 itemLength = _itemLength(ptr); subItem._unsafe_memPtr = ptr; subItem._unsafe_length = itemLength; self._unsafe_nextPtr = ptr + itemLength; @@ -47,7 +47,7 @@ library RLP { } function hasNext(Iterator memory self) internal pure returns (bool) { - var item = self._unsafe_item; + RLPItem memory item = self._unsafe_item; return self._unsafe_nextPtr < item._unsafe_memPtr + item._unsafe_length; } @@ -73,7 +73,7 @@ library RLP { /// @param strict Will throw if the data is not RLP encoded. /// @return An RLPItem function toRLPItem(bytes memory self, bool strict) internal pure returns (RLPItem memory) { - var item = toRLPItem(self); + RLPItem memory item = toRLPItem(self); if(strict) { uint len = self.length; require(_payloadOffset(item) <= len); @@ -163,7 +163,7 @@ library RLP { /// @param self The RLPItem. /// @return The bytes. function toBytes(RLPItem memory self) internal pure returns (bytes memory bts) { - var len = self._unsafe_length; + uint256 len = self._unsafe_length; if (len == 0) return; bts = new bytes(len); @@ -176,7 +176,9 @@ library RLP { /// @return The decoded string. function toData(RLPItem memory self) internal pure returns (bytes memory bts) { require(isData(self)); - var (rStartPos, len) = _decode(self); + uint256 rStartPos; + uint256 len; + (rStartPos, len) = _decode(self); bts = new bytes(len); _copyToBytes(rStartPos, bts, len); } @@ -187,9 +189,10 @@ library RLP { /// @return Array of RLPItems. function toList(RLPItem memory self) internal pure returns (RLPItem[] memory list) { require(isList(self)); - var numItems = items(self); + uint256 numItems; + numItems = items(self); list = new RLPItem[](numItems); - var it = iterator(self); + Iterator memory it = iterator(self); uint idx; while(hasNext(it)) { list[idx] = next(it); @@ -203,7 +206,9 @@ library RLP { /// @return The decoded string. function toAscii(RLPItem memory self) internal pure returns (string memory str) { require(isData(self)); - var (rStartPos, len) = _decode(self); + uint256 rStartPos; + uint256 len; + (rStartPos, len) = _decode(self); bytes memory bts = new bytes(len); _copyToBytes(rStartPos, bts, len); str = string(bts); @@ -215,7 +220,9 @@ library RLP { /// @return The decoded string. function toUint(RLPItem memory self) internal pure returns (uint data) { require(isData(self)); - var (rStartPos, len) = _decode(self); + uint256 rStartPos; + uint256 len; + (rStartPos, len) = _decode(self); if (len > 32 || len == 0) revert(); assembly { @@ -229,7 +236,9 @@ library RLP { /// @return The decoded string. function toBool(RLPItem memory self) internal pure returns (bool data) { require(isData(self)); - var (rStartPos, len) = _decode(self); + uint256 rStartPos; + uint256 len; + (rStartPos, len) = _decode(self); require(len == 1); uint temp; assembly { @@ -245,7 +254,9 @@ library RLP { /// @return The decoded string. function toByte(RLPItem memory self) internal pure returns (byte data) { require(isData(self)); - var (rStartPos, len) = _decode(self); + uint256 rStartPos; + uint256 len; + (rStartPos, len) = _decode(self); require(len == 1); uint temp; assembly { @@ -276,7 +287,9 @@ library RLP { /// @return The decoded string. function toAddress(RLPItem memory self) internal pure returns (address data) { require(isData(self)); - var (rStartPos, len) = _decode(self); + uint256 rStartPos; + uint256 len; + (rStartPos, len) = _decode(self); require (len == 20); assembly { data := div(mload(rStartPos), exp(256, 12)) From 7e69f65f53b4955960c0c8a24e9b5b81a06251cf Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Mon, 4 Jun 2018 20:20:17 +0530 Subject: [PATCH 0090/1361] Remove POC branches gate/develop, v0.9.3/develop from travis.yml --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index aa859243..8fc288c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,8 +5,6 @@ branches: only: - master - develop - - gate/develop - - v0.9.3/develop notifications: email: recipients: From 48d26187323e28c5c6d1171ad3dd172a38985b4f Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Mon, 4 Jun 2018 20:29:29 +0530 Subject: [PATCH 0091/1361] Move proof contracts from contract/proof directory to contracts directory --- contracts/Core.sol | 4 ++-- contracts/{proof => }/MerklePatriciaProof.sol | 0 contracts/{proof => }/RLP.sol | 0 contracts/{proof => }/util.sol | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename contracts/{proof => }/MerklePatriciaProof.sol (100%) rename contracts/{proof => }/RLP.sol (100%) rename contracts/{proof => }/util.sol (100%) diff --git a/contracts/Core.sol b/contracts/Core.sol index bc9dab4c..a4a14cdf 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -22,8 +22,8 @@ pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- import "./CoreInterface.sol"; -import "./proof/MerklePatriciaProof.sol"; -import "./proof/util.sol"; +import "./MerklePatriciaProof.sol"; +import "./util.sol"; import "./WorkersInterface.sol"; diff --git a/contracts/proof/MerklePatriciaProof.sol b/contracts/MerklePatriciaProof.sol similarity index 100% rename from contracts/proof/MerklePatriciaProof.sol rename to contracts/MerklePatriciaProof.sol diff --git a/contracts/proof/RLP.sol b/contracts/RLP.sol similarity index 100% rename from contracts/proof/RLP.sol rename to contracts/RLP.sol diff --git a/contracts/proof/util.sol b/contracts/util.sol similarity index 100% rename from contracts/proof/util.sol rename to contracts/util.sol From d39bfcf0a0c699288b64712998d4d7ea5cd55844 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Mon, 4 Jun 2018 17:54:40 +0200 Subject: [PATCH 0092/1361] contracts: adds HasIntents.sol, hashIntentkey fn in Hasher.sol, intent in stake, removes intent in processStaking --- contracts/HasIntents.sol | 32 ++++++++++++++++++++++++++++++++ contracts/Hasher.sol | 12 ++++++++++++ contracts/OpenSTValue.sol | 8 ++++++-- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 contracts/HasIntents.sol diff --git a/contracts/HasIntents.sol b/contracts/HasIntents.sol new file mode 100644 index 00000000..45ef4b03 --- /dev/null +++ b/contracts/HasIntents.sol @@ -0,0 +1,32 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: Intents +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + + +contract HasIntents { + /* + * Mappings + */ + mapping(bytes32 /* intentHash */ => bytes32) internal intents; + +} \ No newline at end of file diff --git a/contracts/Hasher.sol b/contracts/Hasher.sol index e829bc10..f81df200 100644 --- a/contracts/Hasher.sol +++ b/contracts/Hasher.sol @@ -93,4 +93,16 @@ contract Hasher { _unlockHeight, _hashLock); } + + function hashIntentKey( + address _staker, + uint256 _nonce) + public + pure + returns (bytes32) + { + return keccak256( + _staker, + _nonce); + } } \ No newline at end of file diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 2a645645..80343571 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -32,9 +32,9 @@ import "./ProtocolVersioned.sol"; // value chain contracts import "./SimpleStake.sol"; - +/// Inherited contract Intents position should not be changed to maintain index position of intents mapping /// @title OpenSTValue - value staking contract for OpenST -contract OpenSTValue is OpsManaged, Hasher { +contract OpenSTValue is Intents, OpsManaged, Hasher { using SafeMath for uint256; /* @@ -221,6 +221,8 @@ contract OpenSTValue is OpsManaged, Hasher { unlockHeight: unlockHeight, hashLock: _hashLock }); + ///Add intent hash to intents mapping + intents[hashIntentKey(_staker, nonce)] = stakingIntentHash; emit StakingIntentDeclared(_uuid, _staker, nonce, _beneficiary, _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); @@ -257,6 +259,8 @@ contract OpenSTValue is OpsManaged, Hasher { stake.amountST, stake.amountUT, _unlockSecret); delete stakes[_stakingIntentHash]; + ///Remove intent hash from intents mapping + delete intents[hashIntentKey(_staker, nonce)]; return stakeAddress; } From 360fd18a0f527aa853a39e5743053e963173533d Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Mon, 4 Jun 2018 17:58:24 +0200 Subject: [PATCH 0093/1361] contracts: fixed imported contract name --- contracts/HasIntents.sol | 2 +- contracts/OpenSTValue.sol | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/HasIntents.sol b/contracts/HasIntents.sol index 45ef4b03..33e1da6e 100644 --- a/contracts/HasIntents.sol +++ b/contracts/HasIntents.sol @@ -16,7 +16,7 @@ pragma solidity ^0.4.23; // limitations under the License. // // ---------------------------------------------------------------------------- -// Common: Intents +// Common: HasIntents // // http://www.simpletoken.org/ // diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 80343571..48d0a5f2 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -28,13 +28,14 @@ import "./OpsManaged.sol"; import "./EIP20Interface.sol"; import "./CoreInterface.sol"; import "./ProtocolVersioned.sol"; +import "./HasIntents.sol"; // value chain contracts import "./SimpleStake.sol"; -/// Inherited contract Intents position should not be changed to maintain index position of intents mapping +/// Inherited contract HasIntents position should not be changed to maintain index position of intents mapping at 0 /// @title OpenSTValue - value staking contract for OpenST -contract OpenSTValue is Intents, OpsManaged, Hasher { +contract OpenSTValue is HasIntents, OpsManaged, Hasher { using SafeMath for uint256; /* From f4213fb3b2bc7009a249a41a96c133e514f3ac57 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Mon, 4 Jun 2018 18:36:19 +0200 Subject: [PATCH 0094/1361] contracts: fixes staker address and nonce in processStaking fn --- contracts/OpenSTValue.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 48d0a5f2..10dc5585 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -258,10 +258,11 @@ contract OpenSTValue is HasIntents, OpsManaged, Hasher { emit ProcessedStake(stake.uuid, _stakingIntentHash, stakeAddress, stake.staker, stake.amountST, stake.amountUT, _unlockSecret); + ///Remove intent hash from intents mapping + delete intents[hashIntentKey(stake.staker, stake.nonce)]; delete stakes[_stakingIntentHash]; - ///Remove intent hash from intents mapping - delete intents[hashIntentKey(_staker, nonce)]; + return stakeAddress; } From 01263aae326d4d0d4693fe14338c849fa26697d3 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 5 Jun 2018 13:51:25 +0530 Subject: [PATCH 0095/1361] contract: changes related to blocksToWaitX, BLOCKS_TO_WAIT_X and TIME_TO_WAIT_X in OpenSTValue and OpenSTUtility. MOSA-65 --- contracts/OpenSTUtility.sol | 34 ++++++++++++++++++--------------- contracts/OpenSTUtilityMock.sol | 21 ++++++++++---------- contracts/OpenSTValue.sol | 33 +++++++++++++++++--------------- contracts/OpenSTValueMock.sol | 20 +++++++++---------- test/Gate_utils.js | 5 ++++- test/OpenSTUtility_utils.js | 5 ++++- test/OpenSTValue_utils.js | 6 +++++- test/Protocol_utils.js | 8 ++++++-- test/Registrar_utils.js | 8 ++++++-- test/lib/constants.js | 6 ++++++ 10 files changed, 89 insertions(+), 57 deletions(-) create mode 100644 test/lib/constants.js diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index f1fea45b..ac5decf2 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -96,10 +96,16 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /* * Constants */ - // ~2 weeks, assuming ~15s per block - uint256 public constant BLOCKS_TO_WAIT_LONG = 80667; - // ~1hour, assuming ~15s per block - uint256 public constant BLOCKS_TO_WAIT_SHORT = 240; + // ~2 weeks + uint256 private constant TIME_TO_WAIT_LONG = 1209600; + // ~5Days + uint256 private constant TIME_TO_WAIT_MEDIUM = 432000; + // ~1hour + uint256 private constant TIME_TO_WAIT_SHORT = 3600; + + uint256 public blocksToWaitShort; + uint256 public blocksToWaitMedium; + uint256 public blocksToWaitLong; /* * Storage @@ -142,7 +148,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { constructor( uint256 _chainIdValue, uint256 _chainIdUtility, - address _registrar) + address _registrar, + uint256 _blockTime) public OpsManaged() { @@ -150,6 +157,10 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_chainIdUtility != 0); require(_registrar != address(0)); + blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); + blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); + blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); + chainIdValue = _chainIdValue; chainIdUtility = _chainIdUtility; registrar = _registrar; @@ -211,7 +222,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_stakingUnlockHeight > 0); require(_stakingIntentHash != ""); - expirationHeight = block.number + blocksToWaitShort(); + expirationHeight = block.number + blocksToWaitShort; nonces[_staker] = _stakerNonce; bytes32 stakingIntentHash = hashStakingIntent( @@ -338,7 +349,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(token.allowance(msg.sender, address(this)) >= _amountBT); require(token.transferFrom(msg.sender, address(this), _amountBT)); - unlockHeight = block.number + blocksToWaitLong(); + unlockHeight = block.number + blocksToWaitLong; redemptionIntentHash = hashRedemptionIntent( _uuid, @@ -389,7 +400,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { nonces[msg.sender] = _nonce; amountSTP = msg.value; - unlockHeight = block.number + blocksToWaitLong(); + unlockHeight = block.number + blocksToWaitLong; redemptionIntentHash = hashRedemptionIntent( uuidSTPrime, @@ -683,11 +694,4 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { return true; } - function blocksToWaitLong() public pure returns (uint256) { - return BLOCKS_TO_WAIT_LONG; - } - - function blocksToWaitShort() public pure returns (uint256) { - return BLOCKS_TO_WAIT_SHORT; - } } diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol index 8b99628a..8438694b 100644 --- a/contracts/OpenSTUtilityMock.sol +++ b/contracts/OpenSTUtilityMock.sol @@ -26,8 +26,10 @@ import "./OpenSTUtility.sol"; /// @title OpenSTUtilityMock /// @dev Overrides certain durational constants and getters to ease testing OpenSTUtility contract OpenSTUtilityMock is OpenSTUtility { - uint256 private constant BLOCKS_TO_WAIT_LONG = 8; - uint256 private constant BLOCKS_TO_WAIT_SHORT = 5; + + uint256 private constant TIME_TO_WAIT_LONG = 16; + uint256 private constant TIME_TO_WAIT_MEDIUM = 14; + uint256 private constant TIME_TO_WAIT_SHORT = 10; /* * Public functions @@ -35,15 +37,14 @@ contract OpenSTUtilityMock is OpenSTUtility { constructor( uint256 _chainIdValue, uint256 _chainIdUtility, - address _registrar) - OpenSTUtility(_chainIdValue, _chainIdUtility, _registrar) - public { } + address _registrar, + uint256 _blockTime) + OpenSTUtility(_chainIdValue, _chainIdUtility, _registrar, _blockTime) + public { - function blocksToWaitLong() public pure returns (uint256) { - return BLOCKS_TO_WAIT_LONG; - } + blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); + blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); + blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); - function blocksToWaitShort() public pure returns (uint256) { - return BLOCKS_TO_WAIT_SHORT; } } \ No newline at end of file diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 2a645645..be3b56cf 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -69,10 +69,16 @@ contract OpenSTValue is OpsManaged, Hasher { */ uint8 public constant TOKEN_DECIMALS = 18; uint256 public constant DECIMALSFACTOR = 10**uint256(TOKEN_DECIMALS); - // ~2 weeks, assuming ~15s per block - uint256 private constant BLOCKS_TO_WAIT_LONG = 80667; - // ~1hour, assuming ~15s per block - uint256 private constant BLOCKS_TO_WAIT_SHORT = 240; + // ~2 weeks + uint256 private constant TIME_TO_WAIT_LONG = 1209600; + // ~5Days + uint256 private constant TIME_TO_WAIT_MEDIUM = 432000; + // ~1hour + uint256 private constant TIME_TO_WAIT_SHORT = 3600; + + uint256 public blocksToWaitShort; + uint256 public blocksToWaitMedium; + uint256 public blocksToWaitLong; /* * Structures @@ -141,7 +147,8 @@ contract OpenSTValue is OpsManaged, Hasher { constructor( uint256 _chainIdValue, EIP20Interface _eip20token, - address _registrar) + address _registrar, + uint256 _blockTime) public OpsManaged() { @@ -149,6 +156,10 @@ contract OpenSTValue is OpsManaged, Hasher { require(_eip20token != address(0)); require(_registrar != address(0)); + blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); + blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); + blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); + chainIdValue = _chainIdValue; valueToken = _eip20token; // registrar cannot be reset @@ -195,7 +206,7 @@ contract OpenSTValue is OpsManaged, Hasher { amountUT = (_amountST.mul(utilityToken.conversionRate)) .div(10**uint256(utilityToken.conversionRateDecimals)); - unlockHeight = block.number + blocksToWaitLong(); + unlockHeight = block.number + blocksToWaitLong; nonces[_staker]++; nonce = nonces[_staker]; @@ -331,7 +342,7 @@ contract OpenSTValue is OpsManaged, Hasher { require(_redemptionIntentHash == redemptionIntentHash); - expirationHeight = block.number + blocksToWaitShort(); + expirationHeight = block.number + blocksToWaitShort; UtilityToken storage utilityToken = utilityTokens[_uuid]; // minimal precision to unstake 1 STWei @@ -441,14 +452,6 @@ contract OpenSTValue is OpsManaged, Hasher { return (nonces[_account] + 1); } - function blocksToWaitLong() public pure returns (uint256) { - return BLOCKS_TO_WAIT_LONG; - } - - function blocksToWaitShort() public pure returns (uint256) { - return BLOCKS_TO_WAIT_SHORT; - } - /// @dev Returns size of uuids /// @return size function getUuidsSize() public view returns (uint256) { diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 0812e7aa..fec61ebb 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -26,8 +26,9 @@ import "./OpenSTValue.sol"; /// @title OpenSTValueMock /// @dev Overrides certain durational constants and getters to ease testing OpenSTValue contract OpenSTValueMock is OpenSTValue { - uint256 private constant BLOCKS_TO_WAIT_LONG = 8; - uint256 private constant BLOCKS_TO_WAIT_SHORT = 5; + uint256 private constant TIME_TO_WAIT_LONG = 120; + uint256 private constant TIME_TO_WAIT_MEDIUM = 90; + uint256 private constant TIME_TO_WAIT_SHORT = 75; /* * Public functions @@ -35,15 +36,14 @@ contract OpenSTValueMock is OpenSTValue { constructor( uint256 _chainIdValue, EIP20Interface _eip20token, - address _registrar) - OpenSTValue(_chainIdValue, _eip20token, _registrar) - public { } + address _registrar, + uint256 _blockTime) + OpenSTValue(_chainIdValue, _eip20token, _registrar, _blockTime) + public { - function blocksToWaitLong() public pure returns (uint256) { - return BLOCKS_TO_WAIT_LONG; - } + blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); + blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); + blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); - function blocksToWaitShort() public pure returns (uint256) { - return BLOCKS_TO_WAIT_SHORT; } } \ No newline at end of file diff --git a/test/Gate_utils.js b/test/Gate_utils.js index 38402ac8..444b8450 100644 --- a/test/Gate_utils.js +++ b/test/Gate_utils.js @@ -28,6 +28,9 @@ const OpenSTValue_utils = require('./OpenSTValue_utils.js') , Workers = artifacts.require("./Workers.sol") ; +const rootPrefix = ".." + , constants = require(rootPrefix + '/test/lib/constants') +; const Assert = require('assert') , BigNumber = require('bignumber.js') ; @@ -58,7 +61,7 @@ module.exports.deployGate = async (artifacts, accounts) => { await valueToken.setAdminAddress(admin); // SimpleToken must be finalized to permit certain transfers assert.ok(await valueToken.finalize({ from: admin })); - openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); + openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar, constants.VALUE_CHAIN_BLOCK_TIME); core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); await openSTValue.addCore(core.address, { from: registrar }); diff --git a/test/OpenSTUtility_utils.js b/test/OpenSTUtility_utils.js index a2ec2d8c..614e1c88 100644 --- a/test/OpenSTUtility_utils.js +++ b/test/OpenSTUtility_utils.js @@ -20,6 +20,9 @@ // ---------------------------------------------------------------------------- const BigNumber = require('bignumber.js'); +const rootPrefix = ".." + , constants = require(rootPrefix + '/test/lib/constants') +; var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); var STPrime = artifacts.require("./STPrime.sol"); @@ -31,7 +34,7 @@ const chainIdUtility = 1410; module.exports.deployOpenSTUtility = async (artifacts, accounts) => { const registrar = accounts[1]; - const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar, { gas: 10000000 }); + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar, constants.UTILITY_CHAIN_BLOCK_TIME, { gas: 10000000 }); const stPrimeAddress = await openSTUtility.simpleTokenPrime.call(); const stPrime = new STPrime(stPrimeAddress); diff --git a/test/OpenSTValue_utils.js b/test/OpenSTValue_utils.js index 02795b0a..fe2342cf 100644 --- a/test/OpenSTValue_utils.js +++ b/test/OpenSTValue_utils.js @@ -21,6 +21,10 @@ const BigNumber = require('bignumber.js'); +const rootPrefix = ".." + , constants = require(rootPrefix + '/test/lib/constants') +; + //var OpenSTValue = artifacts.require("./OpenSTValue.sol"); var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); @@ -36,7 +40,7 @@ module.exports.deployOpenSTValue = async (artifacts, accounts) => { // SimpleToken must be finalized to permit certain transfers assert.ok(await valueToken.finalize({ from: accounts[1] })); - const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); + const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar, constants.VALUE_CHAIN_BLOCK_TIME); return { valueToken : valueToken, diff --git a/test/Protocol_utils.js b/test/Protocol_utils.js index 43f28353..bf225add 100644 --- a/test/Protocol_utils.js +++ b/test/Protocol_utils.js @@ -22,6 +22,10 @@ const BigNumber = require('bignumber.js'); const Assert = require('assert'); +const rootPrefix = ".." + , constants = require(rootPrefix + '/test/lib/constants') +; + const utils = require("./lib/utils.js"); const openSTValueUtils = require("./OpenSTValue_utils.js"); @@ -80,7 +84,7 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { "Registrar.completeOwnershipTransfer"); const openSTValue = await OpenSTValue.new(CHAINID_VALUE, simpleToken.address, - registrarVC.address); + registrarVC.address, constants.VALUE_CHAIN_BLOCK_TIME); await utils.logTransaction(openSTValue.transactionHash, "OpenSTValue.new"); utils.logResponse(await openSTValue.initiateOwnershipTransfer(owner, { from: deployMachine }), "OpenSTValue.initiateOwnershipTransfer"); @@ -88,7 +92,7 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { "OpenSTValue.completeOwnershipTransfer"); const openSTUtility = await OpenSTUtility.new(CHAINID_VALUE, CHAINID_UTILITY, - registrarUC.address, { from: deployMachine, gas: 8500000 }); + registrarUC.address,constants.UTILITY_CHAIN_BLOCK_TIME, { from: deployMachine, gas: 8500000 }); await utils.logTransaction(openSTUtility.transactionHash, "OpenSTUtility.new"); utils.logResponse(await openSTUtility.initiateOwnershipTransfer(owner, { from: deployMachine }), "OpenSTUtility.initiateOwnershipTransfer"); diff --git a/test/Registrar_utils.js b/test/Registrar_utils.js index 5cd31c22..7f9580dc 100644 --- a/test/Registrar_utils.js +++ b/test/Registrar_utils.js @@ -21,6 +21,10 @@ const BigNumber = require('bignumber.js'); +const rootPrefix = ".." + , constants = require(rootPrefix + '/test/lib/constants') +; + var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); var Registrar = artifacts.require("./Registrar.sol"); var OpenSTUtility = artifacts.require("./OpenSTUtility.sol"); @@ -46,8 +50,8 @@ module.exports.deployRegistrar = async (artifacts, accounts) => { await valueToken.finalize({ from: accounts[3] }); await valueToken.transfer(staker, amountST); - const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, { gas: 10000000 }); - const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address); + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, constants.UTILITY_CHAIN_BLOCK_TIME, { gas: 10000000 }); + const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address, constants.VALUE_CHAIN_BLOCK_TIME); const core = await Core.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address); return { diff --git a/test/lib/constants.js b/test/lib/constants.js new file mode 100644 index 00000000..12ac9b8c --- /dev/null +++ b/test/lib/constants.js @@ -0,0 +1,6 @@ + +const constants = { + VALUE_CHAIN_BLOCK_TIME: 15, // in seconds + UTILITY_CHAIN_BLOCK_TIME: 2, // in seconds +}; +module.exports = constants; From 6ab36ba891abdf94a4e8deb845fc8734536ab25a Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 5 Jun 2018 14:01:13 +0530 Subject: [PATCH 0096/1361] contract: added require check for blockHeight in OpenSTValue and OpenSTUtility. MOSA-65 --- contracts/OpenSTUtility.sol | 1 + contracts/OpenSTValue.sol | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index a480683b..63583555 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -158,6 +158,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_chainIdValue != 0); require(_chainIdUtility != 0); require(_registrar != address(0)); + require(_blockTime != 0); blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 67cf6ae6..bd4b6ed8 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -156,7 +156,8 @@ contract OpenSTValue is OpsManaged, Hasher { require(_chainIdValue != 0); require(_eip20token != address(0)); require(_registrar != address(0)); - + require(_blockTime != 0); + blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); From 8b8870290449126c5ac3d1597c81132a9a786fa4 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 5 Jun 2018 15:28:02 +0530 Subject: [PATCH 0097/1361] contract: moved the vaiables at the appropriate position. MOSA-65 --- contracts/OpenSTUtility.sol | 9 +- contracts/OpenSTValue.sol | 11 +- package-lock.json | 6288 ++++++++++++++++++++++------------- 3 files changed, 3954 insertions(+), 2354 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 63583555..06bdc646 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -78,10 +78,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { // ~1hour uint256 private constant TIME_TO_WAIT_SHORT = 3600; - uint256 public blocksToWaitShort; - uint256 public blocksToWaitMedium; - uint256 public blocksToWaitLong; - /* * Storage */ @@ -110,8 +106,13 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /// chainId of the current utility chain uint256 public chainIdUtility; address public registrar; + uint256 public blocksToWaitShort; + uint256 public blocksToWaitMedium; + uint256 public blocksToWaitLong; bytes32[] public uuids; + + /// registered branded tokens /* * Structures diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index bd4b6ed8..1a460653 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -76,11 +76,6 @@ contract OpenSTValue is OpsManaged, Hasher { // ~1hour uint256 private constant TIME_TO_WAIT_SHORT = 3600; - uint256 public blocksToWaitShort; - uint256 public blocksToWaitMedium; - uint256 public blocksToWaitLong; - - /// register the active stakes and unstakes mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; mapping(uint256 /* chainIdUtility */ => CoreInterface) internal cores; @@ -99,6 +94,10 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 public chainIdValue; EIP20Interface public valueToken; address public registrar; + uint256 public blocksToWaitShort; + uint256 public blocksToWaitMedium; + uint256 public blocksToWaitLong; + bytes32[] public uuids; /* @@ -157,7 +156,7 @@ contract OpenSTValue is OpsManaged, Hasher { require(_eip20token != address(0)); require(_registrar != address(0)); require(_blockTime != 0); - + blocksToWaitShort = TIME_TO_WAIT_SHORT.div(_blockTime); blocksToWaitMedium = TIME_TO_WAIT_MEDIUM.div(_blockTime); blocksToWaitLong = TIME_TO_WAIT_LONG.div(_blockTime); diff --git a/package-lock.json b/package-lock.json index bffaa1cd..44e24c02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,16 +10,25 @@ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, "@nodelib/fs.stat": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.0.2.tgz", - "integrity": "sha512-vCpf75JDcdomXvUd7Rn6DfYAVqPAFI66FVjxiWGwh85OLdvfo3paBoPJaam5keIYRyUolnS7SleS/ZPCidCvzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz", + "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==", "dev": true }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", @@ -32,19 +41,20 @@ "integrity": "sha512-nvLArBx0XOJufWyaghMKtIofZDBwEMdVZoqcetQOIe1qYeKZk4+kRYGPEJ5lt7dD3MLulw//amUzOJLM8eW5RA==", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-loader": "6.4.1", - "babel-plugin-add-module-exports": "0.2.1", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-es2015": "6.24.1", - "chai": "3.5.0", - "web3": "0.18.4", - "webpack": "2.7.0" + "babel-core": "^6.23.1", + "babel-loader": "^6.3.2", + "babel-plugin-add-module-exports": "^0.2.1", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-preset-es2015": "^6.22.0", + "chai": "^3.5.0", + "web3": "^0.18.4", + "webpack": "^2.7.0" }, "dependencies": { "bignumber.js": { "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", "dev": true }, "web3": { @@ -54,18 +64,27 @@ "dev": true, "requires": { "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" } } } }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", + "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", "dev": true }, "acorn-dynamic-import": { @@ -74,7 +93,7 @@ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { @@ -86,13 +105,14 @@ } }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -107,9 +127,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "ansi-escapes": { @@ -119,10 +139,9 @@ "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "2.2.1", @@ -131,19 +150,24 @@ "dev": true }, "any-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", - "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", "dev": true }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -170,13 +194,18 @@ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -197,15 +226,19 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.1", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -216,6 +249,11 @@ "util": "0.10.3" } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -229,18 +267,18 @@ "dev": true }, "ast-types": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", - "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.5.tgz", + "integrity": "sha512-oJjo+5e7/vEc2FBK8gUalV0pba4L3VdBIs2EKhOLHLcOd2FgQIVQN9xb0eZ9IjEWyAL7vq6fGJxOvVvdCHNyMw==", "dev": true }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.10" } }, "async-each": { @@ -249,21 +287,41 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "atob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -272,25 +330,36 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "babel-generator": { @@ -299,14 +368,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, "babel-helper-bindify-decorators": { @@ -315,9 +384,9 @@ "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -326,9 +395,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-call-delegate": { @@ -337,10 +406,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -349,10 +418,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -361,9 +430,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-explode-class": { @@ -372,10 +441,10 @@ "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", "dev": true, "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -384,11 +453,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -397,8 +466,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -407,8 +476,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -417,8 +486,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -427,9 +496,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -438,11 +507,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -451,12 +520,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -465,8 +534,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-loader": { @@ -475,10 +544,10 @@ "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", "dev": true, "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "find-cache-dir": "^0.1.1", + "loader-utils": "^0.2.16", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1" } }, "babel-messages": { @@ -487,7 +556,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-add-module-exports": { @@ -502,7 +571,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-async-functions": { @@ -577,9 +646,9 @@ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-async-to-generator": { @@ -588,9 +657,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-constructor-call": { @@ -599,9 +668,9 @@ "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", "dev": true, "requires": { - "babel-plugin-syntax-class-constructor-call": "6.18.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-class-properties": { @@ -610,10 +679,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-decorators": { @@ -622,11 +691,11 @@ "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", "dev": true, "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -635,7 +704,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -644,7 +713,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -653,11 +722,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -666,15 +735,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -683,8 +752,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -693,7 +762,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -702,8 +771,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -712,7 +781,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -721,9 +790,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -732,7 +801,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -741,9 +810,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -752,10 +821,10 @@ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -764,9 +833,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -775,9 +844,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -786,8 +855,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -796,12 +865,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -810,8 +879,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -820,7 +889,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -829,9 +898,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -840,7 +909,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -849,7 +918,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -858,9 +927,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -869,9 +938,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-export-extensions": { @@ -880,8 +949,8 @@ "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", "dev": true, "requires": { - "babel-plugin-syntax-export-extensions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -890,8 +959,8 @@ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -900,8 +969,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -910,7 +979,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-runtime": { @@ -919,7 +988,7 @@ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-strict-mode": { @@ -928,8 +997,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-es2015": { @@ -938,30 +1007,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" } }, "babel-preset-stage-1": { @@ -970,9 +1039,9 @@ "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", "dev": true, "requires": { - "babel-plugin-transform-class-constructor-call": "6.24.1", - "babel-plugin-transform-export-extensions": "6.22.0", - "babel-preset-stage-2": "6.24.1" + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" } }, "babel-preset-stage-2": { @@ -981,10 +1050,10 @@ "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", "dev": true, "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" } }, "babel-preset-stage-3": { @@ -993,11 +1062,11 @@ "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", "dev": true, "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" } }, "babel-register": { @@ -1006,13 +1075,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.6", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -1021,8 +1090,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.6", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1031,11 +1100,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1044,15 +1113,26 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "babel-types": { @@ -1061,10 +1141,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1076,8 +1156,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1085,13 +1164,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1100,7 +1179,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1109,7 +1188,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1118,7 +1197,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1127,9 +1206,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -1143,8 +1222,16 @@ "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } }, "big.js": { "version": "3.2.0", @@ -1179,19 +1266,66 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1201,16 +1335,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -1219,7 +1353,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1227,74 +1361,75 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.1", - "safe-buffer": "5.1.2" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", - "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.1" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sha3": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", + "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "requires": { + "js-sha3": "^0.3.1" } }, "browserify-sign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.1", - "parse-asn1": "5.1.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1303,31 +1438,57 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", + "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.11", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "buffer-from": { + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-fill": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", "dev": true }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { "version": "1.1.1", @@ -1341,21 +1502,26 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "cacheable-request": { @@ -1388,10 +1554,14 @@ "dev": true }, "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "center-align": { "version": "0.1.3", @@ -1399,8 +1569,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chai": { @@ -1409,9 +1579,9 @@ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", "dev": true, "requires": { - "assertion-error": "1.1.0", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" } }, "chalk": { @@ -1420,11 +1590,34 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, "chardet": { @@ -1439,28 +1632,27 @@ "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.1", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.1.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" } }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "class-utils": { @@ -1469,10 +1661,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -1481,7 +1673,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -1492,7 +1684,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-spinners": { @@ -1525,7 +1717,44 @@ "dev": true, "requires": { "slice-ansi": "0.0.4", - "string-width": "1.0.2" + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "cli-width": { @@ -1535,14 +1764,13 @@ "dev": true }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "clone": { @@ -1563,7 +1791,7 @@ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, "requires": { - "mimic-response": "1.0.0" + "mimic-response": "^1.0.0" } }, "clone-stats": { @@ -1578,22 +1806,20 @@ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { - "inherits": "2.0.1", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-visit": { "version": "1.0.0", @@ -1601,8 +1827,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -1611,7 +1837,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -1621,20 +1847,24 @@ "dev": true }, "colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", + "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", "dev": true }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "graceful-readlink": "1.0.1" + "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1650,8 +1880,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-browserify": { "version": "1.1.0", @@ -1659,7 +1888,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -1668,12 +1897,32 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -1681,88 +1930,92 @@ "dev": true }, "core-js": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", - "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "^4", + "vary": "^1" + } }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.1", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.1", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.1", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "crypto-js": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", + "dev": true }, "d": { "version": "1.0.0", @@ -1770,7 +2023,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.42" + "es5-ext": "^0.10.9" } }, "dargs": { @@ -1779,6 +2032,14 @@ "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "date-fns": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", @@ -1798,10 +2059,9 @@ "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { "ms": "2.0.0" } @@ -1809,22 +2069,100 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + } }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, "requires": { - "mimic-response": "1.0.0" + "mimic-response": "^1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + } } }, "deep-eql": { @@ -1856,8 +2194,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1866,7 +2204,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1875,7 +2213,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1884,9 +2222,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -1897,16 +2235,30 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, "requires": { - "inherits": "2.0.1", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, "detect-conflict": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", @@ -1919,24 +2271,22 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dir-glob": { @@ -1945,8 +2295,8 @@ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" + "arrify": "^1.0.1", + "path-type": "^3.0.0" }, "dependencies": { "path-type": { @@ -1955,7 +2305,7 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "pify": { @@ -1966,6 +2316,11 @@ } } }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -1975,8 +2330,16 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } }, "editions": { "version": "1.3.4", @@ -1984,6 +2347,11 @@ "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", "dev": true }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "ejs": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", @@ -2000,15 +2368,14 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.1", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -2017,22 +2384,35 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "envinfo": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-4.4.2.tgz", - "integrity": "sha512-5rfRs+m+6pwoKRCFqpsA5+qsLngFms1aWPrxfKbrObCzQaPc3M3yPloZx+BL9UE3dK58cxw36XVQbFRSCCfGSQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-5.10.0.tgz", + "integrity": "sha512-rXbzXWvnQxy+TcqZlARbWVQwgGVVouVJgFZhLVN5htjLxl1thstrP2ZGi0pXC309AbK7gVOPU+ulz/tmpCI7iw==", "dev": true }, "errno": { @@ -2041,7 +2421,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error": { @@ -2050,8 +2430,8 @@ "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", "dev": true, "requires": { - "string-template": "0.2.1", - "xtend": "4.0.1" + "string-template": "~0.2.1", + "xtend": "~4.0.0" } }, "error-ex": { @@ -2060,18 +2440,18 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es5-ext": { - "version": "0.10.42", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", - "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-iterator": { @@ -2080,9 +2460,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -2091,12 +2471,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-set": { @@ -2105,11 +2485,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -2118,8 +2498,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -2128,17 +2508,21 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escope": { "version": "3.6.0", @@ -2146,10 +2530,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { @@ -2164,7 +2548,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -2179,13 +2563,32 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-lib": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", + "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "keccakjs": "^0.2.1", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, "ethereumjs-testrpc": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", "dev": true, "requires": { - "webpack": "3.12.0" + "webpack": "^3.0.0" }, "dependencies": { "ajv": { @@ -2194,10 +2597,10 @@ "integrity": "sha512-VDUX1oSajablmiyFyED9L1DFndg0P9h7p1F+NO8FkIzei6EPrR6Zu1n18rd5P8PqaSRd/FrWv3G1TVBqpM83gA==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1", - "uri-js": "4.2.1" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^4.2.1" } }, "ajv-keywords": { @@ -2207,15 +2610,9 @@ "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "cliui": { @@ -2224,9 +2621,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -2235,38 +2632,38 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "locate-path": "2.0.0" + "number-is-nan": "^1.0.0" } }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "loader-utils": { @@ -2275,20 +2672,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "path-type": { @@ -2297,7 +2683,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "read-pkg": { @@ -2306,9 +2692,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -2317,35 +2703,17 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -2354,70 +2722,55 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, "webpack": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "dev": true, "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "6.5.0", - "ajv-keywords": "3.2.0", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "yargs": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" } }, "yargs-parser": { @@ -2426,21 +2779,42 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, + "eventemitter3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -2451,25 +2825,23 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exit-hook": { @@ -2484,22 +2856,31 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -2508,7 +2889,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -2519,7 +2900,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.4" + "fill-range": "^2.1.0" }, "dependencies": { "fill-range": { @@ -2528,11 +2909,11 @@ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "is-number": { @@ -2541,7 +2922,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "isobject": { @@ -2561,17 +2942,145 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } } }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2580,7 +3089,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2591,9 +3100,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -2602,14 +3111,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -2618,7 +3127,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -2627,7 +3136,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -2636,7 +3145,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2645,7 +3154,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2654,9 +3163,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -2667,11 +3176,15 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, "fast-glob": { "version": "2.2.2", @@ -2679,19 +3192,26 @@ "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", "dev": true, "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "@nodelib/fs.stat": "1.0.2", - "glob-parent": "3.1.0", - "is-glob": "4.0.0", - "merge2": "1.2.2", - "micromatch": "3.1.10" + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.0.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" } }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } }, "figures": { "version": "2.0.0", @@ -2699,9 +3219,14 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -2714,10 +3239,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -2726,8 +3251,37 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, @@ -2737,19 +3291,17 @@ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "locate-path": "^2.0.0" } }, "first-chunk-stream": { @@ -2758,15 +3310,23 @@ "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.2" } }, "flow-parser": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.72.0.tgz", - "integrity": "sha512-kFaDtviKlD/rHi6NRp42KTbnPgz/nKcWUJQhqDnLDeKA8uGcRVSy0YlQjaf9M3pFo5PgC3SNFnCPpQGLtHjH2w==", + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.73.0.tgz", + "integrity": "sha512-9JB+2hrKJ+S1OZ+upIwNTGlaLDRga2iC9KvpqWVFEVNlCxc51pkhNJRmA0PmUcLcEtFAW6IGBmVi70r+j+Qp9A==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2779,46 +3339,82 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.1", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "fs-promise": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", + "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" + "any-promise": "^1.3.0", + "fs-extra": "^2.0.0", + "mz": "^2.6.0", + "thenify-all": "^1.6.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.4", @@ -2827,8 +3423,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.10.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -2854,8 +3450,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { @@ -2868,7 +3464,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -2932,7 +3528,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -2947,14 +3543,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -2963,12 +3559,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -2983,7 +3579,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } }, "ignore-walk": { @@ -2992,7 +3588,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -3001,8 +3597,8 @@ "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3021,7 +3617,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -3035,7 +3631,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3048,8 +3644,8 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, "minizlib": { @@ -3058,7 +3654,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "mkdirp": { @@ -3081,9 +3677,9 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { @@ -3092,16 +3688,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -3110,8 +3706,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -3126,8 +3722,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -3136,10 +3732,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3158,7 +3754,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3179,8 +3775,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -3201,10 +3797,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3221,13 +3817,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -3236,7 +3832,7 @@ "dev": true, "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -3279,9 +3875,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -3290,7 +3886,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -3298,7 +3894,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3313,13 +3909,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, "util-deprecate": { @@ -3334,7 +3930,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -3349,14 +3945,25 @@ } } }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "ganache-cli": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.0.tgz", "integrity": "sha512-FdTeyk4uLRHGeFiMe+Qnh4Hc5KiTVqvRVVvLDFJEVVKC1P1yHhEgZeh9sp1KhuvxSrxToxgJS25UapYQwH4zHw==", "dev": true, "requires": { - "source-map-support": "0.5.6", - "webpack-cli": "2.1.3" + "source-map-support": "^0.5.3", + "webpack-cli": "^2.0.9" }, "dependencies": { "source-map": { @@ -3371,8 +3978,8 @@ "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "buffer-from": "1.0.0", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } } } @@ -3380,14 +3987,12 @@ "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { "version": "2.0.6", @@ -3395,68 +4000,22 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "gh-got": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", "dev": true, "requires": { - "got": "7.1.0", - "is-plain-obj": "1.1.0" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, - "requires": { - "p-finally": "1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - } + "got": "^7.0.0", + "is-plain-obj": "^1.1.0" } }, "github-username": { @@ -3465,21 +4024,20 @@ "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", "dev": true, "requires": { - "gh-got": "6.0.0" + "gh-got": "^6.0.0" } }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-all": { @@ -3488,8 +4046,8 @@ "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", "dev": true, "requires": { - "glob": "7.1.2", - "yargs": "1.2.6" + "glob": "^7.0.5", + "yargs": "~1.2.6" }, "dependencies": { "minimist": { @@ -3504,7 +4062,7 @@ "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", "dev": true, "requires": { - "minimist": "0.1.0" + "minimist": "^0.1.0" } } } @@ -3515,8 +4073,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "glob-parent": { @@ -3525,7 +4083,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "is-extglob": { @@ -3540,7 +4098,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -3551,8 +4109,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -3561,7 +4119,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -3572,15 +4130,24 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -3589,11 +4156,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -3608,13 +4175,13 @@ "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.2", - "glob": "7.1.2", - "ignore": "3.3.8", - "pify": "3.0.0", - "slash": "1.0.0" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" }, "dependencies": { "pify": { @@ -3626,49 +4193,35 @@ } }, "got": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", - "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", - "dev": true, - "requires": { - "@sindresorhus/is": "0.7.0", - "cacheable-request": "2.1.4", - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "into-stream": "3.1.0", - "is-retry-allowed": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "mimic-response": "1.0.0", - "p-cancelable": "0.4.1", - "p-timeout": "2.0.1", - "pify": "3.0.0", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "url-parse-lax": "3.0.0", - "url-to-options": "1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" } }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, "grouped-queue": { "version": "0.3.3", @@ -3676,14 +4229,27 @@ "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.2" } }, "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } }, "has-ansi": { "version": "2.0.0", @@ -3691,7 +4257,15 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "has-color": { @@ -3701,24 +4275,21 @@ "dev": true }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" }, "has-to-string-tag-x": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, "requires": { - "has-symbol-support-x": "1.4.2" + "has-symbol-support-x": "^1.4.1" } }, "has-value": { @@ -3727,9 +4298,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -3738,8 +4309,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -3748,7 +4319,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3757,45 +4328,40 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" }, "dependencies": { "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "home-or-tmp": { @@ -3804,8 +4370,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "homedir-polyfill": { @@ -3814,7 +4380,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -3829,6 +4395,39 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -3839,16 +4438,14 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", - "dev": true + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==" }, "ignore": { "version": "3.3.8", @@ -3862,26 +4459,17 @@ "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" }, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } } } @@ -3898,7 +4486,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexof": { @@ -3911,10 +4499,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3934,34 +4521,28 @@ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.10", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -3970,9 +4551,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -3981,38 +4562,13 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4029,8 +4585,8 @@ "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "dev": true, "requires": { - "from2": "2.3.0", - "p-is-promise": "1.1.0" + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" } }, "invariant": { @@ -4039,14 +4595,18 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -4054,7 +4614,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -4069,7 +4629,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -4084,16 +4644,21 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-descriptor": { @@ -4102,9 +4667,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -4127,7 +4692,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -4148,17 +4713,18 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" }, "is-glob": { "version": "4.0.0", @@ -4166,37 +4732,46 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", "dev": true, "requires": { - "symbol-observable": "0.2.4" + "symbol-observable": "^1.1.0" }, "dependencies": { "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true } } @@ -4207,7 +4782,7 @@ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -4221,8 +4796,7 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", @@ -4230,7 +4804,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-posix-bracket": { @@ -4254,8 +4828,7 @@ "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-scoped": { "version": "1.0.0", @@ -4263,14 +4836,18 @@ "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", "dev": true, "requires": { - "scoped-regex": "1.0.0" + "scoped-regex": "^1.0.0" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -4287,8 +4864,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "3.0.2", @@ -4299,8 +4875,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -4308,54 +4883,69 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "istextorbinary": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", "dev": true, "requires": { - "binaryextensions": "2.1.1", - "editions": "1.3.4", - "textextensions": "2.2.0" + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" } }, "isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, + "js-sha3": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", + "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, "jscodeshift": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.0.tgz", - "integrity": "sha512-JAcQINNMFpdzzpKJN8k5xXjF3XDuckB1/48uScSzcnNyK199iWEc9AxKL9OoX5144M2w5zEx9Qs4/E/eBZZUlw==", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "7.0.0-beta.47", - "colors": "1.2.5", - "flow-parser": "0.72.0", - "lodash": "4.17.10", - "micromatch": "2.3.11", - "neo-async": "2.5.1", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.1.tgz", + "integrity": "sha512-sRMollbhbmSDrR79JMAnhEjyZJlQQVozeeY9A6/KNuV26DNcuB3mGSCWXp0hks9dcwRNOELbNOiwraZaXXRk5Q==", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^7.0.0-beta.47", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", + "neo-async": "^2.5.0", "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.14.7", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" + "nomnom": "^1.8.1", + "recast": "^0.15.0", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" }, "dependencies": { "arr-diff": { @@ -4364,7 +4954,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -4385,9 +4975,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -4396,7 +4986,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -4405,7 +4995,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-extglob": { @@ -4420,7 +5010,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "micromatch": { @@ -4429,19 +5019,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } @@ -4470,11 +5060,15 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stable-stringify": { "version": "1.0.1", @@ -4482,14 +5076,13 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "0.5.1", @@ -4501,9 +5094,8 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -4512,15 +5104,26 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "keccak": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", "requires": { - "bindings": "1.3.0", - "inherits": "2.0.3", - "nan": "2.10.0", - "safe-buffer": "5.1.2" + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" }, "dependencies": { "inherits": { @@ -4530,6 +5133,15 @@ } } }, + "keccakjs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", + "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", + "requires": { + "browserify-sha3": "^0.0.1", + "sha3": "^1.1.0" + } + }, "keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", @@ -4545,7 +5157,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "klaw": { @@ -4554,7 +5166,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "lazy-cache": { @@ -4567,44 +5179,48 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "listr": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", - "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.4.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.10", - "stream-to-observable": "0.2.0", - "strip-ansi": "3.0.1" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.1.tgz", + "integrity": "sha512-MSMUUVN1f8aRnPi4034RkOqdiUlpYW+FqwFE3aL0uYNPRavkt2S2SsSpDDofn8BDpqv2RNnsdOcCHWsChcq77A==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.4.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^6.1.0", + "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "log-symbols": { @@ -4613,7 +5229,25 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" + } + }, + "rxjs": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.0.tgz", + "integrity": "sha512-qBzf5uu6eOKiCZuAE0SgZ0/Qp+l54oeVxFfC2t+mJ2SFI6IB8gmMdJHs5DUMu5kqifqcCtsKS2XHjhZu6RKvAw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" } } } @@ -4630,24 +5264,30 @@ "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "indent-string": { @@ -4662,7 +5302,16 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" } } } @@ -4673,10 +5322,10 @@ "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" }, "dependencies": { "cli-cursor": { @@ -4685,7 +5334,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "figures": { @@ -4694,8 +5343,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "onetime": { @@ -4710,8 +5359,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } @@ -4722,11 +5371,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "loader-runner": { @@ -4741,28 +5390,19 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -4771,87 +5411,19 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "2.4.1" + "chalk": "^2.0.1" }, "dependencies": { "ansi-styles": { @@ -4860,7 +5432,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4869,9 +5441,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -4886,7 +5458,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4897,8 +5469,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" }, "dependencies": { "ansi-escapes": { @@ -4913,7 +5485,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "onetime": { @@ -4928,8 +5500,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } @@ -4946,39 +5518,35 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, @@ -4994,7 +5562,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "math-random": { @@ -5007,19 +5575,22 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "mem-fs": { @@ -5028,9 +5599,9 @@ "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", "dev": true, "requires": { - "through2": "2.0.3", - "vinyl": "1.2.0", - "vinyl-file": "2.0.0" + "through2": "^2.0.0", + "vinyl": "^1.1.0", + "vinyl-file": "^2.0.0" } }, "mem-fs-editor": { @@ -5039,17 +5610,17 @@ "integrity": "sha512-QHvdXLLNmwJXxKdf7x27aNUren6IoPxwcM8Sfd+S6/ddQQMcYdEtVKsh6ilpqMrU18VQuKZEaH0aCGt3JDbA0g==", "dev": true, "requires": { - "commondir": "1.0.1", - "deep-extend": "0.5.1", - "ejs": "2.6.1", - "glob": "7.1.2", - "globby": "8.0.1", - "isbinaryfile": "3.0.2", - "mkdirp": "0.5.1", - "multimatch": "2.1.0", - "rimraf": "2.2.8", - "through2": "2.0.3", - "vinyl": "2.1.0" + "commondir": "^1.0.1", + "deep-extend": "^0.5.1", + "ejs": "^2.5.9", + "glob": "^7.0.3", + "globby": "^8.0.0", + "isbinaryfile": "^3.0.2", + "mkdirp": "^0.5.0", + "multimatch": "^2.0.0", + "rimraf": "^2.2.8", + "through2": "^2.0.0", + "vinyl": "^2.0.1" }, "dependencies": { "clone": { @@ -5076,12 +5647,12 @@ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, "requires": { - "clone": "2.1.1", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } @@ -5092,8 +5663,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "memorystream": { @@ -5102,31 +5673,41 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, "merge2": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5141,50 +5722,69 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mimic-response": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", - "dev": true + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { "version": "1.3.1", @@ -5192,8 +5792,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -5202,7 +5802,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -5211,81 +5811,54 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "*" + } + }, "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", "requires": { "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", + "glob": "7.1.2", + "growl": "1.10.3", "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "supports-color": "4.4.0" } }, + "mock-fs": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.5.0.tgz", + "integrity": "sha512-qqudNfOX7ZmX9vm1WIAU+gWlmxVNAnwY6UG3RkFutNywmRCUGP83tujP6IxX2DS1TmcaEZBOhYwDuYEmJYE+3w==" + }, "moment": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", - "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "mout": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multimatch": { "version": "2.1.0", @@ -5293,10 +5866,10 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" } }, "mute-stream": { @@ -5305,29 +5878,44 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "kind-of": { @@ -5338,6 +5926,11 @@ } } }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, "neo-async": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", @@ -5368,29 +5961,48 @@ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.2", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" + }, + "dependencies": { + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + } } }, "nomnom": { @@ -5399,8 +6011,8 @@ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", "dev": true, "requires": { - "chalk": "0.4.0", - "underscore": "1.6.0" + "chalk": "~0.4.0", + "underscore": "~1.6.0" }, "dependencies": { "ansi-styles": { @@ -5415,9 +6027,9 @@ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" } }, "strip-ansi": { @@ -5425,6 +6037,12 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true } } }, @@ -5434,10 +6052,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -5446,7 +6064,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-url": { @@ -5455,31 +6073,57 @@ "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, "requires": { - "prepend-http": "2.0.0", - "query-string": "5.1.1", - "sort-keys": "2.0.0" + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + } } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -5487,9 +6131,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -5498,7 +6142,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -5509,7 +6153,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.omit": { @@ -5518,8 +6162,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -5528,16 +6172,31 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" + } + }, + "oboe": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", + "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -5546,7 +6205,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "ora": { @@ -5555,10 +6214,10 @@ "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" }, "dependencies": { "cli-cursor": { @@ -5567,7 +6226,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "onetime": { @@ -5582,8 +6241,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } @@ -5607,12 +6266,13 @@ "dev": true }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "lcid": "1.0.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -5622,10 +6282,9 @@ "dev": true }, "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", - "dev": true + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" }, "p-each-series": { "version": "1.0.0", @@ -5633,14 +6292,13 @@ "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, "requires": { - "p-reduce": "1.0.0" + "p-reduce": "^1.0.0" } }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "1.1.0", @@ -5658,18 +6316,16 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -5685,19 +6341,17 @@ "dev": true }, "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "requires": { - "p-finally": "1.0.0" + "p-finally": "^1.0.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "pako": { "version": "1.0.6", @@ -5709,13 +6363,12 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-glob": { @@ -5724,10 +6377,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -5742,18 +6395,27 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "requires": { + "for-each": "^0.3.2", + "trim": "0.0.1" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -5762,6 +6424,11 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -5781,25 +6448,19 @@ "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", @@ -5807,49 +6468,65 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pbkdf2": { "version": "3.0.16", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", - "dev": true, "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, + "pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -5858,7 +6535,28 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } } }, "posix-character-classes": { @@ -5868,10 +6566,9 @@ "dev": true }, "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "preserve": { "version": "0.2.0", @@ -5880,9 +6577,9 @@ "dev": true }, "prettier": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", - "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.4.tgz", + "integrity": "sha512-emsEZ2bAigL1lq6ssgkpPm1MIBqgeTvcp90NxOP5XDqprub/V/WS2Hfgih3mS7/1dqTUvhG+sxx1Dv8crnVexA==", "dev": true }, "pretty-bytes": { @@ -5898,16 +6595,23 @@ "dev": true }, "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } }, "prr": { "version": "1.0.1", @@ -5918,37 +6622,38 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "public-encrypt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -5969,9 +6674,9 @@ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { @@ -5992,19 +6697,38 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "randomhex": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", + "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" } }, "read-chunk": { @@ -6013,8 +6737,8 @@ "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", "dev": true, "requires": { - "pify": "3.0.0", - "safe-buffer": "5.1.2" + "pify": "^3.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { "pify": { @@ -6031,9 +6755,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -6042,30 +6766,49 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } } }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" }, "dependencies": { "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, @@ -6075,22 +6818,22 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "recast": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", - "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.15.0.tgz", + "integrity": "sha512-47C2mIxQYvFICrTNuV4+xGgBa1nAoq42ANN5oDTSBIJ50NX7jcki7gAC6HWYptnQgHmqIRTHJq8OKdi3fwgyNQ==", "dev": true, "requires": { - "ast-types": "0.11.3", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" + "ast-types": "0.11.5", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -6107,7 +6850,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.7.1" + "resolve": "^1.1.6" } }, "regenerate": { @@ -6128,9 +6871,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -6139,7 +6882,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -6148,8 +6891,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -6158,9 +6901,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -6175,7 +6918,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -6210,7 +6953,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { @@ -6219,11 +6962,37 @@ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", "dev": true }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "1.2.1", @@ -6234,8 +7003,7 @@ "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "resolve": { "version": "1.7.1", @@ -6243,7 +7011,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-cwd": { @@ -6252,7 +7020,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "resolve-dir": { @@ -6261,8 +7029,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -6283,7 +7051,7 @@ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "requires": { - "lowercase-keys": "1.0.1" + "lowercase-keys": "^1.0.0" } }, "restore-cursor": { @@ -6292,8 +7060,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -6308,23 +7076,24 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-async": { @@ -6333,13 +7102,13 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rxjs": { - "version": "5.5.10", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", - "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", "dev": true, "requires": { "symbol-observable": "1.0.1" @@ -6356,14 +7125,13 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "scoped-regex": { "version": "1.0.0", @@ -6371,17 +7139,117 @@ "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", "dev": true }, + "scrypt": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", + "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", + "requires": { + "nan": "^2.0.8" + } + }, + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "requires": { + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" + } + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "requires": { + "pbkdf2": "^3.0.3" + } + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "~2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", @@ -6395,10 +7263,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -6407,7 +7275,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6415,33 +7283,42 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sha3": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.2.tgz", + "integrity": "sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k=", + "requires": { + "nan": "2.10.0" } }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { "version": "0.8.2", @@ -6449,16 +7326,30 @@ "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } }, "slash": { "version": "1.0.0", @@ -6484,23 +7375,32 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -6509,7 +7409,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6520,9 +7420,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -6531,7 +7431,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -6540,7 +7440,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -6549,7 +7449,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -6558,9 +7458,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -6577,22 +7477,28 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "solc": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.23.tgz", - "integrity": "sha512-AT7anLHY6uIRg2It6N0UlCHeZ7YeecIkUhnlirrCgCPCUevtnoN48BxvgigN/4jJTRljv5oFhAJtI6gvHzT5DQ==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", + "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", "dev": true, "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.5.0", - "yargs": "4.8.1" + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -6605,11 +7511,68 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, "window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -6622,20 +7585,20 @@ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" } }, "yargs-parser": { @@ -6644,19 +7607,29 @@ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dev": true, "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } } } }, + "solparse": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", + "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", + "requires": { + "mocha": "^4.0.1", + "pegjs": "^0.10.0", + "yargs": "^10.0.3" + } + }, "sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -6677,11 +7650,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -6690,7 +7663,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "source-map-url": { @@ -6705,8 +7678,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -6721,8 +7694,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -6737,7 +7710,22 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "static-extend": { @@ -6746,8 +7734,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -6756,48 +7744,43 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.1", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", - "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.1", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "stream-to-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", - "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "any-observable": "0.2.0" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-template": { "version": "0.2.1", @@ -6806,32 +7789,28 @@ "dev": true }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -6840,7 +7819,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-bom-stream": { @@ -6849,21 +7828,58 @@ "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", "dev": true, "requires": { - "first-chunk-stream": "2.0.0", - "strip-bom": "2.0.0" + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "requires": { + "is-natural-number": "^4.0.1" } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "^2.0.0" + } + }, + "swarm-js": { + "version": "0.1.37", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", + "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "decompress": "^4.0.0", + "eth-lib": "^0.1.26", + "fs-extra": "^2.1.2", + "fs-promise": "^2.0.0", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar.gz": "^1.0.5", + "xhr-request-promise": "^0.1.2" + } }, "symbol-observable": { "version": "1.0.1", @@ -6877,14 +7893,65 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" + } + }, + "tar.gz": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", + "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", + "requires": { + "bluebird": "^2.9.34", + "commander": "^2.8.1", + "fstream": "^1.0.8", + "mout": "^0.11.0", + "tar": "^2.1.1" + }, + "dependencies": { + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + } + } + }, "temp": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", "dev": true, "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } } }, "text-table": { @@ -6899,11 +7966,26 @@ "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", "dev": true }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.3", @@ -6911,15 +7993,14 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { "version": "2.0.10", @@ -6927,7 +8008,7 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmp": { @@ -6936,7 +8017,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-arraybuffer": { @@ -6945,6 +8026,11 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -6957,7 +8043,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -6966,10 +8052,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -6978,10 +8064,23 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "^1.4.1" } }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -6989,48 +8088,102 @@ "dev": true }, "truffle": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.8.tgz", - "integrity": "sha512-btDML3J9Ao+UDqR725ajTybcEqyXzxFzJDC/NAXOyOXoXf2HJwKq6VEvnjP9qc6owA+fJ50d87MmsPRXk+riCg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.11.tgz", + "integrity": "sha512-VNhc6jexZeM92sNJJr4U8ln3uJ/mJEQO/0y9ZLYc4pccyIskPtl+3r4mzymgGM/Mq5v6MpoQVD6NZgHUVKX+Dw==", "dev": true, "requires": { - "mocha": "3.5.3", - "original-require": "1.0.1", - "solc": "0.4.23" + "mocha": "^4.1.0", + "original-require": "^1.0.1", + "solc": "0.4.24" } }, + "tslib": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", + "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==", + "dev": true + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, "type-detect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", "dev": true }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -7049,16 +8202,46 @@ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "requires": { + "buffer": "^3.0.1", + "through": "^2.3.6" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + } } }, "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "union-value": { "version": "1.0.0", @@ -7066,10 +8249,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -7078,7 +8261,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -7087,22 +8270,27 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -7111,9 +8299,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -7136,9 +8324,9 @@ } }, "untildify": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", - "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", "dev": true }, "upath": { @@ -7148,18 +8336,18 @@ "dev": true }, "uri-js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", - "integrity": "sha512-jpKCA3HjsBfSDOEgxRDAxQCNyHfCPSbq57PqCkd3gAyBuPb3IWxw54EHncqESznIdqSetHfw3D7ylThu2Kcc9A==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } @@ -7189,19 +8377,22 @@ } }, "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "2.0.0" + "prepend-http": "^1.0.1" } }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, "use": { "version": "3.1.0", @@ -7209,7 +8400,7 @@ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -7221,9 +8412,9 @@ } }, "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" }, "util": { "version": "0.10.3", @@ -7236,13 +8427,22 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "v8-compile-cache": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", - "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", + "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==", "dev": true }, "validate-npm-package-license": { @@ -7251,8 +8451,23 @@ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, "vinyl": { @@ -7261,8 +8476,8 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", + "clone": "^1.0.0", + "clone-stats": "^0.0.1", "replace-ext": "0.0.1" } }, @@ -7272,12 +8487,12 @@ "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0", - "strip-bom-stream": "2.0.0", - "vinyl": "1.2.0" + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" } }, "vm-browserify": { @@ -7295,25 +8510,281 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "2.0.3", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "web3": { - "version": "0.20.6", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", - "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", - "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.34.tgz", + "integrity": "sha1-NH5WG3hAmMtVYzFfSQR5odkfKrE=", + "requires": { + "web3-bzz": "1.0.0-beta.34", + "web3-core": "1.0.0-beta.34", + "web3-eth": "1.0.0-beta.34", + "web3-eth-personal": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-shh": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-bzz": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.34.tgz", + "integrity": "sha1-Bo03d3q2Xlxg+OyLmlDP5FJ3kpw=", + "requires": { + "got": "7.1.0", + "swarm-js": "0.1.37", + "underscore": "1.8.3" + } + }, + "web3-core": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.34.tgz", + "integrity": "sha1-EhvoVV6fsA0sXQXd0zgdDJ5GmH4=", + "requires": { + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-requestmanager": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-helpers": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.34.tgz", + "integrity": "sha1-sWjaANPhnhVrwVriAyA91N/uLQM=", + "requires": { + "underscore": "1.8.3", + "web3-eth-iban": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-method": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.34.tgz", + "integrity": "sha1-7BY8iixJD6AqfsFVWfpzB/x8xt0=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-promievent": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-promievent": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.34.tgz", + "integrity": "sha1-pPT6Z4S7KT6CxglgrltWqUzQPtw=", + "requires": { + "any-promise": "1.3.0", + "eventemitter3": "1.1.1" + } + }, + "web3-core-requestmanager": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.34.tgz", + "integrity": "sha1-Afj2zyrmtvC3DDi64e90G1urIVw=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-providers-http": "1.0.0-beta.34", + "web3-providers-ipc": "1.0.0-beta.34", + "web3-providers-ws": "1.0.0-beta.34" + } + }, + "web3-core-subscriptions": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.34.tgz", + "integrity": "sha1-n+0UQDPyIcPPIQYDAv/a9e8t4t4=", + "requires": { + "eventemitter3": "1.1.1", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34" + } + }, + "web3-eth": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.34.tgz", + "integrity": "sha1-dAhgAIUMb+b1Ne9Jg31tS7YRMmg=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-eth-abi": "1.0.0-beta.34", + "web3-eth-accounts": "1.0.0-beta.34", + "web3-eth-contract": "1.0.0-beta.34", + "web3-eth-iban": "1.0.0-beta.34", + "web3-eth-personal": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-eth-abi": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.34.tgz", + "integrity": "sha1-A0Uz46ovfln/MXk+rqaFwO1a9no=", + "requires": { + "bn.js": "4.11.6", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" }, "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-accounts": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.34.tgz", + "integrity": "sha1-4JFC7uzHl6w0WbdemyOUbTaV8zM=", + "requires": { + "any-promise": "1.3.0", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.7", + "scrypt.js": "0.2.0", + "underscore": "1.8.3", + "uuid": "2.0.1", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } + } + }, + "web3-eth-contract": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.34.tgz", + "integrity": "sha1-nbs4+udkOoCEJ6IBgEcOx0FckeY=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-promievent": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-eth-abi": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-eth-iban": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.34.tgz", + "integrity": "sha1-mvRYYFhnzPdOqXmq8yazi6alugw=", + "requires": { + "bn.js": "4.11.6", + "web3-utils": "1.0.0-beta.34" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-personal": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.34.tgz", + "integrity": "sha1-mvuhZzQuveVCC81YlcP2w0OI8gU=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-net": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.34.tgz", + "integrity": "sha1-QnzqL0MYgUScjjjVIykPFz+f9j0=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-providers-http": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.34.tgz", + "integrity": "sha1-5WG1K7tDdmKCAH1AKFv+NVDCfno=", + "requires": { + "web3-core-helpers": "1.0.0-beta.34", + "xhr2": "0.1.4" + } + }, + "web3-providers-ipc": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.34.tgz", + "integrity": "sha1-obd/GjBtc2SanAOQUuQMtxMo0Ao=", + "requires": { + "oboe": "2.1.3", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34" + } + }, + "web3-providers-ws": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.34.tgz", + "integrity": "sha1-fecPG4Py3jZHZ3IVa+z+9uNRbrM=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" + } + }, + "web3-shh": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.34.tgz", + "integrity": "sha1-l1Bh1x6uxCzO5Xb3vY9w8DhEr+A=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34" + } + }, + "web3-utils": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.34.tgz", + "integrity": "sha1-lBH8OarvOcpOBhafdiKX2f8CCXA=", + "requires": { + "bn.js": "4.11.6", + "eth-lib": "0.1.27", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randomhex": "0.1.5", + "underscore": "1.8.3", + "utf8": "2.1.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" } } }, @@ -7323,36 +8794,149 @@ "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", "dev": true, "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "0.2.17", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "3.2.3", - "tapable": "0.2.8", - "uglify-js": "2.8.29", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0", - "yargs": "6.6.0" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^4.7.0", + "ajv-keywords": "^1.1.1", + "async": "^2.1.2", + "enhanced-resolve": "^3.3.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^0.2.16", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^3.1.0", + "tapable": "~0.2.5", + "uglify-js": "^2.8.27", + "watchpack": "^1.3.1", + "webpack-sources": "^1.0.1", + "yargs": "^6.0.0" }, "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" } } } @@ -7363,7 +8947,7 @@ "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", "dev": true, "requires": { - "jscodeshift": "0.4.1" + "jscodeshift": "^0.4.0" }, "dependencies": { "arr-diff": { @@ -7372,7 +8956,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -7399,9 +8983,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -7410,7 +8994,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -7419,7 +9003,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-extglob": { @@ -7434,7 +9018,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "jscodeshift": { @@ -7443,21 +9027,21 @@ "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", "dev": true, "requires": { - "async": "1.5.2", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "6.18.0", - "colors": "1.2.5", - "flow-parser": "0.72.0", - "lodash": "4.17.10", - "micromatch": "2.3.11", + "async": "^1.5.0", + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^6.17.3", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.12.9", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" + "nomnom": "^1.8.1", + "recast": "^0.12.5", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" } }, "micromatch": { @@ -7466,19 +9050,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "recast": { @@ -7488,10 +9072,10 @@ "dev": true, "requires": { "ast-types": "0.10.1", - "core-js": "2.5.6", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" + "core-js": "^2.4.1", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" } }, "source-map": { @@ -7503,80 +9087,57 @@ } }, "webpack-cli": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.3.tgz", - "integrity": "sha512-5AsKoL/Ccn8iTrwk3uErdyhetGH+c7VRQ7Itim2GL0IhBRq5rtojVDk00buMRmFmBpw1RvHXq97Gup965LbozA==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "diff": "3.5.0", - "enhanced-resolve": "4.0.0", - "envinfo": "4.4.2", - "glob-all": "3.1.0", - "global-modules": "1.0.0", - "got": "8.3.1", - "import-local": "1.0.0", - "inquirer": "5.2.0", - "interpret": "1.1.0", - "jscodeshift": "0.5.0", - "listr": "0.13.0", - "loader-utils": "1.1.0", - "lodash": "4.17.10", - "log-symbols": "2.2.0", - "mkdirp": "0.5.1", - "p-each-series": "1.0.0", - "p-lazy": "1.0.0", - "prettier": "1.12.1", - "supports-color": "5.4.0", - "v8-compile-cache": "1.1.2", - "webpack-addons": "1.1.5", - "yargs": "11.1.0", - "yeoman-environment": "2.1.1", - "yeoman-generator": "2.0.5" + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.5.tgz", + "integrity": "sha512-CiWQR+1JS77rmyiO6y1q8Kt/O+e8nUUC9YfJ25JtSmzDwbqJV7vIsh3+QKRHVTbTCa0DaVh8iY1LBiagUIDB3g==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "diff": "^3.5.0", + "enhanced-resolve": "^4.0.0", + "envinfo": "^5.7.0", + "glob-all": "^3.1.0", + "global-modules": "^1.0.0", + "got": "^8.3.1", + "import-local": "^1.0.0", + "inquirer": "^5.2.0", + "interpret": "^1.1.0", + "jscodeshift": "^0.5.0", + "listr": "^0.14.1", + "loader-utils": "^1.1.0", + "lodash": "^4.17.10", + "log-symbols": "^2.2.0", + "mkdirp": "^0.5.1", + "p-each-series": "^1.0.0", + "p-lazy": "^1.0.0", + "prettier": "^1.12.1", + "supports-color": "^5.4.0", + "v8-compile-cache": "^2.0.0", + "webpack-addons": "^1.1.5", + "yargs": "^11.1.0", + "yeoman-environment": "^2.1.1", + "yeoman-generator": "^2.0.5" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cross-spawn": { @@ -7585,31 +9146,53 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "enhanced-resolve": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.0.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" } }, "has-flag": { @@ -7618,52 +9201,43 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "p-finally": "^1.0.0" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true }, "supports-color": { "version": "5.4.0", @@ -7671,7 +9245,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "tapable": { @@ -7680,11 +9254,14 @@ "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", "dev": true }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } }, "yargs": { "version": "11.1.0", @@ -7692,18 +9269,18 @@ "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" } }, "yargs-parser": { @@ -7712,7 +9289,7 @@ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -7723,8 +9300,8 @@ "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -7735,20 +9312,38 @@ } } }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", + "requires": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "window-size": { "version": "0.1.0", @@ -7766,17 +9361,48 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "1.3.4", @@ -7784,9 +9410,52 @@ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", + "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", + "requires": { + "xhr-request": "^1.0.1" } }, "xhr2": { @@ -7797,119 +9466,95 @@ "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - } + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } + "camelcase": "^4.1.0" } }, - "yeoman-environment": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.1.1.tgz", - "integrity": "sha512-IBLwCUrJrDxBYuwdYm1wuF3O/CR2LpXR0rFS684QOrU6x69DPPrsdd20dZOFaedZ/M9sON7po73WhO3I1CbgNQ==", - "dev": true, + "yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha1-T7G8euH8L1cDe1SvasyP4QMcW3c=", "requires": { - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "globby": "8.0.1", - "grouped-queue": "0.3.3", - "inquirer": "5.2.0", - "is-scoped": "1.0.0", - "lodash": "4.17.10", - "log-symbols": "2.2.0", - "mem-fs": "1.1.3", - "strip-ansi": "4.0.0", - "text-table": "0.2.0", - "untildify": "3.0.2" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yeoman-environment": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.2.0.tgz", + "integrity": "sha512-gQ+hIW8QRlUo4jGBDCm++qg01SXaIVJ7VyLrtSwk2jQG4vtvluWpsGIl7V8DqT2jGiqukdec0uEyffVEyQgaZA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "diff": "^3.3.1", + "escape-string-regexp": "^1.0.2", + "globby": "^8.0.1", + "grouped-queue": "^0.3.3", + "inquirer": "^5.2.0", + "is-scoped": "^1.0.0", + "lodash": "^4.17.10", + "log-symbols": "^2.1.0", + "mem-fs": "^1.1.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "untildify": "^3.0.2" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -7918,9 +9563,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cross-spawn": { @@ -7929,20 +9574,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "has-flag": { @@ -7951,22 +9587,13 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -7977,31 +9604,31 @@ "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", "dev": true, "requires": { - "async": "2.6.0", - "chalk": "2.4.1", - "cli-table": "0.3.1", - "cross-spawn": "6.0.5", - "dargs": "5.1.0", - "dateformat": "3.0.3", - "debug": "3.1.0", - "detect-conflict": "1.0.1", - "error": "7.0.2", - "find-up": "2.1.0", - "github-username": "4.1.0", - "istextorbinary": "2.2.1", - "lodash": "4.17.10", - "make-dir": "1.3.0", - "mem-fs-editor": "4.0.2", - "minimist": "1.2.0", - "pretty-bytes": "4.0.2", - "read-chunk": "2.1.0", - "read-pkg-up": "3.0.0", - "rimraf": "2.6.2", - "run-async": "2.3.0", - "shelljs": "0.8.2", - "text-table": "0.2.0", - "through2": "2.0.3", - "yeoman-environment": "2.1.1" + "async": "^2.6.0", + "chalk": "^2.3.0", + "cli-table": "^0.3.1", + "cross-spawn": "^6.0.5", + "dargs": "^5.1.0", + "dateformat": "^3.0.3", + "debug": "^3.1.0", + "detect-conflict": "^1.0.0", + "error": "^7.0.2", + "find-up": "^2.1.0", + "github-username": "^4.0.0", + "istextorbinary": "^2.2.1", + "lodash": "^4.17.10", + "make-dir": "^1.1.0", + "mem-fs-editor": "^4.0.0", + "minimist": "^1.2.0", + "pretty-bytes": "^4.0.2", + "read-chunk": "^2.1.0", + "read-pkg-up": "^3.0.0", + "rimraf": "^2.6.2", + "run-async": "^2.0.0", + "shelljs": "^0.8.0", + "text-table": "^0.2.0", + "through2": "^2.0.0", + "yeoman-environment": "^2.0.5" }, "dependencies": { "ansi-styles": { @@ -8010,7 +9637,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -8019,9 +9646,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cross-spawn": { @@ -8030,29 +9657,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "has-flag": { @@ -8067,10 +9676,10 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "minimist": { @@ -8085,8 +9694,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "path-type": { @@ -8095,7 +9704,7 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "pify": { @@ -8110,9 +9719,9 @@ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, "read-pkg-up": { @@ -8121,17 +9730,8 @@ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, "strip-bom": { @@ -8146,7 +9746,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } From d1ea5a7951f2436ab3b0bf5ffaa429e590872424 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 5 Jun 2018 15:36:28 +0530 Subject: [PATCH 0098/1361] contract: added TODO's. MOSA-65 --- contracts/OpenSTUtility.sol | 6 ++++++ contracts/OpenSTValue.sol | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 06bdc646..aba870a5 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -226,6 +226,10 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_stakingUnlockHeight > 0); require(_stakingIntentHash != ""); + // TODO: + // 1. get latest block height from Core, blockNumber. + // 2. get block time from Core, blockTime. + // 3. expirationHeight = blockNumber + TIME_TO_WAIT_MEDIUM.div(blockTime) expirationHeight = block.number + blocksToWaitShort; nonces[_staker] = _stakerNonce; @@ -272,6 +276,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { // as process minting results in a gain it needs to expire well before // the escrow on the cost unlocks in OpenSTValue.processStake + // TODO: get blockNumber from core. require(mint.expirationHeight > block.number); UtilityTokenInterface token = registeredTokens[mint.uuid].token; @@ -304,6 +309,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { // require that the mint has expired and that the staker has not // processed the minting, ie mint has not been deleted require(mint.expirationHeight > 0); + // TODO: get blockNumber from core. require(mint.expirationHeight <= block.number); uuid = mint.uuid; diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 1a460653..c9a108a0 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -97,7 +97,7 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 public blocksToWaitShort; uint256 public blocksToWaitMedium; uint256 public blocksToWaitLong; - + bytes32[] public uuids; /* @@ -343,6 +343,10 @@ contract OpenSTValue is OpsManaged, Hasher { require(_redemptionIntentHash == redemptionIntentHash); + // TODO: + // 1. get latest block height from Core, blockNumber. + // 2. get block time from Core, blockTime. + // 3. expirationHeight = blockNumber + TIME_TO_WAIT_MEDIUM.div(blockTime) expirationHeight = block.number + blocksToWaitShort; UtilityToken storage utilityToken = utilityTokens[_uuid]; @@ -386,6 +390,7 @@ contract OpenSTValue is OpsManaged, Hasher { // as the process unstake results in a gain for the caller // it needs to expire well before the process redemption can // be reverted in OpenSTUtility + // TODO: get blockNumber from core. require(unstake.expirationHeight > block.number); UtilityToken storage utilityToken = utilityTokens[unstake.uuid]; @@ -418,6 +423,7 @@ contract OpenSTValue is OpsManaged, Hasher { // require that the unstake has expired and that the redeemer has not // processed the unstaking, ie unstake has not been deleted require(unstake.expirationHeight > 0); + // TODO: get blockNumber from core. require(unstake.expirationHeight <= block.number); uuid = unstake.uuid; From 2d01801de7eda75c0779cc395442eb80db85947b Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Tue, 5 Jun 2018 16:06:03 +0530 Subject: [PATCH 0099/1361] rearranging variable and mapping as per standard. Also adding Gate contract in test of contract structire --- contracts/Gate.sol | 25 ++++++++++--------------- test/ContractStructureTest.js | 8 ++++++-- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 311fc74e..88451baf 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -45,31 +45,26 @@ contract Gate is ProtocolVersioned, Owned { bytes32 _stakingIntentHash); - /* - * Structures - */ - struct StakeRequest { - uint256 amount; - uint256 unlockHeight; - address beneficiary; - bytes32 hashLock; - } - /* - * Storage - */ - WorkersInterface public workers; // stake requests mapping(address /*staker */ => StakeRequest) public stakeRequests; - + WorkersInterface public workers; // bounty amount uint256 public bounty; // utility token UUID bytes32 public uuid; - + /* + * Structures + */ + struct StakeRequest { + uint256 amount; + uint256 unlockHeight; + address beneficiary; + bytes32 hashLock; + } /* * Public functions */ diff --git a/test/ContractStructureTest.js b/test/ContractStructureTest.js index 5d2f0c48..07ec4c39 100644 --- a/test/ContractStructureTest.js +++ b/test/ContractStructureTest.js @@ -10,8 +10,13 @@ const contracts = [ { name: "OpenSTValue.sol", path: "./contracts/OpenSTValue.sol" + }, + { + name: "Gate.sol", + path: "./contracts/Gate.sol" } ]; +const validSequence = ["event", "constant", "mapping", "variable", "array", "struct"]; function getContract(result) { return result.body.filter(e => { @@ -59,13 +64,12 @@ function getListOfDataTypesInContract(file,) { let parsedFile = SolidityParser.parseFile(file.path); let contractBody = getContractVariables(parsedFile); + return contractBody.map(element => checkElementDataType(element)).filter(t => t !== 'unknown'); } describe('Contract Structure Test', async () => { - const validSequence = ["event", "constant", "mapping", "variable", "array", "struct"]; - contracts.map(file => { let dataTypesInContract = getListOfDataTypesInContract(file); for (let i = 0; i < validSequence.length; i++) { From 36c47405a577e20f03e254b347dd7bc32d71e727 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Tue, 5 Jun 2018 14:08:41 +0200 Subject: [PATCH 0100/1361] contracts: pr review comments[mosa-59] --- contracts/HasIntents.sol | 2 +- contracts/Hasher.sol | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/HasIntents.sol b/contracts/HasIntents.sol index 33e1da6e..9dedea73 100644 --- a/contracts/HasIntents.sol +++ b/contracts/HasIntents.sol @@ -27,6 +27,6 @@ contract HasIntents { /* * Mappings */ - mapping(bytes32 /* intentHash */ => bytes32) internal intents; + mapping(bytes32 /* intentHash */ => bytes32) public intents; } \ No newline at end of file diff --git a/contracts/Hasher.sol b/contracts/Hasher.sol index f81df200..d5433230 100644 --- a/contracts/Hasher.sol +++ b/contracts/Hasher.sol @@ -95,14 +95,14 @@ contract Hasher { } function hashIntentKey( - address _staker, + address _account, uint256 _nonce) public pure returns (bytes32) { return keccak256( - _staker, + _account, _nonce); } } \ No newline at end of file From 90c1829a0177a01e6d82e094a71b545d1de07418 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Tue, 5 Jun 2018 15:39:29 +0200 Subject: [PATCH 0101/1361] contracts: comment styling guidelines --- contracts/HasIntents.sol | 2 +- contracts/OpenSTValue.sol | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/HasIntents.sol b/contracts/HasIntents.sol index 9dedea73..2a6bf8be 100644 --- a/contracts/HasIntents.sol +++ b/contracts/HasIntents.sol @@ -24,7 +24,7 @@ pragma solidity ^0.4.23; contract HasIntents { - /* + /** * Mappings */ mapping(bytes32 /* intentHash */ => bytes32) public intents; diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 10dc5585..8c259b58 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -33,7 +33,7 @@ import "./HasIntents.sol"; // value chain contracts import "./SimpleStake.sol"; -/// Inherited contract HasIntents position should not be changed to maintain index position of intents mapping at 0 +/** Inherited contract HasIntents position should not be changed to maintain index position of intents mapping at 0 */ /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is HasIntents, OpsManaged, Hasher { using SafeMath for uint256; @@ -222,7 +222,7 @@ contract OpenSTValue is HasIntents, OpsManaged, Hasher { unlockHeight: unlockHeight, hashLock: _hashLock }); - ///Add intent hash to intents mapping + /** Add intent hash to intents mapping */ intents[hashIntentKey(_staker, nonce)] = stakingIntentHash; emit StakingIntentDeclared(_uuid, _staker, nonce, _beneficiary, @@ -258,7 +258,7 @@ contract OpenSTValue is HasIntents, OpsManaged, Hasher { emit ProcessedStake(stake.uuid, _stakingIntentHash, stakeAddress, stake.staker, stake.amountST, stake.amountUT, _unlockSecret); - ///Remove intent hash from intents mapping + /** Remove intent hash from intents mapping */ delete intents[hashIntentKey(stake.staker, stake.nonce)]; delete stakes[_stakingIntentHash]; From 312f9f6f2e082277a6306de66c3a12d2d8bd9994 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Wed, 6 Jun 2018 16:34:18 +0530 Subject: [PATCH 0102/1361] PR Changes --- contracts/Core.sol | 144 ++++++++------------------------------------- 1 file changed, 26 insertions(+), 118 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index a4a14cdf..fcbf0b15 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -25,11 +25,12 @@ import "./CoreInterface.sol"; import "./MerklePatriciaProof.sol"; import "./util.sol"; import "./WorkersInterface.sol"; +import "./RLP.sol"; /// @dev Core is a minimal stub that will become the anchoring and consensus point for /// the utility chain to validate itself against -// TODO - truffle test cases +// TODO - truffle test cases update contract Core is CoreInterface, Util { /* @@ -37,43 +38,35 @@ contract Core is CoreInterface, Util { */ event StateRootCommitted(uint256 blockHeight, bytes32 stateRoot); - event AccountProved(uint256 blockHeight, bytes32 stateRoot, bytes encodedAddress, bytes32 storageRoot); + event OpenSTProven(uint256 blockHeight, bytes32 storageRoot); /* * Storage */ /** Mapping of block height to state root of the block. */ - mapping (uint /* block height */ => bytes32) private stateRoots; + mapping (uint256 /* block height */ => bytes32) public stateRoots; /** Mapping of block height to storafe root of the block. */ - mapping (uint /* block height */ => bytes32) private storageRoots; - - // TODO - Do we need below mapping? - // mapping(bytes32 => address) stakeTokenTuple; + mapping (uint256 /* block height */ => bytes32) public storageRoots; /// chainIdOrigin stores the chainId this chain - uint256 private coreChainIdOrigin; + uint256 public coreChainIdOrigin; /// chainIdRemote stores the chainId of the remote chain - uint256 private coreChainIdRemote; + uint256 public coreChainIdRemote; /// OpenST remote is the address of the OpenST contract /// on the remote chain - address private coreOpenSTRemote; + address public coreOpenSTRemote; /// registrar registers for the two chains - address private coreRegistrar; + address public coreRegistrar; /// Latest block height of block which state root was committed. - uint256 private latestStateRootBlockHeight; + uint256 public latestStateRootBlockHeight; /// Latest block height of block which storage root was committed. - uint256 private latestStorageRootBlockHeight; + uint256 public latestStorageRootBlockHeight; /// Workers contract address WorkersInterface public workers; + /// OpenSTRemote encode address. sha3 => bytes32 to bytes + /// Kept in end because it's dynamic in size + bytes public encodedOpenSTRemoteAddress; - // TODO - do we need below structures - /* - * Structures - */ - // struct stakeTokenTuple { - // address stake; - // address token; - // } /* * Public functions @@ -89,73 +82,15 @@ contract Core is CoreInterface, Util { require(_registrar != address(0), "Registrar should be valid address"); require(_chainIdOrigin != 0, "Invalid origin chain ID"); require(_chainIdRemote != 0, "Invalid remote chain ID"); - require(_openSTRemote != 0, "Invalid openSTRemote contract address"); + require(_openSTRemote != address(0), "Invalid openSTRemote contract address"); require(_workers != address(0), "Workers should be valid contract address"); coreRegistrar = _registrar; coreChainIdOrigin = _chainIdOrigin; coreChainIdRemote = _chainIdRemote; - // TODO - openSTRemote is openSTValue and openSTUtility contract address? coreOpenSTRemote = _openSTRemote; workers = _workers; - - // Initialize - latestStateRootBlockHeight = 0; - latestStorageRootBlockHeight = 0; - // TODO - Do we need to initialize stateRoots and storageRoots mapping? - } - - /* - * Public view functions - */ - - /// @dev public function registrar - /// @return address coreRegistrar - function registrar() - public - view - returns (address /* registrar */) - { - return coreRegistrar; - } - - /// @dev public function chainIdRemote - /// @return uint256 coreChainIdRemote - function chainIdRemote() - public - view - returns (uint256 /* chainIdRemote */) - { - return coreChainIdRemote; - } - - /// @dev public function openSTRemote - /// @return address coreOpenSTRemote - function openSTRemote() - public - view - returns (address /* OpenSTRemote */) - { - return coreOpenSTRemote; - } - - /// @dev public function getLatestStateRootBlockHeight - /// @return uint256 latestStateRootBlockHeight - function getLatestStateRootBlockHeight() - public - view - returns (uint256 /* latest state root block height */) - { - return latestStateRootBlockHeight; - } - - /// @dev public function getLatestStorageRootBlockHeight - /// @return uint256 latestStorageRootBlockHeight - function getLatestStorageRootBlockHeight() - public - view - returns (uint256 /* latest storage root block height */) - { - return latestStorageRootBlockHeight; + // Encoded remote address. + encodedOpenSTRemoteAddress = bytes32ToBytes(keccak256(coreOpenSTRemote)); } /** @@ -163,7 +98,7 @@ contract Core is CoreInterface, Util { * */ /// @dev Commit new state root for a block height - /// @param _blockHeight block Number for which stateRoots mapping needs to update + /// @param _blockHeight block height for which stateRoots mapping needs to update /// @param _stateRoot state root of input block height /// @return bytes32 stateRoot function commitStateRoot( @@ -177,7 +112,7 @@ contract Core is CoreInterface, Util { // State root should be valid require(_stateRoot != bytes32(0), "Invalid state root"); // Input block height should be valid - require(_blockHeight > latestStateRootBlockHeight, "Given Block height is lower than latestBlockHeight."); + require(_blockHeight > latestStateRootBlockHeight, "Given block height is lower or equal to highest committed state root block height."); stateRoots[_blockHeight] = _stateRoot; latestStateRootBlockHeight = _blockHeight; @@ -187,11 +122,11 @@ contract Core is CoreInterface, Util { return stateRoot; } - /// @dev Verify account proof and update storageRoots mapping - /// @param _blockHeight block Number at which stake happened - /// @param _value rlpencoded => hashed account node object - /// @param _rlpParentNodes RLP encoded value of account proof parent nodes - /// @param _storageRoot storage root received from account proof + /// @dev Verify account proof of OpenSTRemote and commit storage root at given block height + /// @param _blockHeight block height at which OpenST is to be proven + /// @param _value rlpencoded => hashed account node object + /// @param _rlpParentNodes RLP encoded value of account proof parent nodes + /// @param _storageRoot storage root received from account proof /// @return bool status function proveOpenST( uint256 _blockHeight, @@ -214,44 +149,17 @@ contract Core is CoreInterface, Util { require(_value != bytes32(0), "Node values are missing"); - // Encode remote address. Storage added because it was generating warning. - bytes memory encodedAddress = bytes32ToBytes(keccak256(coreOpenSTRemote)); - // Verify proof using library contract - require(MerklePatriciaProof.verify(_value, encodedAddress, _rlpParentNodes, stateRoot), "Account proof not verified."); + require(MerklePatriciaProof.verify(_value, encodedOpenSTRemoteAddress, _rlpParentNodes, stateRoot), "Account proof not verified."); // After verification update storageRoots mapping storageRoots[_blockHeight] = _storageRoot; // Update latestStorageRootBlockHeight variable latestStorageRootBlockHeight = _blockHeight; // Emit event - emit AccountProved(_blockHeight, stateRoot, encodedAddress, _storageRoot); + emit OpenSTProven(_blockHeight, _storageRoot); return true; } - /// @dev public function returns stateRoot for a blockHeight - /// @param _blockHeight block number - /// @return bytes32 - function getStateRoot( - uint256 _blockHeight) - public - view - returns (bytes32 /* state root */) - { - return stateRoots[_blockHeight]; - } - - /// @dev public function returns storageRoot for a blockHeight - /// @param _blockHeight block number - /// @return bytes32 - function getStorageRoot( - uint256 _blockHeight) - public - view - returns (bytes32 /* storage root */) - { - return storageRoots[_blockHeight]; - } - } \ No newline at end of file From 63f53fd16619aaeb48d06c5ea5350650c7a3ff80 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Wed, 6 Jun 2018 17:56:50 +0530 Subject: [PATCH 0103/1361] [MOSA-62] for OpenSTValue and OpenSTUtility registrar stays for now but for Core.sol we can deprecate it --- contracts/OpenSTValue.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 7c72db07..9a075875 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -466,8 +466,6 @@ contract OpenSTValue is OpsManaged, Hasher { returns (bool /* success */) { require(address(_core) != address(0)); - // core constructed with same registrar - require(registrar == _core.registrar()); // on value chain core only tracks a remote utility chain uint256 chainIdUtility = _core.chainIdRemote(); require(chainIdUtility != 0); From 59cd0dffedb3ac2c5692318e0ff71dd30d2a7c4a Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Wed, 6 Jun 2018 19:47:52 +0530 Subject: [PATCH 0104/1361] [MOSA-62] There are existing public functions for coreChainIdRemote, coreOpenSTRemote, coreRegistrar used in different contracts and interation layer. Core Contract test cases updated with workers argument --- .gitignore | 3 +++ contracts/Core.sol | 36 ++++++++++++++++++++++++++--- test/Core_utils.js | 32 +++++++++++++++++++++----- test/Gate_utils.js | 6 ++--- test/OpenSTValue.js | 48 +++++++++++++++++++-------------------- test/OpenSTValue_utils.js | 24 ++++++++++++++++---- test/Protocol_utils.js | 11 ++++++++- test/Registrar_utils.js | 15 ++++++++++-- 8 files changed, 131 insertions(+), 44 deletions(-) diff --git a/.gitignore b/.gitignore index ed10e4de..c7789d1e 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,6 @@ node_modules *.synctex.gz(busy) *.pdfsync +# don't commit package-lock.json file +package-lock.json + diff --git a/contracts/Core.sol b/contracts/Core.sol index fcbf0b15..388266cf 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -51,12 +51,12 @@ contract Core is CoreInterface, Util { /// chainIdOrigin stores the chainId this chain uint256 public coreChainIdOrigin; /// chainIdRemote stores the chainId of the remote chain - uint256 public coreChainIdRemote; + uint256 private coreChainIdRemote; /// OpenST remote is the address of the OpenST contract /// on the remote chain - address public coreOpenSTRemote; + address private coreOpenSTRemote; /// registrar registers for the two chains - address public coreRegistrar; + address private coreRegistrar; /// Latest block height of block which state root was committed. uint256 public latestStateRootBlockHeight; /// Latest block height of block which storage root was committed. @@ -93,6 +93,36 @@ contract Core is CoreInterface, Util { encodedOpenSTRemoteAddress = bytes32ToBytes(keccak256(coreOpenSTRemote)); } + /// @dev public function registrar + /// @return address coreRegistrar + function registrar() + public + view + returns (address /* registrar */) + { + return coreRegistrar; + } + + /// @dev public function chainIdRemote + /// @return uint256 coreChainIdRemote + function chainIdRemote() + public + view + returns (uint256 /* chainIdRemote */) + { + return coreChainIdRemote; + } + + /// @dev public function openSTRemote + /// @return address coreOpenSTRemote + function openSTRemote() + public + view + returns (address /* OpenSTRemote */) + { + return coreOpenSTRemote; + } + /** * Commit new state root for a block height * diff --git a/test/Core_utils.js b/test/Core_utils.js index 7bb0fec8..983d5886 100644 --- a/test/Core_utils.js +++ b/test/Core_utils.js @@ -19,17 +19,37 @@ // // ---------------------------------------------------------------------------- -var Core = artifacts.require("./Core.sol"); +const Core = artifacts.require("./Core.sol") + , SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") + , Workers = artifacts.require("./Workers.sol") +; + +const BigNumber = require('bignumber.js') +; + /// @dev Deploy module.exports.deployCore = async (artifacts, accounts) => { - const registrar = accounts[1]; - const chainIdOrigin = 3; - const chainIdRemote = 1410; - const openSTRemote = accounts[4]; + const registrar = accounts[1] + , chainIdOrigin = 3 + , chainIdRemote = 1410 + , openSTRemote = accounts[4] + , valueToken = await SimpleToken.new() + , admin = accounts[2] + , ops = accounts[3] + , deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")) + ; - const core = await Core.new(registrar, chainIdOrigin, chainIdRemote, openSTRemote); + //Set SimpleToken admin in order to finalize SimpleToken + await valueToken.setAdminAddress(admin); + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); + const core = await Core.new(registrar, chainIdOrigin, chainIdRemote, openSTRemote, workers.address, {from:accounts[0]}); return { core : core } diff --git a/test/Gate_utils.js b/test/Gate_utils.js index 38402ac8..5ce5699e 100644 --- a/test/Gate_utils.js +++ b/test/Gate_utils.js @@ -60,9 +60,6 @@ module.exports.deployGate = async (artifacts, accounts) => { assert.ok(await valueToken.finalize({ from: admin })); openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); - await openSTValue.addCore(core.address, { from: registrar }); - // Deploy worker contract const workers = await Workers.new(valueToken.address) , worker1 = accounts[7]; @@ -70,6 +67,9 @@ module.exports.deployGate = async (artifacts, accounts) => { await workers.setOpsAddress(ops); await workers.setWorker(worker1, new BigNumber(web3.toWei(10, "ether")), {from:ops}); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); + await openSTValue.addCore(core.address, { from: registrar }); + checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); assert.equal(await openSTValue.registerUtilityToken.call(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }), checkUuid); diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 78634596..e7949d2d 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -103,21 +103,24 @@ contract('OpenSTValue', function(accounts) { const conversionRateDecimals = 5; const conversionRate = new BigNumber(10 * 10**conversionRateDecimals); // conversion rate => 10 - var valueToken = null; - var openSTValue = null; - var core = null; - var checkUuid = null; - var result = null; - var hasher = null; - var stakingIntentHash = null; - var stake = null; - var nonce = null; + var valueToken = null + , openSTValue = null + , core = null + , checkUuid = null + ,result = null + , hasher = null + , stakingIntentHash + , stake = null + , nonce = null + , workers = null + ; describe('Properties', async () => { before(async () => { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; + workers = contracts.workers; }) it('has chainIdValue', async () => { @@ -137,7 +140,7 @@ contract('OpenSTValue', function(accounts) { before(async () => { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); }) it('fails to add core by non-registrar', async () => { @@ -148,11 +151,6 @@ contract('OpenSTValue', function(accounts) { await Utils.expectThrow(openSTValue.addCore(0, { from: registrar })); }) - it('fails to add core when registrar != core.registrar', async () => { - var badCore = await Core.new(accounts[0], chainIdValue, chainIdRemote, openSTRemote); - await Utils.expectThrow(openSTValue.addCore(badCore.address, { from: registrar })); - }) - it('successfully adds core', async () => { assert.equal(await openSTValue.addCore.call(core.address, { from: registrar }), true); await openSTValue.addCore(core.address, { from: registrar }); @@ -168,7 +166,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); }) @@ -221,7 +219,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); }) @@ -266,7 +264,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, accounts[0], checkUuid, { from: registrar }); @@ -303,7 +301,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); @@ -357,7 +355,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); @@ -458,7 +456,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); @@ -522,7 +520,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); @@ -591,7 +589,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); @@ -657,7 +655,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); @@ -719,7 +717,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; - core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote); + core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, staker, checkUuid, { from: registrar }); diff --git a/test/OpenSTValue_utils.js b/test/OpenSTValue_utils.js index 02795b0a..c4238d50 100644 --- a/test/OpenSTValue_utils.js +++ b/test/OpenSTValue_utils.js @@ -24,12 +24,17 @@ const BigNumber = require('bignumber.js'); //var OpenSTValue = artifacts.require("./OpenSTValue.sol"); var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); var SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol"); +var Workers = artifacts.require("./Workers.sol"); /// @dev Deploy module.exports.deployOpenSTValue = async (artifacts, accounts) => { - const chainIdValue = 3; - const valueToken = await SimpleToken.new(); - const registrar = accounts[1] + const chainIdValue = 3 + , valueToken = await SimpleToken.new() + , registrar = accounts[1] + , admin = accounts[2] + , ops = accounts[3] + , deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")) + ; // Set SimpleToken admin in order to finalize SimpleToken await valueToken.setAdminAddress(accounts[1]); @@ -38,9 +43,20 @@ module.exports.deployOpenSTValue = async (artifacts, accounts) => { const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar); + //Set SimpleToken admin in order to finalize SimpleToken + await valueToken.setAdminAddress(admin); + + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); + return { valueToken : valueToken, - openSTValue : openSTValue + openSTValue : openSTValue, + workers: workers } } diff --git a/test/Protocol_utils.js b/test/Protocol_utils.js index 43f28353..5f5f1a67 100644 --- a/test/Protocol_utils.js +++ b/test/Protocol_utils.js @@ -31,6 +31,7 @@ var Core = artifacts.require("./Core.sol"); var OpenSTValue = artifacts.require("./OpenSTValueMock.sol"); var OpenSTUtility = artifacts.require("./OpenSTUtilityMock.sol"); var STPrime = artifacts.require("./STPrime.sol"); +var Workers = artifacts.require("./Workers.sol"); const CHAINID_VALUE = 2001; const CHAINID_UTILITY = 2002; @@ -43,6 +44,7 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { const ops = accounts[3]; const intercommVC = accounts[4]; const intercommUC = accounts[5]; + const workerDeactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); var res = null; @@ -95,9 +97,16 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { utils.logResponse(await openSTUtility.completeOwnershipTransfer({ from: owner }), "OpenSTUtility.completeOwnershipTransfer"); + // Deploy worker contract + const workers = await Workers.new(simpleToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, workerDeactivationHeight, {from:ops}); + // only setup a core for the Value Chain to track the Utility Chain for v0.9.1 const coreVC = await Core.new(registrarVC.address, CHAINID_VALUE, CHAINID_UTILITY, - openSTUtility.address); + openSTUtility.address, workers.address); await utils.logTransaction(coreVC.transactionHash, "CoreVC.new"); const stpContractAddress = await openSTUtility.simpleTokenPrime.call(); diff --git a/test/Registrar_utils.js b/test/Registrar_utils.js index 5cd31c22..27238408 100644 --- a/test/Registrar_utils.js +++ b/test/Registrar_utils.js @@ -26,6 +26,7 @@ var Registrar = artifacts.require("./Registrar.sol"); var OpenSTUtility = artifacts.require("./OpenSTUtility.sol"); var OpenSTValue = artifacts.require("./OpenSTValue.sol"); var Core = artifacts.require("./Core.sol"); +var Workers = artifacts.require("./Workers.sol") /// @dev Deploy module.exports.deployRegistrar = async (artifacts, accounts) => { @@ -34,7 +35,10 @@ module.exports.deployRegistrar = async (artifacts, accounts) => { const valueToken = await SimpleToken.new(); const registrar = await Registrar.new(); const staker = accounts[2]; - const amountST = new BigNumber(web3.toWei(2, "ether"));; + const amountST = new BigNumber(web3.toWei(2, "ether")); + const deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); + const admin = accounts[3]; + const ops = accounts[2]; // Registrar is OpsManaged await registrar.setOpsAddress(accounts[1]); @@ -46,9 +50,16 @@ module.exports.deployRegistrar = async (artifacts, accounts) => { await valueToken.finalize({ from: accounts[3] }); await valueToken.transfer(staker, amountST); + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); + const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, { gas: 10000000 }); const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address); - const core = await Core.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address); + const core = await Core.new(registrar.address, chainIdValue, chainIdUtility, openSTUtility.address, workers.address); return { valueToken : valueToken, From 80348dee2d8c13be3ec756a32a8497b2510616ef Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Thu, 7 Jun 2018 11:54:01 +0530 Subject: [PATCH 0105/1361] uint is alias for uint256. Updated for consistency here. --- contracts/proof/RLP.sol | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/contracts/proof/RLP.sol b/contracts/proof/RLP.sol index 70a8af29..5fb21f1f 100644 --- a/contracts/proof/RLP.sol +++ b/contracts/proof/RLP.sol @@ -33,8 +33,8 @@ library RLP { function next(Iterator memory self) internal pure returns (RLPItem memory subItem) { require(hasNext(self)); - uint256 ptr = self._unsafe_nextPtr; - uint256 itemLength = _itemLength(ptr); + uint ptr = self._unsafe_nextPtr; + uint itemLength = _itemLength(ptr); subItem._unsafe_memPtr = ptr; subItem._unsafe_length = itemLength; self._unsafe_nextPtr = ptr + itemLength; @@ -163,7 +163,7 @@ library RLP { /// @param self The RLPItem. /// @return The bytes. function toBytes(RLPItem memory self) internal pure returns (bytes memory bts) { - uint256 len = self._unsafe_length; + uint len = self._unsafe_length; if (len == 0) return; bts = new bytes(len); @@ -176,8 +176,8 @@ library RLP { /// @return The decoded string. function toData(RLPItem memory self) internal pure returns (bytes memory bts) { require(isData(self)); - uint256 rStartPos; - uint256 len; + uint rStartPos; + uint len; (rStartPos, len) = _decode(self); bts = new bytes(len); _copyToBytes(rStartPos, bts, len); @@ -189,7 +189,7 @@ library RLP { /// @return Array of RLPItems. function toList(RLPItem memory self) internal pure returns (RLPItem[] memory list) { require(isList(self)); - uint256 numItems; + uint numItems; numItems = items(self); list = new RLPItem[](numItems); Iterator memory it = iterator(self); @@ -206,8 +206,8 @@ library RLP { /// @return The decoded string. function toAscii(RLPItem memory self) internal pure returns (string memory str) { require(isData(self)); - uint256 rStartPos; - uint256 len; + uint rStartPos; + uint len; (rStartPos, len) = _decode(self); bytes memory bts = new bytes(len); _copyToBytes(rStartPos, bts, len); @@ -220,8 +220,8 @@ library RLP { /// @return The decoded string. function toUint(RLPItem memory self) internal pure returns (uint data) { require(isData(self)); - uint256 rStartPos; - uint256 len; + uint rStartPos; + uint len; (rStartPos, len) = _decode(self); if (len > 32 || len == 0) revert(); @@ -236,8 +236,8 @@ library RLP { /// @return The decoded string. function toBool(RLPItem memory self) internal pure returns (bool data) { require(isData(self)); - uint256 rStartPos; - uint256 len; + uint rStartPos; + uint len; (rStartPos, len) = _decode(self); require(len == 1); uint temp; @@ -254,8 +254,8 @@ library RLP { /// @return The decoded string. function toByte(RLPItem memory self) internal pure returns (byte data) { require(isData(self)); - uint256 rStartPos; - uint256 len; + uint rStartPos; + uint len; (rStartPos, len) = _decode(self); require(len == 1); uint temp; @@ -287,8 +287,8 @@ library RLP { /// @return The decoded string. function toAddress(RLPItem memory self) internal pure returns (address data) { require(isData(self)); - uint256 rStartPos; - uint256 len; + uint rStartPos; + uint len; (rStartPos, len) = _decode(self); require (len == 20); assembly { From 94e2b3dc5b6a48eec161d4612b2f488e5666b020 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Thu, 7 Jun 2018 13:01:26 +0530 Subject: [PATCH 0106/1361] Removing explicit return statements and whitespaces --- contracts/Gate.sol | 30 ++++++++++-------------------- test/Gate.js | 2 -- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 14eb2662..667aaf3b 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -95,7 +95,7 @@ contract Gate is ProtocolVersioned, Owned { uint256 _amount, address _beneficiary) external - returns ( uint256 /* amount */) + returns (uint256 stakeRequestAmount) { require(_amount > uint256(0)); @@ -106,6 +106,7 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), _amount)); + stakeRequestAmount = _amount; stakeRequests[msg.sender] = StakeRequest({ amount: _amount, beneficiary: _beneficiary, @@ -115,14 +116,13 @@ contract Gate is ProtocolVersioned, Owned { emit StakeRequested(msg.sender, _amount, _beneficiary); - return _amount; } /// @dev In order to revert stake request the msg.sender should be the staker function revertStakeRequest() external - returns (uint256 /* amount */) + returns (uint256 stakeRequestAmount) { // only staker can do revertStakeRequest, msg.sender == staker StakeRequest storage stakeRequest = stakeRequests[msg.sender]; @@ -135,17 +135,15 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, stakeRequest.amount)); - uint256 stakeRequestAmount = stakeRequest.amount; + stakeRequestAmount = stakeRequest.amount; delete stakeRequests[msg.sender]; emit StakeRequestReverted(msg.sender, stakeRequestAmount); - - return stakeRequestAmount; } function rejectStakeRequest(address _staker, uint8 _reason) external - returns (uint256 /* amount */) + returns (uint256 stakeRequestAmount) { // check if the caller is whitelisted worker require(workers.isWorker(msg.sender)); @@ -161,13 +159,11 @@ contract Gate is ProtocolVersioned, Owned { // transfer the amount back require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(_staker, stakeRequest.amount)); - uint256 stakeRequestAmount = stakeRequest.amount; + stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[msg.sender]; emit StakeRequestRejected(_staker, stakeRequestAmount, _reason); - - return stakeRequestAmount; } /// @dev In order to accept stake the staker needs to approve gate contract for bounty amount. @@ -224,7 +220,7 @@ contract Gate is ProtocolVersioned, Owned { bytes32 _stakingIntentHash, bytes32 _unlockSecret) external - returns (uint /* amount */) + returns (uint256 stakeRequestAmount) { // check if the caller is whitelisted worker require(workers.isWorker(msg.sender)); @@ -238,7 +234,6 @@ contract Gate is ProtocolVersioned, Owned { StakeRequest storage stakeRequest = stakeRequests[staker]; - // check if the stake request exists require(stakeRequest.beneficiary != address(0)); @@ -260,18 +255,16 @@ contract Gate is ProtocolVersioned, Owned { //Transfer bounty amount to the msg.sender account require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); } - uint256 stakeProcessedAmount = stakeRequest.amount; + stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[staker]; - - return stakeProcessedAmount; } function revertStaking( bytes32 _stakingIntentHash) external - returns (uint256 /* amount */) + returns (uint256 stakeRequestAmount) { // check if the caller is whitelisted worker @@ -292,7 +285,6 @@ contract Gate is ProtocolVersioned, Owned { // check if the stake request was accepted require(stakeRequest.hashLock != bytes32(0)); - bytes32 uuidR = bytes32(0); uint256 amountST = uint256(0); address stakerAddress = address(0); @@ -303,10 +295,8 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); - uint256 revertedAmount = stakeRequest.amount; + stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[staker]; - - return revertedAmount; } } \ No newline at end of file diff --git a/test/Gate.js b/test/Gate.js index a3be6dc6..1370a768 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -58,8 +58,6 @@ contract('Gate', function(accounts) { if (isSuccessCase) { // success case let requestStakeResult = await gate.requestStake.call(amount, beneficiary, {from: staker}); - - assert.equal(amount.eq(requestStakeResult), true); let requestStakeResponse = await gate.requestStake(amount, beneficiary, {from: staker}); From 0906a390890ccc04d1bc7216a73fec8c3462c375 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Thu, 7 Jun 2018 15:17:35 +0530 Subject: [PATCH 0107/1361] uint numItems = items(self); in same line --- contracts/proof/RLP.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/proof/RLP.sol b/contracts/proof/RLP.sol index 5fb21f1f..d498d0c2 100644 --- a/contracts/proof/RLP.sol +++ b/contracts/proof/RLP.sol @@ -189,8 +189,7 @@ library RLP { /// @return Array of RLPItems. function toList(RLPItem memory self) internal pure returns (RLPItem[] memory list) { require(isList(self)); - uint numItems; - numItems = items(self); + uint numItems = items(self); list = new RLPItem[](numItems); Iterator memory it = iterator(self); uint idx; From 31630b365736c1b3c9cccabc970f6411b812a53f Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Thu, 7 Jun 2018 16:57:59 +0530 Subject: [PATCH 0108/1361] [MOSA-112] in proveOpenST function _value should be the encodedAccount, and then we should decode it with the RLP library call to extract the storage root. --- contracts/Core.sol | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index 388266cf..a526efcb 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -30,7 +30,6 @@ import "./RLP.sol"; /// @dev Core is a minimal stub that will become the anchoring and consensus point for /// the utility chain to validate itself against -// TODO - truffle test cases update contract Core is CoreInterface, Util { /* @@ -38,7 +37,7 @@ contract Core is CoreInterface, Util { */ event StateRootCommitted(uint256 blockHeight, bytes32 stateRoot); - event OpenSTProven(uint256 blockHeight, bytes32 storageRoot); + event OpenSTProven(uint256 blockHeight, bytes32 storageRoot, bytes32 hashedAccount); /* * Storage @@ -154,15 +153,13 @@ contract Core is CoreInterface, Util { /// @dev Verify account proof of OpenSTRemote and commit storage root at given block height /// @param _blockHeight block height at which OpenST is to be proven - /// @param _value rlpencoded => hashed account node object + /// @param _rlpEncodedAccount rlpencoded account node object /// @param _rlpParentNodes RLP encoded value of account proof parent nodes - /// @param _storageRoot storage root received from account proof /// @return bool status function proveOpenST( uint256 _blockHeight, - bytes32 _value, - bytes _rlpParentNodes, - bytes32 _storageRoot) + bytes _rlpEncodedAccount, + bytes _rlpParentNodes) external returns(bool status) { @@ -171,23 +168,30 @@ contract Core is CoreInterface, Util { // Check for block height require(_blockHeight != 0, "Invalid block height"); // Storage root should be valid - require(_storageRoot != bytes32(0), "Invalid storage root"); + require(_rlpEncodedAccount.length != 0, "Invalid rlp encoded account value"); bytes32 stateRoot = stateRoots[_blockHeight]; // State root should be present for the block height require(stateRoot != bytes32(0), "State root missing for given block height"); - require(_value != bytes32(0), "Node values are missing"); + // Decode RLP encoded account value + RLP.RLPItem memory accountItem = RLP.toRLPItem(_rlpEncodedAccount); + // Convert to list + RLP.RLPItem[] memory accountArray = RLP.toList(accountItem); + // Array 3rd position is storage root + bytes32 storageRoot = RLP.toBytes32(accountArray[2]); + // Hash the rlpEncodedValue value + bytes32 hashedAccount = keccak256(_rlpEncodedAccount); // Verify proof using library contract - require(MerklePatriciaProof.verify(_value, encodedOpenSTRemoteAddress, _rlpParentNodes, stateRoot), "Account proof not verified."); + require(MerklePatriciaProof.verify(hashedAccount, encodedOpenSTRemoteAddress, _rlpParentNodes, stateRoot), "Account proof not verified."); // After verification update storageRoots mapping - storageRoots[_blockHeight] = _storageRoot; + storageRoots[_blockHeight] = storageRoot; // Update latestStorageRootBlockHeight variable latestStorageRootBlockHeight = _blockHeight; // Emit event - emit OpenSTProven(_blockHeight, _storageRoot); + emit OpenSTProven(_blockHeight, storageRoot, hashedAccount); return true; } From 12c3d32ef3135ffaf4936f3954eb56a4279f6d0f Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Fri, 8 Jun 2018 12:33:04 +0200 Subject: [PATCH 0109/1361] contracts: removes HasIntents.sol and updates revertStaking --- contracts/HasIntents.sol | 32 -------------------------------- contracts/OpenSTValue.sol | 8 +++++--- 2 files changed, 5 insertions(+), 35 deletions(-) delete mode 100644 contracts/HasIntents.sol diff --git a/contracts/HasIntents.sol b/contracts/HasIntents.sol deleted file mode 100644 index 2a6bf8be..00000000 --- a/contracts/HasIntents.sol +++ /dev/null @@ -1,32 +0,0 @@ -/* solhint-disable-next-line compiler-fixed */ -pragma solidity ^0.4.23; - -// Copyright 2018 OpenST Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ---------------------------------------------------------------------------- -// Common: HasIntents -// -// http://www.simpletoken.org/ -// -// ---------------------------------------------------------------------------- - - -contract HasIntents { - /** - * Mappings - */ - mapping(bytes32 /* intentHash */ => bytes32) public intents; - -} \ No newline at end of file diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 8c259b58..a517c786 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -28,14 +28,13 @@ import "./OpsManaged.sol"; import "./EIP20Interface.sol"; import "./CoreInterface.sol"; import "./ProtocolVersioned.sol"; -import "./HasIntents.sol"; // value chain contracts import "./SimpleStake.sol"; /** Inherited contract HasIntents position should not be changed to maintain index position of intents mapping at 0 */ /// @title OpenSTValue - value staking contract for OpenST -contract OpenSTValue is HasIntents, OpsManaged, Hasher { +contract OpenSTValue is OpsManaged, Hasher { using SafeMath for uint256; /* @@ -118,6 +117,7 @@ contract OpenSTValue is HasIntents, OpsManaged, Hasher { EIP20Interface public valueToken; address public registrar; bytes32[] public uuids; + mapping(bytes32 /* intentHash */ => bytes32) public intents; mapping(uint256 /* chainIdUtility */ => CoreInterface) internal cores; mapping(bytes32 /* uuid */ => UtilityToken) public utilityTokens; /// nonce makes the staking process atomic across the two-phased process @@ -129,6 +129,7 @@ contract OpenSTValue is HasIntents, OpsManaged, Hasher { /// register the active stakes and unstakes mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; mapping(bytes32 /* hashRedemptionIntent */ => Unstake) public unstakes; + /* * Modifiers @@ -293,7 +294,8 @@ contract OpenSTValue is HasIntents, OpsManaged, Hasher { emit RevertedStake(stake.uuid, _stakingIntentHash, stake.staker, stake.amountST, stake.amountUT); - + /** Remove intent hash from intents mapping */ + delete intents[hashIntentKey(stake.staker, stake.nonce)]; delete stakes[_stakingIntentHash]; return (uuid, amountST, staker); From 757a705944b6de93e6206540e0de847134548be3 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Fri, 8 Jun 2018 12:38:05 +0200 Subject: [PATCH 0110/1361] contracts: removed inheritance comment --- contracts/OpenSTValue.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 23881d35..90b80b4f 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -32,7 +32,6 @@ import "./ProtocolVersioned.sol"; // value chain contracts import "./SimpleStake.sol"; -/** Inherited contract HasIntents position should not be changed to maintain index position of intents mapping at 0 */ /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is OpsManaged, Hasher { using SafeMath for uint256; From 467491f5b2147015deafa8bdf0d468acafb2dab1 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Fri, 8 Jun 2018 16:45:15 +0530 Subject: [PATCH 0111/1361] Adding truffle testcase for commit state root --- test/Core.js | 36 +++++++++++++++++++++++++++++++----- test/Core_utils.js | 8 +++++--- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/test/Core.js b/test/Core.js index 656bb25f..bc6c773e 100644 --- a/test/Core.js +++ b/test/Core.js @@ -20,6 +20,7 @@ // ---------------------------------------------------------------------------- const Core_utils = require('./Core_utils.js'); +const Utils = require('./lib/utils.js'); /// /// Test stories @@ -39,18 +40,43 @@ contract('Core', function(accounts) { before(async () => { contracts = await Core_utils.deployCore(artifacts, accounts); core = contracts.core; - }) + }); it('has coreRegistrar', async () => { assert.equal(await core.registrar.call(), registrar); - }) + }); it('has coreChainIdRemote', async () => { assert.equal(await core.chainIdRemote.call(), chainIdRemote); - }) + }); it('has coreOpenSTRemote', async () => { assert.equal(await core.openSTRemote.call(), openSTRemote); }) - }) -}) + }); + + + describe('commitStateRoot', async () => { + before(async () => { + contracts = await Core_utils.deployCore(artifacts, accounts); + core = contracts.core; + worker = contracts.worker; + }); + + it('should be able to commit state root for give block height', async () => { + let reciept = await core.commitStateRoot(1, '0x4567897545535535365', {from: worker}); + assert.equal(reciept.logs.length, 1); + assert.equal(reciept.logs[0].event, 'StateRootCommitted'); + }); + + it('should not be able to commit state root of block height which is already commited', async () => { + await Utils.expectThrow(core.commitStateRoot(1, '0x4567897545535535365', {from: worker})); + }); + + it('should not be able to commit state root of block height less than latest block height', async () => { + await core.commitStateRoot(4, '0x45675567897545535535365', {from: worker}); + await Utils.expectThrow(core.commitStateRoot(3, '0x4567897545535535365', {from: worker})); + }); + + }) +}); diff --git a/test/Core_utils.js b/test/Core_utils.js index 983d5886..5b1214b2 100644 --- a/test/Core_utils.js +++ b/test/Core_utils.js @@ -49,8 +49,10 @@ module.exports.deployCore = async (artifacts, accounts) => { await workers.setAdminAddress(admin); await workers.setOpsAddress(ops); await workers.setWorker(worker1, deactivationHeight, {from:ops}); + const core = await Core.new(registrar, chainIdOrigin, chainIdRemote, openSTRemote, workers.address, {from:accounts[0]}); return { - core : core - } -} + core: core, + worker: worker1 + } +}; From d89027802060256449b2e846e2cfac2af614e77d Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Fri, 8 Jun 2018 16:52:05 +0530 Subject: [PATCH 0112/1361] Changes for calling Core contract --- contracts/OpenSTUtility.sol | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 9584b3cd..09927d73 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -190,15 +190,13 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /* * Registrar functions */ - function addCore( + function updateCore( CoreInterface _core) public onlyRegistrar returns (bool /* success */) { require(address(_core) != address(0)); - // core constructed with same registrar - require(registrar == _core.registrar()); // on value chain core only tracks a remote utility chain uint256 chainIdUtility = _core.chainIdRemote(); require(chainIdUtility != 0); @@ -610,25 +608,25 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { /// @dev for v0.9.1 tracking Ethereum mainnet on the utility chain /// is not a required feature yet, so the core is simplified /// to uint256 valueChainId as storage on construction - // function addCore( - // CoreInterface _core) - // public - // onlyRegistrar - // returns (bool /* success */) - // { - // require(address(_core) != address(0)); - // // core constructed with same registrar - // require(registrar == _core.registrar()); - // // on utility chain core only tracks a remote value chain - // uint256 coreChainIdValue = _core.chainIdRemote(); - // require(chainIdUtility != 0); + function addCore( + CoreInterface _core) + public + onlyRegistrar + returns (bool /* success */) + { + require(address(_core) != address(0)); + // core constructed with same registrar + require(registrar == _core.registrar()); + // on utility chain core only tracks a remote value chain + uint256 coreChainIdValue = _core.chainIdRemote(); + require(chainIdUtility != 0); // // cannot overwrite core for given chainId - // require(cores[coreChainIdValue] == address(0)); + require(cores[coreChainIdValue] == address(0)); - // cores[coreChainIdValue] = _core; + cores[coreChainIdValue] = _core; - // return true; - // } + return true; + } /* solhint-disable-next-line separate-by-one-line-in-contract */ function registerBrandedToken( From 5d16894fdaf712eacb677e1afbbcce600f5d233c Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Fri, 8 Jun 2018 17:21:20 +0530 Subject: [PATCH 0113/1361] Removed unwanted code.gulshan/MOSA-49 --- test/OpenSTUtility.js | 5 ----- test/OpenSTValue.js | 4 ---- 2 files changed, 9 deletions(-) diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index ee0db474..690e02e6 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -267,9 +267,6 @@ contract('OpenSTUtility', function(accounts) { it('successfully confirms', async () => { expirationHeight = await openSTUtility.confirmStakingIntent.call(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); - - // call block number is one less than send block number - //expirationHeight = expirationHeight.plus(1) //test commenting result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); await OpenSTUtility_utils.checkStakingIntentConfirmedEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, accounts[0], accounts[0], amountST, amountUT, expirationHeight); }) @@ -363,7 +360,6 @@ contract('OpenSTUtility', function(accounts) { var redeemReturns = await openSTUtility.redeem.call(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); // call block number is one less than send block number - //unlockHeight = redeemReturns[0].plus(1); test commenting unlockHeight = redeemReturns[0]; var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(checkBtUuid, accounts[0], 2, redeemBeneficiary, redeemAmountUT, unlockHeight, lockR.l); result = await openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); @@ -403,7 +399,6 @@ contract('OpenSTUtility', function(accounts) { var redeemReturns = await openSTUtility.redeemSTPrime.call(redeemSTP.toNumber(), redeemBeneficiary, lockR.l, { from: redeemer, value: 2 }); // call block number is one less than send block number - //unlockHeight = redeemReturns[1].plus(1); --commenting test unlockHeight = redeemReturns[1]; var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(uuidSTPrime, redeemer, 2, redeemBeneficiary, redeemSTP, unlockHeight, lockR.l); result = await openSTUtility.redeemSTPrime(redeemSTP, redeemBeneficiary, lockR.l, { from: redeemer, value: redeemSTP }); diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 13b195b3..cd15da77 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -250,7 +250,6 @@ contract('OpenSTValue', function(accounts) { nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - //var unlockHeight = stakeReturns[2].plus(1); --test commenting var unlockHeight = stakeReturns[2]; stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, lock.l); @@ -284,7 +283,6 @@ contract('OpenSTValue', function(accounts) { nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - //var unlockHeight = stakeReturns[2].plus(1); --test commenting var unlockHeight = stakeReturns[2]; stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, accounts[0], nonce, accounts[0], amountST, amountUT, unlockHeight, lock.l); @@ -536,7 +534,6 @@ contract('OpenSTValue', function(accounts) { nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - //unlockHeight = stakeReturns[2].plus(1); --test commenting unlockHeight = stakeReturns[2]; stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, { from: staker }); @@ -606,7 +603,6 @@ contract('OpenSTValue', function(accounts) { nonce = stakeReturns[1].toNumber(); // call block number is one less than send block number - //unlockHeight = stakeReturns[2].plus(1); unlockHeight = stakeReturns[2]; stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); From 6b1e2da5fe7c68964ef98efbb66df201be3787c3 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Fri, 8 Jun 2018 17:21:21 +0530 Subject: [PATCH 0114/1361] Truffle test for proving openst --- test/Core.js | 87 ++++++++++++++++++++++++++++++++++--- test/Core_utils.js | 3 +- test/data/AccountProof.json | 6 +++ 3 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 test/data/AccountProof.json diff --git a/test/Core.js b/test/Core.js index bc6c773e..ccaf8fef 100644 --- a/test/Core.js +++ b/test/Core.js @@ -21,6 +21,9 @@ const Core_utils = require('./Core_utils.js'); const Utils = require('./lib/utils.js'); +const accountProof = require('./data/AccountProof'); +const ethutil = require('ethereumjs-util'); +const BigNumber = require('bignumber.js'); /// /// Test stories @@ -34,12 +37,17 @@ const Utils = require('./lib/utils.js'); contract('Core', function(accounts) { const registrar = accounts[1]; const chainIdRemote = 1410; - const openSTRemote = accounts[4]; + const openSTRemote = '0x01db94fdca0ffedc40a6965de97790085d71b412'; describe('Properties', async () => { before(async () => { - contracts = await Core_utils.deployCore(artifacts, accounts); - core = contracts.core; + contracts = await Core_utils.deployCore(artifacts, accounts); + core = contracts.core; + workercontract = contracts.workercontract; + worker = contracts.worker; + await core.commitStateRoot(5, accountProof.stateRoot, {from: worker}); + await core.proveOpenST(5, accountProof.value, accountProof.RLPparentNodes, {from: worker}); + }); it('has coreRegistrar', async () => { @@ -52,7 +60,27 @@ contract('Core', function(accounts) { it('has coreOpenSTRemote', async () => { assert.equal(await core.openSTRemote.call(), openSTRemote); - }) + }); + + it('has encodedOpenSTRemoteAddress', async () => { + let expectedEncodedAddress = '0x' + ethutil.sha3(openSTRemote).toString('hex'); + assert.equal(await core.encodedOpenSTRemoteAddress.call(), expectedEncodedAddress); + }); + + it('has worker', async () => { + assert.equal(await core.workers.call(), workercontract.address); + }); + + it('has latestStateRootBlockHeight', async () => { + let actualBlockHeight = await core.latestStateRootBlockHeight.call(); + assert.equal(actualBlockHeight.eq(new BigNumber(5)), true); + }); + + it('has latestStorageRootBlockHeight', async () => { + let actualBlockHeight = await core.latestStorageRootBlockHeight.call(); + assert.equal(actualBlockHeight.eq(new BigNumber(5)), true); + }); + }); @@ -69,6 +97,9 @@ contract('Core', function(accounts) { assert.equal(reciept.logs[0].event, 'StateRootCommitted'); }); + it('should not be able to commit state root of block height if non worker commits root', async () => { + await Utils.expectThrow(core.commitStateRoot(1, '0x4567897545535535365', {from: accounts[0]})); + }); it('should not be able to commit state root of block height which is already commited', async () => { await Utils.expectThrow(core.commitStateRoot(1, '0x4567897545535535365', {from: worker})); }); @@ -77,6 +108,52 @@ contract('Core', function(accounts) { await core.commitStateRoot(4, '0x45675567897545535535365', {from: worker}); await Utils.expectThrow(core.commitStateRoot(3, '0x4567897545535535365', {from: worker})); }); + }); + + describe('Prove OpenSt', async () => { + before(async () => { + + contracts = await Core_utils.deployCore(artifacts, accounts); + core = contracts.core; + worker = contracts.worker; + await core.commitStateRoot(5, accountProof.stateRoot, {from: worker}); + }); + + it('should be able to verify proof for account', async () => { + + let reciept = await core.proveOpenST(5, accountProof.value, accountProof.RLPparentNodes, {from: worker}); + assert.equal(reciept.logs.length, 1); + assert.equal(reciept.logs[0].event, 'OpenSTProven'); + + }); + + it('should be able to verify proof for account if its called by non worker ', async () => { + + await Utils.expectThrow(core.proveOpenST(5, accountProof.value, accountProof.RLPparentNodes, {from: accounts[0]})); + + }); + + it('should not be able to verify proof for account if block state root is not committed', async () => { + + await Utils.expectThrow(core.proveOpenST(6, accountProof.value, accountProof.RLPparentNodes, {from: worker})); + + }); + + it('should not be able to verify proof for account if wrong value is passed', async () => { + + await Utils.expectThrow(core.proveOpenST(5, '0x346abcdef45363678578322467885654422353665', accountProof.RLPparentNodes, {from: worker})); + }); + + it('should not be able to verify proof for account if wrong parentNodes are passed', async () => { + + let wrongRLPNodes = '0x456785315786abcde456785315786abcde456785315786abcde' + await Utils.expectThrow(core.proveOpenST(5, accountProof.value, wrongRLPNodes, {from: worker})); + }); +}); + + + + + - }) }); diff --git a/test/Core_utils.js b/test/Core_utils.js index 5b1214b2..a2cef2b8 100644 --- a/test/Core_utils.js +++ b/test/Core_utils.js @@ -33,7 +33,7 @@ module.exports.deployCore = async (artifacts, accounts) => { const registrar = accounts[1] , chainIdOrigin = 3 , chainIdRemote = 1410 - , openSTRemote = accounts[4] + , openSTRemote = '0x01db94fdca0ffedc40a6965de97790085d71b412' , valueToken = await SimpleToken.new() , admin = accounts[2] , ops = accounts[3] @@ -53,6 +53,7 @@ module.exports.deployCore = async (artifacts, accounts) => { const core = await Core.new(registrar, chainIdOrigin, chainIdRemote, openSTRemote, workers.address, {from:accounts[0]}); return { core: core, + workercontract : workers, worker: worker1 } }; diff --git a/test/data/AccountProof.json b/test/data/AccountProof.json new file mode 100644 index 00000000..900e3548 --- /dev/null +++ b/test/data/AccountProof.json @@ -0,0 +1,6 @@ +{ + "value": "0xf8468206fb80a036ed801abf5678f1506f1fa61e5ccda1f4de53cc7cd03224e3b2a03159b6460da05b7534dec07bb70fb401032a60cb5a9d67f2bd2f50dfad5f2656c3c2fe8f2675", + "path": "0x01dB94fdCa0FFeDc40A6965DE97790085d71b412", + "RLPparentNodes": "0xf908cef90211a0f113fc83479a9dcb7a7b5c98cdb42f24260f4d12b82003c3a99c0396d58918e4a007da904438ce6e90091514622c5f43816ebda4b28edb7d28c185af95b0b5d0bba0fa08a20a1e7b354aea4186ce7a56c66f08e0bad3d384ccbec3308b86a048f28da082faa84d23c856e00add29d83dffd20c640f7c4cb500a2f1b6ec345730518090a0db06fd0cd48958bdadc30f163ea9bb95d5cd1ca5605b649bca7a94f51e629b86a001cb1bae18830ad03bffb1ed8ad4c2c0338dfb6d4edc734b60d4751c838cf6d1a0b549ccb01890070dde0c2339fe189a54c3f9b5d6c0dee5c3228ec13ea8154f08a0fa860a8dd11a45a645c8f2add444311d0ce77e0e0153af518a8c82cd2a4e530ca0582c96d90db5da3e59dee0bb2ca191d97613717000c24f012539b61be5d777a9a0bc30df4754a90bde3a6f795a03f6cb2747f9180fa13087a249eda1993e38213ba04030ae5f6e34465c29bf9f164bd168e291fea360fa9ac6e2a01bcfaa29c97837a028f4323329a54f02e9fa6c65b9992b380602ce8d86f3c4ea6d1f799376eede97a099728882f75d2777db12440f90756cad8ce90637726e2949cc3039a310c0d26ba015e593e9d83137f2a6b3d6e79f3efdb62b7c2e0d4885f242392903c458adbecba0a022e3488e55dcdd8ff64c000e33f45c51a5fce1225647042ee26e512cfaf8aea03c35754a8a080ec63632e7b3d5fd2b653b4d217116dc74ec44c1eee04d2f611280f90211a056236df72b2a3baf3c4b110622911d48e8134dce5fab96dc4aa0e86bf1345f38a0e02f83a4f33cc5e624d7243d341d4b4d06a91e074250dbf2caebfa2c3e4765d0a0a72d49adff0c5e77dc9d95b4191d8d6668971f74077797659f83d415cd0fd1d1a0c60abc4f0a940d618cf9cea13adfaa4c03e3061bd702986daf5237d1065ef788a05d962c16915d89ede187bd317d3b90c6e4fdd076e53267e1857102cefadf22eda0926dc3780e5eefb8e262d98db26df3429404beb9ae838e69ba7c071d09891791a0a5f7008f700c2d6f10e14071c6471f62005f8409ed6af67a955ad7fb939c27caa0b558c2fee610404a708a543aebd8a729da27434f5608cbaa4691462c72874056a0faa4cce3c8599c6d984e9577ab6bd9b0c006068c31d9e03215cc8908114d7757a0a3d6d16c957326cd262da81bad6b7dee022e4dbd202adff5d7ccc4342a61d21fa0d55c004ac2e9eaec20c2cffef567de49df83fde291e52abc815db781dac5456ba06ab98c39c210c5e2a9ffb994afdefd5ca02bdceff8cfd8e60d68c199d864b94ca0522232d286697b81da8721463bce6e8dedff3330bc13c02937b78fe1afa9005ba0c3bf8ac2260dab7d0108b546f94e2c714aaea8b2274745b7575ded129520304ea0a481df0f7947c98bd4ea7738f706826df3031ae129e362fcfeca937e8651eb4ea05193d68afbd4b7509f77498f1587ea9e090697c2e95c4d2bafbb52a8cf9bd62480f90211a011561aaab4838e5fa61b9e6debfdba192744c612d2ba76ab61deb015746aa5a0a00026c65c973bbd95e6c0e980f4d22e4627715e5e9f421c80fc49f1f67f7b971fa00d119e6b55db30543e2065bc456dbe0828b97c1b0d217846c4ee787bee670d79a0bc563733a582905db3b2eb375218ff1b64cc9a12abc84ec663086a460a625394a093ff057cda650d4808cb25651fe2f77652107c4c56d9647fe75c8c0a3d2d0d64a06cf305021c9a1a175e01fe56f8ef8f527f8a69fc9042e9b1b0a4ba53ea3b0025a078a50de369a7bddf71b0f8bab722b4c34c56918eb051776a7cb8598c0011170ba0699884e0545d810a93c1c80a6ba48020ade2ada6b556764f937712c8628c033da00d02491b26b79333b5a3ec8ffd455921600cc327183d260ad4d4ed5d63fc2aa6a02d9468383a418e9303989bbad1845e3c48ef803bacea406e1fd68e25a565a9d2a0a4453049a044659669a5ff8c56229d339ea860b934ad895bab0ef865cce2fffea0d654be53e9c8fc64a068ef9cd7768eadbeb52bcaa764cececfa6be01b8e074f2a087f0f15350b42c7a8efe19eb64bf8b7ab13daeeebb40f4f3f8b3685b0fc0031ea0ce410da15fc84e9b8caf8d6785f241c74a6b70d5b62f71ba4a1d09ff47921d8da0fcf5effb792c9b1ca3fbffe251cdb27c0facf30d3445b3e230537df48399da69a042acf9ab2c371e984f2c280566ba342a4e0a081e555bbec957aab3296fb4af1980f901d1a07c6a2cff79b45c222da90c55b00dca5f51b62b0cbeff1a0c1f6984851be684daa097fa80b5e381a5d49663a6b86e8721843b93e534da0db48e1db74967c28d7e82a045009364e98f5b0ead865504e8209ccffb7fb63b2a28464717504a78141f518fa039bcfc875dbca2f973a7f5f2f19b55b3bc22f80f387413a12ee0dab5e0254107a009c6f751027ce16b579633a060bee4028dd0ba87567fadf0a887811d9ed7e594a0d0eba05cdd60831f8532710718106860bc2853dc628e55e286c78afe6f3891d0a0904d4bf3896ac04520fd93e47169b6bfff4c7cdf25420b342784abd7090f2dd4a0feb4a9be9f299e0f58645e4ae2f8e2c2082368d2e08a9cec0c6ae37411c56de9a0e30f69e6968d9611a3d52d210a282244316d31367642f2c4f159161fec71e269a0a665c800370015f89a458e68e95b96c4e6976347a6a5f76df6b58f1451bb8948a0120a7594596f36b628223057eb375c73653dfa6fcbfc3ec8d2ce201a685aaa9680a0c7bbde5d654a3bf527ae035eeba861d25280b88b7a0376bf7c39625d9ffd9879a005d5ae3d04a79a90f21af570116b6e4c29e6e606c877bf9b015a5f03e18d1e24a0b2b77afc6c3b77c6a171e5f49bd6508f455fbe93864c7c832a02b303e4f227e48080f8518080808080a081dc71924e3436de3a7ddd7cd6abcc0d7f8beb7d7186e388c7dabc158ad6e0b1808080808080a011947a5a80ea783ca7627105736c527e60b5565bb4af2a1fd594f7d9adc01e5d80808080f8699e3e4ced21ae7bedd22cd1f49238c2280cf1e50a14e8f5d2038e29f59f37afb848f8468206fb80a036ed801abf5678f1506f1fa61e5ccda1f4de53cc7cd03224e3b2a03159b6460da05b7534dec07bb70fb401032a60cb5a9d67f2bd2f50dfad5f2656c3c2fe8f2675", + "stateRoot": "0x58810687b84d5bddc1e9e68b2733caa4a8c6c9e7dd5d0b2f9c28b4bbf5c6f850" +} \ No newline at end of file From f1e8ed474261dd7ce02ddc554fd3191dbf8af387 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Mon, 11 Jun 2018 13:29:11 +0530 Subject: [PATCH 0115/1361] Explicitly adding return statement in each function and correcting return types --- contracts/Gate.sol | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 667aaf3b..48c515d6 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -95,7 +95,7 @@ contract Gate is ProtocolVersioned, Owned { uint256 _amount, address _beneficiary) external - returns (uint256 stakeRequestAmount) + returns (bool isSuccess) { require(_amount > uint256(0)); @@ -106,7 +106,6 @@ contract Gate is ProtocolVersioned, Owned { require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), _amount)); - stakeRequestAmount = _amount; stakeRequests[msg.sender] = StakeRequest({ amount: _amount, beneficiary: _beneficiary, @@ -116,13 +115,14 @@ contract Gate is ProtocolVersioned, Owned { emit StakeRequested(msg.sender, _amount, _beneficiary); + return true; } /// @dev In order to revert stake request the msg.sender should be the staker function revertStakeRequest() external - returns (uint256 stakeRequestAmount) + returns (uint256 stakeRequestAmount) { // only staker can do revertStakeRequest, msg.sender == staker StakeRequest storage stakeRequest = stakeRequests[msg.sender]; @@ -139,6 +139,8 @@ contract Gate is ProtocolVersioned, Owned { delete stakeRequests[msg.sender]; emit StakeRequestReverted(msg.sender, stakeRequestAmount); + + return stakeRequestAmount; } function rejectStakeRequest(address _staker, uint8 _reason) @@ -164,6 +166,8 @@ contract Gate is ProtocolVersioned, Owned { delete stakeRequests[msg.sender]; emit StakeRequestRejected(_staker, stakeRequestAmount, _reason); + + return stakeRequestAmount; } /// @dev In order to accept stake the staker needs to approve gate contract for bounty amount. @@ -258,6 +262,8 @@ contract Gate is ProtocolVersioned, Owned { stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[staker]; + + return stakeRequestAmount; } @@ -298,5 +304,7 @@ contract Gate is ProtocolVersioned, Owned { stakeRequestAmount = stakeRequest.amount; // delete the stake request from the mapping storage delete stakeRequests[staker]; + + return stakeRequestAmount; } } \ No newline at end of file From cc7f45c314807a09180a85d9f663956cc0ac120f Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Mon, 11 Jun 2018 14:15:13 +0530 Subject: [PATCH 0116/1361] Asserting Event parameters during commit state root and prove openst --- test/Core.js | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/test/Core.js b/test/Core.js index ccaf8fef..afd64011 100644 --- a/test/Core.js +++ b/test/Core.js @@ -24,6 +24,7 @@ const Utils = require('./lib/utils.js'); const accountProof = require('./data/AccountProof'); const ethutil = require('ethereumjs-util'); const BigNumber = require('bignumber.js'); +const web3EventsDecoder = require('./lib/event_decoder.js'); /// /// Test stories @@ -92,9 +93,15 @@ contract('Core', function(accounts) { }); it('should be able to commit state root for give block height', async () => { - let reciept = await core.commitStateRoot(1, '0x4567897545535535365', {from: worker}); - assert.equal(reciept.logs.length, 1); - assert.equal(reciept.logs[0].event, 'StateRootCommitted'); + let stateRoot = '0x4567897545535535365000000000000000000000000000000000000000000000'; + let response = await core.commitStateRoot(1, stateRoot, {from: worker}); + + let formattedDecodedEvents = web3EventsDecoder.perform(response.receipt, core.address, core.abi); + let event = formattedDecodedEvents['StateRootCommitted']; + + assert.equal(event !== null, true); + assert.equal(event["blockHeight"], 1); + assert.equal(event["stateRoot"], stateRoot); }); it('should not be able to commit state root of block height if non worker commits root', async () => { @@ -121,10 +128,21 @@ contract('Core', function(accounts) { it('should be able to verify proof for account', async () => { - let reciept = await core.proveOpenST(5, accountProof.value, accountProof.RLPparentNodes, {from: worker}); - assert.equal(reciept.logs.length, 1); - assert.equal(reciept.logs[0].event, 'OpenSTProven'); + let parentNodes = ethutil.rlp.decode(accountProof.RLPparentNodes); + let accountNode = parentNodes[parentNodes.length - 1]; + let accountValue = ethutil.rlp.decode(accountNode[1]); + let storageRoot = '0x' + accountValue[2].toString('hex'); + let hashedAccountValue = '0x'+ethutil.sha3(accountProof.value).toString('hex'); + + let response = await core.proveOpenST(5, accountProof.value, accountProof.RLPparentNodes, {from: worker}); + let formattedDecodedEvents = web3EventsDecoder.perform(response.receipt, core.address, core.abi); + let event = formattedDecodedEvents['OpenSTProven']; + + assert.equal(event !== null, true); + assert.equal(event["blockHeight"], 5); + assert.equal(event["storageRoot"], storageRoot); + assert.equal(event["hashedAccount"], hashedAccountValue); }); it('should be able to verify proof for account if its called by non worker ', async () => { @@ -151,9 +169,4 @@ contract('Core', function(accounts) { }); }); - - - - - }); From 1a55a5cf1d0f3b107aac1a09dfaabfcd4633a89e Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Mon, 11 Jun 2018 14:29:58 +0530 Subject: [PATCH 0117/1361] Fixing broken unit tests --- test/Gate.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Gate.js b/test/Gate.js index 1370a768..bb51bfca 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -57,8 +57,8 @@ contract('Gate', function(accounts) { if (isSuccessCase) { // success case - let requestStakeResult = await gate.requestStake.call(amount, beneficiary, {from: staker}); - assert.equal(amount.eq(requestStakeResult), true); + let isSuccess = await gate.requestStake.call(amount, beneficiary, {from: staker}); + assert.equal(isSuccess, true); let requestStakeResponse = await gate.requestStake(amount, beneficiary, {from: staker}); await Gate_utils.checkRequestStakeEvent(requestStakeResponse.logs[0],staker, amount, beneficiary); From a9177f7024afe0442e3a55a47ef037ea78cda746 Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Mon, 11 Jun 2018 15:58:37 +0530 Subject: [PATCH 0118/1361] Changes done as per ganache-cli --- test/Gate.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Gate.js b/test/Gate.js index 787408c7..e0f9abde 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -175,6 +175,7 @@ contract('Gate', function(accounts) { let amountUT = stakingIntentHashParams.amountUT; let nonce = stakingIntentHashParams.nonce; let unlockHeight = stakingIntentHashParams.unlockHeight; + console.log("AcceptStakeRequest",unlockHeight); stakingIntentHash = stakingIntentHashParams.stakingIntentHash; @@ -294,7 +295,7 @@ contract('Gate', function(accounts) { let acceptStakeRequestResult = await gate.acceptStakeRequest.call(staker, lock.l, {from: messageSender}); let amountUT = acceptStakeRequestResult[0]; let nonce = acceptStakeRequestResult[1]; - let unlockHeight = acceptStakeRequestResult[2].plus(1); + let unlockHeight = acceptStakeRequestResult[2]; stakingIntentHash = await openSTValue.hashStakingIntent.call(uuid, staker, nonce, beneficiaryAccount, amount, amountUT, unlockHeight, lock.l); From c6ef38812fdc8ac065c14170f027085e9e519c36 Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Mon, 11 Jun 2018 16:04:18 +0530 Subject: [PATCH 0119/1361] Removed console.log.MOSA-49 --- test/Gate.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/Gate.js b/test/Gate.js index e0f9abde..f04fc2f6 100644 --- a/test/Gate.js +++ b/test/Gate.js @@ -175,8 +175,6 @@ contract('Gate', function(accounts) { let amountUT = stakingIntentHashParams.amountUT; let nonce = stakingIntentHashParams.nonce; let unlockHeight = stakingIntentHashParams.unlockHeight; - console.log("AcceptStakeRequest",unlockHeight); - stakingIntentHash = stakingIntentHashParams.stakingIntentHash; let acceptStakeRequestResponse = await gate.acceptStakeRequest(staker, lock.l, {from: messageSender}); From c7ac2cc1bd36588b224cc0c055130470ad773d47 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Mon, 11 Jun 2018 16:48:20 +0530 Subject: [PATCH 0120/1361] Adding npm dev dependeny for tests --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7a5db47d..e398c02f 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,15 @@ "bignumber.js": "^4.1.0", "keccak": "^1.4.0", "moment": "^2.19.2", - "solparse": "^2.2.5", "web3": "^1.0.0-beta.33" }, "devDependencies": { "truffle": "^4.1.8", "ganache-cli": "^6.0.3", "abi-decoder": "^1.0.9", - "ethereumjs-testrpc": "^6.0.3" + "ethereumjs-testrpc": "^6.0.3", + "ethereumjs-util": "^5.2.0", + "solparse": "^2.2.5" }, "author": "OpenST Foundation Ltd.", "license": "Apache v2.0" From 6a58db1804ab67fe5649686e16734358aa4392d6 Mon Sep 17 00:00:00 2001 From: Sarvesh Jain Date: Wed, 13 Jun 2018 16:59:31 +0530 Subject: [PATCH 0121/1361] Removing variable declaration from return statement which is unused --- contracts/Gate.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 48c515d6..e6740ea4 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -95,7 +95,7 @@ contract Gate is ProtocolVersioned, Owned { uint256 _amount, address _beneficiary) external - returns (bool isSuccess) + returns (bool /* success */) { require(_amount > uint256(0)); From aff325f30b38357ee14fb1cefbf77dc8d3c33d8f Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Thu, 14 Jun 2018 15:25:55 +0530 Subject: [PATCH 0122/1361] Added changes for generating storage proof --- contracts/OpenSTUtility.sol | 6 ++++-- test/OpenSTUtility.js | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 63eab5ac..eaf1d4b2 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -33,6 +33,7 @@ import "./BrandedToken.sol"; import "./UtilityTokenInterface.sol"; import "./ProtocolVersioned.sol"; import "./Core.sol"; +import "./MerklePatriciaProof.sol"; /// @title OpenST Utility contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { @@ -257,8 +258,9 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { _hashLock ); - bytes32 storageRoot = core.getStorageRoot(_blockHeight); - require(core.verify(stakingIntentHash,hash(staker,stakerNonce) ,rlpParentNodes,storageRoot)); + bytes32 storageRoot = core.storageRoots(_blockHeight); + + require(MerklePatriciaProof.verify(keccak256(stakingIntentHash),OpenSTUtils.storagePath(5, keccak256(staker,stakerNonce)) ,rlpParentNodes,storageRoot)); mints[stakingIntentHash] = Mint({ uuid: _uuid, diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index 76bbad5b..3bb68268 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -229,7 +229,8 @@ contract('OpenSTUtility', function(accounts) { }) it('fails to confirm by non-registrar', async () => { - await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: accounts[0] })); + let blockNumber = await web3.eth.getBlockNumber(); + await Utils.expectThrow(openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash,blockNumber, { from: accounts[0] })); }) it('fails to confirm when token is not registered', async () => { @@ -273,6 +274,11 @@ contract('OpenSTUtility', function(accounts) { result = await openSTUtility.confirmStakingIntent(checkBtUuid, accounts[0], 1, accounts[0], amountST, amountUT, 80668, lock.l, checkStakingIntentHash, { from: registrar }); await OpenSTUtility_utils.checkStakingIntentConfirmedEvent(result.logs[0], checkBtUuid, checkStakingIntentHash, accounts[0], accounts[0], amountST, amountUT, expirationHeight); }) + + it('Storage proof',async() => { + + }) + }) describe('ProcessMinting', async () => { From ba4b707fa13936be88152598261e99af41dcf49e Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Mon, 18 Jun 2018 16:42:02 +0530 Subject: [PATCH 0123/1361] [MOSA-119]Move proof contracts from contracts/proof directory to contracts directory --- contracts/{proof => }/MerklePatriciaProof.sol | 0 contracts/{proof => }/RLP.sol | 0 contracts/{proof => }/util.sol | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename contracts/{proof => }/MerklePatriciaProof.sol (100%) rename contracts/{proof => }/RLP.sol (100%) rename contracts/{proof => }/util.sol (100%) diff --git a/contracts/proof/MerklePatriciaProof.sol b/contracts/MerklePatriciaProof.sol similarity index 100% rename from contracts/proof/MerklePatriciaProof.sol rename to contracts/MerklePatriciaProof.sol diff --git a/contracts/proof/RLP.sol b/contracts/RLP.sol similarity index 100% rename from contracts/proof/RLP.sol rename to contracts/RLP.sol diff --git a/contracts/proof/util.sol b/contracts/util.sol similarity index 100% rename from contracts/proof/util.sol rename to contracts/util.sol From 2d9eaa30d963f49cf3d5997ad2a38a5b0896656a Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 18 Jun 2018 19:37:30 +0530 Subject: [PATCH 0124/1361] contract: changes related to core and safeunlock time --- contracts/Core.sol | 15 +++++++++++++++ contracts/OpenSTUtility.sol | 8 ++------ contracts/OpenSTValue.sol | 8 ++------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index d4c6ad44..29cdb94b 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -53,6 +53,13 @@ contract Core is CoreInterface { // mapping(bytes32 => address) stakeTokenTuple; + // ~5Days + uint256 private constant TIME_TO_WAIT_MEDIUM = 432000; + + uint256 public remoteBlockTime; + + uint256 public blocksToWaitMedium; + /* * Public functions */ @@ -99,4 +106,12 @@ contract Core is CoreInterface { { return coreOpenSTRemote; } + + function safeUnlockTime() + external + view + returns (uint256 unlockTime) + { + return blocksToWaitMedium + block.number; + } } \ No newline at end of file diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index aba870a5..13a4a104 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -226,10 +226,8 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { require(_stakingUnlockHeight > 0); require(_stakingIntentHash != ""); - // TODO: - // 1. get latest block height from Core, blockNumber. - // 2. get block time from Core, blockTime. - // 3. expirationHeight = blockNumber + TIME_TO_WAIT_MEDIUM.div(blockTime) + require(core.safeUnlockTime() < _stakingUnlockHeight); + expirationHeight = block.number + blocksToWaitShort; nonces[_staker] = _stakerNonce; @@ -276,7 +274,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { // as process minting results in a gain it needs to expire well before // the escrow on the cost unlocks in OpenSTValue.processStake - // TODO: get blockNumber from core. require(mint.expirationHeight > block.number); UtilityTokenInterface token = registeredTokens[mint.uuid].token; @@ -309,7 +306,6 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { // require that the mint has expired and that the staker has not // processed the minting, ie mint has not been deleted require(mint.expirationHeight > 0); - // TODO: get blockNumber from core. require(mint.expirationHeight <= block.number); uuid = mint.uuid; diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index c9a108a0..2d40a173 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -328,6 +328,8 @@ contract OpenSTValue is OpsManaged, Hasher { require(_redemptionUnlockHeight > 0); require(_redemptionIntentHash != ""); + require(cores[utilityTokens[_uuid].chainIdUtility].safeUnlockTime() < _redemptionUnlockHeight); + require(nonces[_redeemer] + 1 == _redeemerNonce); nonces[_redeemer]++; @@ -343,10 +345,6 @@ contract OpenSTValue is OpsManaged, Hasher { require(_redemptionIntentHash == redemptionIntentHash); - // TODO: - // 1. get latest block height from Core, blockNumber. - // 2. get block time from Core, blockTime. - // 3. expirationHeight = blockNumber + TIME_TO_WAIT_MEDIUM.div(blockTime) expirationHeight = block.number + blocksToWaitShort; UtilityToken storage utilityToken = utilityTokens[_uuid]; @@ -390,7 +388,6 @@ contract OpenSTValue is OpsManaged, Hasher { // as the process unstake results in a gain for the caller // it needs to expire well before the process redemption can // be reverted in OpenSTUtility - // TODO: get blockNumber from core. require(unstake.expirationHeight > block.number); UtilityToken storage utilityToken = utilityTokens[unstake.uuid]; @@ -423,7 +420,6 @@ contract OpenSTValue is OpsManaged, Hasher { // require that the unstake has expired and that the redeemer has not // processed the unstaking, ie unstake has not been deleted require(unstake.expirationHeight > 0); - // TODO: get blockNumber from core. require(unstake.expirationHeight <= block.number); uuid = unstake.uuid; From 586d4f793847d8908d429c0984dd629eb5166e20 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 19 Jun 2018 12:50:18 +0530 Subject: [PATCH 0125/1361] Updated test for Gate, now passing proper stakingAccount. MOSA-120 --- test/Gate_utils.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/Gate_utils.js b/test/Gate_utils.js index 38402ac8..54a21425 100644 --- a/test/Gate_utils.js +++ b/test/Gate_utils.js @@ -72,11 +72,13 @@ module.exports.deployGate = async (artifacts, accounts) => { checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); - assert.equal(await openSTValue.registerUtilityToken.call(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }), checkUuid); - const result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); + const gate = await Gate.new(workers.address, bounty, checkUuid, openSTValue.address); + + assert.equal(await openSTValue.registerUtilityToken.call(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, gate.address, checkUuid, { from: registrar }), checkUuid); + const result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, gate.address, checkUuid, { from: registrar }); // Stake address is returned by UtilityTokenRegistered but verified below rather than by checkUtilityTokenRegisteredEvent - OpenSTValue_utils.checkUtilityTokenRegisteredEvent(result.logs[0], checkUuid, symbol, name, 18, conversionRate, chainIdRemote, 0); + OpenSTValue_utils.checkUtilityTokenRegisteredEvent(result.logs[0], checkUuid, symbol, name, 18, conversionRate, chainIdRemote, gate.address); var simpleStake = new SimpleStake(result.logs[0].args.stake); assert.equal(await simpleStake.uuid.call(), checkUuid); @@ -84,7 +86,7 @@ module.exports.deployGate = async (artifacts, accounts) => { assert.equal(await openSTValue.getUuidsSize.call(), 1); assert.equal((await openSTValue.utilityTokens.call(checkUuid))[0], symbol); - const gate = await Gate.new(workers.address, bounty, checkUuid, openSTValue.address); + return { valueToken : valueToken, From 080b8f5026d2f46ef3f637e99da704ea834296ed Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 19 Jun 2018 13:18:16 +0530 Subject: [PATCH 0126/1361] Rebased with develop --- contracts/{proof => }/BytesLib.sol | 0 contracts/OpenSTUtils.sol | 2 +- contracts/OpenSTValue.sol | 6 +++--- contracts/ProofUtil.sol | 4 ++-- contracts/{proof => }/RLPEncode.sol | 0 5 files changed, 6 insertions(+), 6 deletions(-) rename contracts/{proof => }/BytesLib.sol (100%) rename contracts/{proof => }/RLPEncode.sol (100%) diff --git a/contracts/proof/BytesLib.sol b/contracts/BytesLib.sol similarity index 100% rename from contracts/proof/BytesLib.sol rename to contracts/BytesLib.sol diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol index b3f932a0..0c7cbbda 100644 --- a/contracts/OpenSTUtils.sol +++ b/contracts/OpenSTUtils.sol @@ -1,6 +1,6 @@ pragma solidity ^0.4.0; -import "./proof/BytesLib.sol"; +import "./BytesLib.sol"; library OpenSTUtils { diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index b3542dd5..728d3794 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -33,10 +33,10 @@ import "./ProtocolVersioned.sol"; import "./SimpleStake.sol"; // proof libraries -import "./proof/MerklePatriciaProof.sol"; -import "./proof/RLPEncode.sol"; +import "./MerklePatriciaProof.sol"; +import "./RLPEncode.sol"; import "./OpenSTUtils.sol"; -import "./proof/util.sol"; +import "./util.sol"; /// @title OpenSTValue - value staking contract for OpenST contract OpenSTValue is OpsManaged, Hasher, Util { diff --git a/contracts/ProofUtil.sol b/contracts/ProofUtil.sol index b3d3a753..2f062e57 100644 --- a/contracts/ProofUtil.sol +++ b/contracts/ProofUtil.sol @@ -1,7 +1,7 @@ pragma solidity ^0.4.23; -import "./proof/BytesLib.sol"; -import "./proof/util.sol"; +import "./BytesLib.sol"; +import "./util.sol"; contract ProofUtil is Util { diff --git a/contracts/proof/RLPEncode.sol b/contracts/RLPEncode.sol similarity index 100% rename from contracts/proof/RLPEncode.sol rename to contracts/RLPEncode.sol From 4a90655f1995e152ee18f7056e9ea36ccd7db7a7 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 19 Jun 2018 16:51:56 +0530 Subject: [PATCH 0127/1361] contract: added comments for Gate.sol. MOSA-99 --- contracts/Gate.sol | 106 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 90 insertions(+), 16 deletions(-) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index 9f44b013..e6d2da62 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -33,9 +33,17 @@ contract Gate is ProtocolVersioned, Owned { /* * Events */ + + /** event triggered after successful execution of requestStake */ event StakeRequested(address _staker, uint256 _amount, address _beneficiary); + + /** event triggered after successful execution of revertStakeRequest */ event StakeRequestReverted(address _staker, uint256 _amount); + + /** event triggered after successful execution of rejectStakeRequest */ event StakeRequestRejected(address _staker, uint256 _amount, uint8 _reason); + + /** event triggered after successful execution of acceptStakeRequest */ event StakeRequestAccepted( address _staker, uint256 _amountST, @@ -45,15 +53,16 @@ contract Gate is ProtocolVersioned, Owned { bytes32 _stakingIntentHash); - - - // stake requests + /** Storing stake requests */ mapping(address /*staker */ => StakeRequest) public stakeRequests; + + /** Storing workers contract address */ WorkersInterface public workers; - // bounty amount + + /** Storing bounty amount that will be used while accepting stake */ uint256 public bounty; - // utility token UUID + /** Storing utility token UUID */ bytes32 public uuid; /* @@ -65,9 +74,20 @@ contract Gate is ProtocolVersioned, Owned { address beneficiary; bytes32 hashLock; } - /* - * Public functions + + /* + * Public functions + */ + + /** + * @dev Contract constructor. + * + * @param _workers worker contract address. + * @param _bounty bounty amount that worker address stakes while accepting stake request. + * @param _uuid UUID of utility token. + * @param _openSTProtocol OpenSTProtocol contract that governs staking. */ + constructor( WorkersInterface _workers, uint256 _bounty, @@ -86,6 +106,17 @@ contract Gate is ProtocolVersioned, Owned { } + /** + * @dev Request stake. + * In order to request stake the staker needs to approve gate contract for stake amount. + * This can be called by staker + * Staked amount is transferred from staker address to Gate contract + * + * @param _amount staking amount. + * @param _beneficiary beneficiary address. + * + * @return success, boolean that specifies status of the execution. + */ function requestStake( uint256 _amount, address _beneficiary) @@ -113,8 +144,13 @@ contract Gate is ProtocolVersioned, Owned { return true; } - - /// @dev In order to revert stake request the msg.sender should be the staker + /** + * @dev Revert stake request. + * This can be called only by staker + * Staked amount is transferred back to staker address from Gate contract + * + * @return stakeRequestAmount staking amount. + */ function revertStakeRequest() external returns (uint256 stakeRequestAmount) @@ -138,6 +174,16 @@ contract Gate is ProtocolVersioned, Owned { return stakeRequestAmount; } + /** + * @dev Reject stake request. + * This can be called only by whitelisted worker address + * Staked amount is transferred back to staker address from Gate contract + * + * @param _staker staker address. + * @param _reason reason for rejection. + * + * @return stakeRequestAmount staking amount. + */ function rejectStakeRequest(address _staker, uint8 _reason) external returns (uint256 stakeRequestAmount) @@ -165,8 +211,21 @@ contract Gate is ProtocolVersioned, Owned { return stakeRequestAmount; } - /// @dev In order to accept stake the staker needs to approve gate contract for bounty amount. - /// This can be called only by whitelisted worker address + /** + * @dev Accept stake request. + * In order to accept stake the staker needs to approve gate contract for bounty amount. + * This can be called only by whitelisted worker address + * OpenSTProtocol is approved for staking amount by Gate contract. + * Bounty amount is transferred from msg.sender to Gate contract + * + * @param _staker staker address. + * @param _hashLock hash lock. + * + * @return amountUT branded token amount. + * @return nonce staker nonce count. + * @return unlockHeight height till what the amount is locked. + * @return stakingIntentHash staking intent hash. + */ function acceptStakeRequest(address _staker, bytes32 _hashLock) external returns ( @@ -214,16 +273,22 @@ contract Gate is ProtocolVersioned, Owned { return (amountUT, nonce, unlockHeight, stakingIntentHash); } - + /** + * @dev Process staking. + * Bounty amount is to msg.sender if its not whitelisted worker + * Bounty amount is to workers contract if msg.sender is whitelisted worker + * + * @param _stakingIntentHash staking intent hash. + * @param _unlockSecret unlock secret. + * + * @return stakeRequestAmount stake amount. + */ function processStaking( bytes32 _stakingIntentHash, bytes32 _unlockSecret) external returns (uint256 stakeRequestAmount) { - // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender)); - require(_stakingIntentHash != bytes32(0)); //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; @@ -261,7 +326,16 @@ contract Gate is ProtocolVersioned, Owned { return stakeRequestAmount; } - + /** + * @dev Revert staking. + * Caller must be the whitelisted worker. + * Staked amount is transferred the staker address. + * Bounty amount is to workers contract. + * + * @param _stakingIntentHash staking intent hash. + * + * @return stakeRequestAmount staking amount. + */ function revertStaking( bytes32 _stakingIntentHash) external From 1471f91217c106386c50cf4c67d98293916213b8 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 19 Jun 2018 17:31:57 +0530 Subject: [PATCH 0128/1361] undoing the code change at line // check if the caller is whitelisted worker --- contracts/Gate.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/Gate.sol b/contracts/Gate.sol index e6d2da62..05cc33b4 100644 --- a/contracts/Gate.sol +++ b/contracts/Gate.sol @@ -289,6 +289,9 @@ contract Gate is ProtocolVersioned, Owned { external returns (uint256 stakeRequestAmount) { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + require(_stakingIntentHash != bytes32(0)); //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; From 42b4c8f45128afbd28707d1284b1f2496bfa9562 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Wed, 20 Jun 2018 17:56:51 +0530 Subject: [PATCH 0129/1361] Logic related changes are done except few questions. Needs to test with Sarvesh Code. --- .gitignore | 3 --- contracts/Core.sol | 53 ++++++++++++++++++++++++---------------------- test/Core_utils.js | 26 +++++++++++------------ 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index c7789d1e..ed10e4de 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,3 @@ node_modules *.synctex.gz(busy) *.pdfsync -# don't commit package-lock.json file -package-lock.json - diff --git a/contracts/Core.sol b/contracts/Core.sol index a526efcb..ec195556 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -47,25 +47,33 @@ contract Core is CoreInterface, Util { /** Mapping of block height to storafe root of the block. */ mapping (uint256 /* block height */ => bytes32) public storageRoots; - /// chainIdOrigin stores the chainId this chain + /** chainIdOrigin stores the chainId this chain */ uint256 public coreChainIdOrigin; - /// chainIdRemote stores the chainId of the remote chain + /** chainIdRemote stores the chainId of the remote chain */ uint256 private coreChainIdRemote; - /// OpenST remote is the address of the OpenST contract - /// on the remote chain + /** OpenST remote is the address of the OpenST contract */ + /** on the remote chain */ address private coreOpenSTRemote; - /// registrar registers for the two chains + /** registrar registers for the two chains */ address private coreRegistrar; - /// Latest block height of block which state root was committed. - uint256 public latestStateRootBlockHeight; - /// Latest block height of block which storage root was committed. - uint256 public latestStorageRootBlockHeight; - /// Workers contract address + /** Latest block height of block which state root was committed. */ + uint256 public latestStateRootBlockHeight; + /** Workers contract address */ WorkersInterface public workers; - /// OpenSTRemote encode address. sha3 => bytes32 to bytes - /// Kept in end because it's dynamic in size - bytes public encodedOpenSTRemoteAddress; + /** OpenSTRemote encode address. sha3 => bytes32 to bytes */ + /** Kept in end because it's dynamic in size */ + bytes public encodedOpenSTRemotePath; + /* + * Modifiers + */ + + /** only worker modifier */ + modifier onlyWorker() { + // msg.sender should be worker only + require(workers.isWorker(msg.sender), "Invalid worker address"); + _; + } /* * Public functions @@ -88,8 +96,8 @@ contract Core is CoreInterface, Util { coreChainIdRemote = _chainIdRemote; coreOpenSTRemote = _openSTRemote; workers = _workers; - // Encoded remote address. - encodedOpenSTRemoteAddress = bytes32ToBytes(keccak256(coreOpenSTRemote)); + // Encoded remote path. + encodedOpenSTRemotePath = bytes32ToBytes(keccak256(coreOpenSTRemote)); } /// @dev public function registrar @@ -134,10 +142,9 @@ contract Core is CoreInterface, Util { uint256 _blockHeight, bytes32 _stateRoot) external + onlyWorker returns(bytes32 stateRoot) { - // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender), "Invalid worker address"); // State root should be valid require(_stateRoot != bytes32(0), "Invalid state root"); // Input block height should be valid @@ -161,14 +168,12 @@ contract Core is CoreInterface, Util { bytes _rlpEncodedAccount, bytes _rlpParentNodes) external - returns(bool status) + returns(bool /* success */) { - // check if the caller is whitelisted worker - require(workers.isWorker(msg.sender), "Invalid worker address"); // Check for block height require(_blockHeight != 0, "Invalid block height"); // Storage root should be valid - require(_rlpEncodedAccount.length != 0, "Invalid rlp encoded account value"); + require(_rlpEncodedAccount.length != 0, "Check length of RLP encoded account is not zero"); bytes32 stateRoot = stateRoots[_blockHeight]; // State root should be present for the block height @@ -183,13 +188,11 @@ contract Core is CoreInterface, Util { // Hash the rlpEncodedValue value bytes32 hashedAccount = keccak256(_rlpEncodedAccount); - // Verify proof using library contract - require(MerklePatriciaProof.verify(hashedAccount, encodedOpenSTRemoteAddress, _rlpParentNodes, stateRoot), "Account proof not verified."); + // Verify the remote OpenST contract against the committed state root with the state trie Merkle proof + require(MerklePatriciaProof.verify(hashedAccount, encodedOpenSTRemotePath, _rlpParentNodes, stateRoot), "Account proof not verified."); // After verification update storageRoots mapping storageRoots[_blockHeight] = storageRoot; - // Update latestStorageRootBlockHeight variable - latestStorageRootBlockHeight = _blockHeight; // Emit event emit OpenSTProven(_blockHeight, storageRoot, hashedAccount); diff --git a/test/Core_utils.js b/test/Core_utils.js index 983d5886..33c0a4d1 100644 --- a/test/Core_utils.js +++ b/test/Core_utils.js @@ -20,8 +20,8 @@ // ---------------------------------------------------------------------------- const Core = artifacts.require("./Core.sol") - , SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") - , Workers = artifacts.require("./Workers.sol") + , SimpleToken = artifacts.require("./SimpleToken/SimpleToken.sol") + , Workers = artifacts.require("./Workers.sol") ; const BigNumber = require('bignumber.js') @@ -31,24 +31,24 @@ const BigNumber = require('bignumber.js') /// @dev Deploy module.exports.deployCore = async (artifacts, accounts) => { const registrar = accounts[1] + , admin = accounts[2] + , ops = accounts[3] + , openSTRemote = accounts[4] , chainIdOrigin = 3 , chainIdRemote = 1410 - , openSTRemote = accounts[4] , valueToken = await SimpleToken.new() - , admin = accounts[2] - , ops = accounts[3] , deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")) ; - //Set SimpleToken admin in order to finalize SimpleToken - await valueToken.setAdminAddress(admin); + //Set SimpleToken admin in order to finalize SimpleToken + await valueToken.setAdminAddress(admin); - // Deploy worker contract - const workers = await Workers.new(valueToken.address) - , worker1 = accounts[7]; - await workers.setAdminAddress(admin); - await workers.setOpsAddress(ops); - await workers.setWorker(worker1, deactivationHeight, {from:ops}); + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); const core = await Core.new(registrar, chainIdOrigin, chainIdRemote, openSTRemote, workers.address, {from:accounts[0]}); return { core : core From 2e3ad94980d03e2df55b7e644c1b80cccda19d8e Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Wed, 20 Jun 2018 20:17:02 +0530 Subject: [PATCH 0130/1361] [MOSA-62] Updated commenting style --- contracts/Core.sol | 102 ++++++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 33 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index ec195556..b30373d5 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -28,45 +28,59 @@ import "./WorkersInterface.sol"; import "./RLP.sol"; -/// @dev Core is a minimal stub that will become the anchoring and consensus point for -/// the utility chain to validate itself against +/** +* @dev Core is a minimal stub that will become the anchoring and consensus point for +* the utility chain to validate itself against +*/ contract Core is CoreInterface, Util { - /* - * Events - */ + /** + * Events + */ + + /** event StateRootCommitted on successful execution of commitStateRoot */ event StateRootCommitted(uint256 blockHeight, bytes32 stateRoot); + /** event OpenSTProven on successful execution of proveOpenST */ event OpenSTProven(uint256 blockHeight, bytes32 storageRoot, bytes32 hashedAccount); - /* + /** * Storage */ + /** Mapping of block height to state root of the block. */ mapping (uint256 /* block height */ => bytes32) public stateRoots; + /** Mapping of block height to storafe root of the block. */ mapping (uint256 /* block height */ => bytes32) public storageRoots; /** chainIdOrigin stores the chainId this chain */ uint256 public coreChainIdOrigin; + /** chainIdRemote stores the chainId of the remote chain */ uint256 private coreChainIdRemote; - /** OpenST remote is the address of the OpenST contract */ - /** on the remote chain */ + + /** OpenST remote is the address of the OpenST contract on the remote chain */ address private coreOpenSTRemote; + /** registrar registers for the two chains */ address private coreRegistrar; + /** Latest block height of block which state root was committed. */ uint256 public latestStateRootBlockHeight; + /** Workers contract address */ WorkersInterface public workers; - /** OpenSTRemote encode address. sha3 => bytes32 to bytes */ - /** Kept in end because it's dynamic in size */ + + /** + * OpenSTRemote encode address. sha3 => bytes32 to bytes + * Kept in end because it's dynamic in size + */ bytes public encodedOpenSTRemotePath; - /* - * Modifiers - */ + /** + * Modifiers + */ /** only worker modifier */ modifier onlyWorker() { @@ -75,9 +89,18 @@ contract Core is CoreInterface, Util { _; } - /* + /** * Public functions */ + + /** + * @dev Contract constructor + * + * @param _registrar registrar address + * @param _chainIdOrigin origin chain id + * @param _chainIdRemote remote chain id + * @param _openSTRemote remote openSTUtility/openSTValue contract address + */ constructor( address _registrar, uint256 _chainIdOrigin, @@ -100,8 +123,11 @@ contract Core is CoreInterface, Util { encodedOpenSTRemotePath = bytes32ToBytes(keccak256(coreOpenSTRemote)); } - /// @dev public function registrar - /// @return address coreRegistrar + /** + * @dev public function registrar + * + * @return address coreRegistrar + */ function registrar() public view @@ -110,8 +136,11 @@ contract Core is CoreInterface, Util { return coreRegistrar; } - /// @dev public function chainIdRemote - /// @return uint256 coreChainIdRemote + /** + * @dev public function chainIdRemote + * + * @return uint256 coreChainIdRemote + */ function chainIdRemote() public view @@ -120,8 +149,11 @@ contract Core is CoreInterface, Util { return coreChainIdRemote; } - /// @dev public function openSTRemote - /// @return address coreOpenSTRemote + /** + * @dev public function openSTRemote + * + * @return address coreOpenSTRemote + */ function openSTRemote() public view @@ -131,19 +163,19 @@ contract Core is CoreInterface, Util { } /** - * Commit new state root for a block height - * - */ - /// @dev Commit new state root for a block height - /// @param _blockHeight block height for which stateRoots mapping needs to update - /// @param _stateRoot state root of input block height - /// @return bytes32 stateRoot + * @dev Commit new state root for a block height + * + * @param _blockHeight block height for which stateRoots mapping needs to update + * @param _stateRoot state root of input block height + * + * @return bytes32 stateRoot + */ function commitStateRoot( uint256 _blockHeight, bytes32 _stateRoot) external onlyWorker - returns(bytes32 stateRoot) + returns(bytes32 /* stateRoot */) { // State root should be valid require(_stateRoot != bytes32(0), "Invalid state root"); @@ -158,11 +190,15 @@ contract Core is CoreInterface, Util { return stateRoot; } - /// @dev Verify account proof of OpenSTRemote and commit storage root at given block height - /// @param _blockHeight block height at which OpenST is to be proven - /// @param _rlpEncodedAccount rlpencoded account node object - /// @param _rlpParentNodes RLP encoded value of account proof parent nodes - /// @return bool status + /** + * @dev Verify account proof of OpenSTRemote and commit storage root at given block height + * + * @param _blockHeight block height at which OpenST is to be proven + * @param _rlpEncodedAccount rlpencoded account node object + * @param _rlpParentNodes RLP encoded value of account proof parent nodes + * + * @return bool status + */ function proveOpenST( uint256 _blockHeight, bytes _rlpEncodedAccount, From b6966a6e8189bf182c67193ff70cc841ed079263 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Wed, 20 Jun 2018 20:26:58 +0530 Subject: [PATCH 0131/1361] [MOSA-62] Tested with pull request: https://github.com/OpenSTFoundation/openst-protocol/pull/157 Updated indentation It needs to be added in guidelines --- test/Protocol_utils.js | 2 +- test/Registrar_utils.js | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/Protocol_utils.js b/test/Protocol_utils.js index 5f5f1a67..adecc535 100644 --- a/test/Protocol_utils.js +++ b/test/Protocol_utils.js @@ -44,7 +44,7 @@ module.exports.deployOpenSTProtocol = async (artifacts, accounts) => { const ops = accounts[3]; const intercommVC = accounts[4]; const intercommUC = accounts[5]; - const workerDeactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); + const workerDeactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); var res = null; diff --git a/test/Registrar_utils.js b/test/Registrar_utils.js index 27238408..c9504e79 100644 --- a/test/Registrar_utils.js +++ b/test/Registrar_utils.js @@ -36,9 +36,9 @@ module.exports.deployRegistrar = async (artifacts, accounts) => { const registrar = await Registrar.new(); const staker = accounts[2]; const amountST = new BigNumber(web3.toWei(2, "ether")); - const deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); - const admin = accounts[3]; - const ops = accounts[2]; + const deactivationHeight = new BigNumber(web3.toWei(100000000, "ether")); + const admin = accounts[3]; + const ops = accounts[2]; // Registrar is OpsManaged await registrar.setOpsAddress(accounts[1]); @@ -50,12 +50,12 @@ module.exports.deployRegistrar = async (artifacts, accounts) => { await valueToken.finalize({ from: accounts[3] }); await valueToken.transfer(staker, amountST); - // Deploy worker contract - const workers = await Workers.new(valueToken.address) - , worker1 = accounts[7]; - await workers.setAdminAddress(admin); - await workers.setOpsAddress(ops); - await workers.setWorker(worker1, deactivationHeight, {from:ops}); + // Deploy worker contract + const workers = await Workers.new(valueToken.address) + , worker1 = accounts[7]; + await workers.setAdminAddress(admin); + await workers.setOpsAddress(ops); + await workers.setWorker(worker1, deactivationHeight, {from:ops}); const openSTUtility = await OpenSTUtility.new(chainIdValue, chainIdUtility, registrar.address, { gas: 10000000 }); const openSTValue = await OpenSTValue.new(chainIdValue, valueToken.address, registrar.address); From 88d0c5df7af13a8261d14e0a98cb29efadd69dc7 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Wed, 20 Jun 2018 21:00:15 +0530 Subject: [PATCH 0132/1361] [MOSA-62] Testing bug fix --- contracts/Core.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index b30373d5..7e35b8f3 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -187,7 +187,7 @@ contract Core is CoreInterface, Util { emit StateRootCommitted(_blockHeight, _stateRoot); - return stateRoot; + return _stateRoot; } /** From 8c53345d433132abdf8325eaad8c6317f77d0439 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Thu, 21 Jun 2018 10:03:12 +0200 Subject: [PATCH 0133/1361] contracts: fixes comments and styling --- contracts/OpenSTValue.sol | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 90b80b4f..2757fadb 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -73,9 +73,9 @@ contract OpenSTValue is OpsManaged, Hasher { // ~1hour, assuming ~15s per block uint256 private constant BLOCKS_TO_WAIT_SHORT = 240; - /** capture intents */ + // storage for staking intent hash of active staking intents mapping(bytes32 /* intentHash */ => bytes32) public intents; - /// register the active stakes and unstakes + // register the active stakes and unstakes mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; mapping(uint256 /* chainIdUtility */ => CoreInterface) internal cores; mapping(bytes32 /* uuid */ => UtilityToken) public utilityTokens; @@ -95,7 +95,7 @@ contract OpenSTValue is OpsManaged, Hasher { address public registrar; bytes32[] public uuids; - /* + /* * Structures */ struct UtilityToken { @@ -223,7 +223,9 @@ contract OpenSTValue is OpsManaged, Hasher { unlockHeight: unlockHeight, hashLock: _hashLock }); - /** Add intent hash to intents mapping */ + + // store the staking intent hash directly in storage of OpenSTValue + // so that a Merkle proof can be generated for active staking intents intents[hashIntentKey(_staker, nonce)] = stakingIntentHash; emit StakingIntentDeclared(_uuid, _staker, nonce, _beneficiary, @@ -259,12 +261,11 @@ contract OpenSTValue is OpsManaged, Hasher { emit ProcessedStake(stake.uuid, _stakingIntentHash, stakeAddress, stake.staker, stake.amountST, stake.amountUT, _unlockSecret); - /** Remove intent hash from intents mapping */ + + // remove intent hash from intents mapping delete intents[hashIntentKey(stake.staker, stake.nonce)]; - delete stakes[_stakingIntentHash]; - return stakeAddress; } @@ -294,7 +295,8 @@ contract OpenSTValue is OpsManaged, Hasher { emit RevertedStake(stake.uuid, _stakingIntentHash, stake.staker, stake.amountST, stake.amountUT); - /** Remove intent hash from intents mapping */ + + // remove intent hash from intents mapping delete intents[hashIntentKey(stake.staker, stake.nonce)]; delete stakes[_stakingIntentHash]; From 97dd83677760fef8d9befbfe3bf9e59420fb0bae Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Thu, 21 Jun 2018 19:01:35 +0530 Subject: [PATCH 0134/1361] [MOSA-62] Emit event OpenSTProven on multiple calls of proveOpenST Implement Public functions from the interface as everyone imports interface --- contracts/Core.sol | 70 +++++++++++++++++++++++++++++++++---- contracts/CoreInterface.sol | 22 +++++++++++- 2 files changed, 84 insertions(+), 8 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index 7e35b8f3..1d6d8a48 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -49,10 +49,10 @@ contract Core is CoreInterface, Util { */ /** Mapping of block height to state root of the block. */ - mapping (uint256 /* block height */ => bytes32) public stateRoots; + mapping (uint256 /* block height */ => bytes32) private stateRoots; /** Mapping of block height to storafe root of the block. */ - mapping (uint256 /* block height */ => bytes32) public storageRoots; + mapping (uint256 /* block height */ => bytes32) private storageRoots; /** chainIdOrigin stores the chainId this chain */ uint256 public coreChainIdOrigin; @@ -67,7 +67,7 @@ contract Core is CoreInterface, Util { address private coreRegistrar; /** Latest block height of block which state root was committed. */ - uint256 public latestStateRootBlockHeight; + uint256 private latestStateRootBlockHeight; /** Workers contract address */ WorkersInterface public workers; @@ -76,7 +76,7 @@ contract Core is CoreInterface, Util { * OpenSTRemote encode address. sha3 => bytes32 to bytes * Kept in end because it's dynamic in size */ - bytes public encodedOpenSTRemotePath; + bytes private encodedOpenSTRemotePath; /** * Modifiers @@ -124,7 +124,7 @@ contract Core is CoreInterface, Util { } /** - * @dev public function registrar + * @dev public view function registrar * * @return address coreRegistrar */ @@ -137,7 +137,7 @@ contract Core is CoreInterface, Util { } /** - * @dev public function chainIdRemote + * @dev public view function chainIdRemote * * @return uint256 coreChainIdRemote */ @@ -150,7 +150,7 @@ contract Core is CoreInterface, Util { } /** - * @dev public function openSTRemote + * @dev public view function openSTRemote * * @return address coreOpenSTRemote */ @@ -224,6 +224,17 @@ contract Core is CoreInterface, Util { // Hash the rlpEncodedValue value bytes32 hashedAccount = keccak256(_rlpEncodedAccount); + // If account already proven for block height + bytes32 provenStorageRoot = storageRoots[_blockHeight]; + if (provenStorageRoot != bytes32(0)) { + // Check extracted storage root is matching with existing stored storage root + require(provenStorageRoot == storageRoot, "Storage root mismatch when account is already proven"); + // Emit OpenSTProven event + emit OpenSTProven(_blockHeight, storageRoot, hashedAccount); + // return true + return true; + } + // Verify the remote OpenST contract against the committed state root with the state trie Merkle proof require(MerklePatriciaProof.verify(hashedAccount, encodedOpenSTRemotePath, _rlpParentNodes, stateRoot), "Account proof not verified."); @@ -235,4 +246,49 @@ contract Core is CoreInterface, Util { return true; } + /** + * @dev public view function getStateRoot + * + * @param _blockHeight block height for which state root is needed + * + * @return bytes32 state root + */ + function getStateRoot( + uint256 _blockHeight) + public + view + returns (bytes32 /* state root */) + { + return stateRoots[_blockHeight]; + } + + /** + * @dev public view function getStorageRoot + * + * @param _blockHeight block height for which storage root is needed + * + * @return bytes32 storage root + */ + function getStorageRoot( + uint256 _blockHeight) + public + view + returns (bytes32 /* storage root */) + { + return storageRoots[_blockHeight]; + } + + /** + * @dev public function getLatestStateRootBlockHeight + * + * @return uint256 latest state root block height + */ + function getLatestStateRootBlockHeight() + public + view + returns (uint256 /* block height */) + { + return latestStateRootBlockHeight; + } + } \ No newline at end of file diff --git a/contracts/CoreInterface.sol b/contracts/CoreInterface.sol index 3b9e933a..c31f61ad 100644 --- a/contracts/CoreInterface.sol +++ b/contracts/CoreInterface.sol @@ -22,9 +22,29 @@ pragma solidity ^0.4.23; // ---------------------------------------------------------------------------- contract CoreInterface { - + + /** registrar public function */ function registrar() public view returns (address /* registrar */); + /** chainID remote public function */ function chainIdRemote() public view returns (uint256 /* chainIdRemote */); + + /** openST remote public function */ function openSTRemote() public view returns (address /* OpenSTRemote */); + + /** commitStateRoot external function */ + function commitStateRoot(uint256 _blockHeight, bytes32 _stateRoot) external returns (bytes32 /* stateRoot */); + + /** proveOpenST external function */ + function proveOpenST(uint256 _blockHeight, bytes _rlpEncodedAccount, bytes _rlpParentNodes) external returns (bool /* success */); + + /** get latest state root block height public function */ + function getLatestStateRootBlockHeight() public view returns (uint256 /* latest state root block height */); + + /** get state root public function */ + function getStateRoot(uint256 _blockHeight) public view returns (bytes32 /* state root */); + + /** get storage root public function */ + function getStorageRoot(uint256 _blockHeight) public view returns (bytes32 /* storage root */); + } \ No newline at end of file From 711e6cbac042666f8514a589a465edfd747c84c9 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 21 Jun 2018 19:24:08 +0530 Subject: [PATCH 0135/1361] contract: added intent variables and few changes. MOSA-68 --- contracts/Core.sol | 7 +++++++ contracts/CoreInterface.sol | 1 + contracts/Hasher.sol | 12 ++++++++++++ contracts/OpenSTUtility.sol | 13 +++++++++++++ contracts/OpenSTUtils.sol | 2 +- contracts/OpenSTValue.sol | 10 ++++++---- 6 files changed, 40 insertions(+), 5 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index 7e35b8f3..7c884272 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -235,4 +235,11 @@ contract Core is CoreInterface, Util { return true; } + function getStorageRoots( + uint256 _blockHeight) + public + view + returns (bytes32){ + return storageRoots[_blockHeight]; + } } \ No newline at end of file diff --git a/contracts/CoreInterface.sol b/contracts/CoreInterface.sol index 3b9e933a..593f6efc 100644 --- a/contracts/CoreInterface.sol +++ b/contracts/CoreInterface.sol @@ -27,4 +27,5 @@ contract CoreInterface { function chainIdRemote() public view returns (uint256 /* chainIdRemote */); function openSTRemote() public view returns (address /* OpenSTRemote */); + function getStorageRoots(uint256 _blockHeight) public view returns (bytes32); } \ No newline at end of file diff --git a/contracts/Hasher.sol b/contracts/Hasher.sol index e829bc10..c826d372 100644 --- a/contracts/Hasher.sol +++ b/contracts/Hasher.sol @@ -93,4 +93,16 @@ contract Hasher { _unlockHeight, _hashLock); } + + function hashIntentKey( + address _account, + uint256 _nonce) + public + pure + returns (bytes32) + { + return keccak256( + _account, + _nonce); + } } \ No newline at end of file diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 74c37b41..829e91bb 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -80,6 +80,9 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { * Storage */ + // storage for staking intent hash of active staking intents + mapping(bytes32 /* intentHash */ => bytes32) public intents; + /// store the ongoing mints and redemptions mapping(bytes32 /* stakingIntentHash */ => Mint) public mints; mapping(bytes32 /* redemptionIntentHash */ => Redemption) public redemptions; @@ -127,6 +130,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { struct Redemption { bytes32 uuid; address redeemer; + uint256 nonce; address beneficiary; uint256 amountUT; uint256 unlockHeight; @@ -355,12 +359,17 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { redemptions[redemptionIntentHash] = Redemption({ uuid: _uuid, redeemer: msg.sender, + nonce: _nonce, beneficiary: _beneficiary, amountUT: _amountBT, unlockHeight: unlockHeight, hashLock: _hashLock }); + // store the Redemption intent hash directly in storage of OpenSTUtility + // so that a Merkle proof can be generated for active redemption intents + intents[hashIntentKey(msg.sender, _nonce)] = redemptionIntentHash; + emit RedemptionIntentDeclared(_uuid, redemptionIntentHash, address(token), msg.sender, _nonce, _beneficiary, _amountBT, unlockHeight, chainIdValue); @@ -406,6 +415,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { redemptions[redemptionIntentHash] = Redemption({ uuid: uuidSTPrime, redeemer: msg.sender, + nonce: _nonce, beneficiary: _beneficiary, amountUT: amountSTP, unlockHeight: unlockHeight, @@ -450,6 +460,9 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { delete redemptions[_redemptionIntentHash]; + // remove intent hash from intents mapping + delete intents[hashIntentKey(redemption.redeemer, redemption.nonce)]; + return tokenAddress; } diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol index 0c7cbbda..82c11804 100644 --- a/contracts/OpenSTUtils.sol +++ b/contracts/OpenSTUtils.sol @@ -13,7 +13,7 @@ library OpenSTUtils { } function storagePath( - uint256 _index, + uint8 _index, bytes32 _key) internal pure diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 723ae8df..49e5192e 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -79,7 +79,7 @@ contract OpenSTValue is OpsManaged, Hasher, Util { uint256 private constant BLOCKS_TO_WAIT_LONG = 80667; // ~1hour, assuming ~15s per block uint256 private constant BLOCKS_TO_WAIT_SHORT = 240; - + uint8 private constant INTENT_INDEX = 3; /// register the active stakes and unstakes mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; @@ -346,13 +346,14 @@ contract OpenSTValue is OpsManaged, Hasher, Util { require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); - storageRoot = cores[utilityTokens[_uuid].chainIdUtility].storageRoot(_blockHeight); + CoreInterface core = cores[utilityTokens[_uuid].chainIdUtility]; + storageRoot = core.getStorageRoots(_blockHeight); //TODO: Update the code to get the Index. - bytes32 keyPath = OpenSTUtils.storagePath("3", keccak256(_redeemer, _redeemerNonce)); + bytes32 keyPath = OpenSTUtils.storagePath(INTENT_INDEX, keccak256(_redeemer, _redeemerNonce)); bytes memory path = bytes32ToBytes(keccak256(keyPath)); require(MerklePatriciaProof.verify( - keccak256(RLPEncode.encodeItem(redemptionIntentHash)), + keccak256(RLPEncode.encodeItem(bytes32ToBytes(redemptionIntentHash))), path, _rlpParentNodes, storageRoot), "Failed to verify storage path"); @@ -373,6 +374,7 @@ contract OpenSTValue is OpsManaged, Hasher, Util { return (amountST, expirationHeight, storageRoot); } + function function processUnstaking( bytes32 _redemptionIntentHash, bytes32 _unlockSecret) From b2d2b3998894930dc4a6ff4173e530f628a0676d Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Fri, 22 Jun 2018 12:02:07 +0530 Subject: [PATCH 0136/1361] Added ethereumjs-util for hashing --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 7a5db47d..49506bc3 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "assert": "^1.4.1", "bignumber": "^1.1.0", "bignumber.js": "^4.1.0", + "ethereumjs-util": "^5.2.0", "keccak": "^1.4.0", "moment": "^2.19.2", "solparse": "^2.2.5", From d46ffc0c1cc43f1dc6b7a222edeb67407f2e3ab0 Mon Sep 17 00:00:00 2001 From: abhay-pepo Date: Fri, 22 Jun 2018 15:26:49 +0530 Subject: [PATCH 0137/1361] [MOSA-62] Emit event ProofVerificationSkipped on multiple calls of proveOpenST Comments alignment as per Ethereum-Natural-Specification-Format --- contracts/Core.sol | 178 ++++++++++++++++++------------------ contracts/CoreInterface.sol | 16 ++-- 2 files changed, 96 insertions(+), 98 deletions(-) diff --git a/contracts/Core.sol b/contracts/Core.sol index 1d6d8a48..a59db846 100644 --- a/contracts/Core.sol +++ b/contracts/Core.sol @@ -27,80 +27,73 @@ import "./util.sol"; import "./WorkersInterface.sol"; import "./RLP.sol"; - /** -* @dev Core is a minimal stub that will become the anchoring and consensus point for -* the utility chain to validate itself against -*/ + * @title Core contract which implements CoreInterface + * + * @notice Core is a minimal stub that will become the anchoring and consensus point for + * the utility chain to validate itself against + */ contract Core is CoreInterface, Util { - /** - * Events - */ + /* Events */ - /** event StateRootCommitted on successful execution of commitStateRoot */ event StateRootCommitted(uint256 blockHeight, bytes32 stateRoot); - /** event OpenSTProven on successful execution of proveOpenST */ event OpenSTProven(uint256 blockHeight, bytes32 storageRoot, bytes32 hashedAccount); - /** - * Storage - */ + /** Below event emitted to differentiate replay call of proveOpenST function for same block height */ + event ProofVerificationSkipped(uint256 blockHeight, bytes32 storageRoot); + + /* Storage */ - /** Mapping of block height to state root of the block. */ mapping (uint256 /* block height */ => bytes32) private stateRoots; - /** Mapping of block height to storafe root of the block. */ mapping (uint256 /* block height */ => bytes32) private storageRoots; - /** chainIdOrigin stores the chainId this chain */ + /** chainIdOrigin is the origin chain id where core contract is deployed */ uint256 public coreChainIdOrigin; - /** chainIdRemote stores the chainId of the remote chain */ + /** chainIdRemote is the remote chain id where core contract is deployed */ uint256 private coreChainIdRemote; - /** OpenST remote is the address of the OpenST contract on the remote chain */ + /** It is the address of the openSTUtility/openSTValue contract on the remote chain */ address private coreOpenSTRemote; - /** registrar registers for the two chains */ address private coreRegistrar; - /** Latest block height of block which state root was committed. */ + /** Latest block height of block for which state root was committed. */ uint256 private latestStateRootBlockHeight; /** Workers contract address */ WorkersInterface public workers; /** - * OpenSTRemote encode address. sha3 => bytes32 to bytes - * Kept in end because it's dynamic in size - */ + * OpenSTRemote encoded path. Constructed with below flow: + * coreOpenSTRemote => sha3 => bytes32 => bytes + */ bytes private encodedOpenSTRemotePath; - /** - * Modifiers - */ + /* Modifiers */ /** only worker modifier */ modifier onlyWorker() { // msg.sender should be worker only - require(workers.isWorker(msg.sender), "Invalid worker address"); + require(workers.isWorker(msg.sender), "Worker address is not whitelisted"); _; } - /** - * Public functions - */ + /* Public functions */ /** - * @dev Contract constructor - * - * @param _registrar registrar address - * @param _chainIdOrigin origin chain id - * @param _chainIdRemote remote chain id - * @param _openSTRemote remote openSTUtility/openSTValue contract address - */ + * @notice Contract constructor + * + * @dev bytes32ToBytes is util contract method + * + * @param _registrar registrar address + * @param _chainIdOrigin origin chain id + * @param _chainIdRemote remote chain id + * @param _openSTRemote remote openSTUtility/openSTValue contract address + */ constructor( address _registrar, uint256 _chainIdOrigin, @@ -109,11 +102,11 @@ contract Core is CoreInterface, Util { WorkersInterface _workers) public { - require(_registrar != address(0), "Registrar should be valid address"); - require(_chainIdOrigin != 0, "Invalid origin chain ID"); - require(_chainIdRemote != 0, "Invalid remote chain ID"); - require(_openSTRemote != address(0), "Invalid openSTRemote contract address"); - require(_workers != address(0), "Workers should be valid contract address"); + require(_registrar != address(0), "Registrar address is 0"); + require(_chainIdOrigin != 0, "Origin chain Id is 0"); + require(_chainIdRemote != 0, "Remote chain Id is 0"); + require(_openSTRemote != address(0), "OpenSTRemote address is 0"); + require(_workers != address(0), "Workers contract address is 0"); coreRegistrar = _registrar; coreChainIdOrigin = _chainIdOrigin; coreChainIdRemote = _chainIdRemote; @@ -124,10 +117,10 @@ contract Core is CoreInterface, Util { } /** - * @dev public view function registrar - * - * @return address coreRegistrar - */ + * @notice public view function registrar + * + * @return address coreRegistrar + */ function registrar() public view @@ -137,10 +130,10 @@ contract Core is CoreInterface, Util { } /** - * @dev public view function chainIdRemote - * - * @return uint256 coreChainIdRemote - */ + * @notice public view function chainIdRemote + * + * @return uint256 coreChainIdRemote + */ function chainIdRemote() public view @@ -150,10 +143,10 @@ contract Core is CoreInterface, Util { } /** - * @dev public view function openSTRemote - * - * @return address coreOpenSTRemote - */ + * @notice public view function openSTRemote + * + * @return address coreOpenSTRemote + */ function openSTRemote() public view @@ -163,13 +156,15 @@ contract Core is CoreInterface, Util { } /** - * @dev Commit new state root for a block height - * - * @param _blockHeight block height for which stateRoots mapping needs to update - * @param _stateRoot state root of input block height - * - * @return bytes32 stateRoot - */ + * @notice Commit new state root for a block height + * + * @dev commitStateRoot called from game process + * + * @param _blockHeight block height for which stateRoots mapping needs to update + * @param _stateRoot state root of input block height + * + * @return bytes32 stateRoot + */ function commitStateRoot( uint256 _blockHeight, bytes32 _stateRoot) @@ -178,7 +173,7 @@ contract Core is CoreInterface, Util { returns(bytes32 /* stateRoot */) { // State root should be valid - require(_stateRoot != bytes32(0), "Invalid state root"); + require(_stateRoot != bytes32(0), "State root is 0"); // Input block height should be valid require(_blockHeight > latestStateRootBlockHeight, "Given block height is lower or equal to highest committed state root block height."); @@ -191,14 +186,16 @@ contract Core is CoreInterface, Util { } /** - * @dev Verify account proof of OpenSTRemote and commit storage root at given block height - * - * @param _blockHeight block height at which OpenST is to be proven - * @param _rlpEncodedAccount rlpencoded account node object - * @param _rlpParentNodes RLP encoded value of account proof parent nodes - * - * @return bool status - */ + * @notice Verify account proof of OpenSTRemote and commit storage root at given block height + * + * @dev ProofVerificationSkipped event needed to identify replay calls for same block height + * + * @param _blockHeight block height at which OpenST is to be proven + * @param _rlpEncodedAccount rlpencoded account node object + * @param _rlpParentNodes RLP encoded value of account proof parent nodes + * + * @return bool status + */ function proveOpenST( uint256 _blockHeight, bytes _rlpEncodedAccount, @@ -207,13 +204,13 @@ contract Core is CoreInterface, Util { returns(bool /* success */) { // Check for block height - require(_blockHeight != 0, "Invalid block height"); + require(_blockHeight != 0, "Given block height is 0"); // Storage root should be valid - require(_rlpEncodedAccount.length != 0, "Check length of RLP encoded account is not zero"); + require(_rlpEncodedAccount.length != 0, "Length of RLP encoded account is 0"); bytes32 stateRoot = stateRoots[_blockHeight]; // State root should be present for the block height - require(stateRoot != bytes32(0), "State root missing for given block height"); + require(stateRoot != bytes32(0), "State root is 0"); // Decode RLP encoded account value RLP.RLPItem memory accountItem = RLP.toRLPItem(_rlpEncodedAccount); @@ -229,14 +226,15 @@ contract Core is CoreInterface, Util { if (provenStorageRoot != bytes32(0)) { // Check extracted storage root is matching with existing stored storage root require(provenStorageRoot == storageRoot, "Storage root mismatch when account is already proven"); - // Emit OpenSTProven event emit OpenSTProven(_blockHeight, storageRoot, hashedAccount); + // Below event needed to differentiate single call VS multiple call of proveOpenST function for same block height + emit ProofVerificationSkipped(_blockHeight, storageRoot); // return true return true; } // Verify the remote OpenST contract against the committed state root with the state trie Merkle proof - require(MerklePatriciaProof.verify(hashedAccount, encodedOpenSTRemotePath, _rlpParentNodes, stateRoot), "Account proof not verified."); + require(MerklePatriciaProof.verify(hashedAccount, encodedOpenSTRemotePath, _rlpParentNodes, stateRoot), "Account proof is not verified."); // After verification update storageRoots mapping storageRoots[_blockHeight] = storageRoot; @@ -247,12 +245,12 @@ contract Core is CoreInterface, Util { } /** - * @dev public view function getStateRoot - * - * @param _blockHeight block height for which state root is needed - * - * @return bytes32 state root - */ + * @notice public view function getStateRoot + * + * @param _blockHeight block height for which state root is needed + * + * @return bytes32 state root + */ function getStateRoot( uint256 _blockHeight) public @@ -263,12 +261,12 @@ contract Core is CoreInterface, Util { } /** - * @dev public view function getStorageRoot - * - * @param _blockHeight block height for which storage root is needed - * - * @return bytes32 storage root - */ + * @notice public view function getStorageRoot + * + * @param _blockHeight block height for which storage root is needed + * + * @return bytes32 storage root + */ function getStorageRoot( uint256 _blockHeight) public @@ -279,10 +277,10 @@ contract Core is CoreInterface, Util { } /** - * @dev public function getLatestStateRootBlockHeight - * - * @return uint256 latest state root block height - */ + * @notice public function getLatestStateRootBlockHeight + * + * @return uint256 latest state root block height + */ function getLatestStateRootBlockHeight() public view diff --git a/contracts/CoreInterface.sol b/contracts/CoreInterface.sol index c31f61ad..4d34ffef 100644 --- a/contracts/CoreInterface.sol +++ b/contracts/CoreInterface.sol @@ -21,30 +21,30 @@ pragma solidity ^0.4.23; // // ---------------------------------------------------------------------------- +/** + * @title CoreInterface + * + * @notice provide interface for core contract + */ contract CoreInterface { - /** registrar public function */ function registrar() public view returns (address /* registrar */); - /** chainID remote public function */ function chainIdRemote() public view returns (uint256 /* chainIdRemote */); - /** openST remote public function */ function openSTRemote() public view returns (address /* OpenSTRemote */); - /** commitStateRoot external function */ + /** commitStateRoot external function to be called by game process */ function commitStateRoot(uint256 _blockHeight, bytes32 _stateRoot) external returns (bytes32 /* stateRoot */); - /** proveOpenST external function */ + /** It's called whenever account proof needs to be verified */ function proveOpenST(uint256 _blockHeight, bytes _rlpEncodedAccount, bytes _rlpParentNodes) external returns (bool /* success */); - /** get latest state root block height public function */ + /** get highest state root block height for which state root is committed. */ function getLatestStateRootBlockHeight() public view returns (uint256 /* latest state root block height */); - /** get state root public function */ function getStateRoot(uint256 _blockHeight) public view returns (bytes32 /* state root */); - /** get storage root public function */ function getStorageRoot(uint256 _blockHeight) public view returns (bytes32 /* storage root */); } \ No newline at end of file From 325e76dd8bdb9b06687453401762c043251ece60 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 22 Jun 2018 16:36:53 +0530 Subject: [PATCH 0138/1361] contract: fixed stack too deep issue. MOSA-68 --- contracts/OpenSTUtils.sol | 23 +++++++++ contracts/OpenSTValue.sol | 100 ++++++++++++++++++++++++-------------- 2 files changed, 86 insertions(+), 37 deletions(-) diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol index 82c11804..9da9da4f 100644 --- a/contracts/OpenSTUtils.sol +++ b/contracts/OpenSTUtils.sol @@ -1,6 +1,9 @@ pragma solidity ^0.4.0; import "./BytesLib.sol"; +import "./MerklePatriciaProof.sol"; +import "./RLPEncode.sol"; + library OpenSTUtils { @@ -25,4 +28,24 @@ library OpenSTUtils { return keccak256(keccak256(path)); } + function verifyIntentStorage( + uint8 _intentIndex, + address _address, + uint256 _addressNonce, + bytes32 _storageRoot, + bytes32 _intentHash, + bytes _rlpParentNodes) + internal + pure + returns (bool) + { + bytes32 keyPath = storagePath(_intentIndex, keccak256(_address, _addressNonce)); + bytes memory path = bytes32ToBytes(keccak256(keyPath)); + require(MerklePatriciaProof.verify( + keccak256(RLPEncode.encodeItem(bytes32ToBytes(_intentHash))), + path, + _rlpParentNodes, + _storageRoot), "Failed to verify storage path"); + } + } diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 49e5192e..d31a7651 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -32,9 +32,6 @@ import "./ProtocolVersioned.sol"; // value chain contracts import "./SimpleStake.sol"; -// proof libraries -import "./MerklePatriciaProof.sol"; -import "./RLPEncode.sol"; import "./OpenSTUtils.sol"; import "./util.sol"; @@ -61,8 +58,7 @@ contract OpenSTValue is OpsManaged, Hasher, Util { address _staker, uint256 _amountST, uint256 _amountUT); event RedemptionIntentConfirmed(bytes32 indexed _uuid, bytes32 _redemptionIntentHash, - address _redeemer, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight, uint256 _blockHeight, - bytes32 _storageRoot); + address _redeemer, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight); event ProcessedUnstake(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, address stake, address _redeemer, address _beneficiary, uint256 _amountST, bytes32 _unlockSecret); @@ -313,10 +309,9 @@ contract OpenSTValue is OpsManaged, Hasher, Util { external returns ( uint256 amountST, - uint256 expirationHeight, - bytes32 storageRoot) + uint256 expirationHeight) { - require(utilityTokens[_uuid].simpleStake != address(0)); + require(_amountUT > 0); require(_beneficiary != address(0)); // later core will provide a view on the block height of the @@ -326,37 +321,23 @@ contract OpenSTValue is OpsManaged, Hasher, Util { require(nonces[_redeemer] + 1 == _redeemerNonce); nonces[_redeemer]++; - bytes32 redemptionIntentHash = hashRedemptionIntent( + bytes32 redemptionIntentHash; + (amountST, expirationHeight, redemptionIntentHash) = getAmountSTExpirationAndRedemptionHash( _uuid, _redeemer, - nonces[_redeemer], _beneficiary, _amountUT, _redemptionUnlockHeight, - _hashLock - ); + _hashLock); - expirationHeight = block.number + blocksToWaitShort(); - - UtilityToken storage utilityToken = utilityTokens[_uuid]; - // minimal precision to unstake 1 STWei - require(_amountUT >= (utilityToken.conversionRate.div(10**uint256(utilityToken.conversionRateDecimals)))); - amountST = (_amountUT - .mul(10**uint256(utilityToken.conversionRateDecimals))).div(utilityToken.conversionRate); - - require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); - - CoreInterface core = cores[utilityTokens[_uuid].chainIdUtility]; - storageRoot = core.getStorageRoots(_blockHeight); - - //TODO: Update the code to get the Index. - bytes32 keyPath = OpenSTUtils.storagePath(INTENT_INDEX, keccak256(_redeemer, _redeemerNonce)); - bytes memory path = bytes32ToBytes(keccak256(keyPath)); - require(MerklePatriciaProof.verify( - keccak256(RLPEncode.encodeItem(bytes32ToBytes(redemptionIntentHash))), - path, - _rlpParentNodes, - storageRoot), "Failed to verify storage path"); + bytes32 storageRoot = getStorageRoot(_uuid, _blockHeight); + require(OpenSTUtils.verifyIntentStorage( + INTENT_INDEX, + _redeemer, + _redeemerNonce, + storageRoot, + redemptionIntentHash, + _rlpParentNodes)); unstakes[redemptionIntentHash] = Unstake({ uuid: _uuid, @@ -366,15 +347,60 @@ contract OpenSTValue is OpsManaged, Hasher, Util { amountST: amountST, expirationHeight: expirationHeight, hashLock: _hashLock - }); + }); emit RedemptionIntentConfirmed(_uuid, redemptionIntentHash, _redeemer, - _beneficiary, amountST, _amountUT, expirationHeight, _blockHeight, storageRoot ); + _beneficiary, amountST, _amountUT, expirationHeight); + + return (amountST, expirationHeight); + + } + + function getStorageRoot( + bytes32 _uuid, + uint256 _blockHeight) + internal + returns (bytes32) + { + return CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoots(_blockHeight); + } + function getAmountSTExpirationAndRedemptionHash( + bytes32 _uuid, + address _redeemer, + address _beneficiary, + uint256 _amountUT, + uint256 _redemptionUnlockHeight, + bytes32 _hashLock) + private + returns (uint256 amountST, + uint256 expirationHeight, + bytes32 redemptionIntentHash) + { + require(utilityTokens[_uuid].simpleStake != address(0)); + expirationHeight = block.number + blocksToWaitShort(); + + UtilityToken storage utilityToken = utilityTokens[_uuid]; + // minimal precision to unstake 1 STWei + require(_amountUT >= (utilityToken.conversionRate.div(10**uint256(utilityToken.conversionRateDecimals)))); + amountST = (_amountUT + .mul(10**uint256(utilityToken.conversionRateDecimals))).div(utilityToken.conversionRate); - return (amountST, expirationHeight, storageRoot); + require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); + + redemptionIntentHash = hashRedemptionIntent( + _uuid, + _redeemer, + nonces[_redeemer], + _beneficiary, + _amountUT, + _redemptionUnlockHeight, + _hashLock + ); + + return (amountST, expirationHeight, redemptionIntentHash); } - function + function processUnstaking( bytes32 _redemptionIntentHash, bytes32 _unlockSecret) From e71042015563235ffa173a6d9dec097133e232b7 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 22 Jun 2018 17:53:30 +0530 Subject: [PATCH 0139/1361] contract: code refactored. MOSA-68 --- contracts/OpenSTValue.sol | 94 ++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index d31a7651..1926ff77 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -312,30 +312,40 @@ contract OpenSTValue is OpsManaged, Hasher, Util { uint256 expirationHeight) { + UtilityToken storage utilityToken = utilityTokens[_uuid]; + require(utilityToken.simpleStake != address(0)); require(_amountUT > 0); require(_beneficiary != address(0)); // later core will provide a view on the block height of the // utility chain require(_redemptionUnlockHeight > 0); - require(nonces[_redeemer] + 1 == _redeemerNonce); - nonces[_redeemer]++; + require(validateAndIncrementNonce(_redeemer, _redeemerNonce)); - bytes32 redemptionIntentHash; - (amountST, expirationHeight, redemptionIntentHash) = getAmountSTExpirationAndRedemptionHash( + bytes32 redemptionIntentHash = hashRedemptionIntent( _uuid, _redeemer, + _redeemerNonce, _beneficiary, _amountUT, _redemptionUnlockHeight, - _hashLock); + _hashLock + ); - bytes32 storageRoot = getStorageRoot(_uuid, _blockHeight); - require(OpenSTUtils.verifyIntentStorage( - INTENT_INDEX, + expirationHeight = block.number + blocksToWaitShort(); + + // minimal precision to unstake 1 STWei + require(_amountUT >= (utilityToken.conversionRate.div(10**uint256(utilityToken.conversionRateDecimals)))); + amountST = (_amountUT + .mul(10**uint256(utilityToken.conversionRateDecimals))).div(utilityToken.conversionRate); + + require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); + + require(verifyIntentStorage( + _uuid, _redeemer, _redeemerNonce, - storageRoot, + _blockHeight, redemptionIntentHash, _rlpParentNodes)); @@ -347,60 +357,52 @@ contract OpenSTValue is OpsManaged, Hasher, Util { amountST: amountST, expirationHeight: expirationHeight, hashLock: _hashLock - }); + }); emit RedemptionIntentConfirmed(_uuid, redemptionIntentHash, _redeemer, _beneficiary, amountST, _amountUT, expirationHeight); return (amountST, expirationHeight); - } - function getStorageRoot( - bytes32 _uuid, - uint256 _blockHeight) + function validateAndIncrementNonce( + address _accountAddress, + uint256 _accountNonce) internal - returns (bytes32) + returns (bool) { - return CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoots(_blockHeight); + require(_accountAddress != address(0)); + require(nonces[_accountAddress] + 1 == _accountNonce); + nonces[_accountAddress]++; + return true; } - function getAmountSTExpirationAndRedemptionHash( + + function verifyIntentStorage( bytes32 _uuid, address _redeemer, - address _beneficiary, - uint256 _amountUT, - uint256 _redemptionUnlockHeight, - bytes32 _hashLock) - private - returns (uint256 amountST, - uint256 expirationHeight, - bytes32 redemptionIntentHash) + uint256 _redeemerNonce, + uint256 _blockHeight, + bytes32 _redemptionIntentHash, + bytes _rlpParentNodes) + internal + view + returns (bool) { require(utilityTokens[_uuid].simpleStake != address(0)); - expirationHeight = block.number + blocksToWaitShort(); - - UtilityToken storage utilityToken = utilityTokens[_uuid]; - // minimal precision to unstake 1 STWei - require(_amountUT >= (utilityToken.conversionRate.div(10**uint256(utilityToken.conversionRateDecimals)))); - amountST = (_amountUT - .mul(10**uint256(utilityToken.conversionRateDecimals))).div(utilityToken.conversionRate); - - require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); + require(_redeemer != address(0)); + require(_redemptionIntentHash != bytes32(0)); - redemptionIntentHash = hashRedemptionIntent( - _uuid, - _redeemer, - nonces[_redeemer], - _beneficiary, - _amountUT, - _redemptionUnlockHeight, - _hashLock - ); - - return (amountST, expirationHeight, redemptionIntentHash); + bytes32 storageRoot = CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoots(_blockHeight); + require(OpenSTUtils.verifyIntentStorage( + INTENT_INDEX, + _redeemer, + _redeemerNonce, + storageRoot, + _redemptionIntentHash, + _rlpParentNodes)); + return true; } - function processUnstaking( bytes32 _redemptionIntentHash, bytes32 _unlockSecret) From 351045736b4e0c52f691a8c005cc8ad27096cfdd Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 22 Jun 2018 17:58:23 +0530 Subject: [PATCH 0140/1361] some indentation fix --- contracts/OpenSTUtility.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/OpenSTUtility.sol b/contracts/OpenSTUtility.sol index 829e91bb..5df83869 100644 --- a/contracts/OpenSTUtility.sol +++ b/contracts/OpenSTUtility.sol @@ -359,7 +359,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { redemptions[redemptionIntentHash] = Redemption({ uuid: _uuid, redeemer: msg.sender, - nonce: _nonce, + nonce: _nonce, beneficiary: _beneficiary, amountUT: _amountBT, unlockHeight: unlockHeight, @@ -415,7 +415,7 @@ contract OpenSTUtility is Hasher, OpsManaged, STPrimeConfig { redemptions[redemptionIntentHash] = Redemption({ uuid: uuidSTPrime, redeemer: msg.sender, - nonce: _nonce, + nonce: _nonce, beneficiary: _beneficiary, amountUT: amountSTP, unlockHeight: unlockHeight, From 748e0fe174bda1461a818f7ab28fd2f46d0afb28 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 22 Jun 2018 18:26:50 +0530 Subject: [PATCH 0141/1361] contract: fixed issue due to core contract rebase. MOSA-68 --- contracts/OpenSTValue.sol | 2 +- package-lock.json | 6348 +++++++++++++++++++++++-------------- test/ProofUtil.js | 57 - 3 files changed, 3982 insertions(+), 2425 deletions(-) delete mode 100644 test/ProofUtil.js diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 1926ff77..eced639c 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -392,7 +392,7 @@ contract OpenSTValue is OpsManaged, Hasher, Util { require(_redeemer != address(0)); require(_redemptionIntentHash != bytes32(0)); - bytes32 storageRoot = CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoots(_blockHeight); + bytes32 storageRoot = CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoot(_blockHeight); require(OpenSTUtils.verifyIntentStorage( INTENT_INDEX, _redeemer, diff --git a/package-lock.json b/package-lock.json index bffaa1cd..9ab51e95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,16 +10,25 @@ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, "@nodelib/fs.stat": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.0.2.tgz", - "integrity": "sha512-vCpf75JDcdomXvUd7Rn6DfYAVqPAFI66FVjxiWGwh85OLdvfo3paBoPJaam5keIYRyUolnS7SleS/ZPCidCvzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz", + "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==", "dev": true }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", @@ -32,19 +41,20 @@ "integrity": "sha512-nvLArBx0XOJufWyaghMKtIofZDBwEMdVZoqcetQOIe1qYeKZk4+kRYGPEJ5lt7dD3MLulw//amUzOJLM8eW5RA==", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-loader": "6.4.1", - "babel-plugin-add-module-exports": "0.2.1", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-es2015": "6.24.1", - "chai": "3.5.0", - "web3": "0.18.4", - "webpack": "2.7.0" + "babel-core": "^6.23.1", + "babel-loader": "^6.3.2", + "babel-plugin-add-module-exports": "^0.2.1", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-preset-es2015": "^6.22.0", + "chai": "^3.5.0", + "web3": "^0.18.4", + "webpack": "^2.7.0" }, "dependencies": { "bignumber.js": { "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", "dev": true }, "web3": { @@ -54,18 +64,27 @@ "dev": true, "requires": { "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" } } } }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", "dev": true }, "acorn-dynamic-import": { @@ -74,7 +93,7 @@ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { @@ -86,13 +105,14 @@ } }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -107,9 +127,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "ansi-escapes": { @@ -119,10 +139,9 @@ "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "2.2.1", @@ -131,19 +150,24 @@ "dev": true }, "any-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", - "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", "dev": true }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -170,13 +194,18 @@ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -197,15 +226,19 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.1", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -216,6 +249,11 @@ "util": "0.10.3" } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -229,18 +267,18 @@ "dev": true }, "ast-types": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", - "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.5.tgz", + "integrity": "sha512-oJjo+5e7/vEc2FBK8gUalV0pba4L3VdBIs2EKhOLHLcOd2FgQIVQN9xb0eZ9IjEWyAL7vq6fGJxOvVvdCHNyMw==", "dev": true }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.10" } }, "async-each": { @@ -249,21 +287,41 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "atob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -272,25 +330,36 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "babel-generator": { @@ -299,14 +368,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, "babel-helper-bindify-decorators": { @@ -315,9 +384,9 @@ "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -326,9 +395,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-call-delegate": { @@ -337,10 +406,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -349,10 +418,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -361,9 +430,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-explode-class": { @@ -372,10 +441,10 @@ "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", "dev": true, "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -384,11 +453,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -397,8 +466,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -407,8 +476,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -417,8 +486,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -427,9 +496,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -438,11 +507,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -451,12 +520,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -465,8 +534,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-loader": { @@ -475,10 +544,10 @@ "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", "dev": true, "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "find-cache-dir": "^0.1.1", + "loader-utils": "^0.2.16", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1" } }, "babel-messages": { @@ -487,7 +556,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-add-module-exports": { @@ -502,7 +571,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-async-functions": { @@ -577,9 +646,9 @@ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-async-to-generator": { @@ -588,9 +657,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-constructor-call": { @@ -599,9 +668,9 @@ "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", "dev": true, "requires": { - "babel-plugin-syntax-class-constructor-call": "6.18.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-class-properties": { @@ -610,10 +679,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-decorators": { @@ -622,11 +691,11 @@ "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", "dev": true, "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -635,7 +704,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -644,7 +713,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -653,11 +722,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -666,15 +735,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -683,8 +752,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -693,7 +762,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -702,8 +771,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -712,7 +781,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -721,9 +790,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -732,7 +801,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -741,9 +810,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -752,10 +821,10 @@ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -764,9 +833,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -775,9 +844,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -786,8 +855,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -796,12 +865,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -810,8 +879,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -820,7 +889,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -829,9 +898,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -840,7 +909,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -849,7 +918,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -858,9 +927,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -869,9 +938,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-export-extensions": { @@ -880,8 +949,8 @@ "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", "dev": true, "requires": { - "babel-plugin-syntax-export-extensions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -890,8 +959,8 @@ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -900,8 +969,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -910,7 +979,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-runtime": { @@ -919,7 +988,7 @@ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-strict-mode": { @@ -928,8 +997,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-es2015": { @@ -938,30 +1007,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" } }, "babel-preset-stage-1": { @@ -970,9 +1039,9 @@ "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", "dev": true, "requires": { - "babel-plugin-transform-class-constructor-call": "6.24.1", - "babel-plugin-transform-export-extensions": "6.22.0", - "babel-preset-stage-2": "6.24.1" + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" } }, "babel-preset-stage-2": { @@ -981,10 +1050,10 @@ "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", "dev": true, "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" } }, "babel-preset-stage-3": { @@ -993,11 +1062,11 @@ "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", "dev": true, "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" } }, "babel-register": { @@ -1006,13 +1075,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.6", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -1021,8 +1090,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.6", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1031,11 +1100,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1044,15 +1113,26 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "babel-types": { @@ -1061,10 +1141,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1076,8 +1156,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1085,13 +1164,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1100,7 +1179,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1109,7 +1188,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1118,7 +1197,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1127,9 +1206,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -1143,8 +1222,16 @@ "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } }, "big.js": { "version": "3.2.0", @@ -1179,19 +1266,66 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1201,16 +1335,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -1219,7 +1353,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1227,74 +1361,75 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.1", - "safe-buffer": "5.1.2" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", - "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.1" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sha3": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", + "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "requires": { + "js-sha3": "^0.3.1" } }, "browserify-sign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.1", - "parse-asn1": "5.1.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1303,31 +1438,57 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", + "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.11", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "buffer-from": { + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-fill": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", "dev": true }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { "version": "1.1.1", @@ -1341,21 +1502,26 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "cacheable-request": { @@ -1388,10 +1554,14 @@ "dev": true }, "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "center-align": { "version": "0.1.3", @@ -1399,8 +1569,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chai": { @@ -1409,9 +1579,9 @@ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", "dev": true, "requires": { - "assertion-error": "1.1.0", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" } }, "chalk": { @@ -1420,11 +1590,34 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, "chardet": { @@ -1434,33 +1627,33 @@ "dev": true }, "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.1", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "class-utils": { @@ -1469,10 +1662,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -1481,7 +1674,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -1492,7 +1685,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-spinners": { @@ -1525,7 +1718,44 @@ "dev": true, "requires": { "slice-ansi": "0.0.4", - "string-width": "1.0.2" + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "cli-width": { @@ -1535,14 +1765,13 @@ "dev": true }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "clone": { @@ -1563,7 +1792,7 @@ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, "requires": { - "mimic-response": "1.0.0" + "mimic-response": "^1.0.0" } }, "clone-stats": { @@ -1578,22 +1807,20 @@ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { - "inherits": "2.0.1", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-visit": { "version": "1.0.0", @@ -1601,40 +1828,44 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "1.1.1" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, "colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", + "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", "dev": true }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "graceful-readlink": "1.0.1" + "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1650,8 +1881,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-browserify": { "version": "1.1.0", @@ -1659,7 +1889,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -1668,12 +1898,32 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -1681,88 +1931,92 @@ "dev": true }, "core-js": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", - "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "^4", + "vary": "^1" + } }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.1", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.1", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.1", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "crypto-js": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", + "dev": true }, "d": { "version": "1.0.0", @@ -1770,7 +2024,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.42" + "es5-ext": "^0.10.9" } }, "dargs": { @@ -1779,6 +2033,14 @@ "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "date-fns": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", @@ -1798,10 +2060,9 @@ "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { "ms": "2.0.0" } @@ -1809,22 +2070,100 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + } }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, "requires": { - "mimic-response": "1.0.0" + "mimic-response": "^1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + } } }, "deep-eql": { @@ -1856,8 +2195,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1866,7 +2205,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1875,7 +2214,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1884,9 +2223,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -1897,16 +2236,30 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, "requires": { - "inherits": "2.0.1", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, "detect-conflict": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", @@ -1919,24 +2272,22 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dir-glob": { @@ -1945,8 +2296,8 @@ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" + "arrify": "^1.0.1", + "path-type": "^3.0.0" }, "dependencies": { "path-type": { @@ -1955,7 +2306,7 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "pify": { @@ -1966,6 +2317,11 @@ } } }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -1975,8 +2331,16 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } }, "editions": { "version": "1.3.4", @@ -1984,6 +2348,11 @@ "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", "dev": true }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "ejs": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", @@ -2000,15 +2369,14 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.1", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -2017,22 +2385,35 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "envinfo": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-4.4.2.tgz", - "integrity": "sha512-5rfRs+m+6pwoKRCFqpsA5+qsLngFms1aWPrxfKbrObCzQaPc3M3yPloZx+BL9UE3dK58cxw36XVQbFRSCCfGSQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-5.10.0.tgz", + "integrity": "sha512-rXbzXWvnQxy+TcqZlARbWVQwgGVVouVJgFZhLVN5htjLxl1thstrP2ZGi0pXC309AbK7gVOPU+ulz/tmpCI7iw==", "dev": true }, "errno": { @@ -2041,7 +2422,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error": { @@ -2050,28 +2431,28 @@ "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", "dev": true, "requires": { - "string-template": "0.2.1", - "xtend": "4.0.1" + "string-template": "~0.2.1", + "xtend": "~4.0.0" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es5-ext": { - "version": "0.10.42", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", - "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-iterator": { @@ -2080,9 +2461,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -2091,12 +2472,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-set": { @@ -2105,11 +2486,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -2118,8 +2499,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -2128,17 +2509,21 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escope": { "version": "3.6.0", @@ -2146,10 +2531,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { @@ -2164,7 +2549,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -2179,25 +2564,44 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-lib": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", + "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "keccakjs": "^0.2.1", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, "ethereumjs-testrpc": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", "dev": true, "requires": { - "webpack": "3.12.0" + "webpack": "^3.0.0" }, "dependencies": { "ajv": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz", - "integrity": "sha512-VDUX1oSajablmiyFyED9L1DFndg0P9h7p1F+NO8FkIzei6EPrR6Zu1n18rd5P8PqaSRd/FrWv3G1TVBqpM83gA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", + "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1", - "uri-js": "4.2.1" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, "ajv-keywords": { @@ -2207,15 +2611,9 @@ "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "cliui": { @@ -2224,9 +2622,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -2235,26 +2633,32 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "locate-path": "2.0.0" + "number-is-nan": "^1.0.0" } }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "load-json-file": { @@ -2263,10 +2667,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "loader-utils": { @@ -2275,20 +2679,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "path-type": { @@ -2297,7 +2690,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "read-pkg": { @@ -2306,9 +2699,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -2317,35 +2710,17 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -2354,70 +2729,55 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, "webpack": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "dev": true, "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "6.5.0", - "ajv-keywords": "3.2.0", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "yargs": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" } }, "yargs-parser": { @@ -2426,21 +2786,42 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, + "eventemitter3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -2451,25 +2832,23 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exit-hook": { @@ -2484,22 +2863,31 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -2508,7 +2896,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -2519,7 +2907,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.4" + "fill-range": "^2.1.0" }, "dependencies": { "fill-range": { @@ -2528,11 +2916,11 @@ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "is-number": { @@ -2541,7 +2929,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "isobject": { @@ -2561,17 +2949,145 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } } }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2580,7 +3096,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2591,9 +3107,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -2602,14 +3118,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -2618,7 +3134,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -2627,7 +3143,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -2636,7 +3152,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2645,7 +3161,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2654,9 +3170,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -2667,11 +3183,15 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, "fast-glob": { "version": "2.2.2", @@ -2679,19 +3199,26 @@ "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", "dev": true, "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "@nodelib/fs.stat": "1.0.2", - "glob-parent": "3.1.0", - "is-glob": "4.0.0", - "merge2": "1.2.2", - "micromatch": "3.1.10" + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.0.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" } }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } }, "figures": { "version": "2.0.0", @@ -2699,9 +3226,14 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -2714,10 +3246,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -2726,8 +3258,37 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, @@ -2737,19 +3298,17 @@ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "locate-path": "^2.0.0" } }, "first-chunk-stream": { @@ -2758,15 +3317,23 @@ "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.2" } }, "flow-parser": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.72.0.tgz", - "integrity": "sha512-kFaDtviKlD/rHi6NRp42KTbnPgz/nKcWUJQhqDnLDeKA8uGcRVSy0YlQjaf9M3pFo5PgC3SNFnCPpQGLtHjH2w==", + "version": "0.75.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.75.0.tgz", + "integrity": "sha512-QEyV/t9TERBOSI/zSx0zhKH6924135WPI7pMmug2n/n/4puFm4mdAq1QaKPA3IPhXDRtManbySkKhRqws5UUGA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2779,46 +3346,82 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.1", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "fs-promise": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", + "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "requires": { + "any-promise": "^1.3.0", + "fs-extra": "^2.0.0", + "mz": "^2.6.0", + "thenify-all": "^1.6.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.4", @@ -2827,8 +3430,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.10.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -2854,8 +3457,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { @@ -2868,7 +3471,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -2932,7 +3535,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -2947,14 +3550,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -2963,12 +3566,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -2983,7 +3586,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } }, "ignore-walk": { @@ -2992,7 +3595,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -3001,8 +3604,8 @@ "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3021,7 +3624,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -3035,7 +3638,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3048,8 +3651,8 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, "minizlib": { @@ -3058,7 +3661,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "mkdirp": { @@ -3081,9 +3684,9 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { @@ -3092,16 +3695,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -3110,8 +3713,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -3126,8 +3729,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -3136,10 +3739,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3158,7 +3761,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3179,8 +3782,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -3201,10 +3804,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3221,13 +3824,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -3236,7 +3839,7 @@ "dev": true, "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -3279,9 +3882,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -3290,7 +3893,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -3298,7 +3901,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3313,13 +3916,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, "util-deprecate": { @@ -3334,7 +3937,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -3349,14 +3952,25 @@ } } }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "ganache-cli": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.0.tgz", - "integrity": "sha512-FdTeyk4uLRHGeFiMe+Qnh4Hc5KiTVqvRVVvLDFJEVVKC1P1yHhEgZeh9sp1KhuvxSrxToxgJS25UapYQwH4zHw==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.3.tgz", + "integrity": "sha512-6g/jPkhEMBlefOUQR0AXQooTCsLFD4iOvTDmsqi/B3XOktB9KGSioDaEy5lCcgzJczzUHT1YCZXhrZcUgtNkkg==", "dev": true, "requires": { - "source-map-support": "0.5.6", - "webpack-cli": "2.1.3" + "source-map-support": "^0.5.3", + "webpack-cli": "^2.0.9" }, "dependencies": { "source-map": { @@ -3371,8 +3985,8 @@ "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "buffer-from": "1.0.0", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } } } @@ -3380,14 +3994,12 @@ "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { "version": "2.0.6", @@ -3395,68 +4007,22 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "gh-got": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", "dev": true, "requires": { - "got": "7.1.0", - "is-plain-obj": "1.1.0" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, - "requires": { - "p-finally": "1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - } + "got": "^7.0.0", + "is-plain-obj": "^1.1.0" } }, "github-username": { @@ -3465,21 +4031,20 @@ "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", "dev": true, "requires": { - "gh-got": "6.0.0" + "gh-got": "^6.0.0" } }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-all": { @@ -3488,8 +4053,8 @@ "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", "dev": true, "requires": { - "glob": "7.1.2", - "yargs": "1.2.6" + "glob": "^7.0.5", + "yargs": "~1.2.6" }, "dependencies": { "minimist": { @@ -3504,7 +4069,7 @@ "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", "dev": true, "requires": { - "minimist": "0.1.0" + "minimist": "^0.1.0" } } } @@ -3515,8 +4080,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "glob-parent": { @@ -3525,7 +4090,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "is-extglob": { @@ -3540,7 +4105,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -3551,8 +4116,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -3561,7 +4126,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -3572,15 +4137,24 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -3589,11 +4163,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -3608,13 +4182,13 @@ "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.2", - "glob": "7.1.2", - "ignore": "3.3.8", - "pify": "3.0.0", - "slash": "1.0.0" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" }, "dependencies": { "pify": { @@ -3626,49 +4200,35 @@ } }, "got": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", - "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", - "dev": true, - "requires": { - "@sindresorhus/is": "0.7.0", - "cacheable-request": "2.1.4", - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "into-stream": "3.1.0", - "is-retry-allowed": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "mimic-response": "1.0.0", - "p-cancelable": "0.4.1", - "p-timeout": "2.0.1", - "pify": "3.0.0", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "url-parse-lax": "3.0.0", - "url-to-options": "1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" } }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, "grouped-queue": { "version": "0.3.3", @@ -3676,14 +4236,27 @@ "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.2" } }, "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } }, "has-ansi": { "version": "2.0.0", @@ -3691,7 +4264,15 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "has-color": { @@ -3701,24 +4282,21 @@ "dev": true }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" }, "has-to-string-tag-x": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, "requires": { - "has-symbol-support-x": "1.4.2" + "has-symbol-support-x": "^1.4.1" } }, "has-value": { @@ -3727,9 +4305,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -3738,8 +4316,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -3748,7 +4326,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3757,45 +4335,40 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz", + "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" }, "dependencies": { "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "home-or-tmp": { @@ -3804,8 +4377,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "homedir-polyfill": { @@ -3814,7 +4387,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -3829,9 +4402,42 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, @@ -3839,21 +4445,19 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", - "dev": true + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "import-local": { @@ -3862,26 +4466,17 @@ "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" }, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } } } @@ -3898,7 +4493,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexof": { @@ -3911,10 +4506,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3934,34 +4528,28 @@ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.10", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -3970,9 +4558,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -3981,38 +4569,13 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4029,8 +4592,8 @@ "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "dev": true, "requires": { - "from2": "2.3.0", - "p-is-promise": "1.1.0" + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" } }, "invariant": { @@ -4039,14 +4602,18 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -4054,7 +4621,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -4069,7 +4636,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -4084,16 +4651,21 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-descriptor": { @@ -4102,9 +4674,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -4127,7 +4699,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -4148,17 +4720,18 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" }, "is-glob": { "version": "4.0.0", @@ -4166,37 +4739,46 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", "dev": true, "requires": { - "symbol-observable": "0.2.4" + "symbol-observable": "^1.1.0" }, "dependencies": { "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true } } @@ -4207,7 +4789,7 @@ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -4221,8 +4803,7 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", @@ -4230,7 +4811,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-posix-bracket": { @@ -4254,8 +4835,7 @@ "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-scoped": { "version": "1.0.0", @@ -4263,14 +4843,18 @@ "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", "dev": true, "requires": { - "scoped-regex": "1.0.0" + "scoped-regex": "^1.0.0" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -4287,8 +4871,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "3.0.2", @@ -4299,8 +4882,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -4308,54 +4890,69 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "istextorbinary": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", "dev": true, "requires": { - "binaryextensions": "2.1.1", - "editions": "1.3.4", - "textextensions": "2.2.0" + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" } }, "isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, + "js-sha3": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", + "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, "jscodeshift": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.0.tgz", - "integrity": "sha512-JAcQINNMFpdzzpKJN8k5xXjF3XDuckB1/48uScSzcnNyK199iWEc9AxKL9OoX5144M2w5zEx9Qs4/E/eBZZUlw==", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "7.0.0-beta.47", - "colors": "1.2.5", - "flow-parser": "0.72.0", - "lodash": "4.17.10", - "micromatch": "2.3.11", - "neo-async": "2.5.1", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.1.tgz", + "integrity": "sha512-sRMollbhbmSDrR79JMAnhEjyZJlQQVozeeY9A6/KNuV26DNcuB3mGSCWXp0hks9dcwRNOELbNOiwraZaXXRk5Q==", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^7.0.0-beta.47", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", + "neo-async": "^2.5.0", "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.14.7", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" + "nomnom": "^1.8.1", + "recast": "^0.15.0", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" }, "dependencies": { "arr-diff": { @@ -4364,7 +4961,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -4385,9 +4982,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -4396,7 +4993,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -4405,7 +5002,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-extglob": { @@ -4420,7 +5017,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "micromatch": { @@ -4429,19 +5026,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } @@ -4470,11 +5067,15 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stable-stringify": { "version": "1.0.1", @@ -4482,14 +5083,13 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "0.5.1", @@ -4501,9 +5101,8 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -4512,15 +5111,26 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "keccak": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", "requires": { - "bindings": "1.3.0", - "inherits": "2.0.3", - "nan": "2.10.0", - "safe-buffer": "5.1.2" + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" }, "dependencies": { "inherits": { @@ -4530,6 +5140,15 @@ } } }, + "keccakjs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", + "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", + "requires": { + "browserify-sha3": "^0.0.1", + "sha3": "^1.1.0" + } + }, "keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", @@ -4545,7 +5164,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "klaw": { @@ -4554,7 +5173,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "lazy-cache": { @@ -4567,44 +5186,48 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "listr": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", - "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.4.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.10", - "stream-to-observable": "0.2.0", - "strip-ansi": "3.0.1" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.1.tgz", + "integrity": "sha512-MSMUUVN1f8aRnPi4034RkOqdiUlpYW+FqwFE3aL0uYNPRavkt2S2SsSpDDofn8BDpqv2RNnsdOcCHWsChcq77A==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.4.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^6.1.0", + "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "log-symbols": { @@ -4613,7 +5236,25 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" + } + }, + "rxjs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", + "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" } } } @@ -4630,24 +5271,30 @@ "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "indent-string": { @@ -4662,7 +5309,16 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" } } } @@ -4673,10 +5329,10 @@ "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" }, "dependencies": { "cli-cursor": { @@ -4685,7 +5341,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "figures": { @@ -4694,8 +5350,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "onetime": { @@ -4710,8 +5366,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } @@ -4722,11 +5378,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "loader-runner": { @@ -4741,28 +5397,19 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -4771,87 +5418,25 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "2.4.1" + "chalk": "^2.0.1" }, "dependencies": { "ansi-styles": { @@ -4860,7 +5445,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4869,9 +5454,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -4886,7 +5471,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4897,8 +5482,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" }, "dependencies": { "ansi-escapes": { @@ -4913,7 +5498,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "onetime": { @@ -4928,8 +5513,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } @@ -4946,39 +5531,35 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, @@ -4994,7 +5575,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "math-random": { @@ -5007,19 +5588,22 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "mem-fs": { @@ -5028,9 +5612,9 @@ "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", "dev": true, "requires": { - "through2": "2.0.3", - "vinyl": "1.2.0", - "vinyl-file": "2.0.0" + "through2": "^2.0.0", + "vinyl": "^1.1.0", + "vinyl-file": "^2.0.0" } }, "mem-fs-editor": { @@ -5039,17 +5623,17 @@ "integrity": "sha512-QHvdXLLNmwJXxKdf7x27aNUren6IoPxwcM8Sfd+S6/ddQQMcYdEtVKsh6ilpqMrU18VQuKZEaH0aCGt3JDbA0g==", "dev": true, "requires": { - "commondir": "1.0.1", - "deep-extend": "0.5.1", - "ejs": "2.6.1", - "glob": "7.1.2", - "globby": "8.0.1", - "isbinaryfile": "3.0.2", - "mkdirp": "0.5.1", - "multimatch": "2.1.0", - "rimraf": "2.2.8", - "through2": "2.0.3", - "vinyl": "2.1.0" + "commondir": "^1.0.1", + "deep-extend": "^0.5.1", + "ejs": "^2.5.9", + "glob": "^7.0.3", + "globby": "^8.0.0", + "isbinaryfile": "^3.0.2", + "mkdirp": "^0.5.0", + "multimatch": "^2.0.0", + "rimraf": "^2.2.8", + "through2": "^2.0.0", + "vinyl": "^2.0.1" }, "dependencies": { "clone": { @@ -5076,12 +5660,12 @@ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, "requires": { - "clone": "2.1.1", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } @@ -5092,8 +5676,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "memorystream": { @@ -5102,31 +5686,41 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, "merge2": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5141,50 +5735,69 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mimic-response": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", - "dev": true + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { "version": "1.3.1", @@ -5192,8 +5805,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -5202,7 +5815,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -5211,81 +5824,54 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "*" + } + }, "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", "requires": { "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", + "glob": "7.1.2", + "growl": "1.10.3", "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "supports-color": "4.4.0" } }, + "mock-fs": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.5.0.tgz", + "integrity": "sha512-qqudNfOX7ZmX9vm1WIAU+gWlmxVNAnwY6UG3RkFutNywmRCUGP83tujP6IxX2DS1TmcaEZBOhYwDuYEmJYE+3w==" + }, "moment": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", - "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "mout": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multimatch": { "version": "2.1.0", @@ -5293,10 +5879,10 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" } }, "mute-stream": { @@ -5305,29 +5891,44 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "kind-of": { @@ -5338,6 +5939,11 @@ } } }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, "neo-async": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", @@ -5368,29 +5974,48 @@ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.2", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" + }, + "dependencies": { + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + } } }, "nomnom": { @@ -5399,8 +6024,8 @@ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", "dev": true, "requires": { - "chalk": "0.4.0", - "underscore": "1.6.0" + "chalk": "~0.4.0", + "underscore": "~1.6.0" }, "dependencies": { "ansi-styles": { @@ -5415,9 +6040,9 @@ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" } }, "strip-ansi": { @@ -5425,6 +6050,12 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true } } }, @@ -5434,10 +6065,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -5446,7 +6077,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-url": { @@ -5455,31 +6086,57 @@ "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, "requires": { - "prepend-http": "2.0.0", - "query-string": "5.1.1", - "sort-keys": "2.0.0" + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + } } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -5487,9 +6144,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -5498,7 +6155,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -5509,7 +6166,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.omit": { @@ -5518,8 +6175,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -5528,16 +6185,31 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" + } + }, + "oboe": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", + "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -5546,7 +6218,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "ora": { @@ -5555,10 +6227,10 @@ "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" }, "dependencies": { "cli-cursor": { @@ -5567,7 +6239,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "onetime": { @@ -5582,8 +6254,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } @@ -5607,12 +6279,13 @@ "dev": true }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "lcid": "1.0.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -5622,10 +6295,9 @@ "dev": true }, "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", - "dev": true + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" }, "p-each-series": { "version": "1.0.0", @@ -5633,14 +6305,13 @@ "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, "requires": { - "p-reduce": "1.0.0" + "p-reduce": "^1.0.0" } }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "1.1.0", @@ -5655,21 +6326,19 @@ "dev": true }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -5685,19 +6354,17 @@ "dev": true }, "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "requires": { - "p-finally": "1.0.0" + "p-finally": "^1.0.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "pako": { "version": "1.0.6", @@ -5709,13 +6376,12 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-glob": { @@ -5724,10 +6390,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -5742,18 +6408,27 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "requires": { + "for-each": "^0.3.2", + "trim": "0.0.1" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -5762,6 +6437,11 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -5781,25 +6461,19 @@ "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", @@ -5807,49 +6481,65 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pbkdf2": { "version": "3.0.16", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", - "dev": true, "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, + "pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -5858,7 +6548,28 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } } }, "posix-character-classes": { @@ -5868,10 +6579,9 @@ "dev": true }, "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "preserve": { "version": "0.2.0", @@ -5880,9 +6590,9 @@ "dev": true }, "prettier": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", - "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.5.tgz", + "integrity": "sha512-4M90mfvLz6yRf2Dhzd+xPIE6b4xkI8nHMJhsSm9IlfG17g6wujrrm7+H1X8x52tC4cSNm6HmuhCUSNe6Hd5wfw==", "dev": true }, "pretty-bytes": { @@ -5898,16 +6608,23 @@ "dev": true }, "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } }, "prr": { "version": "1.0.1", @@ -5918,37 +6635,38 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "public-encrypt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", - "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -5969,9 +6687,9 @@ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { @@ -5992,19 +6710,38 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "randomhex": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", + "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" } }, "read-chunk": { @@ -6013,8 +6750,8 @@ "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", "dev": true, "requires": { - "pify": "3.0.0", - "safe-buffer": "5.1.2" + "pify": "^3.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { "pify": { @@ -6031,9 +6768,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -6042,30 +6779,49 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } } }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" }, "dependencies": { "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, @@ -6075,22 +6831,22 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "recast": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", - "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.15.0.tgz", + "integrity": "sha512-47C2mIxQYvFICrTNuV4+xGgBa1nAoq42ANN5oDTSBIJ50NX7jcki7gAC6HWYptnQgHmqIRTHJq8OKdi3fwgyNQ==", "dev": true, "requires": { - "ast-types": "0.11.3", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" + "ast-types": "0.11.5", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -6107,7 +6863,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.7.1" + "resolve": "^1.1.6" } }, "regenerate": { @@ -6128,9 +6884,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -6139,7 +6895,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -6148,8 +6904,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -6158,9 +6914,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -6175,7 +6931,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -6210,7 +6966,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { @@ -6219,11 +6975,37 @@ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", "dev": true }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "1.2.1", @@ -6234,16 +7016,15 @@ "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-cwd": { @@ -6252,7 +7033,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "resolve-dir": { @@ -6261,8 +7042,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -6283,7 +7064,7 @@ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "requires": { - "lowercase-keys": "1.0.1" + "lowercase-keys": "^1.0.0" } }, "restore-cursor": { @@ -6292,8 +7073,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -6308,23 +7089,24 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-async": { @@ -6333,13 +7115,13 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rxjs": { - "version": "5.5.10", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", - "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", "dev": true, "requires": { "symbol-observable": "1.0.1" @@ -6356,14 +7138,13 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "scoped-regex": { "version": "1.0.0", @@ -6371,17 +7152,117 @@ "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", "dev": true }, + "scrypt": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", + "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", + "requires": { + "nan": "^2.0.8" + } + }, + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "requires": { + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" + } + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "requires": { + "pbkdf2": "^3.0.3" + } + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "~2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", @@ -6395,10 +7276,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -6407,7 +7288,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6415,33 +7296,42 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sha3": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.2.tgz", + "integrity": "sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k=", + "requires": { + "nan": "2.10.0" } }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { "version": "0.8.2", @@ -6449,16 +7339,30 @@ "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } }, "slash": { "version": "1.0.0", @@ -6484,23 +7388,32 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -6509,7 +7422,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6520,9 +7433,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -6531,7 +7444,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -6540,7 +7453,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -6549,7 +7462,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -6558,9 +7471,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -6577,22 +7490,28 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "solc": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.23.tgz", - "integrity": "sha512-AT7anLHY6uIRg2It6N0UlCHeZ7YeecIkUhnlirrCgCPCUevtnoN48BxvgigN/4jJTRljv5oFhAJtI6gvHzT5DQ==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", + "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", "dev": true, "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.5.0", - "yargs": "4.8.1" + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -6605,11 +7524,68 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, "window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -6622,20 +7598,20 @@ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" } }, "yargs-parser": { @@ -6644,19 +7620,29 @@ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dev": true, "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } } } }, + "solparse": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", + "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", + "requires": { + "mocha": "^4.0.1", + "pegjs": "^0.10.0", + "yargs": "^10.0.3" + } + }, "sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -6677,11 +7663,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -6690,7 +7676,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "source-map-url": { @@ -6705,8 +7691,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -6721,8 +7707,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -6737,7 +7723,23 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "static-extend": { @@ -6746,8 +7748,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -6756,48 +7758,43 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.1", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", - "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.1", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "stream-to-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", - "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "any-observable": "0.2.0" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-template": { "version": "0.2.1", @@ -6806,32 +7803,28 @@ "dev": true }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -6840,7 +7833,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-bom-stream": { @@ -6849,21 +7842,58 @@ "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", "dev": true, "requires": { - "first-chunk-stream": "2.0.0", - "strip-bom": "2.0.0" + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "requires": { + "is-natural-number": "^4.0.1" } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "requires": { + "is-hex-prefixed": "1.0.0" + } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "^2.0.0" + } + }, + "swarm-js": { + "version": "0.1.37", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", + "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "decompress": "^4.0.0", + "eth-lib": "^0.1.26", + "fs-extra": "^2.1.2", + "fs-promise": "^2.0.0", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar.gz": "^1.0.5", + "xhr-request-promise": "^0.1.2" + } }, "symbol-observable": { "version": "1.0.1", @@ -6877,14 +7907,65 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" + } + }, + "tar.gz": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", + "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", + "requires": { + "bluebird": "^2.9.34", + "commander": "^2.8.1", + "fstream": "^1.0.8", + "mout": "^0.11.0", + "tar": "^2.1.1" + }, + "dependencies": { + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + } + } + }, "temp": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", "dev": true, "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } } }, "text-table": { @@ -6899,11 +7980,26 @@ "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", "dev": true }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.3", @@ -6911,15 +8007,14 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { "version": "2.0.10", @@ -6927,7 +8022,7 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmp": { @@ -6936,7 +8031,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-arraybuffer": { @@ -6945,6 +8040,11 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -6957,7 +8057,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -6966,10 +8066,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -6978,10 +8078,23 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "^1.4.1" } }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -6989,48 +8102,102 @@ "dev": true }, "truffle": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.8.tgz", - "integrity": "sha512-btDML3J9Ao+UDqR725ajTybcEqyXzxFzJDC/NAXOyOXoXf2HJwKq6VEvnjP9qc6owA+fJ50d87MmsPRXk+riCg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.12.tgz", + "integrity": "sha1-9F9LbBzhWGX817v19jNA9eFuKVA=", "dev": true, "requires": { - "mocha": "3.5.3", + "mocha": "^4.1.0", "original-require": "1.0.1", - "solc": "0.4.23" + "solc": "0.4.24" } }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, "type-detect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", "dev": true }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -7049,16 +8216,46 @@ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "requires": { + "buffer": "^3.0.1", + "through": "^2.3.6" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + } } }, "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "union-value": { "version": "1.0.0", @@ -7066,10 +8263,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -7078,7 +8275,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -7087,22 +8284,27 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -7111,9 +8313,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -7136,9 +8338,9 @@ } }, "untildify": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", - "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", "dev": true }, "upath": { @@ -7148,18 +8350,18 @@ "dev": true }, "uri-js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", - "integrity": "sha512-jpKCA3HjsBfSDOEgxRDAxQCNyHfCPSbq57PqCkd3gAyBuPb3IWxw54EHncqESznIdqSetHfw3D7ylThu2Kcc9A==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } @@ -7189,19 +8391,22 @@ } }, "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "2.0.0" + "prepend-http": "^1.0.1" } }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, "use": { "version": "3.1.0", @@ -7209,7 +8414,7 @@ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -7221,9 +8426,9 @@ } }, "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" }, "util": { "version": "0.10.3", @@ -7236,13 +8441,22 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "v8-compile-cache": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", - "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", + "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==", "dev": true }, "validate-npm-package-license": { @@ -7251,8 +8465,23 @@ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, "vinyl": { @@ -7261,8 +8490,8 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", + "clone": "^1.0.0", + "clone-stats": "^0.0.1", "replace-ext": "0.0.1" } }, @@ -7272,12 +8501,12 @@ "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0", - "strip-bom-stream": "2.0.0", - "vinyl": "1.2.0" + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" } }, "vm-browserify": { @@ -7295,25 +8524,281 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "2.0.3", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "web3": { - "version": "0.20.6", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", - "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", - "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.34.tgz", + "integrity": "sha1-NH5WG3hAmMtVYzFfSQR5odkfKrE=", + "requires": { + "web3-bzz": "1.0.0-beta.34", + "web3-core": "1.0.0-beta.34", + "web3-eth": "1.0.0-beta.34", + "web3-eth-personal": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-shh": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-bzz": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.34.tgz", + "integrity": "sha1-Bo03d3q2Xlxg+OyLmlDP5FJ3kpw=", + "requires": { + "got": "7.1.0", + "swarm-js": "0.1.37", + "underscore": "1.8.3" + } + }, + "web3-core": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.34.tgz", + "integrity": "sha1-EhvoVV6fsA0sXQXd0zgdDJ5GmH4=", + "requires": { + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-requestmanager": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-helpers": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.34.tgz", + "integrity": "sha1-sWjaANPhnhVrwVriAyA91N/uLQM=", + "requires": { + "underscore": "1.8.3", + "web3-eth-iban": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-method": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.34.tgz", + "integrity": "sha1-7BY8iixJD6AqfsFVWfpzB/x8xt0=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-promievent": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-core-promievent": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.34.tgz", + "integrity": "sha1-pPT6Z4S7KT6CxglgrltWqUzQPtw=", + "requires": { + "any-promise": "1.3.0", + "eventemitter3": "1.1.1" + } + }, + "web3-core-requestmanager": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.34.tgz", + "integrity": "sha1-Afj2zyrmtvC3DDi64e90G1urIVw=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-providers-http": "1.0.0-beta.34", + "web3-providers-ipc": "1.0.0-beta.34", + "web3-providers-ws": "1.0.0-beta.34" + } + }, + "web3-core-subscriptions": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.34.tgz", + "integrity": "sha1-n+0UQDPyIcPPIQYDAv/a9e8t4t4=", + "requires": { + "eventemitter3": "1.1.1", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34" + } + }, + "web3-eth": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.34.tgz", + "integrity": "sha1-dAhgAIUMb+b1Ne9Jg31tS7YRMmg=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-eth-abi": "1.0.0-beta.34", + "web3-eth-accounts": "1.0.0-beta.34", + "web3-eth-contract": "1.0.0-beta.34", + "web3-eth-iban": "1.0.0-beta.34", + "web3-eth-personal": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-eth-abi": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.34.tgz", + "integrity": "sha1-A0Uz46ovfln/MXk+rqaFwO1a9no=", + "requires": { + "bn.js": "4.11.6", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" }, "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-accounts": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.34.tgz", + "integrity": "sha1-4JFC7uzHl6w0WbdemyOUbTaV8zM=", + "requires": { + "any-promise": "1.3.0", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.7", + "scrypt.js": "0.2.0", + "underscore": "1.8.3", + "uuid": "2.0.1", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } + } + }, + "web3-eth-contract": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.34.tgz", + "integrity": "sha1-nbs4+udkOoCEJ6IBgEcOx0FckeY=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-promievent": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-eth-abi": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-eth-iban": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.34.tgz", + "integrity": "sha1-mvRYYFhnzPdOqXmq8yazi6alugw=", + "requires": { + "bn.js": "4.11.6", + "web3-utils": "1.0.0-beta.34" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-personal": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.34.tgz", + "integrity": "sha1-mvuhZzQuveVCC81YlcP2w0OI8gU=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-helpers": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-net": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.34.tgz", + "integrity": "sha1-QnzqL0MYgUScjjjVIykPFz+f9j0=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-utils": "1.0.0-beta.34" + } + }, + "web3-providers-http": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.34.tgz", + "integrity": "sha1-5WG1K7tDdmKCAH1AKFv+NVDCfno=", + "requires": { + "web3-core-helpers": "1.0.0-beta.34", + "xhr2": "0.1.4" + } + }, + "web3-providers-ipc": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.34.tgz", + "integrity": "sha1-obd/GjBtc2SanAOQUuQMtxMo0Ao=", + "requires": { + "oboe": "2.1.3", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34" + } + }, + "web3-providers-ws": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.34.tgz", + "integrity": "sha1-fecPG4Py3jZHZ3IVa+z+9uNRbrM=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.34", + "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" + } + }, + "web3-shh": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.34.tgz", + "integrity": "sha1-l1Bh1x6uxCzO5Xb3vY9w8DhEr+A=", + "requires": { + "web3-core": "1.0.0-beta.34", + "web3-core-method": "1.0.0-beta.34", + "web3-core-subscriptions": "1.0.0-beta.34", + "web3-net": "1.0.0-beta.34" + } + }, + "web3-utils": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.34.tgz", + "integrity": "sha1-lBH8OarvOcpOBhafdiKX2f8CCXA=", + "requires": { + "bn.js": "4.11.6", + "eth-lib": "0.1.27", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randomhex": "0.1.5", + "underscore": "1.8.3", + "utf8": "2.1.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" } } }, @@ -7323,36 +8808,149 @@ "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", "dev": true, "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "0.2.17", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "3.2.3", - "tapable": "0.2.8", - "uglify-js": "2.8.29", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0", - "yargs": "6.6.0" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^4.7.0", + "ajv-keywords": "^1.1.1", + "async": "^2.1.2", + "enhanced-resolve": "^3.3.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^0.2.16", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^3.1.0", + "tapable": "~0.2.5", + "uglify-js": "^2.8.27", + "watchpack": "^1.3.1", + "webpack-sources": "^1.0.1", + "yargs": "^6.0.0" }, "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" } } } @@ -7363,7 +8961,7 @@ "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", "dev": true, "requires": { - "jscodeshift": "0.4.1" + "jscodeshift": "^0.4.0" }, "dependencies": { "arr-diff": { @@ -7372,7 +8970,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -7399,9 +8997,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -7410,7 +9008,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -7419,7 +9017,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-extglob": { @@ -7434,7 +9032,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "jscodeshift": { @@ -7443,21 +9041,21 @@ "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", "dev": true, "requires": { - "async": "1.5.2", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "6.18.0", - "colors": "1.2.5", - "flow-parser": "0.72.0", - "lodash": "4.17.10", - "micromatch": "2.3.11", + "async": "^1.5.0", + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^6.17.3", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.12.9", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" + "nomnom": "^1.8.1", + "recast": "^0.12.5", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" } }, "micromatch": { @@ -7466,19 +9064,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "recast": { @@ -7488,10 +9086,10 @@ "dev": true, "requires": { "ast-types": "0.10.1", - "core-js": "2.5.6", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" + "core-js": "^2.4.1", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" } }, "source-map": { @@ -7503,80 +9101,57 @@ } }, "webpack-cli": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.3.tgz", - "integrity": "sha512-5AsKoL/Ccn8iTrwk3uErdyhetGH+c7VRQ7Itim2GL0IhBRq5rtojVDk00buMRmFmBpw1RvHXq97Gup965LbozA==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "diff": "3.5.0", - "enhanced-resolve": "4.0.0", - "envinfo": "4.4.2", - "glob-all": "3.1.0", - "global-modules": "1.0.0", - "got": "8.3.1", - "import-local": "1.0.0", - "inquirer": "5.2.0", - "interpret": "1.1.0", - "jscodeshift": "0.5.0", - "listr": "0.13.0", - "loader-utils": "1.1.0", - "lodash": "4.17.10", - "log-symbols": "2.2.0", - "mkdirp": "0.5.1", - "p-each-series": "1.0.0", - "p-lazy": "1.0.0", - "prettier": "1.12.1", - "supports-color": "5.4.0", - "v8-compile-cache": "1.1.2", - "webpack-addons": "1.1.5", - "yargs": "11.1.0", - "yeoman-environment": "2.1.1", - "yeoman-generator": "2.0.5" + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.5.tgz", + "integrity": "sha512-CiWQR+1JS77rmyiO6y1q8Kt/O+e8nUUC9YfJ25JtSmzDwbqJV7vIsh3+QKRHVTbTCa0DaVh8iY1LBiagUIDB3g==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "diff": "^3.5.0", + "enhanced-resolve": "^4.0.0", + "envinfo": "^5.7.0", + "glob-all": "^3.1.0", + "global-modules": "^1.0.0", + "got": "^8.3.1", + "import-local": "^1.0.0", + "inquirer": "^5.2.0", + "interpret": "^1.1.0", + "jscodeshift": "^0.5.0", + "listr": "^0.14.1", + "loader-utils": "^1.1.0", + "lodash": "^4.17.10", + "log-symbols": "^2.2.0", + "mkdirp": "^0.5.1", + "p-each-series": "^1.0.0", + "p-lazy": "^1.0.0", + "prettier": "^1.12.1", + "supports-color": "^5.4.0", + "v8-compile-cache": "^2.0.0", + "webpack-addons": "^1.1.5", + "yargs": "^11.1.0", + "yeoman-environment": "^2.1.1", + "yeoman-generator": "^2.0.5" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cross-spawn": { @@ -7585,31 +9160,53 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "enhanced-resolve": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.0.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" } }, "has-flag": { @@ -7618,52 +9215,43 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "p-finally": "^1.0.0" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true }, "supports-color": { "version": "5.4.0", @@ -7671,7 +9259,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "tapable": { @@ -7680,11 +9268,14 @@ "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", "dev": true }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } }, "yargs": { "version": "11.1.0", @@ -7692,18 +9283,18 @@ "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" } }, "yargs-parser": { @@ -7712,7 +9303,7 @@ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -7723,8 +9314,8 @@ "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -7735,20 +9326,38 @@ } } }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", + "requires": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "window-size": { "version": "0.1.0", @@ -7766,17 +9375,48 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "1.3.4", @@ -7784,9 +9424,52 @@ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", + "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", + "requires": { + "xhr-request": "^1.0.1" } }, "xhr2": { @@ -7797,119 +9480,95 @@ "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - } + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } + "camelcase": "^4.1.0" } }, - "yeoman-environment": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.1.1.tgz", - "integrity": "sha512-IBLwCUrJrDxBYuwdYm1wuF3O/CR2LpXR0rFS684QOrU6x69DPPrsdd20dZOFaedZ/M9sON7po73WhO3I1CbgNQ==", - "dev": true, + "yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha1-T7G8euH8L1cDe1SvasyP4QMcW3c=", "requires": { - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "globby": "8.0.1", - "grouped-queue": "0.3.3", - "inquirer": "5.2.0", - "is-scoped": "1.0.0", - "lodash": "4.17.10", - "log-symbols": "2.2.0", - "mem-fs": "1.1.3", - "strip-ansi": "4.0.0", - "text-table": "0.2.0", - "untildify": "3.0.2" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yeoman-environment": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.2.0.tgz", + "integrity": "sha512-gQ+hIW8QRlUo4jGBDCm++qg01SXaIVJ7VyLrtSwk2jQG4vtvluWpsGIl7V8DqT2jGiqukdec0uEyffVEyQgaZA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "diff": "^3.3.1", + "escape-string-regexp": "^1.0.2", + "globby": "^8.0.1", + "grouped-queue": "^0.3.3", + "inquirer": "^5.2.0", + "is-scoped": "^1.0.0", + "lodash": "^4.17.10", + "log-symbols": "^2.1.0", + "mem-fs": "^1.1.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "untildify": "^3.0.2" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -7918,9 +9577,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cross-spawn": { @@ -7929,20 +9588,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "has-flag": { @@ -7951,22 +9601,13 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -7977,31 +9618,31 @@ "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", "dev": true, "requires": { - "async": "2.6.0", - "chalk": "2.4.1", - "cli-table": "0.3.1", - "cross-spawn": "6.0.5", - "dargs": "5.1.0", - "dateformat": "3.0.3", - "debug": "3.1.0", - "detect-conflict": "1.0.1", - "error": "7.0.2", - "find-up": "2.1.0", - "github-username": "4.1.0", - "istextorbinary": "2.2.1", - "lodash": "4.17.10", - "make-dir": "1.3.0", - "mem-fs-editor": "4.0.2", - "minimist": "1.2.0", - "pretty-bytes": "4.0.2", - "read-chunk": "2.1.0", - "read-pkg-up": "3.0.0", - "rimraf": "2.6.2", - "run-async": "2.3.0", - "shelljs": "0.8.2", - "text-table": "0.2.0", - "through2": "2.0.3", - "yeoman-environment": "2.1.1" + "async": "^2.6.0", + "chalk": "^2.3.0", + "cli-table": "^0.3.1", + "cross-spawn": "^6.0.5", + "dargs": "^5.1.0", + "dateformat": "^3.0.3", + "debug": "^3.1.0", + "detect-conflict": "^1.0.0", + "error": "^7.0.2", + "find-up": "^2.1.0", + "github-username": "^4.0.0", + "istextorbinary": "^2.2.1", + "lodash": "^4.17.10", + "make-dir": "^1.1.0", + "mem-fs-editor": "^4.0.0", + "minimist": "^1.2.0", + "pretty-bytes": "^4.0.2", + "read-chunk": "^2.1.0", + "read-pkg-up": "^3.0.0", + "rimraf": "^2.6.2", + "run-async": "^2.0.0", + "shelljs": "^0.8.0", + "text-table": "^0.2.0", + "through2": "^2.0.0", + "yeoman-environment": "^2.0.5" }, "dependencies": { "ansi-styles": { @@ -8010,7 +9651,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -8019,9 +9660,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cross-spawn": { @@ -8030,29 +9671,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "has-flag": { @@ -8067,10 +9690,10 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "minimist": { @@ -8085,8 +9708,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "path-type": { @@ -8095,7 +9718,7 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "pify": { @@ -8110,9 +9733,9 @@ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, "read-pkg-up": { @@ -8121,17 +9744,8 @@ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, "strip-bom": { @@ -8146,7 +9760,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } diff --git a/test/ProofUtil.js b/test/ProofUtil.js deleted file mode 100644 index f21b4d24..00000000 --- a/test/ProofUtil.js +++ /dev/null @@ -1,57 +0,0 @@ - -const util = require('ethereumjs-util'); -const BigNumber = require('bignumber.js'); -var ProofUtil = artifacts.require("./ProofUtil.sol"); - - -function leftPad(str) { - return ("0000000000000000000000000000000000000000000000000000000000000000" + str).substring(str.length) -} - -function getPath(index, key) { - - let pathBuilder = Buffer.from(leftPad(index.toString('hex')), 'hex'); - console.log("pathBuilder 1: ",pathBuilder); - console.log("pathBuilder 1 toString('hex'): ",pathBuilder.toString('hex')); - pathBuilder = Buffer.concat([Buffer.from(leftPad(key.toString('hex')), 'hex'), pathBuilder]) - console.log("pathBuilder 2: ",pathBuilder); - console.log("pathBuilder 2 toString('hex'): ",pathBuilder.toString('hex')); - pathBuilder = Buffer.from(util.sha3(pathBuilder), 'hex'); - console.log("pathBuilder 3: ",pathBuilder); - console.log("pathBuilder 3 toString('hex'): ",pathBuilder.toString('hex')); - let storagePath = Buffer.from(util.sha3(pathBuilder), 'hex'); - return util.bufferToHex(storagePath); -} - -contract('ProofUtil', function(accounts) { - - describe ('ProofUtil', async () => { - it('Test', async () => { - - const proofContract = await ProofUtil.new(); - console.log("proofContract address: ",proofContract.address); - - const bn = new BigNumber(2); - var indexBuffer = new Buffer('02', 'hex');//new Buffer(bn.toNumber(16).toString()); - console.log("indexBuffer: ",indexBuffer); - console.log("indexBuffer.toHex: ",indexBuffer.toString('hex')); - - var key = "ad7c56403eba8c288188d9f1b9bbc5d67d0119807e4505f73d02d6da76f4181d"; - var keyBuffer = new Buffer(key, 'hex'); - console.log("keyBuffer: ",keyBuffer); - console.log("keyBuffer.toHex: ",keyBuffer.toString('hex')); - - var path = getPath(indexBuffer,keyBuffer); - console.log("path from JS: ",path); - - const callResponse = await proofContract.getStoragePath.call(bn.toNumber(16).toString(),"0x"+key); - console.log("callResponse: ",callResponse); - - const response = await proofContract.getStoragePath(bn.toNumber(16).toString(),"0x"+key); - console.log("path from Contract: ",response.logs[0].args); - - assert.equal(path, response.logs[0].args.path); - - }); - }); -}); From e1e67a80b1dda00d1c44af84d20c56f38ef63efd Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Fri, 22 Jun 2018 16:51:48 +0200 Subject: [PATCH 0142/1361] contracts: adds _hashIntentKey in stake fn --- contracts/OpenSTValue.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index 2757fadb..d58580d8 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -44,7 +44,7 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 _chainIdUtility, address indexed _stakingAccount); event StakingIntentDeclared(bytes32 indexed _uuid, address indexed _staker, - uint256 _stakerNonce, address _beneficiary, uint256 _amountST, + uint256 _stakerNonce, bytes32 _hashIntentKey, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _unlockHeight, bytes32 _stakingIntentHash, uint256 _chainIdUtility); @@ -226,9 +226,10 @@ contract OpenSTValue is OpsManaged, Hasher { // store the staking intent hash directly in storage of OpenSTValue // so that a Merkle proof can be generated for active staking intents - intents[hashIntentKey(_staker, nonce)] = stakingIntentHash; + _hashIntentKey = hashIntentKey(_staker, nonce); + intents[_hashIntentKey] = stakingIntentHash; - emit StakingIntentDeclared(_uuid, _staker, nonce, _beneficiary, + emit StakingIntentDeclared(_uuid, _staker, nonce, _hashIntentKey, _beneficiary, _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); return (amountUT, nonce, unlockHeight, stakingIntentHash); From 6ed7453fb37b7b0d2aeeeeb08b57a6aab5ef3a91 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Fri, 22 Jun 2018 17:58:35 +0200 Subject: [PATCH 0143/1361] tests: updates hashIntentKey tests --- test/OpenSTValue.js | 9 +++++---- test/OpenSTValue_utils.js | 3 ++- test/Protocol.js | 7 +++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 78634596..9a58fb6c 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -110,6 +110,7 @@ contract('OpenSTValue', function(accounts) { var result = null; var hasher = null; var stakingIntentHash = null; + var hashIntentKey = null; var stake = null; var nonce = null; @@ -255,7 +256,7 @@ contract('OpenSTValue', function(accounts) { amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); - await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, accounts[0], + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, hashIntentKey, accounts[0], amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); }) }) @@ -288,7 +289,7 @@ contract('OpenSTValue', function(accounts) { amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, accounts[0], lock.l, accounts[0], { from: accounts[0] }); - await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, accounts[0], + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, accounts[0], nonce, hashIntentKey, accounts[0], amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); }) }) @@ -537,7 +538,7 @@ contract('OpenSTValue', function(accounts) { unlockHeight = stakeReturns[2].plus(1); stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); - await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, hashIntentKey, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); }); @@ -607,7 +608,7 @@ contract('OpenSTValue', function(accounts) { stakingIntentHash = await openSTValue.hashStakingIntent.call(checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, lock.l); result = await openSTValue.stake(checkUuid, amountST, staker, lock.l, staker, { from: staker }); - await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); + await OpenSTValue_utils.checkStakingIntentDeclaredEvent(result.logs[0], checkUuid, staker, nonce, hashIntentKey, staker, amountST, amountUT, unlockHeight, stakingIntentHash, chainIdRemote); // Process Staking await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); diff --git a/test/OpenSTValue_utils.js b/test/OpenSTValue_utils.js index 02795b0a..e9e01d9d 100644 --- a/test/OpenSTValue_utils.js +++ b/test/OpenSTValue_utils.js @@ -90,7 +90,7 @@ module.exports.checkUtilityTokenRegisteredEventOnProtocol = (formattedDecodedEve assert.equal(event._stakingAccount, _stakingAccount); } -module.exports.checkStakingIntentDeclaredEvent = (event, _uuid, _staker, _stakerNonce, _beneficiary, _amountST, _amountUT, _unlockHeight, _stakingIntentHash, _chainIdUtility) => { +module.exports.checkStakingIntentDeclaredEvent = (event, _uuid, _staker, _stakerNonce, _hashIntentKey, _beneficiary, _amountST, _amountUT, _unlockHeight, _stakingIntentHash, _chainIdUtility) => { if (Number.isInteger(_stakerNonce)) { _stakerNonce = new BigNumber(_stakerNonce); } @@ -111,6 +111,7 @@ module.exports.checkStakingIntentDeclaredEvent = (event, _uuid, _staker, _staker assert.equal(event.args._uuid, _uuid); assert.equal(event.args._staker, _staker); assert.equal(event.args._stakerNonce.toNumber(), _stakerNonce.toNumber()); + assert.equal(event.args._hashIntentKey, _hashIntentKey); assert.equal(event.args._beneficiary, _beneficiary); assert.equal(event.args._amountST.toNumber(), _amountST.toNumber()); assert.equal(event.args._amountUT.toNumber(), _amountUT.toNumber()); diff --git a/test/Protocol.js b/test/Protocol.js index 566a1c49..d47d7948 100644 --- a/test/Protocol.js +++ b/test/Protocol.js @@ -94,6 +94,7 @@ contract('OpenST', function(accounts) { var nonceBT = null; var uuidSTP = null; var nonceSTP = null; + var hashIntentKey = null; var stakingIntentHash = null; var unlockHeight = null; var redemptionIntentHash = null; @@ -176,6 +177,8 @@ contract('OpenST', function(accounts) { utils.logResponse(o, "OpenSTValue.stake"); openSTValueUtils.checkStakingIntentDeclaredEventProtocol(o.logs[0], uuidSTP, stakerVC, nonceSTP, beneficiary, AMOUNT_ST, AMOUNT_ST, CHAINID_UTILITY); + + hashIntentKey = o.logs[0].args._hashIntentKey; stakingIntentHash = o.logs[0].args._stakingIntentHash; unlockHeight = o.logs[0].args._unlockHeight; }); @@ -298,6 +301,7 @@ contract('OpenST', function(accounts) { openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + hashIntentKey = stakeResult.logs[0].args._hashIntentKey; stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; unlockHeight = stakeResult.logs[0].args._unlockHeight; nonceBT = stakeResult.logs[0].args._stakerNonce; @@ -537,6 +541,7 @@ contract('OpenST', function(accounts) { openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + hashIntentKey = stakeResult.logs[0].args._hashIntentKey; stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; }); @@ -580,6 +585,7 @@ contract('OpenST', function(accounts) { openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + hashIntentKey = stakeResult.logs[0].args._hashIntentKey; stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; unlockHeight = stakeResult.logs[0].args._unlockHeight; nonceBT = stakeResult.logs[0].args._stakerNonce; @@ -667,6 +673,7 @@ contract('OpenST', function(accounts) { openSTValueUtils.checkStakingIntentDeclaredEventProtocol(stakeResult.logs[0], registeredBrandedTokenUuid, stakerVC, nonceBT, beneficiary, AMOUNT_ST, AMOUNT_BT, CHAINID_UTILITY); + hashIntentKey = stakeResult.logs[0].args._hashIntentKey; stakingIntentHash = stakeResult.logs[0].args._stakingIntentHash; unlockHeight = stakeResult.logs[0].args._unlockHeight; nonceBT = stakeResult.logs[0].args._stakerNonce; From 388e14ba590e246e56972aefb60d59102314d365 Mon Sep 17 00:00:00 2001 From: Pranay Valson Date: Fri, 22 Jun 2018 18:27:38 +0200 Subject: [PATCH 0144/1361] contracts: renames hashIntentKey to intentKeyHash --- contracts/OpenSTValue.sol | 8 ++++---- test/OpenSTValue.js | 22 ++++++++++++---------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index d58580d8..8ccd6925 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -44,7 +44,7 @@ contract OpenSTValue is OpsManaged, Hasher { uint256 _chainIdUtility, address indexed _stakingAccount); event StakingIntentDeclared(bytes32 indexed _uuid, address indexed _staker, - uint256 _stakerNonce, bytes32 _hashIntentKey, address _beneficiary, uint256 _amountST, + uint256 _stakerNonce, bytes32 _intentKeyHash, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _unlockHeight, bytes32 _stakingIntentHash, uint256 _chainIdUtility); @@ -226,10 +226,10 @@ contract OpenSTValue is OpsManaged, Hasher { // store the staking intent hash directly in storage of OpenSTValue // so that a Merkle proof can be generated for active staking intents - _hashIntentKey = hashIntentKey(_staker, nonce); - intents[_hashIntentKey] = stakingIntentHash; + bytes32 intentKeyHash = hashIntentKey(_staker, nonce); + intents[intentKeyHash] = stakingIntentHash; - emit StakingIntentDeclared(_uuid, _staker, nonce, _hashIntentKey, _beneficiary, + emit StakingIntentDeclared(_uuid, _staker, nonce, intentKeyHash, _beneficiary, _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); return (amountUT, nonce, unlockHeight, stakingIntentHash); diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index 9a58fb6c..ab1927d0 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -103,16 +103,18 @@ contract('OpenSTValue', function(accounts) { const conversionRateDecimals = 5; const conversionRate = new BigNumber(10 * 10**conversionRateDecimals); // conversion rate => 10 - var valueToken = null; - var openSTValue = null; - var core = null; - var checkUuid = null; - var result = null; - var hasher = null; - var stakingIntentHash = null; - var hashIntentKey = null; - var stake = null; - var nonce = null; + var valueToken = null + , openSTValue = null + , core = null + , checkUuid = null + ,result = null + , hasher = null + , stakingIntentHash + , hashIntentKey = null; + , stake = null + , nonce = null + , workers = null + ; describe('Properties', async () => { before(async () => { From bba9d8671ea67e2f38b585391a3a6251b7f73c88 Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Mon, 25 Jun 2018 11:34:23 +0530 Subject: [PATCH 0145/1361] Removed unwanted code.gulshan/MOSA-49 --- package.json | 3 +-- test/OpenSTUtility.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index a560d131..453afea2 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,7 @@ "devDependencies": { "truffle": "^4.1.8", "ganache-cli": "^6.1.0", - "abi-decoder": "^1.0.9", - "ethereumjs-testrpc": "^6.0.3" + "abi-decoder": "^1.0.9" }, "author": "OpenST Foundation Ltd.", "license": "Apache v2.0" diff --git a/test/OpenSTUtility.js b/test/OpenSTUtility.js index 690e02e6..abe9b460 100644 --- a/test/OpenSTUtility.js +++ b/test/OpenSTUtility.js @@ -359,7 +359,7 @@ contract('OpenSTUtility', function(accounts) { it('successfully redeems', async () => { var redeemReturns = await openSTUtility.redeem.call(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); - // call block number is one less than send block number + unlockHeight = redeemReturns[0]; var checkRedemptionIntentHash = await openSTUtility.hashRedemptionIntent.call(checkBtUuid, accounts[0], 2, redeemBeneficiary, redeemAmountUT, unlockHeight, lockR.l); result = await openSTUtility.redeem(checkBtUuid, redeemAmountUT, 2, redeemBeneficiary, lockR.l, { from: redeemer }); From 6d813dc2df435e0844655bce75c521153496d58e Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 25 Jun 2018 17:03:08 +0530 Subject: [PATCH 0146/1361] updated OpenSTMock and initial test changes. MOSA-68 --- contracts/OpenSTValue.sol | 22 ++++------------- contracts/OpenSTValueMock.sol | 31 ++++++++++++++++++++++++ test/OpenSTValue.js | 45 ++++++++++++++++++++--------------- 3 files changed, 62 insertions(+), 36 deletions(-) diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol index eced639c..16ef1a4f 100644 --- a/contracts/OpenSTValue.sol +++ b/contracts/OpenSTValue.sol @@ -320,7 +320,8 @@ contract OpenSTValue is OpsManaged, Hasher, Util { // utility chain require(_redemptionUnlockHeight > 0); - require(validateAndIncrementNonce(_redeemer, _redeemerNonce)); + require(nonces[_redeemer] + 1 == _redeemerNonce); + nonces[_redeemer]++; bytes32 redemptionIntentHash = hashRedemptionIntent( _uuid, @@ -365,18 +366,6 @@ contract OpenSTValue is OpsManaged, Hasher, Util { return (amountST, expirationHeight); } - function validateAndIncrementNonce( - address _accountAddress, - uint256 _accountNonce) - internal - returns (bool) - { - require(_accountAddress != address(0)); - require(nonces[_accountAddress] + 1 == _accountNonce); - nonces[_accountAddress]++; - return true; - } - function verifyIntentStorage( bytes32 _uuid, address _redeemer, @@ -388,11 +377,9 @@ contract OpenSTValue is OpsManaged, Hasher, Util { view returns (bool) { - require(utilityTokens[_uuid].simpleStake != address(0)); - require(_redeemer != address(0)); - require(_redemptionIntentHash != bytes32(0)); - bytes32 storageRoot = CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoot(_blockHeight); + require(storageRoot != bytes32(0)); + require(OpenSTUtils.verifyIntentStorage( INTENT_INDEX, _redeemer, @@ -400,6 +387,7 @@ contract OpenSTValue is OpsManaged, Hasher, Util { storageRoot, _redemptionIntentHash, _rlpParentNodes)); + return true; } diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol index 0812e7aa..f35058ed 100644 --- a/contracts/OpenSTValueMock.sol +++ b/contracts/OpenSTValueMock.sol @@ -46,4 +46,35 @@ contract OpenSTValueMock is OpenSTValue { function blocksToWaitShort() public pure returns (uint256) { return BLOCKS_TO_WAIT_SHORT; } + + function verifyIntentStorage( + bytes32 _uuid, + address _redeemer, + uint256 _redeemerNonce, + uint256 _blockHeight, + bytes32 _redemptionIntentHash, + bytes _rlpParentNodes) + internal + view + returns (bool) + { + bytes memory mockedValidValue = bytes32ToBytes(keccak256(1)); + return (keccak256(mockedValidValue) == keccak256(_rlpParentNodes)); + } + + // mock function for testing only + function getMockRLPParentNodes( + bool isValid) + external + view + returns (bytes /* mock RLP encoded parent nodes*/) + { + if(isValid) { + bytes memory mockedValidValue = bytes32ToBytes(keccak256(1)); + return mockedValidValue; + } + bytes memory mockedInvalidValue = bytes32ToBytes(keccak256(0)); + return mockedInvalidValue; + } + } \ No newline at end of file diff --git a/test/OpenSTValue.js b/test/OpenSTValue.js index e7949d2d..a2233122 100644 --- a/test/OpenSTValue.js +++ b/test/OpenSTValue.js @@ -113,6 +113,8 @@ contract('OpenSTValue', function(accounts) { , stake = null , nonce = null , workers = null + , validRLPParentNodes = null + , invalidRLPParentNodes = null; ; describe('Properties', async () => { @@ -361,50 +363,52 @@ contract('OpenSTValue', function(accounts) { result = await openSTValue.registerUtilityToken(symbol, name, conversionRate, conversionRateDecimals, chainIdRemote, 0, checkUuid, { from: registrar }); stake = result.logs[0].args.stake; nonce = await openSTValue.getNextNonce.call(redeemer); + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + invalidRLPParentNodes = await openSTValue.getMockRLPParentNodes(false); }) it('fails to confirm by non-registrar', async () => { redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: accounts[0] })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: accounts[0] })); }) it('fails to confirm when utility token does not have a simpleStake address', async () => { // Recalculate hash to confirm that it is not the error redemptionIntentHash = await openSTValue.hashRedemptionIntent.call("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent("bad UUID", redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) it('fails to confirm when amountUT is not > 0', async () => { // Recalculate hash to confirm that it is not the error redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight, lockR.l); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 0, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) it('fails to confirm when redemptionUnlockHeight is not > 0', async () => { // Recalculate hash to confirm that it is not the error redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0, lockR.l); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0, lockR.l, redemptionIntentHash, { from: registrar })); - }) - - it('fails to confirm when redemptionIntentHash is empty', async () => { - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, "", { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, 0, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) it('fails to confirm when nonce is not exactly 1 greater than previously', async () => { // Recalculate hash to confirm that it is not the error redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) - it('fails to confirm when redemptionIntentHash does not match calculated hash', async () => { - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, "bad hash", { from: registrar })); + it('fails to confirm when input params does not yeild match for redemptionIntentHash', async () => { + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(2), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) it('fails to confirm when token balance of stake is not >= amountST', async () => { redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) + it('fails to confirm when RLPParentNodes are invalid', async () => { + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce.minus(1), redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, invalidRLPParentNodes, { from: registrar })); + }) + it('successfully confirms', async () => { await valueToken.approve(openSTValue.address, 2, { from: accounts[0] }); result = await openSTValue.stake(checkUuid, 2, accounts[0], lock.l, accounts[0], { from: accounts[0] }); @@ -412,11 +416,11 @@ contract('OpenSTValue', function(accounts) { await openSTValue.processStaking(stakingIntentHash, lock.s, { from: accounts[0] }); redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - var confirmReturns = await openSTValue.confirmRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }) + var confirmReturns = await openSTValue.confirmRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar }) var amountST = confirmReturns[0]; assert.equal(amountST, (amountUT / conversionRate)*10**conversionRateDecimals); - result = await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); + result = await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar }); var blocks_to_wait_short = await openSTValue.blocksToWaitShort.call(); var blockNumber = web3.eth.blockNumber; @@ -427,7 +431,7 @@ contract('OpenSTValue', function(accounts) { it('fails to confirm a replay', async () => { redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) // Fails because logic does not prevent attempting to redeem 1 UTWei when the conversion rate is greater than 1 @@ -436,7 +440,7 @@ contract('OpenSTValue', function(accounts) { // 1 STWei == 10 UTWei at the given conversion rate redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight, lockR.l); - await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar })); + await Utils.expectThrow(openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, 1, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar })); }) }) @@ -456,6 +460,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); @@ -467,7 +472,7 @@ contract('OpenSTValue', function(accounts) { stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, lock.s,{ from: accounts[0] }); redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar }); }) it('fails to process when redemptionIntentHash is empty', async () => { @@ -655,6 +660,7 @@ contract('OpenSTValue', function(accounts) { contracts = await OpenSTValue_utils.deployOpenSTValue(artifacts, accounts); valueToken = contracts.valueToken; openSTValue = contracts.openSTValue; + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); core = await Core.new(registrar, chainIdValue, chainIdRemote, openSTRemote, workers.address); await openSTValue.addCore(core.address, { from: registrar }); checkUuid = await openSTValue.hashUuid.call(symbol, name, chainIdValue, chainIdRemote, openSTRemote, conversionRate, conversionRateDecimals); @@ -666,7 +672,7 @@ contract('OpenSTValue', function(accounts) { stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar }); }); @@ -728,7 +734,8 @@ contract('OpenSTValue', function(accounts) { stakingIntentHash = result.logs[0].args._stakingIntentHash; await openSTValue.processStaking(stakingIntentHash, lock.s, { from: staker }); redemptionIntentHash = await openSTValue.hashRedemptionIntent.call(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l); - await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, redemptionIntentHash, { from: registrar }); + validRLPParentNodes = await openSTValue.getMockRLPParentNodes(true); + await openSTValue.confirmRedemptionIntent(checkUuid, redeemer, nonce, redeemBeneficiary, amountUT, redemptionUnlockHeight, lockR.l, 0, validRLPParentNodes, { from: registrar }); // Successfull ProcessUnstaking From 5daae17ac8ab6aec114f6af177bb61f19ea0448c Mon Sep 17 00:00:00 2001 From: Gulshan Vasnani Date: Mon, 25 Jun 2018 17:18:28 +0530 Subject: [PATCH 0147/1361] initial commit --- .gitignore | 28 + .travis.yml | 27 + CHANGELOG.md | 82 + LICENSE | 201 + README.md | 68 + VERSION.md | 1 + Vagrantfile | 67 + contracts/BrandedToken.sol | 106 + contracts/BytesLib.sol | 174 + contracts/Core.sol | 292 + contracts/CoreInterface.sol | 50 + contracts/EIP20Interface.sol | 47 + contracts/EIP20Token.sol | 132 + contracts/EIP20TokenMock.sol | 66 + contracts/Gate.sol | 305 + contracts/Hasher.sol | 108 + contracts/MerklePatriciaProof.sol | 198 + contracts/OpenSTUtility.sol | 683 ++ contracts/OpenSTUtilityInterface.sol | 81 + contracts/OpenSTUtilityMock.sol | 49 + contracts/OpenSTUtils.sol | 51 + contracts/OpenSTValue.sol | 620 ++ contracts/OpenSTValueInterface.sol | 118 + contracts/OpenSTValueMock.sol | 49 + contracts/OpsManaged.sol | 112 + contracts/Owned.sol | 74 + contracts/ProofUtil.sol | 33 + contracts/ProtocolVersioned.sol | 149 + contracts/ProtocolVersionedMock.sol | 41 + contracts/RLP.sol | 401 + contracts/RLPEncode.sol | 77 + contracts/Registrar.sol | 210 + contracts/STPrime.sol | 154 + contracts/STPrimeConfig.sol | 36 + contracts/SafeMath.sol | 67 + contracts/SafeMathMock.sol | 45 + contracts/SimpleStake.sol | 100 + contracts/SimpleToken/ERC20Interface.sol | 34 + contracts/SimpleToken/ERC20Token.sol | 111 + contracts/SimpleToken/MockToken.sol | 44 + contracts/SimpleToken/OpsManaged.sol | 112 + contracts/SimpleToken/Owned.sol | 62 + contracts/SimpleToken/README.md | 3 + contracts/SimpleToken/SafeMath.sol | 52 + contracts/SimpleToken/SimpleToken.sol | 107 + contracts/SimpleToken/SimpleTokenConfig.sol | 21 + contracts/UtilityTokenAbstract.sol | 221 + contracts/UtilityTokenAbstractMock.sol | 101 + contracts/UtilityTokenInterface.sol | 43 + contracts/Workers.sol | 151 + contracts/WorkersInterface.sol | 66 + contracts/compile.sh | 16 + contracts/truffle/Migrations.sol | 23 + contracts/util.sol | 210 + dev/local-poa-geth.sh | 24 + docs/OpenSTwp.pdf | Bin 0 -> 883918 bytes docs/diagrams/v092/stakemintv092.png | Bin 0 -> 454975 bytes .../diagrams/v093/stakemint/stakemintv093.pdf | Bin 0 -> 96457 bytes .../diagrams/v093/stakemint/stakemintv093.tex | 342 + docs/json/BrandedToken.json | 111 + docs/json/Core.json | 18 + docs/json/CoreInterface.json | 19 + docs/json/EIP20Interface.json | 63 + docs/json/EIP20Token.json | 62 + docs/json/EIP20TokenMock.json | 83 + docs/json/Hasher.json | 43 + docs/json/OpenSTUtility.json | 176 + docs/json/OpenSTUtilityInterface.json | 39 + docs/json/OpenSTValue.json | 172 + docs/json/OpenSTValueInterface.json | 45 + docs/json/OpsManaged.json | 31 + docs/json/Owned.json | 18 + docs/json/ProtocolVersioned.json | 22 + docs/json/Registrar.json | 109 + docs/json/STPrime.json | 61 + docs/json/SimpleStake.json | 34 + docs/json/UtilityTokenAbstract.json | 59 + docs/json/UtilityTokenAbstractMock.json | 82 + docs/json/UtilityTokenInterface.json | 38 + docs/md/BrandedToken.md | 29 + docs/md/Core.md | 15 + docs/md/CoreInterface.md | 15 + docs/md/EIP20Interface.md | 21 + docs/md/EIP20Token.md | 21 + docs/md/EIP20TokenMock.md | 24 + docs/md/Hasher.md | 15 + docs/md/OpenSTUtility.md | 32 + docs/md/OpenSTUtilityInterface.md | 15 + docs/md/OpenSTValue.md | 34 + docs/md/OpenSTValueInterface.md | 16 + docs/md/OpsManaged.md | 16 + docs/md/Owned.md | 14 + docs/md/ProtocolVersioned.md | 15 + docs/md/Registrar.md | 23 + docs/md/STPrime.md | 22 + docs/md/SimpleStake.md | 17 + docs/md/UtilityTokenAbstract.md | 21 + docs/md/UtilityTokenAbstractMock.md | 24 + docs/md/UtilityTokenInterface.md | 17 + docs/protocol.png | Bin 0 -> 289103 bytes migrations/1_initial_migration.js | 5 + migrations/_2_deploy_contracts.js | 5 + package-lock.json | 9769 +++++++++++++++++ package.json | 22 + test/BrandedToken.js | 119 + test/BrandedToken_utils.js | 44 + test/ContractStructureTest.js | 99 + test/Core.js | 56 + test/Core_utils.js | 56 + test/EIP20Token_protocol_extensions.js | 114 + test/EIP20Token_utils.js | 80 + test/Gate.js | 693 ++ test/Gate_utils.js | 169 + test/MockToken.js | 65 + test/OpenSTUtility.js | 716 ++ test/OpenSTUtility_utils.js | 234 + test/OpenSTValue.js | 757 ++ test/OpenSTValue_utils.js | 278 + test/OpsManaged.js | 162 + test/OpsManaged_utils.js | 38 + test/Owned.js | 140 + test/Owned_utils.js | 37 + test/Protocol.js | 1035 ++ test/ProtocolVersioned.js | 177 + test/ProtocolVersioned_utils.js | 53 + test/Protocol_utils.js | 132 + test/Registrar.js | 236 + test/Registrar_utils.js | 71 + test/STPrime.js | 136 + test/STPrime_utils.js | 48 + test/SafeMath.js | 80 + test/SimpleStake.js | 90 + test/SimpleStake_integrated.js | 138 + test/SimpleStake_utils.js | 81 + test/SimpleToken.js | 478 + test/SimpleToken_utils.js | 54 + test/UtilityTokenAbstract.js | 205 + test/UtilityTokenAbstract_utils.js | 85 + test/lib/event_decoder.js | 89 + test/lib/hash_lock.js | 32 + test/lib/utils.js | 139 + tools/runTestRpc.sh | 2 + truffle.js | 18 + truffle/contracts/ConvertLib.sol | 8 + truffle/contracts/MetaCoin.sol | 34 + truffle/contracts/Migrations.sol | 23 + truffle/test/TestMetacoin.sol | 25 + truffle/test/metacoin.js | 63 + 148 files changed, 25726 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 VERSION.md create mode 100644 Vagrantfile create mode 100644 contracts/BrandedToken.sol create mode 100644 contracts/BytesLib.sol create mode 100644 contracts/Core.sol create mode 100644 contracts/CoreInterface.sol create mode 100644 contracts/EIP20Interface.sol create mode 100644 contracts/EIP20Token.sol create mode 100644 contracts/EIP20TokenMock.sol create mode 100644 contracts/Gate.sol create mode 100644 contracts/Hasher.sol create mode 100644 contracts/MerklePatriciaProof.sol create mode 100644 contracts/OpenSTUtility.sol create mode 100644 contracts/OpenSTUtilityInterface.sol create mode 100644 contracts/OpenSTUtilityMock.sol create mode 100644 contracts/OpenSTUtils.sol create mode 100644 contracts/OpenSTValue.sol create mode 100644 contracts/OpenSTValueInterface.sol create mode 100644 contracts/OpenSTValueMock.sol create mode 100644 contracts/OpsManaged.sol create mode 100644 contracts/Owned.sol create mode 100644 contracts/ProofUtil.sol create mode 100644 contracts/ProtocolVersioned.sol create mode 100644 contracts/ProtocolVersionedMock.sol create mode 100644 contracts/RLP.sol create mode 100644 contracts/RLPEncode.sol create mode 100644 contracts/Registrar.sol create mode 100644 contracts/STPrime.sol create mode 100644 contracts/STPrimeConfig.sol create mode 100644 contracts/SafeMath.sol create mode 100644 contracts/SafeMathMock.sol create mode 100644 contracts/SimpleStake.sol create mode 100644 contracts/SimpleToken/ERC20Interface.sol create mode 100644 contracts/SimpleToken/ERC20Token.sol create mode 100644 contracts/SimpleToken/MockToken.sol create mode 100644 contracts/SimpleToken/OpsManaged.sol create mode 100644 contracts/SimpleToken/Owned.sol create mode 100644 contracts/SimpleToken/README.md create mode 100644 contracts/SimpleToken/SafeMath.sol create mode 100644 contracts/SimpleToken/SimpleToken.sol create mode 100644 contracts/SimpleToken/SimpleTokenConfig.sol create mode 100644 contracts/UtilityTokenAbstract.sol create mode 100644 contracts/UtilityTokenAbstractMock.sol create mode 100644 contracts/UtilityTokenInterface.sol create mode 100644 contracts/Workers.sol create mode 100644 contracts/WorkersInterface.sol create mode 100644 contracts/compile.sh create mode 100644 contracts/truffle/Migrations.sol create mode 100644 contracts/util.sol create mode 100644 dev/local-poa-geth.sh create mode 100644 docs/OpenSTwp.pdf create mode 100644 docs/diagrams/v092/stakemintv092.png create mode 100644 docs/diagrams/v093/stakemint/stakemintv093.pdf create mode 100644 docs/diagrams/v093/stakemint/stakemintv093.tex create mode 100644 docs/json/BrandedToken.json create mode 100644 docs/json/Core.json create mode 100644 docs/json/CoreInterface.json create mode 100644 docs/json/EIP20Interface.json create mode 100644 docs/json/EIP20Token.json create mode 100644 docs/json/EIP20TokenMock.json create mode 100644 docs/json/Hasher.json create mode 100644 docs/json/OpenSTUtility.json create mode 100644 docs/json/OpenSTUtilityInterface.json create mode 100644 docs/json/OpenSTValue.json create mode 100644 docs/json/OpenSTValueInterface.json create mode 100644 docs/json/OpsManaged.json create mode 100644 docs/json/Owned.json create mode 100644 docs/json/ProtocolVersioned.json create mode 100644 docs/json/Registrar.json create mode 100644 docs/json/STPrime.json create mode 100644 docs/json/SimpleStake.json create mode 100644 docs/json/UtilityTokenAbstract.json create mode 100644 docs/json/UtilityTokenAbstractMock.json create mode 100644 docs/json/UtilityTokenInterface.json create mode 100644 docs/md/BrandedToken.md create mode 100644 docs/md/Core.md create mode 100644 docs/md/CoreInterface.md create mode 100644 docs/md/EIP20Interface.md create mode 100644 docs/md/EIP20Token.md create mode 100644 docs/md/EIP20TokenMock.md create mode 100644 docs/md/Hasher.md create mode 100644 docs/md/OpenSTUtility.md create mode 100644 docs/md/OpenSTUtilityInterface.md create mode 100644 docs/md/OpenSTValue.md create mode 100644 docs/md/OpenSTValueInterface.md create mode 100644 docs/md/OpsManaged.md create mode 100644 docs/md/Owned.md create mode 100644 docs/md/ProtocolVersioned.md create mode 100644 docs/md/Registrar.md create mode 100644 docs/md/STPrime.md create mode 100644 docs/md/SimpleStake.md create mode 100644 docs/md/UtilityTokenAbstract.md create mode 100644 docs/md/UtilityTokenAbstractMock.md create mode 100644 docs/md/UtilityTokenInterface.md create mode 100644 docs/protocol.png create mode 100644 migrations/1_initial_migration.js create mode 100644 migrations/_2_deploy_contracts.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 test/BrandedToken.js create mode 100644 test/BrandedToken_utils.js create mode 100644 test/ContractStructureTest.js create mode 100644 test/Core.js create mode 100644 test/Core_utils.js create mode 100644 test/EIP20Token_protocol_extensions.js create mode 100644 test/EIP20Token_utils.js create mode 100644 test/Gate.js create mode 100644 test/Gate_utils.js create mode 100644 test/MockToken.js create mode 100644 test/OpenSTUtility.js create mode 100644 test/OpenSTUtility_utils.js create mode 100644 test/OpenSTValue.js create mode 100644 test/OpenSTValue_utils.js create mode 100644 test/OpsManaged.js create mode 100644 test/OpsManaged_utils.js create mode 100644 test/Owned.js create mode 100644 test/Owned_utils.js create mode 100644 test/Protocol.js create mode 100644 test/ProtocolVersioned.js create mode 100644 test/ProtocolVersioned_utils.js create mode 100644 test/Protocol_utils.js create mode 100644 test/Registrar.js create mode 100644 test/Registrar_utils.js create mode 100644 test/STPrime.js create mode 100644 test/STPrime_utils.js create mode 100644 test/SafeMath.js create mode 100644 test/SimpleStake.js create mode 100644 test/SimpleStake_integrated.js create mode 100644 test/SimpleStake_utils.js create mode 100644 test/SimpleToken.js create mode 100644 test/SimpleToken_utils.js create mode 100644 test/UtilityTokenAbstract.js create mode 100644 test/UtilityTokenAbstract_utils.js create mode 100644 test/lib/event_decoder.js create mode 100644 test/lib/hash_lock.js create mode 100644 test/lib/utils.js create mode 100755 tools/runTestRpc.sh create mode 100644 truffle.js create mode 100644 truffle/contracts/ConvertLib.sol create mode 100644 truffle/contracts/MetaCoin.sol create mode 100644 truffle/contracts/Migrations.sol create mode 100644 truffle/test/TestMetacoin.sol create mode 100644 truffle/test/metacoin.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ed10e4de --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# OSX +.DS_Store + +# Vagrant +.vagrant/ +ubuntu-xenial-16.04-cloudimg-console.log + +# don't commit contract binaries in protocol +# we do commit the contract binaries in platform +contracts/bin/ +contracts/abi/ + +# don't commit node_modules +node_modules + +#Dont track idea file +.idea/ + +# LaTeX auxiliary files +*.aux +*.log +## Build tool auxiliary files: +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..8fc288c4 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,27 @@ +dist: trusty +language: node_js +sudo: required +branches: + only: + - master + - develop +notifications: + email: + recipients: + - ci.report@ost.com + on_success: always + on_failure: always +node_js: + - "8" +before_install: + - sudo apt-get update + - sudo apt-get install nodejs + - sudo apt-get install npm +install: + - npm install +before_script: + - nohup ./tools/runTestRpc.sh /dev/null 2>&1 & +script: + - truffle test +after_script: + - kill $(ps aux | grep 'testrpc' | awk '{print $2}') diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..c87591f7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,82 @@ +## OpenST-protocol [v0.9.2](https://github.com/OpenSTFoundation/openst-protocol/releases/tag/v0.9.2) March 27 2018 + +OpenST v0.9.2 improves usability to facilitate application by the [OpenST-Platform](https://github.com/OpenSTFoundation/openst-platform) and other services. Additionally, this release increases test coverage, with additional unit and integration tests, and adds continuous integration with Travis CI. + +Detailed changelog: + +- Introduce `conversionRateDecimals` to `BrandedToken` to treat conversion rate as a fixed point arithmetic number ([openst-protocol #107](https://github.com/OpenSTFoundation/openst-protocol/pull/107)) +- Expose list of registered tokens on `OpenSTUtility` ([openst-protocol #89](https://github.com/OpenSTFoundation/openst-protocol/pull/89)) +- Make token UUIDs iterable on the value chain ([openst-protocol #103](https://github.com/OpenSTFoundation/openst-protocol/pull/103)) +- Make token UUIDs iterable on the utility chain ([openst-protocol #102](https://github.com/OpenSTFoundation/openst-protocol/pull/102)) +- Incorporate a `beneficiary` into redeem and unstake ([openst-protocol #101](https://github.com/OpenSTFoundation/openst-protocol/pull/101)) +- Expose `mints` and `redemptions` on `OpenSTUtility` ([openst-protocol #100](https://github.com/OpenSTFoundation/openst-protocol/pull/100)) +- Expose `stakes` and `unstakes` on `OpenSTValue` ([openst-protocol #99](https://github.com/OpenSTFoundation/openst-protocol/pull/99)) +- Revise `UtilityTokenAbstract` to set certain invariants upon construction and to expose them ([openst-protocol #97](https://github.com/OpenSTFoundation/openst-protocol/pull/97)) +- Remove unneeded files ([openst-protocol #93](https://github.com/OpenSTFoundation/openst-protocol/pull/93)) +- Tests: configure Travis CI to run unit tests on `master` and `develop` branches for every commit, merge and pull request ([openst-protocol #87](https://github.com/OpenSTFoundation/openst-protocol/pull/87), [openst-protocol #105](https://github.com/OpenSTFoundation/openst-protocol/pull/105)) +- Tests: denominate tokens consistently ([openst-protocol #82](https://github.com/OpenSTFoundation/openst-protocol/pull/82)) +- Tests: add unit tests for reversion functions ([openst-protocol #74](https://github.com/OpenSTFoundation/openst-protocol/pull/74)) +- Tests: migrate unit tests for `Owned`, `OpsManaged`, and `SafeMath` from SimpleTokenSale repo ([openst-protocol #73](https://github.com/OpenSTFoundation/openst-protocol/pull/73)) +- Tests: add integration tests for reversion functions ([openst-protocol #65](https://github.com/OpenSTFoundation/openst-protocol/pull/65)) + +## OpenST-protocol [v0.9.1](https://github.com/OpenSTFoundation/openst-protocol/releases/tag/v0.9.1) December 19 2017 + +OpenST v0.9.1 is the first release deployed on Ethereum mainnet combined with the +activation of Simple Token to power the OpenST platform. The OpenST platform +allows Ethereum smart contracts to runs faster and cheaper while leveraging +the security properties of Ethereum's Proof-of-Work. In this release we implement +the first corner stone of the protocol: the ability to stake value on Ethereum +mainnet and mint a new representation of that value on a utility chain, +effectively increasing the computational throughput of Ethereum smart contracts +by allowing parallel execution across chains. + +OpenST smart contracts have been restructured to store value separately from +the logic that implements the protocol. v0.9.1 is not yet protocol complete +as the validators are whitelisted and not yet open with stake put forward on +Ethereum mainnet. However, by splitting the protocol implementation into +these two logically separate problems, we can already start working with +member companies and developers to fine-tune the APIs and the developer +experience to build mainstream applications on Ethereum. + +``` + Ethereum mainnet (value) | OpenST platform (utility) + --------------------------------------------------------------------- + Core - - - - - - - - - - - (Core) + / | \ + / | \ + Registrar | Registrar + | | | + OpenSTValue | OpenSTUtility + \_ SimpleStake | \_ UtilityTokenAbstract + | \_ SimpleTokenPrime (base token) + | \_ BrandedToken +``` + +Detailed changelog: + +- Generate documentation in /docs ([openst-protocol#78](https://github.com/OpenSTFoundation/openst-protocol/pull/78)) +- Unit tests for Owned, OpsManaged, SafeMath (carry over from SimpleTokenSale) ([openst-protocol#73](https://github.com/OpenSTFoundation/openst-protocol/pull/73)) +- Add mock ERC20 token for dryrun on Ethereum mainnet ([openst-protocol#71](https://github.com/OpenSTFoundation/openst-protocol/pull/71)) +- Unit tests for protocol transfer ([openst-protocol#66](https://github.com/OpenSTFoundation/openst-protocol/pull/66)) +- Integration tests for reverting stake and redemption ([openst-protocol#65](https://github.com/OpenSTFoundation/openst-protocol/pull/65)) +- Bug fix revert unstaking was restricted to registrar only ([openst-protocol#64](https://github.com/OpenSTFoundation/openst-protocol/pull/64)) +- Implement fallback for process staking and process redemption ([openst-protocol#60](https://github.com/OpenSTFoundation/openst-protocol/pull/60)) +- Bug fix on reverted redemption allow re-use of nonce ([openst-protocol#59](https://github.com/OpenSTFoundation/openst-protocol/pull/59)) +- Initiate and revoke protocol transfer ([openst-protocol#55](https://github.com/OpenSTFoundation/openst-protocol/pull/55)) +- Run Truffle tests with optimised compilation to accurately measure gas usage ([openst-protocol#54](https://github.com/OpenSTFoundation/openst-protocol/pull/54)) +- Integration tests improvement on event assertion ([openst-protocol#47](https://github.com/OpenSTFoundation/openst-protocol/pull/47)) +- Allow reverting escrow after unlock height ([openst-protocol#46](https://github.com/OpenSTFoundation/openst-protocol/pull/46)) +- Set minimal redemption accuracy ([openst-protocol#41](https://github.com/OpenSTFoundation/openst-protocol/pull/41)), ([openst-protocol#38](https://github.com/OpenSTFoundation/openst-protocol/pull/38)) +- Integration test framework for staking ([openst-protocol#37](https://github.com/OpenSTFoundation/openst-protocol/pull/37)) +- Increase unit test coverage for Registrar, OpenSTValue, and OpenSTUtility ([openst-protocol#35](https://github.com/OpenSTFoundation/openst-protocol/pull/35)) +- Bug fix in OpenSTUtility.processRedeeming ([openst-protocol#33](https://github.com/OpenSTFoundation/openst-protocol/pull/33)) +- Correct assertion bug on OpenSTValue.processStaking ([openst-protocol#18](https://github.com/OpenSTFoundation/openst-protocol/pull/18)) +- Complete separation of value and logic for redemption process ([openst-protocol#11](https://github.com/OpenSTFoundation/openst-protocol/pull/11)), ([openst-protocol#12](https://github.com/OpenSTFoundation/openst-protocol/pull/12)), ([openst-protocol#13](https://github.com/OpenSTFoundation/openst-protocol/pull/13)) +- Unit tests for ProtocolVersioned, SimpleStake, BrandedToken, EIP20Token, STPrime, and UtilityTokenAbstract ([openst-protocol#9](https://github.com/OpenSTFoundation/openst-protocol/pull/9)) +- SimpleTokenPrime: add payable initialization function ([openst-protocol#7](https://github.com/OpenSTFoundation/openst-protocol/pull/7)) +- SimpleStake: separate value from logic to enable upgrade path ([openst-protocol#5](https://github.com/OpenSTFoundation/openst-protocol/pull/1)) + + +## OpenST-protocol [v0.9.0](https://github.com/OpenSTFoundation/openst-protocol/releases/tag/v0.9.0) November 8 2017 + + - update OpenST-protocol with work done on Ropsten demo ([openst-protocol#1](https://github.com/OpenSTFoundation/openst-protocol/pull/1)) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 00000000..79760aa2 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# [OpenST protocol](https://simpletoken.org) - staking value for utility + +[![Gitter: JOIN CHAT](https://img.shields.io/badge/gitter-JOIN%20CHAT-brightgreen.svg)](https://gitter.im/OpenSTFoundation/SimpleToken) + +While OpenST 0.9 is available as-is for anyone to use, we caution that this is early stage software and under heavy ongoing development and improvement. Please report bugs and suggested improvements. + +OpenST v0.9.1 is the first release deployed on Ethereum mainnet combined with the +activation of Simple Token to power the OpenST platform. The OpenST platform +allows Ethereum smart contracts to runs faster and cheaper while leveraging +the security properties of Ethereum's Proof-of-Work. In this release we implement +the first corner stone of the protocol: the ability to stake value on Ethereum +mainnet and mint a new representation of that value on a utility chain, +effectively increasing the computational throughput of Ethereum smart contracts +by allowing parallel execution across chains. + +OpenST smart contracts have been restructured to store value separately from +the logic that implements the protocol. v0.9.1 is not yet protocol complete +as the validators are whitelisted and not yet open with stake put forward on +Ethereum mainnet. However, by splitting the protocol implementation into +these two logically separate problems, we can already start working with +member companies and developers to fine-tune the APIs and the developer +experience to build mainstream applications on Ethereum. + +``` + Ethereum mainnet (value) | OpenST platform (utility) + --------------------------------------------------------------------- + Core - - - - - - - - - - - (Core) + / | \ + / | \ + Registrar | Registrar + | | | + OpenSTValue | OpenSTUtility + \_ SimpleStake | \_ UtilityTokenAbstract + | \_ SimpleTokenPrime (base token) + | \_ BrandedToken +``` + +Watch demo video of milestone 1 (v0.9.0 - will take you to [https://www.youtube.com/watch?v=-SxJ8c1Xh_A](https://www.youtube.com/watch?v=-SxJ8c1Xh_A)) + +[![Milestone 1 demo video](https://img.youtube.com/vi/-SxJ8c1Xh_A/0.jpg)](https://www.youtube.com/watch?v=-SxJ8c1Xh_A) + +## About Simple Token + +Simple Token [“ST”] is an EIP20 token and OpenST is a protocol to support token economies in mainstream consumer applications. The business and technical challenge we set out to solve is to enable mainstream consumer applications to benefit from deploying their own branded crypto-backed token economies, in a scalable and cryptographically auditable manner, without needing to mint and maintain their own publicly-tradeable EIP20 tokens. + +The OpenST protocol enables the creation of utility tokens on a utility blockchain while the value of those tokens is backed by staked crypto-assets on a value blockchain. + +The OpenST Protocol establishes a bridge between two differently purposed blockchains. A value blockchain, which is required in order to hold cryptographically secured valuable assets; and a utility blockchain, which has utility tokens in favor of which the assets are held on the value blockchain. + +## OpenST Protocol + +To mint utility tokens on a utility chain out of value staked on a value chain, or to redeem value on the value chain by redeeming ownership of utility tokens on the utility chain, the protocol needs to atomically act on two blockchains. OpenST Protocol requires a two-phased commit for either action. + +`openst-protocol` provides the smart contracts that implement the OpenST protocol which enables staking and redeeming utility tokens. For more details see the technical white paper on [simpletoken.org/documents](https://simpletoken.org/documents). + +![](docs/protocol.png) + +## Roadmap + +Milestone 1 : OpenST Platform v0.9 (7 November 2017) + +Milestone 2 : OpenST Platform v1.0 (Q1 2018) + +Milestone 3 : Public Launch of Initial Member Companies (Q2 2018) + +Milestone 4 : 10 Founding Member Companies (Q3-Q4 2018) + +Milestone 5 : Consolidation of OpenST as open platform (2019) diff --git a/VERSION.md b/VERSION.md new file mode 100644 index 00000000..f374f666 --- /dev/null +++ b/VERSION.md @@ -0,0 +1 @@ +0.9.1 diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 00000000..f579ad06 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,67 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box = "ubuntu/xenial64" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # NOTE: This will enable public access to the opened port + # config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine and only allow access + # via 127.0.0.1 to disable public access + # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider "virtualbox" do |vb| + # # Display the VirtualBox GUI when booting the machine + # vb.gui = true + # + # # Customize the amount of memory on the VM: + # vb.memory = "1024" + # end + # + # View the documentation for the provider you are using for more + # information on available options. + + # Enable provisioning with a shell script. Additional provisioners such as + # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the + # documentation for more information about their specific syntax and use. + config.vm.provision :shell, path: "dev/local-poa-geth.sh" +end diff --git a/contracts/BrandedToken.sol b/contracts/BrandedToken.sol new file mode 100644 index 00000000..94d860a6 --- /dev/null +++ b/contracts/BrandedToken.sol @@ -0,0 +1,106 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: BrandedToken +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./SafeMath.sol"; + +// utility chain contracts +import "./EIP20Token.sol"; +import "./UtilityTokenAbstract.sol"; + + +/// @dev Branded Token is an EIP20 token minted by staking Simple Token +/// on Ethereum mainnet. Branded tokens are designed to be used +/// within a (decentralised) application and support: +/// - smart contract controlled password reset for users who don't +/// yet (hard-spoon FTW) manage their own private keys (+v0.9.2) +/// - soft-exit for a user to redeem their equivalent part of the +/// Simple Token stake on Ethereum mainnet +/// - hard-exit for all users if the utility chain halts to reclaim +/// their equivalent part of the Simple Token stake +/// on Ethereum (before v1.0) +contract BrandedToken is EIP20Token, UtilityTokenAbstract { + using SafeMath for uint256; + + /* + * Public functions + */ + constructor( + bytes32 _uuid, + string _symbol, + string _name, + uint8 _decimals, + uint256 _chainIdValue, + uint256 _chainIdUtility, + uint256 _conversionRate, + uint8 _conversionRateDecimals) + public + EIP20Token(_symbol, _name, _decimals) + UtilityTokenAbstract( + _uuid, + _symbol, + _name, + _chainIdValue, + _chainIdUtility, + _conversionRate, + _conversionRateDecimals) + { } + + function claim( + address _beneficiary) + public + returns (bool /* success */) + { + uint256 amount = claimInternal(_beneficiary); + + return claimEIP20(_beneficiary, amount); + } + + function mint( + address _beneficiary, + uint256 _amount) + public + onlyProtocol + returns (bool /* success */) + { + mintEIP20(_amount); + + return mintInternal(_beneficiary, _amount); + } + + function burn( + address _burner, + uint256 _amount) + public + onlyProtocol + payable + returns (bool /* success */) + { + // force non-payable, as only ST' handles in base tokens + require(msg.value == 0); + + burnEIP20(_amount); + + return burnInternal(_burner, _amount); + } +} \ No newline at end of file diff --git a/contracts/BytesLib.sol b/contracts/BytesLib.sol new file mode 100644 index 00000000..f45705f5 --- /dev/null +++ b/contracts/BytesLib.sol @@ -0,0 +1,174 @@ +pragma solidity ^0.4.18; + +library BytesLib { + function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes) { + bytes memory tempBytes; + + assembly { + // Get a location of some free memory and store it in tempBytes as + // Solidity does for memory variables. + tempBytes := mload(0x40) + + // Store the length of the first bytes array at the beginning of + // the memory for tempBytes. + let length := mload(_preBytes) + mstore(tempBytes, length) + + // Maintain a memory counter for the current write location in the + // temp bytes array by adding the 32 bytes for the array length to + // the starting location. + let mc := add(tempBytes, 0x20) + // Stop copying when the memory counter reaches the length of the + // first bytes array. + let end := add(mc, length) + + for { + // Initialize a copy counter to the start of the _preBytes data, + // 32 bytes into its memory. + let cc := add(_preBytes, 0x20) + } lt(mc, end) { + // Increase both counters by 32 bytes each iteration. + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + // Write the _preBytes data into the tempBytes memory 32 bytes + // at a time. + mstore(mc, mload(cc)) + } + + // Add the length of _postBytes to the current length of tempBytes + // and store it as the new length in the first 32 bytes of the + // tempBytes memory. + length := mload(_postBytes) + mstore(tempBytes, add(length, mload(tempBytes))) + + // Move the memory counter back from a multiple of 0x20 to the + // actual end of the _preBytes data. + mc := end + // Stop copying when the memory counter reaches the new combined + // length of the arrays. + end := add(mc, length) + + for { + let cc := add(_postBytes, 0x20) + } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + mstore(mc, mload(cc)) + } + + // Update the free-memory pointer by padding our last write location + // to 32 bytes: add 31 bytes to the end of tempBytes to move to the + // next 32 byte block, then round down to the nearest multiple of + // 32. If the sum of the length of the two arrays is zero then add + // one before rounding down to leave a blank 32 bytes (the length block with 0). + mstore(0x40, and( + add(add(end, iszero(add(length, mload(_preBytes)))), 31), + not(31) // Round down to the nearest 32 bytes. + )) + } + + return tempBytes; + } + + function slice(bytes _bytes, uint _start, uint _length) internal pure returns (bytes) { + require(_bytes.length >= (_start + _length)); + + bytes memory tempBytes; + + assembly { + switch iszero(_length) + case 0 { + // Get a location of some free memory and store it in tempBytes as + // Solidity does for memory variables. + tempBytes := mload(0x40) + + // The first word of the slice result is potentially a partial + // word read from the original array. To read it, we calculate + // the length of that partial word and start copying that many + // bytes into the array. The first word we copy will start with + // data we don't care about, but the last `lengthmod` bytes will + // land at the beginning of the contents of the new array. When + // we're done copying, we overwrite the full first word with + // the actual length of the slice. + let lengthmod := and(_length, 31) + + // The multiplication in the next line is necessary + // because when slicing multiples of 32 bytes (lengthmod == 0) + // the following copy loop was copying the origin's length + // and then ending prematurely not copying everything it should. + let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) + let end := add(mc, _length) + + for { + // The multiplication in the next line has the same exact purpose + // as the one above. + let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) + } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + mstore(mc, mload(cc)) + } + + mstore(tempBytes, _length) + + //update free-memory pointer + //allocating the array padded to 32 bytes like the compiler does now + mstore(0x40, and(add(mc, 31), not(31))) + } + //if we want a zero-length slice let's just return a zero-length array + default { + tempBytes := mload(0x40) + + mstore(0x40, add(tempBytes, 0x20)) + } + } + + return tempBytes; + } + + // Pad a bytes array to 32 bytes + function leftPad(bytes _bytes) internal pure returns (bytes) { + bytes memory newBytes = new bytes(32 - _bytes.length); + return concat(newBytes, _bytes); + } + + function toBytes32(bytes b) internal pure returns (bytes32) { + bytes32 out; + for (uint i = 0; i < 32; i++) { + out |= bytes32(b[i] & 0xFF) >> (i * 8); + } + return out; + } + + function fromBytes32(bytes32 x) internal pure returns (bytes) { + bytes memory b = new bytes(32); + for (uint i = 0; i < 32; i++) { + b[i] = byte(uint8(uint(x) / (2**(8*(19 - i))))); + } + return b; + } + + function toUint(bytes _bytes, uint _start) internal pure returns (uint256) { + require(_bytes.length >= (_start + 32)); + uint256 tempUint; + assembly { + tempUint := mload(add(add(_bytes, 0x20), _start)) + } + return tempUint; + } + + function toAddress(bytes _bytes, uint _start) internal pure returns (address) { + require(_bytes.length >= (_start + 20)); + address tempAddress; + + assembly { + tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) + } + + return tempAddress; + } + +} diff --git a/contracts/Core.sol b/contracts/Core.sol new file mode 100644 index 00000000..a59db846 --- /dev/null +++ b/contracts/Core.sol @@ -0,0 +1,292 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: Core +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./CoreInterface.sol"; +import "./MerklePatriciaProof.sol"; +import "./util.sol"; +import "./WorkersInterface.sol"; +import "./RLP.sol"; + +/** + * @title Core contract which implements CoreInterface + * + * @notice Core is a minimal stub that will become the anchoring and consensus point for + * the utility chain to validate itself against + */ +contract Core is CoreInterface, Util { + + /* Events */ + + event StateRootCommitted(uint256 blockHeight, bytes32 stateRoot); + + event OpenSTProven(uint256 blockHeight, bytes32 storageRoot, bytes32 hashedAccount); + + /** Below event emitted to differentiate replay call of proveOpenST function for same block height */ + event ProofVerificationSkipped(uint256 blockHeight, bytes32 storageRoot); + + /* Storage */ + + mapping (uint256 /* block height */ => bytes32) private stateRoots; + + mapping (uint256 /* block height */ => bytes32) private storageRoots; + + /** chainIdOrigin is the origin chain id where core contract is deployed */ + uint256 public coreChainIdOrigin; + + /** chainIdRemote is the remote chain id where core contract is deployed */ + uint256 private coreChainIdRemote; + + /** It is the address of the openSTUtility/openSTValue contract on the remote chain */ + address private coreOpenSTRemote; + + address private coreRegistrar; + + /** Latest block height of block for which state root was committed. */ + uint256 private latestStateRootBlockHeight; + + /** Workers contract address */ + WorkersInterface public workers; + + /** + * OpenSTRemote encoded path. Constructed with below flow: + * coreOpenSTRemote => sha3 => bytes32 => bytes + */ + bytes private encodedOpenSTRemotePath; + + /* Modifiers */ + + /** only worker modifier */ + modifier onlyWorker() { + // msg.sender should be worker only + require(workers.isWorker(msg.sender), "Worker address is not whitelisted"); + _; + } + + /* Public functions */ + + /** + * @notice Contract constructor + * + * @dev bytes32ToBytes is util contract method + * + * @param _registrar registrar address + * @param _chainIdOrigin origin chain id + * @param _chainIdRemote remote chain id + * @param _openSTRemote remote openSTUtility/openSTValue contract address + */ + constructor( + address _registrar, + uint256 _chainIdOrigin, + uint256 _chainIdRemote, + address _openSTRemote, + WorkersInterface _workers) + public + { + require(_registrar != address(0), "Registrar address is 0"); + require(_chainIdOrigin != 0, "Origin chain Id is 0"); + require(_chainIdRemote != 0, "Remote chain Id is 0"); + require(_openSTRemote != address(0), "OpenSTRemote address is 0"); + require(_workers != address(0), "Workers contract address is 0"); + coreRegistrar = _registrar; + coreChainIdOrigin = _chainIdOrigin; + coreChainIdRemote = _chainIdRemote; + coreOpenSTRemote = _openSTRemote; + workers = _workers; + // Encoded remote path. + encodedOpenSTRemotePath = bytes32ToBytes(keccak256(coreOpenSTRemote)); + } + + /** + * @notice public view function registrar + * + * @return address coreRegistrar + */ + function registrar() + public + view + returns (address /* registrar */) + { + return coreRegistrar; + } + + /** + * @notice public view function chainIdRemote + * + * @return uint256 coreChainIdRemote + */ + function chainIdRemote() + public + view + returns (uint256 /* chainIdRemote */) + { + return coreChainIdRemote; + } + + /** + * @notice public view function openSTRemote + * + * @return address coreOpenSTRemote + */ + function openSTRemote() + public + view + returns (address /* OpenSTRemote */) + { + return coreOpenSTRemote; + } + + /** + * @notice Commit new state root for a block height + * + * @dev commitStateRoot called from game process + * + * @param _blockHeight block height for which stateRoots mapping needs to update + * @param _stateRoot state root of input block height + * + * @return bytes32 stateRoot + */ + function commitStateRoot( + uint256 _blockHeight, + bytes32 _stateRoot) + external + onlyWorker + returns(bytes32 /* stateRoot */) + { + // State root should be valid + require(_stateRoot != bytes32(0), "State root is 0"); + // Input block height should be valid + require(_blockHeight > latestStateRootBlockHeight, "Given block height is lower or equal to highest committed state root block height."); + + stateRoots[_blockHeight] = _stateRoot; + latestStateRootBlockHeight = _blockHeight; + + emit StateRootCommitted(_blockHeight, _stateRoot); + + return _stateRoot; + } + + /** + * @notice Verify account proof of OpenSTRemote and commit storage root at given block height + * + * @dev ProofVerificationSkipped event needed to identify replay calls for same block height + * + * @param _blockHeight block height at which OpenST is to be proven + * @param _rlpEncodedAccount rlpencoded account node object + * @param _rlpParentNodes RLP encoded value of account proof parent nodes + * + * @return bool status + */ + function proveOpenST( + uint256 _blockHeight, + bytes _rlpEncodedAccount, + bytes _rlpParentNodes) + external + returns(bool /* success */) + { + // Check for block height + require(_blockHeight != 0, "Given block height is 0"); + // Storage root should be valid + require(_rlpEncodedAccount.length != 0, "Length of RLP encoded account is 0"); + + bytes32 stateRoot = stateRoots[_blockHeight]; + // State root should be present for the block height + require(stateRoot != bytes32(0), "State root is 0"); + + // Decode RLP encoded account value + RLP.RLPItem memory accountItem = RLP.toRLPItem(_rlpEncodedAccount); + // Convert to list + RLP.RLPItem[] memory accountArray = RLP.toList(accountItem); + // Array 3rd position is storage root + bytes32 storageRoot = RLP.toBytes32(accountArray[2]); + // Hash the rlpEncodedValue value + bytes32 hashedAccount = keccak256(_rlpEncodedAccount); + + // If account already proven for block height + bytes32 provenStorageRoot = storageRoots[_blockHeight]; + if (provenStorageRoot != bytes32(0)) { + // Check extracted storage root is matching with existing stored storage root + require(provenStorageRoot == storageRoot, "Storage root mismatch when account is already proven"); + emit OpenSTProven(_blockHeight, storageRoot, hashedAccount); + // Below event needed to differentiate single call VS multiple call of proveOpenST function for same block height + emit ProofVerificationSkipped(_blockHeight, storageRoot); + // return true + return true; + } + + // Verify the remote OpenST contract against the committed state root with the state trie Merkle proof + require(MerklePatriciaProof.verify(hashedAccount, encodedOpenSTRemotePath, _rlpParentNodes, stateRoot), "Account proof is not verified."); + + // After verification update storageRoots mapping + storageRoots[_blockHeight] = storageRoot; + // Emit event + emit OpenSTProven(_blockHeight, storageRoot, hashedAccount); + + return true; + } + + /** + * @notice public view function getStateRoot + * + * @param _blockHeight block height for which state root is needed + * + * @return bytes32 state root + */ + function getStateRoot( + uint256 _blockHeight) + public + view + returns (bytes32 /* state root */) + { + return stateRoots[_blockHeight]; + } + + /** + * @notice public view function getStorageRoot + * + * @param _blockHeight block height for which storage root is needed + * + * @return bytes32 storage root + */ + function getStorageRoot( + uint256 _blockHeight) + public + view + returns (bytes32 /* storage root */) + { + return storageRoots[_blockHeight]; + } + + /** + * @notice public function getLatestStateRootBlockHeight + * + * @return uint256 latest state root block height + */ + function getLatestStateRootBlockHeight() + public + view + returns (uint256 /* block height */) + { + return latestStateRootBlockHeight; + } + +} \ No newline at end of file diff --git a/contracts/CoreInterface.sol b/contracts/CoreInterface.sol new file mode 100644 index 00000000..4d34ffef --- /dev/null +++ b/contracts/CoreInterface.sol @@ -0,0 +1,50 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: CoreInterface +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +/** + * @title CoreInterface + * + * @notice provide interface for core contract + */ +contract CoreInterface { + + function registrar() public view returns (address /* registrar */); + + function chainIdRemote() public view returns (uint256 /* chainIdRemote */); + + function openSTRemote() public view returns (address /* OpenSTRemote */); + + /** commitStateRoot external function to be called by game process */ + function commitStateRoot(uint256 _blockHeight, bytes32 _stateRoot) external returns (bytes32 /* stateRoot */); + + /** It's called whenever account proof needs to be verified */ + function proveOpenST(uint256 _blockHeight, bytes _rlpEncodedAccount, bytes _rlpParentNodes) external returns (bool /* success */); + + /** get highest state root block height for which state root is committed. */ + function getLatestStateRootBlockHeight() public view returns (uint256 /* latest state root block height */); + + function getStateRoot(uint256 _blockHeight) public view returns (bytes32 /* state root */); + + function getStorageRoot(uint256 _blockHeight) public view returns (bytes32 /* storage root */); + +} \ No newline at end of file diff --git a/contracts/EIP20Interface.sol b/contracts/EIP20Interface.sol new file mode 100644 index 00000000..d66ba745 --- /dev/null +++ b/contracts/EIP20Interface.sol @@ -0,0 +1,47 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: Standard EIP20 Interface +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// Based on the 'final' EIP20 token standard as specified at: +// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md +// ---------------------------------------------------------------------------- + +/** + @title EIP20Interface + @notice Provides EIP20 token interface +*/ +contract EIP20Interface { + event Transfer(address indexed _from, address indexed _to, uint256 _value); + event Approval(address indexed _owner, address indexed _spender, uint256 _value); + + function name() public view returns (string); + function symbol() public view returns (string); + function decimals() public view returns (uint8); + function totalSupply() public view returns (uint256); + + function balanceOf(address _owner) public view returns (uint256 balance); + function allowance(address _owner, address _spender) public view returns (uint256 remaining); + + function transfer(address _to, uint256 _value) public returns (bool success); + function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); + function approve(address _spender, uint256 _value) public returns (bool success); +} diff --git a/contracts/EIP20Token.sol b/contracts/EIP20Token.sol new file mode 100644 index 00000000..44f60f59 --- /dev/null +++ b/contracts/EIP20Token.sol @@ -0,0 +1,132 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: EIP20 Token Implementation +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./EIP20Interface.sol"; +import "./SafeMath.sol"; + +/** + @title EIP20Token + @notice Implements EIP20 token +*/ +contract EIP20Token is EIP20Interface { + using SafeMath for uint256; + + string private tokenName; + string private tokenSymbol; + uint8 private tokenDecimals; + + mapping(address => uint256) balances; + mapping(address => mapping (address => uint256)) allowed; + + + constructor(string _symbol, string _name, uint8 _decimals) public + { + tokenSymbol = _symbol; + tokenName = _name; + tokenDecimals = _decimals; + } + + + function name() public view returns (string) { + return tokenName; + } + + + function symbol() public view returns (string) { + return tokenSymbol; + } + + + function decimals() public view returns (uint8) { + return tokenDecimals; + } + + + function balanceOf(address _owner) public view returns (uint256) { + return balances[_owner]; + } + + + function allowance(address _owner, address _spender) public view returns (uint256 remaining) { + return allowed[_owner][_spender]; + } + + + function transfer(address _to, uint256 _value) public returns (bool success) { + // According to the EIP20 spec, "transfers of 0 values MUST be treated as normal + // transfers and fire the Transfer event". + // Also, should throw if not enough balance. This is taken care of by SafeMath. + balances[msg.sender] = balances[msg.sender].sub(_value); + balances[_to] = balances[_to].add(_value); + + emit Transfer(msg.sender, _to, _value); + + return true; + } + + + function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { + balances[_from] = balances[_from].sub(_value); + allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); + balances[_to] = balances[_to].add(_value); + + emit Transfer(_from, _to, _value); + + return true; + } + + + function approve(address _spender, uint256 _value) public returns (bool success) { + + allowed[msg.sender][_spender] = _value; + + emit Approval(msg.sender, _spender, _value); + + return true; + } + + + function claimEIP20(address _beneficiary, uint256 _amount) internal returns (bool success) { + // claimable tokens are minted in the contract address to be pulled on claim + balances[address(this)] = balances[address(this)].sub(_amount); + balances[_beneficiary] = balances[_beneficiary].add(_amount); + + emit Transfer(address(this), _beneficiary, _amount); + + return true; + } + + + function mintEIP20(uint256 _amount) internal returns (bool /* success */) { + // mint EIP20 tokens in contract address for them to be claimed + balances[address(this)] = balances[address(this)].add(_amount); + + return true; + } + + function burnEIP20(uint256 _amount) internal returns (bool /* success */) { + balances[msg.sender] = balances[msg.sender].sub(_amount); + + return true; + } +} diff --git a/contracts/EIP20TokenMock.sol b/contracts/EIP20TokenMock.sol new file mode 100644 index 00000000..0f47e1f9 --- /dev/null +++ b/contracts/EIP20TokenMock.sol @@ -0,0 +1,66 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: EIP20TokenMock.sol +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./EIP20Token.sol"; + +/// @title EIP20TokenMock +/// @dev Implements mock totalSupply function and wraps internal functions to enable testing EIP20Token +contract EIP20TokenMock is EIP20Token { + + constructor(string _symbol, string _name, uint8 _decimals) + EIP20Token(_symbol, _name, _decimals) + public { } + + /// @dev Mock totalSupply function + function totalSupply() public view returns (uint256) { + return 0; + } + + /// @dev Public wrapper for claimEIP20Public + function claimEIP20Public( + address _beneficiary, + uint256 _amount) + public + returns (bool /* success */) + { + return claimEIP20(_beneficiary, _amount); + } + + /// @dev Public wrapper for mintEIP20Public + function mintEIP20Public( + uint256 _amount) + public + returns (bool /* success */) + { + return mintEIP20(_amount); + } + + /// @dev Public wrapper for burnEIP20Public + function burnEIP20Public( + uint256 _amount) + public + returns (bool /* success */) + { + return burnEIP20(_amount); + } +} diff --git a/contracts/Gate.sol b/contracts/Gate.sol new file mode 100644 index 00000000..9f44b013 --- /dev/null +++ b/contracts/Gate.sol @@ -0,0 +1,305 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: Gate +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./ProtocolVersioned.sol"; +import "./OpenSTValueInterface.sol"; +import "./EIP20Interface.sol"; +import "./Owned.sol"; +import "./WorkersInterface.sol"; + +contract Gate is ProtocolVersioned, Owned { + + /* + * Events + */ + event StakeRequested(address _staker, uint256 _amount, address _beneficiary); + event StakeRequestReverted(address _staker, uint256 _amount); + event StakeRequestRejected(address _staker, uint256 _amount, uint8 _reason); + event StakeRequestAccepted( + address _staker, + uint256 _amountST, + uint256 _amountUT, + uint256 _nonce, + uint256 _unlockHeight, + bytes32 _stakingIntentHash); + + + + + // stake requests + mapping(address /*staker */ => StakeRequest) public stakeRequests; + WorkersInterface public workers; + // bounty amount + uint256 public bounty; + + // utility token UUID + bytes32 public uuid; + + /* + * Structures + */ + struct StakeRequest { + uint256 amount; + uint256 unlockHeight; + address beneficiary; + bytes32 hashLock; + } + /* + * Public functions + */ + constructor( + WorkersInterface _workers, + uint256 _bounty, + bytes32 _uuid, + address _openSTProtocol) + public + Owned() + ProtocolVersioned(_openSTProtocol) + { + require(_workers != address(0)); + require(_uuid.length != uint8(0)); + + workers = _workers; + bounty = _bounty; + uuid = _uuid; + + } + + function requestStake( + uint256 _amount, + address _beneficiary) + external + returns (bool /* success */) + { + + require(_amount > uint256(0)); + require(_beneficiary != address(0)); + + // check if the stake request does not exists + require(stakeRequests[msg.sender].beneficiary == address(0)); + + require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), _amount)); + + stakeRequests[msg.sender] = StakeRequest({ + amount: _amount, + beneficiary: _beneficiary, + hashLock: 0, + unlockHeight: 0 + }); + + emit StakeRequested(msg.sender, _amount, _beneficiary); + + return true; + } + + + /// @dev In order to revert stake request the msg.sender should be the staker + function revertStakeRequest() + external + returns (uint256 stakeRequestAmount) + { + // only staker can do revertStakeRequest, msg.sender == staker + StakeRequest storage stakeRequest = stakeRequests[msg.sender]; + + // check if the stake request exists for the msg.sender + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was not accepted + require(stakeRequest.hashLock == bytes32(0)); + + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, stakeRequest.amount)); + + stakeRequestAmount = stakeRequest.amount; + delete stakeRequests[msg.sender]; + + emit StakeRequestReverted(msg.sender, stakeRequestAmount); + + return stakeRequestAmount; + } + + function rejectStakeRequest(address _staker, uint8 _reason) + external + returns (uint256 stakeRequestAmount) + { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + + StakeRequest storage stakeRequest = stakeRequests[_staker]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was not accepted + require(stakeRequest.hashLock == bytes32(0)); + + // transfer the amount back + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(_staker, stakeRequest.amount)); + + stakeRequestAmount = stakeRequest.amount; + // delete the stake request from the mapping storage + delete stakeRequests[msg.sender]; + + emit StakeRequestRejected(_staker, stakeRequestAmount, _reason); + + return stakeRequestAmount; + } + + /// @dev In order to accept stake the staker needs to approve gate contract for bounty amount. + /// This can be called only by whitelisted worker address + function acceptStakeRequest(address _staker, bytes32 _hashLock) + external + returns ( + uint256 amountUT, + uint256 nonce, + uint256 unlockHeight, + bytes32 stakingIntentHash) + { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + + StakeRequest storage stakeRequest = stakeRequests[_staker]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was not accepted + require(stakeRequest.hashLock == bytes32(0)); + + // check if _hashLock is not 0 + require(_hashLock != bytes32(0)); + + // Transfer bounty amount form worker to gate contract + require(OpenSTValueInterface(openSTProtocol).valueToken().transferFrom(msg.sender, address(this), bounty)); + + // Approve OpenSTValue contract for stake amount + require(OpenSTValueInterface(openSTProtocol).valueToken().approve(openSTProtocol, stakeRequest.amount)); + + + (amountUT, nonce, unlockHeight, stakingIntentHash) = OpenSTValueInterface(openSTProtocol).stake( + uuid, + stakeRequest.amount, + stakeRequest.beneficiary, + _hashLock, + _staker); + + // Check if the stake function call did not result in to error. + require(stakingIntentHash != bytes32(0)); + + stakeRequests[_staker].unlockHeight = unlockHeight; + stakeRequests[_staker].hashLock = _hashLock; + + emit StakeRequestAccepted(_staker, stakeRequest.amount, amountUT, nonce, unlockHeight, stakingIntentHash); + + return (amountUT, nonce, unlockHeight, stakingIntentHash); + } + + + function processStaking( + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) + external + returns (uint256 stakeRequestAmount) + { + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + + require(_stakingIntentHash != bytes32(0)); + + //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; + //but all staking stateful information will move to the gate contract in v0.9.4 (making OpenST a library call) + //and making this call obsolete + address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); + + StakeRequest storage stakeRequest = stakeRequests[staker]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was accepted + require(stakeRequest.hashLock != bytes32(0)); + + // we call processStaking for OpenSTValue and get the stakeAddress on success. + address stakerAddress = OpenSTValueInterface(openSTProtocol).processStaking(_stakingIntentHash, _unlockSecret); + + // check if the stake address is not 0 + require(stakerAddress != address(0)); + + //If the msg.sender is whitelited worker then transfer the bounty amount to Workers contract + //else transfer the bounty to msg.sender. + if (workers.isWorker(msg.sender)) { + // Transfer bounty amount to the workers contract address + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + } else { + //Transfer bounty amount to the msg.sender account + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(msg.sender, bounty)); + } + stakeRequestAmount = stakeRequest.amount; + // delete the stake request from the mapping storage + delete stakeRequests[staker]; + + return stakeRequestAmount; + } + + + function revertStaking( + bytes32 _stakingIntentHash) + external + returns (uint256 stakeRequestAmount) + { + + // check if the caller is whitelisted worker + require(workers.isWorker(msg.sender)); + + require(_stakingIntentHash != bytes32(0)); + + //the hash timelock for staking and bounty are respectively in the openstvalue contract and gate contract in v0.9.3; + //but all staking stateful information will move to the gate contract in v0.9.4 (making OpenST a library call) + //and making this call obsolete + address staker = OpenSTValueInterface(openSTProtocol).getStakerAddress(_stakingIntentHash); + + StakeRequest storage stakeRequest = stakeRequests[staker]; + + // check if the stake request exists + require(stakeRequest.beneficiary != address(0)); + + // check if the stake request was accepted + require(stakeRequest.hashLock != bytes32(0)); + + bytes32 uuidR = bytes32(0); + uint256 amountST = uint256(0); + address stakerAddress = address(0); + (uuidR, amountST, stakerAddress) = OpenSTValueInterface(openSTProtocol).revertStaking(_stakingIntentHash); + + // check if the stake address is not 0 + require(stakerAddress != address(0)); + + require(OpenSTValueInterface(openSTProtocol).valueToken().transfer(workers, bounty)); + + stakeRequestAmount = stakeRequest.amount; + // delete the stake request from the mapping storage + delete stakeRequests[staker]; + + return stakeRequestAmount; + } +} \ No newline at end of file diff --git a/contracts/Hasher.sol b/contracts/Hasher.sol new file mode 100644 index 00000000..c826d372 --- /dev/null +++ b/contracts/Hasher.sol @@ -0,0 +1,108 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: Hasher +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +contract Hasher { + + /* + * Public pure functions + */ + function hashUuid( + string _symbol, + string _name, + uint256 _chainIdValue, + uint256 _chainIdUtility, + address _openSTUtility, + uint256 _conversionRate, + uint8 _conversionRateDecimals) + public + pure + returns (bytes32) + { + return keccak256( + _symbol, + _name, + _chainIdValue, + _chainIdUtility, + _openSTUtility, + _conversionRate, + _conversionRateDecimals); + } + + function hashStakingIntent( + bytes32 _uuid, + address _account, + uint256 _accountNonce, + address _beneficiary, + uint256 _amountST, + uint256 _amountUT, + uint256 _unlockHeight, + bytes32 _hashLock) + public + pure + returns (bytes32) + { + return keccak256( + _uuid, + _account, + _accountNonce, + _beneficiary, + _amountST, + _amountUT, + _unlockHeight, + _hashLock); + } + + function hashRedemptionIntent( + bytes32 _uuid, + address _account, + uint256 _accountNonce, + address _beneficiary, + uint256 _amountUT, + uint256 _unlockHeight, + bytes32 _hashLock) + public + pure + returns (bytes32) + { + return keccak256( + _uuid, + _account, + _accountNonce, + _beneficiary, + _amountUT, + _unlockHeight, + _hashLock); + } + + function hashIntentKey( + address _account, + uint256 _nonce) + public + pure + returns (bytes32) + { + return keccak256( + _account, + _nonce); + } +} \ No newline at end of file diff --git a/contracts/MerklePatriciaProof.sol b/contracts/MerklePatriciaProof.sol new file mode 100644 index 00000000..ba91b07f --- /dev/null +++ b/contracts/MerklePatriciaProof.sol @@ -0,0 +1,198 @@ +/* + * @title MerklePatriciaVerifier + * @author Sam Mayo (sammayo888@gmail.com) + * + * @dev Library for verifing merkle patricia proofs. + */ + +pragma solidity ^0.4.23; + +import "./RLP.sol"; + +library MerklePatriciaProof { + /* + * @dev Verifies a merkle patricia proof. + * @param value The terminating value in the trie. + * @param encodedPath The path in the trie leading to value. + * @param rlpParentNodes The rlp encoded stack of nodes. + * @param root The root hash of the trie. + * @return The boolean validity of the proof. + */ + function verify(bytes32 value, bytes encodedPath, bytes rlpParentNodes, bytes32 root) internal pure returns (bool) { + RLP.RLPItem memory item = RLP.toRLPItem(rlpParentNodes); + RLP.RLPItem[] memory parentNodes = RLP.toList(item); + + bytes memory currentNode; + RLP.RLPItem[] memory currentNodeList; + + bytes32 nodeKey = root; + uint pathPtr = 0; + + bytes memory path = _getNibbleArray2(encodedPath); + if(path.length == 0) {return false;} + + for (uint i=0; i path.length) {return false;} + + currentNode = RLP.toBytes(parentNodes[i]); + if(nodeKey != keccak256(currentNode)) {return false;} + currentNodeList = RLP.toList(parentNodes[i]); + + if(currentNodeList.length == 17) { + if(pathPtr == path.length) { + if(keccak256(RLP.toBytes(currentNodeList[16])) == value) { + return true; + } else { + return false; + } + } + + uint8 nextPathNibble = uint8(path[pathPtr]); + if(nextPathNibble > 16) {return false;} + nodeKey = RLP.toBytes32(currentNodeList[nextPathNibble]); + pathPtr += 1; + } else if(currentNodeList.length == 2) { + pathPtr += _nibblesToTraverse(RLP.toData(currentNodeList[0]), path, pathPtr); + + if(pathPtr == path.length) {//leaf node + if(keccak256(RLP.toData(currentNodeList[1])) == value) { + return true; + } else { + return false; + } + } + //extension node ... test if means that it is empty value + if(_nibblesToTraverse(RLP.toData(currentNodeList[0]), path, pathPtr) == 0) { + return (keccak256() == value); + } + + nodeKey = RLP.toBytes32(currentNodeList[1]); + } else { + return false; + } + } + } + + function verifyDebug(bytes32 value, bytes not_encodedPath, bytes rlpParentNodes, bytes32 root) internal pure returns (bool res, uint loc, bytes path_debug) { + RLP.RLPItem memory item = RLP.toRLPItem(rlpParentNodes); + RLP.RLPItem[] memory parentNodes = RLP.toList(item); + + bytes memory currentNode; + RLP.RLPItem[] memory currentNodeList; + + bytes32 nodeKey = root; + uint pathPtr = 0; + + bytes memory path = _getNibbleArray2(not_encodedPath); + path_debug = path; + if(path.length == 0) { loc = 0; res = false; return;} + + for (uint i=0; i path.length) {loc = 1; res = false; return;} + + currentNode = RLP.toBytes(parentNodes[i]); + if(nodeKey != keccak256(currentNode)) { res = false; loc = 100+i; return;} + currentNodeList = RLP.toList(parentNodes[i]); + + loc = currentNodeList.length; + + if(currentNodeList.length == 17) { + if(pathPtr == path.length) { + if(keccak256(RLP.toBytes(currentNodeList[16])) == value) { + res = true; return; + } else { + loc = 3; + return; + } + } + + uint8 nextPathNibble = uint8(path[pathPtr]); + if(nextPathNibble > 16) { + loc = 4; + return; } + nodeKey = RLP.toBytes32(currentNodeList[nextPathNibble]); + pathPtr += 1; + } else if(currentNodeList.length == 2) { + pathPtr += _nibblesToTraverse(RLP.toData(currentNodeList[0]), path, pathPtr); + + if(pathPtr == path.length) {//leaf node + if(keccak256(RLP.toData(currentNodeList[1])) == value) { + res = true; return; + } else { + loc = 5; + return; + } + } + //extension node + if(_nibblesToTraverse(RLP.toData(currentNodeList[0]), path, pathPtr) == 0) { + loc = 6; + res = (keccak256() == value); + return; + } + + nodeKey = RLP.toBytes32(currentNodeList[1]); + } else { + loc = 7; + return; + } + } + loc = 8; + return; + } + + function _nibblesToTraverse(bytes encodedPartialPath, bytes path, uint pathPtr) private pure returns (uint) { + uint len; + // encodedPartialPath has elements that are each two hex characters (1 byte), but partialPath + // and slicedPath have elements that are each one hex character (1 nibble) + bytes memory partialPath = _getNibbleArray(encodedPartialPath); + bytes memory slicedPath = new bytes(partialPath.length); + + // pathPtr counts nibbles in path + // partialPath.length is a number of nibbles + for(uint i=pathPtr; i0) { + uint8 offset; + uint8 hpNibble = uint8(_getNthNibbleOfBytes(0,b)); + if(hpNibble == 1 || hpNibble == 3) { + nibbles = new bytes(b.length*2-1); + byte oddNibble = _getNthNibbleOfBytes(1,b); + nibbles[0] = oddNibble; + offset = 1; + } else { + nibbles = new bytes(b.length*2-2); + offset = 0; + } + + for(uint i=offset; i bytes32) public intents; + + /// store the ongoing mints and redemptions + mapping(bytes32 /* stakingIntentHash */ => Mint) public mints; + mapping(bytes32 /* redemptionIntentHash */ => Redemption) public redemptions; + mapping(bytes32 /* uuid */ => RegisteredToken) public registeredTokens; + /// name reservation is first come, first serve + mapping(bytes32 /* hashName */ => address /* requester */) public nameReservation; + /// symbol reserved for unique API routes + /// and resolves to address + mapping(bytes32 /* hashSymbol */ => address /* UtilityToken */) public symbolRoute; + /// nonce makes the staking process atomic across the two-phased process + /// and protects against replay attack on (un)staking proofs during the process. + /// On the value chain nonces need to strictly increase by one; on the utility + /// chain the nonce need to strictly increase (as one value chain can have multiple + /// utility chains) + mapping(address /* (un)staker */ => uint256) internal nonces; + + /// store address of Simple Token Prime + address public simpleTokenPrime; + bytes32 public uuidSTPrime; + /// restrict (for now) to a single value chain + uint256 public chainIdValue; + /// chainId of the current utility chain + uint256 public chainIdUtility; + address public registrar; + + bytes32[] public uuids; + /// registered branded tokens + /* + * Structures + */ + struct RegisteredToken { + UtilityTokenInterface token; + address registrar; + } + + struct Mint { + bytes32 uuid; + address staker; + address beneficiary; + uint256 amount; + uint256 expirationHeight; + bytes32 hashLock; + } + + struct Redemption { + bytes32 uuid; + address redeemer; + uint256 nonce; + address beneficiary; + uint256 amountUT; + uint256 unlockHeight; + bytes32 hashLock; + } + /* + * Modifiers + */ + modifier onlyRegistrar() { + // for now keep unique registrar + require(msg.sender == registrar); + _; + } + + constructor( + uint256 _chainIdValue, + uint256 _chainIdUtility, + address _registrar) + public + OpsManaged() + { + require(_chainIdValue != 0); + require(_chainIdUtility != 0); + require(_registrar != address(0)); + + chainIdValue = _chainIdValue; + chainIdUtility = _chainIdUtility; + registrar = _registrar; + + uuidSTPrime = hashUuid( + STPRIME_SYMBOL, + STPRIME_NAME, + _chainIdValue, + _chainIdUtility, + address(this), + STPRIME_CONVERSION_RATE, + STPRIME_CONVERSION_RATE_TOKEN_DECIMALS); + + simpleTokenPrime = new STPrime( + uuidSTPrime, + _chainIdValue, + _chainIdUtility, + STPRIME_CONVERSION_RATE, + STPRIME_CONVERSION_RATE_TOKEN_DECIMALS); + + registeredTokens[uuidSTPrime] = RegisteredToken({ + token: UtilityTokenInterface(simpleTokenPrime), + registrar: registrar + }); + + uuids.push(uuidSTPrime); + // lock name and symbol route for ST' + bytes32 hashName = keccak256(STPRIME_NAME); + nameReservation[hashName] = registrar; + bytes32 hashSymbol = keccak256(STPRIME_SYMBOL); + symbolRoute[hashSymbol] = simpleTokenPrime; + + // @dev read STPrime address and uuid from contract + } + + /* + * External functions + */ + function confirmStakingIntent( + bytes32 _uuid, + address _staker, + uint256 _stakerNonce, + address _beneficiary, + uint256 _amountST, + uint256 _amountUT, + uint256 _stakingUnlockHeight, + bytes32 _hashLock, + bytes32 _stakingIntentHash) + external + onlyRegistrar + returns (uint256 expirationHeight) + { + require(address(registeredTokens[_uuid].token) != address(0)); + + require(nonces[_staker] < _stakerNonce); + require(_amountST > 0); + require(_amountUT > 0); + // stakingUnlockheight needs to be checked against the core that tracks the value chain + require(_stakingUnlockHeight > 0); + require(_stakingIntentHash != ""); + + expirationHeight = block.number + blocksToWaitShort(); + nonces[_staker] = _stakerNonce; + + bytes32 stakingIntentHash = hashStakingIntent( + _uuid, + _staker, + _stakerNonce, + _beneficiary, + _amountST, + _amountUT, + _stakingUnlockHeight, + _hashLock + ); + + require(stakingIntentHash == _stakingIntentHash); + + mints[stakingIntentHash] = Mint({ + uuid: _uuid, + staker: _staker, + beneficiary: _beneficiary, + amount: _amountUT, + expirationHeight: expirationHeight, + hashLock: _hashLock + }); + + emit StakingIntentConfirmed(_uuid, stakingIntentHash, _staker, _beneficiary, _amountST, + _amountUT, expirationHeight); + + return expirationHeight; + } + + function processMinting( + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) + external + returns (address tokenAddress) + { + require(_stakingIntentHash != ""); + + Mint storage mint = mints[_stakingIntentHash]; + + // present secret to unlock hashlock and continue process + require(mint.hashLock == keccak256(_unlockSecret)); + + // as process minting results in a gain it needs to expire well before + // the escrow on the cost unlocks in OpenSTValue.processStake + require(mint.expirationHeight > block.number); + + UtilityTokenInterface token = registeredTokens[mint.uuid].token; + tokenAddress = address(token); + require(tokenAddress != address(0)); + + require(token.mint(mint.beneficiary, mint.amount)); + + emit ProcessedMint(mint.uuid, _stakingIntentHash, tokenAddress, mint.staker, + mint.beneficiary, mint.amount, _unlockSecret); + + delete mints[_stakingIntentHash]; + + return tokenAddress; + } + + function revertMinting( + bytes32 _stakingIntentHash) + external + returns ( + bytes32 uuid, + address staker, + address beneficiary, + uint256 amount) + { + require(_stakingIntentHash != ""); + + Mint storage mint = mints[_stakingIntentHash]; + + // require that the mint has expired and that the staker has not + // processed the minting, ie mint has not been deleted + require(mint.expirationHeight > 0); + require(mint.expirationHeight <= block.number); + + uuid = mint.uuid; + amount = mint.amount; + staker = mint.staker; + beneficiary = mint.beneficiary; + + delete mints[_stakingIntentHash]; + + emit RevertedMint(uuid, _stakingIntentHash, staker, beneficiary, amount); + + return (uuid, staker, beneficiary, amount); + } + + /// @dev redeemer must set an allowance for the branded token with OpenSTUtility + /// as the spender so that the branded token can be taken into escrow by OpenSTUtility + /// note: for STPrime, call OpenSTUtility.redeemSTPrime as a payable function + /// note: nonce must be queried from OpenSTValue contract + /// note: Redemption will be done to beneficiary address + function redeem( + bytes32 _uuid, + uint256 _amountBT, + uint256 _nonce, + address _beneficiary, + bytes32 _hashLock) + external + returns ( + uint256 unlockHeight, + bytes32 redemptionIntentHash) + { + require(_uuid != ""); + require(_amountBT > 0); + require(_beneficiary != address(0)); + // on redemption allow the nonce to be re-used to cover for an unsuccessful + // previous redemption previously; as the nonce is strictly increasing plus + // one on the value chain; there is no gain on redeeming with the same nonce, + // only self-inflicted cost. + require(_nonce >= nonces[msg.sender]); + nonces[msg.sender] = _nonce; + + // to redeem ST' one needs to send value to payable + // function redeemSTPrime + require(_uuid != uuidSTPrime); + + BrandedToken token = BrandedToken(registeredTokens[_uuid].token); + + require(token.allowance(msg.sender, address(this)) >= _amountBT); + require(token.transferFrom(msg.sender, address(this), _amountBT)); + + unlockHeight = block.number + blocksToWaitLong(); + + redemptionIntentHash = hashRedemptionIntent( + _uuid, + msg.sender, + _nonce, + _beneficiary, + _amountBT, + unlockHeight, + _hashLock + ); + + redemptions[redemptionIntentHash] = Redemption({ + uuid: _uuid, + redeemer: msg.sender, + nonce: _nonce, + beneficiary: _beneficiary, + amountUT: _amountBT, + unlockHeight: unlockHeight, + hashLock: _hashLock + }); + + // store the Redemption intent hash directly in storage of OpenSTUtility + // so that a Merkle proof can be generated for active redemption intents + intents[hashIntentKey(msg.sender, _nonce)] = redemptionIntentHash; + + emit RedemptionIntentDeclared(_uuid, redemptionIntentHash, address(token), + msg.sender, _nonce, _beneficiary, _amountBT, unlockHeight, chainIdValue); + + return (unlockHeight, redemptionIntentHash); + } + + /// @dev redeemer must send as value the amount STP to redeem + /// note: nonce must be queried from OpenSTValue contract + /// note: redemption will be done to beneficiary address + function redeemSTPrime( + uint256 _nonce, + address _beneficiary, + bytes32 _hashLock) + external + payable + returns ( + uint256 amountSTP, + uint256 unlockHeight, + bytes32 redemptionIntentHash) + { + require(msg.value > 0); + require(_beneficiary != address(0)); + // on redemption allow the nonce to be re-used to cover for an unsuccessful + // previous redemption previously; as the nonce is strictly increasing plus + // one on the value chain; there is no gain on redeeming with the same nonce, + // only self-inflicted cost. + require(_nonce >= nonces[msg.sender]); + nonces[msg.sender] = _nonce; + + amountSTP = msg.value; + unlockHeight = block.number + blocksToWaitLong(); + + redemptionIntentHash = hashRedemptionIntent( + uuidSTPrime, + msg.sender, + _nonce, + _beneficiary, + amountSTP, + unlockHeight, + _hashLock + ); + + redemptions[redemptionIntentHash] = Redemption({ + uuid: uuidSTPrime, + redeemer: msg.sender, + nonce: _nonce, + beneficiary: _beneficiary, + amountUT: amountSTP, + unlockHeight: unlockHeight, + hashLock: _hashLock + }); + + emit RedemptionIntentDeclared(uuidSTPrime, redemptionIntentHash, simpleTokenPrime, + msg.sender, _nonce, _beneficiary, amountSTP, unlockHeight, chainIdValue); + + return (amountSTP, unlockHeight, redemptionIntentHash); + } + + function processRedeeming( + bytes32 _redemptionIntentHash, + bytes32 _unlockSecret) + external + returns ( + address tokenAddress) + { + require(_redemptionIntentHash != ""); + + Redemption storage redemption = redemptions[_redemptionIntentHash]; + + // present the secret to unlock the hashlock and continue process + require(redemption.hashLock == keccak256(_unlockSecret)); + + // as process redemption bears the cost there is no need to require + // the unlockHeight is not past, the same way as we do require for + // the expiration height on the unstake to not have expired yet. + + UtilityTokenInterface token = registeredTokens[redemption.uuid].token; + tokenAddress = address(token); + require(tokenAddress != address(0)); + + uint256 value = 0; + if (redemption.uuid == uuidSTPrime) value = redemption.amountUT; + + require(token.burn.value(value)(redemption.redeemer, redemption.amountUT)); + + emit ProcessedRedemption(redemption.uuid, _redemptionIntentHash, token, + redemption.redeemer, redemption.beneficiary, redemption.amountUT, _unlockSecret); + + delete redemptions[_redemptionIntentHash]; + + // remove intent hash from intents mapping + delete intents[hashIntentKey(redemption.redeemer, redemption.nonce)]; + + return tokenAddress; + } + + function revertRedemption( + bytes32 _redemptionIntentHash) + external + returns ( + bytes32 uuid, + address redeemer, + address beneficiary, + uint256 amountUT) + { + require(_redemptionIntentHash != ""); + + Redemption storage redemption = redemptions[_redemptionIntentHash]; + + // require that the redemption is unlocked and exists + require(redemption.unlockHeight > 0); + require(redemption.unlockHeight <= block.number); + + uuid = redemption.uuid; + amountUT = redemption.amountUT; + redeemer = redemption.redeemer; + beneficiary = redemption.beneficiary; + + if (redemption.uuid == uuidSTPrime) { + // transfer throws if insufficient funds + redeemer.transfer(amountUT); + } else { + EIP20Interface token = EIP20Interface(registeredTokens[redemption.uuid].token); + + require(token.transfer(redemption.redeemer, redemption.amountUT)); + } + + delete redemptions[_redemptionIntentHash]; + + // fire event + emit RevertedRedemption(uuid, _redemptionIntentHash, redeemer, beneficiary, amountUT); + + return (uuid, redeemer, beneficiary, amountUT); + } + + /* + * Public functions + */ + /// @dev Congratulations on looking under the hood and obtaining ST' to call proposeBrandedToken; + /// however, OpenSTFoundation is not yet actively listening to these events + /// because to automate it we will build a web UI where you can authenticate + /// with your msg.sender = _requester key; + /// until that time please drop us a line on partners(at)simpletoken.org and we can + /// work with you to register for your branded token + function proposeBrandedToken( + string _symbol, + string _name, + uint256 _conversionRate, + uint8 _conversionRateDecimals) + public + returns (bytes32) + { + require(bytes(_symbol).length > 0); + require(bytes(_name).length > 0); + require(_conversionRate > 0); + require(_conversionRateDecimals <= 5); + + bytes32 hashSymbol = keccak256(_symbol); + bytes32 hashName = keccak256(_name); + require(checkAvailability(hashSymbol, hashName, msg.sender)); + + bytes32 btUuid = hashUuid( + _symbol, + _name, + chainIdValue, + chainIdUtility, + address(this), + _conversionRate, + _conversionRateDecimals); + + BrandedToken proposedBT = new BrandedToken( + btUuid, + _symbol, + _name, + TOKEN_DECIMALS, + chainIdValue, + chainIdUtility, + _conversionRate, + _conversionRateDecimals); + // reserve name for sender under opt-in discretion of + // registrar + nameReservation[hashName] = msg.sender; + + emit ProposedBrandedToken(msg.sender, address(proposedBT), btUuid, + _symbol, _name, _conversionRate, _conversionRateDecimals); + + return btUuid; + } + + function checkAvailability( + bytes32 _hashSymbol, + bytes32 _hashName, + address _requester) + public + view + returns (bool /* success */) + { + // a reserved symbol means the route is already chosen + address token = symbolRoute[_hashSymbol]; + if (token != address(0)) return false; + + // a name can have been reserved during the Simple Token sale + // in which case must come from same address + // otherwise proposals are first come, first serve + // under opt-in discretion of registrar + address requester = nameReservation[_hashName]; + if ((requester == address(0) || + requester == _requester)) { + return true; + } + return false; + } + + /// @dev Returns size of uuids + /// @return size + function getUuidsSize() public view returns (uint256) { + return uuids.length; + } + + + /* solhint-disable-next-line separate-by-one-line-in-contract */ + function registerBrandedToken( + string _symbol, + string _name, + uint256 _conversionRate, + uint8 _conversionRateDecimals, + address _requester, + UtilityTokenInterface _brandedToken, + bytes32 _checkUuid) + public + onlyRegistrar + returns (bytes32 registeredUuid) + { + require(bytes(_symbol).length > 0); + require(bytes(_name).length > 0); + require(_conversionRate > 0); + require(_conversionRateDecimals <= 5); + + bytes32 hashSymbol = keccak256(_symbol); + bytes32 hashName = keccak256(_name); + require(checkAvailability(hashSymbol, hashName, _requester)); + + registeredUuid = hashUuid( + _symbol, + _name, + chainIdValue, + chainIdUtility, + address(this), + _conversionRate, + _conversionRateDecimals); + + require(registeredUuid == _checkUuid); + require(_brandedToken.uuid() == _checkUuid); + + assert(address(registeredTokens[registeredUuid].token) == address(0)); + + registeredTokens[registeredUuid] = RegisteredToken({ + token: _brandedToken, + registrar: registrar + }); + + // register name to registrar + nameReservation[hashName] = registrar; + // register symbol + symbolRoute[hashSymbol] = _brandedToken; + uuids.push(registeredUuid); + + emit RegisteredBrandedToken(registrar, _brandedToken, registeredUuid, _symbol, _name, + _conversionRate, _conversionRateDecimals, _requester); + + return registeredUuid; + } + + /* + * Administrative functions + */ + function initiateProtocolTransfer( + ProtocolVersioned _token, + address _proposedProtocol) + public + onlyAdmin + returns (bool) + { + _token.initiateProtocolTransfer(_proposedProtocol); + + return true; + } + + // on the very first released version v0.9.1 there is no need + // to completeProtocolTransfer from a previous version + + /* solhint-disable-next-line separate-by-one-line-in-contract */ + function revokeProtocolTransfer( + ProtocolVersioned _token) + public + onlyAdmin + returns (bool) + { + _token.revokeProtocolTransfer(); + + return true; + } + + function blocksToWaitLong() public pure returns (uint256) { + return BLOCKS_TO_WAIT_LONG; + } + + function blocksToWaitShort() public pure returns (uint256) { + return BLOCKS_TO_WAIT_SHORT; + } +} diff --git a/contracts/OpenSTUtilityInterface.sol b/contracts/OpenSTUtilityInterface.sol new file mode 100644 index 00000000..46f1d0f5 --- /dev/null +++ b/contracts/OpenSTUtilityInterface.sol @@ -0,0 +1,81 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: OpenSTUtilityInterface +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +// import "./CoreInterface.sol"; +import "./UtilityTokenInterface.sol"; + + +contract OpenSTUtilityInterface { + function confirmStakingIntent( + bytes32 _uuid, + address _staker, + uint256 _stakerNonce, + address _beneficiary, + uint256 _amountST, + uint256 _amountUT, + uint256 _stakingUnlockHeight, + bytes32 _hashLock, + bytes32 _stakingIntentHash) + external + returns ( + uint256 expirationHeight); + + function processRedeeming( + bytes32 _redemptionIntentHash, + bytes32 _unlockSecret) + external + returns ( + address tokenAddress); + + function registerBrandedToken( + string _symbol, + string _name, + uint256 _conversionRate, + uint8 _conversionRateDecimals, + address _requester, + UtilityTokenInterface _brandedToken, + bytes32 _checkUuid) + public + returns ( + bytes32 registeredUuid); + + function mints( + bytes32 /* stakingIntentHash */) + public + returns ( + bytes32, /* uuid */ + address, /* staker */ + address, /* beneficiary */ + uint256, /* amount */ + uint256 /* expirationHeight */); + + function redemptions( + bytes32 /* redemptionIntentHash */) + public + returns ( + bytes32, /* uuid */ + address, /* redeemer */ + uint256, /* amountUT */ + uint256 /* unlockHeight */); +} diff --git a/contracts/OpenSTUtilityMock.sol b/contracts/OpenSTUtilityMock.sol new file mode 100644 index 00000000..8b99628a --- /dev/null +++ b/contracts/OpenSTUtilityMock.sol @@ -0,0 +1,49 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: OpenSTUtilityMock.sol +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./OpenSTUtility.sol"; + +/// @title OpenSTUtilityMock +/// @dev Overrides certain durational constants and getters to ease testing OpenSTUtility +contract OpenSTUtilityMock is OpenSTUtility { + uint256 private constant BLOCKS_TO_WAIT_LONG = 8; + uint256 private constant BLOCKS_TO_WAIT_SHORT = 5; + + /* + * Public functions + */ + constructor( + uint256 _chainIdValue, + uint256 _chainIdUtility, + address _registrar) + OpenSTUtility(_chainIdValue, _chainIdUtility, _registrar) + public { } + + function blocksToWaitLong() public pure returns (uint256) { + return BLOCKS_TO_WAIT_LONG; + } + + function blocksToWaitShort() public pure returns (uint256) { + return BLOCKS_TO_WAIT_SHORT; + } +} \ No newline at end of file diff --git a/contracts/OpenSTUtils.sol b/contracts/OpenSTUtils.sol new file mode 100644 index 00000000..9da9da4f --- /dev/null +++ b/contracts/OpenSTUtils.sol @@ -0,0 +1,51 @@ +pragma solidity ^0.4.0; + +import "./BytesLib.sol"; +import "./MerklePatriciaProof.sol"; +import "./RLPEncode.sol"; + + +library OpenSTUtils { + + function bytes32ToBytes(bytes32 a) internal pure returns (bytes) { + bytes memory res = new bytes(32); + assembly { + mstore(add(32,res), a) + } + return res; + } + + function storagePath( + uint8 _index, + bytes32 _key) + internal + pure + returns(bytes32) + { + bytes memory indexBytes = BytesLib.leftPad(bytes32ToBytes(bytes32(_index))); + bytes memory keyBytes = BytesLib.leftPad(bytes32ToBytes(_key)); + bytes memory path = BytesLib.concat(keyBytes, indexBytes); + return keccak256(keccak256(path)); + } + + function verifyIntentStorage( + uint8 _intentIndex, + address _address, + uint256 _addressNonce, + bytes32 _storageRoot, + bytes32 _intentHash, + bytes _rlpParentNodes) + internal + pure + returns (bool) + { + bytes32 keyPath = storagePath(_intentIndex, keccak256(_address, _addressNonce)); + bytes memory path = bytes32ToBytes(keccak256(keyPath)); + require(MerklePatriciaProof.verify( + keccak256(RLPEncode.encodeItem(bytes32ToBytes(_intentHash))), + path, + _rlpParentNodes, + _storageRoot), "Failed to verify storage path"); + } + +} diff --git a/contracts/OpenSTValue.sol b/contracts/OpenSTValue.sol new file mode 100644 index 00000000..eced639c --- /dev/null +++ b/contracts/OpenSTValue.sol @@ -0,0 +1,620 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: OpenSTValue +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./SafeMath.sol"; +import "./Hasher.sol"; +import "./OpsManaged.sol"; +import "./EIP20Interface.sol"; +import "./CoreInterface.sol"; +import "./ProtocolVersioned.sol"; + +// value chain contracts +import "./SimpleStake.sol"; + +import "./OpenSTUtils.sol"; +import "./util.sol"; + +/// @title OpenSTValue - value staking contract for OpenST +contract OpenSTValue is OpsManaged, Hasher, Util { + using SafeMath for uint256; + + /* + * Events + */ + event UtilityTokenRegistered(bytes32 indexed _uuid, address indexed stake, + string _symbol, string _name, uint8 _decimals, uint256 _conversionRate, uint8 _conversionRateDecimals, + uint256 _chainIdUtility, address indexed _stakingAccount); + + event StakingIntentDeclared(bytes32 indexed _uuid, address indexed _staker, + uint256 _stakerNonce, address _beneficiary, uint256 _amountST, + uint256 _amountUT, uint256 _unlockHeight, bytes32 _stakingIntentHash, + uint256 _chainIdUtility); + + event ProcessedStake(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, + address _stake, address _staker, uint256 _amountST, uint256 _amountUT, bytes32 _unlockSecret); + + event RevertedStake(bytes32 indexed _uuid, bytes32 indexed _stakingIntentHash, + address _staker, uint256 _amountST, uint256 _amountUT); + + event RedemptionIntentConfirmed(bytes32 indexed _uuid, bytes32 _redemptionIntentHash, + address _redeemer, address _beneficiary, uint256 _amountST, uint256 _amountUT, uint256 _expirationHeight); + + event ProcessedUnstake(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, + address stake, address _redeemer, address _beneficiary, uint256 _amountST, bytes32 _unlockSecret); + + event RevertedUnstake(bytes32 indexed _uuid, bytes32 indexed _redemptionIntentHash, + address _redeemer, address _beneficiary, uint256 _amountST); + + /* + * Constants + */ + uint8 public constant TOKEN_DECIMALS = 18; + uint256 public constant DECIMALSFACTOR = 10**uint256(TOKEN_DECIMALS); + // ~2 weeks, assuming ~15s per block + uint256 private constant BLOCKS_TO_WAIT_LONG = 80667; + // ~1hour, assuming ~15s per block + uint256 private constant BLOCKS_TO_WAIT_SHORT = 240; + uint8 private constant INTENT_INDEX = 3; + + /// register the active stakes and unstakes + mapping(bytes32 /* hashStakingIntent */ => Stake) public stakes; + mapping(uint256 /* chainIdUtility */ => CoreInterface) internal cores; + mapping(bytes32 /* uuid */ => UtilityToken) public utilityTokens; + /// nonce makes the staking process atomic across the two-phased process + /// and protects against replay attack on (un)staking proofs during the process. + /// On the value chain nonces need to strictly increase by one; on the utility + /// chain the nonce need to strictly increase (as one value chain can have multiple + /// utility chains) + mapping(address /* (un)staker */ => uint256) internal nonces; + mapping(bytes32 /* hashRedemptionIntent */ => Unstake) public unstakes; + + /* + * Storage + */ + uint256 public chainIdValue; + EIP20Interface public valueToken; + address public registrar; + bytes32[] public uuids; + + /* + * Structures + */ + struct UtilityToken { + string symbol; + string name; + uint256 conversionRate; + uint8 conversionRateDecimals; + uint8 decimals; + uint256 chainIdUtility; + SimpleStake simpleStake; + address stakingAccount; + } + + struct Stake { + bytes32 uuid; + address staker; + address beneficiary; + uint256 nonce; + uint256 amountST; + uint256 amountUT; + uint256 unlockHeight; + bytes32 hashLock; + } + + struct Unstake { + bytes32 uuid; + address redeemer; + address beneficiary; + uint256 amountST; + // @dev consider removal of amountUT + uint256 amountUT; + uint256 expirationHeight; + bytes32 hashLock; + } + /* + * Modifiers + */ + modifier onlyRegistrar() { + // for now keep unique registrar + require(msg.sender == registrar); + _; + } + + constructor( + uint256 _chainIdValue, + EIP20Interface _eip20token, + address _registrar) + public + OpsManaged() + { + require(_chainIdValue != 0); + require(_eip20token != address(0)); + require(_registrar != address(0)); + + chainIdValue = _chainIdValue; + valueToken = _eip20token; + // registrar cannot be reset + // TODO: require it to be a contract + registrar = _registrar; + } + + /* + * External functions + */ + /// @dev In order to stake the tx.origin needs to set an allowance + /// for the OpenSTValue contract to transfer to itself to hold + /// during the staking process. + function stake( + bytes32 _uuid, + uint256 _amountST, + address _beneficiary, + bytes32 _hashLock, + address _staker) + external + returns ( + uint256 amountUT, + uint256 nonce, + uint256 unlockHeight, + bytes32 stakingIntentHash) + /* solhint-disable-next-line function-max-lines */ + { + /* solhint-disable avoid-tx-origin */ + // check the staking contract has been approved to spend the amount to stake + // OpenSTValue needs to be able to transfer the stake into its balance for + // keeping until the two-phase process is completed on both chains. + require(_amountST > uint256(0)); + + require(utilityTokens[_uuid].simpleStake != address(0)); + require(_beneficiary != address(0)); + require(_staker != address(0)); + + UtilityToken storage utilityToken = utilityTokens[_uuid]; + + // if the staking account is set to a non-zero address, + // then all transactions have come (from/over) the staking account + if (utilityToken.stakingAccount != address(0)) require(msg.sender == utilityToken.stakingAccount); + require(valueToken.transferFrom(msg.sender, address(this), _amountST)); + + amountUT = (_amountST.mul(utilityToken.conversionRate)) + .div(10**uint256(utilityToken.conversionRateDecimals)); + unlockHeight = block.number + blocksToWaitLong(); + + nonces[_staker]++; + nonce = nonces[_staker]; + + stakingIntentHash = hashStakingIntent( + _uuid, + _staker, + nonce, + _beneficiary, + _amountST, + amountUT, + unlockHeight, + _hashLock + ); + + stakes[stakingIntentHash] = Stake({ + uuid: _uuid, + staker: _staker, + beneficiary: _beneficiary, + nonce: nonce, + amountST: _amountST, + amountUT: amountUT, + unlockHeight: unlockHeight, + hashLock: _hashLock + }); + + emit StakingIntentDeclared(_uuid, _staker, nonce, _beneficiary, + _amountST, amountUT, unlockHeight, stakingIntentHash, utilityToken.chainIdUtility); + + return (amountUT, nonce, unlockHeight, stakingIntentHash); + /* solhint-enable avoid-tx-origin */ + } + + function processStaking( + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) + external + returns (address stakeAddress) + { + require(_stakingIntentHash != ""); + + Stake storage stake = stakes[_stakingIntentHash]; + + // present the secret to unlock the hashlock and continue process + require(stake.hashLock == keccak256(_unlockSecret)); + + // as this bears the cost, there is no need to require + // that the stake.unlockHeight is not yet surpassed + // as is required on processMinting + + UtilityToken storage utilityToken = utilityTokens[stake.uuid]; + stakeAddress = address(utilityToken.simpleStake); + require(stakeAddress != address(0)); + + assert(valueToken.balanceOf(address(this)) >= stake.amountST); + require(valueToken.transfer(stakeAddress, stake.amountST)); + + emit ProcessedStake(stake.uuid, _stakingIntentHash, stakeAddress, stake.staker, + stake.amountST, stake.amountUT, _unlockSecret); + + delete stakes[_stakingIntentHash]; + + return stakeAddress; + } + + function revertStaking( + bytes32 _stakingIntentHash) + external + returns ( + bytes32 uuid, + uint256 amountST, + address staker) + { + require(_stakingIntentHash != ""); + + Stake storage stake = stakes[_stakingIntentHash]; + + // require that the stake is unlocked and exists + require(stake.unlockHeight > 0); + require(stake.unlockHeight <= block.number); + + assert(valueToken.balanceOf(address(this)) >= stake.amountST); + // revert the amount that was intended to be staked back to staker + require(valueToken.transfer(stake.staker, stake.amountST)); + + uuid = stake.uuid; + amountST = stake.amountST; + staker = stake.staker; + + emit RevertedStake(stake.uuid, _stakingIntentHash, stake.staker, + stake.amountST, stake.amountUT); + + delete stakes[_stakingIntentHash]; + + return (uuid, amountST, staker); + } + + function confirmRedemptionIntent( + bytes32 _uuid, + address _redeemer, + uint256 _redeemerNonce, + address _beneficiary, + uint256 _amountUT, + uint256 _redemptionUnlockHeight, + bytes32 _hashLock, + uint256 _blockHeight, + bytes _rlpParentNodes) + external + returns ( + uint256 amountST, + uint256 expirationHeight) + { + + UtilityToken storage utilityToken = utilityTokens[_uuid]; + require(utilityToken.simpleStake != address(0)); + require(_amountUT > 0); + require(_beneficiary != address(0)); + // later core will provide a view on the block height of the + // utility chain + require(_redemptionUnlockHeight > 0); + + require(validateAndIncrementNonce(_redeemer, _redeemerNonce)); + + bytes32 redemptionIntentHash = hashRedemptionIntent( + _uuid, + _redeemer, + _redeemerNonce, + _beneficiary, + _amountUT, + _redemptionUnlockHeight, + _hashLock + ); + + expirationHeight = block.number + blocksToWaitShort(); + + // minimal precision to unstake 1 STWei + require(_amountUT >= (utilityToken.conversionRate.div(10**uint256(utilityToken.conversionRateDecimals)))); + amountST = (_amountUT + .mul(10**uint256(utilityToken.conversionRateDecimals))).div(utilityToken.conversionRate); + + require(valueToken.balanceOf(address(utilityToken.simpleStake)) >= amountST); + + require(verifyIntentStorage( + _uuid, + _redeemer, + _redeemerNonce, + _blockHeight, + redemptionIntentHash, + _rlpParentNodes)); + + unstakes[redemptionIntentHash] = Unstake({ + uuid: _uuid, + redeemer: _redeemer, + beneficiary: _beneficiary, + amountUT: _amountUT, + amountST: amountST, + expirationHeight: expirationHeight, + hashLock: _hashLock + }); + + emit RedemptionIntentConfirmed(_uuid, redemptionIntentHash, _redeemer, + _beneficiary, amountST, _amountUT, expirationHeight); + + return (amountST, expirationHeight); + } + + function validateAndIncrementNonce( + address _accountAddress, + uint256 _accountNonce) + internal + returns (bool) + { + require(_accountAddress != address(0)); + require(nonces[_accountAddress] + 1 == _accountNonce); + nonces[_accountAddress]++; + return true; + } + + function verifyIntentStorage( + bytes32 _uuid, + address _redeemer, + uint256 _redeemerNonce, + uint256 _blockHeight, + bytes32 _redemptionIntentHash, + bytes _rlpParentNodes) + internal + view + returns (bool) + { + require(utilityTokens[_uuid].simpleStake != address(0)); + require(_redeemer != address(0)); + require(_redemptionIntentHash != bytes32(0)); + + bytes32 storageRoot = CoreInterface(cores[utilityTokens[_uuid].chainIdUtility]).getStorageRoot(_blockHeight); + require(OpenSTUtils.verifyIntentStorage( + INTENT_INDEX, + _redeemer, + _redeemerNonce, + storageRoot, + _redemptionIntentHash, + _rlpParentNodes)); + return true; + } + + function processUnstaking( + bytes32 _redemptionIntentHash, + bytes32 _unlockSecret) + external + returns ( + address stakeAddress) + { + require(_redemptionIntentHash != ""); + + Unstake storage unstake = unstakes[_redemptionIntentHash]; + + // present secret to unlock hashlock and proceed + require(unstake.hashLock == keccak256(_unlockSecret)); + + // as the process unstake results in a gain for the caller + // it needs to expire well before the process redemption can + // be reverted in OpenSTUtility + require(unstake.expirationHeight > block.number); + + UtilityToken storage utilityToken = utilityTokens[unstake.uuid]; + stakeAddress = address(utilityToken.simpleStake); + require(stakeAddress != address(0)); + + require(utilityToken.simpleStake.releaseTo(unstake.beneficiary, unstake.amountST)); + + emit ProcessedUnstake(unstake.uuid, _redemptionIntentHash, stakeAddress, + unstake.redeemer, unstake.beneficiary, unstake.amountST, _unlockSecret); + + delete unstakes[_redemptionIntentHash]; + + return stakeAddress; + } + + function revertUnstaking( + bytes32 _redemptionIntentHash) + external + returns ( + bytes32 uuid, + address redeemer, + address beneficiary, + uint256 amountST) + { + require(_redemptionIntentHash != ""); + + Unstake storage unstake = unstakes[_redemptionIntentHash]; + + // require that the unstake has expired and that the redeemer has not + // processed the unstaking, ie unstake has not been deleted + require(unstake.expirationHeight > 0); + require(unstake.expirationHeight <= block.number); + + uuid = unstake.uuid; + redeemer = unstake.redeemer; + beneficiary = unstake.beneficiary; + amountST = unstake.amountST; + + delete unstakes[_redemptionIntentHash]; + + emit RevertedUnstake(uuid, _redemptionIntentHash, redeemer, beneficiary, amountST); + + return (uuid, redeemer, beneficiary, amountST); + } + + function core( + uint256 _chainIdUtility) + external + view + returns (address /* core address */ ) + { + return address(cores[_chainIdUtility]); + } + + /* + * Public view functions + */ + function getNextNonce( + address _account) + public + view + returns (uint256 /* nextNonce */) + { + return (nonces[_account] + 1); + } + + function blocksToWaitLong() public pure returns (uint256) { + return BLOCKS_TO_WAIT_LONG; + } + + function blocksToWaitShort() public pure returns (uint256) { + return BLOCKS_TO_WAIT_SHORT; + } + + /// @dev Returns size of uuids + /// @return size + function getUuidsSize() public view returns (uint256) { + return uuids.length; + } + + /* + * Registrar functions + */ + function addCore( + CoreInterface _core) + public + onlyRegistrar + returns (bool /* success */) + { + require(address(_core) != address(0)); + // on value chain core only tracks a remote utility chain + uint256 chainIdUtility = _core.chainIdRemote(); + require(chainIdUtility != 0); + // cannot overwrite core for given chainId + require(cores[chainIdUtility] == address(0)); + + cores[chainIdUtility] = _core; + + return true; + } + + function registerUtilityToken( + string _symbol, + string _name, + uint256 _conversionRate, + uint8 _conversionRateDecimals, + uint256 _chainIdUtility, + address _stakingAccount, + bytes32 _checkUuid) + public + onlyRegistrar + returns (bytes32 uuid) + { + require(bytes(_name).length > 0); + require(bytes(_symbol).length > 0); + require(_conversionRate > 0); + require(_conversionRateDecimals <= 5); + + address openSTRemote = cores[_chainIdUtility].openSTRemote(); + require(openSTRemote != address(0)); + + uuid = hashUuid( + _symbol, + _name, + chainIdValue, + _chainIdUtility, + openSTRemote, + _conversionRate, + _conversionRateDecimals); + + require(uuid == _checkUuid); + + require(address(utilityTokens[uuid].simpleStake) == address(0)); + + SimpleStake simpleStake = new SimpleStake( + valueToken, address(this), uuid); + + utilityTokens[uuid] = UtilityToken({ + symbol: _symbol, + name: _name, + conversionRate: _conversionRate, + conversionRateDecimals: _conversionRateDecimals, + decimals: TOKEN_DECIMALS, + chainIdUtility: _chainIdUtility, + simpleStake: simpleStake, + stakingAccount: _stakingAccount + }); + uuids.push(uuid); + + emit UtilityTokenRegistered(uuid, address(simpleStake), _symbol, _name, + TOKEN_DECIMALS, _conversionRate, _conversionRateDecimals, _chainIdUtility, _stakingAccount); + + return uuid; + } + + /* + * Administrative functions + */ + function initiateProtocolTransfer( + ProtocolVersioned _simpleStake, + address _proposedProtocol) + public + onlyAdmin + returns (bool) + { + _simpleStake.initiateProtocolTransfer(_proposedProtocol); + + return true; + } + + // on the very first released version v0.9.1 there is no need + // to completeProtocolTransfer from a previous version + + /* solhint-disable-next-line separate-by-one-line-in-contract */ + function revokeProtocolTransfer( + ProtocolVersioned _simpleStake) + public + onlyAdmin + returns (bool) + { + _simpleStake.revokeProtocolTransfer(); + + return true; + } + + function getStakerAddress( + bytes32 _stakingIntentHash) + external + returns (address /* staker */) + { + require(_stakingIntentHash != ""); + Stake storage stake = stakes[_stakingIntentHash]; + + return stake.staker; + + } +} diff --git a/contracts/OpenSTValueInterface.sol b/contracts/OpenSTValueInterface.sol new file mode 100644 index 00000000..d261690b --- /dev/null +++ b/contracts/OpenSTValueInterface.sol @@ -0,0 +1,118 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: OpenST protocol interface +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./CoreInterface.sol"; +import "./EIP20Interface.sol"; + + +contract OpenSTValueInterface { + function processStaking( + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) + external + returns (address stakeAddress); + + function confirmRedemptionIntent( + bytes32 _uuid, + address _redeemer, + uint256 _redeemerNonce, + address _beneficiary, + uint256 _amountUT, + uint256 _redemptionUnlockHeight, + bytes32 _hashLock, + bytes32 _redemptionIntentHash) + external + returns ( + uint256 amountST, + uint256 expirationHeight); + + function addCore( + CoreInterface _core) + public + returns ( + bool /* success */); + + function registerUtilityToken( + string _symbol, + string _name, + uint256 _conversionRate, + uint8 _conversionRateDecimals, + uint256 _chainIdUtility, + address _stakingAccount, + bytes32 _checkUuid) + public + returns ( + bytes32 uuid); + + function stakes( + bytes32 /* hashStakingIntent */) + public + returns ( + bytes32, /* uuid */ + address, /* staker */ + address, /* beneficiary */ + uint256, /* nonce */ + uint256, /* amountST */ + uint256, /* amountUT */ + uint256 /* unlockHeight */); + + function unstakes( + bytes32 /* hashRedemptionIntent */) + public + returns ( + bytes32, /* uuid */ + address, /* redeemer */ + uint256, /* amountST */ + uint256, /* amountUT */ + uint256 /* expirationHeight */); + + function valueToken() + public + returns (EIP20Interface /* value token address*/); + + function stake( + bytes32 _uuid, + uint256 _amountST, + address _beneficiary, + bytes32 _hashLock, + address _staker) + external + returns ( + uint256, /* amountUT*/ + uint256, /* nonce*/ + uint256, /* unlockHeight*/ + bytes32 /* stakingIntentHash*/); + + function revertStaking( + bytes32 _stakingIntentHash) + external + returns ( + bytes32, /* uuid */ + uint256, /* amountST */ + address /* staker */); + + function getStakerAddress(bytes32 _stakingIntentHash) + external + returns (address /* staker */); +} \ No newline at end of file diff --git a/contracts/OpenSTValueMock.sol b/contracts/OpenSTValueMock.sol new file mode 100644 index 00000000..0812e7aa --- /dev/null +++ b/contracts/OpenSTValueMock.sol @@ -0,0 +1,49 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: OpenSTValueMock.sol +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./OpenSTValue.sol"; + +/// @title OpenSTValueMock +/// @dev Overrides certain durational constants and getters to ease testing OpenSTValue +contract OpenSTValueMock is OpenSTValue { + uint256 private constant BLOCKS_TO_WAIT_LONG = 8; + uint256 private constant BLOCKS_TO_WAIT_SHORT = 5; + + /* + * Public functions + */ + constructor( + uint256 _chainIdValue, + EIP20Interface _eip20token, + address _registrar) + OpenSTValue(_chainIdValue, _eip20token, _registrar) + public { } + + function blocksToWaitLong() public pure returns (uint256) { + return BLOCKS_TO_WAIT_LONG; + } + + function blocksToWaitShort() public pure returns (uint256) { + return BLOCKS_TO_WAIT_SHORT; + } +} \ No newline at end of file diff --git a/contracts/OpsManaged.sol b/contracts/OpsManaged.sol new file mode 100644 index 00000000..46c9d5bb --- /dev/null +++ b/contracts/OpsManaged.sol @@ -0,0 +1,112 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: Admin / Ops Permission Model +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./Owned.sol"; + +/** + @title OpsManaged + @notice Implements OpenST ownership and permission model +*/ +contract OpsManaged is Owned { + + address public opsAddress; + address public adminAddress; + + event AdminAddressChanged(address indexed _newAddress); + event OpsAddressChanged(address indexed _newAddress); + + + constructor() public + Owned() + { + } + + + modifier onlyAdmin() { + require(isAdmin(msg.sender)); + _; + } + + + modifier onlyAdminOrOps() { + require(isAdmin(msg.sender) || isOps(msg.sender)); + _; + } + + + modifier onlyOwnerOrAdmin() { + require(isOwner(msg.sender) || isAdmin(msg.sender)); + _; + } + + + modifier onlyOps() { + require(isOps(msg.sender)); + _; + } + + + function isAdmin(address _address) internal view returns (bool) { + return (adminAddress != address(0) && _address == adminAddress); + } + + + function isOps(address _address) internal view returns (bool) { + return (opsAddress != address(0) && _address == opsAddress); + } + + + function isOwnerOrOps(address _address) internal view returns (bool) { + return (isOwner(_address) || isOps(_address)); + } + + + // Owner and Admin can change the admin address. Address can also be set to 0 to 'disable' it. + function setAdminAddress(address _adminAddress) external onlyOwnerOrAdmin returns (bool) { + require(_adminAddress != owner); + require(_adminAddress != address(this)); + require(!isOps(_adminAddress)); + + adminAddress = _adminAddress; + + emit AdminAddressChanged(_adminAddress); + + return true; + } + + + // Owner and Admin can change the operations address. Address can also be set to 0 to 'disable' it. + function setOpsAddress(address _opsAddress) external onlyOwnerOrAdmin returns (bool) { + require(_opsAddress != owner); + require(_opsAddress != address(this)); + require(!isAdmin(_opsAddress)); + + opsAddress = _opsAddress; + + emit OpsAddressChanged(_opsAddress); + + return true; + } +} + + diff --git a/contracts/Owned.sol b/contracts/Owned.sol new file mode 100644 index 00000000..9d2899d9 --- /dev/null +++ b/contracts/Owned.sol @@ -0,0 +1,74 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: Basic Ownership Implementation +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +/** + @title Owned + @notice Implements basic ownership with 2-step transfers +*/ +contract Owned { + + address public owner; + address public proposedOwner; + + event OwnershipTransferInitiated(address indexed _proposedOwner); + event OwnershipTransferCompleted(address indexed _newOwner); + + + constructor() public { + owner = msg.sender; + } + + + modifier onlyOwner() { + require(isOwner(msg.sender)); + _; + } + + + function isOwner(address _address) internal view returns (bool) { + return (_address == owner); + } + + + function initiateOwnershipTransfer(address _proposedOwner) public onlyOwner returns (bool) { + proposedOwner = _proposedOwner; + + emit OwnershipTransferInitiated(_proposedOwner); + + return true; + } + + + function completeOwnershipTransfer() public returns (bool) { + require(msg.sender == proposedOwner); + + owner = proposedOwner; + proposedOwner = address(0); + + emit OwnershipTransferCompleted(owner); + + return true; + } +} + + diff --git a/contracts/ProofUtil.sol b/contracts/ProofUtil.sol new file mode 100644 index 00000000..2f062e57 --- /dev/null +++ b/contracts/ProofUtil.sol @@ -0,0 +1,33 @@ +pragma solidity ^0.4.23; + +import "./BytesLib.sol"; +import "./util.sol"; + +contract ProofUtil is Util { + + event StoragePath(uint256 index, bytes32 key, bytes indexBytes, bytes keyBytes, bytes k, bytes32 path); + + constructor(){} + + function getStoragePath( + uint256 _index, + bytes32 _key) + returns(bytes32 storagePath) + { + bytes memory indexBytes = BytesLib.leftPad(bytes32ToBytes(bytes32(_index))); + bytes memory keyBytes = BytesLib.leftPad(bytes32ToBytes(_key)); + bytes memory k = BytesLib.concat(keyBytes, indexBytes); + storagePath = keccak256(keccak256(k)); + emit StoragePath(_index, _key, indexBytes, keyBytes, k, storagePath); + return storagePath; + } + + function addressToBytes(address a) constant returns (bytes b){ + assembly { + let m := mload(0x40) + mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, a)) + mstore(0x40, add(m, 52)) + b := m + } + } +} diff --git a/contracts/ProtocolVersioned.sol b/contracts/ProtocolVersioned.sol new file mode 100644 index 00000000..05ea21f2 --- /dev/null +++ b/contracts/ProtocolVersioned.sol @@ -0,0 +1,149 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: ProtocolVersioned.sol +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +contract ProtocolVersioned { + + /* + * Events + */ + event ProtocolTransferInitiated(address indexed _existingProtocol, address indexed _proposedProtocol, uint256 _activationHeight); + event ProtocolTransferRevoked(address indexed _existingProtocol, address indexed _revokedProtocol); + event ProtocolTransferCompleted(address indexed _newProtocol); + + /* + * Constants + */ + /// Blocks to wait before the protocol transfer can be completed + /// This allows anyone with a stake to unstake under the existing + /// protocol if they disagree with the new proposed protocol + /// @dev from OpenST ^v1.0 this constant will be set to a significant value + /// ~ 1 week at 15 seconds per block + uint256 constant private PROTOCOL_TRANSFER_BLOCKS_TO_WAIT = 40320; + + /* + * Storage + */ + /// OpenST protocol contract + address public openSTProtocol; + /// proposed OpenST protocol + address public proposedProtocol; + /// earliest protocol transfer height + uint256 public earliestTransferHeight; + + /* + * Modifiers + */ + modifier onlyProtocol() { + require(msg.sender == openSTProtocol); + _; + } + + modifier onlyProposedProtocol() { + require(msg.sender == proposedProtocol); + _; + } + + modifier afterWait() { + require(earliestTransferHeight <= block.number); + _; + } + + modifier notNull(address _address) { + require(_address != 0); + _; + } + + // TODO: [ben] add hasCode modifier so that for + // a significant wait time the code at the proposed new + // protocol can be reviewed + + /* + * Public functions + */ + /// @dev Constructor set the OpenST Protocol + constructor(address _protocol) + public + notNull(_protocol) + { + openSTProtocol = _protocol; + } + + /// @dev initiate protocol transfer + function initiateProtocolTransfer( + address _proposedProtocol) + public + onlyProtocol + notNull(_proposedProtocol) + returns (bool) + { + require(_proposedProtocol != openSTProtocol); + require(proposedProtocol == address(0)); + + earliestTransferHeight = block.number + blocksToWaitForProtocolTransfer(); + proposedProtocol = _proposedProtocol; + + emit ProtocolTransferInitiated(openSTProtocol, _proposedProtocol, earliestTransferHeight); + + return true; + } + + /// @dev only after the waiting period, can + /// proposed protocol complete the transfer + function completeProtocolTransfer() + public + onlyProposedProtocol + afterWait + returns (bool) + { + openSTProtocol = proposedProtocol; + proposedProtocol = address(0); + earliestTransferHeight = 0; + + emit ProtocolTransferCompleted(openSTProtocol); + + return true; + } + + /// @dev protocol can revoke initiated protocol + /// transfer + function revokeProtocolTransfer() + public + onlyProtocol + returns (bool) + { + require(proposedProtocol != address(0)); + + address revokedProtocol = proposedProtocol; + proposedProtocol = address(0); + earliestTransferHeight = 0; + + emit ProtocolTransferRevoked(openSTProtocol, revokedProtocol); + + return true; + } + + function blocksToWaitForProtocolTransfer() public pure returns (uint256) { + return PROTOCOL_TRANSFER_BLOCKS_TO_WAIT; + } + +} \ No newline at end of file diff --git a/contracts/ProtocolVersionedMock.sol b/contracts/ProtocolVersionedMock.sol new file mode 100644 index 00000000..7a914b96 --- /dev/null +++ b/contracts/ProtocolVersionedMock.sol @@ -0,0 +1,41 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: ProtocolVersionedMock.sol +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./ProtocolVersioned.sol"; + +/// @title ProtocolVersionedMock +/// @dev Overrides certain durational constants and getters to ease testing ProtocolVersioned +contract ProtocolVersionedMock is ProtocolVersioned { + uint256 private constant PROTOCOL_TRANSFER_BLOCKS_TO_WAIT = 3; + + /* + * Public functions + */ + constructor(address _protocol) + ProtocolVersioned(_protocol) + public { } + + function blocksToWaitForProtocolTransfer() public pure returns (uint256) { + return PROTOCOL_TRANSFER_BLOCKS_TO_WAIT; + } +} \ No newline at end of file diff --git a/contracts/RLP.sol b/contracts/RLP.sol new file mode 100644 index 00000000..d498d0c2 --- /dev/null +++ b/contracts/RLP.sol @@ -0,0 +1,401 @@ +/** +* @title RLPReader +* +* RLPReader is used to read and parse RLP encoded data in memory. +* +* @author Andreas Olofsson (androlo1980@gmail.com) +*/ + +pragma solidity ^0.4.23; + +library RLP { + + uint constant DATA_SHORT_START = 0x80; + uint constant DATA_LONG_START = 0xB8; + uint constant LIST_SHORT_START = 0xC0; + uint constant LIST_LONG_START = 0xF8; + + uint constant DATA_LONG_OFFSET = 0xB7; + uint constant LIST_LONG_OFFSET = 0xF7; + + + struct RLPItem { + uint _unsafe_memPtr; // Pointer to the RLP-encoded bytes. + uint _unsafe_length; // Number of bytes. This is the full length of the string. + } + + struct Iterator { + RLPItem _unsafe_item; // Item that's being iterated over. + uint _unsafe_nextPtr; // Position of the next item in the list. + } + + /* Iterator */ + + function next(Iterator memory self) internal pure returns (RLPItem memory subItem) { + require(hasNext(self)); + uint ptr = self._unsafe_nextPtr; + uint itemLength = _itemLength(ptr); + subItem._unsafe_memPtr = ptr; + subItem._unsafe_length = itemLength; + self._unsafe_nextPtr = ptr + itemLength; + } + + function next(Iterator memory self, bool strict) internal pure returns (RLPItem memory subItem) { + subItem = next(self); + require(!(strict && !_validate(subItem))); + return; + } + + function hasNext(Iterator memory self) internal pure returns (bool) { + RLPItem memory item = self._unsafe_item; + return self._unsafe_nextPtr < item._unsafe_memPtr + item._unsafe_length; + } + + /* RLPItem */ + + /// @dev Creates an RLPItem from an array of RLP encoded bytes. + /// @param self The RLP encoded bytes. + /// @return An RLPItem + function toRLPItem(bytes memory self) internal pure returns (RLPItem memory) { + uint len = self.length; + if (len == 0) { + return RLPItem(0, 0); + } + uint memPtr; + assembly { + memPtr := add(self, 0x20) + } + return RLPItem(memPtr, len); + } + + /// @dev Creates an RLPItem from an array of RLP encoded bytes. + /// @param self The RLP encoded bytes. + /// @param strict Will throw if the data is not RLP encoded. + /// @return An RLPItem + function toRLPItem(bytes memory self, bool strict) internal pure returns (RLPItem memory) { + RLPItem memory item = toRLPItem(self); + if(strict) { + uint len = self.length; + require(_payloadOffset(item) <= len); + require(_itemLength(item._unsafe_memPtr) == len); + require(_validate(item)); + } + return item; + } + + /// @dev Check if the RLP item is null. + /// @param self The RLP item. + /// @return 'true' if the item is null. + function isNull(RLPItem memory self) internal pure returns (bool ret) { + return self._unsafe_length == 0; + } + + /// @dev Check if the RLP item is a list. + /// @param self The RLP item. + /// @return 'true' if the item is a list. + function isList(RLPItem memory self) internal pure returns (bool ret) { + if (self._unsafe_length == 0) + return false; + uint memPtr = self._unsafe_memPtr; + assembly { + ret := iszero(lt(byte(0, mload(memPtr)), 0xC0)) + } + } + + /// @dev Check if the RLP item is data. + /// @param self The RLP item. + /// @return 'true' if the item is data. + function isData(RLPItem memory self) internal pure returns (bool ret) { + if (self._unsafe_length == 0) + return false; + uint memPtr = self._unsafe_memPtr; + assembly { + ret := lt(byte(0, mload(memPtr)), 0xC0) + } + } + + /// @dev Check if the RLP item is empty (string or list). + /// @param self The RLP item. + /// @return 'true' if the item is null. + function isEmpty(RLPItem memory self) internal pure returns (bool ret) { + if(isNull(self)) + return false; + uint b0; + uint memPtr = self._unsafe_memPtr; + assembly { + b0 := byte(0, mload(memPtr)) + } + return (b0 == DATA_SHORT_START || b0 == LIST_SHORT_START); + } + + /// @dev Get the number of items in an RLP encoded list. + /// @param self The RLP item. + /// @return The number of items. + function items(RLPItem memory self) internal pure returns (uint) { + if (!isList(self)) + return 0; + uint b0; + uint memPtr = self._unsafe_memPtr; + assembly { + b0 := byte(0, mload(memPtr)) + } + uint pos = memPtr + _payloadOffset(self); + uint last = memPtr + self._unsafe_length - 1; + uint itms; + while(pos <= last) { + pos += _itemLength(pos); + itms++; + } + return itms; + } + + /// @dev Create an iterator. + /// @param self The RLP item. + /// @return An 'Iterator' over the item. + function iterator(RLPItem memory self) internal pure returns (Iterator memory it) { + require (isList(self)); + uint ptr = self._unsafe_memPtr + _payloadOffset(self); + it._unsafe_item = self; + it._unsafe_nextPtr = ptr; + } + + /// @dev Return the RLP encoded bytes. + /// @param self The RLPItem. + /// @return The bytes. + function toBytes(RLPItem memory self) internal pure returns (bytes memory bts) { + uint len = self._unsafe_length; + if (len == 0) + return; + bts = new bytes(len); + _copyToBytes(self._unsafe_memPtr, bts, len); + } + + /// @dev Decode an RLPItem into bytes. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toData(RLPItem memory self) internal pure returns (bytes memory bts) { + require(isData(self)); + uint rStartPos; + uint len; + (rStartPos, len) = _decode(self); + bts = new bytes(len); + _copyToBytes(rStartPos, bts, len); + } + + /// @dev Get the list of sub-items from an RLP encoded list. + /// Warning: This is inefficient, as it requires that the list is read twice. + /// @param self The RLP item. + /// @return Array of RLPItems. + function toList(RLPItem memory self) internal pure returns (RLPItem[] memory list) { + require(isList(self)); + uint numItems = items(self); + list = new RLPItem[](numItems); + Iterator memory it = iterator(self); + uint idx; + while(hasNext(it)) { + list[idx] = next(it); + idx++; + } + } + + /// @dev Decode an RLPItem into an ascii string. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toAscii(RLPItem memory self) internal pure returns (string memory str) { + require(isData(self)); + uint rStartPos; + uint len; + (rStartPos, len) = _decode(self); + bytes memory bts = new bytes(len); + _copyToBytes(rStartPos, bts, len); + str = string(bts); + } + + /// @dev Decode an RLPItem into a uint. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toUint(RLPItem memory self) internal pure returns (uint data) { + require(isData(self)); + uint rStartPos; + uint len; + (rStartPos, len) = _decode(self); + if (len > 32 || len == 0) + revert(); + assembly { + data := div(mload(rStartPos), exp(256, sub(32, len))) + } + } + + /// @dev Decode an RLPItem into a boolean. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toBool(RLPItem memory self) internal pure returns (bool data) { + require(isData(self)); + uint rStartPos; + uint len; + (rStartPos, len) = _decode(self); + require(len == 1); + uint temp; + assembly { + temp := byte(0, mload(rStartPos)) + } + require (temp <= 1); + return temp == 1 ? true : false; + } + + /// @dev Decode an RLPItem into a byte. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toByte(RLPItem memory self) internal pure returns (byte data) { + require(isData(self)); + uint rStartPos; + uint len; + (rStartPos, len) = _decode(self); + require(len == 1); + uint temp; + assembly { + temp := byte(0, mload(rStartPos)) + } + return byte(temp); + } + + /// @dev Decode an RLPItem into an int. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toInt(RLPItem memory self) internal pure returns (int data) { + return int(toUint(self)); + } + + /// @dev Decode an RLPItem into a bytes32. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toBytes32(RLPItem memory self) internal pure returns (bytes32 data) { + return bytes32(toUint(self)); + } + + /// @dev Decode an RLPItem into an address. This will not work if the + /// RLPItem is a list. + /// @param self The RLPItem. + /// @return The decoded string. + function toAddress(RLPItem memory self) internal pure returns (address data) { + require(isData(self)); + uint rStartPos; + uint len; + (rStartPos, len) = _decode(self); + require (len == 20); + assembly { + data := div(mload(rStartPos), exp(256, 12)) + } + } + + // Get the payload offset. + function _payloadOffset(RLPItem memory self) private pure returns (uint) { + if(self._unsafe_length == 0) + return 0; + uint b0; + uint memPtr = self._unsafe_memPtr; + assembly { + b0 := byte(0, mload(memPtr)) + } + if(b0 < DATA_SHORT_START) + return 0; + if(b0 < DATA_LONG_START || (b0 >= LIST_SHORT_START && b0 < LIST_LONG_START)) + return 1; + if(b0 < LIST_SHORT_START) + return b0 - DATA_LONG_OFFSET + 1; + return b0 - LIST_LONG_OFFSET + 1; + } + + // Get the full length of an RLP item. + function _itemLength(uint memPtr) private pure returns (uint len) { + uint b0; + assembly { + b0 := byte(0, mload(memPtr)) + } + if (b0 < DATA_SHORT_START) + len = 1; + else if (b0 < DATA_LONG_START) + len = b0 - DATA_SHORT_START + 1; + else if (b0 < LIST_SHORT_START) { + assembly { + let bLen := sub(b0, 0xB7) // bytes length (DATA_LONG_OFFSET) + let dLen := div(mload(add(memPtr, 1)), exp(256, sub(32, bLen))) // data length + len := add(1, add(bLen, dLen)) // total length + } + } + else if (b0 < LIST_LONG_START) + len = b0 - LIST_SHORT_START + 1; + else { + assembly { + let bLen := sub(b0, 0xF7) // bytes length (LIST_LONG_OFFSET) + let dLen := div(mload(add(memPtr, 1)), exp(256, sub(32, bLen))) // data length + len := add(1, add(bLen, dLen)) // total length + } + } + } + + // Get start position and length of the data. + function _decode(RLPItem memory self) private pure returns (uint memPtr, uint len) { + require(isData(self)); + uint b0; + uint start = self._unsafe_memPtr; + assembly { + b0 := byte(0, mload(start)) + } + if (b0 < DATA_SHORT_START) { + memPtr = start; + len = 1; + return; + } + if (b0 < DATA_LONG_START) { + len = self._unsafe_length - 1; + memPtr = start + 1; + } else { + uint bLen; + assembly { + bLen := sub(b0, 0xB7) // DATA_LONG_OFFSET + } + len = self._unsafe_length - 1 - bLen; + memPtr = start + bLen + 1; + } + return; + } + + // Assumes that enough memory has been allocated to store in target. + function _copyToBytes(uint btsPtr, bytes memory tgt, uint btsLen) private pure { + // Exploiting the fact that 'tgt' was the last thing to be allocated, + // we can write entire words, and just overwrite any excess. + assembly { + let i := 0 // Start at arr + 0x20 + let stopOffset := add(btsLen, 31) + let rOffset := btsPtr + let wOffset := add(tgt, 32) + for {} lt(i, stopOffset) { i := add(i, 32) } + { + mstore(add(wOffset, i), mload(add(rOffset, i))) + } + } + } + + // Check that an RLP item is valid. + function _validate(RLPItem memory self) private pure returns (bool ret) { + // Check that RLP is well-formed. + uint b0; + uint b1; + uint memPtr = self._unsafe_memPtr; + assembly { + b0 := byte(0, mload(memPtr)) + b1 := byte(1, mload(memPtr)) + } + if(b0 == DATA_SHORT_START + 1 && b1 < DATA_SHORT_START) + return false; + return true; + } +} diff --git a/contracts/RLPEncode.sol b/contracts/RLPEncode.sol new file mode 100644 index 00000000..8fa67936 --- /dev/null +++ b/contracts/RLPEncode.sol @@ -0,0 +1,77 @@ +// Library for RLP encoding a list of bytes arrays. +// Modeled after ethereumjs/rlp (https://github.com/ethereumjs/rlp) +// [Very] modified version of Sam Mayo's library. +pragma solidity ^0.4.18; +import "./BytesLib.sol"; + +library RLPEncode { + + // Encode an item (bytes) + function encodeItem(bytes memory self) internal pure returns (bytes) { + bytes memory encoded; + if(self.length == 1 && uint(self[0]) < 0x80) { + encoded = new bytes(1); + encoded = self; + } else { + encoded = BytesLib.concat(encodeLength(self.length, 128), self); + } + return encoded; + } + + // Encode a list of items + function encodeList(bytes[] memory self) internal pure returns (bytes) { + bytes memory encoded; + for (uint i=0; i < self.length; i++) { + encoded = BytesLib.concat(encoded, encodeItem(self[i])); + } + return BytesLib.concat(encodeLength(encoded.length, 192), encoded); + } + + // Hack to encode nested lists. If you have a list as an item passed here, included + // pass = true in that index. E.g. + // [item, list, item] --> pass = [false, true, false] + function encodeListWithPasses(bytes[] memory self, bool[] pass) internal pure returns (bytes) { + bytes memory encoded; + for (uint i=0; i < self.length; i++) { + if (pass[i] == true) { + encoded = BytesLib.concat(encoded, self[i]); + } else { + encoded = BytesLib.concat(encoded, encodeItem(self[i])); + } + } + return BytesLib.concat(encodeLength(encoded.length, 192), encoded); + } + + // Generate the prefix for an item or the entire list based on RLP spec + function encodeLength(uint256 L, uint256 offset) internal pure returns (bytes) { + if (L < 56) { + bytes memory prefix = new bytes(1); + prefix[0] = byte(L + offset); + return prefix; + } else { + // lenLen is the length of the hex representation of the data length + uint lenLen; + uint i = 0x1; + while(L/i != 0) { + lenLen++; + i *= 0x100; + } + bytes memory prefix0 = getLengthBytes(offset + 55 + lenLen); + bytes memory prefix1 = getLengthBytes(L); + return BytesLib.concat(prefix0, prefix1); + } + } + + function getLengthBytes(uint256 x) internal pure returns (bytes b) { + // Figure out if we need 1 or two bytes to express the length. + // 1 byte gets us to max 255 + // 2 bytes gets us to max 65535 (no payloads will be larger than this) + uint256 nBytes = 1; + if (x > 255) { nBytes = 2; } + b = new bytes(nBytes); + // Encode the length and return it + for (uint i = 0; i < nBytes; i++) { + b[i] = byte(uint8(x / (2**(8*(nBytes - 1 - i))))); + } + } +} diff --git a/contracts/Registrar.sol b/contracts/Registrar.sol new file mode 100644 index 00000000..c7473194 --- /dev/null +++ b/contracts/Registrar.sol @@ -0,0 +1,210 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: Registrar +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./OpsManaged.sol"; +// import "./CoreInterface.sol"; +import "./OpenSTValueInterface.sol"; +import "./OpenSTUtilityInterface.sol"; + +/// @title Registrar - registers for utility tokens +contract Registrar is OpsManaged { + + /* + * Storage + */ + // mapping(uint256 /* chainId */ => CoreInterface) cores; + + /* + * Public functions + */ + constructor() public + OpsManaged() + { + } + + /* + * OpenSTValue + */ + function confirmRedemptionIntent( + // address of OpenSTValue registry: + OpenSTValueInterface _registry, + // OpenSTValue function: + bytes32 _uuid, + address _redeemer, + uint256 _redeemerNonce, + address _beneficiary, + uint256 _amountUT, + uint256 _redemptionUnlockHeight, + bytes32 _hashLock, + bytes32 _redemptionIntentHash) + external + onlyOps + returns ( + uint256 amountST, + uint256 expirationHeight) + { + (amountST, expirationHeight) = _registry.confirmRedemptionIntent( + _uuid, + _redeemer, + _redeemerNonce, + _beneficiary, + _amountUT, + _redemptionUnlockHeight, + _hashLock, + _redemptionIntentHash); + + return (amountST, expirationHeight); + } + + function addCore( + // address of OpenSTValue registry: + OpenSTValueInterface _registry, + // OpenSTValue function: + CoreInterface _core) + public + onlyAdminOrOps + returns ( + bool /* success */) + { + return _registry.addCore(_core); + } + + function registerUtilityToken( + // address of OpenSTValue registry: + OpenSTValueInterface _registry, + // OpenSTValue function: + string _symbol, + string _name, + uint256 _conversionRate, + uint8 _conversionRateDecimals, + uint256 _chainIdUtility, + address _stakingAccount, + bytes32 _checkUuid) + public + onlyAdminOrOps + returns ( + bytes32 /* uuid */) + { + return _registry.registerUtilityToken( + _symbol, + _name, + _conversionRate, + _conversionRateDecimals, + _chainIdUtility, + _stakingAccount, + _checkUuid); + } + + // @dev this can be deprecated as anyone with the unlockSecret + // can now call the processRedeeming function + function processStaking( + // address of OpenSTValue registry: + OpenSTValueInterface _registry, + // OpenSTValue function: + bytes32 _stakingIntentHash, + bytes32 _unlockSecret) + external + onlyAdmin + returns ( + address stakeAddress) + { + return _registry.processStaking( + _stakingIntentHash, _unlockSecret); + } + + /* + * OpenSTUtility + */ + function confirmStakingIntent( + // address of OpenSTUtility registry: + OpenSTUtilityInterface _registry, + // OpenSTUtility function: + bytes32 _uuid, + address _staker, + uint256 _stakerNonce, + address _beneficiary, + uint256 _amountST, + uint256 _amountUT, + uint256 _stakingUnlockHeight, + bytes32 _hashLock, + bytes32 _stakingIntentHash) + external + onlyOps + returns ( + uint256 /* expirationHeight */) + { + return _registry.confirmStakingIntent( + _uuid, + _staker, + _stakerNonce, + _beneficiary, + _amountST, + _amountUT, + _stakingUnlockHeight, + _hashLock, + _stakingIntentHash); + } + + function registerBrandedToken( + // address of OpenSTUtility registry: + OpenSTUtilityInterface _registry, + // OpenSTUtility function: + string _symbol, + string _name, + uint256 _conversionRate, + uint8 _conversionRateDecimals, + address _requester, + UtilityTokenInterface _brandedToken, + bytes32 _checkUuid) + public + onlyAdminOrOps + returns ( + bytes32 /* registeredUuid */) + { + return _registry.registerBrandedToken( + _symbol, + _name, + _conversionRate, + _conversionRateDecimals, + _requester, + _brandedToken, + _checkUuid); + } + + // @dev this can be deprecated as anyone with the unlockSecret + // can now call the processRedeeming function + function processRedeeming( + // address of OpenSTUtility registry: + OpenSTUtilityInterface _registry, + // OpenSTUtility function: + bytes32 _redemptionIntentHash, + bytes32 _unlockSecret) + external + onlyAdmin + returns ( + address tokenAddress) + { + return _registry.processRedeeming( + _redemptionIntentHash, _unlockSecret); + } +} \ No newline at end of file diff --git a/contracts/STPrime.sol b/contracts/STPrime.sol new file mode 100644 index 00000000..a353283e --- /dev/null +++ b/contracts/STPrime.sol @@ -0,0 +1,154 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: STPrime +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +/// Simple Token Prime [ST'] is equivalently staked for with Simple Token +/// on the value chain and is the base token that pays for gas on the utility chain. +/// The gasprice on utility chains is set in [ST'-Wei/gas] (like Ether pays for gas +/// on Ethereum mainnet) when sending a transaction on the open utility chain. + +import "./SafeMath.sol"; + +// utility chain contracts +import "./UtilityTokenAbstract.sol"; +import "./STPrimeConfig.sol"; + + +/* + * @title STPrime + * @notice a freely tradable equivalent representation of Simple Token [ST] + * on Ethereum mainnet on the utility chain + * @dev STPrime functions as the base token to pay for gas consumption on the utility chain + * It is not an EIP20 token, but functions as the genesis guardian + * of the finite amount of base tokens on the utility chain + */ +contract STPrime is UtilityTokenAbstract, STPrimeConfig { + using SafeMath for uint256; + + + /* + * Storage + */ + /// set when ST' has received TOKENS_MAX tokens; + /// when uninitialised minting is not allowed + bool private initialized; + + /* + * Modifiers + */ + modifier onlyInitialized() { + require(initialized); + _; + } + + /* + * Public functions + */ + constructor( + bytes32 _uuid, + uint256 _chainIdValue, + uint256 _chainIdUtility, + uint256 _conversionRate, + uint8 _conversionRateDecimals) + public + UtilityTokenAbstract( + _uuid, + STPRIME_SYMBOL, + STPRIME_NAME, + _chainIdValue, + _chainIdUtility, + _conversionRate, + _conversionRateDecimals) + { } + + /// On setup of the utility chain the base tokens need to be transfered + /// in full to STPrime for the base tokens to be minted as ST' + function initialize() + public + payable + { + // @dev before the registrar registers a core on the value chain + // it must verify that the genesis exactly specified TOKENS_MAX + // so that all base tokens are held by STPrime + require(msg.value == TOKENS_MAX); + initialized = true; + } + + /// @dev transfer full claim to beneficiary + /// claim can be called publicly as the beneficiary + /// and amount are set, and this allows for reduced + /// steps on the user experience to complete the claim + /// automatically. + /// @notice for first stake of ST' the gas price by one validator + /// has to be zero to deploy the contracts and accept the very + /// first staking of ST for ST' and its protocol executions. + function claim( + address _beneficiary) + public + onlyInitialized + returns (bool /* success */) + { + uint256 amount = claimInternal(_beneficiary); + assert(address(this).balance >= amount); + + // transfer throws if insufficient funds + _beneficiary.transfer(amount); + + return true; + } + + /// @dev Mint new Simple Token Prime into circulation + /// and increase total supply accordingly. + /// Tokens are minted into a claim to ensure that + /// the protocol completion does not continue into + /// foreign contracts at _beneficiary. + function mint( + address _beneficiary, + uint256 _amount) + public + onlyProtocol + onlyInitialized + returns (bool /* success */) + { + // add the minted amount to the beneficiary's claim + return mintInternal(_beneficiary, _amount); + } + + /// @dev Burn utility tokens after having redeemed them + /// through the protocol for the staked Simple Token + function burn( + address _burner, + uint256 _amount) + public + onlyProtocol + onlyInitialized + payable + returns (bool /* success */) + { + // only accept the exact amount of base tokens to be returned + // to the ST' minting contract + require(msg.value == _amount); + + return burnInternal(_burner, _amount); + } +} \ No newline at end of file diff --git a/contracts/STPrimeConfig.sol b/contracts/STPrimeConfig.sol new file mode 100644 index 00000000..193a6447 --- /dev/null +++ b/contracts/STPrimeConfig.sol @@ -0,0 +1,36 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: STPrimeConfig +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +/* solhint-disable-next-line two-lines-top-level-separator */ +/// @title STPrimeConfig +contract STPrimeConfig { + string public constant STPRIME_SYMBOL = "STP"; + string public constant STPRIME_NAME = "SimpleTokenPrime"; + uint256 public constant STPRIME_CONVERSION_RATE = 1; + uint8 public constant TOKEN_DECIMALS = 18; + uint8 public constant STPRIME_CONVERSION_RATE_TOKEN_DECIMALS = 0; + + uint256 public constant DECIMALSFACTOR = 10**uint256(TOKEN_DECIMALS); + uint256 public constant TOKENS_MAX = 800000000 * DECIMALSFACTOR; +} diff --git a/contracts/SafeMath.sol b/contracts/SafeMath.sol new file mode 100644 index 00000000..47dd86bc --- /dev/null +++ b/contracts/SafeMath.sol @@ -0,0 +1,67 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: SafeMath Library Implementation +// +// http://www.simpletoken.org/ +// +// Based on the SafeMath library by the OpenZeppelin team. +// Copyright (c) 2016 Smart Contract Solutions, Inc. +// https://github.com/OpenZeppelin/zeppelin-solidity +// The MIT License. +// ---------------------------------------------------------------------------- + + +/** + @title SafeMath + @notice Implements SafeMath +*/ +library SafeMath { + + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a * b; + + assert(a == 0 || c / a == b); + + return c; + } + + + function div(uint256 a, uint256 b) internal pure returns (uint256) { + // Solidity automatically throws when dividing by 0 + uint256 c = a / b; + + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + return c; + } + + + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + assert(b <= a); + + return a - b; + } + + + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + + assert(c >= a); + + return c; + } +} diff --git a/contracts/SafeMathMock.sol b/contracts/SafeMathMock.sol new file mode 100644 index 00000000..951bacb7 --- /dev/null +++ b/contracts/SafeMathMock.sol @@ -0,0 +1,45 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Common: SafeMath Library Implementation +// +// http://www.simpletoken.org/ +// +// Based on the SafeMath library by the OpenZeppelin team. +// Copyright (c) 2016 Smart Contract Solutions, Inc. +// https://github.com/OpenZeppelin/zeppelin-solidity +// The MIT License. +// ---------------------------------------------------------------------------- + +import "./SafeMath.sol"; + + +contract SafeMathMock { + uint256 public result; + + function multiply(uint256 a, uint256 b) public { + result = SafeMath.mul(a, b); + } + + function subtract(uint256 a, uint256 b) public { + result = SafeMath.sub(a, b); + } + + function add(uint256 a, uint256 b) public { + result = SafeMath.add(a, b); + } +} \ No newline at end of file diff --git a/contracts/SimpleStake.sol b/contracts/SimpleStake.sol new file mode 100644 index 00000000..9d237b68 --- /dev/null +++ b/contracts/SimpleStake.sol @@ -0,0 +1,100 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// ValueChain: SimpleStake +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./EIP20Interface.sol"; +import "./SafeMath.sol"; +import "./ProtocolVersioned.sol"; + +/// @title SimpleStake - stakes the value of an EIP20 token on Ethereum +/// for a utility token on the OpenST platform +/// @author OpenST Ltd. +contract SimpleStake is ProtocolVersioned { + using SafeMath for uint256; + + /* + * Events + */ + event ReleasedStake(address indexed _protocol, address indexed _to, uint256 _amount); + + /* + * Storage + */ + /// EIP20 token contract that can be staked + EIP20Interface public eip20Token; + /// UUID for the utility token + bytes32 public uuid; + + /* + * Public functions + */ + /// @dev Contract constructor sets the protocol and the EIP20 token to stake + /// @param _eip20Token EIP20 token that will be staked + /// @param _openSTProtocol OpenSTProtocol contract that governs staking + /// @param _uuid Unique Universal Identifier of the registered utility token + constructor( + EIP20Interface _eip20Token, + address _openSTProtocol, + bytes32 _uuid) + ProtocolVersioned(_openSTProtocol) + public + { + eip20Token = _eip20Token; + uuid = _uuid; + } + + /// @dev Allows the protocol to release the staked amount + /// into provided address. + /// The protocol MUST be a contract that sets the rules + /// on how the stake can be released and to who. + /// The protocol takes the role of an "owner" of the stake. + /// @param _to Beneficiary of the amount of the stake + /// @param _amount Amount of stake to release to beneficiary + function releaseTo(address _to, uint256 _amount) + public + onlyProtocol + returns (bool) + { + require(_to != address(0)); + require(eip20Token.transfer(_to, _amount)); + + emit ReleasedStake(msg.sender, _to, _amount); + + return true; + } + + /* + * Web3 call functions + */ + /// @dev total stake is the balance of the staking contract + /// accidental transfers directly to SimpleStake bypassing + /// the OpenST protocol will not mint new utility tokens, + /// but will add to the total stake. + /// (accidental) donations can not be prevented + function getTotalStake() + public + view + returns (uint256) + { + return eip20Token.balanceOf(this); + } +} \ No newline at end of file diff --git a/contracts/SimpleToken/ERC20Interface.sol b/contracts/SimpleToken/ERC20Interface.sol new file mode 100644 index 00000000..f31eddee --- /dev/null +++ b/contracts/SimpleToken/ERC20Interface.sol @@ -0,0 +1,34 @@ +pragma solidity ^0.4.23; + +// ---------------------------------------------------------------------------- +// Standard ERC20 Interface +// +// Copyright (c) 2017 OpenST Ltd. +// https://simpletoken.org/ +// +// The MIT Licence. +// ---------------------------------------------------------------------------- + + +// ---------------------------------------------------------------------------- +// Based on the 'final' ERC20 token standard as specified at: +// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md +// ---------------------------------------------------------------------------- + +contract ERC20Interface { + + event Transfer(address indexed _from, address indexed _to, uint256 _value); + event Approval(address indexed _owner, address indexed _spender, uint256 _value); + + function name() public view returns (string); + function symbol() public view returns (string); + function decimals() public view returns (uint8); + function totalSupply() public view returns (uint256); + + function balanceOf(address _owner) public view returns (uint256 balance); + function allowance(address _owner, address _spender) public view returns (uint256 remaining); + + function transfer(address _to, uint256 _value) public returns (bool success); + function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); + function approve(address _spender, uint256 _value) public returns (bool success); +} diff --git a/contracts/SimpleToken/ERC20Token.sol b/contracts/SimpleToken/ERC20Token.sol new file mode 100644 index 00000000..7ffda10e --- /dev/null +++ b/contracts/SimpleToken/ERC20Token.sol @@ -0,0 +1,111 @@ +pragma solidity ^0.4.23; + +// ---------------------------------------------------------------------------- +// Standard ERC20 Token Implementation +// +// Copyright (c) 2017 OpenST Ltd. +// https://simpletoken.org/ +// +// The MIT Licence. +// ---------------------------------------------------------------------------- + +import "./ERC20Interface.sol"; +import "./Owned.sol"; +import "./SafeMath.sol"; + + +// +// Standard ERC20 implementation, with ownership. +// +contract ERC20Token is ERC20Interface, Owned { + + using SafeMath for uint256; + + string private tokenName; + string private tokenSymbol; + uint8 private tokenDecimals; + uint256 internal tokenTotalSupply; + + mapping(address => uint256) balances; + mapping(address => mapping (address => uint256)) allowed; + + + constructor(string _symbol, string _name, uint8 _decimals, uint256 _totalSupply) public + Owned() + { + tokenSymbol = _symbol; + tokenName = _name; + tokenDecimals = _decimals; + tokenTotalSupply = _totalSupply; + balances[owner] = _totalSupply; + + // According to the ERC20 standard, a token contract which creates new tokens should trigger + // a Transfer event and transfers of 0 values must also fire the event. + emit Transfer(0x0, owner, _totalSupply); + } + + + function name() public view returns (string) { + return tokenName; + } + + + function symbol() public view returns (string) { + return tokenSymbol; + } + + + function decimals() public view returns (uint8) { + return tokenDecimals; + } + + + function totalSupply() public view returns (uint256) { + return tokenTotalSupply; + } + + + function balanceOf(address _owner) public view returns (uint256) { + return balances[_owner]; + } + + + function allowance(address _owner, address _spender) public view returns (uint256 remaining) { + return allowed[_owner][_spender]; + } + + + function transfer(address _to, uint256 _value) public returns (bool success) { + // According to the EIP20 spec, "transfers of 0 values MUST be treated as normal + // transfers and fire the Transfer event". + // Also, should throw if not enough balance. This is taken care of by SafeMath. + balances[msg.sender] = balances[msg.sender].sub(_value); + balances[_to] = balances[_to].add(_value); + + emit Transfer(msg.sender, _to, _value); + + return true; + } + + + function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { + balances[_from] = balances[_from].sub(_value); + allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); + balances[_to] = balances[_to].add(_value); + + emit Transfer(_from, _to, _value); + + return true; + } + + + function approve(address _spender, uint256 _value) public returns (bool success) { + + allowed[msg.sender][_spender] = _value; + + emit Approval(msg.sender, _spender, _value); + + return true; + } + +} diff --git a/contracts/SimpleToken/MockToken.sol b/contracts/SimpleToken/MockToken.sol new file mode 100644 index 00000000..1d08b258 --- /dev/null +++ b/contracts/SimpleToken/MockToken.sol @@ -0,0 +1,44 @@ +pragma solidity ^0.4.23; + +// ---------------------------------------------------------------------------- +// Mock Token Contract +// +// Copyright (c) 2017 OpenST Ltd. +// https://simpletoken.org/ +// +// The MIT Licence. +// ---------------------------------------------------------------------------- + + +import "./ERC20Token.sol"; +import "./SimpleTokenConfig.sol"; +import "./OpsManaged.sol"; + +contract MockToken is ERC20Token, OpsManaged, SimpleTokenConfig { + + bool public finalized; + + + // Events + event Finalized(); + + constructor() public + ERC20Token("MOCK", "Mock Token", TOKEN_DECIMALS, TOKENS_MAX) + OpsManaged() + { } + + // Finalize functionality retained because it is expected by platform scripts + function finalize() external onlyAdmin returns (bool success) { + require(!finalized); + + finalized = true; + + emit Finalized(); + + return true; + } + + function remove() public onlyOwner { + selfdestruct(msg.sender); + } +} diff --git a/contracts/SimpleToken/OpsManaged.sol b/contracts/SimpleToken/OpsManaged.sol new file mode 100644 index 00000000..82f36935 --- /dev/null +++ b/contracts/SimpleToken/OpsManaged.sol @@ -0,0 +1,112 @@ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Admin / Ops Permission Model +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./Owned.sol"; + +/** + @title OpsManaged + @notice Implements OpenST ownership and permission model +*/ +contract OpsManaged is Owned { + + address public opsAddress; + address public adminAddress; + + event AdminAddressChanged(address indexed _newAddress); + event OpsAddressChanged(address indexed _newAddress); + + + constructor() public + Owned() + { + } + + + modifier onlyAdmin() { + require(isAdmin(msg.sender)); + _; + } + + + modifier onlyAdminOrOps() { + require(isAdmin(msg.sender) || isOps(msg.sender)); + _; + } + + + modifier onlyOwnerOrAdmin() { + require(isOwner(msg.sender) || isAdmin(msg.sender)); + _; + } + + + modifier onlyOps() { + require(isOps(msg.sender)); + _; + } + + + function isAdmin(address _address) internal view returns (bool) { + return (adminAddress != address(0) && _address == adminAddress); + } + + + function isOps(address _address) internal view returns (bool) { + return (opsAddress != address(0) && _address == opsAddress); + } + + + function isOwnerOrOps(address _address) internal view returns (bool) { + return (isOwner(_address) || isOps(_address)); + } + + + // Owner and Admin can change the admin address. Address can also be set to 0 to 'disable' it. + function setAdminAddress(address _adminAddress) external onlyOwnerOrAdmin returns (bool) { + require(_adminAddress != owner); + require(_adminAddress != address(this)); + require(!isOps(_adminAddress)); + + adminAddress = _adminAddress; + + emit AdminAddressChanged(_adminAddress); + + return true; + } + + + // Owner and Admin can change the operations address. Address can also be set to 0 to 'disable' it. + function setOpsAddress(address _opsAddress) external onlyOwnerOrAdmin returns (bool) { + require(_opsAddress != owner); + require(_opsAddress != address(this)); + require(!isAdmin(_opsAddress)); + + opsAddress = _opsAddress; + + emit OpsAddressChanged(_opsAddress); + + return true; + } +} + + diff --git a/contracts/SimpleToken/Owned.sol b/contracts/SimpleToken/Owned.sol new file mode 100644 index 00000000..6011d0b9 --- /dev/null +++ b/contracts/SimpleToken/Owned.sol @@ -0,0 +1,62 @@ +pragma solidity ^0.4.23; + +// ---------------------------------------------------------------------------- +// Basic Ownership Implementation +// +// Copyright (c) 2017 OpenST Ltd. +// https://simpletoken.org/ +// +// The MIT Licence. +// ---------------------------------------------------------------------------- + + +// +// Implements basic ownership with 2-step transfers. +// +contract Owned { + + address public owner; + address public proposedOwner; + + event OwnershipTransferInitiated(address indexed _proposedOwner); + event OwnershipTransferCompleted(address indexed _newOwner); + + + constructor() public { + owner = msg.sender; + } + + + modifier onlyOwner() { + require(isOwner(msg.sender)); + _; + } + + + function isOwner(address _address) internal view returns (bool) { + return (_address == owner); + } + + + function initiateOwnershipTransfer(address _proposedOwner) public onlyOwner returns (bool) { + proposedOwner = _proposedOwner; + + emit OwnershipTransferInitiated(_proposedOwner); + + return true; + } + + + function completeOwnershipTransfer() public returns (bool) { + require(msg.sender == proposedOwner); + + owner = proposedOwner; + proposedOwner = address(0); + + emit OwnershipTransferCompleted(owner); + + return true; + } +} + + diff --git a/contracts/SimpleToken/README.md b/contracts/SimpleToken/README.md new file mode 100644 index 00000000..a8748fa0 --- /dev/null +++ b/contracts/SimpleToken/README.md @@ -0,0 +1,3 @@ +# Simple Token EIP20 + +Include the contract code of the deployed Simple Token EIP20 contracts here for development ease. The official Simple Token repository is at [github.com/OpenSTFoundation/SimpleTokenSale](github.com/OpenSTFoundation/SimpleTokenSale). Simple Token has been deployed and went live on Ethereum mainnet on 14 November 2017 13 UTC at [0x2C4e8f2D746113d0696cE89B35F0d8bF88E0AEcA](https://etherscan.io/address/0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca) \ No newline at end of file diff --git a/contracts/SimpleToken/SafeMath.sol b/contracts/SimpleToken/SafeMath.sol new file mode 100644 index 00000000..c1e10459 --- /dev/null +++ b/contracts/SimpleToken/SafeMath.sol @@ -0,0 +1,52 @@ +pragma solidity ^0.4.23; + +// ---------------------------------------------------------------------------- +// SafeMath Library Implementation +// +// Copyright (c) 2017 OpenST Ltd. +// https://simpletoken.org/ +// +// The MIT Licence. +// +// Based on the SafeMath library by the OpenZeppelin team. +// Copyright (c) 2016 Smart Contract Solutions, Inc. +// https://github.com/OpenZeppelin/zeppelin-solidity +// The MIT License. +// ---------------------------------------------------------------------------- + + +library SafeMath { + + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a * b; + + assert(a == 0 || c / a == b); + + return c; + } + + + function div(uint256 a, uint256 b) internal pure returns (uint256) { + // Solidity automatically throws when dividing by 0 + uint256 c = a / b; + + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + return c; + } + + + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + assert(b <= a); + + return a - b; + } + + + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + + assert(c >= a); + + return c; + } +} diff --git a/contracts/SimpleToken/SimpleToken.sol b/contracts/SimpleToken/SimpleToken.sol new file mode 100644 index 00000000..d81d5072 --- /dev/null +++ b/contracts/SimpleToken/SimpleToken.sol @@ -0,0 +1,107 @@ +pragma solidity ^0.4.23; + +// ---------------------------------------------------------------------------- +// Simple Token Contract +// +// Copyright (c) 2017 OpenST Ltd. +// https://simpletoken.org/ +// +// The MIT Licence. +// ---------------------------------------------------------------------------- + + +import "./ERC20Token.sol"; +import "./SimpleTokenConfig.sol"; +import "./OpsManaged.sol"; + + +// +// SimpleToken is a standard ERC20 token with some additional functionality: +// - It has a concept of finalize +// - Before finalize, nobody can transfer tokens except: +// - Owner and operations can transfer tokens +// - Anybody can send back tokens to owner +// - After finalize, no restrictions on token transfers +// + +// +// Permissions, according to the ST key management specification. +// +// Owner Admin Ops +// transfer (before finalize) x x +// transferForm (before finalize) x x +// finalize x +// + +contract SimpleToken is ERC20Token, OpsManaged, SimpleTokenConfig { + + bool public finalized; + + + // Events + event Burnt(address indexed _from, uint256 _amount); + event Finalized(); + + + constructor() public + ERC20Token(TOKEN_SYMBOL, TOKEN_NAME, TOKEN_DECIMALS, TOKENS_MAX) + OpsManaged() + { + finalized = false; + } + + + // Implementation of the standard transfer method that takes into account the finalize flag. + function transfer(address _to, uint256 _value) public returns (bool success) { + checkTransferAllowed(msg.sender, _to); + + return super.transfer(_to, _value); + } + + + // Implementation of the standard transferFrom method that takes into account the finalize flag. + function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { + checkTransferAllowed(msg.sender, _to); + + return super.transferFrom(_from, _to, _value); + } + + + function checkTransferAllowed(address _sender, address _to) private view { + if (finalized) { + // Everybody should be ok to transfer once the token is finalized. + return; + } + + // Owner and Ops are allowed to transfer tokens before the sale is finalized. + // This allows the tokens to move from the TokenSale contract to a beneficiary. + // We also allow someone to send tokens back to the owner. This is useful among other + // cases, for the Trustee to transfer unlocked tokens back to the owner (reclaimTokens). + require(isOwnerOrOps(_sender) || _to == owner); + } + + // Implement a burn function to permit msg.sender to reduce its balance + // which also reduces tokenTotalSupply + function burn(uint256 _value) public returns (bool success) { + require(_value <= balances[msg.sender]); + + balances[msg.sender] = balances[msg.sender].sub(_value); + tokenTotalSupply = tokenTotalSupply.sub(_value); + + emit Burnt(msg.sender, _value); + + return true; + } + + + // Finalize method marks the point where token transfers are finally allowed for everybody. + function finalize() external onlyAdmin returns (bool success) { + require(!finalized); + + finalized = true; + + emit Finalized(); + + return true; + } +} diff --git a/contracts/SimpleToken/SimpleTokenConfig.sol b/contracts/SimpleToken/SimpleTokenConfig.sol new file mode 100644 index 00000000..5fad4922 --- /dev/null +++ b/contracts/SimpleToken/SimpleTokenConfig.sol @@ -0,0 +1,21 @@ +pragma solidity ^0.4.23; + +// ---------------------------------------------------------------------------- +// Token Configuration +// +// Copyright (c) 2017 OpenST Ltd. +// https://simpletoken.org/ +// +// The MIT Licence. +// ---------------------------------------------------------------------------- + + +contract SimpleTokenConfig { + + string public constant TOKEN_SYMBOL = "ST"; + string public constant TOKEN_NAME = "Simple Token"; + uint8 public constant TOKEN_DECIMALS = 18; + + uint256 public constant DECIMALSFACTOR = 10**uint256(TOKEN_DECIMALS); + uint256 public constant TOKENS_MAX = 800000000 * DECIMALSFACTOR; +} diff --git a/contracts/UtilityTokenAbstract.sol b/contracts/UtilityTokenAbstract.sol new file mode 100644 index 00000000..cee223f5 --- /dev/null +++ b/contracts/UtilityTokenAbstract.sol @@ -0,0 +1,221 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: UtilityTokenAbstract +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./SafeMath.sol"; +import "./Hasher.sol"; +import "./ProtocolVersioned.sol"; + +// utility chain contracts +import "./UtilityTokenInterface.sol"; + + +/// @title UtilityToken abstract +contract UtilityTokenAbstract is Hasher, ProtocolVersioned, UtilityTokenInterface { + using SafeMath for uint256; + + /* + * Events + */ + /// Minted raised when new utility tokens are minted for a beneficiary + /// Minted utility tokens still need to be claimed by anyone to transfer + /// them to the beneficiary. + event Minted(bytes32 indexed _uuid, address indexed _beneficiary, + uint256 _amount, uint256 _unclaimed, uint256 _totalSupply); + + event Burnt(bytes32 indexed _uuid, address indexed _account, + uint256 _amount, uint256 _totalSupply); + + /* + * Storage + */ + /// UUID for the utility token + bytes32 private tokenUuid; + /// totalSupply holds the total supply of utility tokens + uint256 private totalTokenSupply; + /// conversion rate for the utility token + uint256 private tokenConversionRate; + /// conversion rate decimal factor + uint8 private tokenConversionRateDecimals; + /// tokenChainIdValue is an invariant in the tokenUuid calculation + uint256 private tokenChainIdValue; + /// tokenChainIdUtility is an invariant in the tokenUuid calculation + uint256 private tokenChainIdUtility; + /// tokenOpenSTUtility is an invariant in the tokenUuid calculation + address private tokenOpenSTUtility; + /// claims is follows EIP20 allowance pattern but + /// for a staker to stake the utility token for a beneficiary + mapping(address => uint256) private claims; + + /* + * Public functions + */ + constructor( + bytes32 _uuid, + string _symbol, + string _name, + uint256 _chainIdValue, + uint256 _chainIdUtility, + uint256 _conversionRate, + uint8 _conversionRateDecimals) + public + ProtocolVersioned(msg.sender) + { + tokenUuid = hashUuid( + _symbol, + _name, + _chainIdValue, + _chainIdUtility, + msg.sender, + _conversionRate, + _conversionRateDecimals); + + require(tokenUuid == _uuid); + + totalTokenSupply = 0; + tokenConversionRate = _conversionRate; + tokenConversionRateDecimals = _conversionRateDecimals; + tokenChainIdValue = _chainIdValue; + tokenChainIdUtility = _chainIdUtility; + tokenOpenSTUtility = msg.sender; + } + + /// @dev Get totalTokenSupply as view so that child cannot edit + function totalSupply() + public + view + returns (uint256 /* supply */) + { + return totalTokenSupply; + } + + /// @dev Get tokenUuid as view so that child cannot edit + function uuid() + public + view + returns (bytes32 /* uuid */) + { + return tokenUuid; + } + + /// @dev Get tokenConversionRate as view so that child cannot edit + function conversionRate() + public + view + returns (uint256 /* rate */) + { + return tokenConversionRate; + } + + /// @dev Get conversion rate decimal factor for utility token + function conversionRateDecimals() + public + view + returns (uint8 /*conversionRateDecimals*/) + { + return tokenConversionRateDecimals; + } + + /// @dev Get tokenChainIdValue as view so that child cannot edit + function genesisChainIdValue() + public + view + returns (uint256 /* tokenChainIdValue */) + { + return tokenChainIdValue; + } + + /// @dev Get tokenChainIdUtility as view so that child cannot edit + function genesisChainIdUtility() + public + view + returns (uint256 /* tokenChainIdUtility */) + { + return tokenChainIdUtility; + } + + /// @dev Get tokenOpenSTUtility as view so that child cannot edit + function genesisOpenSTUtility() + public + view + returns (address /* tokenOpenSTUtility */) + { + return tokenOpenSTUtility; + } + + /// @dev returns unclaimed amount for beneficiary + function unclaimed( + address _beneficiary) + public + view + returns (uint256 /* amount */) + { + return claims[_beneficiary]; + } + + /* + * Internal functions + */ + /// @dev claim transfers all utility tokens to _beneficiary + function claimInternal( + address _beneficiary) + internal + returns (uint256 amount) + { + amount = claims[_beneficiary]; + claims[_beneficiary] = 0; + + return amount; + } + + /// @dev Mint new utility token by adding a claim + /// for the beneficiary + function mintInternal( + address _beneficiary, + uint256 _amount) + internal + returns (bool /* success */) + { + totalTokenSupply = totalTokenSupply.add(_amount); + claims[_beneficiary] = claims[_beneficiary].add(_amount); + + emit Minted(tokenUuid, _beneficiary, _amount, claims[_beneficiary], totalTokenSupply); + + return true; + } + + /// @dev Burn utility tokens after having redeemed them + /// through the protocol for the staked Simple Token + function burnInternal( + address _burner, + uint256 _amount) + internal + returns (bool /* success */) + { + totalTokenSupply = totalTokenSupply.sub(_amount); + + emit Burnt(tokenUuid, _burner, _amount, totalTokenSupply); + + return true; + } +} \ No newline at end of file diff --git a/contracts/UtilityTokenAbstractMock.sol b/contracts/UtilityTokenAbstractMock.sol new file mode 100644 index 00000000..b33d2915 --- /dev/null +++ b/contracts/UtilityTokenAbstractMock.sol @@ -0,0 +1,101 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: UtilityTokenAbstractMock.sol +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./UtilityTokenAbstract.sol"; + + +/// @title UtilityTokenAbstractMock +/// @dev Implements mock claim, mint, and burn functions +/// and wraps internal functions to enable testing UtilityTokenAbstract +contract UtilityTokenAbstractMock is UtilityTokenAbstract { + + constructor( + bytes32 _uuid, + string _symbol, + string _name, + uint256 _chainIdValue, + uint256 _chainIdUtility, + uint256 _conversionRate, + uint8 _conversionRateDecimals) + public + UtilityTokenAbstract( + _uuid, + _symbol, + _name, + _chainIdValue, + _chainIdUtility, + _conversionRate, + _conversionRateDecimals) + ProtocolVersioned(msg.sender) + { } + + /// @dev Mock claim function + function claim(address _beneficiary) public returns (bool success) { + _beneficiary; + success = true; + } + + /// @dev Mock mint function + function mint(address _beneficiary, uint256 _amount) public returns (bool success) { + _beneficiary; + _amount; + success = true; + } + + /// @dev Mock burn function + function burn(address _redeemer, uint256 _amount) public payable returns (bool success) { + _redeemer; + _amount; + success = true; + } + + /// @dev Public wrapper for claimInternal + function claimInternalPublic( + address _beneficiary) + public + returns (uint256 amount) + { + amount = claimInternal(_beneficiary); + } + + /// @dev Public wrapper for mintInternal + function mintInternalPublic( + address _beneficiary, + uint256 _amount) + public + returns (bool /* success */) + { + return mintInternal(_beneficiary, _amount); + } + + /// @dev Public wrapper for burnInternal + function burnInternalPublic( + address _redeemer, + uint256 _amount) + public + returns (bool /* success */) + { + return burnInternal(_redeemer, _amount); + } +} \ No newline at end of file diff --git a/contracts/UtilityTokenInterface.sol b/contracts/UtilityTokenInterface.sol new file mode 100644 index 00000000..f007e5b0 --- /dev/null +++ b/contracts/UtilityTokenInterface.sol @@ -0,0 +1,43 @@ +/* solhint-disable-next-line compiler-fixed */ +pragma solidity ^0.4.23; + +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: UtilityTokenInterface +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +contract UtilityTokenInterface { + + /// @dev transfer full claim to beneficiary + function claim(address _beneficiary) public returns (bool success); + /// @dev Mint new utility token into claim for beneficiary + function mint(address _beneficiary, uint256 _amount) public returns (bool success); + /// @dev Burn utility tokens after having redeemed them + /// through the protocol for the staked Simple Token + function burn(address _burner, uint256 _amount) public payable returns (bool success); + + /// @dev Get totalTokenSupply as view so that child cannot edit + function totalSupply() public view returns (uint256 supply); + /// @dev Get unique universal identifier for utility token + function uuid() public view returns (bytes32 getUuid); + /// @dev Get conversion rate for utility token + function conversionRate() public view returns (uint256 rate); + /// @dev Get conversion rate decimal factor for utility token + function conversionRateDecimals() public view returns (uint8 rateDecimal); +} \ No newline at end of file diff --git a/contracts/Workers.sol b/contracts/Workers.sol new file mode 100644 index 00000000..00a08f04 --- /dev/null +++ b/contracts/Workers.sol @@ -0,0 +1,151 @@ +pragma solidity ^0.4.23; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: Workers +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./SafeMath.sol"; +import "./EIP20Interface.sol"; +import "./OpsManaged.sol"; +import "./WorkersInterface.sol"; + +/// A set of authorised workers +contract Workers is WorkersInterface, OpsManaged { + using SafeMath for uint256; + + EIP20Interface private eip20token; + /* + * Storage + */ + /// workers are active up unto the deactivation height + mapping(address => uint256 /* deactivation height */) public workers; + + /* + * Events + */ + ///Event for worker set + event WorkerSet( + address indexed _worker, + uint256 indexed _deactivationHeight, + uint256 _remainingHeight); + + ///Event for worker removed + event WorkerRemoved( + address indexed _worker, + bool _existed); + + /// @dev Constructor; + /// public method; + constructor( + address _eip20token) + public + OpsManaged() + { + require(_eip20token != address(0)); + + eip20token = EIP20Interface(_eip20token); + } + + /// @dev Takes _worker, _deactivationHeight; + /// Sets worker and its deactivation height; + /// external method; + /// @param _worker worker + /// @param _deactivationHeight deactivationHeight + /// @return (remainingHeight) + function setWorker( + address _worker, + uint256 _deactivationHeight) + external + onlyOps() + returns (uint256 /* remaining activation length */) + { + require(_worker != address(0)); + require(_deactivationHeight >= block.number); + + workers[_worker] = _deactivationHeight; + uint256 remainingHeight = _deactivationHeight.sub(block.number); + //Event for worker set + emit WorkerSet(_worker, _deactivationHeight, remainingHeight); + + return (remainingHeight); + } + + /// @dev Takes _worker; + /// removes the worker; + /// external method; + /// @param _worker worker + /// @return (existed) + function removeWorker( + address _worker) + external + onlyOps() + returns (bool existed) + { + existed = (workers[_worker] > 0); + + delete workers[_worker]; + //Event for worker removed + emit WorkerRemoved(_worker, existed); + + return existed; + } + + /// @dev Clean up or collectively revoke all workers; + /// external method; + /// only called by ops or admin; + function remove() + external + onlyAdminOrOps() + { + selfdestruct(msg.sender); + } + + /// @dev Takes _worker; + /// checks if the worker is valid; + /// external method; + /// @param _worker worker + /// @return (isValid) + function isWorker( + address _worker) + external + view + returns (bool /* is active worker */) + { + return (workers[_worker] >= block.number); + } + /// @dev Takes _spender and _amount; + /// approves spender to spend amount; + /// external method; + /// @param _spender spender; + /// _amount amount; + /// @return (bool) + function approve( + address _spender, + uint256 _amount) + external + onlyOps() + returns (bool success) + { + require(eip20token.approve(_spender, _amount)); + + return true; + } + +} \ No newline at end of file diff --git a/contracts/WorkersInterface.sol b/contracts/WorkersInterface.sol new file mode 100644 index 00000000..083a517c --- /dev/null +++ b/contracts/WorkersInterface.sol @@ -0,0 +1,66 @@ +pragma solidity ^0.4.23; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Value chain: WorkersInterface +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +/// A set of authorised workers +contract WorkersInterface { + + function setWorker( + address _worker, + uint256 _deactivationHeight) + external + returns (uint256 /* remaining activation length */); + + /// @dev Takes _worker; + /// removes the worker; + /// external method; + /// @param _worker worker + /// @return (existed) + function removeWorker( + address _worker) + external + returns (bool /* existed */); + + /// @dev Clean up or collectively revoke all workers; + /// external method; + /// only called by ops or admin; + function remove() + external; + + /// @dev Takes _worker; + /// checks if the worker is valid; + /// external method; + /// @param _worker worker + /// @return (isValid) + function isWorker( + address _worker) + external + view + returns (bool /* is active worker */); + + function approve( + address _spender, + uint256 _amount) + external + returns (bool success); + +} \ No newline at end of file diff --git a/contracts/compile.sh b/contracts/compile.sh new file mode 100644 index 00000000..10891e24 --- /dev/null +++ b/contracts/compile.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +CONTRACTDIR=./contracts/*.sol +ABIDIRUTILITY=./contracts/abi +BINDIRVALUE=./contracts/bin + +mkdir -p "$ABIDIRUTILITY" +mkdir -p "$BINDIRVALUE" + +for filename in $CONTRACTDIR; do + echo "" + echo "Compiling ${filename}" + echo "" + solc --abi --optimize --optimize-runs 200 --overwrite ${filename} -o $ABIDIRUTILITY + solc --bin --optimize --optimize-runs 200 --overwrite ${filename} -o $BINDIRVALUE +done \ No newline at end of file diff --git a/contracts/truffle/Migrations.sol b/contracts/truffle/Migrations.sol new file mode 100644 index 00000000..03ea8c3e --- /dev/null +++ b/contracts/truffle/Migrations.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.4.4; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + modifier restricted() { + if (msg.sender == owner) _; + } + + function Migrations() public { + owner = msg.sender; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } + + function upgrade(address new_address) public restricted { + Migrations upgraded = Migrations(new_address); + upgraded.setCompleted(last_completed_migration); + } +} diff --git a/contracts/util.sol b/contracts/util.sol new file mode 100644 index 00000000..39e5a043 --- /dev/null +++ b/contracts/util.sol @@ -0,0 +1,210 @@ +pragma solidity ^0.4.23; + +contract Util { + + function bytesToNibbles(bytes str) internal pure returns (uint8[]) { + uint8[] memory res = new uint8[](str.length*2); + for (uint i = 0; i < str.length; i++) { + uint8 elem = uint8(str[i]); + res[i*2] = (elem / 16) & 15; + res[i*2+1] = elem & 15; + } + return res; + } + + function bytesToBytes32(bytes rlp) internal pure returns (bytes32) { + bytes32 res; + assembly { + res := mload(add(32,rlp)) + } + return res; + } + + function bytes32ToBytes(bytes32 a) internal pure returns (bytes) { + bytes memory res = new bytes(32); + assembly { + mstore(add(32,res), a) + } + return res; + } + + function readSize(bytes rlp, uint idx, uint len) public pure returns (uint) { + uint res = 0; + for (uint i = 0; i < len; i++) res = 256*res + uint8(rlp[idx+i]); + return res; + } + + function readInteger(bytes rlp) public pure returns (uint) { + if (rlp.length == 0) return 0; + uint8 elem = uint8(rlp[0]); + if (elem < 128) return elem; + return readSize(rlp, 1, elem-128); + } + + // length in bytes of the RLP element starting at position idx + function rlpByteLength(bytes rlp, uint idx) public pure returns (uint, uint) { + uint8 elem = uint8(rlp[idx]); + if (elem < 128) return (1, 0); + if (elem == 128) return (0, 1); + if (elem >= 247) { + return (readSize(rlp, idx+1, elem-247), elem-247+1); + } + if (elem >= 192) { + return (elem - 192, 1); + } + if (elem >= 183) { + return (readSize(rlp, idx+1, elem-183), elem-183+1); + } + return (elem - 128, 1); + } + + function rlpSizeLength(bytes rlp, uint idx) public pure returns (uint) { + uint8 elem = uint8(rlp[idx]); + if (elem < 128) return 0; + if (elem == 128) return 1; + if (elem >= 247) { + return elem-247+1; + } + if (elem >= 192) { + return 1; + } + if (elem >= 183) { + return elem-183+1; + } + return 1; + } + + // length in bytes of the RLP element starting at position idx + function rlpByteSkipLength(bytes rlp, uint idx) public pure returns (uint) { + uint8 elem = uint8(rlp[idx]); + if (elem < 128) return 1; + if (elem == 128) return 1; + if (elem >= 247) { + return (readSize(rlp, idx+1, elem-247) + elem-247+1); + } + if (elem >= 192) { + return (elem - 192 + 1); + } + if (elem >= 183) { + return (readSize(rlp, idx+1, elem-183) + elem-183+1); + } + return (elem - 128 + 1); + } + + // how many elements in an RLP array + function rlpArrayLength(bytes rlp, uint idx) public pure returns (uint) { + uint len; + uint szlen; + (len, szlen) = rlpByteLength(rlp, idx); + if (len == 0) return 0; + uint jdx = idx+szlen; + uint res = 0; + while (jdx < len+idx+szlen) { + jdx += rlpByteSkipLength(rlp, jdx); + res++; + } + return res; + } + + function sliceBytes(bytes b, uint idx, uint len) internal pure returns (bytes) { + bytes memory res = new bytes(len); + for (uint i = 0; i < len; i++) res[i] = b[idx+i]; + return res; + } + + function slice(uint8[] storage b, uint idx, uint len) internal view returns (uint8[]) { + uint8[] memory res = new uint8[](len); + for (uint i = 0; i < len; i++) res[i] = b[idx+i]; + return res; + } + + function rlpFindBytes(bytes memory rlp, uint n) public pure returns (bytes) { + uint idx = rlpSizeLength(rlp, 0); + for (uint i = 0; i < n; i++) { + idx += rlpByteSkipLength(rlp, idx); + } + return sliceBytes(rlp, idx, rlpByteSkipLength(rlp, idx)); + } + + function integerLength(uint n) public pure returns (uint8) { + uint8 res = 0; + while (n != 0) { + n = n/256; + res++; + } + return res; + } + + function arrayPrefix(uint len) public pure returns (bytes) { + if (len < 56) { + bytes memory res = new bytes(1); + res[0] = byte(len+192); + return res; + } + else { + uint ilen = integerLength(len); + bytes memory res2 = new bytes(1+ilen); + res2[0] = byte(247+ilen); + for (uint i = 1; i < ilen+1; i++) { + res2[ilen-i+1] = byte(len&0xff); + len = len/256; + } + return res2; + } + } + + function rlpInteger(uint n) public pure returns (bytes) { + bytes memory res; + if (n == 0) { + res = new bytes(1); + res[0] = 0x80; + return res; + } + if (n < 128) { + res = new bytes(1); + res[0] = byte(uint8(n)); + return res; + } + uint ilen = integerLength(n); + res = new bytes(1+ilen); + res[0] = byte(128+ilen); + for (uint i = 1; i < ilen; i++) { + res[ilen-i] = byte(n&0xff); + n = n/256; + } + return res; + } + + // unmangle HP encoding to boolean value and nibbles + function unhp(bytes b) internal pure returns (bool tval, uint8[] res) { + uint8 elem = uint8(b[0]); + uint8 flag = elem/16; + tval = (flag & 0x2 == 1); + bool even = (flag & 0x1 == 0); + uint len = ((b.length-1) / 2) + (even ? 0 : 1); + res = new uint8[](len); + uint idx = 0; + if (!even) { + idx = 1; + res[0] = elem&0xf; + } + for (uint i = 1; i < b.length; i++) { + uint8 elem1 = uint8(b[i]); + res[idx+i*2] = (elem1 / 16) & 15; + res[idx+i*2+1] = elem1 & 15; + } + } + + function matchingNibbleLength(uint8[] a, uint8[] b) internal pure returns (uint) { + uint len = a.length > b.length ? b.length : a.length; + for (uint i = 0; i < len; i++) { + if (a[i] != b[i]) return i; + } + return i; + } + + + +} + + diff --git a/dev/local-poa-geth.sh b/dev/local-poa-geth.sh new file mode 100644 index 00000000..5c662d53 --- /dev/null +++ b/dev/local-poa-geth.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +# local PoA geth - PoA geth + +add-apt-repository -y ppa:ethereum/ethereum +apt-get update +# apt install -y build-essential +apt-get install -y ethereum solc + +#wget https://nodejs.org/dist/v8.7.0/node-v8.7.0.tar.gz +#tar zxf node-v8.7.0.tar.gz node-v8.7.0 +#cd node-v8.7.0 +#./configure && make && make install + +wget -q https://nodejs.org/dist/v8.7.0/node-v8.7.0-linux-x64.tar.xz +tar -xf node-v8.7.0-linux-x64.tar.xz +mv node-v8.7.0-linux-x64 /usr/local +ln -s /usr/local/node-v8.7.0-linux-x64/bin/node /usr/local/bin/node +ln -s /usr/local/node-v8.7.0-linux-x64/bin/npm /usr/local/bin/npm +ln -s /usr/local/node-v8.7.0-linux-x64/bin/npx /usr/local/bin/npx +rm node-v8.7.0-linux-x64.tar.xz + +npm install -g truffle +export PATH="$PATH:/usr/local/node-v8.7.0-linux-x64/bin" \ No newline at end of file diff --git a/docs/OpenSTwp.pdf b/docs/OpenSTwp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1ffa4cda2eea7cee7f9923dfcfddc191f0566d3f GIT binary patch literal 883918 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%0DD>*>f=?K=SecxjS0&FG=E=) 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≫O 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%0A!Vq*xi)x&zJ!o47X^no{$TK>#`7&>K`?6`3HSD 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