diff --git a/.circleci/config.yml b/.circleci/config.yml index 756909023..46202367d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2 job_common: &job_common docker: - - image: circleci/node:8.12-stretch + - image: circleci/node:10.12-stretch working_directory: ~/argent-contracts step_save_cache: &step_save_cache save_cache: @@ -27,7 +27,7 @@ jobs: - <<: *step_restore_cache - <<: *step_setup_global_packages - run: - name: "Lint contracts" + name: "Lint Solidity contracts" command: npm run lint:contracts - run: name: "Compiling external library contracts" @@ -35,18 +35,22 @@ jobs: - run: name: "Compiling contracts" command: npm run compile + - run: + name: "Lint JavaScript" + command: npm run lint:js - run: name: "Running unit tests" command: npm run ganache >/dev/null 2>&1 & npm run test - run: name: "Testing deployment scripts" command: npm run ganache >/dev/null 2>&1 & npm run test:deployment + - run: + name: "Running coverage" + command: npm run test:coverage - <<: *step_save_cache - # Save test results to artifacts - - store_test_results: - path: test-results.xml + # Save coverage artifacts - store_artifacts: - path: test-results.xml + path: coverage workflows: version: 2 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..fa43f3a3e --- /dev/null +++ b/.eslintignore @@ -0,0 +1,6 @@ +#/node_modules/* ignored by default + +build/* +contracts/* +coverage/* +lib/* \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..1fc0f7680 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,25 @@ +{ + "extends": "airbnb-base", + "env": { + "commonjs": true, + "node": true, + "mocha": true + }, + "globals": { + "web3": true, + "assert": true, + "contract": true + }, + "rules": { + "max-len": [2, { "code": 150, "ignoreComments": true }], + "quotes": [2, "double", "avoid-escape"], + "no-console": "off", + "no-underscore-dangle": "off", + "no-await-in-loop": "off", + "no-restricted-syntax": "off", + "guard-for-in": "off" + }, + "parserOptions": { + "ecmaVersion": 2018 + } +} diff --git a/.gitignore b/.gitignore index 06a40bf8c..167e167db 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ node_modules build tmp bin +.outputParameter ## Core latex/pdflatex auxiliary files: *.aux @@ -22,15 +23,19 @@ bin .DS_Store .node-xmlhttprequest-sync-* .vscode +.outputParameter .env -*.sh utils/config/*.json !utils/config/ganache.json +!utils/config/kovan.json +!utils/config/kovan-fork.json ## Etherlime **/.etherlime-store flat - - - +.coverage_artifacts +.coverage_contracts +.coverage_tests +coverage +coverage.json \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index a6b160408..be046a9bd 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -8.12.0 \ No newline at end of file +10.12.0 \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..5b4bd64be --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +*.sol +*.js \ No newline at end of file diff --git a/.soliumignore b/.soliumignore index aa96d5ba2..e54f34412 100644 --- a/.soliumignore +++ b/.soliumignore @@ -2,47 +2,5 @@ node_modules migrations openzeppelin-solidity lib -contracts/test/CryptoKitties.sol -contracts/test/KyberNetworkTest.sol -contracts/test/TestContract.sol -contracts/test/TestERC20.sol -contracts/test/TestERC721.sol -contracts/test/argent/legacy/LegacyBaseWallet.sol -contracts/test/argent/legacy/TokenTransfer.sol -contracts/test/argent/utils/ERC20Approver.sol -contracts/test/argent/utils/NewTestModule.sol -contracts/test/argent/utils/NonCompliantGuardian.sol -contracts/test/argent/utils/OldTestModule.sol -contracts/test/argent/utils/TestDapp.sol -contracts/test/argent/utils/TestModule.sol -contracts/test/argent/utils/TestOnlyOwnerModule.sol -contracts/test/compound/CErc20.sol -contracts/test/compound/CEther.sol -contracts/test/compound/CToken.sol -contracts/test/compound/CarefulMath.sol -contracts/test/compound/Comptroller.sol -contracts/test/compound/ComptrollerInterface.sol -contracts/test/compound/ComptrollerStorage.sol -contracts/test/compound/EIP20Interface.sol -contracts/test/compound/EIP20NonStandardInterface.sol -contracts/test/compound/ErrorReporter.sol -contracts/test/compound/Exponential.sol -contracts/test/compound/InterestRateModel.sol -contracts/test/compound/Maximillion.sol -contracts/test/compound/PriceOracle.sol -contracts/test/compound/PriceOracleProxy.sol -contracts/test/compound/ReentrancyGuard.sol -contracts/test/compound/SimplePriceOracle.sol -contracts/test/compound/Unitroller.sol -contracts/test/compound/WhitePaperInterestRateModel.sol -contracts/test/maker/DS/DSAuth.sol -contracts/test/maker/DS/DSMath.sol -contracts/test/maker/DS/DSNote.sol -contracts/test/maker/DS/DSStop.sol -contracts/test/maker/DS/DSThing.sol -contracts/test/maker/DS/DSToken.sol -contracts/test/maker/DS/DSValue.sol -contracts/test/maker/MockScdMcdMigration.sol -contracts/test/maker/SaiTub.sol -contracts/test/maker/SaiVox.sol -contracts/test/maker/WETH9.sol \ No newline at end of file +contracts/test +contracts/legacy/LegacyBaseWallet.sol \ No newline at end of file diff --git a/README.md b/README.md index f2a498b40..40dd21111 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,11 @@ See full specifications [here](specifications/specifications.pdf) ## Install +Ensure the correct node version is installed: +``` +nvm install `cat .nvmrc` +``` + Install requirements with npm: ``` npm install diff --git a/contracts/dapp/DappRegistry.sol b/contracts/dapp/DappRegistry.sol deleted file mode 100644 index 3ec4fd80c..000000000 --- a/contracts/dapp/DappRegistry.sol +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (C) 2018 Argent Labs Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity ^0.5.4; -import "../base/Owned.sol"; - -/** - * @title DappRegistry - * @dev Registry of dapp contracts and methods that have been authorised by Argent. - * Registered methods can be authorised immediately for a dapp key and a wallet while - * the authoirsation of unregistered methods is delayed for 24 hours. - * @author Julien Niset - - */ -contract DappRegistry is Owned { - - // [contract][signature][bool] - mapping (address => mapping (bytes4 => bool)) internal authorised; - - event Registered(address indexed _contract, bytes4[] _methods); - event Deregistered(address indexed _contract, bytes4[] _methods); - - /** - * @dev Registers a list of methods for a dapp contract. - * @param _contract The dapp contract. - * @param _methods The dapp methods. - */ - function register(address _contract, bytes4[] calldata _methods) external onlyOwner { - for (uint i = 0; i < _methods.length; i++) { - authorised[_contract][_methods[i]] = true; - } - emit Registered(_contract, _methods); - } - - /** - * @dev Deregisters a list of methods for a dapp contract. - * @param _contract The dapp contract. - * @param _methods The dapp methods. - */ - function deregister(address _contract, bytes4[] calldata _methods) external onlyOwner { - for (uint i = 0; i < _methods.length; i++) { - authorised[_contract][_methods[i]] = false; - } - emit Deregistered(_contract, _methods); - } - - /** - * @dev Checks if a method is registered for a dapp contract. - * @param _contract The dapp contract. - * @param _method The dapp method. - * @return true if the method is registered. - */ - function isRegistered(address _contract, bytes4 _method) external view returns (bool) { - return authorised[_contract][_method]; - } - - /** - * @dev Checks if a list of methods are registered for a dapp contract. - * @param _contract The dapp contract. - * @param _methods The dapp methods. - * @return true if all the methods are registered. - */ - function isRegistered(address _contract, bytes4[] calldata _methods) external view returns (bool) { - for (uint i = 0; i < _methods.length; i++) { - if (!authorised[_contract][_methods[i]]) { - return false; - } - } - return true; - } -} diff --git a/contracts/defi/Leverage.sol b/contracts/defi/Leverage.sol deleted file mode 100644 index 3eadb04ba..000000000 --- a/contracts/defi/Leverage.sol +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (C) 2018 Argent Labs Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity ^0.5.4; -import "../wallet/BaseWallet.sol"; - -/** - * @title Interface for a contract that can open Leveraged positions. - * A user may wish to open a Leveraged Position to increase its exposure to a token (typically ETH). - * It does so by providing an amount of ETH that will be locked as collateral and used to borrow another token - * (typically DAI) based on a `_conversionRatio`. The borrowed tokens will be exchanged and added to the locked collateral. - * This operation (borrowing tokens, converting and locking as additional collateral) is repeated `_iterations` times. - * The wallet owner can increase its leverage by increasing the number of `_iterations` or by decreasing - * the `_converstionRatio`. - * @author Julien Niset - , Olivier VDB - - */ -interface Leverage { - - event LeverageOpened( - address indexed _wallet, - bytes32 indexed _leverageId, - address _collateral, - uint256 _totalCollateral, - uint256 _totalDebt); - event LeverageClosed(address indexed _wallet, bytes32 indexed _leverageId, uint256 _debtPayment); - - - /** - * @dev Lets the owner of a wallet open a new Leveraged Position to increase their exposure to a collateral token. - * @param _wallet The target wallet - * @param _collateral The token used as a collateral. - * @param _collateralAmount The amount of collateral token provided. - * @param _conversionRatio The ratio of "additional collateral" to "additional debt" to use at each iteration - * @param _iterations The number of times the operation "borrow tokens, convert and lock as additional collateral" should be repeated - */ - function openLeveragedPosition( - BaseWallet _wallet, - address _collateral, - uint256 _collateralAmount, - uint256 _conversionRatio, - uint8 _iterations - ) - external - returns (bytes32 _leverageId, uint256 _totalCollateral, uint256 _totalDebt); - - /** - * @dev Lets the owner of a wallet close a previously opened Leveraged Position. - * @param _wallet The target wallet - * @param _leverageId The id of the CDP used to open the Leveraged Position. - * @param _daiPayment The amount of DAI debt to repay before "unwinding" the position. - */ - function closeLeveragedPosition( - BaseWallet _wallet, - bytes32 _leverageId, - uint256 _daiPayment - ) - external; - -} \ No newline at end of file diff --git a/contracts/defi/utils/CompoundRegistry.sol b/contracts/infrastructure/CompoundRegistry.sol similarity index 98% rename from contracts/defi/utils/CompoundRegistry.sol rename to contracts/infrastructure/CompoundRegistry.sol index 8cbff865f..7f6f5b6ba 100644 --- a/contracts/defi/utils/CompoundRegistry.sol +++ b/contracts/infrastructure/CompoundRegistry.sol @@ -14,7 +14,7 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../../base/Owned.sol"; +import "../base/Owned.sol"; /** * @title CompoundRegistry diff --git a/contracts/infrastructure/MakerRegistry.sol b/contracts/infrastructure/MakerRegistry.sol new file mode 100644 index 000000000..0913abb24 --- /dev/null +++ b/contracts/infrastructure/MakerRegistry.sol @@ -0,0 +1,93 @@ +pragma solidity ^0.5.4; +import "../base/Owned.sol"; +import "../../lib/maker/MakerInterfaces.sol"; + +/** + * @title MakerRegistry + * @dev Simple registry containing a mapping between token collaterals and their corresponding Maker Join adapters. + * @author Olivier VDB - + */ +contract MakerRegistry is Owned { + + VatLike public vat; + address[] public tokens; + mapping (address => Collateral) public collaterals; + mapping (bytes32 => address) public collateralTokensByIlks; + + struct Collateral { + bool exists; + uint128 index; + JoinLike join; + bytes32 ilk; + } + + event CollateralAdded(address indexed _token); + event CollateralRemoved(address indexed _token); + + constructor(VatLike _vat) public { + vat = _vat; + } + + /** + * @dev Adds a new token as possible CDP collateral. + * @param _joinAdapter The Join Adapter for the token. + */ + function addCollateral(JoinLike _joinAdapter) external onlyOwner { + require(vat.wards(address(_joinAdapter)) == 1, "MR: _joinAdapter not authorised in vat"); + address token = address(_joinAdapter.gem()); + require(!collaterals[token].exists, "MR: collateral already added"); + collaterals[token].exists = true; + collaterals[token].index = uint128(tokens.push(token) - 1); + collaterals[token].join = _joinAdapter; + bytes32 ilk = _joinAdapter.ilk(); + collaterals[token].ilk = ilk; + collateralTokensByIlks[ilk] = token; + emit CollateralAdded(token); + } + + /** + * @dev Removes a token as possible CDP collateral. + * @param _token The token to remove as collateral. + */ + function removeCollateral(address _token) external onlyOwner { + require(collaterals[_token].exists, "MR: collateral does not exist"); + delete collateralTokensByIlks[collaterals[_token].ilk]; + + address last = tokens[tokens.length - 1]; + if (_token != last) { + uint128 targetIndex = collaterals[_token].index; + tokens[targetIndex] = last; + collaterals[last].index = targetIndex; + } + tokens.length --; + delete collaterals[_token]; + emit CollateralRemoved(_token); + } + + /** + * @dev Gets the list of supported collaterals. + */ + function getCollateralTokens() external view returns (address[] memory _tokens) { + _tokens = new address[](tokens.length); + for (uint256 i = 0; i < tokens.length; i++) { + _tokens[i] = tokens[i]; + } + return _tokens; + } + + /** + * @dev Gets the ilk for a given token collateral. + * @param _token The token collateral. + */ + function getIlk(address _token) external view returns (bytes32 _ilk) { + _ilk = collaterals[_token].ilk; + } + + /** + * @dev Gets the join adapter and collateral token for a given ilk. + */ + function getCollateral(bytes32 _ilk) external view returns (JoinLike _join, GemLike _token) { + _token = GemLike(collateralTokensByIlks[_ilk]); + _join = collaterals[address(_token)].join; + } +} \ No newline at end of file diff --git a/contracts/upgrade/ModuleRegistry.sol b/contracts/infrastructure/ModuleRegistry.sol similarity index 98% rename from contracts/upgrade/ModuleRegistry.sol rename to contracts/infrastructure/ModuleRegistry.sol index 32b4962a7..5801bee69 100644 --- a/contracts/upgrade/ModuleRegistry.sol +++ b/contracts/infrastructure/ModuleRegistry.sol @@ -14,9 +14,8 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../interfaces/Module.sol"; import "../base/Owned.sol"; -import "../exchange/ERC20.sol"; +import "../../lib/other/ERC20.sol"; /** * @title ModuleRegistry diff --git a/contracts/MultiSigWallet.sol b/contracts/infrastructure/MultiSigWallet.sol similarity index 100% rename from contracts/MultiSigWallet.sol rename to contracts/infrastructure/MultiSigWallet.sol diff --git a/contracts/exchange/TokenPriceProvider.sol b/contracts/infrastructure/TokenPriceProvider.sol similarity index 97% rename from contracts/exchange/TokenPriceProvider.sol rename to contracts/infrastructure/TokenPriceProvider.sol index d587079b4..94e457c8b 100644 --- a/contracts/exchange/TokenPriceProvider.sol +++ b/contracts/infrastructure/TokenPriceProvider.sol @@ -15,9 +15,9 @@ pragma solidity ^0.5.4; import "../../lib/utils/SafeMath.sol"; -import "./ERC20.sol"; +import "../../lib/other/ERC20.sol"; import "../base/Managed.sol"; -import "./KyberNetwork.sol"; +import "../../lib/other/KyberNetwork.sol"; contract TokenPriceProvider is Managed { diff --git a/contracts/wallet/WalletFactory.sol b/contracts/infrastructure/WalletFactory.sol similarity index 98% rename from contracts/wallet/WalletFactory.sol rename to contracts/infrastructure/WalletFactory.sol index b271c0c07..8a87457f5 100644 --- a/contracts/wallet/WalletFactory.sol +++ b/contracts/infrastructure/WalletFactory.sol @@ -14,13 +14,13 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "./Proxy.sol"; -import "./BaseWallet.sol"; +import "../wallet/Proxy.sol"; +import "../wallet/BaseWallet.sol"; import "../base/Owned.sol"; import "../base/Managed.sol"; -import "../ens/IENSManager.sol"; -import "../upgrade/ModuleRegistry.sol"; -import "../storage/IGuardianStorage.sol"; +import "../infrastructure/ens/IENSManager.sol"; +import "../infrastructure/ModuleRegistry.sol"; +import "../modules/storage/IGuardianStorage.sol"; /** * @title WalletFactory diff --git a/contracts/ens/ArgentENSManager.sol b/contracts/infrastructure/ens/ArgentENSManager.sol similarity index 97% rename from contracts/ens/ArgentENSManager.sol rename to contracts/infrastructure/ens/ArgentENSManager.sol index 7a76b76c0..8cf1b1447 100644 --- a/contracts/ens/ArgentENSManager.sol +++ b/contracts/infrastructure/ens/ArgentENSManager.sol @@ -14,12 +14,12 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../../lib/ens/ENS.sol"; -import "../../lib/utils/strings.sol"; +import "../../../lib/ens/ENS.sol"; +import "../../../lib/utils/strings.sol"; import "./IENSManager.sol"; import "./ENSResolver.sol"; import "./ENSReverseRegistrar.sol"; -import "../base/Managed.sol"; +import "../../base/Managed.sol"; /** * @title ArgentENSManager diff --git a/contracts/ens/ArgentENSResolver.sol b/contracts/infrastructure/ens/ArgentENSResolver.sol similarity index 97% rename from contracts/ens/ArgentENSResolver.sol rename to contracts/infrastructure/ens/ArgentENSResolver.sol index 3f5b0d998..6dd008c6c 100644 --- a/contracts/ens/ArgentENSResolver.sol +++ b/contracts/infrastructure/ens/ArgentENSResolver.sol @@ -14,8 +14,8 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../base/Owned.sol"; -import "../base/Managed.sol"; +import "../../base/Owned.sol"; +import "../../base/Managed.sol"; import "./ENSResolver.sol"; /** diff --git a/contracts/ens/ENSResolver.sol b/contracts/infrastructure/ens/ENSResolver.sol similarity index 100% rename from contracts/ens/ENSResolver.sol rename to contracts/infrastructure/ens/ENSResolver.sol diff --git a/contracts/ens/ENSReverseRegistrar.sol b/contracts/infrastructure/ens/ENSReverseRegistrar.sol similarity index 100% rename from contracts/ens/ENSReverseRegistrar.sol rename to contracts/infrastructure/ens/ENSReverseRegistrar.sol diff --git a/contracts/ens/IENSManager.sol b/contracts/infrastructure/ens/IENSManager.sol similarity index 100% rename from contracts/ens/IENSManager.sol rename to contracts/infrastructure/ens/IENSManager.sol diff --git a/contracts/test/argent/legacy/LegacyBaseWallet.sol b/contracts/legacy/LegacyBaseWallet.sol similarity index 100% rename from contracts/test/argent/legacy/LegacyBaseWallet.sol rename to contracts/legacy/LegacyBaseWallet.sol diff --git a/contracts/legacy/LegacyTransferManager.sol b/contracts/legacy/LegacyTransferManager.sol new file mode 100644 index 000000000..e925de49e --- /dev/null +++ b/contracts/legacy/LegacyTransferManager.sol @@ -0,0 +1,501 @@ +// Copyright (C) 2018 Argent Labs Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; +import "../wallet/BaseWallet.sol"; +import "../modules/common/BaseModule.sol"; +import "../modules/common/RelayerModule.sol"; +import "../modules/common/OnlyOwnerModule.sol"; +import "../modules/common/BaseTransfer.sol"; +import "../modules/common/LimitManager.sol"; +import "../infrastructure/TokenPriceProvider.sol"; +import "../modules/storage/TransferStorage.sol"; +import "../../lib/other/ERC20.sol"; + +/** + * @title LegacyTransferManager + * @dev Copy of TransferManager module as from release 1.5 + */ +contract LegacyTransferManager is BaseModule, RelayerModule, OnlyOwnerModule, BaseTransfer, LimitManager { + + bytes32 constant NAME = "TransferManager"; + + bytes4 private constant ERC1271_ISVALIDSIGNATURE_BYTES = bytes4(keccak256("isValidSignature(bytes,bytes)")); + bytes4 private constant ERC1271_ISVALIDSIGNATURE_BYTES32 = bytes4(keccak256("isValidSignature(bytes32,bytes)")); + + enum ActionType { Transfer } + + using SafeMath for uint256; + + struct TokenManagerConfig { + // Mapping between pending action hash and their timestamp + mapping (bytes32 => uint256) pendingActions; + } + + // wallet specific storage + mapping (address => TokenManagerConfig) internal configs; + + // The security period + uint256 public securityPeriod; + // The execution window + uint256 public securityWindow; + // The Token storage + TransferStorage public transferStorage; + // The Token price provider + TokenPriceProvider public priceProvider; + // The previous limit manager needed to migrate the limits + LimitManager public oldLimitManager; + + // *************** Events *************************** // + + event AddedToWhitelist(address indexed wallet, address indexed target, uint64 whitelistAfter); + event RemovedFromWhitelist(address indexed wallet, address indexed target); + event PendingTransferCreated(address indexed wallet, bytes32 indexed id, uint256 indexed executeAfter, + address token, address to, uint256 amount, bytes data); + event PendingTransferExecuted(address indexed wallet, bytes32 indexed id); + event PendingTransferCanceled(address indexed wallet, bytes32 indexed id); + + // *************** Constructor ********************** // + + constructor( + ModuleRegistry _registry, + TransferStorage _transferStorage, + GuardianStorage _guardianStorage, + address _priceProvider, + uint256 _securityPeriod, + uint256 _securityWindow, + uint256 _defaultLimit, + LimitManager _oldLimitManager + ) + BaseModule(_registry, _guardianStorage, NAME) + LimitManager(_defaultLimit) + public + { + transferStorage = _transferStorage; + priceProvider = TokenPriceProvider(_priceProvider); + securityPeriod = _securityPeriod; + securityWindow = _securityWindow; + oldLimitManager = _oldLimitManager; + } + + /** + * @dev Inits the module for a wallet by setting up the isValidSignature (EIP 1271) + * static call redirection from the wallet to the module and copying all the parameters + * of the daily limit from the previous implementation of the LimitManager module. + * @param _wallet The target wallet. + */ + function init(BaseWallet _wallet) public onlyWallet(_wallet) { + + // setup static calls + _wallet.enableStaticCall(address(this), ERC1271_ISVALIDSIGNATURE_BYTES); + _wallet.enableStaticCall(address(this), ERC1271_ISVALIDSIGNATURE_BYTES32); + + // setup default limit for new deployment + if (address(oldLimitManager) == address(0)) { + super.init(_wallet); + return; + } + // get limit from previous LimitManager + uint256 current = oldLimitManager.getCurrentLimit(_wallet); + (uint256 pending, uint64 changeAfter) = oldLimitManager.getPendingLimit(_wallet); + // setup default limit for new wallets + if (current == 0 && changeAfter == 0) { + super.init(_wallet); + return; + } + // migrate existing limit for existing wallets + if (current == pending) { + limits[address(_wallet)].limit.current = uint128(current); + } else { + limits[address(_wallet)].limit = Limit(uint128(current), uint128(pending), changeAfter); + } + // migrate daily pending if we are within a rolling period + (uint256 unspent, uint64 periodEnd) = oldLimitManager.getDailyUnspent(_wallet); + // solium-disable-next-line security/no-block-members + if (periodEnd > now) { + limits[address(_wallet)].dailySpent = DailySpent(uint128(current.sub(unspent)), periodEnd); + } + } + + // *************** External/Public Functions ********************* // + + /** + * @dev lets the owner transfer tokens (ETH or ERC20) from a wallet. + * @param _wallet The target wallet. + * @param _token The address of the token to transfer. + * @param _to The destination address + * @param _amount The amoutn of token to transfer + * @param _data The data for the transaction + */ + function transferToken( + BaseWallet _wallet, + address _token, + address _to, + uint256 _amount, + bytes calldata _data + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + if (isWhitelisted(_wallet, _to)) { + // transfer to whitelist + doTransfer(_wallet, _token, _to, _amount, _data); + } else { + uint256 etherAmount = (_token == ETH_TOKEN) ? _amount : priceProvider.getEtherValue(_amount, _token); + if (checkAndUpdateDailySpent(_wallet, etherAmount)) { + // transfer under the limit + doTransfer(_wallet, _token, _to, _amount, _data); + } else { + // transfer above the limit + (bytes32 id, uint256 executeAfter) = addPendingAction(ActionType.Transfer, _wallet, _token, _to, _amount, _data); + emit PendingTransferCreated(address(_wallet), id, executeAfter, _token, _to, _amount, _data); + } + } + } + + /** + * @dev lets the owner approve an allowance of ERC20 tokens for a spender (dApp). + * @param _wallet The target wallet. + * @param _token The address of the token to transfer. + * @param _spender The address of the spender + * @param _amount The amount of tokens to approve + */ + function approveToken( + BaseWallet _wallet, + address _token, + address _spender, + uint256 _amount + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + if (isWhitelisted(_wallet, _spender)) { + // approve to whitelist + doApproveToken(_wallet, _token, _spender, _amount); + } else { + // get current alowance + uint256 currentAllowance = ERC20(_token).allowance(address(_wallet), _spender); + if (_amount <= currentAllowance) { + // approve if we reduce the allowance + doApproveToken(_wallet, _token, _spender, _amount); + } else { + // check if delta is under the limit + uint delta = _amount - currentAllowance; + uint256 deltaInEth = priceProvider.getEtherValue(delta, _token); + require(checkAndUpdateDailySpent(_wallet, deltaInEth), "TM: Approve above daily limit"); + // approve if under the limit + doApproveToken(_wallet, _token, _spender, _amount); + } + } + } + + /** + * @dev lets the owner call a contract. + * @param _wallet The target wallet. + * @param _contract The address of the contract. + * @param _value The amount of ETH to transfer as part of call + * @param _data The encoded method data + */ + function callContract( + BaseWallet _wallet, + address _contract, + uint256 _value, + bytes calldata _data + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + // Make sure we don't call a module, the wallet itself, or a supported ERC20 + authoriseContractCall(_wallet, _contract); + + if (isWhitelisted(_wallet, _contract)) { + // call to whitelist + doCallContract(_wallet, _contract, _value, _data); + } else { + require(checkAndUpdateDailySpent(_wallet, _value), "TM: Call contract above daily limit"); + // call under the limit + doCallContract(_wallet, _contract, _value, _data); + } + } + + /** + * @dev lets the owner do an ERC20 approve followed by a call to a contract. + * We assume that the contract will pull the tokens and does not require ETH. + * @param _wallet The target wallet. + * @param _token The token to approve. + * @param _contract The address of the contract. + * @param _amount The amount of ERC20 tokens to approve. + * @param _data The encoded method data + */ + function approveTokenAndCallContract( + BaseWallet _wallet, + address _token, + address _contract, + uint256 _amount, + bytes calldata _data + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + // Make sure we don't call a module, the wallet itself, or a supported ERC20 + authoriseContractCall(_wallet, _contract); + + if (isWhitelisted(_wallet, _contract)) { + doApproveToken(_wallet, _token, _contract, _amount); + doCallContract(_wallet, _contract, 0, _data); + } else { + // get current alowance + uint256 currentAllowance = ERC20(_token).allowance(address(_wallet), _contract); + if (_amount <= currentAllowance) { + // no need to approve more + doCallContract(_wallet, _contract, 0, _data); + } else { + // check if delta is under the limit + uint delta = _amount - currentAllowance; + uint256 deltaInEth = priceProvider.getEtherValue(delta, _token); + require(checkAndUpdateDailySpent(_wallet, deltaInEth), "TM: Approve above daily limit"); + // approve if under the limit + doApproveToken(_wallet, _token, _contract, _amount); + doCallContract(_wallet, _contract, 0, _data); + } + } + } + + /** + * @dev Adds an address to the whitelist of a wallet. + * @param _wallet The target wallet. + * @param _target The address to add. + */ + function addToWhitelist( + BaseWallet _wallet, + address _target + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + require(!isWhitelisted(_wallet, _target), "TT: target already whitelisted"); + // solium-disable-next-line security/no-block-members + uint256 whitelistAfter = now.add(securityPeriod); + transferStorage.setWhitelist(_wallet, _target, whitelistAfter); + emit AddedToWhitelist(address(_wallet), _target, uint64(whitelistAfter)); + } + + /** + * @dev Removes an address from the whitelist of a wallet. + * @param _wallet The target wallet. + * @param _target The address to remove. + */ + function removeFromWhitelist( + BaseWallet _wallet, + address _target + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + require(isWhitelisted(_wallet, _target), "TT: target not whitelisted"); + transferStorage.setWhitelist(_wallet, _target, 0); + emit RemovedFromWhitelist(address(_wallet), _target); + } + + /** + * @dev Executes a pending transfer for a wallet. + * The method can be called by anyone to enable orchestration. + * @param _wallet The target wallet. + * @param _token The token of the pending transfer. + * @param _to The destination address of the pending transfer. + * @param _amount The amount of token to transfer of the pending transfer. + * @param _data The data associated to the pending transfer. + * @param _block The block at which the pending transfer was created. + */ + function executePendingTransfer( + BaseWallet _wallet, + address _token, + address _to, + uint _amount, + bytes calldata _data, + uint _block + ) + external + onlyWhenUnlocked(_wallet) + { + bytes32 id = keccak256(abi.encodePacked(ActionType.Transfer, _token, _to, _amount, _data, _block)); + uint executeAfter = configs[address(_wallet)].pendingActions[id]; + require(executeAfter > 0, "TT: unknown pending transfer"); + uint executeBefore = executeAfter.add(securityWindow); + // solium-disable-next-line security/no-block-members + require(executeAfter <= now && now <= executeBefore, "TT: transfer outside of the execution window"); + delete configs[address(_wallet)].pendingActions[id]; + doTransfer(_wallet, _token, _to, _amount, _data); + emit PendingTransferExecuted(address(_wallet), id); + } + + function cancelPendingTransfer( + BaseWallet _wallet, + bytes32 _id + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + require(configs[address(_wallet)].pendingActions[_id] > 0, "TT: unknown pending action"); + delete configs[address(_wallet)].pendingActions[_id]; + emit PendingTransferCanceled(address(_wallet), _id); + } + + /** + * @dev Lets the owner of a wallet change its daily limit. + * The limit is expressed in ETH. Changes to the limit take 24 hours. + * @param _wallet The target wallet. + * @param _newLimit The new limit. + */ + function changeLimit(BaseWallet _wallet, uint256 _newLimit) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { + changeLimit(_wallet, _newLimit, securityPeriod); + } + + /** + * @dev Convenience method to disable the limit + * The limit is disabled by setting it to an arbitrary large value. + * @param _wallet The target wallet. + */ + function disableLimit(BaseWallet _wallet) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { + disableLimit(_wallet, securityPeriod); + } + + /** + * @dev Checks if an address is whitelisted for a wallet. + * @param _wallet The target wallet. + * @param _target The address. + * @return true if the address is whitelisted. + */ + function isWhitelisted(BaseWallet _wallet, address _target) public view returns (bool _isWhitelisted) { + uint whitelistAfter = transferStorage.getWhitelist(_wallet, _target); + // solium-disable-next-line security/no-block-members + return whitelistAfter > 0 && whitelistAfter < now; + } + + /** + * @dev Gets the info of a pending transfer for a wallet. + * @param _wallet The target wallet. + * @param _id The pending transfer ID. + * @return the epoch time at which the pending transfer can be executed. + */ + function getPendingTransfer(BaseWallet _wallet, bytes32 _id) external view returns (uint64 _executeAfter) { + _executeAfter = uint64(configs[address(_wallet)].pendingActions[_id]); + } + + /** + * @dev Implementation of EIP 1271. + * Should return whether the signature provided is valid for the provided data. + * @param _data Arbitrary length data signed on the behalf of address(this) + * @param _signature Signature byte array associated with _data + */ + function isValidSignature(bytes calldata _data, bytes calldata _signature) external view returns (bytes4) { + bytes32 msgHash = keccak256(abi.encodePacked(_data)); + isValidSignature(msgHash, _signature); + return ERC1271_ISVALIDSIGNATURE_BYTES; + } + + /** + * @dev Implementation of EIP 1271. + * Should return whether the signature provided is valid for the provided data. + * @param _msgHash Hash of a message signed on the behalf of address(this) + * @param _signature Signature byte array associated with _msgHash + */ + function isValidSignature(bytes32 _msgHash, bytes memory _signature) public view returns (bytes4) { + require(_signature.length == 65, "TM: invalid signature length"); + address signer = recoverSigner(_msgHash, _signature, 0); + require(isOwner(BaseWallet(msg.sender), signer), "TM: Invalid signer"); + return ERC1271_ISVALIDSIGNATURE_BYTES32; + } + + // *************** Internal Functions ********************* // + + /** + * @dev Creates a new pending action for a wallet. + * @param _action The target action. + * @param _wallet The target wallet. + * @param _token The target token for the action. + * @param _to The recipient of the action. + * @param _amount The amount of token associated to the action. + * @param _data The data associated to the action. + * @return the identifier for the new pending action and the time when the action can be executed + */ + function addPendingAction( + ActionType _action, + BaseWallet _wallet, + address _token, + address _to, + uint _amount, + bytes memory _data + ) + internal + returns (bytes32 id, uint256 executeAfter) + { + id = keccak256(abi.encodePacked(_action, _token, _to, _amount, _data, block.number)); + require(configs[address(_wallet)].pendingActions[id] == 0, "TM: duplicate pending action"); + // solium-disable-next-line security/no-block-members + executeAfter = now.add(securityPeriod); + configs[address(_wallet)].pendingActions[id] = executeAfter; + } + + /** + * @dev Make sure a contract call is not trying to call a module, the wallet itself, or a supported ERC20. + * @param _wallet The target wallet. + * @param _contract The address of the contract. + */ + function authoriseContractCall(BaseWallet _wallet, address _contract) internal view { + require( + _contract != address(_wallet) && // not the wallet itself + !_wallet.authorised(_contract) && // not an authorised module + (priceProvider.cachedPrices(_contract) == 0 || isLimitDisabled(_wallet)), // not an ERC20 listed in the provider (or limit disabled) + "TM: Forbidden contract"); + } + + // *************** Implementation of RelayerModule methods ********************* // + + // Overrides refund to add the refund in the daily limit. + function refund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _gasLimit, uint _signatures, address _relayer) internal { + // 21000 (transaction) + 7620 (execution of refund) + 7324 (execution of updateDailySpent) + 672 to log the event + _gasUsed + uint256 amount = 36616 + _gasUsed; + if (_gasPrice > 0 && _signatures > 0 && amount <= _gasLimit) { + if (_gasPrice > tx.gasprice) { + amount = amount * tx.gasprice; + } else { + amount = amount * _gasPrice; + } + checkAndUpdateDailySpent(_wallet, amount); + invokeWallet(address(_wallet), _relayer, amount, EMPTY_BYTES); + } + } + + // Overrides verifyRefund to add the refund in the daily limit. + function verifyRefund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _signatures) internal view returns (bool) { + if (_gasPrice > 0 && _signatures > 0 && ( + address(_wallet).balance < _gasUsed * _gasPrice || + isWithinDailyLimit(_wallet, getCurrentLimit(_wallet), _gasUsed * _gasPrice) == false || + _wallet.authorised(address(this)) == false + )) + { + return false; + } + return true; + } +} diff --git a/contracts/modules/ApprovedTransfer.sol b/contracts/modules/ApprovedTransfer.sol index 762b119e6..e8b1c3a08 100644 --- a/contracts/modules/ApprovedTransfer.sol +++ b/contracts/modules/ApprovedTransfer.sol @@ -16,17 +16,15 @@ pragma solidity ^0.5.4; import "../wallet/BaseWallet.sol"; import "./common/BaseModule.sol"; -import "./common/RelayerModule.sol"; +import "./common/RelayerModuleV2.sol"; import "./common/BaseTransfer.sol"; -import "../../lib/utils/SafeMath.sol"; -import "../utils/GuardianUtils.sol"; /** * @title ApprovedTransfer * @dev Module to transfer tokens (ETH or ERC20) with the approval of guardians. * @author Julien Niset - */ -contract ApprovedTransfer is BaseModule, RelayerModule, BaseTransfer { +contract ApprovedTransfer is BaseModule, RelayerModuleV2, BaseTransfer { bytes32 constant NAME = "ApprovedTransfer"; @@ -77,6 +75,33 @@ contract ApprovedTransfer is BaseModule, RelayerModule, BaseTransfer { doCallContract(_wallet, _contract, _value, _data); } + /** + * @dev lets the owner do an ERC20 approve followed by a call to a contract. + * The address to approve may be different than the contract to call. + * We assume that the contract does not require ETH. + * @param _wallet The target wallet. + * @param _token The token to approve. + * @param _spender The address to approve. + * @param _amount The amount of ERC20 tokens to approve. + * @param _contract The contract to call. + * @param _data The encoded method data + */ + function approveTokenAndCallContract( + BaseWallet _wallet, + address _token, + address _spender, + uint256 _amount, + address _contract, + bytes calldata _data + ) + external + onlyExecute + onlyWhenUnlocked(_wallet) + { + require(!_wallet.authorised(_contract) && _contract != address(_wallet), "AT: Forbidden contract"); + doApproveTokenAndCallContract(_wallet, _token, _spender, _amount, _contract, _data); + } + // *************** Implementation of RelayerModule methods ********************* // function validateSignatures( @@ -89,33 +114,10 @@ contract ApprovedTransfer is BaseModule, RelayerModule, BaseTransfer { view returns (bool) { - address lastSigner = address(0); - address[] memory guardians = guardianStorage.getGuardians(_wallet); - bool isGuardian = false; - for (uint8 i = 0; i < _signatures.length / 65; i++) { - address signer = recoverSigner(_signHash, _signatures, i); - if (i == 0) { - // AT: first signer must be owner - if (!isOwner(_wallet, signer)) { - return false; - } - } else { - // "AT: signers must be different" - if (signer <= lastSigner) { - return false; - } - lastSigner = signer; - (isGuardian, guardians) = GuardianUtils.isGuardian(guardians, signer); - // "AT: signatures not valid" - if (!isGuardian) { - return false; - } - } - } - return true; + return validateSignatures(_wallet, _signHash, _signatures, OwnerSignature.Required); } - function getRequiredSignatures(BaseWallet _wallet, bytes memory /* _data */) internal view returns (uint256) { + function getRequiredSignatures(BaseWallet _wallet, bytes memory /* _data */) public view returns (uint256) { // owner + [n/2] guardians return 1 + SafeMath.ceil(guardianStorage.guardianCount(_wallet), 2); } diff --git a/contracts/modules/CompoundManager.sol b/contracts/modules/CompoundManager.sol index 864c1ecd1..0762803e6 100644 --- a/contracts/modules/CompoundManager.sol +++ b/contracts/modules/CompoundManager.sol @@ -15,14 +15,13 @@ pragma solidity ^0.5.4; -import "../../lib/utils/SafeMath.sol"; import "../wallet/BaseWallet.sol"; import "./common/BaseModule.sol"; import "./common/RelayerModule.sol"; import "./common/OnlyOwnerModule.sol"; import "../defi/Loan.sol"; import "../defi/Invest.sol"; -import "../defi/utils/CompoundRegistry.sol"; +import "../infrastructure/CompoundRegistry.sol"; interface IComptroller { function enterMarkets(address[] calldata _cTokens) external returns (uint[] memory); diff --git a/contracts/modules/GuardianManager.sol b/contracts/modules/GuardianManager.sol index 71f763ad7..904d7e1bf 100644 --- a/contracts/modules/GuardianManager.sol +++ b/contracts/modules/GuardianManager.sol @@ -15,7 +15,7 @@ pragma solidity ^0.5.4; import "../wallet/BaseWallet.sol"; -import "../utils/GuardianUtils.sol"; +import "./common/GuardianUtils.sol"; import "./common/BaseModule.sol"; import "./common/RelayerModule.sol"; @@ -59,17 +59,6 @@ contract GuardianManager is BaseModule, RelayerModule { event GuardianAdded(address indexed wallet, address indexed guardian); event GuardianRevoked(address indexed wallet, address indexed guardian); - // *************** Modifiers ************************ // - - /** - * @dev Throws if the wallet is not locked. - */ - modifier onlyWhenLocked(BaseWallet _wallet) { - // solium-disable-next-line security/no-block-members - require(guardianStorage.isLocked(_wallet), "GM: wallet must be locked"); - _; - } - // *************** Constructor ********************** // constructor( @@ -215,15 +204,6 @@ contract GuardianManager is BaseModule, RelayerModule { return guardianStorage.guardianCount(_wallet); } - /** - * @dev Get the active guardians for a wallet. - * @param _wallet The target wallet. - * @return the active guardians for a wallet. - */ - function getGuardians(BaseWallet _wallet) external view returns (address[] memory _guardians) { - return guardianStorage.getGuardians(_wallet); - } - // *************** Implementation of RelayerModule methods ********************* // // Overrides to use the incremental nonce and save some gas diff --git a/contracts/modules/LockManager.sol b/contracts/modules/LockManager.sol index 06d848e31..6c96dbd68 100644 --- a/contracts/modules/LockManager.sol +++ b/contracts/modules/LockManager.sol @@ -17,7 +17,7 @@ pragma solidity ^0.5.4; import "../wallet/BaseWallet.sol"; import "./common/BaseModule.sol"; import "./common/RelayerModule.sol"; -import "../utils/GuardianUtils.sol"; +import "./common/GuardianUtils.sol"; /** * @title LockManager diff --git a/contracts/modules/MakerV2Manager.sol b/contracts/modules/MakerV2Manager.sol deleted file mode 100644 index 5dfd18634..000000000 --- a/contracts/modules/MakerV2Manager.sol +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright (C) 2018 Argent Labs Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity ^0.5.4; - -import "./common/BaseModule.sol"; -import "./common/RelayerModule.sol"; -import "./common/OnlyOwnerModule.sol"; -import "../../lib/utils/SafeMath.sol"; -import "../defi/Invest.sol"; - -contract VatLike { - function can(address, address) public view returns (uint); - function dai(address) public view returns (uint); - function hope(address) public; -} - -contract JoinLike { - function gem() public returns (GemLike); - function dai() public returns (GemLike); - function join(address, uint) public; - function exit(address, uint) public; - VatLike public vat; -} - -contract PotLike { - function chi() public view returns (uint); - function pie(address) public view returns (uint); - function drip() public; -} - -contract ScdMcdMigration { - function swapSaiToDai(uint wad) external; - function swapDaiToSai(uint wad) external; - JoinLike public saiJoin; - JoinLike public wethJoin; - JoinLike public daiJoin; -} - -contract GemLike { - function balanceOf(address) public view returns (uint); - function transferFrom(address, address, uint) public returns (bool); -} - -/** - * @title MakerV2Manager - * @dev Module to convert SAI <-> DAI and lock/unlock MCD DAI into/from Maker's Pot, - * @author Olivier VDB - - */ -contract MakerV2Manager is Invest, BaseModule, RelayerModule, OnlyOwnerModule { - - bytes32 constant NAME = "MakerV2Manager"; - - // The address of the SAI token - GemLike public saiToken; - // The address of the (MCD) DAI token - GemLike public daiToken; - // The address of the SAI <-> DAI migration contract - address public scdMcdMigration; - // The address of the Pot - PotLike public pot; - // The address of the Dai Adapter - JoinLike public daiJoin; - // The address of the Vat - VatLike public vat; - - // Method signatures to reduce gas cost at depoyment - bytes4 constant internal ERC20_APPROVE = bytes4(keccak256("approve(address,uint256)")); - bytes4 constant internal SWAP_SAI_DAI = bytes4(keccak256("swapSaiToDai(uint256)")); - bytes4 constant internal SWAP_DAI_SAI = bytes4(keccak256("swapDaiToSai(uint256)")); - bytes4 constant internal ADAPTER_JOIN = bytes4(keccak256("join(address,uint256)")); - bytes4 constant internal ADAPTER_EXIT = bytes4(keccak256("exit(address,uint256)")); - bytes4 constant internal VAT_HOPE = bytes4(keccak256("hope(address)")); - bytes4 constant internal POT_JOIN = bytes4(keccak256("join(uint256)")); - bytes4 constant internal POT_EXIT = bytes4(keccak256("exit(uint256)")); - - uint256 constant internal RAY = 10 ** 27; - - using SafeMath for uint256; - - // ****************** Events *************************** // - - event TokenConverted(address indexed _wallet, address _srcToken, uint _srcAmount, address _destToken, uint _destAmount); - - // *************** Constructor ********************** // - - constructor( - ModuleRegistry _registry, - GuardianStorage _guardianStorage, - ScdMcdMigration _scdMcdMigration, - PotLike _pot - ) - BaseModule(_registry, _guardianStorage, NAME) - public - { - scdMcdMigration = address(_scdMcdMigration); - saiToken = _scdMcdMigration.saiJoin().gem(); - daiJoin = _scdMcdMigration.daiJoin(); - vat = daiJoin.vat(); - daiToken = daiJoin.dai(); - pot = _pot; - } - - // *************** External/Public Functions ********************* // - - /* ********************************** Implementation of Invest ************************************* */ - - /** - * @dev Invest tokens for a given period. - * @param _wallet The target wallet. - * @param _token The token address. - * @param _amount The amount of tokens to invest. - * @param _period The period over which the tokens may be locked in the investment (optional). - * @return The exact amount of tokens that have been invested. - */ - function addInvestment( - BaseWallet _wallet, - address _token, - uint256 _amount, - uint256 _period - ) - external - returns (uint256 _invested) - { - require(_token == address(daiToken), "DM: token should be DAI"); - joinDsr(_wallet, _amount); - _invested = _amount; - emit InvestmentAdded(address(_wallet), address(daiToken), _amount, _period); - } - - /** - * @dev Exit invested postions. - * @param _wallet The target wallet. - * @param _token The token address. - * @param _fraction The fraction of invested tokens to exit in per 10000. - */ - function removeInvestment( - BaseWallet _wallet, - address _token, - uint256 _fraction - ) - external - { - require(_token == address(daiToken), "DM: token should be DAI"); - require(_fraction <= 10000, "DM: invalid fraction value"); - exitDsr(_wallet, dsrBalance(_wallet).mul(_fraction) / 10000); - emit InvestmentRemoved(address(_wallet), _token, _fraction); - } - - /** - * @dev Get the amount of investment in a given token. - * @param _wallet The target wallet. - * @param _token The token address. - * @return The value in tokens of the investment (including interests) and the time at which the investment can be removed. - */ - function getInvestment( - BaseWallet _wallet, - address _token - ) - external - view - returns (uint256 _tokenValue, uint256 _periodEnd) - { - _tokenValue = _token == address(daiToken) ? dsrBalance(_wallet) : 0; - _periodEnd = 0; - } - - /* ****************************************** DSR wrappers ******************************************* */ - - function dsrBalance(BaseWallet _wallet) public view returns (uint256) { - return pot.chi().mul(pot.pie(address(_wallet))) / RAY; - } - - /** - * @dev lets the owner deposit MCD DAI into the DSR Pot. - * @param _wallet The target wallet. - * @param _amount The amount of DAI to deposit - */ - function joinDsr( - BaseWallet _wallet, - uint256 _amount - ) - public - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - if (daiToken.balanceOf(address(_wallet)) < _amount) { - swapSaiToDai(_wallet, _amount - daiToken.balanceOf(address(_wallet))); - } - - // Execute drip to get the chi rate updated to rho == now, otherwise join will fail - pot.drip(); - // Approve DAI adapter to take the DAI amount - invokeWallet(address(_wallet), address(daiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, address(daiJoin), _amount)); - // Join DAI into the vat (_amount of external DAI is burned and the vat transfers _amount of internal DAI from the adapter to the _wallet) - invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_JOIN, address(_wallet), _amount)); - // Approve the pot to take out (internal) DAI from the wallet's balance in the vat - if (vat.can(address(_wallet), address(pot)) == 0) { - invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(pot))); - } - // Compute the pie value in the pot - uint256 pie = _amount.mul(RAY) / pot.chi(); - // Join the pie value to the pot - invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_JOIN, pie)); - } - - /** - * @dev lets the owner withdraw MCD DAI from the DSR Pot. - * @param _wallet The target wallet. - * @param _amount The amount of DAI to withdraw - */ - function exitDsr( - BaseWallet _wallet, - uint256 _amount - ) - public - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - // Execute drip to count the savings accumulated until this moment - pot.drip(); - // Calculates the pie value in the pot equivalent to the DAI wad amount - uint256 pie = _amount.mul(RAY) / pot.chi(); - // Exit DAI from the pot - invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_EXIT, pie)); - // Allow adapter to access the _wallet's DAI balance in the vat - if (vat.can(address(_wallet), address(daiJoin)) == 0) { - invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(daiJoin))); - } - // Check the actual balance of DAI in the vat after the pot exit - uint bal = vat.dai(address(_wallet)); - // It is necessary to check if due to rounding the exact _amount can be exited by the adapter. - // Otherwise it will do the maximum DAI balance in the vat - uint256 withdrawn = bal >= _amount.mul(RAY) ? _amount : bal / RAY; - invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_EXIT, address(_wallet), withdrawn)); - } - - function exitAllDsr( - BaseWallet _wallet - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - // Execute drip to count the savings accumulated until this moment - pot.drip(); - // Gets the total pie belonging to the _wallet - uint256 pie = pot.pie(address(_wallet)); - // Exit DAI from the pot - invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_EXIT, pie)); - // Allow adapter to access the _wallet's DAI balance in the vat - if (vat.can(address(_wallet), address(daiJoin)) == 0) { - invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(daiJoin))); - } - // Exits the DAI amount corresponding to the value of pie - uint256 withdrawn = pot.chi().mul(pie) / RAY; - invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_EXIT, address(_wallet), withdrawn)); - } - - /** - * @dev lets the owner convert SCD SAI into MCD DAI. - * @param _wallet The target wallet. - * @param _amount The amount of SAI to convert - */ - function swapSaiToDai( - BaseWallet _wallet, - uint256 _amount - ) - public - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - require(saiToken.balanceOf(address(_wallet)) >= _amount, "DM: insufficient SAI"); - invokeWallet(address(_wallet), address(saiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, scdMcdMigration, _amount)); - invokeWallet(address(_wallet), scdMcdMigration, 0, abi.encodeWithSelector(SWAP_SAI_DAI, _amount)); - emit TokenConverted(address(_wallet), address(saiToken), _amount, address(daiToken), _amount); - } - - /** - * @dev lets the owner convert MCD DAI into SCD SAI. - * @param _wallet The target wallet. - * @param _amount The amount of DAI to convert - */ - function swapDaiToSai( - BaseWallet _wallet, - uint256 _amount - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - require(daiToken.balanceOf(address(_wallet)) >= _amount, "DM: insufficient DAI"); - invokeWallet(address(_wallet), address(daiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, scdMcdMigration, _amount)); - invokeWallet(address(_wallet), scdMcdMigration, 0, abi.encodeWithSelector(SWAP_DAI_SAI, _amount)); - emit TokenConverted(address(_wallet), address(daiToken), _amount, address(saiToken), _amount); - } -} \ No newline at end of file diff --git a/contracts/modules/RecoveryManager.sol b/contracts/modules/RecoveryManager.sol index 79f493dc1..1614ec440 100644 --- a/contracts/modules/RecoveryManager.sol +++ b/contracts/modules/RecoveryManager.sol @@ -16,10 +16,8 @@ pragma solidity ^0.5.4; import "../wallet/BaseWallet.sol"; import "./common/BaseModule.sol"; -import "./common/RelayerModule.sol"; -import "../storage/GuardianStorage.sol"; -import "../../lib/utils/SafeMath.sol"; -import "../utils/GuardianUtils.sol"; +import "./common/RelayerModuleV2.sol"; +import "./storage/GuardianStorage.sol"; /** * @title RecoveryManager @@ -30,16 +28,14 @@ import "../utils/GuardianUtils.sol"; * @author Julien Niset - * @author Olivier Van Den Biggelaar - */ -contract RecoveryManager is BaseModule, RelayerModule { +contract RecoveryManager is BaseModule, RelayerModuleV2 { bytes32 constant NAME = "RecoveryManager"; bytes4 constant internal EXECUTE_RECOVERY_PREFIX = bytes4(keccak256("executeRecovery(address,address)")); bytes4 constant internal FINALIZE_RECOVERY_PREFIX = bytes4(keccak256("finalizeRecovery(address)")); bytes4 constant internal CANCEL_RECOVERY_PREFIX = bytes4(keccak256("cancelRecovery(address)")); - bytes4 constant internal EXECUTE_OWNERSHIP_TRANSFER_PREFIX = bytes4(keccak256("executeOwnershipTransfer(address,address)")); - bytes4 constant internal FINALIZE_OWNERSHIP_TRANSFER_PREFIX = bytes4(keccak256("finalizeOwnershipTransfer(address)")); - bytes4 constant internal CANCEL_OWNERSHIP_TRANSFER_PREFIX = bytes4(keccak256("cancelOwnershipTransfer(address)")); + bytes4 constant internal TRANSFER_OWNERSHIP_PREFIX = bytes4(keccak256("transferOwnership(address,address)")); struct RecoveryConfig { address recovery; @@ -47,34 +43,26 @@ contract RecoveryManager is BaseModule, RelayerModule { uint32 guardianCount; } - struct OwnershipTransferConfig { - address newOwner; - uint64 executeAfter; - } - - // the wallet specific storage + // Wallet specific storage mapping (address => RecoveryConfig) internal recoveryConfigs; - mapping (address => OwnershipTransferConfig) internal ownershipTransferConfigs; // Recovery period uint256 public recoveryPeriod; // Lock period uint256 public lockPeriod; - // The security period used for (non-recovery) ownership transfer + // Security period used for (non-recovery) ownership transfer uint256 public securityPeriod; - // the security window used for (non-recovery) ownership transfer + // Security window used for (non-recovery) ownership transfer uint256 public securityWindow; - // location of the Guardian storage + // Location of the Guardian storage GuardianStorage public guardianStorage; // *************** Events *************************** // - event RecoveryExecuted(address indexed _wallet, address indexed _recovery, uint64 executeAfter); - event RecoveryFinalized(address indexed _wallet, address indexed _recovery); - event RecoveryCanceled(address indexed _wallet, address indexed _recovery); - event OwnershipTransferExecuted(address indexed _wallet, address indexed _newOwner, uint64 executeAfter); - event OwnershipTransferFinalized(address indexed _wallet, address indexed _newOwner); - event OwnershipTransferCanceled(address indexed _wallet, address indexed _newOwner); + event RecoveryExecuted(address indexed wallet, address indexed _recovery, uint64 executeAfter); + event RecoveryFinalized(address indexed wallet, address indexed _recovery); + event RecoveryCanceled(address indexed wallet, address indexed _recovery); + event OwnershipTransfered(address indexed wallet, address indexed _newOwner); // *************** Modifiers ************************ // @@ -94,23 +82,6 @@ contract RecoveryManager is BaseModule, RelayerModule { _; } - /** - * @dev Throws if there is no ongoing ownership transfer procedure. - */ - modifier onlyWhenOwnershipTransfer(BaseWallet _wallet) { - require(ownershipTransferConfigs[address(_wallet)].executeAfter > 0, "RM: there must be an ongoing ownership transfer"); - _; - } - - /** - * @dev Throws if there is an ongoing ownership transfer procedure. - */ - modifier notWhenOwnershipTransfer(BaseWallet _wallet) { - require(now > ownershipTransferConfigs[address(_wallet)].executeAfter + securityWindow, - "RM: there cannot be an ongoing ownership transfer"); - _; - } - // *************** Constructor ************************ // constructor( @@ -124,8 +95,7 @@ contract RecoveryManager is BaseModule, RelayerModule { BaseModule(_registry, _guardianStorage, NAME) public { - require(_lockPeriod >= _recoveryPeriod && _recoveryPeriod >= _securityPeriod + _securityWindow, - "RM: insecure security periods"); + require(_lockPeriod >= _recoveryPeriod && _recoveryPeriod >= _securityPeriod + _securityWindow, "RM: insecure security periods"); guardianStorage = _guardianStorage; recoveryPeriod = _recoveryPeriod; lockPeriod = _lockPeriod; @@ -174,20 +144,11 @@ contract RecoveryManager is BaseModule, RelayerModule { */ function cancelRecovery(BaseWallet _wallet) external onlyExecute onlyWhenRecovery(_wallet) { RecoveryConfig storage config = recoveryConfigs[address(_wallet)]; - emit RecoveryCanceled(address(_wallet), config.recovery); + emit RecoveryCanceled(address(_wallet), config.recovery); guardianStorage.setLock(_wallet, 0); delete recoveryConfigs[address(_wallet)]; } - /** - * @dev Gets the details of the ongoing recovery procedure if any. - * @param _wallet The target wallet. - */ - function getRecovery(BaseWallet _wallet) public view returns(address _address, uint64 _executeAfter, uint32 _guardianCount) { - RecoveryConfig storage config = recoveryConfigs[address(_wallet)]; - return (config.recovery, config.executeAfter, config.guardianCount); - } - /** * @dev Lets the owner start the execution of the ownership transfer procedure. * Once triggered the ownership transfer is pending for the security period before it can @@ -195,57 +156,20 @@ contract RecoveryManager is BaseModule, RelayerModule { * @param _wallet The target wallet. * @param _newOwner The address to which ownership should be transferred. */ - function executeOwnershipTransfer( - BaseWallet _wallet, - address _newOwner - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - notWhenOwnershipTransfer(_wallet) - { + function transferOwnership(BaseWallet _wallet, address _newOwner) external onlyExecute onlyWhenUnlocked(_wallet) { require(_newOwner != address(0), "RM: new owner address cannot be null"); - OwnershipTransferConfig storage config = ownershipTransferConfigs[address(_wallet)]; - config.newOwner = _newOwner; - config.executeAfter = uint64(now + securityPeriod); - emit OwnershipTransferExecuted(address(_wallet), _newOwner, config.executeAfter); - } + _wallet.setOwner(_newOwner); - /** - * @dev Finalizes an ongoing ownership transfer procedure if the security period is over. - * The method must be called during the confirmation window and - * can be called by anyone to enable orchestration. - * @param _wallet The target wallet. - */ - function finalizeOwnershipTransfer( - BaseWallet _wallet - ) external - onlyWhenUnlocked(_wallet) - onlyWhenOwnershipTransfer(_wallet) - { - OwnershipTransferConfig storage config = ownershipTransferConfigs[address(_wallet)]; - require(config.executeAfter < now, "RM: Too early to confirm ownership transfer"); - require(now < config.executeAfter + securityWindow, "RM: Too late to confirm ownership transfer"); - _wallet.setOwner(config.newOwner); - emit OwnershipTransferFinalized(address(_wallet), config.newOwner); - delete ownershipTransferConfigs[address(_wallet)]; + emit OwnershipTransfered(address(_wallet), _newOwner); } /** - * @dev Lets the owner cancel an ongoing ownership transfer procedure. - * @param _wallet The target wallet. - */ - function cancelOwnershipTransfer( - BaseWallet _wallet - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - onlyWhenOwnershipTransfer(_wallet) - { - OwnershipTransferConfig storage config = ownershipTransferConfigs[address(_wallet)]; - emit OwnershipTransferCanceled(address(_wallet), config.newOwner); - delete ownershipTransferConfigs[address(_wallet)]; + * @dev Gets the details of the ongoing recovery procedure if any. + * @param _wallet The target wallet. + */ + function getRecovery(BaseWallet _wallet) public view returns(address _address, uint64 _executeAfter, uint32 _guardianCount) { + RecoveryConfig storage config = recoveryConfigs[address(_wallet)]; + return (config.recovery, config.executeAfter, config.guardianCount); } // *************** Implementation of RelayerModule methods ********************* // @@ -258,32 +182,20 @@ contract RecoveryManager is BaseModule, RelayerModule { ) internal view returns (bool) { - address lastSigner = address(0); - address[] memory guardians = guardianStorage.getGuardians(_wallet); - bool isGuardian = false; - for (uint8 i = 0; i < _signatures.length / 65; i++) { - address signer = recoverSigner(_signHash, _signatures, i); - if (i == 0 && isOwner(_wallet, signer)) { - // first signer can be owner - continue; - } else { - if (signer <= lastSigner) { - return false; - } // "RM: signers must be different" - lastSigner = signer; - (isGuardian, guardians) = GuardianUtils.isGuardian(guardians, signer); - if (!isGuardian) { - return false; - } // "RM: signatures not valid" - } + bytes4 functionSignature = functionPrefix(_data); + if (functionSignature == TRANSFER_OWNERSHIP_PREFIX) { + return validateSignatures(_wallet, _signHash, _signatures, OwnerSignature.Required); + } else if (functionSignature == EXECUTE_RECOVERY_PREFIX) { + return validateSignatures(_wallet, _signHash, _signatures, OwnerSignature.Disallowed); + } else if (functionSignature == CANCEL_RECOVERY_PREFIX) { + return validateSignatures(_wallet, _signHash, _signatures, OwnerSignature.Optional); } - return true; } - function getRequiredSignatures(BaseWallet _wallet, bytes memory _data) internal view returns (uint256) { + function getRequiredSignatures(BaseWallet _wallet, bytes memory _data) public view returns (uint256) { bytes4 methodId = functionPrefix(_data); if (methodId == EXECUTE_RECOVERY_PREFIX) { - return SafeMath.ceil(guardianStorage.guardianCount(_wallet) + 1, 2); + return SafeMath.ceil(guardianStorage.guardianCount(_wallet), 2); } if (methodId == FINALIZE_RECOVERY_PREFIX) { return 0; @@ -291,15 +203,10 @@ contract RecoveryManager is BaseModule, RelayerModule { if (methodId == CANCEL_RECOVERY_PREFIX) { return SafeMath.ceil(recoveryConfigs[address(_wallet)].guardianCount + 1, 2); } - if (methodId == EXECUTE_OWNERSHIP_TRANSFER_PREFIX) { - return 1; - } - if (methodId == FINALIZE_OWNERSHIP_TRANSFER_PREFIX) { - return 0; - } - if (methodId == CANCEL_OWNERSHIP_TRANSFER_PREFIX) { - return 1; + if (methodId == TRANSFER_OWNERSHIP_PREFIX) { + uint majorityGuardians = SafeMath.ceil(guardianStorage.guardianCount(_wallet), 2); + return SafeMath.add(majorityGuardians, 1); } - revert("RM: unknown method"); + revert("RM: unknown method"); } } \ No newline at end of file diff --git a/contracts/upgrade/SimpleUpgrader.sol b/contracts/modules/SimpleUpgrader.sol similarity index 98% rename from contracts/upgrade/SimpleUpgrader.sol rename to contracts/modules/SimpleUpgrader.sol index b48bcc7d6..06dafbcb9 100644 --- a/contracts/upgrade/SimpleUpgrader.sol +++ b/contracts/modules/SimpleUpgrader.sol @@ -15,7 +15,7 @@ pragma solidity ^0.5.4; -import "../modules/common/BaseModule.sol"; +import "./common/BaseModule.sol"; /** * @title SimpleUpgrader diff --git a/contracts/modules/TokenExchanger.sol b/contracts/modules/TokenExchanger.sol index 5d7686def..68c31bd1a 100644 --- a/contracts/modules/TokenExchanger.sol +++ b/contracts/modules/TokenExchanger.sol @@ -18,9 +18,8 @@ import "../wallet/BaseWallet.sol"; import "./common/BaseModule.sol"; import "./common/RelayerModule.sol"; import "./common/OnlyOwnerModule.sol"; -import "../../lib/utils/SafeMath.sol"; -import "../exchange/ERC20.sol"; -import "../exchange/KyberNetwork.sol"; +import "../../lib/other/ERC20.sol"; +import "../../lib/other/KyberNetwork.sol"; /** * @title TokenExchanger diff --git a/contracts/modules/TransferManager.sol b/contracts/modules/TransferManager.sol index 25f8f9897..286bd73cf 100644 --- a/contracts/modules/TransferManager.sol +++ b/contracts/modules/TransferManager.sol @@ -20,9 +20,9 @@ import "./common/RelayerModule.sol"; import "./common/OnlyOwnerModule.sol"; import "./common/BaseTransfer.sol"; import "./common/LimitManager.sol"; -import "../exchange/TokenPriceProvider.sol"; -import "../storage/TransferStorage.sol"; -import "../exchange/ERC20.sol"; +import "./storage/TransferStorage.sol"; +import "../infrastructure/TokenPriceProvider.sol"; +import "../../lib/other/ERC20.sol"; /** * @title TransferManager @@ -240,15 +240,17 @@ contract TransferManager is BaseModule, RelayerModule, OnlyOwnerModule, BaseTran * We assume that the contract will pull the tokens and does not require ETH. * @param _wallet The target wallet. * @param _token The token to approve. - * @param _contract The address of the contract. + * @param _spender The address to approve. * @param _amount The amount of ERC20 tokens to approve. + * @param _contract The address of the contract. * @param _data The encoded method data */ function approveTokenAndCallContract( BaseWallet _wallet, address _token, - address _contract, + address _spender, uint256 _amount, + address _contract, bytes calldata _data ) external @@ -258,25 +260,14 @@ contract TransferManager is BaseModule, RelayerModule, OnlyOwnerModule, BaseTran // Make sure we don't call a module, the wallet itself, or a supported ERC20 authoriseContractCall(_wallet, _contract); - if (isWhitelisted(_wallet, _contract)) { - doApproveToken(_wallet, _token, _contract, _amount); - doCallContract(_wallet, _contract, 0, _data); - } else { - // get current alowance - uint256 currentAllowance = ERC20(_token).allowance(address(_wallet), _contract); - if (_amount <= currentAllowance) { - // no need to approve more - doCallContract(_wallet, _contract, 0, _data); - } else { - // check if delta is under the limit - uint delta = _amount - currentAllowance; - uint256 deltaInEth = priceProvider.getEtherValue(delta, _token); - require(checkAndUpdateDailySpent(_wallet, deltaInEth), "TM: Approve above daily limit"); - // approve if under the limit - doApproveToken(_wallet, _token, _contract, _amount); - doCallContract(_wallet, _contract, 0, _data); - } + if (!isWhitelisted(_wallet, _spender)) { + // check if the amount is under the daily limit + // check the entire amount because the currently approved amount will be restored and should still count towards the daily limit + uint256 valueInEth = priceProvider.getEtherValue(_amount, _token); + require(checkAndUpdateDailySpent(_wallet, valueInEth), "TM: Approve above daily limit"); } + + doApproveTokenAndCallContract(_wallet, _token, _spender, _amount, _contract, _data); } /** diff --git a/contracts/modules/UniswapManager.sol b/contracts/modules/UniswapManager.sol deleted file mode 100644 index 68e82ffd6..000000000 --- a/contracts/modules/UniswapManager.sol +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright (C) 2018 Argent Labs Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity ^0.5.4; - -import "../../lib/utils/SafeMath.sol"; -import "../wallet/BaseWallet.sol"; -import "./common/BaseModule.sol"; -import "./common/RelayerModule.sol"; -import "./common/OnlyOwnerModule.sol"; -import "../defi/Invest.sol"; - -interface UniswapFactory { - function getExchange(address _token) external view returns(address); -} - -interface UniswapExchange { - function getEthToTokenOutputPrice(uint256 _tokens_bought) external view returns (uint256); - function getEthToTokenInputPrice(uint256 _eth_sold) external view returns (uint256); - function getTokenToEthOutputPrice(uint256 _eth_bought) external view returns (uint256); - function getTokenToEthInputPrice(uint256 _tokens_sold) external view returns (uint256); -} - -/** - * @title UniswapInvestManager - * @dev Module to invest tokens with Uniswap in order to earn an interest - * @author Julien Niset - - */ -contract UniswapManager is Invest, BaseModule, RelayerModule, OnlyOwnerModule { - - bytes32 constant NAME = "UniswapInvestManager"; - - // The Uniswap Factory contract - UniswapFactory public uniswapFactory; - - // Mock token address for ETH - address constant internal ETH_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - using SafeMath for uint256; - - constructor( - ModuleRegistry _registry, - GuardianStorage _guardianStorage, - UniswapFactory _uniswapFactory - ) - BaseModule(_registry, _guardianStorage, NAME) - public - { - uniswapFactory = _uniswapFactory; - } - - /* ********************************** Implementation of Invest ************************************* */ - - /** - * @dev Invest tokens for a given period. - * @param _wallet The target wallet. - * @param _token The token address. - * @param _amount The amount of tokens to invest. - * @param _period The period over which the tokens may be locked in the investment (optional). - * @return The amount of tokens that have been invested. - */ - function addInvestment( - BaseWallet _wallet, - address _token, - uint256 _amount, - uint256 _period - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - returns (uint256 _invested) - { - _invested = addLiquidity(_wallet, _token, _amount); - emit InvestmentAdded(address(_wallet), _token, _amount, _period); - } - - /** - * @dev Removes a fraction of the tokens from an investment. - * @param _wallet The target wallet.s - * @param _token The array of token address. - * @param _fraction The fraction of invested tokens to exit in per 10000. - */ - function removeInvestment( - BaseWallet _wallet, - address _token, - uint256 _fraction - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - require(_fraction <= 10000, "Uniswap: _fraction must be expressed in 1 per 10000"); - removeLiquidity(_wallet, _token, _fraction); - emit InvestmentRemoved(address(_wallet), _token, _fraction); - } - - /** - * @dev Get the amount of investment in a given token. - * @param _wallet The target wallet. - * @param _token The token address. - * @return The value in tokens of the investment (including interests) and the time at which the investment can be removed. - */ - function getInvestment( - BaseWallet _wallet, - address _token - ) - external - view - returns (uint256 _tokenValue, uint256 _periodEnd) - { - address tokenPool = uniswapFactory.getExchange(_token); - uint256 tokenPoolSize = ERC20(_token).balanceOf(tokenPool); - uint shares = ERC20(tokenPool).balanceOf(address(_wallet)); - uint totalSupply = ERC20(tokenPool).totalSupply(); - _tokenValue = shares.mul(tokenPoolSize).mul(2).div(totalSupply); - _periodEnd = 0; - } - - /* ****************************************** Uniswap utilities ******************************************* */ - - /** - * @dev Adds liquidity to a Uniswap ETH-ERC20 pair. - * @param _wallet The target wallet - * @param _token The address of the ERC20 token of the pair. - * @param _amount The amount of tokens to add to the pool. - */ - function addLiquidity( - BaseWallet _wallet, - address _token, - uint256 _amount - ) - internal - returns (uint256) - { - require(_amount > 0, "Uniswap: can't add 0 liquidity"); - address tokenPool = uniswapFactory.getExchange(_token); - require(tokenPool != address(0), "Uniswap: target token is not traded on Uniswap"); - - uint256 tokenBalance = ERC20(_token).balanceOf(address(_wallet)); - if (_amount > tokenBalance) { - uint256 ethToSwap = UniswapExchange(tokenPool).getEthToTokenOutputPrice(_amount - tokenBalance); - require(ethToSwap <= address(_wallet).balance, "Uniswap: not enough ETH to swap"); - invokeWallet(address(_wallet), tokenPool, ethToSwap, abi.encodeWithSignature("ethToTokenSwapOutput(uint256,uint256)", _amount - tokenBalance, block.timestamp)); - } - - uint256 tokenLiquidity = ERC20(_token).balanceOf(tokenPool); - uint256 ethLiquidity = tokenPool.balance; - uint256 ethToPool = (_amount - 1).mul(ethLiquidity).div(tokenLiquidity); - require(ethToPool <= address(_wallet).balance, "Uniswap: not enough ETH to pool"); - invokeWallet(address(_wallet), _token, 0, abi.encodeWithSignature("approve(address,uint256)", tokenPool, _amount)); - invokeWallet( - address(_wallet), - tokenPool, - ethToPool, - abi.encodeWithSignature("addLiquidity(uint256,uint256,uint256)", - 1, - _amount, - block.timestamp + 1)); - return _amount.mul(2); - } - - /** - * @dev Removes liquidity from a Uniswap ETH-ERC20 pair. - * @param _wallet The target wallet - * @param _token The address of the ERC20 token of the pair. - * @param _fraction The fraction of pool shares to liquidate. - */ - function removeLiquidity( - BaseWallet _wallet, - address _token, - uint256 _fraction - ) - internal - { - address tokenPool = uniswapFactory.getExchange(_token); - require(tokenPool != address(0), "Uniswap: The target token is not traded on Uniswap"); - uint256 shares = ERC20(tokenPool).balanceOf(address(_wallet)); - invokeWallet( - address(_wallet), - tokenPool, - 0, - abi.encodeWithSignature("removeLiquidity(uint256,uint256,uint256,uint256)", - shares.mul(_fraction).div(10000), - 1, - 1, - block.timestamp + 1)); - } -} - diff --git a/contracts/modules/common/BaseModule.sol b/contracts/modules/common/BaseModule.sol index f13989fe0..02012bb43 100644 --- a/contracts/modules/common/BaseModule.sol +++ b/contracts/modules/common/BaseModule.sol @@ -15,10 +15,11 @@ pragma solidity ^0.5.4; import "../../wallet/BaseWallet.sol"; -import "../../upgrade/ModuleRegistry.sol"; -import "../../storage/GuardianStorage.sol"; -import "../../interfaces/Module.sol"; -import "../../exchange/ERC20.sol"; +import "../../infrastructure/ModuleRegistry.sol"; +import "../storage/GuardianStorage.sol"; +import "./Module.sol"; +import "../../../lib/other/ERC20.sol"; +import "../../../lib/utils/SafeMath.sol"; /** * @title BaseModule diff --git a/contracts/modules/common/BaseTransfer.sol b/contracts/modules/common/BaseTransfer.sol index 355a2a50c..3ed726003 100644 --- a/contracts/modules/common/BaseTransfer.sol +++ b/contracts/modules/common/BaseTransfer.sol @@ -32,7 +32,15 @@ contract BaseTransfer is BaseModule { event Transfer(address indexed wallet, address indexed token, uint256 indexed amount, address to, bytes data); event Approved(address indexed wallet, address indexed token, uint256 amount, address spender); event CalledContract(address indexed wallet, address indexed to, uint256 amount, bytes data); - + event ApprovedAndCalledContract( + address indexed wallet, + address indexed to, + address spender, + address indexed token, + uint256 amountApproved, + uint256 amountSpent, + bytes data + ); // *************** Internal Functions ********************* // /** @@ -77,4 +85,55 @@ contract BaseTransfer is BaseModule { invokeWallet(address(_wallet), _contract, _value, _data); emit CalledContract(address(_wallet), _contract, _value, _data); } + + /** + * @dev Helper method to approve a certain amount of token and call an external contract. + * The address that spends the _token and the address that is called with _data can be different. + * @param _wallet The target wallet. + * @param _token The ERC20 address. + * @param _spender The spender address. + * @param _amount The amount of tokens to transfer. + * @param _contract The contract address. + * @param _data The method data. + */ + function doApproveTokenAndCallContract( + BaseWallet _wallet, + address _token, + address _spender, + uint256 _amount, + address _contract, + bytes memory _data + ) + internal + { + uint256 existingAllowance = ERC20(_token).allowance(address(_wallet), _spender); + uint256 totalAllowance = SafeMath.add(existingAllowance, _amount); + // Approve the desired amount plus existing amount. This logic allows for potential gas saving later + // when restoring the original approved amount, in cases where the _spender uses the exact approved _amount. + bytes memory methodData = abi.encodeWithSignature("approve(address,uint256)", _spender, totalAllowance); + + invokeWallet(address(_wallet), _token, 0, methodData); + invokeWallet(address(_wallet), _contract, 0, _data); + + // Calculate the approved amount that was spent after the call + uint256 unusedAllowance = ERC20(_token).allowance(address(_wallet), _spender); + uint256 usedAllowance = SafeMath.sub(totalAllowance, unusedAllowance); + // Ensure the amount spent does not exceed the amount approved for this call + require(usedAllowance <= _amount, "BT: insufficient amount for call"); + + if (unusedAllowance != existingAllowance) { + // Restore the original allowance amount if the amount spent was different (can be lower). + methodData = abi.encodeWithSignature("approve(address,uint256)", _spender, existingAllowance); + invokeWallet(address(_wallet), _token, 0, methodData); + } + + emit ApprovedAndCalledContract( + address(_wallet), + _contract, + _spender, + _token, + _amount, + usedAllowance, + _data); + } } diff --git a/contracts/utils/GuardianUtils.sol b/contracts/modules/common/GuardianUtils.sol similarity index 97% rename from contracts/utils/GuardianUtils.sol rename to contracts/modules/common/GuardianUtils.sol index e4f36f16c..0cfc0e77f 100644 --- a/contracts/utils/GuardianUtils.sol +++ b/contracts/modules/common/GuardianUtils.sol @@ -14,8 +14,6 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../wallet/BaseWallet.sol"; -import "../storage/GuardianStorage.sol"; library GuardianUtils { diff --git a/contracts/modules/common/LimitManager.sol b/contracts/modules/common/LimitManager.sol index c130a2a27..4e494b8d1 100644 --- a/contracts/modules/common/LimitManager.sol +++ b/contracts/modules/common/LimitManager.sol @@ -15,7 +15,6 @@ pragma solidity ^0.5.4; import "../../wallet/BaseWallet.sol"; -import "../../../lib/utils/SafeMath.sol"; import "./BaseModule.sol"; /** diff --git a/contracts/interfaces/Module.sol b/contracts/modules/common/Module.sol similarity index 97% rename from contracts/interfaces/Module.sol rename to contracts/modules/common/Module.sol index 2be94baf4..5d6383c72 100644 --- a/contracts/interfaces/Module.sol +++ b/contracts/modules/common/Module.sol @@ -14,7 +14,7 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../wallet/BaseWallet.sol"; +import "../../wallet/BaseWallet.sol"; /** * @title Module diff --git a/contracts/modules/common/RelayerModule.sol b/contracts/modules/common/RelayerModule.sol index 4d75b366c..24573a972 100644 --- a/contracts/modules/common/RelayerModule.sol +++ b/contracts/modules/common/RelayerModule.sol @@ -15,7 +15,6 @@ pragma solidity ^0.5.4; import "../../wallet/BaseWallet.sol"; -import "../../interfaces/Module.sol"; import "./BaseModule.sol"; /** @@ -149,10 +148,9 @@ contract RelayerModule is BaseModule { /** * @dev Checks if the relayed transaction is unique. * @param _wallet The target wallet. - * @param _nonce The nonce * @param _signHash The signed hash of the transaction */ - function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 _nonce, bytes32 _signHash) internal returns (bool) { + function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 /* _nonce */, bytes32 _signHash) internal returns (bool) { if (relayer[address(_wallet)].executedTx[_signHash] == true) { return false; } diff --git a/contracts/modules/common/RelayerModuleV2.sol b/contracts/modules/common/RelayerModuleV2.sol new file mode 100644 index 000000000..23ec1deb3 --- /dev/null +++ b/contracts/modules/common/RelayerModuleV2.sol @@ -0,0 +1,342 @@ +// Copyright (C) 2018 Argent Labs Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; +import "../../wallet/BaseWallet.sol"; +import "./GuardianUtils.sol"; +import "./BaseModule.sol"; + +/** + * @title RelayerModuleV2 + * @dev Base module containing logic to execute transactions signed by eth-less accounts and sent by a relayer. + * RelayerModuleV2 should ultimately replace RelayerModule and be subclassed by all modules. + * It is currently only subclassed by RecoveryManager and ApprovedTransfer. + * @author Julien Niset , Olivier VDB + */ +contract RelayerModuleV2 is BaseModule { + + uint256 constant internal BLOCKBOUND = 10000; + + mapping (address => RelayerConfig) public relayer; + + struct RelayerConfig { + uint256 nonce; + mapping (bytes32 => bool) executedTx; + } + + enum OwnerSignature { + Required, + Optional, + Disallowed + } + + event TransactionExecuted(address indexed wallet, bool indexed success, bytes32 signedHash); + + /** + * @dev Throws if the call did not go through the execute() method. + */ + modifier onlyExecute { + require(msg.sender == address(this), "RM: must be called via execute()"); + _; + } + + /* ***************** Abstract methods ************************* */ + + /** + * @dev Gets the number of valid signatures that must be provided to execute a + * specific relayed transaction. + * @param _wallet The target wallet. + * @param _data The data of the relayed transaction. + * @return The number of required signatures. + */ + function getRequiredSignatures(BaseWallet _wallet, bytes memory _data) public view returns (uint256); + + /** + * @dev Validates the signatures provided with a relayed transaction. + * The method MUST return false if one or more signatures are not valid. + * @param _wallet The target wallet. + * @param _data The data of the relayed transaction. + * @param _signHash The signed hash representing the relayed transaction. + * @param _signatures The signatures as a concatenated byte array. + * @return A boolean indicating whether the signatures are valid. + */ + function validateSignatures( + BaseWallet _wallet, + bytes memory _data, + bytes32 _signHash, + bytes memory _signatures + ) + internal view returns (bool); + + /* ***************** External methods ************************* */ + + /** + * @dev Executes a relayed transaction. + * @param _wallet The target wallet. + * @param _data The data for the relayed transaction + * @param _nonce The nonce used to prevent replay attacks. + * @param _signatures The signatures as a concatenated byte array. + * @param _gasPrice The gas price to use for the gas refund. + * @param _gasLimit The gas limit to use for the gas refund. + */ + function execute( + BaseWallet _wallet, + bytes calldata _data, + uint256 _nonce, + bytes calldata _signatures, + uint256 _gasPrice, + uint256 _gasLimit + ) + external + returns (bool success) + { + uint startGas = gasleft(); + bytes32 signHash = getSignHash(address(this), address(_wallet), 0, _data, _nonce, _gasPrice, _gasLimit); + require(checkAndUpdateUniqueness(_wallet, _nonce, signHash), "RM: Duplicate request"); + require(verifyData(address(_wallet), _data), "RM: Target of _data != _wallet"); + uint256 requiredSignatures = getRequiredSignatures(_wallet, _data); + require(requiredSignatures * 65 == _signatures.length, "RM: Wrong number of signatures"); + require(requiredSignatures == 0 || validateSignatures(_wallet, _data, signHash, _signatures), "RM: Invalid signatures"); + // The correctness of the refund is checked on the next line using an `if` instead of a `require` + // in order to prevent a failing refund from being replayable in the future. + if (verifyRefund(_wallet, _gasLimit, _gasPrice, requiredSignatures)) { + // solium-disable-next-line security/no-call-value + (success,) = address(this).call(_data); + refund(_wallet, startGas - gasleft(), _gasPrice, _gasLimit, requiredSignatures, msg.sender); + } + emit TransactionExecuted(address(_wallet), success, signHash); + } + + /** + * @dev Gets the current nonce for a wallet. + * @param _wallet The target wallet. + */ + function getNonce(BaseWallet _wallet) external view returns (uint256 nonce) { + return relayer[address(_wallet)].nonce; + } + + /* ***************** Internal & Private methods ************************* */ + + /** + * @dev Generates the signed hash of a relayed transaction according to ERC 1077. + * @param _from The starting address for the relayed transaction (should be the module) + * @param _to The destination address for the relayed transaction (should be the wallet) + * @param _value The value for the relayed transaction + * @param _data The data for the relayed transaction + * @param _nonce The nonce used to prevent replay attacks. + * @param _gasPrice The gas price to use for the gas refund. + * @param _gasLimit The gas limit to use for the gas refund. + */ + function getSignHash( + address _from, + address _to, + uint256 _value, + bytes memory _data, + uint256 _nonce, + uint256 _gasPrice, + uint256 _gasLimit + ) + internal + pure + returns (bytes32) + { + return keccak256( + abi.encodePacked( + "\x19Ethereum Signed Message:\n32", + keccak256(abi.encodePacked(byte(0x19), byte(0), _from, _to, _value, _data, _nonce, _gasPrice, _gasLimit)) + )); + } + + /** + * @dev Checks if the relayed transaction is unique. + * @param _wallet The target wallet. + * @param _nonce The nonce + * @param _signHash The signed hash of the transaction + */ + function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 _nonce, bytes32 _signHash) internal returns (bool) { + if (relayer[address(_wallet)].executedTx[_signHash] == true) { + return false; + } + relayer[address(_wallet)].executedTx[_signHash] = true; + return true; + } + + /** + * @dev Checks that a nonce has the correct format and is valid. + * It must be constructed as nonce = {block number}{timestamp} where each component is 16 bytes. + * @param _wallet The target wallet. + * @param _nonce The nonce + */ + function checkAndUpdateNonce(BaseWallet _wallet, uint256 _nonce) internal returns (bool) { + if (_nonce <= relayer[address(_wallet)].nonce) { + return false; + } + uint256 nonceBlock = (_nonce & 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000) >> 128; + if (nonceBlock > block.number + BLOCKBOUND) { + return false; + } + relayer[address(_wallet)].nonce = _nonce; + return true; + } + + /** + * @dev Validates the signatures provided with a relayed transaction. + * The method MUST throw if one or more signatures are not valid. + * @param _wallet The target wallet. + * @param _signHash The signed hash representing the relayed transaction. + * @param _signatures The signatures as a concatenated byte array. + * @param _option An enum indicating whether the owner is required, optional or disallowed. + */ + function validateSignatures( + BaseWallet _wallet, + bytes32 _signHash, + bytes memory _signatures, + OwnerSignature _option + ) + internal view returns (bool) + { + address lastSigner = address(0); + address[] memory guardians; + if (_option != OwnerSignature.Required || _signatures.length > 65) { + guardians = guardianStorage.getGuardians(_wallet); // guardians are only read if they may be needed + } + bool isGuardian; + + for (uint8 i = 0; i < _signatures.length / 65; i++) { + address signer = recoverSigner(_signHash, _signatures, i); + + if (i == 0) { + if (_option == OwnerSignature.Required) { + // First signer must be owner + if (isOwner(_wallet, signer)) { + continue; + } + return false; + } else if (_option == OwnerSignature.Optional) { + // First signer can be owner + if (isOwner(_wallet, signer)) { + continue; + } + } + } + if (signer <= lastSigner) { + return false; // Signers must be different + } + lastSigner = signer; + (isGuardian, guardians) = GuardianUtils.isGuardian(guardians, signer); + if (!isGuardian) { + return false; + } + } + return true; + } + + /** + * @dev Recovers the signer at a given position from a list of concatenated signatures. + * @param _signedHash The signed hash + * @param _signatures The concatenated signatures. + * @param _index The index of the signature to recover. + */ + function recoverSigner(bytes32 _signedHash, bytes memory _signatures, uint _index) internal pure returns (address) { + uint8 v; + bytes32 r; + bytes32 s; + // we jump 32 (0x20) as the first slot of bytes contains the length + // we jump 65 (0x41) per signature + // for v we load 32 bytes ending with v (the first 31 come from s) then apply a mask + // solium-disable-next-line security/no-inline-assembly + assembly { + r := mload(add(_signatures, add(0x20,mul(0x41,_index)))) + s := mload(add(_signatures, add(0x40,mul(0x41,_index)))) + v := and(mload(add(_signatures, add(0x41,mul(0x41,_index)))), 0xff) + } + require(v == 27 || v == 28); // solium-disable-line error-reason + return ecrecover(_signedHash, v, r, s); + } + + /** + * @dev Refunds the gas used to the Relayer. + * For security reasons the default behavior is to not refund calls with 0 or 1 signatures. + * @param _wallet The target wallet. + * @param _gasUsed The gas used. + * @param _gasPrice The gas price for the refund. + * @param _gasLimit The gas limit for the refund. + * @param _signatures The number of signatures used in the call. + * @param _relayer The address of the Relayer. + */ + function refund( + BaseWallet _wallet, + uint _gasUsed, + uint _gasPrice, + uint _gasLimit, + uint _signatures, + address _relayer + ) + internal + { + uint256 amount = 29292 + _gasUsed; // 21000 (transaction) + 7620 (execution of refund) + 672 to log the event + _gasUsed + // only refund if gas price not null, more than 1 signatures, gas less than gasLimit + if (_gasPrice > 0 && _signatures > 1 && amount <= _gasLimit) { + if (_gasPrice > tx.gasprice) { + amount = amount * tx.gasprice; + } else { + amount = amount * _gasPrice; + } + invokeWallet(address(_wallet), _relayer, amount, EMPTY_BYTES); + } + } + + /** + * @dev Returns false if the refund is expected to fail. + * @param _wallet The target wallet. + * @param _gasUsed The expected gas used. + * @param _gasPrice The expected gas price for the refund. + */ + function verifyRefund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _signatures) internal view returns (bool) { + if (_gasPrice > 0 && + _signatures > 1 && + (address(_wallet).balance < _gasUsed * _gasPrice || _wallet.authorised(address(this)) == false)) { + return false; + } + return true; + } + + /** + * @dev Parses the data to extract the method signature. + */ + function functionPrefix(bytes memory _data) internal pure returns (bytes4 prefix) { + require(_data.length >= 4, "RM: Invalid functionPrefix"); + // solium-disable-next-line security/no-inline-assembly + assembly { + prefix := mload(add(_data, 0x20)) + } + } + + /** + * @dev Checks that the wallet address provided as the first parameter of the relayed data is the same + * as the wallet passed as the input of the execute() method. + @return false if the addresses are different. + */ + function verifyData(address _wallet, bytes memory _data) private pure returns (bool) { + require(_data.length >= 36, "RM: Invalid dataWallet"); + address dataWallet; + // solium-disable-next-line security/no-inline-assembly + assembly { + //_data = {length:32}{sig:4}{_wallet:32}{...} + dataWallet := mload(add(_data, 0x24)) + } + return dataWallet == _wallet; + } +} \ No newline at end of file diff --git a/contracts/modules/MakerManager.sol b/contracts/modules/maker/MakerManager.sol similarity index 97% rename from contracts/modules/MakerManager.sol rename to contracts/modules/maker/MakerManager.sol index 6e4cc3281..167af8dfb 100644 --- a/contracts/modules/MakerManager.sol +++ b/contracts/modules/maker/MakerManager.sol @@ -15,12 +15,11 @@ pragma solidity ^0.5.4; -import "../../lib/utils/SafeMath.sol"; -import "../wallet/BaseWallet.sol"; -import "./common/BaseModule.sol"; -import "./common/RelayerModule.sol"; -import "./common/OnlyOwnerModule.sol"; -import "../defi/Loan.sol"; +import "../../wallet/BaseWallet.sol"; +import "../common/BaseModule.sol"; +import "../common/RelayerModule.sol"; +import "../common/OnlyOwnerModule.sol"; +import "../../defi/Loan.sol"; // Interface to MakerDAO's Tub contract, used to manage CDPs contract IMakerCdp { @@ -72,10 +71,10 @@ interface IUniswapFactory { } interface IUniswapExchange { - function getEthToTokenOutputPrice(uint256 _tokens_bought) external view returns (uint256); - function getEthToTokenInputPrice(uint256 _eth_sold) external view returns (uint256); - function getTokenToEthOutputPrice(uint256 _eth_bought) external view returns (uint256); - function getTokenToEthInputPrice(uint256 _tokens_sold) external view returns (uint256); + function getEthToTokenOutputPrice(uint256 _tokensBought) external view returns (uint256); + function getEthToTokenInputPrice(uint256 _ethSold) external view returns (uint256); + function getTokenToEthOutputPrice(uint256 _ethBought) external view returns (uint256); + function getTokenToEthInputPrice(uint256 _tokensSold) external view returns (uint256); } diff --git a/contracts/modules/maker/MakerV2Base.sol b/contracts/modules/maker/MakerV2Base.sol new file mode 100644 index 000000000..389d63fe8 --- /dev/null +++ b/contracts/modules/maker/MakerV2Base.sol @@ -0,0 +1,62 @@ +// Copyright (C) 2019 Argent Labs Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; +import "../common/BaseModule.sol"; +import "../common/RelayerModule.sol"; +import "../common/OnlyOwnerModule.sol"; +import "../../../lib/utils/SafeMath.sol"; +import "../../../lib/maker/MakerInterfaces.sol"; +import "../../infrastructure/MakerRegistry.sol"; + +/** + * @title MakerV2Base + * @dev Common base to MakerV2Invest and MakerV2Loan. + * @author Olivier VDB - + */ +contract MakerV2Base is BaseModule, RelayerModule, OnlyOwnerModule { + + bytes32 constant private NAME = "MakerV2Manager"; + + // The address of the (MCD) DAI token + GemLike internal daiToken; + // The address of the SAI <-> DAI migration contract + address internal scdMcdMigration; + // The address of the Dai Adapter + JoinLike internal daiJoin; + // The address of the Vat + VatLike internal vat; + + uint256 constant internal RAY = 10 ** 27; + + using SafeMath for uint256; + + // *************** Constructor ********************** // + + constructor( + ModuleRegistry _registry, + GuardianStorage _guardianStorage, + ScdMcdMigrationLike _scdMcdMigration + ) + BaseModule(_registry, _guardianStorage, NAME) + public + { + scdMcdMigration = address(_scdMcdMigration); + daiJoin = _scdMcdMigration.daiJoin(); + daiToken = daiJoin.dai(); + vat = daiJoin.vat(); + } + +} \ No newline at end of file diff --git a/contracts/modules/maker/MakerV2Invest.sol b/contracts/modules/maker/MakerV2Invest.sol new file mode 100644 index 000000000..dff1e5c43 --- /dev/null +++ b/contracts/modules/maker/MakerV2Invest.sol @@ -0,0 +1,151 @@ +// Copyright (C) 2019 Argent Labs Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; +import "./MakerV2Base.sol"; + +/** + * @title MakerV2Invest + * @dev Module to lock/unlock MCD DAI into/from Maker's Pot + * @author Olivier VDB - + */ +contract MakerV2Invest is MakerV2Base { + + // The address of the Pot + PotLike internal pot; + + // *************** Events ********************** // + + // WARNING: in a previous version of this module, the third parameter of `InvestmentRemoved` + // represented the *fraction* (out of 10000) of the investment withdrawn, not the absolute amount withdrawn + event InvestmentRemoved(address indexed _wallet, address _token, uint256 _amount); + event InvestmentAdded(address indexed _wallet, address _token, uint256 _amount, uint256 _period); + + // *************** Constructor ********************** // + + constructor(PotLike _pot) public { + pot = _pot; + } + + // *************** External/Public Functions ********************* // + + /** + * @dev Lets the wallet owner deposit MCD DAI into the DSR Pot. + * @param _wallet The target wallet. + * @param _amount The amount of DAI to deposit + */ + function joinDsr( + BaseWallet _wallet, + uint256 _amount + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + // Execute drip to get the chi rate updated to rho == now, otherwise join will fail + pot.drip(); + // Approve DAI adapter to take the DAI amount + invokeWallet(address(_wallet), address(daiToken), 0, abi.encodeWithSignature("approve(address,uint256)", address(daiJoin), _amount)); + // Join DAI into the vat (_amount of external DAI is burned and the vat transfers _amount of internal DAI from the adapter to the _wallet) + invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSignature("join(address,uint256)", address(_wallet), _amount)); + // Approve the pot to take out (internal) DAI from the wallet's balance in the vat + grantVatAccess(_wallet, address(pot)); + // Compute the pie value in the pot + uint256 pie = _amount.mul(RAY) / pot.chi(); + // Join the pie value to the pot + invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSignature("join(uint256)", pie)); + // Emitting event + emit InvestmentAdded(address(_wallet), address(daiToken), _amount, 0); + } + + /** + * @dev Lets the wallet owner withdraw MCD DAI from the DSR pot. + * @param _wallet The target wallet. + * @param _amount The amount of DAI to withdraw. + */ + function exitDsr( + BaseWallet _wallet, + uint256 _amount + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + // Execute drip to count the savings accumulated until this moment + pot.drip(); + // Calculates the pie value in the pot equivalent to the DAI wad amount + uint256 pie = _amount.mul(RAY) / pot.chi(); + // Exit DAI from the pot + invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSignature("exit(uint256)", pie)); + // Allow adapter to access the _wallet's DAI balance in the vat + grantVatAccess(_wallet, address(daiJoin)); + // Check the actual balance of DAI in the vat after the pot exit + uint bal = vat.dai(address(_wallet)); + // It is necessary to check if due to rounding the exact _amount can be exited by the adapter. + // Otherwise it will do the maximum DAI balance in the vat + uint256 withdrawn = bal >= _amount.mul(RAY) ? _amount : bal / RAY; + invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSignature("exit(address,uint256)", address(_wallet), withdrawn)); + // Emitting event + emit InvestmentRemoved(address(_wallet), address(daiToken), withdrawn); + } + + /** + * @dev Lets the wallet owner withdraw their entire MCD DAI balance from the DSR pot. + * @param _wallet The target wallet. + */ + function exitAllDsr( + BaseWallet _wallet + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + // Execute drip to count the savings accumulated until this moment + pot.drip(); + // Gets the total pie belonging to the _wallet + uint256 pie = pot.pie(address(_wallet)); + // Exit DAI from the pot + invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSignature("exit(uint256)", pie)); + // Allow adapter to access the _wallet's DAI balance in the vat + grantVatAccess(_wallet, address(daiJoin)); + // Exits the DAI amount corresponding to the value of pie + uint256 withdrawn = pot.chi().mul(pie) / RAY; + invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSignature("exit(address,uint256)", address(_wallet), withdrawn)); + // Emitting event + emit InvestmentRemoved(address(_wallet), address(daiToken), withdrawn); + } + + /** + * @dev Returns the amount of DAI currently held in the DSR pot. + * @param _wallet The target wallet. + * @return The DSR balance. + */ + function dsrBalance(BaseWallet _wallet) external view returns (uint256 _balance) { + return pot.chi().mul(pot.pie(address(_wallet))) / RAY; + } + + /* ****************************************** Internal method ******************************************* */ + + /** + * @dev Grant access to the wallet's internal DAI balance in the VAT to an operator. + * @param _wallet The target wallet. + * @param _operator The grantee of the access + */ + function grantVatAccess(BaseWallet _wallet, address _operator) internal { + if (vat.can(address(_wallet), _operator) == 0) { + invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSignature("hope(address)", _operator)); + } + } +} \ No newline at end of file diff --git a/contracts/modules/maker/MakerV2Loan.sol b/contracts/modules/maker/MakerV2Loan.sol new file mode 100644 index 000000000..1dede0f70 --- /dev/null +++ b/contracts/modules/maker/MakerV2Loan.sol @@ -0,0 +1,675 @@ +// Copyright (C) 2019 Argent Labs Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; +import "./MakerV2Base.sol"; +import "../../infrastructure/MakerRegistry.sol"; + +interface IUniswapFactory { + function getExchange(address _token) external view returns(IUniswapExchange); +} + +interface IUniswapExchange { + function getEthToTokenOutputPrice(uint256 _tokensBought) external view returns (uint256); + function getEthToTokenInputPrice(uint256 _ethSold) external view returns (uint256); + function getTokenToEthOutputPrice(uint256 _ethBought) external view returns (uint256); + function getTokenToEthInputPrice(uint256 _tokensSold) external view returns (uint256); +} + +/** + * @title MakerV2Loan + * @dev Module to migrate old CDPs and open and manage new vaults. The vaults managed by + * this module are directly owned by the module. This is to prevent a compromised wallet owner + * from being able to use `TransferManager.callContract()` to transfer ownership of a vault + * (a type of asset NOT protected by a wallet's daily limit) to another account. + * @author Olivier VDB - + */ +contract MakerV2Loan is MakerV2Base { + + // The address of the MKR token + GemLike internal mkrToken; + // The address of the WETH token + GemLike internal wethToken; + // The address of the WETH Adapter + JoinLike internal wethJoin; + // The address of the Jug + JugLike internal jug; + // The address of the Vault Manager (referred to as 'CdpManager' to match Maker's naming) + ManagerLike internal cdpManager; + // The address of the SCD Tub + SaiTubLike internal tub; + // The Maker Registry in which all supported collateral tokens and their adapters are stored + MakerRegistry internal makerRegistry; + // The Uniswap Exchange contract for DAI + IUniswapExchange internal daiUniswap; + // The Uniswap Exchange contract for MKR + IUniswapExchange internal mkrUniswap; + // Mapping [wallet][ilk] -> loanId, that keeps track of cdp owners + // while also enforcing a maximum of one loan per token (ilk) and per wallet + // (which will make future upgrades of the module easier) + mapping(address => mapping(bytes32 => bytes32)) public loanIds; + // Lock used by nonReentrant() + bool private _notEntered = true; + + // Mock token address for ETH + address constant internal ETH_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + // ****************** Events *************************** // + + // Emitted when an SCD CDP is converted into an MCD vault + event CdpMigrated(address indexed _wallet, bytes32 _oldCdpId, bytes32 _newVaultId); + // Vault management events + event LoanOpened( + address indexed _wallet, + bytes32 indexed _loanId, + address _collateral, + uint256 _collateralAmount, + address _debtToken, + uint256 _debtAmount + ); + event LoanClosed(address indexed _wallet, bytes32 indexed _loanId); + event CollateralAdded(address indexed _wallet, bytes32 indexed _loanId, address _collateral, uint256 _collateralAmount); + event CollateralRemoved(address indexed _wallet, bytes32 indexed _loanId, address _collateral, uint256 _collateralAmount); + event DebtAdded(address indexed _wallet, bytes32 indexed _loanId, address _debtToken, uint256 _debtAmount); + event DebtRemoved(address indexed _wallet, bytes32 indexed _loanId, address _debtToken, uint256 _debtAmount); + + + // *************** Modifiers *************************** // + + /** + * @dev Throws if the sender is not an authorised module. + */ + modifier onlyModule(BaseWallet _wallet) { + require(_wallet.authorised(msg.sender), "MV2: sender unauthorized"); + _; + } + + /** + * @dev Prevents call reentrancy + */ + modifier nonReentrant() { + require(_notEntered, "MV2: reentrant call"); + _notEntered = false; + _; + _notEntered = true; + } + + // *************** Constructor ********************** // + + constructor( + JugLike _jug, + MakerRegistry _makerRegistry, + IUniswapFactory _uniswapFactory + ) + public + { + cdpManager = ScdMcdMigrationLike(scdMcdMigration).cdpManager(); + tub = ScdMcdMigrationLike(scdMcdMigration).tub(); + wethJoin = ScdMcdMigrationLike(scdMcdMigration).wethJoin(); + wethToken = wethJoin.gem(); + mkrToken = tub.gov(); + jug = _jug; + makerRegistry = _makerRegistry; + daiUniswap = _uniswapFactory.getExchange(address(daiToken)); + mkrUniswap = _uniswapFactory.getExchange(address(mkrToken)); + // Authorize daiJoin to exit DAI from the module's internal balance in the vat + vat.hope(address(daiJoin)); + } + + // *************** External/Public Functions ********************* // + + /* ********************************** Implementation of Loan ************************************* */ + + /** + * @dev Opens a collateralized loan. + * @param _wallet The target wallet. + * @param _collateral The token used as a collateral. + * @param _collateralAmount The amount of collateral token provided. + * @param _debtToken The token borrowed (must be the address of the DAI contract). + * @param _debtAmount The amount of tokens borrowed. + * @return The ID of the created vault. + */ + function openLoan( + BaseWallet _wallet, + address _collateral, + uint256 _collateralAmount, + address _debtToken, + uint256 _debtAmount + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + returns (bytes32 _loanId) + { + verifySupportedCollateral(_collateral); + require(_debtToken == address(daiToken), "MV2: debt token not DAI"); + _loanId = bytes32(openVault(_wallet, _collateral, _collateralAmount, _debtAmount)); + emit LoanOpened(address(_wallet), _loanId, _collateral, _collateralAmount, _debtToken, _debtAmount); + } + + /** + * @dev Adds collateral to a loan identified by its ID. + * @param _wallet The target wallet. + * @param _loanId The ID of the target vault. + * @param _collateral The token used as a collateral. + * @param _collateralAmount The amount of collateral to add. + */ + function addCollateral( + BaseWallet _wallet, + bytes32 _loanId, + address _collateral, + uint256 _collateralAmount + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + verifyLoanOwner(_wallet, _loanId); + addCollateral(_wallet, uint256(_loanId), _collateralAmount); + emit CollateralAdded(address(_wallet), _loanId, _collateral, _collateralAmount); + } + + /** + * @dev Removes collateral from a loan identified by its ID. + * @param _wallet The target wallet. + * @param _loanId The ID of the target vault. + * @param _collateral The token used as a collateral. + * @param _collateralAmount The amount of collateral to remove. + */ + function removeCollateral( + BaseWallet _wallet, + bytes32 _loanId, + address _collateral, + uint256 _collateralAmount + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + verifyLoanOwner(_wallet, _loanId); + removeCollateral(_wallet, uint256(_loanId), _collateralAmount); + emit CollateralRemoved(address(_wallet), _loanId, _collateral, _collateralAmount); + } + + /** + * @dev Increases the debt by borrowing more token from a loan identified by its ID. + * @param _wallet The target wallet. + * @param _loanId The ID of the target vault. + * @param _debtToken The token borrowed (must be the address of the DAI contract). + * @param _debtAmount The amount of token to borrow. + */ + function addDebt( + BaseWallet _wallet, + bytes32 _loanId, + address _debtToken, + uint256 _debtAmount + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + verifyLoanOwner(_wallet, _loanId); + addDebt(_wallet, uint256(_loanId), _debtAmount); + emit DebtAdded(address(_wallet), _loanId, _debtToken, _debtAmount); + } + + /** + * @dev Decreases the debt by repaying some token from a loan identified by its ID. + * @param _wallet The target wallet. + * @param _loanId The ID of the target vault. + * @param _debtToken The token to repay (must be the address of the DAI contract). + * @param _debtAmount The amount of token to repay. + */ + function removeDebt( + BaseWallet _wallet, + bytes32 _loanId, + address _debtToken, + uint256 _debtAmount + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + verifyLoanOwner(_wallet, _loanId); + updateStabilityFee(uint256(_loanId)); + removeDebt(_wallet, uint256(_loanId), _debtAmount); + emit DebtRemoved(address(_wallet), _loanId, _debtToken, _debtAmount); + } + + /** + * @dev Closes a collateralized loan by repaying all debts (plus interest) and redeeming all collateral. + * @param _wallet The target wallet. + * @param _loanId The ID of the target vault. + */ + function closeLoan( + BaseWallet _wallet, + bytes32 _loanId + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + verifyLoanOwner(_wallet, _loanId); + updateStabilityFee(uint256(_loanId)); + closeVault(_wallet, uint256(_loanId)); + emit LoanClosed(address(_wallet), _loanId); + } + + /* *************************************** Other vault methods ***************************************** */ + + /** + * @dev Lets a vault owner transfer their vault from their wallet to the present module so the vault + * can be managed by the module. + * @param _wallet The target wallet. + * @param _loanId The ID of the target vault. + */ + function acquireLoan( + BaseWallet _wallet, + bytes32 _loanId + ) + external + nonReentrant + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + { + require(cdpManager.owns(uint256(_loanId)) == address(_wallet), "MV2: wrong vault owner"); + // Transfer the vault from the wallet to the module + invokeWallet( + address(_wallet), + address(cdpManager), + 0, + abi.encodeWithSignature("give(uint256,address)", uint256(_loanId), address(this)) + ); + require(cdpManager.owns(uint256(_loanId)) == address(this), "MV2: failed give"); + // Mark the incoming vault as belonging to the wallet (or merge it into the existing vault if there is one) + assignLoanToWallet(_wallet, _loanId); + } + + /** + * @dev Lets a SCD CDP owner migrate their CDP to use the new MCD engine. + * Requires MKR or ETH to pay the SCD governance fee + * @param _wallet The target wallet. + * @param _cup id of the old SCD CDP to migrate + */ + function migrateCdp( + BaseWallet _wallet, + bytes32 _cup + ) + external + onlyWalletOwner(_wallet) + onlyWhenUnlocked(_wallet) + returns (bytes32 _loanId) + { + (uint daiPerMkr, bool ok) = tub.pep().peek(); + if (ok && daiPerMkr != 0) { + // get governance fee in MKR + uint mkrFee = tub.rap(_cup).wdiv(daiPerMkr); + // Convert some ETH into MKR with Uniswap if necessary + buyTokens(_wallet, mkrToken, mkrFee, mkrUniswap); + // Transfer the MKR to the Migration contract + invokeWallet(address(_wallet), address(mkrToken), 0, abi.encodeWithSignature("transfer(address,uint256)", address(scdMcdMigration), mkrFee)); + } + // Transfer ownership of the SCD CDP to the migration contract + invokeWallet(address(_wallet), address(tub), 0, abi.encodeWithSignature("give(bytes32,address)", _cup, address(scdMcdMigration))); + // Update stability fee rate + jug.drip(wethJoin.ilk()); + // Execute the CDP migration + _loanId = bytes32(ScdMcdMigrationLike(scdMcdMigration).migrate(_cup)); + // Mark the new vault as belonging to the wallet (or merge it into the existing vault if there is one) + _loanId = assignLoanToWallet(_wallet, _loanId); + + emit CdpMigrated(address(_wallet), _cup, _loanId); + } + + /** + * @dev Lets a future upgrade of this module transfer a vault to itself + * @param _wallet The target wallet. + * @param _loanId The ID of the target vault. + */ + function giveVault( + BaseWallet _wallet, + bytes32 _loanId + ) + external + onlyModule(_wallet) + onlyWhenUnlocked(_wallet) + { + verifyLoanOwner(_wallet, _loanId); + cdpManager.give(uint256(_loanId), msg.sender); + clearLoanOwner(_wallet, _loanId); + } + + /* ************************************** Internal Functions ************************************** */ + + function toInt(uint256 _x) internal pure returns (int _y) { + _y = int(_x); + require(_y >= 0, "MV2: int overflow"); + } + + function assignLoanToWallet(BaseWallet _wallet, bytes32 _loanId) internal returns (bytes32 _assignedLoanId) { + bytes32 ilk = cdpManager.ilks(uint256(_loanId)); + // Check if the user already holds a vault in the MakerV2Manager + bytes32 existingLoanId = loanIds[address(_wallet)][ilk]; + if (existingLoanId > 0) { + // Merge the new loan into the existing loan + cdpManager.shift(uint256(_loanId), uint256(existingLoanId)); + return existingLoanId; + } + // Record the new vault as belonging to the wallet + loanIds[address(_wallet)][ilk] = _loanId; + return _loanId; + } + + function clearLoanOwner(BaseWallet _wallet, bytes32 _loanId) internal { + delete loanIds[address(_wallet)][cdpManager.ilks(uint256(_loanId))]; + } + + function verifyLoanOwner(BaseWallet _wallet, bytes32 _loanId) internal view { + require(loanIds[address(_wallet)][cdpManager.ilks(uint256(_loanId))] == _loanId, "MV2: unauthorized loanId"); + } + + function verifySupportedCollateral(address _collateral) internal view { + if (_collateral != ETH_TOKEN_ADDRESS) { + (bool collateralSupported,,,) = makerRegistry.collaterals(_collateral); + require(collateralSupported, "MV2: unsupported collateral"); + } + } + + function buyTokens( + BaseWallet _wallet, + GemLike _token, + uint256 _tokenAmountRequired, + IUniswapExchange _uniswapExchange + ) + internal + { + // get token balance + uint256 tokenBalance = _token.balanceOf(address(_wallet)); + if (tokenBalance < _tokenAmountRequired) { + // Not enough tokens => Convert some ETH into tokens with Uniswap + uint256 etherValueOfTokens = _uniswapExchange.getEthToTokenOutputPrice(_tokenAmountRequired - tokenBalance); + // solium-disable-next-line security/no-block-members + invokeWallet(address(_wallet), address(_uniswapExchange), etherValueOfTokens, abi.encodeWithSignature("ethToTokenSwapOutput(uint256,uint256)", _tokenAmountRequired - tokenBalance, now)); + } + } + + function joinCollateral( + BaseWallet _wallet, + uint256 _cdpId, + uint256 _collateralAmount, + bytes32 _ilk + ) + internal + { + // Get the adapter and collateral token for the vault + (JoinLike gemJoin, GemLike collateral) = makerRegistry.getCollateral(_ilk); + // Convert ETH to WETH if needed + if (gemJoin == wethJoin) { + invokeWallet(address(_wallet), address(wethToken), _collateralAmount, abi.encodeWithSignature("deposit()")); + } + // Send the collateral to the module + invokeWallet( + address(_wallet), + address(collateral), + 0, + abi.encodeWithSignature("transfer(address,uint256)", address(this), _collateralAmount) + ); + // Approve the adapter to pull the collateral from the module + collateral.approve(address(gemJoin), _collateralAmount); + // Join collateral to the adapter. The first argument to `join` is the address that *technically* owns the vault + gemJoin.join(cdpManager.urns(_cdpId), _collateralAmount); + } + + function joinDebt( + BaseWallet _wallet, + uint256 _cdpId, + uint256 _debtAmount // art.mul(rate).div(RAY) === [wad]*[ray]/[ray]=[wad] + ) + internal + { + // Send the DAI to the module + invokeWallet(address(_wallet), address(daiToken), 0, abi.encodeWithSignature("transfer(address,uint256)", address(this), _debtAmount)); + // Approve the DAI adapter to burn DAI from the module + daiToken.approve(address(daiJoin), _debtAmount); + // Join DAI to the adapter. The first argument to `join` is the address that *technically* owns the vault + // To avoid rounding issues, we substract one wei to the amount joined + daiJoin.join(cdpManager.urns(_cdpId), _debtAmount.sub(1)); + } + + function drawAndExitDebt( + BaseWallet _wallet, + uint256 _cdpId, + uint256 _debtAmount, + uint256 _collateralAmount, + bytes32 _ilk + ) + internal + { + // Get the accumulated rate for the collateral type + (, uint rate,,,) = vat.ilks(_ilk); + // Express the debt in the RAD units used internally by the vat + uint daiDebtInRad = _debtAmount.mul(RAY); + // Lock the collateral and draw the debt. To avoid rounding issues we add an extra wei of debt + cdpManager.frob(_cdpId, toInt(_collateralAmount), toInt(daiDebtInRad.div(rate) + 1)); + // Transfer the (internal) DAI debt from the cdp's urn to the module. + cdpManager.move(_cdpId, address(this), daiDebtInRad); + // Mint the DAI token and exit it to the user's wallet + daiJoin.exit(address(_wallet), _debtAmount); + } + + function updateStabilityFee( + uint256 _cdpId + ) + internal + { + jug.drip(cdpManager.ilks(_cdpId)); + } + + function debt( + uint256 _cdpId + ) + internal + view + returns (uint256 _fullRepayment, uint256 _maxNonFullRepayment) + { + bytes32 ilk = cdpManager.ilks(_cdpId); + (, uint256 art) = vat.urns(ilk, cdpManager.urns(_cdpId)); + if (art > 0) { + (, uint rate,,, uint dust) = vat.ilks(ilk); + _maxNonFullRepayment = art.mul(rate).sub(dust).div(RAY); + _fullRepayment = art.mul(rate).div(RAY) + .add(1) // the amount approved is 1 wei more than the amount repaid, to avoid rounding issues + .add(art-art.mul(rate).div(RAY).mul(RAY).div(rate)); // adding 1 extra wei if further rounding issues are expected + } + } + + function collateral( + uint256 _cdpId + ) + internal + view + returns (uint256 _collateralAmount) + { + (_collateralAmount,) = vat.urns(cdpManager.ilks(_cdpId), cdpManager.urns(_cdpId)); + } + + function verifyValidRepayment( + uint256 _cdpId, + uint256 _debtAmount + ) + internal + view + { + (uint256 fullRepayment, uint256 maxRepayment) = debt(_cdpId); + require(_debtAmount <= maxRepayment || _debtAmount == fullRepayment, "MV2: repay less or full"); + } + + /** + * @dev Lets the owner of a wallet open a new vault. The owner must have enough collateral + * in their wallet. + * @param _wallet The target wallet + * @param _collateral The token to use as collateral in the vault. + * @param _collateralAmount The amount of collateral to lock in the vault. + * @param _debtAmount The amount of DAI to draw from the vault + * @return The id of the created vault. + */ + // solium-disable-next-line security/no-assign-params + function openVault( + BaseWallet _wallet, + address _collateral, + uint256 _collateralAmount, + uint256 _debtAmount + ) + internal + returns (uint256 _cdpId) + { + // Continue with WETH as collateral instead of ETH if needed + if (_collateral == ETH_TOKEN_ADDRESS) { + _collateral = address(wethToken); + } + // Get the ilk for the collateral + bytes32 ilk = makerRegistry.getIlk(_collateral); + // Open a vault if there isn't already one for the collateral type (the vault owner will effectively be the module) + _cdpId = uint256(loanIds[address(_wallet)][ilk]); + if (_cdpId == 0) { + _cdpId = cdpManager.open(ilk, address(this)); + // Mark the vault as belonging to the wallet + loanIds[address(_wallet)][ilk] = bytes32(_cdpId); + } + // Move the collateral from the wallet to the vat + joinCollateral(_wallet, _cdpId, _collateralAmount, ilk); + // Draw the debt and exit it to the wallet + if (_debtAmount > 0) { + drawAndExitDebt(_wallet, _cdpId, _debtAmount, _collateralAmount, ilk); + } + } + + /** + * @dev Lets the owner of a vault add more collateral to their vault. The owner must have enough of the + * collateral token in their wallet. + * @param _wallet The target wallet + * @param _cdpId The id of the vault. + * @param _collateralAmount The amount of collateral to add to the vault. + */ + function addCollateral( + BaseWallet _wallet, + uint256 _cdpId, + uint256 _collateralAmount + ) + internal + { + // Move the collateral from the wallet to the vat + joinCollateral(_wallet, _cdpId, _collateralAmount, cdpManager.ilks(_cdpId)); + // Lock the collateral + cdpManager.frob(_cdpId, toInt(_collateralAmount), 0); + } + + /** + * @dev Lets the owner of a vault remove some collateral from their vault + * @param _wallet The target wallet + * @param _cdpId The id of the vault. + * @param _collateralAmount The amount of collateral to remove from the vault. + */ + function removeCollateral( + BaseWallet _wallet, + uint256 _cdpId, + uint256 _collateralAmount + ) + internal + { + // Unlock the collateral + cdpManager.frob(_cdpId, -toInt(_collateralAmount), 0); + // Transfer the (internal) collateral from the cdp's urn to the module. + cdpManager.flux(_cdpId, address(this), _collateralAmount); + // Get the adapter for the collateral + (JoinLike gemJoin,) = makerRegistry.getCollateral(cdpManager.ilks(_cdpId)); + // Exit the collateral from the adapter. + gemJoin.exit(address(_wallet), _collateralAmount); + // Convert WETH to ETH if needed + if (gemJoin == wethJoin) { + invokeWallet(address(_wallet), address(wethToken), 0, abi.encodeWithSignature("withdraw(uint256)", _collateralAmount)); + } + } + + /** + * @dev Lets the owner of a vault draw more DAI from their vault. + * @param _wallet The target wallet + * @param _cdpId The id of the vault. + * @param _amount The amount of additional DAI to draw from the vault. + */ + function addDebt( + BaseWallet _wallet, + uint256 _cdpId, + uint256 _amount + ) + internal + { + // Draw and exit the debt to the wallet + drawAndExitDebt(_wallet, _cdpId, _amount, 0, cdpManager.ilks(_cdpId)); + } + + /** + * @dev Lets the owner of a vault partially repay their debt. The repayment is made up of + * the outstanding DAI debt plus the DAI stability fee. + * The method will use the user's DAI tokens in priority and will, if needed, convert the required + * amount of ETH to cover for any missing DAI tokens. + * @param _wallet The target wallet + * @param _cdpId The id of the vault. + * @param _amount The amount of DAI debt to repay. + */ + function removeDebt( + BaseWallet _wallet, + uint256 _cdpId, + uint256 _amount + ) + internal + { + verifyValidRepayment(_cdpId, _amount); + // Convert some ETH into DAI with Uniswap if necessary + buyTokens(_wallet, daiToken, _amount, daiUniswap); + // Move the DAI from the wallet to the vat. + joinDebt(_wallet, _cdpId, _amount); + // Get the accumulated rate for the collateral type + (, uint rate,,,) = vat.ilks(cdpManager.ilks(_cdpId)); + // Repay the debt. To avoid rounding issues we reduce the repayment by one wei + cdpManager.frob(_cdpId, 0, -toInt(_amount.sub(1).mul(RAY).div(rate))); + } + + /** + * @dev Lets the owner of a vault close their vault. The method will: + * 1) repay all debt and fee + * 2) free all collateral + * @param _wallet The target wallet + * @param _cdpId The id of the CDP. + */ + function closeVault( + BaseWallet _wallet, + uint256 _cdpId + ) + internal + { + (uint256 fullRepayment,) = debt(_cdpId); + // Repay the debt + if (fullRepayment > 0) { + removeDebt(_wallet, _cdpId, fullRepayment); + } + // Remove the collateral + uint256 ink = collateral(_cdpId); + if (ink > 0) { + removeCollateral(_wallet, _cdpId, ink); + } + } + +} \ No newline at end of file diff --git a/contracts/modules/maker/MakerV2Manager.sol b/contracts/modules/maker/MakerV2Manager.sol new file mode 100644 index 000000000..c4c473a56 --- /dev/null +++ b/contracts/modules/maker/MakerV2Manager.sol @@ -0,0 +1,47 @@ +// Copyright (C) 2019 Argent Labs Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; +import "./MakerV2Base.sol"; +import "./MakerV2Invest.sol"; +import "./MakerV2Loan.sol"; + +/** + * @title MakerV2Manager + * @dev Module to lock/unlock MCD DAI into/from Maker's Pot, + * migrate old CDPs and open and manage new CDPs. + * @author Olivier VDB - + */ +contract MakerV2Manager is MakerV2Base, MakerV2Invest, MakerV2Loan { + + // *************** Constructor ********************** // + + constructor( + ModuleRegistry _registry, + GuardianStorage _guardianStorage, + ScdMcdMigrationLike _scdMcdMigration, + PotLike _pot, + JugLike _jug, + MakerRegistry _makerRegistry, + IUniswapFactory _uniswapFactory + ) + MakerV2Base(_registry, _guardianStorage, _scdMcdMigration) + MakerV2Invest(_pot) + MakerV2Loan(_jug, _makerRegistry, _uniswapFactory) + public + { + } + +} \ No newline at end of file diff --git a/contracts/storage/GuardianStorage.sol b/contracts/modules/storage/GuardianStorage.sol similarity index 99% rename from contracts/storage/GuardianStorage.sol rename to contracts/modules/storage/GuardianStorage.sol index c0ea13370..d709a86c8 100644 --- a/contracts/storage/GuardianStorage.sol +++ b/contracts/modules/storage/GuardianStorage.sol @@ -14,7 +14,7 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../wallet/BaseWallet.sol"; +import "../../wallet/BaseWallet.sol"; import "./Storage.sol"; import "./IGuardianStorage.sol"; diff --git a/contracts/storage/IGuardianStorage.sol b/contracts/modules/storage/IGuardianStorage.sol similarity index 97% rename from contracts/storage/IGuardianStorage.sol rename to contracts/modules/storage/IGuardianStorage.sol index d2e66236d..3b6f44ae8 100644 --- a/contracts/storage/IGuardianStorage.sol +++ b/contracts/modules/storage/IGuardianStorage.sol @@ -14,7 +14,7 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../wallet/BaseWallet.sol"; +import "../../wallet/BaseWallet.sol"; interface IGuardianStorage{ diff --git a/contracts/storage/Storage.sol b/contracts/modules/storage/Storage.sol similarity index 96% rename from contracts/storage/Storage.sol rename to contracts/modules/storage/Storage.sol index 19d5675b2..5a449704c 100644 --- a/contracts/storage/Storage.sol +++ b/contracts/modules/storage/Storage.sol @@ -14,7 +14,7 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../wallet/BaseWallet.sol"; +import "../../wallet/BaseWallet.sol"; /** * @title Storage diff --git a/contracts/storage/TransferStorage.sol b/contracts/modules/storage/TransferStorage.sol similarity index 98% rename from contracts/storage/TransferStorage.sol rename to contracts/modules/storage/TransferStorage.sol index ca3467150..eac40c710 100644 --- a/contracts/storage/TransferStorage.sol +++ b/contracts/modules/storage/TransferStorage.sol @@ -14,7 +14,7 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../wallet/BaseWallet.sol"; +import "../../wallet/BaseWallet.sol"; import "./Storage.sol"; /** diff --git a/contracts/storage/DappStorage.sol b/contracts/storage/DappStorage.sol deleted file mode 100644 index f11406575..000000000 --- a/contracts/storage/DappStorage.sol +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2018 Argent Labs Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity ^0.5.4; -import "../wallet/BaseWallet.sol"; -import "./Storage.sol"; - -/** - * @title DappStorage - * @dev Contract storing the state of wallets related to authorised dapps. - * The contract only defines basic setters and getters with no logic. Only modules authorised - * for a wallet can modify its state. - * @author Olivier Van Den Biggelaar - - */ -contract DappStorage is Storage { - - // [wallet][dappkey][contract][signature][bool] - mapping (address => mapping (address => mapping (address => mapping (bytes4 => bool)))) internal whitelistedMethods; - - // *************** External Functions ********************* // - - /** - * @dev (De)authorizes an external contract's methods to be called by a dapp key of the wallet. - * @param _wallet The wallet. - * @param _dapp The address of the signing key. - * @param _contract The contract address. - * @param _signatures The methods' signatures. - * @param _authorized true to whitelist, false to blacklist. - */ - function setMethodAuthorization( - BaseWallet _wallet, - address _dapp, - address _contract, - bytes4[] calldata _signatures, - bool _authorized - ) - external - onlyModule(_wallet) - { - for (uint i = 0; i < _signatures.length; i++) { - whitelistedMethods[address(_wallet)][_dapp][_contract][_signatures[i]] = _authorized; - } - } - - /** - * @dev Gets the authorization status for an external contract's method. - * @param _wallet The wallet. - * @param _dapp The address of the signing key. - * @param _contract The contract address. - * @param _signature The call signature. - * @return true if the method is whitelisted, false otherwise - */ - function getMethodAuthorization(BaseWallet _wallet, address _dapp, address _contract, bytes4 _signature) external view returns (bool) { - return whitelistedMethods[address(_wallet)][_dapp][_contract][_signature]; - } -} \ No newline at end of file diff --git a/contracts/test/argent/utils/ERC20Approver.sol b/contracts/test/ERC20Approver.sol similarity index 79% rename from contracts/test/argent/utils/ERC20Approver.sol rename to contracts/test/ERC20Approver.sol index 535f1ee69..e6089d3f7 100644 --- a/contracts/test/argent/utils/ERC20Approver.sol +++ b/contracts/test/ERC20Approver.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.4; -import "../../../wallet/BaseWallet.sol"; -import "../../../modules/common/BaseModule.sol"; -import "../../../modules/common/OnlyOwnerModule.sol"; +import "../wallet/BaseWallet.sol"; +import "../modules/common/BaseModule.sol"; +import "../modules/common/OnlyOwnerModule.sol"; contract ERC20Approver is BaseModule, OnlyOwnerModule { diff --git a/contracts/test/FakeWallet.sol b/contracts/test/FakeWallet.sol new file mode 100644 index 000000000..a2012f7fe --- /dev/null +++ b/contracts/test/FakeWallet.sol @@ -0,0 +1,61 @@ +// Copyright (C) 2020 Argent Labs Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; +import "../wallet/BaseWallet.sol"; + +/** + * @title FakeWallet + * @dev A fake wallet with an invoke() method that acts maliciously. + * @author Olivier VDB - + */ +contract FakeWallet is BaseWallet { + bool targetIsModule; + address target; + uint value; + bytes data; + constructor(bool _targetIsModule, address _target, uint _value, bytes memory _data) public { + targetIsModule = _targetIsModule; + target = _target; + value = _value; + data = _data; + } + + /** + * @dev Does nothing unless (storage) target is set, in which case, call target. + * @param _target The address for the transaction. + * @param _value The value of the transaction. + * @param _data The data of the transaction. + */ + function invoke(address _target, uint _value, bytes calldata _data) external moduleOnly returns (bytes memory _result) { + if (target != address(0)) { + address prevOwner = owner; + if (targetIsModule) { + // change the owner to itself to enable reentrancy in a module + owner = address(this); + } + // solium-disable-next-line security/no-call-value + (bool success,) = target.call.value(value)(data); + owner = prevOwner; + if (!success) { + // solium-disable-next-line security/no-inline-assembly + assembly { + returndatacopy(0, 0, returndatasize) + revert(0, returndatasize) + } + } + } + } +} \ No newline at end of file diff --git a/contracts/test/KyberNetworkTest.sol b/contracts/test/KyberNetworkTest.sol index 28a82c1eb..d271f7859 100644 --- a/contracts/test/KyberNetworkTest.sol +++ b/contracts/test/KyberNetworkTest.sol @@ -1,6 +1,6 @@ pragma solidity ^0.5.4; -import "../exchange/ERC20.sol"; -import "../exchange/KyberNetwork.sol"; +import "../../lib/other/ERC20.sol"; +import "../../lib/other/KyberNetwork.sol"; import "../../lib/utils/SafeMath.sol"; contract KyberNetworkTest is KyberNetwork { diff --git a/contracts/test/argent/utils/NewTestModule.sol b/contracts/test/NewTestModule.sol similarity index 90% rename from contracts/test/argent/utils/NewTestModule.sol rename to contracts/test/NewTestModule.sol index f3fc3ecb5..0ebfe419c 100644 --- a/contracts/test/argent/utils/NewTestModule.sol +++ b/contracts/test/NewTestModule.sol @@ -1,8 +1,8 @@ pragma solidity ^0.5.4; -import "../../../modules/common/BaseModule.sol"; -import "../../../modules/common/RelayerModule.sol"; -import "../../../modules/common/OnlyOwnerModule.sol"; +import "../modules/common/BaseModule.sol"; +import "../modules/common/RelayerModule.sol"; +import "../modules/common/OnlyOwnerModule.sol"; import "./TestDapp.sol"; /** diff --git a/contracts/test/argent/utils/NonCompliantGuardian.sol b/contracts/test/NonCompliantGuardian.sol similarity index 77% rename from contracts/test/argent/utils/NonCompliantGuardian.sol rename to contracts/test/NonCompliantGuardian.sol index 9e67389f1..74cd7dfeb 100644 --- a/contracts/test/argent/utils/NonCompliantGuardian.sol +++ b/contracts/test/NonCompliantGuardian.sol @@ -2,7 +2,7 @@ pragma solidity ^0.5.4; /** * @title NonCompliantGuardian - * @dev Test contract that consumes more then 5000 gas when its owner() methd is called. + * @dev Test contract that consumes more than 5000 gas when its owner() method is called. * @author Julien Niset - */ contract NonCompliantGuardian { @@ -13,5 +13,4 @@ contract NonCompliantGuardian { } return msg.sender; } - } \ No newline at end of file diff --git a/contracts/test/argent/utils/OldTestModule.sol b/contracts/test/OldTestModule.sol similarity index 86% rename from contracts/test/argent/utils/OldTestModule.sol rename to contracts/test/OldTestModule.sol index 5f94ed99d..0f2b59da0 100644 --- a/contracts/test/argent/utils/OldTestModule.sol +++ b/contracts/test/OldTestModule.sol @@ -1,8 +1,8 @@ pragma solidity ^0.5.4; -import "../../../modules/common/BaseModule.sol"; -import "../../../modules/common/RelayerModule.sol"; -import "../../../modules/common/OnlyOwnerModule.sol"; +import "../modules/common/BaseModule.sol"; +import "../modules/common/RelayerModule.sol"; +import "../modules/common/OnlyOwnerModule.sol"; import "./TestDapp.sol"; import "../legacy/LegacyBaseWallet.sol"; diff --git a/contracts/test/TestContract.sol b/contracts/test/TestContract.sol index c63ab9d7d..17cafcc4c 100644 --- a/contracts/test/TestContract.sol +++ b/contracts/test/TestContract.sol @@ -1,18 +1,23 @@ pragma solidity ^0.5.4; - +import "./TokenConsumer.sol"; import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; /** * @title TestContract - * @dev Represents an arbitrary contract. + * @dev Represents an arbitrary contract. * @author Olivier Vdb - */ contract TestContract { - uint256 public state; + uint256 public state; + TokenConsumer public tokenConsumer; event StateSet(uint256 indexed _state, uint256 indexed _value); + constructor() public { + tokenConsumer = new TokenConsumer(); + } + function setState(uint256 _state) public payable { state = _state; emit StateSet(_state, msg.value); @@ -23,4 +28,12 @@ contract TestContract { state = _state; emit StateSet(_state, _amount); } + + function setStateAndPayTokenWithConsumer(uint256 _state, address _erc20, uint256 _amount) public { + bool success = tokenConsumer.consume(_erc20, msg.sender, address(this), _amount); + if (success) { + state = _state; + emit StateSet(_state, _amount); + } + } } \ No newline at end of file diff --git a/contracts/test/argent/utils/TestDapp.sol b/contracts/test/TestDapp.sol similarity index 100% rename from contracts/test/argent/utils/TestDapp.sol rename to contracts/test/TestDapp.sol diff --git a/contracts/test/TestModule.sol b/contracts/test/TestModule.sol new file mode 100644 index 000000000..1477a6a65 --- /dev/null +++ b/contracts/test/TestModule.sol @@ -0,0 +1,94 @@ +pragma solidity ^0.5.4; +import "../wallet/BaseWallet.sol"; +import "../modules/common/BaseModule.sol"; +import "../modules/common/RelayerModule.sol"; + +/** + * @title TestModule + * @dev Basic test module. + * @author Julien Niset - + */ +contract TestModule is BaseModule, RelayerModule { + + bytes32 constant NAME = "TestModule"; + + bool boolVal; + uint uintVal; + + constructor(ModuleRegistry _registry, bool _boolVal, uint _uintVal) BaseModule(_registry, GuardianStorage(0), NAME) public { + boolVal = _boolVal; + uintVal = _uintVal; + } + + function invalidOwnerChange(BaseWallet _wallet) external { + _wallet.setOwner(address(0)); // this should fail + } + + function setIntOwnerOnly(BaseWallet _wallet, uint _val) external onlyWalletOwner(_wallet) { + uintVal = _val; + } + function clearInt() external { + uintVal = 0; + } + + // used to simulate a bad module in MakerV2Loan tests + function callContract(address _contract, uint256 _value, bytes calldata _data) external { + // solium-disable-next-line security/no-call-value + (bool success,) = _contract.call.value(_value)(_data); + if (!success) { + // solium-disable-next-line security/no-inline-assembly + assembly { + returndatacopy(0, 0, returndatasize) + revert(0, returndatasize) + } + } + } + + function init(BaseWallet _wallet) public onlyWallet(_wallet) { + enableStaticCalls(_wallet, address(this)); + } + + function enableStaticCalls(BaseWallet _wallet, address _module) public { + _wallet.enableStaticCall(_module, bytes4(keccak256("getBoolean()"))); + _wallet.enableStaticCall(_module, bytes4(keccak256("getUint()"))); + _wallet.enableStaticCall(_module, bytes4(keccak256("getAddress(address)"))); + } + + function getBoolean() public view returns (bool) { + return boolVal; + } + + function getUint() public view returns (uint) { + return uintVal; + } + + function getAddress(address _addr) public pure returns (address) { + return _addr; + } + + // *************** Implementation of RelayerModule methods ********************* // + + // Overrides to use the incremental nonce and save some gas + function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 _nonce, bytes32 /* _signHash */) internal returns (bool) { + return checkAndUpdateNonce(_wallet, _nonce); + } + + function validateSignatures( + BaseWallet _wallet, + bytes memory /* _data */, + bytes32 _signHash, + bytes memory _signatures + ) + internal + view + returns (bool) + { + address signer = recoverSigner(_signHash, _signatures, 0); + return isOwner(_wallet, signer); // "GM: signer must be owner" + } + + function getRequiredSignatures(BaseWallet /* _wallet */, bytes memory /*_data */) internal view returns (uint256) { + return 1; + } + +} \ No newline at end of file diff --git a/contracts/test/argent/utils/TestModule.sol b/contracts/test/TestModuleRelayerV2.sol similarity index 53% rename from contracts/test/argent/utils/TestModule.sol rename to contracts/test/TestModuleRelayerV2.sol index edd24d909..1b00c4f73 100644 --- a/contracts/test/argent/utils/TestModule.sol +++ b/contracts/test/TestModuleRelayerV2.sol @@ -1,16 +1,16 @@ pragma solidity ^0.5.4; -import "../../../wallet/BaseWallet.sol"; -import "../../../modules/common/BaseModule.sol"; -import "../../../modules/common/RelayerModule.sol"; +import "../wallet/BaseWallet.sol"; +import "../modules/common/BaseModule.sol"; +import "../modules/common/RelayerModuleV2.sol"; /** * @title TestModule - * @dev Basic test module. - * @author Julien Niset - + * @dev Basic test module subclassing RelayerModuleV2 (otherwise identical to TestModule.sol). + * @author Olivier VDB - */ -contract TestModule is BaseModule, RelayerModule { +contract TestModuleRelayerV2 is BaseModule, RelayerModuleV2 { - bytes32 constant NAME = "TestModule"; + bytes32 constant NAME = "TestModuleRelayerV2"; bool boolVal; uint uintVal; @@ -20,10 +20,25 @@ contract TestModule is BaseModule, RelayerModule { uintVal = _uintVal; } + function invalidOwnerChange(BaseWallet _wallet) external { + _wallet.setOwner(address(0)); // this should fail + } + + function setIntOwnerOnly(BaseWallet _wallet, uint _val) external onlyWalletOwner(_wallet) { + uintVal = _val; + } + function clearInt() external { + uintVal = 0; + } + function init(BaseWallet _wallet) public onlyWallet(_wallet) { - _wallet.enableStaticCall(address(this), bytes4(keccak256("getBoolean()"))); - _wallet.enableStaticCall(address(this), bytes4(keccak256("getUint()"))); - _wallet.enableStaticCall(address(this), bytes4(keccak256("getAddress(address)"))); + enableStaticCalls(_wallet, address(this)); + } + + function enableStaticCalls(BaseWallet _wallet, address _module) public { + _wallet.enableStaticCall(_module, bytes4(keccak256("getBoolean()"))); + _wallet.enableStaticCall(_module, bytes4(keccak256("getUint()"))); + _wallet.enableStaticCall(_module, bytes4(keccak256("getAddress(address)"))); } function getBoolean() public view returns (bool) { @@ -34,7 +49,7 @@ contract TestModule is BaseModule, RelayerModule { return uintVal; } - function getAddress(address _addr) public view returns (address) { + function getAddress(address _addr) public pure returns (address) { return _addr; } @@ -59,7 +74,7 @@ contract TestModule is BaseModule, RelayerModule { return isOwner(_wallet, signer); // "GM: signer must be owner" } - function getRequiredSignatures(BaseWallet /* _wallet */, bytes memory /*_data */) internal view returns (uint256) { + function getRequiredSignatures(BaseWallet /* _wallet */, bytes memory /*_data */) public view returns (uint256) { return 1; } diff --git a/contracts/test/argent/utils/TestOnlyOwnerModule.sol b/contracts/test/TestOnlyOwnerModule.sol similarity index 77% rename from contracts/test/argent/utils/TestOnlyOwnerModule.sol rename to contracts/test/TestOnlyOwnerModule.sol index 419374082..c7c6bbc92 100644 --- a/contracts/test/argent/utils/TestOnlyOwnerModule.sol +++ b/contracts/test/TestOnlyOwnerModule.sol @@ -1,6 +1,6 @@ pragma solidity ^0.5.4; -import "../../../wallet/BaseWallet.sol"; -import "../../../modules/common/OnlyOwnerModule.sol"; +import "../wallet/BaseWallet.sol"; +import "../modules/common/OnlyOwnerModule.sol"; /** * @title TestModule diff --git a/contracts/test/TestRegistry.sol b/contracts/test/TestRegistry.sol new file mode 100644 index 000000000..60dc02301 --- /dev/null +++ b/contracts/test/TestRegistry.sol @@ -0,0 +1,12 @@ +// Source https://github.com/christianlundkvist/simple-multisig/blob/master/contracts/TestRegistry.sol +pragma solidity ^0.5.4; + +// This contract is only used for testing the MultiSigWallet +contract TestRegistry { + + mapping(address => uint) public registry; + + function register(uint x) payable public { + registry[msg.sender] = x; + } +} \ No newline at end of file diff --git a/contracts/test/TestUpgradedMakerV2Manager.sol b/contracts/test/TestUpgradedMakerV2Manager.sol new file mode 100644 index 000000000..61ef97e16 --- /dev/null +++ b/contracts/test/TestUpgradedMakerV2Manager.sol @@ -0,0 +1,50 @@ +pragma solidity ^0.5.4; + +import "../modules/maker/MakerV2Manager.sol"; + +/** + * @title TestUpgradedMakerV2Manager + * @dev Test upgraded MakerV2 module. + * @author Olivier VDB - + */ +contract TestUpgradedMakerV2Manager is MakerV2Manager { + MakerV2Manager private previousMakerV2Manager; + + constructor( + ModuleRegistry _registry, + GuardianStorage _guardianStorage, + ScdMcdMigrationLike _scdMcdMigration, + PotLike _pot, + JugLike _jug, + MakerRegistry _makerRegistry, + IUniswapFactory _uniswapFactory, + MakerV2Manager _previousMakerV2Manager + ) + + MakerV2Manager( + _registry, + _guardianStorage, + _scdMcdMigration, + _pot, + _jug, + _makerRegistry, + _uniswapFactory + ) + public + + { + previousMakerV2Manager = _previousMakerV2Manager; + } + + function init(BaseWallet _wallet) public onlyWallet(_wallet) { + address[] memory tokens = makerRegistry.getCollateralTokens(); + for (uint256 i = 0; i < tokens.length; i++) { + bytes32 loanId = previousMakerV2Manager.loanIds(address(_wallet), makerRegistry.getIlk(tokens[i])); + if (loanId != 0) { + previousMakerV2Manager.giveVault(_wallet, loanId); + assignLoanToWallet(_wallet, loanId); + } + } + } + +} \ No newline at end of file diff --git a/contracts/test/TokenConsumer.sol b/contracts/test/TokenConsumer.sol new file mode 100644 index 000000000..034215143 --- /dev/null +++ b/contracts/test/TokenConsumer.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.5.4; + +import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; + +contract TokenConsumer { + + function consume(address _erc20, address _from, address _to, uint256 _amount) external returns (bool) { + return ERC20(_erc20).transferFrom(_from, _to, _amount); + } +} \ No newline at end of file diff --git a/contracts/test/argent/legacy/TokenTransfer.sol b/contracts/test/argent/legacy/TokenTransfer.sol deleted file mode 100644 index e7367b15e..000000000 --- a/contracts/test/argent/legacy/TokenTransfer.sol +++ /dev/null @@ -1,375 +0,0 @@ -pragma solidity ^0.5.4; -import "../../../wallet/BaseWallet.sol"; -import "../../../modules/common/BaseModule.sol"; -import "../../../modules/common/RelayerModule.sol"; -import "../../../modules/common/LimitManager.sol"; -import "../../../exchange/TokenPriceProvider.sol"; -import "../../../storage/GuardianStorage.sol"; -import "../../../storage/TransferStorage.sol"; - -/** - * @title LegacyTokenTransfer - * @dev Legacy Module to transfer tokens (ETH or ERC20) based on a security context (daily limit, whitelist, etc). - * @author Julien Niset - - */ -contract LegacyTokenTransfer is BaseModule, RelayerModule, LimitManager { - - bytes32 constant NAME = "TokenTransfer"; - - bytes4 constant internal EXECUTE_PENDING_PREFIX = bytes4(keccak256("executePendingTransfer(address,address,address,uint256,bytes,uint256)")); - - bytes constant internal EMPTY_BYTES = ""; - - using SafeMath for uint256; - - // Mock token address for ETH - address constant internal ETH_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - // large limit when the limit can be considered disabled - uint128 constant internal LIMIT_DISABLED = uint128(-1); // 3.40282366920938463463374607431768211455e+38 - - struct TokenTransferConfig { - // Mapping between pending transfer hash and their timestamp - mapping (bytes32 => uint256) pendingTransfers; - } - - // wallet specific storage - mapping (address => TokenTransferConfig) internal configs; - - // The security period - uint256 public securityPeriod; - // The execution window - uint256 public securityWindow; - // The Token storage - TransferStorage public transferStorage; - // The Token price provider - TokenPriceProvider public priceProvider; - - // *************** Events *************************** // - - event Transfer(address indexed wallet, address indexed token, uint256 indexed amount, address to, bytes data); - event AddedToWhitelist(address indexed wallet, address indexed target, uint64 whitelistAfter); - event RemovedFromWhitelist(address indexed wallet, address indexed target); - event PendingTransferCreated(address indexed wallet, bytes32 indexed id, uint256 indexed executeAfter, address token, address to, uint256 amount, bytes data); - event PendingTransferExecuted(address indexed wallet, bytes32 indexed id); - event PendingTransferCanceled(address indexed wallet, bytes32 indexed id); - - // *************** Constructor ********************** // - - constructor( - ModuleRegistry _registry, - TransferStorage _transferStorage, - GuardianStorage _guardianStorage, - address _priceProvider, - uint256 _securityPeriod, - uint256 _securityWindow, - uint256 _defaultLimit - ) - BaseModule(_registry, _guardianStorage, NAME) - LimitManager(_defaultLimit) - public - { - transferStorage = _transferStorage; - priceProvider = TokenPriceProvider(_priceProvider); - securityPeriod = _securityPeriod; - securityWindow = _securityWindow; - } - - // *************** External/Public Functions ********************* // - - /** - * @dev lets the owner transfer tokens (ETH or ERC20) from a wallet. - * @param _wallet The target wallet. - * @param _token The address of the token to transfer. - * @param _to The destination address - * @param _amount The amoutn of token to transfer - * @param _data The data for the transaction - */ - function transferToken( - BaseWallet _wallet, - address _token, - address _to, - uint256 _amount, - bytes calldata _data - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - if(isWhitelisted(_wallet, _to)) { - // eth transfer to whitelist - if(_token == ETH_TOKEN) { - transferETH(_wallet, _to, _amount, _data); - } - // erc20 transfer to whitelist - else { - transferERC20(_wallet, _token, _to, _amount, _data); - } - } - else { - if(_token == ETH_TOKEN) { - // eth transfer under the limit - if (checkAndUpdateDailySpent(_wallet, _amount)) { - transferETH(_wallet, _to, _amount, _data); - } - // eth transfer above the limit - else { - addPendingTransfer(_wallet, ETH_TOKEN, _to, _amount, _data); - } - } - else { - uint256 etherAmount = priceProvider.getEtherValue(_amount, _token); - // erc20 transfer under the limit - if (checkAndUpdateDailySpent(_wallet, etherAmount)) { - transferERC20(_wallet, _token, _to, _amount, _data); - } - // erc20 transfer above the limit - else { - addPendingTransfer(_wallet, _token, _to, _amount, _data); - } - } - } - } - - /** - * @dev Adds an address to the whitelist of a wallet. - * @param _wallet The target wallet. - * @param _target The address to add. - */ - function addToWhitelist( - BaseWallet _wallet, - address _target - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - require(!isWhitelisted(_wallet, _target), "TT: target already whitelisted"); - // solium-disable-next-line security/no-block-members - uint256 whitelistAfter = now.add(securityPeriod); - transferStorage.setWhitelist(_wallet, _target, whitelistAfter); - emit AddedToWhitelist(address(_wallet), _target, uint64(whitelistAfter)); - } - - /** - * @dev Removes an address from the whitelist of a wallet. - * @param _wallet The target wallet. - * @param _target The address to remove. - */ - function removeFromWhitelist( - BaseWallet _wallet, - address _target - ) - external - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - require(isWhitelisted(_wallet, _target), "TT: target not whitelisted"); - transferStorage.setWhitelist(_wallet, _target, 0); - emit RemovedFromWhitelist(address(_wallet), _target); - } - - /** - * @dev Executes a pending transfer for a wallet. - * The destination address is automatically added to the whitelist. - * The method can be called by anyone to enable orchestration. - * @param _wallet The target wallet. - * @param _token The token of the pending transfer. - * @param _to The destination address of the pending transfer. - * @param _amount The amount of token to transfer of the pending transfer. - * @param _block The block at which the pending transfer was created. - */ - function executePendingTransfer( - BaseWallet _wallet, - address _token, - address _to, - uint _amount, - bytes memory _data, - uint _block - ) - public - onlyWhenUnlocked(_wallet) - { - bytes32 id = keccak256(abi.encodePacked(_token, _to, _amount, _data, _block)); - uint executeAfter = configs[address(_wallet)].pendingTransfers[id]; - uint executeBefore = executeAfter.add(securityWindow); - require(executeAfter <= now && now <= executeBefore, "TT: outside of the execution window"); - removePendingTransfer(_wallet, id); - if(_token == ETH_TOKEN) { - transferETH(_wallet, _to, _amount, _data); - } - else { - transferERC20(_wallet, _token, _to, _amount, _data); - } - emit PendingTransferExecuted(address(_wallet), id); - } - - /** - * @dev Cancels a pending transfer for a wallet. - * @param _wallet The target wallet. - * @param _id the pending transfer Id. - */ - function cancelPendingTransfer( - BaseWallet _wallet, - bytes32 _id - ) - public - onlyWalletOwner(_wallet) - onlyWhenUnlocked(_wallet) - { - require(configs[address(_wallet)].pendingTransfers[_id] > 0, "TT: unknown pending transfer"); - removePendingTransfer(_wallet, _id); - emit PendingTransferCanceled(address(_wallet), _id); - } - - /** - * @dev Lets the owner of a wallet change its global limit. - * The limit is expressed in ETH. Changes to the limit take 24 hours. - * @param _wallet The target wallet. - * @param _newLimit The new limit. - */ - function changeLimit(BaseWallet _wallet, uint256 _newLimit) public onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { - changeLimit(_wallet, _newLimit, securityPeriod); - } - - /** - * @dev Convenience method to disable the limit - * The limit is disabled by setting it to an arbitrary large value. - * @param _wallet The target wallet. - */ - function disableLimit(BaseWallet _wallet) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { - changeLimit(_wallet, LIMIT_DISABLED, securityPeriod); - } - - /** - * @dev Checks if an address is whitelisted for a wallet. - * @param _wallet The target wallet. - * @param _target The address. - * @return true if the address is whitelisted. - */ - function isWhitelisted(BaseWallet _wallet, address _target) public view returns (bool _isWhitelisted) { - uint whitelistAfter = transferStorage.getWhitelist(_wallet, _target); - // solium-disable-next-line security/no-block-members - return whitelistAfter > 0 && whitelistAfter < now; - } - - /** - * @dev Gets the info of a pending transfer for a wallet. - * @param _wallet The target wallet. - * @param _id The pending transfer Id. - * @return the epoch time at which the pending transfer can be executed. - */ - function getPendingTransfer(BaseWallet _wallet, bytes32 _id) external view returns (uint64 _executeAfter) { - _executeAfter = uint64(configs[address(_wallet)].pendingTransfers[_id]); - } - - // *************** Internal Functions ********************* // - - /** - * @dev Helper method to transfer ETH for a wallet. - * @param _wallet The target wallet. - * @param _to The recipient. - * @param _value The amount of ETH to transfer - * @param _data The data to *log* with the transfer. - */ - function transferETH(BaseWallet _wallet, address _to, uint256 _value, bytes memory _data) internal { - _wallet.invoke(_to, _value, EMPTY_BYTES); - emit Transfer(address(_wallet), ETH_TOKEN, _value, _to, _data); - } - - /** - * @dev Helper method to transfer ERC20 for a wallet. - * @param _wallet The target wallet. - * @param _token The ERC20 address. - * @param _to The recipient. - * @param _value The amount of token to transfer - * @param _data The data to pass with the trnasfer. - */ - function transferERC20(BaseWallet _wallet, address _token, address _to, uint256 _value, bytes memory _data) internal { - bytes memory methodData = abi.encodeWithSignature("transfer(address,uint256)", _to, _value); - _wallet.invoke(_token, 0, methodData); - emit Transfer(address(_wallet), _token, _value, _to, _data); - } - - /** - * @dev Creates a new pending transfer for a wallet. - * @param _wallet The target wallet. - * @param _token The token for the transfer. - * @param _to The recipient for the transfer. - * @param _amount The amount of token to transfer. - * @param _data The data associated to the transfer. - * @return the identifier for the new pending transfer. - */ - function addPendingTransfer(BaseWallet _wallet, address _token, address _to, uint _amount, bytes memory _data) internal returns (bytes32) { - bytes32 id = keccak256(abi.encodePacked(_token, _to, _amount, _data, block.number)); - uint executeAfter = now.add(securityPeriod); - configs[address(_wallet)].pendingTransfers[id] = executeAfter; - emit PendingTransferCreated(address(_wallet), id, executeAfter, _token, _to, _amount, _data); - } - - /** - * @dev Removes an existing pending transfer. - * @param _wallet The target wallet - * @param _id The id of the transfer to remove. - */ - function removePendingTransfer(BaseWallet _wallet, bytes32 _id) internal { - delete configs[address(_wallet)].pendingTransfers[_id]; - } - - // *************** Implementation of RelayerModule methods ********************* // - - // Overrides refund to add the refund in the daily limit. - function refund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _gasLimit, uint _signatures, address _relayer) internal { - // 21000 (transaction) + 7620 (execution of refund) + 7324 (execution of updateDailySpent) + 672 to log the event + _gasUsed - uint256 amount = 36616 + _gasUsed; - if(_gasPrice > 0 && _signatures > 0 && amount <= _gasLimit) { - if(_gasPrice > tx.gasprice) { - amount = amount * tx.gasprice; - } - else { - amount = amount * _gasPrice; - } - updateDailySpent(_wallet, uint128(getCurrentLimit(_wallet)), amount); - _wallet.invoke(_relayer, amount, ""); - } - } - - // Overrides verifyRefund to add the refund in the daily limit. - function verifyRefund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _signatures) internal view returns (bool) { - if(_gasPrice > 0 && _signatures > 0 && ( - address(_wallet).balance < _gasUsed * _gasPrice - || isWithinDailyLimit(_wallet, getCurrentLimit(_wallet), _gasUsed * _gasPrice) == false - || _wallet.authorised(address(_wallet)) == false - )) - { - return false; - } - return true; - } - - // Overrides to use the incremental nonce and save some gas - function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 _nonce, bytes32 /* _signHash */) internal returns (bool) { - return checkAndUpdateNonce(_wallet, _nonce); - } - - function validateSignatures( - BaseWallet _wallet, - bytes memory /* _data */, - bytes32 _signHash, - bytes memory _signatures - ) - internal - view - returns (bool) - { - address signer = recoverSigner(_signHash, _signatures, 0); - return isOwner(_wallet, signer); // "TT: signer must be owner" - } - - function getRequiredSignatures(BaseWallet /* _wallet */, bytes memory _data) internal view returns (uint256) { - bytes4 methodId = functionPrefix(_data); - if (methodId == EXECUTE_PENDING_PREFIX) { - return 0; - } - return 1; - } -} \ No newline at end of file diff --git a/contracts/test/maker/FaucetUser.sol b/contracts/test/maker/FaucetUser.sol new file mode 100644 index 000000000..05026bfff --- /dev/null +++ b/contracts/test/maker/FaucetUser.sol @@ -0,0 +1,18 @@ +pragma solidity ^0.5.4; + +import "../../../lib/maker/DS/DSToken.sol"; + +contract MakerFaucet { + function gulp(address gem) external; +} + +contract FaucetUser { + constructor(MakerFaucet _faucet, IERC20 _gem) public { + // `gulp` can only be called once by a given account. Hence, + // this wrapper contract is a hack that lets us call `gulp` multiple times + // for the same token recipient. + _faucet.gulp(address(_gem)); + _gem.transfer(msg.sender, _gem.balanceOf(address(this))); + selfdestruct(msg.sender); + } +} \ No newline at end of file diff --git a/contracts/test/maker/MockScdMcdMigration.sol b/contracts/test/maker/MockScdMcdMigration.sol deleted file mode 100644 index 156927c7f..000000000 --- a/contracts/test/maker/MockScdMcdMigration.sol +++ /dev/null @@ -1,34 +0,0 @@ -pragma solidity ^0.5.4; - -contract JoinLike { - function gem() public returns (GemLike) { - return GemLike(address(0)); - } - function dai() public returns (GemLike) { - return GemLike(address(0)); - } - VatLike public vat; -} - -contract VatLike { - -} - -contract GemLike { - -} - -/** - * @title MockScdMcdMigration - * @dev Mock contract needed to deploy the MakerV2Manager contract - */ -contract MockScdMcdMigration { - - JoinLike public saiJoin; - JoinLike public daiJoin; - - constructor () public { - saiJoin = new JoinLike(); - daiJoin = new JoinLike(); - } -} \ No newline at end of file diff --git a/contracts/test/maker/TestCdpManager.sol b/contracts/test/maker/TestCdpManager.sol new file mode 100644 index 000000000..70d3e01f8 --- /dev/null +++ b/contracts/test/maker/TestCdpManager.sol @@ -0,0 +1,13 @@ +pragma solidity ^0.5.4; + +contract TestCdpManager { + function urns(uint) public view returns (address); + function open(bytes32, address) public returns (uint); + function frob(uint, int, int) public; + function give(uint, address) public; + function move(uint, address, uint) public; + function flux(uint, address, uint) public; + mapping (uint => bytes32) public ilks; + + event NewCdp(address indexed usr, address indexed own, uint indexed cdp); +} \ No newline at end of file diff --git a/contracts/test/maker/TestMakerV2Invest.sol b/contracts/test/maker/TestMakerV2Invest.sol new file mode 100644 index 000000000..66fba8080 --- /dev/null +++ b/contracts/test/maker/TestMakerV2Invest.sol @@ -0,0 +1,41 @@ +// Copyright (C) 2019 Argent Labs Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; +import "../../modules/maker/MakerV2Base.sol"; +import "../../modules/maker/MakerV2Invest.sol"; + +/** + * @title TestMakerV2Invest + * @dev Module to test MakerV2Invest on its own + * @author Olivier VDB - + */ +contract TestMakerV2Invest is MakerV2Base, MakerV2Invest { + + // *************** Constructor ********************** // + + constructor( + ModuleRegistry _registry, + GuardianStorage _guardianStorage, + ScdMcdMigrationLike _scdMcdMigration, + PotLike _pot + ) + MakerV2Base(_registry, _guardianStorage, _scdMcdMigration) + MakerV2Invest(_pot) + public + { + } + +} \ No newline at end of file diff --git a/contracts/upgrade/Legacy/LegacySimpleUpgrader.sol b/contracts/upgrade/Legacy/LegacySimpleUpgrader.sol deleted file mode 100644 index 79107ad4d..000000000 --- a/contracts/upgrade/Legacy/LegacySimpleUpgrader.sol +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2018 Argent Labs Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity ^0.5.4; - -import "./LegacyUpgrader.sol"; -import "../../wallet/BaseWallet.sol"; - -/** - * @title LegacySimpleUpgrader - * @dev Old implementation for the Upgrader interface that added/removed modules. - * @author Julien Niset - - */ -contract LegacySimpleUpgrader is LegacyUpgrader { - - address[] private disable; - address[] private enable; - - constructor(address[] memory _disable, address[] memory _enable) public { - disable = _disable; - enable = _enable; - } - - function upgrade(address payable _wallet, address[] calldata _toDisable, address[] calldata _toEnable) external { - uint256 i = 0; - //add new modules - for (i = 0; i < _toEnable.length; i++) { - BaseWallet(_wallet).authoriseModule(_toEnable[i], true); - } - //remove old modules - for (i = 0; i < _toDisable.length; i++) { - BaseWallet(_wallet).authoriseModule(_toDisable[i], false); - } - } - - function toDisable() external view returns (address[] memory) { - return disable; - } - - function toEnable() external view returns (address[] memory) { - return enable; - } -} \ No newline at end of file diff --git a/contracts/upgrade/Legacy/LegacyUpgrader.sol b/contracts/upgrade/Legacy/LegacyUpgrader.sol deleted file mode 100644 index a25011018..000000000 --- a/contracts/upgrade/Legacy/LegacyUpgrader.sol +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2018 Argent Labs Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity ^0.5.4; - -/** - * @title Legacy Upgrader - * @dev Old Interface for a contract that could upgrade wallets by enabling/disabling modules. - * @author Julien Niset - - */ -interface LegacyUpgrader { - - /** - * @dev Upgrades a wallet by enabling/disabling modules. - * @param _wallet The owner. - */ - function upgrade(address payable _wallet, address[] calldata _toDisable, address[] calldata _toEnable) external; - - function toDisable() external view returns (address[] memory); - function toEnable() external view returns (address[] memory); -} \ No newline at end of file diff --git a/contracts/wallet/BaseWallet.sol b/contracts/wallet/BaseWallet.sol index e2146ec83..42797fdc1 100644 --- a/contracts/wallet/BaseWallet.sol +++ b/contracts/wallet/BaseWallet.sol @@ -14,7 +14,7 @@ // along with this program. If not, see . pragma solidity ^0.5.4; -import "../interfaces/Module.sol"; +import "../modules/common/Module.sol"; /** * @title BaseWallet diff --git a/deployment/1_setup_test_environment.js b/deployment/1_setup_test_environment.js index 45a61e287..3e9222fa7 100644 --- a/deployment/1_setup_test_environment.js +++ b/deployment/1_setup_test_environment.js @@ -1,85 +1,105 @@ -const ENSRegistry = require('../build/ENSRegistry'); -const ENSRegistryWithFallback = require('../build/ENSRegistryWithFallback'); -const Kyber = require('../build/KyberNetworkTest'); -const ERC20 = require('../build/TestERC20'); -const MakerMigration = require('../build/MockScdMcdMigration'); - -const utils = require('../utils/utilities.js'); -const DeployManager = require('../utils/deploy-manager.js'); - -const TEST_ERC20_SUPPLY = 1000000000; //10**9 +const ENSRegistry = require("../build/ENSRegistry"); +const ENSRegistryWithFallback = require("../build/ENSRegistryWithFallback"); +const Kyber = require("../build/KyberNetworkTest"); +const ERC20 = require("../build/TestERC20"); +const UniswapFactory = require("../lib/uniswap/UniswapFactory"); +const UniswapExchange = require("../lib/uniswap/UniswapExchange"); +const MakerMigration = require("../build/MockScdMcdMigration"); + +const utils = require("../utils/utilities.js"); +const DeployManager = require("../utils/deploy-manager.js"); + +const TEST_ERC20_SUPPLY = 1000000000; // 10**9 const TEST_ERC20_DECIMALS = 10; -const TEST_ERC20_RATE = 6 * 10**14; // 1 AGT = 0.0006 ETH +const TEST_ERC20_RATE = 6 * 10 ** 14; // 1 AGT = 0.0006 ETH -const BYTES32_NULL = '0x0000000000000000000000000000000000000000000000000000000000000000'; +const BYTES32_NULL = "0x0000000000000000000000000000000000000000000000000000000000000000"; // For development purpose async function deployENSRegistry(deployer, owner, domain) { - // Deploy the public ENS registry - const ensRegistryWithoutFallback = await deployer.deploy(ENSRegistry); - const ENSWrapper = await deployer.deploy(ENSRegistryWithFallback, {}, ensRegistryWithoutFallback.contractAddress); + const { gasPrice } = deployer.defaultOverrides; + // Deploy the public ENS registry + const ensRegistryWithoutFallback = await deployer.deploy(ENSRegistry); + const ENSWrapper = await deployer.deploy(ENSRegistryWithFallback, {}, ensRegistryWithoutFallback.contractAddress); - // ENS domain - const parts = domain.split('.'); - const extension = parts[1]; - const domainName = parts[0]; + // ENS domain + const parts = domain.split("."); + const extension = parts[1]; + const domainName = parts[0]; - // Create the 'eth' and 'xyz' namespaces - const setSubnodeOwnerXYZ = await ENSWrapper.contract.setSubnodeOwner(BYTES32_NULL, utils.sha3(extension), owner); - await ENSWrapper.verboseWaitForTransaction(setSubnodeOwnerXYZ, `Setting Subnode Owner for ${extension}`); + // Create the 'eth' and 'xyz' namespaces + const setSubnodeOwnerXYZ = await ENSWrapper.contract.setSubnodeOwner(BYTES32_NULL, utils.sha3(extension), owner, { gasPrice }); + await ENSWrapper.verboseWaitForTransaction(setSubnodeOwnerXYZ, `Setting Subnode Owner for ${extension}`); - // Create the 'argentx.xyz' wallet ENS namespace - const setSubnodeOwnerArgent = await ENSWrapper.contract.setSubnodeOwner(utils.namehash(extension), utils.sha3(domainName), owner); - await ENSWrapper.verboseWaitForTransaction(setSubnodeOwnerArgent, `Setting Subnode Owner for ${domainName}.${extension}`); + // Create the 'argentx.xyz' wallet ENS namespace + const setSubnodeOwnerArgent = await ENSWrapper.contract.setSubnodeOwner(utils.namehash(extension), utils.sha3(domainName), owner, { gasPrice }); + await ENSWrapper.verboseWaitForTransaction(setSubnodeOwnerArgent, `Setting Subnode Owner for ${domainName}.${extension}`); - return ENSWrapper.contractAddress; + return ENSWrapper.contractAddress; } // For development purpose async function deployKyber(deployer) { - const KyberWrapper = await deployer.deploy(Kyber); - const ERC20Wrapper = await deployer.deploy(ERC20, {}, [KyberWrapper.contractAddress], TEST_ERC20_SUPPLY, TEST_ERC20_DECIMALS); + const { gasPrice } = deployer.defaultOverrides; + const KyberWrapper = await deployer.deploy(Kyber); + const ERC20Wrapper = await deployer.deploy(ERC20, {}, [KyberWrapper.contractAddress], TEST_ERC20_SUPPLY, TEST_ERC20_DECIMALS); - const addToken = await KyberWrapper.contract.addToken(ERC20Wrapper.contractAddress, TEST_ERC20_RATE, TEST_ERC20_DECIMALS); - await KyberWrapper.verboseWaitForTransaction(addToken, 'Add test token to Kyber'); + const addToken = await KyberWrapper.contract.addToken(ERC20Wrapper.contractAddress, TEST_ERC20_RATE, TEST_ERC20_DECIMALS, { gasPrice }); + await KyberWrapper.verboseWaitForTransaction(addToken, "Add test token to Kyber"); - return KyberWrapper.contractAddress; + return KyberWrapper.contractAddress; } -const deploy = async (network, secret) => { - - const manager = new DeployManager(network); - await manager.setup(); - - const configurator = manager.configurator; - const deployer = manager.deployer; - - const config = configurator.config; - - const deploymentAccount = await deployer.signer.getAddress(); - - if (config.ENS.deployOwnRegistry) { - // on some testnets, we use our own ENSRegistry - const address = await deployENSRegistry(deployer, deploymentAccount, config.ENS.domain); - configurator.updateENSRegistry(address); - } - - if (config.Kyber.deployOwn) { - // Deploy Kyber Network if needed - const address = await deployKyber(deployer); - configurator.updateKyberContract(address); - } - - if (config.defi.maker.deployOwn) { - // Deploy Maker's mock Migration contract if needed - const MakerMigrationWrapper = await deployer.deploy(MakerMigration); - configurator.updateMakerMigration(MakerMigrationWrapper.contractAddress); - } - - // save configuration - await configurator.save(); +const deploy = async (network) => { + const manager = new DeployManager(network); + await manager.setup(); + + const { configurator } = manager; + const { deployer } = manager; + const { gasPrice } = deployer.defaultOverrides; + + const { config } = configurator; + + const deploymentAccount = await deployer.signer.getAddress(); + + if (config.ENS.deployOwnRegistry) { + // on some testnets, we use our own ENSRegistry + const address = await deployENSRegistry(deployer, deploymentAccount, config.ENS.domain); + configurator.updateENSRegistry(address); + } + + if (config.Kyber.deployOwn) { + // Deploy Kyber Network if needed + const address = await deployKyber(deployer); + configurator.updateKyberContract(address); + } + + if (config.defi.uniswap.deployOwn) { + const UniswapFactoryWrapper = await deployer.deploy(UniswapFactory); + configurator.updateUniswapFactory(UniswapFactoryWrapper.contractAddress); + const UniswapExchangeTemplateWrapper = await deployer.deploy(UniswapExchange); + const initializeFactoryTx = await UniswapFactoryWrapper.contract.initializeFactory(UniswapExchangeTemplateWrapper.contractAddress, { gasPrice }); + await UniswapFactoryWrapper.verboseWaitForTransaction(initializeFactoryTx, "Initializing UniswapFactory"); + } + + if (config.defi.maker.deployOwn) { + // Deploy Maker's mock Migration contract if needed + const MakerMigrationWrapper = await deployer.deploy( + MakerMigration, + {}, + config.defi.maker.vat || "0x0000000000000000000000000000000000000000", + config.defi.maker.daiJoin || "0x0000000000000000000000000000000000000000", + config.defi.maker.wethJoin || "0x0000000000000000000000000000000000000000", + config.defi.maker.tub || "0x0000000000000000000000000000000000000000", + config.defi.maker.cdpManager || "0x0000000000000000000000000000000000000000", + ); + configurator.updateMakerMigration(MakerMigrationWrapper.contractAddress); + } + + // save configuration + await configurator.save(); }; module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/deployment/2_deploy_contracts.js b/deployment/2_deploy_contracts.js index 56e9ae067..a6b2946ac 100644 --- a/deployment/2_deploy_contracts.js +++ b/deployment/2_deploy_contracts.js @@ -1,124 +1,128 @@ -const BaseWallet = require('../build/BaseWallet'); -const ModuleRegistry = require('../build/ModuleRegistry'); -const CompoundRegistry = require('../build/CompoundRegistry'); -const MultiSig = require('../build/MultiSigWallet'); -const ENS = require('../build/ENSRegistryWithFallback'); -const ENSManager = require('../build/ArgentENSManager'); -const ENSResolver = require('../build/ArgentENSResolver'); -const WalletFactory = require('../build/WalletFactory'); +const BaseWallet = require("../build/BaseWallet"); +const ModuleRegistry = require("../build/ModuleRegistry"); +const CompoundRegistry = require("../build/CompoundRegistry"); +const MultiSig = require("../build/MultiSigWallet"); +const ENS = require("../build/ENSRegistryWithFallback"); +const ENSManager = require("../build/ArgentENSManager"); +const ENSResolver = require("../build/ArgentENSResolver"); +const WalletFactory = require("../build/WalletFactory"); const TokenPriceProvider = require("../build/TokenPriceProvider"); -const utils = require('../utils/utilities.js'); - -const DeployManager = require('../utils/deploy-manager.js'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); - -const deploy = async (network, secret) => { - - //////////////////////////////////// - // Setup - //////////////////////////////////// - - const manager = new DeployManager(network); - await manager.setup(); - - const configurator = manager.configurator; - const deployer = manager.deployer; - const abiUploader = manager.abiUploader; - - const newConfig = configurator.config; - const prevConfig = configurator.copyConfig(); - console.log('Previous Config:', prevConfig); - - const deploymentWallet = deployer.signer; - const deploymentAccount = await deploymentWallet.getAddress(); - const walletRootEns = prevConfig.ENS.domain; - - //////////////////////////////////// - // Deploy contracts - //////////////////////////////////// - - // Deploy the Base Wallet Library - const BaseWalletWrapper = await deployer.deploy(BaseWallet); - // Deploy the MultiSig - const MultiSigWrapper = await deployer.deploy(MultiSig, {}, newConfig.multisig.threshold, newConfig.multisig.owners); - // Deploy TokenPriceProvider - const TokenPriceProviderWrapper = await deployer.deploy(TokenPriceProvider, {}, newConfig.Kyber.contract); - // Deploy Module Registry - const ModuleRegistryWrapper = await deployer.deploy(ModuleRegistry); - // Deploy Compound Registry - const CompoundRegistryWrapper = await deployer.deploy(CompoundRegistry); - // Deploy the ENS Resolver - const ENSResolverWrapper = await deployer.deploy(ENSResolver); - // Deploy the ENS Manager - const ENSManagerWrapper = await deployer.deploy(ENSManager, {}, walletRootEns, utils.namehash(walletRootEns), newConfig.ENS.ensRegistry, ENSResolverWrapper.contractAddress); - // Deploy the Wallet Factory - const WalletFactoryWrapper = await deployer.deploy(WalletFactory, {}, ModuleRegistryWrapper.contractAddress, BaseWalletWrapper.contractAddress, ENSManagerWrapper.contractAddress); - - /////////////////////////////////////////////////// - // Making ENSManager owner of the root wallet ENS - /////////////////////////////////////////////////// - - const ENSRegistryWrapper = deployer.wrapDeployedContract(ENS, newConfig.ENS.ensRegistry); - - // Get the address of the previous owner of the root wallet ENS (e.g. argent.xyz) - const previousWalletEnsOwner = await ENSRegistryWrapper.contract.owner(utils.namehash(walletRootEns)); - - if (previousWalletEnsOwner.toLowerCase() === deploymentAccount.toLowerCase()) { - // newly registered name -> change its owner from deploymentAccount to ENSManager address - const setOwnerTransaction = await ENSRegistryWrapper.contract.setOwner(utils.namehash(walletRootEns), ENSManagerWrapper.contractAddress); - await ENSRegistryWrapper.verboseWaitForTransaction(setOwnerTransaction, 'Replace deployment account by ENSManager as new owner of walletENS'); - } else if (previousWalletEnsOwner.toLowerCase() === prevConfig.contracts.ENSManager.toLowerCase()) { - // change the owner from the previous ENSManager.address to the new one - console.log('change the owner from the previous ENSManager to the new one'); - const previousMultiSigWrapper = deployer.wrapDeployedContract(MultiSig, prevConfig.contracts.MultiSigWallet); - const previousENSManagerWrapper = deployer.wrapDeployedContract(ENSManager, prevConfig.contracts.ENSManager); - - const multisigExecutor = new MultisigExecutor(previousMultiSigWrapper, deploymentWallet, prevConfig.multisig.autosign); - console.log(`Owner of ${walletRootEns} changed from old ENSManager to new ENSManager...`) - await multisigExecutor.executeCall(previousENSManagerWrapper, "changeRootnodeOwner", [ENSManagerWrapper.contractAddress]); - } else { - throw new Error(`Ownership of ${walletRootEns} not changed`); - } - - /////////////////////////////////////////////////// - // Add token to the Compound Registry - /////////////////////////////////////////////////// - - for (let underlying in newConfig.defi.compound.markets) { - const cToken = newConfig.defi.compound.markets[underlying]; - const addUnderlyingTransaction = await CompoundRegistryWrapper.addCToken(underlying, cToken); - await CompoundRegistryWrapper.verboseWaitForTransaction(addUnderlyingTransaction, `Adding unerlying ${underlying} with cToken ${cToken} to the registry`); - } - - /////////////////////////////////////////////////// - // Update config and Upload ABIs - /////////////////////////////////////////////////// - - configurator.updateInfrastructureAddresses({ - MultiSigWallet: MultiSigWrapper.contractAddress, - WalletFactory: WalletFactoryWrapper.contractAddress, - ENSResolver: ENSResolverWrapper.contractAddress, - ENSManager: ENSManagerWrapper.contractAddress, - TokenPriceProvider: TokenPriceProviderWrapper.contractAddress, - ModuleRegistry: ModuleRegistryWrapper.contractAddress, - CompoundRegistry: CompoundRegistryWrapper.contractAddress, - BaseWallet: BaseWalletWrapper.contractAddress - }); - await configurator.save(); - - await Promise.all([ - abiUploader.upload(MultiSigWrapper, "contracts"), - abiUploader.upload(WalletFactoryWrapper, "contracts"), - abiUploader.upload(ENSResolverWrapper, "contracts"), - abiUploader.upload(ENSManagerWrapper, "contracts"), - abiUploader.upload(TokenPriceProviderWrapper, "contracts"), - abiUploader.upload(ModuleRegistryWrapper, "contracts"), - abiUploader.upload(CompoundRegistryWrapper, "contracts"), - abiUploader.upload(BaseWalletWrapper, "contracts") - ]); +const utils = require("../utils/utilities.js"); + +const DeployManager = require("../utils/deploy-manager.js"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); + +const deploy = async (network) => { + // ////////////////////////////////// + // Setup + // ////////////////////////////////// + + const manager = new DeployManager(network); + await manager.setup(); + + const { configurator } = manager; + const { deployer } = manager; + const { abiUploader } = manager; + const { gasPrice } = deployer.defaultOverrides; + + const newConfig = configurator.config; + const prevConfig = configurator.copyConfig(); + console.log("Previous Config:", prevConfig); + + const deploymentWallet = deployer.signer; + const deploymentAccount = await deploymentWallet.getAddress(); + const walletRootEns = prevConfig.ENS.domain; + + // ////////////////////////////////// + // Deploy contracts + // ////////////////////////////////// + + // Deploy the Base Wallet Library + const BaseWalletWrapper = await deployer.deploy(BaseWallet); + // Deploy the MultiSig + const MultiSigWrapper = await deployer.deploy(MultiSig, {}, newConfig.multisig.threshold, newConfig.multisig.owners); + // Deploy TokenPriceProvider + const TokenPriceProviderWrapper = await deployer.deploy(TokenPriceProvider, {}, newConfig.Kyber.contract); + // Deploy Module Registry + const ModuleRegistryWrapper = await deployer.deploy(ModuleRegistry); + // Deploy Compound Registry + const CompoundRegistryWrapper = await deployer.deploy(CompoundRegistry); + // Deploy the ENS Resolver + const ENSResolverWrapper = await deployer.deploy(ENSResolver); + // Deploy the ENS Manager + const ENSManagerWrapper = await deployer.deploy(ENSManager, {}, + walletRootEns, utils.namehash(walletRootEns), newConfig.ENS.ensRegistry, ENSResolverWrapper.contractAddress); + // Deploy the Wallet Factory + const WalletFactoryWrapper = await deployer.deploy(WalletFactory, {}, + ModuleRegistryWrapper.contractAddress, BaseWalletWrapper.contractAddress, ENSManagerWrapper.contractAddress); + + // ///////////////////////////////////////////////// + // Making ENSManager owner of the root wallet ENS + // ///////////////////////////////////////////////// + + const ENSRegistryWrapper = deployer.wrapDeployedContract(ENS, newConfig.ENS.ensRegistry); + + // Get the address of the previous owner of the root wallet ENS (e.g. argent.xyz) + const previousWalletEnsOwner = await ENSRegistryWrapper.contract.owner(utils.namehash(walletRootEns)); + + if (previousWalletEnsOwner.toLowerCase() === deploymentAccount.toLowerCase()) { + // newly registered name -> change its owner from deploymentAccount to ENSManager address + const setOwnerTransaction = await ENSRegistryWrapper.contract.setOwner(utils.namehash(walletRootEns), ENSManagerWrapper.contractAddress, + { gasPrice }); + await ENSRegistryWrapper.verboseWaitForTransaction(setOwnerTransaction, "Replace deployment account by ENSManager as new owner of walletENS"); + } else if (previousWalletEnsOwner.toLowerCase() === prevConfig.contracts.ENSManager.toLowerCase()) { + // change the owner from the previous ENSManager.address to the new one + console.log("change the owner from the previous ENSManager to the new one"); + const previousMultiSigWrapper = deployer.wrapDeployedContract(MultiSig, prevConfig.contracts.MultiSigWallet); + const previousENSManagerWrapper = deployer.wrapDeployedContract(ENSManager, prevConfig.contracts.ENSManager); + + const multisigExecutor = new MultisigExecutor(previousMultiSigWrapper, deploymentWallet, prevConfig.multisig.autosign, { gasPrice }); + console.log(`Owner of ${walletRootEns} changed from old ENSManager to new ENSManager...`); + await multisigExecutor.executeCall(previousENSManagerWrapper, "changeRootnodeOwner", [ENSManagerWrapper.contractAddress]); + } else { + throw new Error(`Ownership of ${walletRootEns} not changed`); + } + + // ///////////////////////////////////////////////// + // Add token to the Compound Registry + // ///////////////////////////////////////////////// + + for (const underlying in newConfig.defi.compound.markets) { + const cToken = newConfig.defi.compound.markets[underlying]; + const addUnderlyingTransaction = await CompoundRegistryWrapper.contract.addCToken(underlying, cToken, { gasPrice }); + await CompoundRegistryWrapper.verboseWaitForTransaction(addUnderlyingTransaction, + `Adding unerlying ${underlying} with cToken ${cToken} to the registry`); + } + + // ///////////////////////////////////////////////// + // Update config and Upload ABIs + // ///////////////////////////////////////////////// + + configurator.updateInfrastructureAddresses({ + MultiSigWallet: MultiSigWrapper.contractAddress, + WalletFactory: WalletFactoryWrapper.contractAddress, + ENSResolver: ENSResolverWrapper.contractAddress, + ENSManager: ENSManagerWrapper.contractAddress, + TokenPriceProvider: TokenPriceProviderWrapper.contractAddress, + ModuleRegistry: ModuleRegistryWrapper.contractAddress, + CompoundRegistry: CompoundRegistryWrapper.contractAddress, + BaseWallet: BaseWalletWrapper.contractAddress, + }); + await configurator.save(); + + await Promise.all([ + abiUploader.upload(MultiSigWrapper, "contracts"), + abiUploader.upload(WalletFactoryWrapper, "contracts"), + abiUploader.upload(ENSResolverWrapper, "contracts"), + abiUploader.upload(ENSManagerWrapper, "contracts"), + abiUploader.upload(TokenPriceProviderWrapper, "contracts"), + abiUploader.upload(ModuleRegistryWrapper, "contracts"), + abiUploader.upload(CompoundRegistryWrapper, "contracts"), + abiUploader.upload(BaseWalletWrapper, "contracts"), + ]); }; module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/deployment/3_setup_contracts.js b/deployment/3_setup_contracts.js index 876e841fc..8ec384bf6 100644 --- a/deployment/3_setup_contracts.js +++ b/deployment/3_setup_contracts.js @@ -1,68 +1,69 @@ -const ModuleRegistry = require('../build/ModuleRegistry'); -const ENSManager = require('../build/ArgentENSManager'); -const ENSResolver = require('../build/ArgentENSResolver'); -const WalletFactory = require('../build/WalletFactory'); -const TokenPriceProvider = require('../build/TokenPriceProvider'); -const CompoundRegistry = require('../build/CompoundRegistry'); - -const DeployManager = require('../utils/deploy-manager.js'); - -const deploy = async (network, secret) => { - - //////////////////////////////////// - // Setup - //////////////////////////////////// - - const manager = new DeployManager(network); - await manager.setup(); - - const configurator = manager.configurator; - const deployer = manager.deployer; - - const config = configurator.config; - console.log('Config:', config); - - const ENSResolverWrapper = await deployer.wrapDeployedContract(ENSResolver, config.contracts.ENSResolver); - const ENSManagerWrapper = await deployer.wrapDeployedContract(ENSManager, config.contracts.ENSManager); - const WalletFactoryWrapper = await deployer.wrapDeployedContract(WalletFactory, config.contracts.WalletFactory); - const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); - const CompoundRegistryWrapper = await deployer.wrapDeployedContract(CompoundRegistry, config.contracts.CompoundRegistry); - const TokenPriceProviderWrapper = await deployer.wrapDeployedContract(TokenPriceProvider, config.contracts.TokenPriceProvider); - - //////////////////////////////////// - // Set contracts' managers - //////////////////////////////////// - - const ENSResolverAddManagerTx1 = await ENSResolverWrapper.contract.addManager(config.contracts.ENSManager); - await ENSResolverWrapper.verboseWaitForTransaction(ENSResolverAddManagerTx1, 'Set the ENS Manager as the manager of the ENS Resolver'); - - const ENSResolverAddManagerTx2 = await ENSResolverWrapper.contract.addManager(config.contracts.MultiSigWallet); - await ENSResolverWrapper.verboseWaitForTransaction(ENSResolverAddManagerTx2, 'Set the Multisig as the manager of the ENS Resolver'); - - const ENSManagerAddManagerTx = await ENSManagerWrapper.contract.addManager(config.contracts.WalletFactory); - await ENSManagerWrapper.verboseWaitForTransaction(ENSManagerAddManagerTx, 'Set the WalletFactory as the manager of the ENS Manager'); - - for (idx in config.backend.accounts) { - let account = config.backend.accounts[idx]; - const WalletFactoryAddManagerTx = await WalletFactoryWrapper.contract.addManager(account); - await WalletFactoryWrapper.verboseWaitForTransaction(WalletFactoryAddManagerTx, `Set ${account} as the manager of the WalletFactory`); - - const TokenPriceProviderAddManagerTx = await TokenPriceProviderWrapper.contract.addManager(account); - await TokenPriceProviderWrapper.verboseWaitForTransaction(TokenPriceProviderAddManagerTx, `Set ${account} as the manager of the TokenPriceProvider`); - } - - //////////////////////////////////// - // Set contracts' owners - //////////////////////////////////// - - const wrappers = [ENSResolverWrapper, ENSManagerWrapper, WalletFactoryWrapper, ModuleRegistryWrapper, CompoundRegistryWrapper]; - for (let idx = 0; idx < wrappers.length; idx++) { - let wrapper = wrappers[idx]; - const changeOwnerTx = await wrapper.contract.changeOwner(config.contracts.MultiSigWallet); - await wrapper.verboseWaitForTransaction(changeOwnerTx, `Set the MultiSig as the owner of ${wrapper._contract.contractName}`); - } +const ModuleRegistry = require("../build/ModuleRegistry"); +const ENSManager = require("../build/ArgentENSManager"); +const ENSResolver = require("../build/ArgentENSResolver"); +const WalletFactory = require("../build/WalletFactory"); +const TokenPriceProvider = require("../build/TokenPriceProvider"); +const CompoundRegistry = require("../build/CompoundRegistry"); + +const DeployManager = require("../utils/deploy-manager.js"); + +const deploy = async (network) => { + // ////////////////////////////////// + // Setup + // ////////////////////////////////// + + const manager = new DeployManager(network); + await manager.setup(); + + const { configurator } = manager; + const { deployer } = manager; + const { gasPrice } = deployer.defaultOverrides; + + const { config } = configurator; + console.log("Config:", config); + + const ENSResolverWrapper = await deployer.wrapDeployedContract(ENSResolver, config.contracts.ENSResolver); + const ENSManagerWrapper = await deployer.wrapDeployedContract(ENSManager, config.contracts.ENSManager); + const WalletFactoryWrapper = await deployer.wrapDeployedContract(WalletFactory, config.contracts.WalletFactory); + const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + const CompoundRegistryWrapper = await deployer.wrapDeployedContract(CompoundRegistry, config.contracts.CompoundRegistry); + const TokenPriceProviderWrapper = await deployer.wrapDeployedContract(TokenPriceProvider, config.contracts.TokenPriceProvider); + + // ////////////////////////////////// + // Set contracts' managers + // ////////////////////////////////// + + const ENSResolverAddManagerTx1 = await ENSResolverWrapper.contract.addManager(config.contracts.ENSManager, { gasPrice }); + await ENSResolverWrapper.verboseWaitForTransaction(ENSResolverAddManagerTx1, "Set the ENS Manager as the manager of the ENS Resolver"); + + const ENSResolverAddManagerTx2 = await ENSResolverWrapper.contract.addManager(config.contracts.MultiSigWallet, { gasPrice }); + await ENSResolverWrapper.verboseWaitForTransaction(ENSResolverAddManagerTx2, "Set the Multisig as the manager of the ENS Resolver"); + + const ENSManagerAddManagerTx = await ENSManagerWrapper.contract.addManager(config.contracts.WalletFactory, { gasPrice }); + await ENSManagerWrapper.verboseWaitForTransaction(ENSManagerAddManagerTx, "Set the WalletFactory as the manager of the ENS Manager"); + + for (const idx in config.backend.accounts) { + const account = config.backend.accounts[idx]; + const WalletFactoryAddManagerTx = await WalletFactoryWrapper.contract.addManager(account, { gasPrice }); + await WalletFactoryWrapper.verboseWaitForTransaction(WalletFactoryAddManagerTx, `Set ${account} as the manager of the WalletFactory`); + + const TokenPriceProviderAddManagerTx = await TokenPriceProviderWrapper.contract.addManager(account, { gasPrice }); + await TokenPriceProviderWrapper.verboseWaitForTransaction(TokenPriceProviderAddManagerTx, + `Set ${account} as the manager of the TokenPriceProvider`); + } + + // ////////////////////////////////// + // Set contracts' owners + // ////////////////////////////////// + + const wrappers = [ENSResolverWrapper, ENSManagerWrapper, WalletFactoryWrapper, ModuleRegistryWrapper, CompoundRegistryWrapper]; + for (let idx = 0; idx < wrappers.length; idx += 1) { + const wrapper = wrappers[idx]; + const changeOwnerTx = await wrapper.contract.changeOwner(config.contracts.MultiSigWallet, { gasPrice }); + await wrapper.verboseWaitForTransaction(changeOwnerTx, `Set the MultiSig as the owner of ${wrapper._contract.contractName}`); + } }; module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/deployment/4_finalise_test_environment.js b/deployment/4_finalise_test_environment.js index bb33d465f..3b2f419c7 100644 --- a/deployment/4_finalise_test_environment.js +++ b/deployment/4_finalise_test_environment.js @@ -1,39 +1,45 @@ -const ENS = require('../build/ENSRegistryWithFallback'); -const ENSReverseRegistrar = require('../build/ReverseRegistrar'); +const ENS = require("../build/ENSRegistryWithFallback"); +const ENSReverseRegistrar = require("../build/ReverseRegistrar"); -const utils = require('../utils/utilities.js'); -const DeployManager = require('../utils/deploy-manager.js'); +const utils = require("../utils/utilities.js"); +const DeployManager = require("../utils/deploy-manager.js"); -const BYTES32_NULL = '0x0000000000000000000000000000000000000000000000000000000000000000'; +const BYTES32_NULL = "0x0000000000000000000000000000000000000000000000000000000000000000"; -async function deployENSReverseRegistrar(deployer, config, owner) { - const ENSRegistryWrapper = deployer.wrapDeployedContract(ENS, config.ENS.ensRegistry); - const ENSReverseRegistrarWrapper = await deployer.deploy(ENSReverseRegistrar, {}, config.ENS.ensRegistry, config.contracts.ENSResolver); +async function deployENSReverseRegistrar(deployer, config, owner, overrides) { + const ENSRegistryWrapper = deployer.wrapDeployedContract(ENS, config.ENS.ensRegistry); + const ENSReverseRegistrarWrapper = await deployer.deploy(ENSReverseRegistrar, {}, config.ENS.ensRegistry, config.contracts.ENSResolver); - const setSubnodeOwnerTx1 = await ENSRegistryWrapper.contract.setSubnodeOwner(BYTES32_NULL, utils.sha3('reverse'), owner); - await ENSRegistryWrapper.verboseWaitForTransaction(setSubnodeOwnerTx1, 'Create the reverse namespace'); + const setSubnodeOwnerTx1 = await ENSRegistryWrapper.contract.setSubnodeOwner(BYTES32_NULL, utils.sha3("reverse"), owner, overrides); + await ENSRegistryWrapper.verboseWaitForTransaction(setSubnodeOwnerTx1, "Create the reverse namespace"); - const setSubnodeOwnerTx2 = await ENSRegistryWrapper.contract.setSubnodeOwner(utils.namehash('reverse'), utils.sha3('addr'), ENSReverseRegistrarWrapper.contractAddress); - await ENSRegistryWrapper.verboseWaitForTransaction(setSubnodeOwnerTx2, 'Create the addr.reverse namespace and make the ENS reverse registrar the owner'); + const setSubnodeOwnerTx2 = await ENSRegistryWrapper.contract.setSubnodeOwner( + utils.namehash("reverse"), + utils.sha3("addr"), + ENSReverseRegistrarWrapper.contractAddress, + overrides, + ); + await ENSRegistryWrapper.verboseWaitForTransaction(setSubnodeOwnerTx2, + "Create the addr.reverse namespace and make the ENS reverse registrar the owner"); } -const deploy = async (network, secret) => { +const deploy = async (network) => { + const manager = new DeployManager(network); + await manager.setup(); - const manager = new DeployManager(network); - await manager.setup(); + const { configurator } = manager; + const { deployer } = manager; + const { gasPrice } = deployer.defaultOverrides; - const configurator = manager.configurator; - const deployer = manager.deployer; + const { config } = configurator; - const config = configurator.config; + const deploymentAccount = await deployer.signer.getAddress(); - const deploymentAccount = await deployer.signer.getAddress(); - - if (config.ENS.deployOwnRegistry) { - await deployENSReverseRegistrar(deployer, config, deploymentAccount); - } + if (config.ENS.deployOwnRegistry) { + await deployENSReverseRegistrar(deployer, config, deploymentAccount, { gasPrice }); + } }; module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/deployment/5_deploy_modules.js b/deployment/5_deploy_modules.js index 77bf110d9..63951af7b 100644 --- a/deployment/5_deploy_modules.js +++ b/deployment/5_deploy_modules.js @@ -1,194 +1,190 @@ -const GuardianStorage = require('../build/GuardianStorage'); -const TransferStorage = require('../build/TransferStorage'); - -const GuardianManager = require('../build/GuardianManager'); -const TokenExchanger = require('../build/TokenExchanger'); -const LockManager = require('../build/LockManager'); -const RecoveryManager = require('../build/RecoveryManager'); -const ApprovedTransfer = require('../build/ApprovedTransfer'); -const TransferManager = require('../build/TransferManager'); -const NftTransfer = require('../build/NftTransfer'); -const MakerManager = require('../build/MakerManager'); -const CompoundManager = require('../build/CompoundManager'); -const UniswapManager = require('../build/UniswapManager'); -const MakerV2Manager = require('../build/MakerV2Manager'); - -const DeployManager = require('../utils/deploy-manager.js'); - -///////////////////////////////////////////////////////// +const childProcess = require("child_process"); +const GuardianStorage = require("../build/GuardianStorage"); +const TransferStorage = require("../build/TransferStorage"); + +const GuardianManager = require("../build/GuardianManager"); +const TokenExchanger = require("../build/TokenExchanger"); +const LockManager = require("../build/LockManager"); +const RecoveryManager = require("../build/RecoveryManager"); +const ApprovedTransfer = require("../build/ApprovedTransfer"); +const TransferManager = require("../build/TransferManager"); +const NftTransfer = require("../build/NftTransfer"); +const MakerManager = require("../build/MakerManager"); +const CompoundManager = require("../build/CompoundManager"); + +const DeployManager = require("../utils/deploy-manager.js"); + +// /////////////////////////////////////////////////////// // Version 1.4 -///////////////////////////////////////////////////////// - -const deploy = async (network, secret) => { - - //////////////////////////////////// - // Setup - //////////////////////////////////// - - const manager = new DeployManager(network); - await manager.setup(); - - const configurator = manager.configurator; - const deployer = manager.deployer; - const abiUploader = manager.abiUploader; - - const config = configurator.config; - console.log(config); - - //////////////////////////////////// - // Deploy Storage - //////////////////////////////////// - - // Deploy the Guardian Storage - const GuardianStorageWrapper = await deployer.deploy(GuardianStorage); - // Deploy the Transfer Storage - const TransferStorageWrapper = await deployer.deploy(TransferStorage); - - //////////////////////////////////// - // Deploy Modules - //////////////////////////////////// - - // Deploy the GuardianManager module - const GuardianManagerWrapper = await deployer.deploy( - GuardianManager, - {}, - config.contracts.ModuleRegistry, - GuardianStorageWrapper.contractAddress, - config.settings.securityPeriod || 0, - config.settings.securityWindow || 0); +// /////////////////////////////////////////////////////// + +const deploy = async (network) => { + // ////////////////////////////////// + // Setup + // ////////////////////////////////// + + const manager = new DeployManager(network); + await manager.setup(); + + const { configurator } = manager; + const { deployer } = manager; + const { abiUploader } = manager; + + const { config } = configurator; + console.log(config); + + // ////////////////////////////////// + // Deploy Storage + // ////////////////////////////////// + + // Deploy the Guardian Storage + const GuardianStorageWrapper = await deployer.deploy(GuardianStorage); + // Deploy the Transfer Storage + const TransferStorageWrapper = await deployer.deploy(TransferStorage); + + // ////////////////////////////////// + // Deploy Modules + // ////////////////////////////////// + + // Deploy the GuardianManager module + const GuardianManagerWrapper = await deployer.deploy( + GuardianManager, + {}, + config.contracts.ModuleRegistry, + GuardianStorageWrapper.contractAddress, + config.settings.securityPeriod || 0, + config.settings.securityWindow || 0, + ); // Deploy the LockManager module - const LockManagerWrapper = await deployer.deploy( - LockManager, - {}, - config.contracts.ModuleRegistry, - GuardianStorageWrapper.contractAddress, - config.settings.lockPeriod || 0); + const LockManagerWrapper = await deployer.deploy( + LockManager, + {}, + config.contracts.ModuleRegistry, + GuardianStorageWrapper.contractAddress, + config.settings.lockPeriod || 0, + ); // Deploy the RecoveryManager module - const RecoveryManagerWrapper = await deployer.deploy( - RecoveryManager, - {}, - config.contracts.ModuleRegistry, - GuardianStorageWrapper.contractAddress, - config.settings.recoveryPeriod || 0, - config.settings.lockPeriod || 0, - config.settings.securityPeriod || 0, - config.settings.securityWindow || 0); + const RecoveryManagerWrapper = await deployer.deploy( + RecoveryManager, + {}, + config.contracts.ModuleRegistry, + GuardianStorageWrapper.contractAddress, + config.settings.recoveryPeriod || 0, + config.settings.lockPeriod || 0, + config.settings.securityPeriod || 0, + config.settings.securityWindow || 0, + ); // Deploy the ApprovedTransfer module - const ApprovedTransferWrapper = await deployer.deploy( - ApprovedTransfer, - {}, - config.contracts.ModuleRegistry, - GuardianStorageWrapper.contractAddress); + const ApprovedTransferWrapper = await deployer.deploy( + ApprovedTransfer, + {}, + config.contracts.ModuleRegistry, + GuardianStorageWrapper.contractAddress, + ); // Deploy the TransferManager module - const TransferManagerWrapper = await deployer.deploy( - TransferManager, - {}, - config.contracts.ModuleRegistry, - config.modules.TransferStorage, - config.modules.GuardianStorage, - config.contracts.TokenPriceProvider, - config.settings.securityPeriod || 0, - config.settings.securityWindow || 0, - config.settings.defaultLimit || '1000000000000000000', - ['test', 'staging', 'prod'].includes(network) ? config.modules.TokenTransfer : '0x0000000000000000000000000000000000000000' - ); + const TransferManagerWrapper = await deployer.deploy( + TransferManager, + {}, + config.contracts.ModuleRegistry, + config.modules.TransferStorage, + config.modules.GuardianStorage, + config.contracts.TokenPriceProvider, + config.settings.securityPeriod || 0, + config.settings.securityWindow || 0, + config.settings.defaultLimit || "1000000000000000000", + "0x0000000000000000000000000000000000000000", + ); // Deploy the TokenExchanger module - const TokenExchangerWrapper = await deployer.deploy( - TokenExchanger, - {}, - config.contracts.ModuleRegistry, - GuardianStorageWrapper.contractAddress, - config.Kyber.contract, - config.contracts.MultiSigWallet, - config.settings.feeRatio || 0); + const TokenExchangerWrapper = await deployer.deploy( + TokenExchanger, + {}, + config.contracts.ModuleRegistry, + GuardianStorageWrapper.contractAddress, + config.Kyber.contract, + config.contracts.MultiSigWallet, + config.settings.feeRatio || 0, + ); // Deploy the NFTTransfer module - const NftTransferWrapper = await deployer.deploy( - NftTransfer, - {}, - config.contracts.ModuleRegistry, - config.modules.GuardianStorage, - config.CryptoKitties.contract - ); + const NftTransferWrapper = await deployer.deploy( + NftTransfer, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + config.CryptoKitties.contract, + ); // Deploy the MakerManager module - const MakerManagerWrapper = await deployer.deploy( - MakerManager, - {}, - config.contracts.ModuleRegistry, - config.modules.GuardianStorage, - config.defi.maker.tub, - config.defi.uniswap.factory - ); + const MakerManagerWrapper = await deployer.deploy( + MakerManager, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + config.defi.maker.tub, + config.defi.uniswap.factory, + ); // Deploy the CompoundManager module - const CompoundManagerWrapper = await deployer.deploy( - CompoundManager, - {}, - config.contracts.ModuleRegistry, - config.modules.GuardianStorage, - config.defi.compound.comptroller, - config.contracts.CompoundRegistry - ); - // Deploy the UniswapManager module - const UniswapManagerWrapper = await deployer.deploy( - UniswapManager, - {}, - config.contracts.ModuleRegistry, - config.modules.GuardianStorage, - config.defi.uniswap.factory - ); - // Deploy MakerManagerV2 first version - const MakerV2ManagerWrapper = await deployer.deploy( - MakerV2Manager, - {}, - config.contracts.ModuleRegistry, - config.modules.GuardianStorage, - config.defi.maker.migration, - config.defi.maker.pot - ); - - /////////////////////////////////////////////////// - // Update config and Upload ABIs - /////////////////////////////////////////////////// - - configurator.updateModuleAddresses({ - GuardianStorage: GuardianStorageWrapper.contractAddress, - TransferStorage: TransferStorageWrapper.contractAddress, - GuardianManager: GuardianManagerWrapper.contractAddress, - LockManager: LockManagerWrapper.contractAddress, - RecoveryManager: RecoveryManagerWrapper.contractAddress, - ApprovedTransfer: ApprovedTransferWrapper.contractAddress, - TransferManager: TransferManagerWrapper.contractAddress, - TokenExchanger: TokenExchangerWrapper.contractAddress, - NftTransfer: NftTransferWrapper.contractAddress, - MakerManager: MakerManagerWrapper.contractAddress, - CompoundManager: CompoundManagerWrapper.contractAddress, - UniswapManager: UniswapManagerWrapper.contractAddress, - MakerV2Manager: MakerV2ManagerWrapper.contractAddress - }); - - const gitHash = require('child_process').execSync('git rev-parse HEAD').toString('utf8').replace(/\n$/, ''); - configurator.updateGitHash(gitHash); - - await configurator.save(); - - await Promise.all([ - abiUploader.upload(GuardianStorageWrapper, "modules"), - abiUploader.upload(TransferStorageWrapper, "modules"), - abiUploader.upload(GuardianManagerWrapper, "modules"), - abiUploader.upload(LockManagerWrapper, "modules"), - abiUploader.upload(RecoveryManagerWrapper, "modules"), - abiUploader.upload(ApprovedTransferWrapper, "modules"), - abiUploader.upload(TransferManagerWrapper, "modules"), - abiUploader.upload(TokenExchangerWrapper, "modules"), - abiUploader.upload(NftTransferWrapper, "modules"), - abiUploader.upload(MakerManagerWrapper, "modules"), - abiUploader.upload(CompoundManagerWrapper, "modules"), - abiUploader.upload(UniswapManagerWrapper, "modules"), - abiUploader.upload(MakerV2ManagerWrapper, "modules") - ]); - - console.log('Config:', config); + const CompoundManagerWrapper = await deployer.deploy( + CompoundManager, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + config.defi.compound.comptroller, + config.contracts.CompoundRegistry, + ); + // Deploy MakerManagerV2 + // const MakerV2ManagerWrapper = await deployer.deploy( + // MakerV2Manager, + // {}, + // config.contracts.ModuleRegistry, + // config.modules.GuardianStorage, + // config.defi.maker.migration, + // config.defi.maker.pot, + // config.defi.maker.jug, + // config.contracts.MakerRegistry, + // config.defi.uniswap.factory, + // ); + + // ///////////////////////////////////////////////// + // Update config and Upload ABIs + // ///////////////////////////////////////////////// + + configurator.updateModuleAddresses({ + GuardianStorage: GuardianStorageWrapper.contractAddress, + TransferStorage: TransferStorageWrapper.contractAddress, + GuardianManager: GuardianManagerWrapper.contractAddress, + LockManager: LockManagerWrapper.contractAddress, + RecoveryManager: RecoveryManagerWrapper.contractAddress, + ApprovedTransfer: ApprovedTransferWrapper.contractAddress, + TransferManager: TransferManagerWrapper.contractAddress, + TokenExchanger: TokenExchangerWrapper.contractAddress, + NftTransfer: NftTransferWrapper.contractAddress, + MakerManager: MakerManagerWrapper.contractAddress, + CompoundManager: CompoundManagerWrapper.contractAddress, + // MakerV2Manager: MakerV2ManagerWrapper.contractAddress, + }); + + const gitHash = childProcess.execSync("git rev-parse HEAD").toString("utf8").replace(/\n$/, ""); + configurator.updateGitHash(gitHash); + + await configurator.save(); + + await Promise.all([ + abiUploader.upload(GuardianStorageWrapper, "modules"), + abiUploader.upload(TransferStorageWrapper, "modules"), + abiUploader.upload(GuardianManagerWrapper, "modules"), + abiUploader.upload(LockManagerWrapper, "modules"), + abiUploader.upload(RecoveryManagerWrapper, "modules"), + abiUploader.upload(ApprovedTransferWrapper, "modules"), + abiUploader.upload(TransferManagerWrapper, "modules"), + abiUploader.upload(TokenExchangerWrapper, "modules"), + abiUploader.upload(NftTransferWrapper, "modules"), + abiUploader.upload(MakerManagerWrapper, "modules"), + abiUploader.upload(CompoundManagerWrapper, "modules"), + // abiUploader.upload(MakerV2ManagerWrapper, "modules"), + ]); + + console.log("Config:", config); }; module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/deployment/6_register_modules.js b/deployment/6_register_modules.js index 64008a3ce..9ef387282 100644 --- a/deployment/6_register_modules.js +++ b/deployment/6_register_modules.js @@ -1,97 +1,93 @@ -const ModuleRegistry = require('../build/ModuleRegistry'); -const MultiSig = require('../build/MultiSigWallet'); - -const GuardianManager = require('../build/GuardianManager'); -const TokenExchanger = require('../build/TokenExchanger'); -const LockManager = require('../build/LockManager'); -const RecoveryManager = require('../build/RecoveryManager'); -const ApprovedTransfer = require('../build/ApprovedTransfer'); -const TransferManager = require('../build/TransferManager'); -const NftTransfer = require('../build/NftTransfer'); -const MakerManager = require('../build/MakerManager'); -const CompoundManager = require('../build/CompoundManager'); -const UniswapManager = require('../build/UniswapManager'); -const MakerV2Manager = require('../build/MakerV2Manager'); - -const utils = require('../utils/utilities.js'); - -const DeployManager = require('../utils/deploy-manager.js'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); - -const deploy = async (network, secret) => { - - //////////////////////////////////// - // Setup - //////////////////////////////////// - - const manager = new DeployManager(network); - await manager.setup(); - - const configurator = manager.configurator; - const deployer = manager.deployer; - const versionUploader = manager.versionUploader; - - const deploymentWallet = deployer.signer; - - const config = configurator.config; - console.log('Config:', config); - - const GuardianManagerWrapper = await deployer.wrapDeployedContract(GuardianManager, config.modules.GuardianManager); - const LockManagerWrapper = await deployer.wrapDeployedContract(LockManager, config.modules.LockManager); - const RecoveryManagerWrapper = await deployer.wrapDeployedContract(RecoveryManager, config.modules.RecoveryManager); - const ApprovedTransferWrapper = await deployer.wrapDeployedContract(ApprovedTransfer, config.modules.ApprovedTransfer); - const TransferManagerWrapper = await deployer.wrapDeployedContract(TransferManager, config.modules.TransferManager); - const TokenExchangerWrapper = await deployer.wrapDeployedContract(TokenExchanger, config.modules.TokenExchanger); - const NftTransferWrapper = await deployer.wrapDeployedContract(NftTransfer, config.modules.NftTransfer); - const MakerManagerWrapper = await deployer.wrapDeployedContract(MakerManager, config.modules.MakerManager); - const CompoundManagerWrapper = await deployer.wrapDeployedContract(CompoundManager, config.modules.CompoundManager); - const UniswapManagerWrapper = await deployer.wrapDeployedContract(UniswapManager, config.modules.UniswapManager); - const MakerV2ManagerWrapper = await deployer.wrapDeployedContract(MakerV2Manager, config.modules.MakerV2Manager); - - const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); - const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); - - const wrappers = [ - GuardianManagerWrapper, - LockManagerWrapper, - RecoveryManagerWrapper, - ApprovedTransferWrapper, - TransferManagerWrapper, - TokenExchangerWrapper, - NftTransferWrapper, - MakerManagerWrapper, - CompoundManagerWrapper, - UniswapManagerWrapper, - MakerV2ManagerWrapper - ]; - - //////////////////////////////////// - // Register modules - //////////////////////////////////// - - const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); - - for (let idx = 0; idx < wrappers.length; idx++) { - let wrapper = wrappers[idx]; - await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerModule", [wrapper.contractAddress, utils.asciiToBytes32(wrapper._contract.contractName)]); - } - - //////////////////////////////////// - // Upload Version - //////////////////////////////////// - - const modules = wrappers.map((wrapper) => { - return { address: wrapper.contractAddress, name: wrapper._contract.contractName }; - }); - const version = { - modules: modules, - fingerprint: utils.versionFingerprint(modules), - version: "1.0.0", - createdAt: Math.floor((new Date()).getTime() / 1000) - } - await versionUploader.upload(version); +const ModuleRegistry = require("../build/ModuleRegistry"); +const MultiSig = require("../build/MultiSigWallet"); + +const GuardianManager = require("../build/GuardianManager"); +const TokenExchanger = require("../build/TokenExchanger"); +const LockManager = require("../build/LockManager"); +const RecoveryManager = require("../build/RecoveryManager"); +const ApprovedTransfer = require("../build/ApprovedTransfer"); +const TransferManager = require("../build/TransferManager"); +const NftTransfer = require("../build/NftTransfer"); +const MakerManager = require("../build/MakerManager"); +const CompoundManager = require("../build/CompoundManager"); +const MakerV2Manager = require("../build/MakerV2Manager"); + +const utils = require("../utils/utilities.js"); + +const DeployManager = require("../utils/deploy-manager.js"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); + +const deploy = async (network) => { + // ////////////////////////////////// + // Setup + // ////////////////////////////////// + + const manager = new DeployManager(network); + await manager.setup(); + + const { configurator } = manager; + const { deployer } = manager; + const { versionUploader } = manager; + const { gasPrice } = deployer.defaultOverrides; + + const deploymentWallet = deployer.signer; + + const { config } = configurator; + console.log("Config:", config); + + const GuardianManagerWrapper = await deployer.wrapDeployedContract(GuardianManager, config.modules.GuardianManager); + const LockManagerWrapper = await deployer.wrapDeployedContract(LockManager, config.modules.LockManager); + const RecoveryManagerWrapper = await deployer.wrapDeployedContract(RecoveryManager, config.modules.RecoveryManager); + const ApprovedTransferWrapper = await deployer.wrapDeployedContract(ApprovedTransfer, config.modules.ApprovedTransfer); + const TransferManagerWrapper = await deployer.wrapDeployedContract(TransferManager, config.modules.TransferManager); + const TokenExchangerWrapper = await deployer.wrapDeployedContract(TokenExchanger, config.modules.TokenExchanger); + const NftTransferWrapper = await deployer.wrapDeployedContract(NftTransfer, config.modules.NftTransfer); + const MakerManagerWrapper = await deployer.wrapDeployedContract(MakerManager, config.modules.MakerManager); + const CompoundManagerWrapper = await deployer.wrapDeployedContract(CompoundManager, config.modules.CompoundManager); + const MakerV2ManagerWrapper = await deployer.wrapDeployedContract(MakerV2Manager, config.modules.MakerV2Manager); + + const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + + const wrappers = [ + GuardianManagerWrapper, + LockManagerWrapper, + RecoveryManagerWrapper, + ApprovedTransferWrapper, + TransferManagerWrapper, + TokenExchangerWrapper, + NftTransferWrapper, + MakerManagerWrapper, + CompoundManagerWrapper, + MakerV2ManagerWrapper, + ]; + + // ////////////////////////////////// + // Register modules + // ////////////////////////////////// + + const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign, { gasPrice }); + + for (let idx = 0; idx < wrappers.length; idx += 1) { + const wrapper = wrappers[idx]; + await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerModule", + [wrapper.contractAddress, utils.asciiToBytes32(wrapper._contract.contractName)]); + } + + // ////////////////////////////////// + // Upload Version + // ////////////////////////////////// + + const modules = wrappers.map((wrapper) => ({ address: wrapper.contractAddress, name: wrapper._contract.contractName })); + const version = { + modules, + fingerprint: utils.versionFingerprint(modules), + version: "1.0.0", + createdAt: Math.floor((new Date()).getTime() / 1000), + }; + await versionUploader.upload(version); }; module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/deployment/7_upgrade_1_6.js b/deployment/7_upgrade_1_6.js new file mode 100644 index 000000000..62a25eab4 --- /dev/null +++ b/deployment/7_upgrade_1_6.js @@ -0,0 +1,214 @@ +const semver = require("semver"); +const childProcess = require("child_process"); +const ApprovedTransfer = require("../build/ApprovedTransfer"); +const RecoveryManager = require("../build/RecoveryManager"); +const MultiSig = require("../build/MultiSigWallet"); +const ModuleRegistry = require("../build/ModuleRegistry"); +const Upgrader = require("../build/SimpleUpgrader"); +const DeployManager = require("../utils/deploy-manager.js"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); +const TokenPriceProvider = require("../build/TokenPriceProvider"); +const MakerRegistry = require("../build/MakerRegistry"); +const ScdMcdMigration = require("../build/ScdMcdMigration"); +const MakerV2Manager = require("../build/MakerV2Manager"); +const TransferManager = require("../build/TransferManager"); + +const utils = require("../utils/utilities.js"); + +const TARGET_VERSION = "1.6.0"; +const MODULES_TO_ENABLE = ["ApprovedTransfer", "RecoveryManager", "MakerV2Manager", "TransferManager"]; +const MODULES_TO_DISABLE = ["UniswapManager"]; + +const BACKWARD_COMPATIBILITY = 1; + +const deploy = async (network) => { + if (!["kovan", "kovan-fork", "staging", "prod"].includes(network)) { + console.warn("------------------------------------------------------------------------"); + console.warn(`WARNING: The MakerManagerV2 module is not fully functional on ${network}`); + console.warn("------------------------------------------------------------------------"); + } + + const newModuleWrappers = []; + const newVersion = {}; + + // ////////////////////////////////// + // Setup + // ////////////////////////////////// + + const manager = new DeployManager(network); + await manager.setup(); + + const { configurator } = manager; + const { deployer } = manager; + const { abiUploader } = manager; + const { versionUploader } = manager; + const { gasPrice } = deployer.defaultOverrides; + const deploymentWallet = deployer.signer; + const { config } = configurator; + + const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign, { gasPrice }); + + // ////////////////////////////////// + // Deploy infrastructure contracts + // ////////////////////////////////// + + // Deploy and configure Maker Registry + const ScdMcdMigrationWrapper = await deployer.wrapDeployedContract(ScdMcdMigration, config.defi.maker.migration); + const vatAddress = await ScdMcdMigrationWrapper.vat(); + const MakerRegistryWrapper = await deployer.deploy(MakerRegistry, {}, vatAddress); + const wethJoinAddress = await ScdMcdMigrationWrapper.wethJoin(); + const addCollateralTransaction = await MakerRegistryWrapper.contract.addCollateral(wethJoinAddress, { gasPrice }); + await MakerRegistryWrapper.verboseWaitForTransaction(addCollateralTransaction, `Adding join adapter ${wethJoinAddress} to the MakerRegistry`); + const changeMakerRegistryOwnerTx = await MakerRegistryWrapper.contract.changeOwner(config.contracts.MultiSigWallet, { gasPrice }); + await MakerRegistryWrapper.verboseWaitForTransaction(changeMakerRegistryOwnerTx, "Set the MultiSig as the owner of the MakerRegistry"); + const TokenPriceProviderWrapper = await deployer.wrapDeployedContract(TokenPriceProvider, config.contracts.TokenPriceProvider); + + // ////////////////////////////////// + // Deploy new modules + // ////////////////////////////////// + + const ApprovedTransferWrapper = await deployer.deploy( + ApprovedTransfer, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + ); + newModuleWrappers.push(ApprovedTransferWrapper); + + const RecoveryManagerWrapper = await deployer.deploy( + RecoveryManager, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + config.settings.recoveryPeriod || 0, + config.settings.lockPeriod || 0, + config.settings.securityPeriod || 0, + config.settings.securityWindow || 0, + ); + newModuleWrappers.push(RecoveryManagerWrapper); + + const MakerV2ManagerWrapper = await deployer.deploy( + MakerV2Manager, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + config.defi.maker.migration, + config.defi.maker.pot, + config.defi.maker.jug, + MakerRegistryWrapper.contractAddress, + config.defi.uniswap.factory, + ); + newModuleWrappers.push(MakerV2ManagerWrapper); + + const TransferManagerWrapper = await deployer.deploy( + TransferManager, + {}, + config.contracts.ModuleRegistry, + config.modules.TransferStorage, + config.modules.GuardianStorage, + TokenPriceProviderWrapper.contractAddress, + config.settings.securityPeriod || 0, + config.settings.securityWindow || 0, + config.settings.defaultLimit || "1000000000000000000", + ["test", "staging", "prod"].includes(network) ? config.modules.TransferManager : "0x0000000000000000000000000000000000000000", + ); + newModuleWrappers.push(TransferManagerWrapper); + + // ///////////////////////////////////////////////// + // Update config and Upload ABIs + // ///////////////////////////////////////////////// + + configurator.updateModuleAddresses({ + ApprovedTransfer: ApprovedTransferWrapper.contractAddress, + RecoveryManager: RecoveryManagerWrapper.contractAddress, + MakerV2Manager: MakerV2ManagerWrapper.contractAddress, + TransferManager: TransferManagerWrapper.contractAddress, + }); + + configurator.updateInfrastructureAddresses({ + MakerRegistry: MakerRegistryWrapper.contractAddress, + }); + + const gitHash = childProcess.execSync("git rev-parse HEAD").toString("utf8").replace(/\n$/, ""); + configurator.updateGitHash(gitHash); + await configurator.save(); + + await Promise.all([ + abiUploader.upload(ApprovedTransferWrapper, "modules"), + abiUploader.upload(RecoveryManagerWrapper, "modules"), + abiUploader.upload(MakerV2ManagerWrapper, "modules"), + abiUploader.upload(TransferManagerWrapper, "modules"), + abiUploader.upload(MakerRegistryWrapper, "contracts"), + ]); + + // ////////////////////////////////// + // Register new modules + // ////////////////////////////////// + + for (let idx = 0; idx < newModuleWrappers.length; idx += 1) { + const wrapper = newModuleWrappers[idx]; + await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerModule", + [wrapper.contractAddress, utils.asciiToBytes32(wrapper._contract.contractName)]); + } + + // ////////////////////////////////// + // Deploy and Register upgraders + // ////////////////////////////////// + + + let fingerprint; + const versions = await versionUploader.load(BACKWARD_COMPATIBILITY); + for (let idx = 0; idx < versions.length; idx += 1) { + const version = versions[idx]; + let toAdd; let + toRemove; + if (idx === 0) { + const moduleNamesToRemove = MODULES_TO_DISABLE.concat(MODULES_TO_ENABLE); + toRemove = version.modules.filter((module) => moduleNamesToRemove.includes(module.name)); + toAdd = newModuleWrappers.map((wrapper) => ({ + address: wrapper.contractAddress, + name: wrapper._contract.contractName, + })); + const toKeep = version.modules.filter((module) => !moduleNamesToRemove.includes(module.name)); + const modulesInNewVersion = toKeep.concat(toAdd); + fingerprint = utils.versionFingerprint(modulesInNewVersion); + newVersion.version = semver.lt(version.version, TARGET_VERSION) ? TARGET_VERSION : semver.inc(version.version, "patch"); + newVersion.createdAt = Math.floor((new Date()).getTime() / 1000); + newVersion.modules = modulesInNewVersion; + newVersion.fingerprint = fingerprint; + } else { + // add all modules present in newVersion that are not present in version + toAdd = newVersion.modules.filter((module) => !version.modules.map((m) => m.address).includes(module.address)); + // remove all modules from version that are no longer present in newVersion + toRemove = version.modules.filter((module) => !newVersion.modules.map((m) => m.address).includes(module.address)); + } + + const upgraderName = `${version.fingerprint}_${fingerprint}`; + + const UpgraderWrapper = await deployer.deploy( + Upgrader, + {}, + config.contracts.ModuleRegistry, + toRemove.map((module) => module.address), + toAdd.map((module) => module.address), + ); + await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerModule", + [UpgraderWrapper.contractAddress, utils.asciiToBytes32(upgraderName)]); + + await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerUpgrader", + [UpgraderWrapper.contractAddress, utils.asciiToBytes32(upgraderName)]); + } + + // ////////////////////////////////// + // Upload Version + // ////////////////////////////////// + + await versionUploader.upload(newVersion); +}; + + +module.exports = { + deploy, +}; diff --git a/deployment/7_upgrade_ens_wf.js b/deployment/7_upgrade_ens_wf.js deleted file mode 100644 index 566198755..000000000 --- a/deployment/7_upgrade_ens_wf.js +++ /dev/null @@ -1,109 +0,0 @@ -const ENSManager = require('../build/ArgentENSManager'); -const ENSResolver = require('../build/ArgentENSResolver'); -const WalletFactory = require('../build/WalletFactory'); -const MultiSig = require('../build/MultiSigWallet'); -const BaseWallet = require('../build/BaseWallet'); - -const DeployManager = require('../utils/deploy-manager.js'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); -const utils = require('../utils/utilities.js'); - -const deploy = async (network) => { - - //////////////////////////////////// - // Setup - //////////////////////////////////// - - const manager = new DeployManager(network); - await manager.setup(); - - const configurator = manager.configurator; - const deployer = manager.deployer; - const abiUploader = manager.abiUploader; - const config = configurator.config; - const domain = config.ENS.domain; - - // Instantiate the ENS Registry and existing WalletFactory and ENSManager - const ENSManagerWrapper = await deployer.wrapDeployedContract(ENSManager, config.contracts.ENSManager); - const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); - const ENSResolverWrapper = await deployer.wrapDeployedContract(ENSResolver, config.contracts.ENSResolver); - - const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deployer.signer, config.multisig.autosign); - - //////////////////////////////////// - // Deploy new contracts - //////////////////////////////////// - - // Deploy the updated ENSManager - const NewENSManagerWrapper = await deployer.deploy(ENSManager, {}, domain, utils.namehash(domain), config.ENS.ensRegistry, config.contracts.ENSResolver); - - // Deploy new BaseWallet - const NewBaseWalletWrapper = await deployer.deploy(BaseWallet); - - // Deploy new Wallet Factory - const NewWalletFactoryWrapper = await deployer.deploy( - WalletFactory, {}, - config.contracts.ModuleRegistry, - NewBaseWalletWrapper.contractAddress, - NewENSManagerWrapper.contractAddress); - - //////////////////////////////////// - // Configure WalletFactory - //////////////////////////////////// - - //Set the GuardianStorage address for the new WalletFactory - const setGuardianStorageTx = await NewWalletFactoryWrapper.contract.changeGuardianStorage(config.modules.GuardianStorage); - await NewWalletFactoryWrapper.verboseWaitForTransaction(setGuardianStorageTx, `Set the GuardianStorage address`); - - // Set the backend keys as managers for the new WalletFactory - for (idx in config.backend.accounts) { - let account = config.backend.accounts[idx]; - const WalletFactoryAddManagerTx = await NewWalletFactoryWrapper.contract.addManager(account); - await NewWalletFactoryWrapper.verboseWaitForTransaction(WalletFactoryAddManagerTx, `Set ${account} as the manager of the WalletFactory`); - } - - // Set the multisig as the owner of the new WalletFactory - const changeOwnerTx = await NewWalletFactoryWrapper.contract.changeOwner(config.contracts.MultiSigWallet); - await NewWalletFactoryWrapper.verboseWaitForTransaction(changeOwnerTx, `Set the MultiSig as the owner of the WalletFactory`); - - //////////////////////////////////// - // Configure ENS - //////////////////////////////////// - - // Set the new WalletFactory as a manager of the new ENSManager - const ENSManagerAddManagerTx = await NewENSManagerWrapper.contract.addManager(NewWalletFactoryWrapper.contractAddress); - await NewENSManagerWrapper.verboseWaitForTransaction(ENSManagerAddManagerTx, 'Set the WalletFactory as the manager of the ENS Manager'); - - // Set the MultiSig as the owner of the new ENSManager - const ChangeENSManagerOwnerTx = await NewENSManagerWrapper.contract.changeOwner(config.contracts.MultiSigWallet); - await NewENSManagerWrapper.verboseWaitForTransaction(ChangeENSManagerOwnerTx, `Set the MultiSig as the owner of ENSManager`); - - // Decomission old ENSManager - await multisigExecutor.executeCall(ENSManagerWrapper, "changeRootnodeOwner", ["0x0000000000000000000000000000000000000000"]); - console.log(`Owner of ${domain} changed from from old ENSManager to 0x0000000000000000000000000000000000000000`); - - // Set new ENSManager as a manager of ENSREsolver - await multisigExecutor.executeCall(ENSResolverWrapper, "addManager", [NewENSManagerWrapper.contractAddress]); - - /////////////////////////////////////////////////// - // Update config and Upload ABIs - /////////////////////////////////////////////////// - - configurator.updateInfrastructureAddresses({ - ENSManager: NewENSManagerWrapper.contractAddress, - WalletFactory: NewWalletFactoryWrapper.contractAddress, - BaseWallet: NewBaseWalletWrapper.contractAddress - }); - await configurator.save(); - - await Promise.all([ - abiUploader.upload(NewENSManagerWrapper, "contracts"), - abiUploader.upload(NewWalletFactoryWrapper, "contracts"), - abiUploader.upload(NewBaseWalletWrapper, "contracts") - ]); -} - - -module.exports = { - deploy -}; \ No newline at end of file diff --git a/deployment/999_benchmark.js b/deployment/999_benchmark.js index db258b92b..aa2389724 100644 --- a/deployment/999_benchmark.js +++ b/deployment/999_benchmark.js @@ -1,454 +1,489 @@ -// Usage: truffle exec ./scripts/benchmark.js --network ganache - -const BaseWallet = require('../build/BaseWallet'); -const Proxy = require('../build/Proxy'); -const ModuleRegistry = require('../build/ModuleRegistry'); -const DappRegistry = require('../build/DappRegistry'); -const MultiSig = require('../build/MultiSigWallet'); -const ENS = require('../build/ENSRegistryWithFallback'); -const ENSManager = require('../build/ArgentENSManager'); -const ENSResolver = require('../build/ArgentENSResolver'); -const WalletFactory = require('../build/WalletFactory'); -const TokenPriceProvider = require("../build/TokenPriceProvider"); - -const GuardianManager = require('../build/GuardianManager'); -const TokenExchanger = require('../build/TokenExchanger'); -const LockManager = require('../build/LockManager'); -const RecoveryManager = require('../build/RecoveryManager'); -const ApprovedTransfer = require('../build/ApprovedTransfer'); -const TransferManager = require('../build/TransferManager'); -const NftTransfer = require('../build/NftTransfer'); -const MakerManager = require('../build/MakerManager'); -const CompoundManager = require('../build/CompoundManager'); -const UniswapManager = require('../build/UniswapManager'); -const MakerV2Manager = require('../build/MakerV2Manager'); - -const ethers = require('ethers'); -const Table = require('cli-table2'); -const tinyreq = require('tinyreq'); - -const DeployManager = require('../utils/deploy-manager'); -const TestManager = require('../utils/test-manager'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); +/* eslint max-classes-per-file: ["error", 2] */ + +const ethers = require("ethers"); +const Table = require("cli-table2"); +const tinyreq = require("tinyreq"); +const BaseWallet = require("../build/BaseWallet"); +const Proxy = require("../build/Proxy"); +const ModuleRegistry = require("../build/ModuleRegistry"); +const MultiSig = require("../build/MultiSigWallet"); +const WalletFactory = require("../build/WalletFactory"); + +const GuardianManager = require("../build/GuardianManager"); +const TokenExchanger = require("../build/TokenExchanger"); +const LockManager = require("../build/LockManager"); +const RecoveryManager = require("../build/RecoveryManager"); +const ApprovedTransfer = require("../build/ApprovedTransfer"); +const TransferManager = require("../build/TransferManager"); +const NftTransfer = require("../build/NftTransfer"); +const MakerManager = require("../build/MakerManager"); +const CompoundManager = require("../build/CompoundManager"); +const MakerV2Manager = require("../build/MakerV2Manager"); + +const DeployManager = require("../utils/deploy-manager"); +const TestManager = require("../utils/test-manager"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); const ETH_TOKEN = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; - - -class Benchmark { - constructor(network) { - this.network = network; - this._logger = new Logger(); - } - - ///////////////////// - ////// setup //////// - ///////////////////// - - async setup() { - const manager = new DeployManager(this.network); - await manager.setup(); - - const configurator = manager.configurator; - - this.deployer = manager.deployer; - this.deploymentWallet = this.deployer.signer; - const config = configurator.config; - - this.accounts = await this.deployer.provider.listAccounts(); - this.signers = this.accounts.map(account => this.deployer.provider.getSigner(account)); - this.config = config; - - this.testManager = new TestManager(this.accounts); - - this.GuardianManagerWrapper = await this.deployer.wrapDeployedContract(GuardianManager, config.modules.GuardianManager); - this.LockManagerWrapper = await this.deployer.wrapDeployedContract(LockManager, config.modules.LockManager); - this.RecoveryManagerWrapper = await this.deployer.wrapDeployedContract(RecoveryManager, config.modules.RecoveryManager); - this.ApprovedTransferWrapper = await this.deployer.wrapDeployedContract(ApprovedTransfer, config.modules.ApprovedTransfer); - this.TransferManagerWrapper = await this.deployer.wrapDeployedContract(TransferManager, config.modules.TransferManager); - this.TokenExchangerWrapper = await this.deployer.wrapDeployedContract(TokenExchanger, config.modules.TokenExchanger); - this.NftTransferWrapper = await this.deployer.wrapDeployedContract(NftTransfer, config.modules.NftTransfer); - this.MakerManagerWrapper = await this.deployer.wrapDeployedContract(MakerManager, config.modules.MakerManager); - this.CompoundManagerWrapper = await this.deployer.wrapDeployedContract(CompoundManager, config.modules.CompoundManager); - this.UniswapManagerWrapper = await this.deployer.wrapDeployedContract(UniswapManager, config.modules.UniswapManager); - this.MakerV2ManagerWrapper = await this.deployer.wrapDeployedContract(MakerV2Manager, config.modules.MakerV2Manager); - - this.ModuleRegistryWrapper = await this.deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); - this.DappRegistryWrapper = await this.deployer.wrapDeployedContract(DappRegistry, config.contracts.DappRegistry); - this.MultiSigWrapper = await this.deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); - this.WalletFactoryWrapper = await this.deployer.wrapDeployedContract(WalletFactory, config.contracts.WalletFactory); - this.BaseWalletWrapper = await this.deployer.wrapDeployedContract(BaseWallet, config.contracts.BaseWallet); - - this.multisigExecutor = new MultisigExecutor(this.MultiSigWrapper, this.signers[0], true); - } - - async setupWallet() { - this.oneModule = [this.GuardianManagerWrapper.contractAddress]; - this.twoModules = [this.GuardianManagerWrapper.contractAddress, this.LockManagerWrapper.contractAddress]; - this.threeModules = [this.GuardianManagerWrapper.contractAddress, this.LockManagerWrapper.contractAddress, this.RecoveryManagerWrapper.contractAddress]; - this.allModules = [ - this.GuardianManagerWrapper.contractAddress, - this.LockManagerWrapper.contractAddress, - this.RecoveryManagerWrapper.contractAddress, - this.ApprovedTransferWrapper.contractAddress, - this.TransferManagerWrapper.contractAddress, - this.TokenExchangerWrapper.contractAddress, - this.NftTransferWrapper.contractAddress, - this.MakerManagerWrapper.contractAddress, - this.CompoundManagerWrapper.contractAddress, - this.UniswapManagerWrapper.contractAddress, - this.MakerV2ManagerWrapper.contractAddress - ]; - - const proxy = await this.deployer.deploy(Proxy, {}, this.BaseWalletWrapper.contractAddress); - this.wallet = this.deployer.wrapDeployedContract(BaseWallet, proxy.contractAddress); - this.walletAddress = this.wallet.contractAddress; - await this.wallet.init(this.accounts[0], this.allModules, { gasLimit: 1000000 }); - await this.deploymentWallet.sendTransaction({ - to: this.walletAddress, - value: ethers.utils.parseEther('1.0') - }); - } - - ///////////////////// - ///// use cases ///// - ///////////////////// - - async estimateCreateWalletWithoutENSOneModule() { - const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.oneModule, ""); - this._logger.addItem("Create a wallet without ENS (1 module)", gasUsed); - } - - async estimateCreateWalletWithoutENSTwoModules() { - const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.twoModules, ""); - this._logger.addItem("Create a wallet without ENS (2 module)", gasUsed); - } - - async estimateCreateWalletWithoutENSThreeModules() { - const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.threeModules, ""); - this._logger.addItem("Create a wallet without ENS (3 module)", gasUsed); - } - - async estimateCreateWalletWithoutENSAllModules() { - const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.allModules, ""); - this._logger.addItem("Create a wallet without ENS (all modules)", gasUsed); - } - - async estimateCreateWalletWithENS() { - const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.allModules, "helloworld"); - this._logger.addItem("Create a wallet with ENS (all modules)", gasUsed); - } - - async estimateAddFirstGuardianDirect() { - const gasUsed = await this.GuardianManagerWrapper.estimate.addGuardian(this.walletAddress, this.accounts[1]); - this._logger.addItem("Add first guardian (direct)", gasUsed); - } - - async estimateAddSecondGuardianDirect() { - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); - - let gasUsed = await this.GuardianManagerWrapper.estimate.addGuardian(this.walletAddress, this.accounts[2]); - this._logger.addItem("Request add second guardian (direct)", gasUsed); - - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[2]); - await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow / 2); - - gasUsed = await this.GuardianManagerWrapper.estimate.confirmGuardianAddition(this.walletAddress, this.accounts[2]); - this._logger.addItem("Confirm add second guardian (direct)", gasUsed); - } - - async estimateRevokeGuardianDirect() { - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); - - let gasUsed = await this.GuardianManagerWrapper.estimate.revokeGuardian(this.walletAddress, this.accounts[1]); - this._logger.addItem("Request revoke guardian (direct)", gasUsed); - - await this.GuardianManagerWrapper.revokeGuardian(this.walletAddress, this.accounts[1]); - await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow / 2); - - gasUsed = await this.GuardianManagerWrapper.estimate.confirmGuardianRevokation(this.walletAddress, this.accounts[1]); - this._logger.addItem("Confirm revoke guardian (direct)", gasUsed); - } - - async estimateAddGuardianRelayed() { - - const gasUsed = await this.relayEstimate(this.GuardianManagerWrapper, "addGuardian", [this.walletAddress, this.accounts[1]], this.wallet, [this.signers[0]]); - this._logger.addItem("Add a guardian (relayed)", gasUsed); - }; - - async estimateRevokeGuardianRelayed() { - // add guardian - await this.relay(this.GuardianManagerWrapper, "addGuardian", [this.walletAddress, this.accounts[1]], this.wallet, [this.signers[0]]); - - // estimate revoke guardian - const gasUsed = await this.relayEstimate(this.GuardianManagerWrapper, "revokeGuardian", [this.walletAddress, this.accounts[1]], this.wallet, [this.signers[0]]); - this._logger.addItem("Revoke a guardian (relayed)", gasUsed); - } - - async estimateLockWalletDirect() { - // add guardian - let guardian = this.accounts[1]; - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, guardian); - - // estimate lock wallet - const gasUsed = await this.LockManagerWrapper.from(guardian).estimate.lock(this.walletAddress); - this._logger.addItem("Lock wallet (direct)", gasUsed); - } - - async estimateUnlockWalletDirect() { - // add guardian - let guardian = this.accounts[1]; - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, guardian); - - // lock wallet - await this.LockManagerWrapper.from(guardian).lock(this.walletAddress); - - // estimate unlock wallet - const gasUsed = await this.LockManagerWrapper.from(guardian).estimate.unlock(this.walletAddress); - this._logger.addItem("Unlock wallet (direct)", gasUsed); - } - - async estimateLockWalletRelayed() { - // add guardian - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); - - // estimate lock wallet - const gasUsed = await this.relayEstimate(this.LockManagerWrapper, "lock", [this.walletAddress], this.wallet, [this.signers[1]]); - this._logger.addItem("Lock wallet (relayed)", gasUsed); - } - - async estimateUnlockWalletRelayed() { - // add guardian - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); - - // lock wallet - await this.relay(this.LockManagerWrapper, "lock", [this.walletAddress], this.wallet, [this.signers[1]]); - - // estimate unlock wallet - const gasUsed = await this.relayEstimate(this.LockManagerWrapper, "unlock", [this.walletAddress], this.wallet, [this.signers[1]]); - this._logger.addItem("Unlock wallet (relayed)", gasUsed); - } - - async estimateExecuteRecovery() { - // add guardians - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[2]); - await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow / 2); - await this.GuardianManagerWrapper.confirmGuardianAddition(this.walletAddress, this.accounts[2]); - - // estimate execute recovery - const recoveryAddress = this.accounts[3]; - const signers = [this.signers[2], this.signers[1]]; // manually inversed the signers to get them ordered - const gasUsed = await this.relayEstimate(this.RecoveryManagerWrapper, "executeRecovery", [this.walletAddress, recoveryAddress], this.wallet, signers); - this._logger.addItem("Execute recovery", gasUsed); - } - - async estimateChangeLimitDirect() { - const gasUsed = await this.TransferManagerWrapper.estimate.changeLimit(this.walletAddress, 4000000); - this._logger.addItem("Change limit (direct)", gasUsed); - } - - async estimateChangeLimitRelayed() { - const gasUsed = await this.relayEstimate(this.TransferManagerWrapper, "changeLimit", [this.walletAddress, 67000000], this.wallet, [this.signers[0]]); - this._logger.addItem("Change limit (relayed)", gasUsed); - } - - async estimateETHTransferNoLimitDirect() { - // disable limit - await this.TransferManagerWrapper.disableLimit(this.walletAddress); - await this.testManager.increaseTime(this.config.settings.securityPeriod + 1); - - // transfer - const gasUsed = await this.TransferManagerWrapper.estimate.transferToken(this.walletAddress, ETH_TOKEN, this.accounts[1], 1000000, "0x"); - this._logger.addItem("ETH transfer, limit disabled (direct)", gasUsed); - } - - async estimateTransferNoLimitRelayed() { - // disable limit - await this.TransferManagerWrapper.disableLimit(this.walletAddress); - await this.testManager.increaseTime(this.config.settings.securityPeriod + 1); - - // transfer - const gasUsed = await this.relayEstimate(this.TransferManagerWrapper, "transferToken", [this.walletAddress, ETH_TOKEN, this.accounts[1], 1000000, "0x"], this.wallet, [this.signers[0]]); - this._logger.addItem("ETH transfer, limit disabled (relayed)", gasUsed); - } - - async estimateETHSmallTransferDirect() { - await this.TransferManagerWrapper.transferToken(this.walletAddress, ETH_TOKEN, this.accounts[5], 200, "0x"); - const gasUsed = await this.TransferManagerWrapper.estimate.transferToken(this.walletAddress, ETH_TOKEN, this.accounts[5], 200, "0x"); - this._logger.addItem("ETH small transfer (direct)", gasUsed); - } - - async estimateSmallTransferRelayed() { - const gasUsed = await this.relayEstimate(this.TransferManagerWrapper, "transferToken", [this.walletAddress, ETH_TOKEN, this.accounts[1], 1000, "0x"], this.wallet, [this.signers[0]]) - this._logger.addItem("ETH small transfer (relayed)", gasUsed); - } - - async estimateETHTransferToWhitelistedAccountDirect() { - await this.TransferManagerWrapper.addToWhitelist(this.walletAddress, this.accounts[3]); - await this.testManager.increaseTime(this.config.settings.securityPeriod + 1); - - const gasUsed = await this.TransferManagerWrapper.estimate.transferToken(this.walletAddress, ETH_TOKEN, this.accounts[3], 2000000, "0x"); - this._logger.addItem("ETH transfer to whitelisted account (direct)", gasUsed); - } - - async estimateTransferToWhitelistedAccountRelayed() { - await this.TransferManagerWrapper.addToWhitelist(this.walletAddress, this.accounts[3]); - await this.testManager.increaseTime(this.config.settings.securityPeriod + 1); - - const gasUsed = await this.relayEstimate(this.TransferManagerWrapper, "transferToken", [this.walletAddress, ETH_TOKEN, this.accounts[3], 2000000, "0x"], this.wallet, [this.signers[0]]) - this._logger.addItem("ETH transfer to whitelisted account (relayed)", gasUsed); - } - - async estimateETHLargeTransferToUntrustedAccount() { - const gasUsed = await this.TransferManagerWrapper.estimate.transferToken(this.walletAddress, ETH_TOKEN, this.accounts[2], 2000000, "0x"); - this._logger.addItem("ETH large transfer to untrusted account", gasUsed); - } - - // async estimateExecuteETHLargeTransferToUntrustedAccount() { - // const tx = await this.TokenTransferWrapper.transferToken(this.walletAddress, ETH_TOKEN, this.accounts[2], 2000000, "0x"); - // const result = await this.TokenTransferWrapper.verboseWaitForTransaction(tx, ''); - // const block = result.blockNumber; - // console.log(block); - - // await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow/2); - // const gasUsed = await this.TokenTransferWrapper.estimate.executePendingTransfer(this.walletAddress, ETH_TOKEN, this.accounts[2], 2000000, "0x", block); - // this._logger.addItem("Execute ETH large transfer to untrusted account", gasUsed); - // } - - async estimateLargeTransferApprovalByOneGuardian() { - // add guardian - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); - - // estimate approve large transfer - const gasUsed = await this.relayEstimate(this.ApprovedTransferWrapper, "transferToken", [this.walletAddress, ETH_TOKEN, this.accounts[3], 2000000, "0x"], this.wallet, [this.signers[0], this.signers[1]]) - this._logger.addItem("ETH large transfer approval by one guardian", gasUsed); - } - - async estimateLargeTransferApprovalByTwoGuardians() { - // add 3 guardians - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[2]); - await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[3]); - - await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow / 2); - - await this.GuardianManagerWrapper.confirmGuardianAddition(this.walletAddress, this.accounts[2]); - await this.GuardianManagerWrapper.confirmGuardianAddition(this.walletAddress, this.accounts[3]); - - // estimate approve large transfer - const signers = [this.signers[0], this.signers[2], this.signers[1]]; // manually inversed the signers to get them ordered - const gasUsed = await this.relayEstimate(this.ApprovedTransferWrapper, "transferToken", [this.walletAddress, ETH_TOKEN, this.accounts[5], 2000000, "0x"], this.wallet, signers) - this._logger.addItem("ETH large transfer approval by two guardians", gasUsed); - } - - ///////////////////// - ////// utils //////// - ///////////////////// - - async relay(target, method, params, wallet, signers, estimate = false) { - const result = await this.testManager.relay(target, method, params, wallet, signers, this.accounts[9], estimate); - return result - } - - async relayEstimate(target, method, params, wallet, signers) { - const result = await this.relay(target, method, params, wallet, signers, true); - return result - } - - getAllEstimateMethods() { - var props = []; - var obj = this; - - do { - props = props.concat(Object.getOwnPropertyNames(obj)); - } while (obj = Object.getPrototypeOf(obj)); - - return props.filter(prop => prop.startsWith("estimate")); - } - - async output() { - await this._logger.loadData(); - return this._logger.output(); - } -} +const { sortWalletByAddress } = require("../utils/utilities.js"); class Logger { - constructor() { - this._items = []; - } - - async loadData() { - let coinmarketcap = await tinyreq({ url: "https://api.coinmarketcap.com/v2/ticker/1027/" }); - try { - this._ethusd = JSON.parse(coinmarketcap).data.quotes.USD.price; - } catch (error) { - this._ethusd = "500"; - } - - let etherchain = await tinyreq({ url: "https://www.etherchain.org/api/gasPriceOracle" }); - try { - this._gas_price = JSON.parse(etherchain); - } catch (error) { - this._gas_price = JSON.parse('{"safeLow":"3","standard":"5","fast":"10","fastest":"10"}'); - } - - - } - - addItem(key, value) { - this._items.push({ key: key, value: value }); - } - - output() { - var colWidths = [75, 15]; - var head = [`Task [1 ETH = ${this._ethusd} USD]`, "Gas"]; - for (var speed in this._gas_price) { - let gasPrice = parseInt(this._gas_price[speed]); - head.push(`${speed} (${gasPrice} gwei)`); - colWidths.push(20); - } - const style = { head: [], border: [] }; - - var table = new Table({ head: head, colWidths: colWidths, style: style }); - - this._items.forEach(item => { - var row = [item.key, item.value.toLocaleString()]; - for (var speed in this._gas_price) { - let gasPrice = parseInt(this._gas_price[speed]); - let price = item.value * gasPrice * 0.000000001 * parseInt(this._ethusd); - row.push(price.toLocaleString('en-US', { style: 'currency', currency: 'USD' })); - } - table.push(row); - }); - return table.toString(); - } - + constructor() { + this._items = []; + } + + async loadData() { + const coinmarketcap = await tinyreq({ url: "https://api.coinmarketcap.com/v2/ticker/1027/" }); + try { + this._ethusd = JSON.parse(coinmarketcap).data.quotes.USD.price; + } catch (error) { + this._ethusd = "500"; + } + + const etherchain = await tinyreq({ url: "https://www.etherchain.org/api/gasPriceOracle" }); + try { + this._gas_price = JSON.parse(etherchain); + } catch (error) { + this._gas_price = JSON.parse('{"safeLow":"3","standard":"5","fast":"10","fastest":"10"}'); + } + } + + addItem(key, value) { + this._items.push({ key, value }); + } + + output() { + const colWidths = [75, 15]; + const head = [`Task [1 ETH = ${this._ethusd} USD]`, "Gas"]; + for (const speed in this._gas_price) { + const gasPrice = parseInt(this._gas_price[speed], 10); + head.push(`${speed} (${gasPrice} gwei)`); + colWidths.push(20); + } + const style = { head: [], border: [] }; + + const table = new Table({ head, colWidths, style }); + + this._items.forEach((item) => { + const row = [item.key, item.value.toLocaleString()]; + for (const speed in this._gas_price) { + const gasPrice = parseInt(this._gas_price[speed], 10); + const price = item.value * gasPrice * 0.000000001 * parseInt(this._ethusd, 10); + row.push(price.toLocaleString("en-US", { style: "currency", currency: "USD" })); + } + table.push(row); + }); + return table.toString(); + } } -const deploy = async (network, secret) => { - - let benchmark = new Benchmark(network); - await benchmark.setup(); - - var methods = benchmark.getAllEstimateMethods(); - let argv_methods = process.argv.filter(x => x.startsWith("estimate")); - if (argv_methods.length > 0) { - methods = methods.filter(method => argv_methods.indexOf(method) >= 0); - } - - for (let index = 0; index < methods.length; index++) { - const method = methods[index]; - console.log(`Running ${method}...`); - await benchmark.setupWallet(); - await benchmark[method](); - } - - const output = await benchmark.output(); - console.log(output); - - // await fs.writeFileSync(OUTPUT_FILE, output); +class Benchmark { + constructor(network) { + this.network = network; + this._logger = new Logger(); + } + + // /////////////////// + // //// setup //////// + // /////////////////// + + async setup() { + const manager = new DeployManager(this.network); + await manager.setup(); + + const { configurator } = manager; + + this.deployer = manager.deployer; + this.deploymentWallet = this.deployer.signer; + const { config } = configurator; + + const signers = (await this.deployer.provider.listAccounts()).map((account) => this.deployer.provider.getSigner(account)); + this.signers = [signers[0], ...sortWalletByAddress(signers.slice(1), "_address")]; + this.accounts = this.signers.map((s) => s._address); + this.config = config; + + this.testManager = new TestManager(this.accounts); + + this.GuardianManagerWrapper = await this.deployer.wrapDeployedContract(GuardianManager, config.modules.GuardianManager); + this.LockManagerWrapper = await this.deployer.wrapDeployedContract(LockManager, config.modules.LockManager); + this.RecoveryManagerWrapper = await this.deployer.wrapDeployedContract(RecoveryManager, config.modules.RecoveryManager); + this.ApprovedTransferWrapper = await this.deployer.wrapDeployedContract(ApprovedTransfer, config.modules.ApprovedTransfer); + this.TransferManagerWrapper = await this.deployer.wrapDeployedContract(TransferManager, config.modules.TransferManager); + this.TokenExchangerWrapper = await this.deployer.wrapDeployedContract(TokenExchanger, config.modules.TokenExchanger); + this.NftTransferWrapper = await this.deployer.wrapDeployedContract(NftTransfer, config.modules.NftTransfer); + this.MakerManagerWrapper = await this.deployer.wrapDeployedContract(MakerManager, config.modules.MakerManager); + this.CompoundManagerWrapper = await this.deployer.wrapDeployedContract(CompoundManager, config.modules.CompoundManager); + this.MakerV2ManagerWrapper = await this.deployer.wrapDeployedContract(MakerV2Manager, config.modules.MakerV2Manager); + + this.ModuleRegistryWrapper = await this.deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + this.MultiSigWrapper = await this.deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + this.WalletFactoryWrapper = await this.deployer.wrapDeployedContract(WalletFactory, config.contracts.WalletFactory); + this.BaseWalletWrapper = await this.deployer.wrapDeployedContract(BaseWallet, config.contracts.BaseWallet); + + this.multisigExecutor = new MultisigExecutor(this.MultiSigWrapper, this.signers[0], true); + } + + async setupWallet() { + this.oneModule = [this.GuardianManagerWrapper.contractAddress]; + this.twoModules = [this.GuardianManagerWrapper.contractAddress, this.LockManagerWrapper.contractAddress]; + this.threeModules = [this.GuardianManagerWrapper.contractAddress, this.LockManagerWrapper.contractAddress, + this.RecoveryManagerWrapper.contractAddress]; + this.allModules = [ + this.GuardianManagerWrapper.contractAddress, + this.LockManagerWrapper.contractAddress, + this.RecoveryManagerWrapper.contractAddress, + this.ApprovedTransferWrapper.contractAddress, + this.TransferManagerWrapper.contractAddress, + this.TokenExchangerWrapper.contractAddress, + this.NftTransferWrapper.contractAddress, + this.MakerManagerWrapper.contractAddress, + this.CompoundManagerWrapper.contractAddress, + this.MakerV2ManagerWrapper.contractAddress, + ]; + + const proxy = await this.deployer.deploy(Proxy, {}, this.BaseWalletWrapper.contractAddress); + this.wallet = this.deployer.wrapDeployedContract(BaseWallet, proxy.contractAddress); + this.walletAddress = this.wallet.contractAddress; + await this.wallet.init(this.accounts[0], this.allModules, { gasLimit: 1000000 }); + await this.deploymentWallet.sendTransaction({ + to: this.walletAddress, + value: ethers.utils.parseEther("1.0"), + }); + } + + // /////////////////// + // /// use cases ///// + // /////////////////// + + async estimateCreateWalletOneModule() { + const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.oneModule, "hoy"); + this._logger.addItem("Create a wallet without ENS (1 module)", gasUsed); + } + + async estimateCreateWalletTwoModules() { + const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.twoModules, "heya"); + this._logger.addItem("Create a wallet without ENS (2 module)", gasUsed); + } + + async estimateCreateWalletThreeModules() { + const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.threeModules, "meh"); + this._logger.addItem("Create a wallet without ENS (3 module)", gasUsed); + } + + async estimateCreateWalletAllModules() { + const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.allModules, "moo"); + this._logger.addItem("Create a wallet without ENS (all modules)", gasUsed); + } + + async estimateCreateWalletWithENS() { + const gasUsed = await this.WalletFactoryWrapper.estimate.createWallet(this.accounts[4], this.allModules, "helloworld"); + this._logger.addItem("Create a wallet with ENS (all modules)", gasUsed); + } + + async estimateAddFirstGuardianDirect() { + const gasUsed = await this.GuardianManagerWrapper.estimate.addGuardian(this.walletAddress, this.accounts[1]); + this._logger.addItem("Add first guardian (direct)", gasUsed); + } + + async estimateAddSecondGuardianDirect() { + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); + + let gasUsed = await this.GuardianManagerWrapper.estimate.addGuardian(this.walletAddress, this.accounts[2]); + this._logger.addItem("Request add second guardian (direct)", gasUsed); + + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[2]); + await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow / 2); + + gasUsed = await this.GuardianManagerWrapper.estimate.confirmGuardianAddition(this.walletAddress, this.accounts[2]); + this._logger.addItem("Confirm add second guardian (direct)", gasUsed); + } + + async estimateRevokeGuardianDirect() { + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); + + let gasUsed = await this.GuardianManagerWrapper.estimate.revokeGuardian(this.walletAddress, this.accounts[1]); + this._logger.addItem("Request revoke guardian (direct)", gasUsed); + + await this.GuardianManagerWrapper.revokeGuardian(this.walletAddress, this.accounts[1]); + await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow / 2); + + gasUsed = await this.GuardianManagerWrapper.estimate.confirmGuardianRevokation(this.walletAddress, this.accounts[1]); + this._logger.addItem("Confirm revoke guardian (direct)", gasUsed); + } + + async estimateAddGuardianRelayed() { + const gasUsed = await this.relayEstimate( + this.GuardianManagerWrapper, + "addGuardian", + [this.walletAddress, this.accounts[1]], this.wallet, [this.signers[0]], + ); + this._logger.addItem("Add a guardian (relayed)", gasUsed); + } + + async estimateRevokeGuardianRelayed() { + // add guardian + await this.relay(this.GuardianManagerWrapper, "addGuardian", + [this.walletAddress, this.accounts[1]], this.wallet, [this.signers[0]]); + + // estimate revoke guardian + const gasUsed = await this.relayEstimate( + this.GuardianManagerWrapper, + "revokeGuardian", + [this.walletAddress, this.accounts[1]], this.wallet, [this.signers[0]], + ); + this._logger.addItem("Revoke a guardian (relayed)", gasUsed); + } + + async estimateLockWalletDirect() { + // add guardian + const guardian = this.accounts[1]; + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, guardian); + + // estimate lock wallet + const gasUsed = await this.LockManagerWrapper.from(guardian).estimate.lock(this.walletAddress); + this._logger.addItem("Lock wallet (direct)", gasUsed); + } + + async estimateUnlockWalletDirect() { + // add guardian + const guardian = this.accounts[1]; + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, guardian); + + // lock wallet + await this.LockManagerWrapper.from(guardian).lock(this.walletAddress); + + // estimate unlock wallet + const gasUsed = await this.LockManagerWrapper.from(guardian).estimate.unlock(this.walletAddress); + this._logger.addItem("Unlock wallet (direct)", gasUsed); + } + + async estimateLockWalletRelayed() { + // add guardian + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); + + // estimate lock wallet + const gasUsed = await this.relayEstimate(this.LockManagerWrapper, "lock", + [this.walletAddress], this.wallet, [this.signers[1]]); + this._logger.addItem("Lock wallet (relayed)", gasUsed); + } + + async estimateUnlockWalletRelayed() { + // add guardian + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); + + // lock wallet + await this.relay(this.LockManagerWrapper, "lock", [this.walletAddress], this.wallet, [this.signers[1]]); + + // estimate unlock wallet + const gasUsed = await this.relayEstimate(this.LockManagerWrapper, "unlock", + [this.walletAddress], this.wallet, [this.signers[1]]); + this._logger.addItem("Unlock wallet (relayed)", gasUsed); + } + + async estimateExecuteRecovery() { + // add guardians + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[2]); + await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow / 2); + await this.GuardianManagerWrapper.confirmGuardianAddition(this.walletAddress, this.accounts[2]); + + // estimate execute recovery + const recoveryAddress = this.accounts[3]; + const signers = [this.signers[1], this.signers[2]]; + const gasUsed = await this.relayEstimate(this.RecoveryManagerWrapper, "executeRecovery", + [this.walletAddress, recoveryAddress], this.wallet, [signers[1]]); + this._logger.addItem("Execute recovery", gasUsed); + } + + async estimateChangeLimitDirect() { + const gasUsed = await this.TransferManagerWrapper.estimate.changeLimit(this.walletAddress, 4000000); + this._logger.addItem("Change limit (direct)", gasUsed); + } + + async estimateChangeLimitRelayed() { + const gasUsed = await this.relayEstimate(this.TransferManagerWrapper, "changeLimit", + [this.walletAddress, 67000000], this.wallet, [this.signers[0]]); + this._logger.addItem("Change limit (relayed)", gasUsed); + } + + async estimateETHTransferNoLimitDirect() { + // disable limit + await this.TransferManagerWrapper.disableLimit(this.walletAddress); + await this.testManager.increaseTime(this.config.settings.securityPeriod + 1); + + // transfer + const gasUsed = await this.TransferManagerWrapper.estimate.transferToken( + this.walletAddress, ETH_TOKEN, this.accounts[1], 1000000, "0x", + ); + this._logger.addItem("ETH transfer, limit disabled (direct)", gasUsed); + } + + async estimateTransferNoLimitRelayed() { + // disable limit + await this.TransferManagerWrapper.disableLimit(this.walletAddress); + await this.testManager.increaseTime(this.config.settings.securityPeriod + 1); + + // transfer + const gasUsed = await this.relayEstimate( + this.TransferManagerWrapper, + "transferToken", + [this.walletAddress, ETH_TOKEN, this.accounts[1], 1000000, "0x"], + this.wallet, [this.signers[0]], + ); + this._logger.addItem("ETH transfer, limit disabled (relayed)", gasUsed); + } + + async estimateETHSmallTransferDirect() { + await this.TransferManagerWrapper.transferToken(this.walletAddress, ETH_TOKEN, this.accounts[5], 200, "0x"); + const gasUsed = await this.TransferManagerWrapper.estimate.transferToken( + this.walletAddress, ETH_TOKEN, this.accounts[5], 200, "0x", + ); + this._logger.addItem("ETH small transfer (direct)", gasUsed); + } + + async estimateSmallTransferRelayed() { + const gasUsed = await this.relayEstimate( + this.TransferManagerWrapper, + "transferToken", + [this.walletAddress, ETH_TOKEN, this.accounts[1], 1000, "0x"], + this.wallet, + [this.signers[0]], + ); + this._logger.addItem("ETH small transfer (relayed)", gasUsed); + } + + async estimateETHTransferToWhitelistedAccountDirect() { + await this.TransferManagerWrapper.addToWhitelist(this.walletAddress, this.accounts[3]); + await this.testManager.increaseTime(this.config.settings.securityPeriod + 1); + + const gasUsed = await this.TransferManagerWrapper.estimate.transferToken( + this.walletAddress, ETH_TOKEN, this.accounts[3], 2000000, "0x", + ); + this._logger.addItem("ETH transfer to whitelisted account (direct)", gasUsed); + } + + async estimateTransferToWhitelistedAccountRelayed() { + await this.TransferManagerWrapper.addToWhitelist(this.walletAddress, this.accounts[3]); + await this.testManager.increaseTime(this.config.settings.securityPeriod + 1); + + const gasUsed = await this.relayEstimate( + this.TransferManagerWrapper, + "transferToken", + [this.walletAddress, ETH_TOKEN, this.accounts[3], 2000000, "0x"], + this.wallet, + [this.signers[0]], + ); + this._logger.addItem("ETH transfer to whitelisted account (relayed)", gasUsed); + } + + async estimateETHLargeTransferToUntrustedAccount() { + const gasUsed = await this.TransferManagerWrapper.estimate.transferToken( + this.walletAddress, ETH_TOKEN, this.accounts[2], 2000000, "0x", + ); + this._logger.addItem("ETH large transfer to untrusted account", gasUsed); + } + + // async estimateExecuteETHLargeTransferToUntrustedAccount() { + // const tx = await this.TokenTransferWrapper.transferToken(this.walletAddress, ETH_TOKEN, this.accounts[2], 2000000, "0x"); + // const result = await this.TokenTransferWrapper.verboseWaitForTransaction(tx, ''); + // const block = result.blockNumber; + // console.log(block); + + // await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow/2); + // const gasUsed = await this.TokenTransferWrapper.estimate.executePendingTransfer(this.walletAddress, ETH_TOKEN, this.accounts[2], 2000000, "0x", block); + // this._logger.addItem("Execute ETH large transfer to untrusted account", gasUsed); + // } + + async estimateLargeTransferApprovalByOneGuardian() { + // add guardian + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); + + // estimate approve large transfer + const gasUsed = await this.relayEstimate( + this.ApprovedTransferWrapper, + "transferToken", + [this.walletAddress, ETH_TOKEN, this.accounts[3], 2000000, "0x"], + this.wallet, + [this.signers[0], this.signers[1]], + ); + this._logger.addItem("ETH large transfer approval by one guardian", gasUsed); + } + + async estimateLargeTransferApprovalByTwoGuardians() { + // add 3 guardians + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[1]); + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[2]); + await this.GuardianManagerWrapper.addGuardian(this.walletAddress, this.accounts[3]); + + await this.testManager.increaseTime(this.config.settings.securityPeriod + this.config.settings.securityWindow / 2); + + await this.GuardianManagerWrapper.confirmGuardianAddition(this.walletAddress, this.accounts[2]); + await this.GuardianManagerWrapper.confirmGuardianAddition(this.walletAddress, this.accounts[3]); + + // estimate approve large transfer + const signers = [this.signers[0], this.signers[1], this.signers[2]]; + const gasUsed = await this.relayEstimate( + this.ApprovedTransferWrapper, + "transferToken", + [this.walletAddress, ETH_TOKEN, this.accounts[5], 2000000, "0x"], + this.wallet, + signers, + ); + this._logger.addItem("ETH large transfer approval by two guardians", gasUsed); + } + + // /////////////////// + // //// utils //////// + // /////////////////// + + async relay(target, method, params, wallet, signers, estimate = false) { + const result = await this.testManager.relay(target, method, params, wallet, signers, this.accounts[9], estimate); + return result; + } + + async relayEstimate(target, method, params, wallet, signers) { + const result = await this.relay(target, method, params, wallet, signers, true); + return result; + } + + getAllEstimateMethods() { + let props = []; + let obj = this; + + do { + props = props.concat(Object.getOwnPropertyNames(obj)); + obj = Object.getPrototypeOf(obj); + } while (obj); + + return props.filter((prop) => prop.startsWith("estimate")); + } + + async output() { + await this._logger.loadData(); + return this._logger.output(); + } } +const deploy = async (network) => { + const benchmark = new Benchmark(network); + await benchmark.setup(); + let methods = benchmark.getAllEstimateMethods(); + const argvMethods = process.argv.filter((x) => x.startsWith("estimate")); + if (argvMethods.length > 0) { + methods = methods.filter((method) => argvMethods.indexOf(method) >= 0); + } + + for (let index = 0; index < methods.length; index += 1) { + const method = methods[index]; + console.log(`Running ${method}...`); + await benchmark.setupWallet(); + await benchmark[method](); + } + + const output = await benchmark.output(); + console.log(output); +}; + module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/contracts/test/compound/CErc20.sol b/lib/compound/CErc20.sol similarity index 100% rename from contracts/test/compound/CErc20.sol rename to lib/compound/CErc20.sol diff --git a/contracts/test/compound/CEther.sol b/lib/compound/CEther.sol similarity index 100% rename from contracts/test/compound/CEther.sol rename to lib/compound/CEther.sol diff --git a/contracts/test/compound/CToken.sol b/lib/compound/CToken.sol similarity index 100% rename from contracts/test/compound/CToken.sol rename to lib/compound/CToken.sol diff --git a/contracts/test/compound/CarefulMath.sol b/lib/compound/CarefulMath.sol similarity index 100% rename from contracts/test/compound/CarefulMath.sol rename to lib/compound/CarefulMath.sol diff --git a/contracts/test/compound/Comptroller.sol b/lib/compound/Comptroller.sol similarity index 100% rename from contracts/test/compound/Comptroller.sol rename to lib/compound/Comptroller.sol diff --git a/contracts/test/compound/ComptrollerInterface.sol b/lib/compound/ComptrollerInterface.sol similarity index 100% rename from contracts/test/compound/ComptrollerInterface.sol rename to lib/compound/ComptrollerInterface.sol diff --git a/contracts/test/compound/ComptrollerStorage.sol b/lib/compound/ComptrollerStorage.sol similarity index 100% rename from contracts/test/compound/ComptrollerStorage.sol rename to lib/compound/ComptrollerStorage.sol diff --git a/contracts/test/compound/EIP20Interface.sol b/lib/compound/EIP20Interface.sol similarity index 100% rename from contracts/test/compound/EIP20Interface.sol rename to lib/compound/EIP20Interface.sol diff --git a/contracts/test/compound/EIP20NonStandardInterface.sol b/lib/compound/EIP20NonStandardInterface.sol similarity index 100% rename from contracts/test/compound/EIP20NonStandardInterface.sol rename to lib/compound/EIP20NonStandardInterface.sol diff --git a/contracts/test/compound/ErrorReporter.sol b/lib/compound/ErrorReporter.sol similarity index 100% rename from contracts/test/compound/ErrorReporter.sol rename to lib/compound/ErrorReporter.sol diff --git a/contracts/test/compound/Exponential.sol b/lib/compound/Exponential.sol similarity index 100% rename from contracts/test/compound/Exponential.sol rename to lib/compound/Exponential.sol diff --git a/contracts/test/compound/InterestRateModel.sol b/lib/compound/InterestRateModel.sol similarity index 100% rename from contracts/test/compound/InterestRateModel.sol rename to lib/compound/InterestRateModel.sol diff --git a/contracts/test/compound/Maximillion.sol b/lib/compound/Maximillion.sol similarity index 100% rename from contracts/test/compound/Maximillion.sol rename to lib/compound/Maximillion.sol diff --git a/contracts/test/compound/PriceOracle.sol b/lib/compound/PriceOracle.sol similarity index 100% rename from contracts/test/compound/PriceOracle.sol rename to lib/compound/PriceOracle.sol diff --git a/contracts/test/compound/PriceOracleProxy.sol b/lib/compound/PriceOracleProxy.sol similarity index 100% rename from contracts/test/compound/PriceOracleProxy.sol rename to lib/compound/PriceOracleProxy.sol diff --git a/contracts/test/compound/ReentrancyGuard.sol b/lib/compound/ReentrancyGuard.sol similarity index 100% rename from contracts/test/compound/ReentrancyGuard.sol rename to lib/compound/ReentrancyGuard.sol diff --git a/contracts/test/compound/SimplePriceOracle.sol b/lib/compound/SimplePriceOracle.sol similarity index 100% rename from contracts/test/compound/SimplePriceOracle.sol rename to lib/compound/SimplePriceOracle.sol diff --git a/contracts/test/compound/Unitroller.sol b/lib/compound/Unitroller.sol similarity index 100% rename from contracts/test/compound/Unitroller.sol rename to lib/compound/Unitroller.sol diff --git a/contracts/test/compound/WhitePaperInterestRateModel.sol b/lib/compound/WhitePaperInterestRateModel.sol similarity index 100% rename from contracts/test/compound/WhitePaperInterestRateModel.sol rename to lib/compound/WhitePaperInterestRateModel.sol diff --git a/contracts/test/maker/DS/DSAuth.sol b/lib/maker/DS/DSAuth.sol similarity index 100% rename from contracts/test/maker/DS/DSAuth.sol rename to lib/maker/DS/DSAuth.sol diff --git a/contracts/test/maker/DS/DSMath.sol b/lib/maker/DS/DSMath.sol similarity index 100% rename from contracts/test/maker/DS/DSMath.sol rename to lib/maker/DS/DSMath.sol diff --git a/contracts/test/maker/DS/DSNote.sol b/lib/maker/DS/DSNote.sol similarity index 100% rename from contracts/test/maker/DS/DSNote.sol rename to lib/maker/DS/DSNote.sol diff --git a/contracts/test/maker/DS/DSStop.sol b/lib/maker/DS/DSStop.sol similarity index 100% rename from contracts/test/maker/DS/DSStop.sol rename to lib/maker/DS/DSStop.sol diff --git a/contracts/test/maker/DS/DSThing.sol b/lib/maker/DS/DSThing.sol similarity index 100% rename from contracts/test/maker/DS/DSThing.sol rename to lib/maker/DS/DSThing.sol diff --git a/contracts/test/maker/DS/DSToken.sol b/lib/maker/DS/DSToken.sol similarity index 100% rename from contracts/test/maker/DS/DSToken.sol rename to lib/maker/DS/DSToken.sol diff --git a/contracts/test/maker/DS/DSValue.sol b/lib/maker/DS/DSValue.sol similarity index 100% rename from contracts/test/maker/DS/DSValue.sol rename to lib/maker/DS/DSValue.sol diff --git a/lib/maker/DssCdpManager.sol b/lib/maker/DssCdpManager.sol new file mode 100644 index 000000000..32cb28a9c --- /dev/null +++ b/lib/maker/DssCdpManager.sol @@ -0,0 +1,257 @@ +pragma solidity ^0.5.4; + +import { LibNote } from "./lib.sol"; + +contract VatLike { + function urns(bytes32, address) public view returns (uint, uint); + function hope(address) public; + function flux(bytes32, address, address, uint) public; + function move(address, address, uint) public; + function frob(bytes32, address, address, address, int, int) public; + function fork(bytes32, address, address, int, int) public; +} + +contract UrnHandler { + constructor(address vat) public { + VatLike(vat).hope(msg.sender); + } +} + +contract DssCdpManager is LibNote { + address public vat; + uint public cdpi; // Auto incremental + mapping (uint => address) public urns; // CDPId => UrnHandler + mapping (uint => List) public list; // CDPId => Prev & Next CDPIds (double linked list) + mapping (uint => address) public owns; // CDPId => Owner + mapping (uint => bytes32) public ilks; // CDPId => Ilk + + mapping (address => uint) public first; // Owner => First CDPId + mapping (address => uint) public last; // Owner => Last CDPId + mapping (address => uint) public count; // Owner => Amount of CDPs + + mapping ( + address => mapping ( + uint => mapping ( + address => uint + ) + ) + ) public cdpCan; // Owner => CDPId => Allowed Addr => True/False + + mapping ( + address => mapping ( + address => uint + ) + ) public urnCan; // Urn => Allowed Addr => True/False + + struct List { + uint prev; + uint next; + } + + event NewCdp(address indexed usr, address indexed own, uint indexed cdp); + + modifier cdpAllowed( + uint cdp + ) { + require(msg.sender == owns[cdp] || cdpCan[owns[cdp]][cdp][msg.sender] == 1, "cdp-not-allowed"); + _; + } + + modifier urnAllowed( + address urn + ) { + require(msg.sender == urn || urnCan[urn][msg.sender] == 1, "urn-not-allowed"); + _; + } + + constructor(address vat_) public { + vat = vat_; + } + + function add(uint x, uint y) internal pure returns (uint z) { + require((z = x + y) >= x); + } + + function sub(uint x, uint y) internal pure returns (uint z) { + require((z = x - y) <= x); + } + + function toInt(uint x) internal pure returns (int y) { + y = int(x); + require(y >= 0); + } + + // Allow/disallow a usr address to manage the cdp. + function cdpAllow( + uint cdp, + address usr, + uint ok + ) public cdpAllowed(cdp) { + cdpCan[owns[cdp]][cdp][usr] = ok; + } + + // Allow/disallow a usr address to quit to the the sender urn. + function urnAllow( + address usr, + uint ok + ) public { + urnCan[msg.sender][usr] = ok; + } + + // Open a new cdp for a given usr address. + function open( + bytes32 ilk, + address usr + ) public note returns (uint) { + require(usr != address(0), "usr-address-0"); + + cdpi = add(cdpi, 1); + urns[cdpi] = address(new UrnHandler(vat)); + owns[cdpi] = usr; + ilks[cdpi] = ilk; + + // Add new CDP to double linked list and pointers + if (first[usr] == 0) { + first[usr] = cdpi; + } + if (last[usr] != 0) { + list[cdpi].prev = last[usr]; + list[last[usr]].next = cdpi; + } + last[usr] = cdpi; + count[usr] = add(count[usr], 1); + + emit NewCdp(msg.sender, usr, cdpi); + return cdpi; + } + + // Give the cdp ownership to a dst address. + function give( + uint cdp, + address dst + ) public note cdpAllowed(cdp) { + require(dst != address(0), "dst-address-0"); + require(dst != owns[cdp], "dst-already-owner"); + + // Remove transferred CDP from double linked list of origin user and pointers + if (list[cdp].prev != 0) { + list[list[cdp].prev].next = list[cdp].next; // Set the next pointer of the prev cdp (if exists) to the next of the transferred one + } + if (list[cdp].next != 0) { // If wasn't the last one + list[list[cdp].next].prev = list[cdp].prev; // Set the prev pointer of the next cdp to the prev of the transferred one + } else { // If was the last one + last[owns[cdp]] = list[cdp].prev; // Update last pointer of the owner + } + if (first[owns[cdp]] == cdp) { // If was the first one + first[owns[cdp]] = list[cdp].next; // Update first pointer of the owner + } + count[owns[cdp]] = sub(count[owns[cdp]], 1); + + // Transfer ownership + owns[cdp] = dst; + + // Add transferred CDP to double linked list of destiny user and pointers + list[cdp].prev = last[dst]; + list[cdp].next = 0; + if (last[dst] != 0) { + list[last[dst]].next = cdp; + } + if (first[dst] == 0) { + first[dst] = cdp; + } + last[dst] = cdp; + count[dst] = add(count[dst], 1); + } + + // Frob the cdp keeping the generated DAI or collateral freed in the cdp urn address. + function frob( + uint cdp, + int dink, + int dart + ) public note cdpAllowed(cdp) { + address urn = urns[cdp]; + VatLike(vat).frob( + ilks[cdp], + urn, + urn, + urn, + dink, + dart + ); + } + + // Transfer wad amount of cdp collateral from the cdp address to a dst address. + function flux( + uint cdp, + address dst, + uint wad + ) public note cdpAllowed(cdp) { + VatLike(vat).flux(ilks[cdp], urns[cdp], dst, wad); + } + + // Transfer wad amount of any type of collateral (ilk) from the cdp address to a dst address. + // This function has the purpose to take away collateral from the system that doesn't correspond to the cdp but was sent there wrongly. + function flux( + bytes32 ilk, + uint cdp, + address dst, + uint wad + ) public note cdpAllowed(cdp) { + VatLike(vat).flux(ilk, urns[cdp], dst, wad); + } + + // Transfer wad amount of DAI from the cdp address to a dst address. + function move( + uint cdp, + address dst, + uint rad + ) public note cdpAllowed(cdp) { + VatLike(vat).move(urns[cdp], dst, rad); + } + + // Quit the system, migrating the cdp (ink, art) to a different dst urn + function quit( + uint cdp, + address dst + ) public note cdpAllowed(cdp) urnAllowed(dst) { + (uint ink, uint art) = VatLike(vat).urns(ilks[cdp], urns[cdp]); + VatLike(vat).fork( + ilks[cdp], + urns[cdp], + dst, + toInt(ink), + toInt(art) + ); + } + + // Import a position from src urn to the urn owned by cdp + function enter( + address src, + uint cdp + ) public note urnAllowed(src) cdpAllowed(cdp) { + (uint ink, uint art) = VatLike(vat).urns(ilks[cdp], src); + VatLike(vat).fork( + ilks[cdp], + src, + urns[cdp], + toInt(ink), + toInt(art) + ); + } + + // Move a position from cdpSrc urn to the cdpDst urn + function shift( + uint cdpSrc, + uint cdpDst + ) public note cdpAllowed(cdpSrc) cdpAllowed(cdpDst) { + require(ilks[cdpSrc] == ilks[cdpDst], "non-matching-cdps"); + (uint ink, uint art) = VatLike(vat).urns(ilks[cdpSrc], urns[cdpSrc]); + VatLike(vat).fork( + ilks[cdpSrc], + urns[cdpSrc], + urns[cdpDst], + toInt(ink), + toInt(art) + ); + } +} \ No newline at end of file diff --git a/lib/maker/MakerInterfaces.sol b/lib/maker/MakerInterfaces.sol new file mode 100644 index 000000000..085dfb896 --- /dev/null +++ b/lib/maker/MakerInterfaces.sol @@ -0,0 +1,92 @@ +pragma solidity ^0.5.4; + +contract GemLike { + function balanceOf(address) public view returns (uint); + function transferFrom(address, address, uint) public returns (bool); + function approve(address, uint) public returns (bool success); + function decimals() public view returns (uint); + function transfer(address,uint) external returns (bool); +} + +contract DSTokenLike { + function mint(address,uint) external; + function burn(address,uint) external; +} + +contract VatLike { + function can(address, address) public view returns (uint); + function dai(address) public view returns (uint); + function hope(address) public; + function wards(address) public view returns (uint); + function ilks(bytes32) public view returns (uint Art, uint rate, uint spot, uint line, uint dust); + function urns(bytes32, address) public view returns (uint ink, uint art); + function frob(bytes32, address, address, address, int, int) public; + function slip(bytes32,address,int) external; + function move(address,address,uint) external; +} + +contract JoinLike { + function ilk() public view returns (bytes32); + function gem() public view returns (GemLike); + function dai() public view returns (GemLike); + function join(address, uint) public; + function exit(address, uint) public; + VatLike public vat; + uint public live; +} + +contract ManagerLike { + function vat() public view returns (address); + function urns(uint) public view returns (address); + function open(bytes32, address) public returns (uint); + function frob(uint, int, int) public; + function give(uint, address) public; + function move(uint, address, uint) public; + function flux(uint, address, uint) public; + function shift(uint, uint) public; + mapping (uint => bytes32) public ilks; + mapping (uint => address) public owns; +} + +contract ScdMcdMigrationLike { + function swapSaiToDai(uint) public; + function swapDaiToSai(uint) public; + function migrate(bytes32) public returns (uint); + JoinLike public saiJoin; + JoinLike public wethJoin; + JoinLike public daiJoin; + ManagerLike public cdpManager; + SaiTubLike public tub; +} + +contract ValueLike { + function peek() public returns (uint, bool); +} + +contract SaiTubLike { + function skr() public view returns (GemLike); + function gem() public view returns (GemLike); + function gov() public view returns (GemLike); + function sai() public view returns (GemLike); + function pep() public view returns (ValueLike); + function bid(uint) public view returns (uint); + function ink(bytes32) public view returns (uint); + function tab(bytes32) public returns (uint); + function rap(bytes32) public returns (uint); + function shut(bytes32) public; + function exit(uint) public; +} + +contract VoxLike { + function par() public returns (uint); +} + +contract JugLike { + function drip(bytes32) external; +} + +contract PotLike { + function chi() public view returns (uint); + function pie(address) public view returns (uint); + function drip() public; +} \ No newline at end of file diff --git a/lib/maker/MockScdMcdMigration.sol b/lib/maker/MockScdMcdMigration.sol new file mode 100644 index 000000000..1bc7b0956 --- /dev/null +++ b/lib/maker/MockScdMcdMigration.sol @@ -0,0 +1,63 @@ +pragma solidity ^0.5.4; + +import "./MakerInterfaces.sol"; + +contract MockVat is VatLike { + function can(address, address) public view returns (uint) { return 1; } + function dai(address) public view returns (uint) { return 0; } + function hope(address) public {} + function wards(address) public view returns (uint) { return 1; } + function ilks(bytes32) public view returns (uint, uint, uint, uint, uint) { return (0, 0, 0, 0, 0); } + function urns(bytes32, address) public view returns (uint, uint) { return (0, 0); } + function frob(bytes32, address, address, address, int, int) public {} + function slip(bytes32,address,int) external {} + function move(address,address,uint) external {} +} + +contract MockTub is SaiTubLike { + function gov() public view returns (GemLike) { return GemLike(address(0)); } + function skr() public view returns (GemLike) { return GemLike(address(0)); } + function gem() public view returns (GemLike) { return GemLike(address(0)); } + function sai() public view returns (GemLike) { return GemLike(address(0)); } + function pep() public view returns (ValueLike) { return ValueLike(address(0)); } + function rap(bytes32) public returns (uint) { return 0; } + function give(bytes32, address) public {} + function tab(bytes32) public returns (uint) { return 0; } + function bid(uint) public view returns (uint) { return 0; } + function ink(bytes32) public view returns (uint) { return 0; } + function shut(bytes32) public {} + function exit(uint) public {} +} + +contract MockJoin is JoinLike { + MockVat public vat; + constructor (MockVat _vat) public { vat = _vat; } + function ilk() public view returns (bytes32) { return bytes32(0); } + function gem() public view returns (GemLike) { return GemLike(address(0)); } + function dai() public view returns (GemLike) { return GemLike(address(0)); } + function join(address, uint) public {} + function exit(address, uint) public {} +} + +/** + * @title MockScdMcdMigration + * @dev Mock contract needed to deploy the MakerV2Manager contract + */ +contract MockScdMcdMigration { + + MockJoin public daiJoin; + MockJoin public wethJoin; + MockTub public tub; + ManagerLike public cdpManager; + MockVat public vat; + + constructor (address _vat, address _daiJoin, address _wethJoin, address _tub, address _cdpManager) public { + vat = (_vat != address(0)) ? MockVat(_vat) : new MockVat(); + daiJoin = (_daiJoin != address(0)) ? MockJoin(_daiJoin) : new MockJoin(vat); + wethJoin = (_wethJoin != address(0)) ? MockJoin(_wethJoin) : new MockJoin(vat); + tub = (_tub != address(0)) ? MockTub(_tub) : new MockTub(); + if (_cdpManager != address(0)) { + cdpManager = ManagerLike(_cdpManager); + } + } +} \ No newline at end of file diff --git a/contracts/test/maker/SaiTub.sol b/lib/maker/SaiTub.sol similarity index 99% rename from contracts/test/maker/SaiTub.sol rename to lib/maker/SaiTub.sol index af6ac74ce..450b8559c 100644 --- a/contracts/test/maker/SaiTub.sol +++ b/lib/maker/SaiTub.sol @@ -22,7 +22,7 @@ pragma solidity ^0.5.4; import "./DS/DSThing.sol"; import "./DS/DSToken.sol"; import "./DS/DSValue.sol"; -import "../../exchange/ERC20.sol"; +import "../other/ERC20.sol"; import "./SaiVox.sol"; diff --git a/contracts/test/maker/SaiVox.sol b/lib/maker/SaiVox.sol similarity index 100% rename from contracts/test/maker/SaiVox.sol rename to lib/maker/SaiVox.sol diff --git a/lib/maker/ScdMcdMigration.sol b/lib/maker/ScdMcdMigration.sol new file mode 100644 index 000000000..b012d95e7 --- /dev/null +++ b/lib/maker/ScdMcdMigration.sol @@ -0,0 +1,143 @@ +pragma solidity ^0.5.4; + +import { JoinLike, ManagerLike, SaiTubLike, VatLike } from "./MakerInterfaces.sol"; + +contract ScdMcdMigration { + SaiTubLike public tub; + VatLike public vat; + ManagerLike public cdpManager; + JoinLike public saiJoin; + JoinLike public wethJoin; + JoinLike public daiJoin; + + constructor( + address tub_, // SCD tub contract address + address cdpManager_, // MCD manager contract address + address saiJoin_, // MCD SAI collateral adapter contract address + address wethJoin_, // MCD ETH collateral adapter contract address + address daiJoin_ // MCD DAI adapter contract address + ) public { + tub = SaiTubLike(tub_); + cdpManager = ManagerLike(cdpManager_); + vat = VatLike(cdpManager.vat()); + saiJoin = JoinLike(saiJoin_); + wethJoin = JoinLike(wethJoin_); + daiJoin = JoinLike(daiJoin_); + + require(wethJoin.gem() == tub.gem(), "non-matching-weth"); + require(saiJoin.gem() == tub.sai(), "non-matching-sai"); + + tub.gov().approve(address(tub), uint(-1)); + tub.skr().approve(address(tub), uint(-1)); + tub.sai().approve(address(tub), uint(-1)); + tub.sai().approve(address(saiJoin), uint(-1)); + wethJoin.gem().approve(address(wethJoin), uint(-1)); + daiJoin.dai().approve(address(daiJoin), uint(-1)); + vat.hope(address(daiJoin)); + } + + function add(uint x, uint y) internal pure returns (uint z) { + require((z = x + y) >= x, "add-overflow"); + } + + function sub(uint x, uint y) internal pure returns (uint z) { + require((z = x - y) <= x, "sub-underflow"); + } + + function mul(uint x, uint y) internal pure returns (uint z) { + require(y == 0 || (z = x * y) / y == x, "mul-overflow"); + } + + function toInt(uint x) internal pure returns (int y) { + y = int(x); + require(y >= 0, "int-overflow"); + } + + // Function to swap SAI to DAI + // This function is to be used by users that want to get new DAI in exchange of old one (aka SAI) + // wad amount has to be <= the value pending to reach the debt ceiling (the minimum between general and ilk one) + function swapSaiToDai( + uint wad + ) external { + // Get wad amount of SAI from user's wallet: + saiJoin.gem().transferFrom(msg.sender, address(this), wad); + // Join the SAI wad amount to the `vat`: + saiJoin.join(address(this), wad); + // Lock the SAI wad amount to the CDP and generate the same wad amount of DAI + vat.frob(saiJoin.ilk(), address(this), address(this), address(this), toInt(wad), toInt(wad)); + // Send DAI wad amount as a ERC20 token to the user's wallet + daiJoin.exit(msg.sender, wad); + } + + // Function to swap DAI to SAI + // This function is to be used by users that want to get SAI in exchange of DAI + // wad amount has to be <= the amount of SAI locked (and DAI generated) in the migration contract SAI CDP + function swapDaiToSai( + uint wad + ) external { + // Get wad amount of DAI from user's wallet: + daiJoin.dai().transferFrom(msg.sender, address(this), wad); + // Join the DAI wad amount to the vat: + daiJoin.join(address(this), wad); + // Payback the DAI wad amount and unlocks the same value of SAI collateral + vat.frob(saiJoin.ilk(), address(this), address(this), address(this), -toInt(wad), -toInt(wad)); + // Send SAI wad amount as a ERC20 token to the user's wallet + saiJoin.exit(msg.sender, wad); + } + + // Function to migrate a SCD CDP to MCD one (needs to be used via a proxy so the code can be kept simpler). Check MigrationProxyActions.sol code for usage. + // In order to use migrate function, SCD CDP debtAmt needs to be <= SAI previously deposited in the SAI CDP * (100% - Collateralization Ratio) + function migrate( + bytes32 cup + ) external returns (uint cdp) { + // Get values + uint debtAmt = tub.tab(cup); // CDP SAI debt + uint pethAmt = tub.ink(cup); // CDP locked collateral + uint ethAmt = tub.bid(pethAmt); // CDP locked collateral equiv in ETH + + // Take SAI out from MCD SAI CDP. For this operation is necessary to have a very low collateralization ratio + // This is not actually a problem as this ilk will only be accessed by this migration contract, + // which will make sure to have the amounts balanced out at the end of the execution. + vat.frob( + bytes32(saiJoin.ilk()), + address(this), + address(this), + address(this), + -toInt(debtAmt), + 0 + ); + saiJoin.exit(address(this), debtAmt); // SAI is exited as a token + + // Shut SAI CDP and gets WETH back + tub.shut(cup); // CDP is closed using the SAI just exited and the MKR previously sent by the user (via the proxy call) + tub.exit(pethAmt); // Converts PETH to WETH + + // Open future user's CDP in MCD + cdp = cdpManager.open(wethJoin.ilk(), address(this)); + + // Join WETH to Adapter + wethJoin.join(cdpManager.urns(cdp), ethAmt); + + // Lock WETH in future user's CDP and generate debt to compensate the SAI used to paid the SCD CDP + (, uint rate,,,) = vat.ilks(wethJoin.ilk()); + cdpManager.frob( + cdp, + toInt(ethAmt), + toInt(mul(debtAmt, 10 ** 27) / rate + 1) // To avoid rounding issues we add an extra wei of debt + ); + // Move DAI generated to migration contract (to recover the used funds) + cdpManager.move(cdp, address(this), mul(debtAmt, 10 ** 27)); + // Re-balance MCD SAI migration contract's CDP + vat.frob( + bytes32(saiJoin.ilk()), + address(this), + address(this), + address(this), + 0, + -toInt(debtAmt) + ); + + // Set ownership of CDP to the user + cdpManager.give(cdp, msg.sender); + } +} \ No newline at end of file diff --git a/contracts/test/maker/WETH9.sol b/lib/maker/WETH9.sol similarity index 100% rename from contracts/test/maker/WETH9.sol rename to lib/maker/WETH9.sol diff --git a/lib/maker/dai.sol b/lib/maker/dai.sol new file mode 100644 index 000000000..1af65c449 --- /dev/null +++ b/lib/maker/dai.sol @@ -0,0 +1,141 @@ +// Copyright (C) 2017, 2018, 2019 dbrock, rain, mrchico + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; + +import "./lib.sol"; + +contract Dai is LibNote { + // --- Auth --- + mapping (address => uint) public wards; + function rely(address guy) external note auth { wards[guy] = 1; } + function deny(address guy) external note auth { wards[guy] = 0; } + modifier auth { + require(wards[msg.sender] == 1, "Dai/not-authorized"); + _; + } + + // --- ERC20 Data --- + string public constant name = "Dai Stablecoin"; + string public constant symbol = "DAI"; + string public constant version = "1"; + uint8 public constant decimals = 18; + uint256 public totalSupply; + + mapping (address => uint) public balanceOf; + mapping (address => mapping (address => uint)) public allowance; + mapping (address => uint) public nonces; + + event Approval(address indexed src, address indexed guy, uint wad); + event Transfer(address indexed src, address indexed dst, uint wad); + + // --- Math --- + function add(uint x, uint y) internal pure returns (uint z) { + require((z = x + y) >= x); + } + function sub(uint x, uint y) internal pure returns (uint z) { + require((z = x - y) <= x); + } + + // --- EIP712 niceties --- + bytes32 public DOMAIN_SEPARATOR; + // bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)"); + bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb; + + constructor(uint256 chainId_) public { + wards[msg.sender] = 1; + DOMAIN_SEPARATOR = keccak256(abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(name)), + keccak256(bytes(version)), + chainId_, + address(this) + )); + } + + // --- Token --- + function transfer(address dst, uint wad) external returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + function transferFrom(address src, address dst, uint wad) + public returns (bool) + { + require(balanceOf[src] >= wad, "Dai/insufficient-balance"); + if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { + require(allowance[src][msg.sender] >= wad, "Dai/insufficient-allowance"); + allowance[src][msg.sender] = sub(allowance[src][msg.sender], wad); + } + balanceOf[src] = sub(balanceOf[src], wad); + balanceOf[dst] = add(balanceOf[dst], wad); + emit Transfer(src, dst, wad); + return true; + } + function mint(address usr, uint wad) external auth { + balanceOf[usr] = add(balanceOf[usr], wad); + totalSupply = add(totalSupply, wad); + emit Transfer(address(0), usr, wad); + } + function burn(address usr, uint wad) external { + require(balanceOf[usr] >= wad, "Dai/insufficient-balance"); + if (usr != msg.sender && allowance[usr][msg.sender] != uint(-1)) { + require(allowance[usr][msg.sender] >= wad, "Dai/insufficient-allowance"); + allowance[usr][msg.sender] = sub(allowance[usr][msg.sender], wad); + } + balanceOf[usr] = sub(balanceOf[usr], wad); + totalSupply = sub(totalSupply, wad); + emit Transfer(usr, address(0), wad); + } + function approve(address usr, uint wad) external returns (bool) { + allowance[msg.sender][usr] = wad; + emit Approval(msg.sender, usr, wad); + return true; + } + + // --- Alias --- + function push(address usr, uint wad) external { + transferFrom(msg.sender, usr, wad); + } + function pull(address usr, uint wad) external { + transferFrom(usr, msg.sender, wad); + } + function move(address src, address dst, uint wad) external { + transferFrom(src, dst, wad); + } + + // --- Approve by signature --- + function permit(address holder, address spender, uint256 nonce, uint256 expiry, + bool allowed, uint8 v, bytes32 r, bytes32 s) external + { + bytes32 digest = + keccak256(abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR, + keccak256(abi.encode(PERMIT_TYPEHASH, + holder, + spender, + nonce, + expiry, + allowed)) + )); + + require(holder != address(0), "Dai/invalid-address-0"); + require(holder == ecrecover(digest, v, r, s), "Dai/invalid-permit"); + require(expiry == 0 || now <= expiry, "Dai/permit-expired"); + require(nonce == nonces[holder]++, "Dai/invalid-nonce"); + uint wad = allowed ? uint(-1) : 0; + allowance[holder][spender] = wad; + emit Approval(holder, spender, wad); + } +} \ No newline at end of file diff --git a/lib/maker/join.sol b/lib/maker/join.sol new file mode 100644 index 000000000..ead0d6e2e --- /dev/null +++ b/lib/maker/join.sol @@ -0,0 +1,158 @@ +/// join.sol -- Basic token adapters + +// Copyright (C) 2018 Rain +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; + +import "./lib.sol"; +import "./MakerInterfaces.sol"; + +/* + Here we provide *adapters* to connect the Vat to arbitrary external + token implementations, creating a bounded context for the Vat. The + adapters here are provided as working examples: + + - `GemJoin`: For well behaved ERC20 tokens, with simple transfer + semantics. + + - `ETHJoin`: For native Ether. + + - `DaiJoin`: For connecting internal Dai balances to an external + `DSToken` implementation. + + In practice, adapter implementations will be varied and specific to + individual collateral types, accounting for different transfer + semantics and token standards. + + Adapters need to implement two basic methods: + + - `join`: enter collateral into the system + - `exit`: remove collateral from the system + +*/ + +contract GemJoin is LibNote { + // --- Auth --- + mapping (address => uint) public wards; + function rely(address usr) external note auth { wards[usr] = 1; } + function deny(address usr) external note auth { wards[usr] = 0; } + modifier auth { + require(wards[msg.sender] == 1, "GemJoin/not-authorized"); + _; + } + + VatLike public vat; + bytes32 public ilk; + GemLike public gem; + uint public dec; + uint public live; // Access Flag + + constructor(address vat_, bytes32 ilk_, address gem_) public { + wards[msg.sender] = 1; + live = 1; + vat = VatLike(vat_); + ilk = ilk_; + gem = GemLike(gem_); + dec = gem.decimals(); + } + function cage() external note auth { + live = 0; + } + function join(address usr, uint wad) external note { + require(live == 1, "GemJoin/not-live"); + require(int(wad) >= 0, "GemJoin/overflow"); + vat.slip(ilk, usr, int(wad)); + require(gem.transferFrom(msg.sender, address(this), wad), "GemJoin/failed-transfer"); + } + function exit(address usr, uint wad) external note { + require(wad <= 2 ** 255, "GemJoin/overflow"); + vat.slip(ilk, msg.sender, -int(wad)); + require(gem.transfer(usr, wad), "GemJoin/failed-transfer"); + } +} + +contract ETHJoin is LibNote { + // --- Auth --- + mapping (address => uint) public wards; + function rely(address usr) external note auth { wards[usr] = 1; } + function deny(address usr) external note auth { wards[usr] = 0; } + modifier auth { + require(wards[msg.sender] == 1, "ETHJoin/not-authorized"); + _; + } + + VatLike public vat; + bytes32 public ilk; + uint public live; // Access Flag + + constructor(address vat_, bytes32 ilk_) public { + wards[msg.sender] = 1; + live = 1; + vat = VatLike(vat_); + ilk = ilk_; + } + function cage() external note auth { + live = 0; + } + function join(address usr) external payable note { + require(live == 1, "ETHJoin/not-live"); + require(int(msg.value) >= 0, "ETHJoin/overflow"); + vat.slip(ilk, usr, int(msg.value)); + } + function exit(address payable usr, uint wad) external note { + require(int(wad) >= 0, "ETHJoin/overflow"); + vat.slip(ilk, msg.sender, -int(wad)); + usr.transfer(wad); + } +} + +contract DaiJoin is LibNote { + // --- Auth --- + mapping (address => uint) public wards; + function rely(address usr) external note auth { wards[usr] = 1; } + function deny(address usr) external note auth { wards[usr] = 0; } + modifier auth { + require(wards[msg.sender] == 1, "DaiJoin/not-authorized"); + _; + } + + VatLike public vat; + DSTokenLike public dai; + uint public live; // Access Flag + + constructor(address vat_, address dai_) public { + wards[msg.sender] = 1; + live = 1; + vat = VatLike(vat_); + dai = DSTokenLike(dai_); + } + function cage() external note auth { + live = 0; + } + uint constant ONE = 10 ** 27; + function mul(uint x, uint y) internal pure returns (uint z) { + require(y == 0 || (z = x * y) / y == x); + } + function join(address usr, uint wad) external note { + vat.move(address(this), usr, mul(ONE, wad)); + dai.burn(msg.sender, wad); + } + function exit(address usr, uint wad) external note { + require(live == 1, "DaiJoin/not-live"); + vat.move(msg.sender, address(this), mul(ONE, wad)); + dai.mint(usr, wad); + } +} \ No newline at end of file diff --git a/lib/maker/jug.sol b/lib/maker/jug.sol new file mode 100644 index 000000000..33a7788e7 --- /dev/null +++ b/lib/maker/jug.sol @@ -0,0 +1,108 @@ +pragma solidity ^0.5.4; + +import "./lib.sol"; + +contract VatLike { + function ilks(bytes32) external returns ( + uint256 Art, // wad + uint256 rate // ray + ); + function fold(bytes32,address,int) external; +} + +contract Jug is LibNote { + // --- Auth --- + mapping (address => uint) public wards; + function rely(address usr) external note auth { wards[usr] = 1; } + function deny(address usr) external note auth { wards[usr] = 0; } + modifier auth { + require(wards[msg.sender] == 1, "Jug/not-authorized"); + _; + } + + // --- Data --- + struct Ilk { + uint256 duty; + uint256 rho; + } + + mapping (bytes32 => Ilk) public ilks; + VatLike public vat; + address public vow; + uint256 public base; + + // --- Init --- + constructor(address vat_) public { + wards[msg.sender] = 1; + vat = VatLike(vat_); + } + + // --- Math --- + function rpow(uint x, uint n, uint b) internal pure returns (uint z) { + assembly { + switch x case 0 {switch n case 0 {z := b} default {z := 0}} + default { + switch mod(n, 2) case 0 { z := b } default { z := x } + let half := div(b, 2) // for rounding. + for { n := div(n, 2) } n { n := div(n,2) } { + let xx := mul(x, x) + if iszero(eq(div(xx, x), x)) { revert(0,0) } + let xxRound := add(xx, half) + if lt(xxRound, xx) { revert(0,0) } + x := div(xxRound, b) + if mod(n,2) { + let zx := mul(z, x) + if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) } + let zxRound := add(zx, half) + if lt(zxRound, zx) { revert(0,0) } + z := div(zxRound, b) + } + } + } + } + } + uint256 constant ONE = 10 ** 27; + function add(uint x, uint y) internal pure returns (uint z) { + z = x + y; + require(z >= x); + } + function diff(uint x, uint y) internal pure returns (int z) { + z = int(x) - int(y); + require(int(x) >= 0 && int(y) >= 0); + } + function rmul(uint x, uint y) internal pure returns (uint z) { + z = x * y; + require(y == 0 || z / y == x); + z = z / ONE; + } + + // --- Administration --- + function init(bytes32 ilk) external note auth { + Ilk storage i = ilks[ilk]; + require(i.duty == 0, "Jug/ilk-already-init"); + i.duty = ONE; + i.rho = now; + } + function file(bytes32 ilk, bytes32 what, uint data) external note auth { + require(now == ilks[ilk].rho, "Jug/rho-not-updated"); + if (what == "duty") ilks[ilk].duty = data; + else revert("Jug/file-unrecognized-param"); + } + function file(bytes32 what, uint data) external note auth { + if (what == "base") base = data; + else revert("Jug/file-unrecognized-param"); + } + function file(bytes32 what, address data) external note auth { + if (what == "vow") vow = data; + else revert("Jug/file-unrecognized-param"); + } + + // --- Stability Fee Collection --- + function drip(bytes32 ilk) external note returns (uint rate) { + require(now >= ilks[ilk].rho, "Jug/invalid-now"); + (, uint prev) = vat.ilks(ilk); + rate = rmul(rpow(add(base, ilks[ilk].duty), now - ilks[ilk].rho, ONE), prev); + vat.fold(ilk, vow, diff(rate, prev)); + ilks[ilk].rho = now; + } +} \ No newline at end of file diff --git a/lib/maker/lib.sol b/lib/maker/lib.sol new file mode 100644 index 000000000..a600e9cd0 --- /dev/null +++ b/lib/maker/lib.sol @@ -0,0 +1,43 @@ +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; + +contract LibNote { + event LogNote( + bytes4 indexed sig, + address indexed usr, + bytes32 indexed arg1, + bytes32 indexed arg2, + bytes data + ) anonymous; + + modifier note { + _; + assembly { + // log an 'anonymous' event with a constant 6 words of calldata + // and four indexed topics: selector, caller, arg1 and arg2 + let mark := msize // end of memory ensures zero + mstore(0x40, add(mark, 288)) // update free memory pointer + mstore(mark, 0x20) // bytes type data offset + mstore(add(mark, 0x20), 224) // bytes size (padded) + calldatacopy(add(mark, 0x40), 0, 224) // bytes payload + log4(mark, 288, // calldata + shl(224, shr(224, calldataload(0))), // msg.sig + caller, // msg.sender + calldataload(4), // arg1 + calldataload(36) // arg2 + ) + } + } +} \ No newline at end of file diff --git a/lib/maker/pot.sol b/lib/maker/pot.sol new file mode 100644 index 000000000..8b618f0a3 --- /dev/null +++ b/lib/maker/pot.sol @@ -0,0 +1,162 @@ +/// pot.sol -- Dai Savings Rate + +// Copyright (C) 2018 Rain +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; + +import "./lib.sol"; + +/* + "Savings Dai" is obtained when Dai is deposited into + this contract. Each "Savings Dai" accrues Dai interest + at the "Dai Savings Rate". + + This contract does not implement a user tradeable token + and is intended to be used with adapters. + + --- `save` your `dai` in the `pot` --- + + - `dsr`: the Dai Savings Rate + - `pie`: user balance of Savings Dai + + - `join`: start saving some dai + - `exit`: remove some dai + - `drip`: perform rate collection + +*/ + +contract VatLike { + function move(address,address,uint256) external; + function suck(address,address,uint256) external; +} + +contract Pot is LibNote { + // --- Auth --- + mapping (address => uint) public wards; + function rely(address guy) external note auth { wards[guy] = 1; } + function deny(address guy) external note auth { wards[guy] = 0; } + modifier auth { + require(wards[msg.sender] == 1, "Pot/not-authorized"); + _; + } + + // --- Data --- + mapping (address => uint256) public pie; // user Savings Dai + + uint256 public Pie; // total Savings Dai + uint256 public dsr; // the Dai Savings Rate + uint256 public chi; // the Rate Accumulator + + VatLike public vat; // CDP engine + address public vow; // debt engine + uint256 public rho; // time of last drip + + uint256 public live; // Access Flag + + // --- Init --- + constructor(address vat_) public { + wards[msg.sender] = 1; + vat = VatLike(vat_); + dsr = ONE; + chi = ONE; + rho = now; + live = 1; + } + + // --- Math --- + uint256 constant ONE = 10 ** 27; + function rpow(uint x, uint n, uint base) internal pure returns (uint z) { + assembly { + switch x case 0 {switch n case 0 {z := base} default {z := 0}} + default { + switch mod(n, 2) case 0 { z := base } default { z := x } + let half := div(base, 2) // for rounding. + for { n := div(n, 2) } n { n := div(n,2) } { + let xx := mul(x, x) + if iszero(eq(div(xx, x), x)) { revert(0,0) } + let xxRound := add(xx, half) + if lt(xxRound, xx) { revert(0,0) } + x := div(xxRound, base) + if mod(n,2) { + let zx := mul(z, x) + if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) } + let zxRound := add(zx, half) + if lt(zxRound, zx) { revert(0,0) } + z := div(zxRound, base) + } + } + } + } + } + + function rmul(uint x, uint y) internal pure returns (uint z) { + z = mul(x, y) / ONE; + } + + function add(uint x, uint y) internal pure returns (uint z) { + require((z = x + y) >= x); + } + + function sub(uint x, uint y) internal pure returns (uint z) { + require((z = x - y) <= x); + } + + function mul(uint x, uint y) internal pure returns (uint z) { + require(y == 0 || (z = x * y) / y == x); + } + + // --- Administration --- + function file(bytes32 what, uint256 data) external note auth { + require(live == 1, "Pot/not-live"); + require(now == rho, "Pot/rho-not-updated"); + if (what == "dsr") dsr = data; + else revert("Pot/file-unrecognized-param"); + } + + function file(bytes32 what, address addr) external note auth { + if (what == "vow") vow = addr; + else revert("Pot/file-unrecognized-param"); + } + + function cage() external note auth { + live = 0; + dsr = ONE; + } + + // --- Savings Rate Accumulation --- + function drip() external note returns (uint tmp) { + require(now >= rho, "Pot/invalid-now"); + tmp = rmul(rpow(dsr, now - rho, ONE), chi); + uint chi_ = sub(tmp, chi); + chi = tmp; + rho = now; + vat.suck(address(vow), address(this), mul(Pie, chi_)); + } + + // --- Savings Dai Management --- + function join(uint wad) external note { + require(now == rho, "Pot/rho-not-updated"); + pie[msg.sender] = add(pie[msg.sender], wad); + Pie = add(Pie, wad); + vat.move(msg.sender, address(this), mul(chi, wad)); + } + + function exit(uint wad) external note { + pie[msg.sender] = sub(pie[msg.sender], wad); + Pie = sub(Pie, wad); + vat.move(address(this), msg.sender, mul(chi, wad)); + } +} \ No newline at end of file diff --git a/lib/maker/vat.sol b/lib/maker/vat.sol new file mode 100644 index 000000000..48ba62119 --- /dev/null +++ b/lib/maker/vat.sol @@ -0,0 +1,268 @@ +/// vat.sol -- Dai CDP database + +// Copyright (C) 2018 Rain +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +pragma solidity ^0.5.4; + +contract Vat { + // --- Auth --- + mapping (address => uint) public wards; + function rely(address usr) external note auth { require(live == 1, "Vat/not-live"); wards[usr] = 1; } + function deny(address usr) external note auth { require(live == 1, "Vat/not-live"); wards[usr] = 0; } + modifier auth { + require(wards[msg.sender] == 1, "Vat/not-authorized"); + _; + } + + mapping(address => mapping (address => uint)) public can; + function hope(address usr) external note { can[msg.sender][usr] = 1; } + function nope(address usr) external note { can[msg.sender][usr] = 0; } + function wish(address bit, address usr) internal view returns (bool) { + return either(bit == usr, can[bit][usr] == 1); + } + + // --- Data --- + struct Ilk { + uint256 Art; // Total Normalised Debt [wad] + uint256 rate; // Accumulated Rates [ray] + uint256 spot; // Price with Safety Margin [ray] + uint256 line; // Debt Ceiling [rad] + uint256 dust; // Urn Debt Floor [rad] + } + struct Urn { + uint256 ink; // Locked Collateral [wad] + uint256 art; // Normalised Debt [wad] + } + + mapping (bytes32 => Ilk) public ilks; + mapping (bytes32 => mapping (address => Urn )) public urns; + mapping (bytes32 => mapping (address => uint)) public gem; // [wad] + mapping (address => uint256) public dai; // [rad] + mapping (address => uint256) public sin; // [rad] + + uint256 public debt; // Total Dai Issued [rad] + uint256 public vice; // Total Unbacked Dai [rad] + uint256 public Line; // Total Debt Ceiling [rad] + uint256 public live; // Access Flag + + // --- Logs --- + event LogNote( + bytes4 indexed sig, + bytes32 indexed arg1, + bytes32 indexed arg2, + bytes32 indexed arg3, + bytes data + ) anonymous; + + modifier note { + _; + assembly { + // log an 'anonymous' event with a constant 6 words of calldata + // and four indexed topics: the selector and the first three args + let mark := msize // end of memory ensures zero + mstore(0x40, add(mark, 288)) // update free memory pointer + mstore(mark, 0x20) // bytes type data offset + mstore(add(mark, 0x20), 224) // bytes size (padded) + calldatacopy(add(mark, 0x40), 0, 224) // bytes payload + log4(mark, 288, // calldata + shl(224, shr(224, calldataload(0))), // msg.sig + calldataload(4), // arg1 + calldataload(36), // arg2 + calldataload(68) // arg3 + ) + } + } + + // --- Init --- + constructor() public { + wards[msg.sender] = 1; + live = 1; + } + + // --- Math --- + function add(uint x, int y) internal pure returns (uint z) { + z = x + uint(y); + require(y >= 0 || z <= x); + require(y <= 0 || z >= x); + } + function sub(uint x, int y) internal pure returns (uint z) { + z = x - uint(y); + require(y <= 0 || z <= x); + require(y >= 0 || z >= x); + } + function mul(uint x, int y) internal pure returns (int z) { + z = int(x) * y; + require(int(x) >= 0); + require(y == 0 || z / y == int(x)); + } + function add(uint x, uint y) internal pure returns (uint z) { + require((z = x + y) >= x); + } + function sub(uint x, uint y) internal pure returns (uint z) { + require((z = x - y) <= x); + } + function mul(uint x, uint y) internal pure returns (uint z) { + require(y == 0 || (z = x * y) / y == x); + } + + // --- Administration --- + function init(bytes32 ilk) external note auth { + require(ilks[ilk].rate == 0, "Vat/ilk-already-init"); + ilks[ilk].rate = 10 ** 27; + } + function file(bytes32 what, uint data) external note auth { + require(live == 1, "Vat/not-live"); + if (what == "Line") Line = data; + else revert("Vat/file-unrecognized-param"); + } + function file(bytes32 ilk, bytes32 what, uint data) external note auth { + require(live == 1, "Vat/not-live"); + if (what == "spot") ilks[ilk].spot = data; + else if (what == "line") ilks[ilk].line = data; + else if (what == "dust") ilks[ilk].dust = data; + else revert("Vat/file-unrecognized-param"); + } + function cage() external note auth { + live = 0; + } + + // --- Fungibility --- + function slip(bytes32 ilk, address usr, int256 wad) external note auth { + gem[ilk][usr] = add(gem[ilk][usr], wad); + } + function flux(bytes32 ilk, address src, address dst, uint256 wad) external note { + require(wish(src, msg.sender), "Vat/not-allowed"); + gem[ilk][src] = sub(gem[ilk][src], wad); + gem[ilk][dst] = add(gem[ilk][dst], wad); + } + function move(address src, address dst, uint256 rad) external note { + require(wish(src, msg.sender), "Vat/not-allowed"); + dai[src] = sub(dai[src], rad); + dai[dst] = add(dai[dst], rad); + } + + function either(bool x, bool y) internal pure returns (bool z) { + assembly{ z := or(x, y)} + } + function both(bool x, bool y) internal pure returns (bool z) { + assembly{ z := and(x, y)} + } + + // --- CDP Manipulation --- + function frob(bytes32 i, address u, address v, address w, int dink, int dart) external note { + // system is live + require(live == 1, "Vat/not-live"); + + Urn memory urn = urns[i][u]; + Ilk memory ilk = ilks[i]; + // ilk has been initialised + require(ilk.rate != 0, "Vat/ilk-not-init"); + + urn.ink = add(urn.ink, dink); + urn.art = add(urn.art, dart); + ilk.Art = add(ilk.Art, dart); + + int dtab = mul(ilk.rate, dart); + uint tab = mul(ilk.rate, urn.art); + debt = add(debt, dtab); + + // either debt has decreased, or debt ceilings are not exceeded + require(either(dart <= 0, both(mul(ilk.Art, ilk.rate) <= ilk.line, debt <= Line)), "Vat/ceiling-exceeded"); + // urn is either less risky than before, or it is safe + require(either(both(dart <= 0, dink >= 0), tab <= mul(urn.ink, ilk.spot)), "Vat/not-safe"); + + // urn is either more safe, or the owner consents + require(either(both(dart <= 0, dink >= 0), wish(u, msg.sender)), "Vat/not-allowed-u"); + // collateral src consents + require(either(dink <= 0, wish(v, msg.sender)), "Vat/not-allowed-v"); + // debt dst consents + require(either(dart >= 0, wish(w, msg.sender)), "Vat/not-allowed-w"); + + // urn has no debt, or a non-dusty amount + require(either(urn.art == 0, tab >= ilk.dust), "Vat/dust"); + + gem[i][v] = sub(gem[i][v], dink); + dai[w] = add(dai[w], dtab); + + urns[i][u] = urn; + ilks[i] = ilk; + } + // --- CDP Fungibility --- + function fork(bytes32 ilk, address src, address dst, int dink, int dart) external note { + Urn storage u = urns[ilk][src]; + Urn storage v = urns[ilk][dst]; + Ilk storage i = ilks[ilk]; + + u.ink = sub(u.ink, dink); + u.art = sub(u.art, dart); + v.ink = add(v.ink, dink); + v.art = add(v.art, dart); + + uint utab = mul(u.art, i.rate); + uint vtab = mul(v.art, i.rate); + + // both sides consent + require(both(wish(src, msg.sender), wish(dst, msg.sender)), "Vat/not-allowed"); + + // both sides safe + require(utab <= mul(u.ink, i.spot), "Vat/not-safe-src"); + require(vtab <= mul(v.ink, i.spot), "Vat/not-safe-dst"); + + // both sides non-dusty + require(either(utab >= i.dust, u.art == 0), "Vat/dust-src"); + require(either(vtab >= i.dust, v.art == 0), "Vat/dust-dst"); + } + // --- CDP Confiscation --- + function grab(bytes32 i, address u, address v, address w, int dink, int dart) external note auth { + Urn storage urn = urns[i][u]; + Ilk storage ilk = ilks[i]; + + urn.ink = add(urn.ink, dink); + urn.art = add(urn.art, dart); + ilk.Art = add(ilk.Art, dart); + + int dtab = mul(ilk.rate, dart); + + gem[i][v] = sub(gem[i][v], dink); + sin[w] = sub(sin[w], dtab); + vice = sub(vice, dtab); + } + + // --- Settlement --- + function heal(uint rad) external note { + address u = msg.sender; + sin[u] = sub(sin[u], rad); + dai[u] = sub(dai[u], rad); + vice = sub(vice, rad); + debt = sub(debt, rad); + } + function suck(address u, address v, uint rad) external note auth { + sin[u] = add(sin[u], rad); + dai[v] = add(dai[v], rad); + vice = add(vice, rad); + debt = add(debt, rad); + } + + // --- Rates --- + function fold(bytes32 i, address u, int rate) external note auth { + require(live == 1, "Vat/not-live"); + Ilk storage ilk = ilks[i]; + ilk.rate = add(ilk.rate, rate); + int rad = mul(ilk.Art, rate); + dai[u] = add(dai[u], rad); + debt = add(debt, rad); + } +} \ No newline at end of file diff --git a/contracts/test/CryptoKitties.sol b/lib/other/CryptoKitties.sol similarity index 100% rename from contracts/test/CryptoKitties.sol rename to lib/other/CryptoKitties.sol diff --git a/contracts/exchange/ERC20.sol b/lib/other/ERC20.sol similarity index 100% rename from contracts/exchange/ERC20.sol rename to lib/other/ERC20.sol diff --git a/contracts/exchange/KyberNetwork.sol b/lib/other/KyberNetwork.sol similarity index 100% rename from contracts/exchange/KyberNetwork.sol rename to lib/other/KyberNetwork.sol diff --git a/contracts/test/uniswap/UniswapExchange.json b/lib/uniswap/UniswapExchange.json similarity index 100% rename from contracts/test/uniswap/UniswapExchange.json rename to lib/uniswap/UniswapExchange.json diff --git a/contracts/test/uniswap/UniswapFactory.json b/lib/uniswap/UniswapFactory.json similarity index 100% rename from contracts/test/uniswap/UniswapFactory.json rename to lib/uniswap/UniswapFactory.json diff --git a/package-lock.json b/package-lock.json index 669c8e9ef..5ffd630b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,137 +4,247 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@0x/assert": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@0x/assert/-/assert-2.1.6.tgz", - "integrity": "sha512-Gu8eBnFdEuIAH2GubWYOSVz/BIoRccKof68AziduYDHxh4nSPM6NUH52xtfUGk4nXljiOXU1XHZJhcjTObI+8Q==", - "requires": { - "@0x/json-schemas": "^4.0.2", - "@0x/typescript-typings": "^4.3.0", - "@0x/utils": "^4.5.2", - "lodash": "^4.17.11", - "valid-url": "^1.0.9" + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==" + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } } } }, - "@0x/dev-utils": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@0x/dev-utils/-/dev-utils-2.3.3.tgz", - "integrity": "sha512-Pi664W/jj1U6WU+kHEPyKpflBnmKRsclB69RaL7wpnvOOFjAPhFV2/0FvIZ25w62rMzKEpfD1/1NcZ7NjAk7OQ==", - "requires": { - "@0x/subproviders": "^5.0.4", - "@0x/types": "^2.4.3", - "@0x/typescript-typings": "^4.3.0", - "@0x/utils": "^4.5.2", - "@0x/web3-wrapper": "^6.0.13", - "@types/web3-provider-engine": "^14.0.0", - "chai": "^4.0.1", - "ethereum-types": "^2.1.6", - "lodash": "^4.17.11" + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@redux-saga/core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.1.3.tgz", + "integrity": "sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg==", + "requires": { + "@babel/runtime": "^7.6.3", + "@redux-saga/deferred": "^1.1.2", + "@redux-saga/delay-p": "^1.1.2", + "@redux-saga/is": "^1.1.2", + "@redux-saga/symbols": "^1.1.2", + "@redux-saga/types": "^1.1.0", + "redux": "^4.0.4", + "typescript-tuple": "^2.2.1" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "redux": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "requires": { + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" + } } } }, - "@0x/json-schemas": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@0x/json-schemas/-/json-schemas-4.0.2.tgz", - "integrity": "sha512-JHOwESZeWKAzT5Z42ZNvOvQUQ5vuRIFQWS0FNjYwV8Cv4/dRlLHd7kwxxsvlm9NxgXnOW0ddEDBbVGxhVSYNIg==", + "@redux-saga/deferred": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.1.2.tgz", + "integrity": "sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ==" + }, + "@redux-saga/delay-p": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.1.2.tgz", + "integrity": "sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g==", "requires": { - "@0x/typescript-typings": "^4.3.0", - "@types/node": "*", - "jsonschema": "^1.2.0", - "lodash.values": "^4.3.0" - } - }, - "@0x/sol-compiler": { - "version": "3.1.15", - "resolved": "https://registry.npmjs.org/@0x/sol-compiler/-/sol-compiler-3.1.15.tgz", - "integrity": "sha512-IobhcQ/whFRL942/ykKc0fV6/YstHhvnQJ0noUZ9GabMDtaBlW6k5vAerSkXZU/YyOd8sD9nw7QSm295D6HoTA==", - "requires": { - "@0x/assert": "^2.1.6", - "@0x/json-schemas": "^4.0.2", - "@0x/sol-resolver": "^2.0.11", - "@0x/types": "^2.4.3", - "@0x/typescript-typings": "^4.3.0", - "@0x/utils": "^4.5.2", - "@0x/web3-wrapper": "^6.0.13", - "@types/yargs": "^11.0.0", - "chalk": "^2.3.0", - "chokidar": "^3.0.2", - "ethereum-types": "^2.1.6", - "ethereumjs-util": "^5.1.1", - "lodash": "^4.17.11", - "mkdirp": "^0.5.1", - "pluralize": "^7.0.0", - "require-from-string": "^2.0.1", - "semver": "5.5.0", - "solc": "^0.5.5", - "source-map-support": "^0.5.0", - "web3-eth-abi": "^1.0.0-beta.24", - "yargs": "^10.0.3" + "@redux-saga/symbols": "^1.1.2" + } + }, + "@redux-saga/is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.2.tgz", + "integrity": "sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w==", + "requires": { + "@redux-saga/symbols": "^1.1.2", + "@redux-saga/types": "^1.1.0" + } + }, + "@redux-saga/symbols": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.2.tgz", + "integrity": "sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ==" + }, + "@redux-saga/types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.1.0.tgz", + "integrity": "sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@truffle/error": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.7.tgz", + "integrity": "sha512-UIfVKsXSXocKnn5+RNklUXNoGd/JVj7V8KmC48TQzmjU33HQI86PX0JDS7SpHMHasI3w9X//1q7Lu7nZtj3Zzg==" + }, + "@truffle/interface-adapter": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.3.3.tgz", + "integrity": "sha512-l3I4WFTfnBSIfG96IOBRtAIE6AHDAxcOUJE7W5zh9hocQwzQlGWc2yEyyTcLa0656TTM8RxaZZ2S/KdHHMvCaw==", + "requires": { + "bn.js": "^4.11.8", + "ethers": "^4.0.32", + "lodash": "^4.17.13", + "web3": "1.2.2" }, "dependencies": { - "ansi-regex": { + "@types/node": { + "version": "12.12.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.30.tgz", + "integrity": "sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg==" + }, + "aes-js": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "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" } }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "requires": { "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "jsonfile": "^4.0.0", + "universalify": "^0.1.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=" - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "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==", "requires": { - "bindings": "^1.2.1", "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "minimalistic-assert": "^1.0.0" } }, "lodash": { @@ -142,2168 +252,1463 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "solc": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.5.16.tgz", - "integrity": "sha512-weEtRtisJyf+8UjELs7S4ST1KK7UIq6SRB7tpprfJBL9b5mTrZAT7m4gJKi2h6MiBpuSWfnraK8BnkyWzuTMRA==", + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" + "minimist": "^1.2.5" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "oboe": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", + "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "http-https": "^1.0.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" - } + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, - "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" - } + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "scrypt-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", + "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "swarm-js": { + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", + "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", "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" + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "decompress": "^4.0.0", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "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" + } + }, + "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==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "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" + } + } } - } - } - }, - "@0x/sol-coverage": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@0x/sol-coverage/-/sol-coverage-3.0.12.tgz", - "integrity": "sha512-V4Iq8LU8HWNctVCt+gMHKcZ0moiawpna7bd3SWQuiQIig0iNpXBBCQl9SEIwpboTcv4Xhzo4cZuCGsWwKAQSpw==", - "requires": { - "@0x/sol-tracing-utils": "^6.0.19", - "@0x/subproviders": "^5.0.4", - "@0x/typescript-typings": "^4.3.0", - "@types/minimatch": "^3.0.3", - "ethereum-types": "^2.1.6", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "web3-provider-engine": "14.0.6" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "@0x/sol-resolver": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@0x/sol-resolver/-/sol-resolver-2.0.11.tgz", - "integrity": "sha512-TGvkuWoEMghPB4OZaPz49OJ/J0cw/I3yV7VLbE/OeN0K/J2P8uOkzhNgWLOVSi8EK3hcJ1JVc0iDSkCnzGj4xQ==", - "requires": { - "@0x/types": "^2.4.3", - "@0x/typescript-typings": "^4.3.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "@0x/sol-tracing-utils": { - "version": "6.0.19", - "resolved": "https://registry.npmjs.org/@0x/sol-tracing-utils/-/sol-tracing-utils-6.0.19.tgz", - "integrity": "sha512-5tQOEo+dUYWiclT7UDy5IRm/EPEwDzCqAY3J8l0ecIsssBk0r2YLKKf/ugWkdwASGeAxiepjYpC+mxcxOT6yDA==", - "requires": { - "@0x/dev-utils": "^2.3.3", - "@0x/sol-compiler": "^3.1.15", - "@0x/sol-resolver": "^2.0.11", - "@0x/subproviders": "^5.0.4", - "@0x/typescript-typings": "^4.3.0", - "@0x/utils": "^4.5.2", - "@0x/web3-wrapper": "^6.0.13", - "@types/solidity-parser-antlr": "^0.2.3", - "chalk": "^2.3.0", - "ethereum-types": "^2.1.6", - "ethereumjs-util": "^5.1.1", - "ethers": "~4.0.4", - "glob": "^7.1.2", - "istanbul": "^0.4.5", - "lodash": "^4.17.11", - "loglevel": "^1.6.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.2", - "semaphore-async-await": "^1.5.1", - "solc": "^0.5.5", - "solidity-parser-antlr": "^0.4.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" } }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "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=", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "prepend-http": "^2.0.0" } }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "web3": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", + "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "@types/node": "^12.6.1", + "web3-bzz": "1.2.2", + "web3-core": "1.2.2", + "web3-eth": "1.2.2", + "web3-eth-personal": "1.2.2", + "web3-net": "1.2.2", + "web3-shh": "1.2.2", + "web3-utils": "1.2.2" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "web3-bzz": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.2.tgz", + "integrity": "sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA==", + "requires": { + "@types/node": "^10.12.18", + "got": "9.6.0", + "swarm-js": "0.1.39", + "underscore": "1.9.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" + } + } }, - "solc": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.5.16.tgz", - "integrity": "sha512-weEtRtisJyf+8UjELs7S4ST1KK7UIq6SRB7tpprfJBL9b5mTrZAT7m4gJKi2h6MiBpuSWfnraK8BnkyWzuTMRA==", + "web3-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.2.tgz", + "integrity": "sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ==", "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" + "@types/bn.js": "^4.11.4", + "@types/node": "^12.6.1", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-core-requestmanager": "1.2.2", + "web3-utils": "1.2.2" } - } - } - }, - "@0x/subproviders": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@0x/subproviders/-/subproviders-5.0.4.tgz", - "integrity": "sha512-1LiGcOXkP5eUOl/0JRqkrqYtCvIL4NJj1GbbLIRq4TvkfqrRbF7zJM2SaayxPo3Z48zVsqk0ZE5+RrNAdK/Rrg==", - "requires": { - "@0x/assert": "^2.1.6", - "@0x/types": "^2.4.3", - "@0x/typescript-typings": "^4.3.0", - "@0x/utils": "^4.5.2", - "@0x/web3-wrapper": "^6.0.13", - "@ledgerhq/hw-app-eth": "^4.3.0", - "@ledgerhq/hw-transport-node-hid": "^4.3.0", - "@ledgerhq/hw-transport-u2f": "4.24.0", - "@types/hdkey": "^0.7.0", - "@types/web3-provider-engine": "^14.0.0", - "bip39": "^2.5.0", - "bn.js": "^4.11.8", - "ethereum-types": "^2.1.6", - "ethereumjs-tx": "^1.3.5", - "ethereumjs-util": "^5.1.1", - "ganache-core": "^2.6.0", - "hdkey": "^0.7.1", - "json-rpc-error": "2.0.0", - "lodash": "^4.17.11", - "semaphore-async-await": "^1.5.1", - "web3-provider-engine": "14.0.6" - }, - "dependencies": { - "bip39": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.6.0.tgz", - "integrity": "sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==", + }, + "web3-core-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz", + "integrity": "sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ==", "requires": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" + "underscore": "1.9.1", + "web3-eth-iban": "1.2.2", + "web3-utils": "1.2.2" } }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "web3-core-method": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.2.tgz", + "integrity": "sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA==", "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2", + "web3-core-promievent": "1.2.2", + "web3-core-subscriptions": "1.2.2", + "web3-utils": "1.2.2" } }, - "hdkey": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-0.7.1.tgz", - "integrity": "sha1-yu5L6BqneSHpCbjSKN0PKayu5jI=", + "web3-core-promievent": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz", + "integrity": "sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ==", "requires": { - "coinstring": "^2.0.0", - "secp256k1": "^3.0.1" + "any-promise": "1.3.0", + "eventemitter3": "3.1.2" } }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "web3-core-requestmanager": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz", + "integrity": "sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw==", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2", + "web3-providers-http": "1.2.2", + "web3-providers-ipc": "1.2.2", + "web3-providers-ws": "1.2.2" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "@0x/types": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@0x/types/-/types-2.4.3.tgz", - "integrity": "sha512-3z4ca9fb9pyTu9lJhTSll5EuEthkA3tLAayyZixCoCnwi4ok6PJ83PnMMsSxlRY2iXr7QGbrQr6nU64YWk2WjA==", - "requires": { - "@types/node": "*", - "bignumber.js": "~8.0.2", - "ethereum-types": "^2.1.6" - } - }, - "@0x/typescript-typings": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@0x/typescript-typings/-/typescript-typings-4.3.0.tgz", - "integrity": "sha512-6IH2JyKyl33+40tJ5rEhaMPTS2mVuRvoNmoXlCd/F0GPYSsDHMGObIXOkx+Qsw5SyCmqNs/3CTLeeCCqiSUdaw==", - "requires": { - "@types/bn.js": "^4.11.0", - "@types/react": "*", - "bignumber.js": "~8.0.2", - "ethereum-types": "^2.1.6", - "popper.js": "1.14.3" - } - }, - "@0x/utils": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@0x/utils/-/utils-4.5.2.tgz", - "integrity": "sha512-NWfNcvyiOhouk662AWxX0ZVe4ednBZJS9WZT/by3DBCY/WvN7WHMpEy9M5rBCxO+JJndLYeB5eBztDp7W+Ytkw==", - "requires": { - "@0x/types": "^2.4.3", - "@0x/typescript-typings": "^4.3.0", - "@types/node": "*", - "abortcontroller-polyfill": "^1.1.9", - "bignumber.js": "~8.0.2", - "chalk": "^2.3.0", - "detect-node": "2.0.3", - "ethereum-types": "^2.1.6", - "ethereumjs-util": "^5.1.1", - "ethers": "~4.0.4", - "isomorphic-fetch": "2.2.1", - "js-sha3": "^0.7.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "web3-core-subscriptions": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz", + "integrity": "sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ==", "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" + "eventemitter3": "3.1.2", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2" } }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "web3-eth": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.2.tgz", + "integrity": "sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA==", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "underscore": "1.9.1", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-core-subscriptions": "1.2.2", + "web3-eth-abi": "1.2.2", + "web3-eth-accounts": "1.2.2", + "web3-eth-contract": "1.2.2", + "web3-eth-ens": "1.2.2", + "web3-eth-iban": "1.2.2", + "web3-eth-personal": "1.2.2", + "web3-net": "1.2.2", + "web3-utils": "1.2.2" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "@0x/web3-wrapper": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/@0x/web3-wrapper/-/web3-wrapper-6.0.13.tgz", - "integrity": "sha512-LQjKBCCNdkJuhcJld+/sy+G0+sJu5qp9VDNNwJGLDxWIJpgoshhUpBPi7vUnZ79UY4SYuNcC4yM9yI61cs7ZiA==", - "requires": { - "@0x/assert": "^2.1.6", - "@0x/json-schemas": "^4.0.2", - "@0x/typescript-typings": "^4.3.0", - "@0x/utils": "^4.5.2", - "ethereum-types": "^2.1.6", - "ethereumjs-util": "^5.1.1", - "ethers": "~4.0.4", - "lodash": "^4.17.11" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "web3-eth-abi": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz", + "integrity": "sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw==", "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" + "ethers": "4.0.0-beta.3", + "underscore": "1.9.1", + "web3-utils": "1.2.2" + }, + "dependencies": { + "@types/node": { + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" + }, + "elliptic": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", + "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "ethers": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", + "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", + "requires": { + "@types/node": "^10.3.2", + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.3.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.3", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" + } } }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "web3-eth-accounts": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz", + "integrity": "sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA==", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "any-promise": "1.3.0", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.7", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "scrypt-shim": "github:web3-js/scrypt-shim", + "underscore": "1.9.1", + "uuid": "3.3.2", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-utils": "1.2.2" + }, + "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": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } - } - }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", - "requires": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "web3-eth-contract": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz", + "integrity": "sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA==", + "requires": { + "@types/bn.js": "^4.11.4", + "underscore": "1.9.1", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-core-promievent": "1.2.2", + "web3-core-subscriptions": "1.2.2", + "web3-eth-abi": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-eth-ens": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz", + "integrity": "sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg==", + "requires": { + "eth-ens-namehash": "2.0.8", + "underscore": "1.9.1", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-promievent": "1.2.2", + "web3-eth-abi": "1.2.2", + "web3-eth-contract": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-eth-iban": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz", + "integrity": "sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ==", + "requires": { + "bn.js": "4.11.8", + "web3-utils": "1.2.2" + } + }, + "web3-eth-personal": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz", + "integrity": "sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg==", + "requires": { + "@types/node": "^12.6.1", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-net": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-net": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.2.tgz", + "integrity": "sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw==", + "requires": { + "web3-core": "1.2.2", + "web3-core-method": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-providers-http": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.2.tgz", + "integrity": "sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg==", + "requires": { + "web3-core-helpers": "1.2.2", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz", + "integrity": "sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA==", + "requires": { + "oboe": "2.1.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2" + } + }, + "web3-providers-ws": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz", + "integrity": "sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA==", + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2", + "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" + } + }, + "web3-shh": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.2.tgz", + "integrity": "sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg==", + "requires": { + "web3-core": "1.2.2", + "web3-core-method": "1.2.2", + "web3-core-subscriptions": "1.2.2", + "web3-net": "1.2.2" + } + }, + "web3-utils": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", + "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", + "requires": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "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" + } + } + } + }, + "websocket": { + "version": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", + "from": "github:web3-js/WebSocket-Node#polyfill/globalThis", + "requires": { + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "nan": "^2.14.0", + "typedarray-to-buffer": "^3.1.5", + "yaeti": "^0.0.6" + } } } }, - "@ledgerhq/devices": { - "version": "4.78.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-4.78.0.tgz", - "integrity": "sha512-tWKS5WM/UU82czihnVjRwz9SXNTQzWjGJ/7+j/xZ70O86nlnGJ1aaFbs5/WTzfrVKpOKgj1ZoZkAswX67i/JTw==", - "requires": { - "@ledgerhq/errors": "^4.78.0", - "@ledgerhq/logs": "^4.72.0", - "rxjs": "^6.5.3" - } - }, - "@ledgerhq/errors": { - "version": "4.78.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-4.78.0.tgz", - "integrity": "sha512-FX6zHZeiNtegBvXabK6M5dJ+8OV8kQGGaGtuXDeK/Ss5EmG4Ltxc6Lnhe8hiHpm9pCHtktOsnUVL7IFBdHhYUg==" - }, - "@ledgerhq/hw-app-eth": { - "version": "4.78.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-4.78.0.tgz", - "integrity": "sha512-m4s4Zhy4lwYJjZB3xPeGV/8mxQcnoui+Eu1KDEl6atsquZHUpbtern/0hZl88+OlFUz0XrX34W3I9cqj61Y6KA==", - "requires": { - "@ledgerhq/errors": "^4.78.0", - "@ledgerhq/hw-transport": "^4.78.0" - } - }, - "@ledgerhq/hw-transport": { - "version": "4.78.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-4.78.0.tgz", - "integrity": "sha512-xQu16OMPQjFYLjqCysij+8sXtdWv2YLxPrB6FoLvEWGTlQ7yL1nUBRQyzyQtWIYqZd4THQowQmzm1VjxuN6SZw==", + "@truffle/provider": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.1.19.tgz", + "integrity": "sha512-ke8iQmzW4Y99+8iff8xQcc+mCNU4AkwtaZ/iSpmVD8qpLytw8/DSNCm0RiEz9/+I93Q1zqI4Jnij/rXnkS2Njw==", "requires": { - "@ledgerhq/devices": "^4.78.0", - "@ledgerhq/errors": "^4.78.0", - "events": "^3.0.0" + "@truffle/error": "^0.0.7", + "@truffle/interface-adapter": "^0.3.0", + "web3": "1.2.1" }, "dependencies": { - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" - } - } - }, - "@ledgerhq/hw-transport-node-hid": { - "version": "4.78.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-4.78.0.tgz", - "integrity": "sha512-OMrY2ecfQ1XjMAuuHqu3n3agMPR06HN1s0ENrKc+Twbb5A17jujpv07WzjxfTN2V1G7vgeZpRqrg2ulhowWbdg==", - "optional": true, - "requires": { - "@ledgerhq/devices": "^4.78.0", - "@ledgerhq/errors": "^4.78.0", - "@ledgerhq/hw-transport": "^4.78.0", - "@ledgerhq/hw-transport-node-hid-noevents": "^4.78.0", - "@ledgerhq/logs": "^4.72.0", - "lodash": "^4.17.15", - "node-hid": "^0.7.9", - "usb": "^1.6.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "optional": true - } - } - }, - "@ledgerhq/hw-transport-node-hid-noevents": { - "version": "4.78.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-4.78.0.tgz", - "integrity": "sha512-CJPVR4wksq+apiXH2GnsttguBxmj9zdM2HjqZ3dHZN8SFW/9Xj3k+baS+pYoUISkECVxDrdfaW3Bd5dWv+jPUg==", - "optional": true, - "requires": { - "@ledgerhq/devices": "^4.78.0", - "@ledgerhq/errors": "^4.78.0", - "@ledgerhq/hw-transport": "^4.78.0", - "@ledgerhq/logs": "^4.72.0", - "node-hid": "^0.7.9" - } - }, - "@ledgerhq/hw-transport-u2f": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-4.24.0.tgz", - "integrity": "sha512-/gFjhkM0sJfZ7iUf8HoIkGufAWgPacrbb1LW0TvWnZwvsATVJ1BZJBtrr90Wo401PKsjVwYtFt3Ce4gOAUv9jQ==", - "requires": { - "@ledgerhq/hw-transport": "^4.24.0", - "u2f-api": "0.2.7" - } - }, - "@ledgerhq/logs": { - "version": "4.72.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-4.72.0.tgz", - "integrity": "sha512-o+TYF8vBcyySRsb2kqBDv/KMeme8a2nwWoG+lAWzbDmWfb2/MrVWYCVYDYvjXdSoI/Cujqy1i0gIDrkdxa9chA==" - }, - "@redux-saga/core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.1.3.tgz", - "integrity": "sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg==", - "requires": { - "@babel/runtime": "^7.6.3", - "@redux-saga/deferred": "^1.1.2", - "@redux-saga/delay-p": "^1.1.2", - "@redux-saga/is": "^1.1.2", - "@redux-saga/symbols": "^1.1.2", - "@redux-saga/types": "^1.1.0", - "redux": "^4.0.4", - "typescript-tuple": "^2.2.1" - }, - "dependencies": { - "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "@types/node": { + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } - } - } - }, - "@redux-saga/deferred": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.1.2.tgz", - "integrity": "sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ==" - }, - "@redux-saga/delay-p": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.1.2.tgz", - "integrity": "sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g==", - "requires": { - "@redux-saga/symbols": "^1.1.2" - } - }, - "@redux-saga/is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.2.tgz", - "integrity": "sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w==", - "requires": { - "@redux-saga/symbols": "^1.1.2", - "@redux-saga/types": "^1.1.0" - } - }, - "@redux-saga/symbols": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.2.tgz", - "integrity": "sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ==" - }, - "@redux-saga/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.1.0.tgz", - "integrity": "sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==" - }, - "@types/blue-tape": { - "version": "0.1.33", - "resolved": "https://registry.npmjs.org/@types/blue-tape/-/blue-tape-0.1.33.tgz", - "integrity": "sha512-l5cQcLM3aPh55bBQ4geWQ8hZ4Ew+s4RvyhMaBpgW3aJ2HUfRgwd8ENKrk/utC4Hz1dJAiehyIa4vN6emxBMaog==", - "requires": { - "@types/node": "*", - "@types/tape": "*" - } - }, - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/ethereum-protocol": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/ethereum-protocol/-/ethereum-protocol-1.0.0.tgz", - "integrity": "sha512-3DiI3Zxf81CgX+VhxNNFJBv/sfr1BFBKQK2sQ85hU9FwWJJMWV5gRDV79OUNShiwj3tYYIezU94qpucsb3dThQ==", - "requires": { - "bignumber.js": "7.2.1" - }, - "dependencies": { - "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" - } - } - }, - "@types/hdkey": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@types/hdkey/-/hdkey-0.7.1.tgz", - "integrity": "sha512-4Kkr06hq+R8a9EzVNqXGOY2x1xA7dhY6qlp6OvaZ+IJy1BCca1Cv126RD9X7CMJoXoLo8WvAizy8gQHpqW6K0Q==", - "requires": { - "@types/node": "*" - } - }, - "@types/lodash": { - "version": "4.14.119", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.119.tgz", - "integrity": "sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw==" - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/react": { - "version": "16.9.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.20.tgz", - "integrity": "sha512-jRrWBr25zzEVNa4QbESKLPluvrZ3W6Odfwrfe2F5vzbrDuNvlpnHa/xbZcXg8RH5D4CE181J5VxrRrLvzRH+5A==", - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/solidity-parser-antlr": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@types/solidity-parser-antlr/-/solidity-parser-antlr-0.2.3.tgz", - "integrity": "sha512-FoSyZT+1TTaofbEtGW1oC9wHND1YshvVeHerME/Jh6gIdHbBAWFW8A97YYqO/dpHcFjIwEPEepX0Efl2ckJgwA==" - }, - "@types/tape": { - "version": "4.2.34", - "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.2.34.tgz", - "integrity": "sha512-d3mILzYSlsPEALCiDYkRnkiYN4cl62dkaCg00Uql/FShIvdMOBFGtjP0N/cm0aCXwaAPVBS5weD4ciHAD8RtsA==", - "requires": { - "@types/node": "*" - } - }, - "@types/web3-provider-engine": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@types/web3-provider-engine/-/web3-provider-engine-14.0.0.tgz", - "integrity": "sha512-yHr8mX2SoX3JNyfqdLXdO1UobsGhfiwSgtekbVxKLQrzD7vtpPkKbkIVsPFOhvekvNbPsCmDyeDCLkpeI9gSmA==", - "requires": { - "@types/ethereum-protocol": "*" - } - }, - "@types/yargs": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-11.1.5.tgz", - "integrity": "sha512-1jmXgoIyzxQSm33lYgEXvegtkhloHbed2I0QGlTN66U2F9/ExqJWSCSmaWC0IB/g1tW+IYSp+tDhcZBYB1ZGog==" - }, - "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", - "optional": true - }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" - }, - "abi-decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.2.0.tgz", - "integrity": "sha512-y2OKSEW4gf2838Eavc56vQY9V46zaXkf3Jl1WpTfUBbzAVrXSr4JRZAAWv55Tv9s5WNz1rVgBgz5d2aJIL1QCg==", - "requires": { - "web3": "^0.18.4" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + "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" + } }, - "web3": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", - "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", + "ethers": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", + "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", "requires": { - "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "^3.1.4", - "utf8": "^2.1.1", - "xhr2": "*", - "xmlhttprequest": "*" + "@types/node": "^10.3.2", + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.3.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.3", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "elliptic": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", + "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" + } } - } - } - }, - "abortcontroller-polyfill": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.4.0.tgz", - "integrity": "sha512-3ZFfCRfDzx3GFjO6RAkYx81lPGpUS20ISxux9gLxuKnqafNcFQo59+IoZqpO2WvQlyc287B62HDnDdNYRmlvWA==" - }, - "abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "requires": { - "xtend": "~4.0.0" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", - "optional": true - }, - "acorn-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", - "optional": true, - "requires": { - "acorn": "^2.1.0" - } - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" - }, - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "optional": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "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==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "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-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==" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "assured": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/assured/-/assured-1.0.14.tgz", - "integrity": "sha512-srUv3dc59TE0cAwERnbh9f5vIqjitF39dCSBB8C3cqnHKjYkEpKAPUouGcfpM489V+n6cw12Ipgx8AMd1FvYBw==", - "requires": { - "noop6": "^1.0.1", - "sliced": "^1.0.1" - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "aws-sdk": { - "version": "2.621.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.621.0.tgz", - "integrity": "sha512-wf87zTPXx2cILc9kAKTXcSrAc+vCc7BxE7G8vPEWAreCDucLHbynachYQvwO5ql+I3Eq651/X2XjnY01niSTNw==", - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - } - }, - "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.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" - }, - "axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - } - }, - "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=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "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" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "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": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "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" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "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=", - "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=", - "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=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "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=", - "requires": { - "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=", - "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=", - "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=", - "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=", - "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=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "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=", - "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=", - "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=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "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=", - "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=" - }, - "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=" - }, - "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=" - }, - "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=", - "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-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=", - "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=", - "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=", - "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" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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==", - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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=", - "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-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=", - "requires": { - "regenerator-transform": "^0.10.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=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^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.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "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.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "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" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "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=", - "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=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "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": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" - } - }, - "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==", - "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=", + "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==", "requires": { - "is-descriptor": "^1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^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==", + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", "requires": { - "kind-of": "^6.0.0" + "minimist": "^1.2.5" } }, - "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==", + "oboe": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", + "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", "requires": { - "kind-of": "^6.0.0" + "http-https": "^1.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==", + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "scrypt-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", + "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" + }, + "scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" + }, + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "swarm-js": { + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", + "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "decompress": "^4.0.0", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "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" + } + }, + "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==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "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" + } + } } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "base-x": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz", - "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" - }, - "bignumber.js": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.0.2.tgz", - "integrity": "sha512-EiuvFrnbv0jFixEQ9f58jo7X0qI2lNGIr/MxntmVzQc5JUweDSh8y8hbTCAomFtqwUPIOWcLXP0VEOSZTG7FFw==" - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "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=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + }, + "web3": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz", + "integrity": "sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==", + "requires": { + "web3-bzz": "1.2.1", + "web3-core": "1.2.1", + "web3-eth": "1.2.1", + "web3-eth-personal": "1.2.1", + "web3-net": "1.2.1", + "web3-shh": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-bzz": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.1.tgz", + "integrity": "sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw==", + "requires": { + "got": "9.6.0", + "swarm-js": "0.1.39", + "underscore": "1.9.1" + } + }, + "web3-core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.1.tgz", + "integrity": "sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg==", + "requires": { + "web3-core-helpers": "1.2.1", + "web3-core-method": "1.2.1", + "web3-core-requestmanager": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-core-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz", + "integrity": "sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw==", + "requires": { + "underscore": "1.9.1", + "web3-eth-iban": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-core-method": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.1.tgz", + "integrity": "sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ==", + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.1", + "web3-core-promievent": "1.2.1", + "web3-core-subscriptions": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-core-promievent": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz", + "integrity": "sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw==", + "requires": { + "any-promise": "1.3.0", + "eventemitter3": "3.1.2" + } + }, + "web3-core-requestmanager": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz", + "integrity": "sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg==", + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.1", + "web3-providers-http": "1.2.1", + "web3-providers-ipc": "1.2.1", + "web3-providers-ws": "1.2.1" + } + }, + "web3-core-subscriptions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz", + "integrity": "sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g==", + "requires": { + "eventemitter3": "3.1.2", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.1" + } + }, + "web3-eth": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.1.tgz", + "integrity": "sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA==", + "requires": { + "underscore": "1.9.1", + "web3-core": "1.2.1", + "web3-core-helpers": "1.2.1", + "web3-core-method": "1.2.1", + "web3-core-subscriptions": "1.2.1", + "web3-eth-abi": "1.2.1", + "web3-eth-accounts": "1.2.1", + "web3-eth-contract": "1.2.1", + "web3-eth-ens": "1.2.1", + "web3-eth-iban": "1.2.1", + "web3-eth-personal": "1.2.1", + "web3-net": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-eth-abi": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz", + "integrity": "sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g==", + "requires": { + "ethers": "4.0.0-beta.3", + "underscore": "1.9.1", + "web3-utils": "1.2.1" + } + }, + "web3-eth-accounts": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz", + "integrity": "sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ==", + "requires": { + "any-promise": "1.3.0", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.7", + "scryptsy": "2.1.0", + "semver": "6.2.0", + "underscore": "1.9.1", + "uuid": "3.3.2", + "web3-core": "1.2.1", + "web3-core-helpers": "1.2.1", + "web3-core-method": "1.2.1", + "web3-utils": "1.2.1" + }, + "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": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "web3-eth-contract": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz", + "integrity": "sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g==", + "requires": { + "underscore": "1.9.1", + "web3-core": "1.2.1", + "web3-core-helpers": "1.2.1", + "web3-core-method": "1.2.1", + "web3-core-promievent": "1.2.1", + "web3-core-subscriptions": "1.2.1", + "web3-eth-abi": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-eth-ens": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz", + "integrity": "sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q==", + "requires": { + "eth-ens-namehash": "2.0.8", + "underscore": "1.9.1", + "web3-core": "1.2.1", + "web3-core-helpers": "1.2.1", + "web3-core-promievent": "1.2.1", + "web3-eth-abi": "1.2.1", + "web3-eth-contract": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-eth-iban": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz", + "integrity": "sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ==", + "requires": { + "bn.js": "4.11.8", + "web3-utils": "1.2.1" + } + }, + "web3-eth-personal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz", + "integrity": "sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg==", + "requires": { + "web3-core": "1.2.1", + "web3-core-helpers": "1.2.1", + "web3-core-method": "1.2.1", + "web3-net": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-net": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.1.tgz", + "integrity": "sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw==", + "requires": { + "web3-core": "1.2.1", + "web3-core-method": "1.2.1", + "web3-utils": "1.2.1" + } + }, + "web3-providers-http": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.1.tgz", + "integrity": "sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ==", + "requires": { + "web3-core-helpers": "1.2.1", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz", + "integrity": "sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA==", + "requires": { + "oboe": "2.1.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.1" + } + }, + "web3-providers-ws": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz", + "integrity": "sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA==", + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.1", + "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" + } + }, + "web3-shh": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.1.tgz", + "integrity": "sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA==", + "requires": { + "web3-core": "1.2.1", + "web3-core-method": "1.2.1", + "web3-core-subscriptions": "1.2.1", + "web3-net": "1.2.1" + } + }, + "web3-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz", + "integrity": "sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA==", + "requires": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randomhex": "0.1.5", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "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" + } + } + } + }, + "websocket": { + "version": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", + "from": "github:web3-js/WebSocket-Node#polyfill/globalThis", + "requires": { + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "nan": "^2.14.0", + "typedarray-to-buffer": "^3.1.5", + "yaeti": "^0.0.6" + } + } } }, - "bip39": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", - "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", + "@types/blue-tape": { + "version": "0.1.33", + "resolved": "https://registry.npmjs.org/@types/blue-tape/-/blue-tape-0.1.33.tgz", + "integrity": "sha512-l5cQcLM3aPh55bBQ4geWQ8hZ4Ew+s4RvyhMaBpgW3aJ2HUfRgwd8ENKrk/utC4Hz1dJAiehyIa4vN6emxBMaog==", "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" + "@types/node": "*", + "@types/tape": "*" } }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "requires": { - "safe-buffer": "^5.0.1" + "@types/node": "*" } }, - "bl": { + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/events": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", - "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", - "optional": true, - "requires": { - "readable-stream": "^3.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, - "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=", + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "requires": { - "inherits": "~2.0.0" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bn/-/bn-1.0.5.tgz", - "integrity": "sha512-7TvGbqbZb6lDzsBtNz1VkdXXV0BVmZKPPViPmo2IpvwaryF7P+QKYKACyVkwo2mZPr2CpFiz7EtgPEcc3o/JFQ==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "@types/lodash": { + "version": "4.14.119", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.119.tgz", + "integrity": "sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw==" }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" }, - "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" - } + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "@types/tape": { + "version": "4.2.34", + "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.2.34.tgz", + "integrity": "sha512-d3mILzYSlsPEALCiDYkRnkiYN4cl62dkaCg00Uql/FShIvdMOBFGtjP0N/cm0aCXwaAPVBS5weD4ciHAD8RtsA==", "requires": { - "fill-range": "^7.0.1" + "@types/node": "*" } }, - "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.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "@web3-js/scrypt-shim": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz", + "integrity": "sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw==", "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" + "scryptsy": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, - "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==", + "@web3-js/websocket": { + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/@web3-js/websocket/-/websocket-1.0.30.tgz", + "integrity": "sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA==", "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "nan": "^2.14.0", + "typedarray-to-buffer": "^3.1.5", + "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" + } + } } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "optional": true }, - "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" - } + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" }, - "browserify-sha3": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", - "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", + "abi-decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.2.0.tgz", + "integrity": "sha512-y2OKSEW4gf2838Eavc56vQY9V46zaXkf3Jl1WpTfUBbzAVrXSr4JRZAAWv55Tv9s5WNz1rVgBgz5d2aJIL1QCg==", "requires": { - "js-sha3": "^0.6.1", - "safe-buffer": "^5.1.1" + "web3": "^0.18.4" }, "dependencies": { - "js-sha3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", - "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=" + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + }, + "web3": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", + "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", + "requires": { + "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" + } } } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "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" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "optional": true }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "optional": true, "requires": { - "base-x": "^3.0.2" + "acorn": "^2.1.0" } }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" }, - "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==", + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "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==" + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "optional": true }, - "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.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, - "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=" + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "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" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "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" + } } } }, - "callsites": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "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==" + }, + "arr-union": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } }, - "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==" + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "safer-buffer": "~2.1.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "checkpoint-store": { + "assertion-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "assured": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/assured/-/assured-1.0.14.tgz", + "integrity": "sha512-srUv3dc59TE0cAwERnbh9f5vIqjitF39dCSBB8C3cqnHKjYkEpKAPUouGcfpM489V+n6cw12Ipgx8AMd1FvYBw==", "requires": { - "functional-red-black-tree": "^1.0.1" + "noop6": "^1.0.1", + "sliced": "^1.0.1" } }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" + "lodash": "^4.17.14" }, "dependencies": { "lodash": { @@ -2313,279 +1718,99 @@ } } }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "async": "^2.4.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "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" - } + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "circom": { - "version": "github:LimeChain/circom#4ae2447b97d558820a7c7817d602185478ad0b92", - "from": "github:LimeChain/circom", + "aws-sdk": { + "version": "2.644.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.644.0.tgz", + "integrity": "sha512-FkglRU5fvWHwT2Ll0caXS/QzRNzh5ZCS5cs4pF2nP0OjdD7VNJhNtu5lOnSzvMHAtZQJMsG3k0em8PoI8vk1AQ==", "requires": { - "big-integer": "^1.6.32", - "optimist": "^0.6.1", - "yargs": "^12.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=" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.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" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "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=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "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" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.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 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "buffer": "4.9.1", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" } }, - "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==", - "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } + "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=" }, - "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=", + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", "requires": { - "restore-cursor": "^2.0.0" + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" } }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "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=", "requires": { - "colors": "1.0.3" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" } } }, - "cli-table-2-json": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/cli-table-2-json/-/cli-table-2-json-1.0.13.tgz", - "integrity": "sha512-CpUj9dubfuIZSEezwUPycAJqM2dlATyyRUyBkfGeK2KNfrqK3XrdaBohMt0XlkEvsZyDfUEmPWCNvUO+a/7Wsw==", + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { - "@types/blue-tape": "^0.1.30", - "@types/lodash": "4.14.119", - "lodash": "^4.17.15" + "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" }, "dependencies": { "lodash": { @@ -2595,6051 +1820,5021 @@ } } }, - "cli-table2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/cli-table2/-/cli-table2-0.2.0.tgz", - "integrity": "sha1-LR738hig54biFFQFYtS9F3/jLZc=", + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { - "colors": "^1.1.2", - "lodash": "^3.10.1", - "string-width": "^1.0.1" + "babel-runtime": "^6.22.0" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "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=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "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": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "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=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "ms": "2.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" - } + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" } } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, - "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=" + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "coinstring": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", - "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { - "bs58": "^2.0.1", - "create-hash": "^1.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": { - "bs58": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=" + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "safe-buffer": "^5.0.1" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "color-name": "1.1.3" + "tweetnacl": "^0.14.3" } }, - "color-logger": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.6.tgz", - "integrity": "sha1-5WJF7ymCJlcRDHy3WpzXhstp7Rs=" + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "requires": { - "delayed-stream": "~1.0.0" + "file-uri-to-path": "1.0.0" } }, - "command-exists": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" - }, - "commander": { + "bip39": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", + "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" } }, - "connected-domain": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz", - "integrity": "sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "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-buffer": "^5.0.1" } }, - "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.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { - "safe-buffer": "~5.1.1" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" }, "dependencies": { - "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==" + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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": { + "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==" + } + } + }, + "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" + }, + "dependencies": { + "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==" + } + } } } }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "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" + } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "bn": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bn/-/bn-1.0.5.tgz", + "integrity": "sha512-7TvGbqbZb6lDzsBtNz1VkdXXV0BVmZKPPViPmo2IpvwaryF7P+QKYKACyVkwo2mZPr2CpFiz7EtgPEcc3o/JFQ==" }, - "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=" + "bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==" }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "object-assign": "^4", - "vary": "^1" + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "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" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } } }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "fill-range": "^7.0.1" } }, - "create-hash": { + "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.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "cipher-base": "^1.0.1", + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "safe-buffer": "^5.0.1" } }, - "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==", + "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": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "safe-buffer": "^5.1.2" } }, - "cross-fetch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz", - "integrity": "sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==", + "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": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" }, "dependencies": { - "node-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" } } }, - "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=", + "browserify-sha3": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", + "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "js-sha3": "^0.6.1", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "js-sha3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", + "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=" + } } }, - "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==", + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "parse-asn1": "^5.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "base-x": "^3.0.2" } }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "optional": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "optional": true, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "requires": { - "cssom": "0.3.x" + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "csstype": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.9.tgz", - "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "assert-plus": "^1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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": { - "ms": "2.0.0" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "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==" }, - "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=" + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, - "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" - } + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "optional": true, - "requires": { - "mimic-response": "^2.0.0" - } + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "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" - }, - "dependencies": { - "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" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - } - } + "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=" }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "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" + "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" }, "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==" + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, - "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=", + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.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=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "pump": "^3.0.0" } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" } } }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", "type-detect": "^4.0.0" } }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.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" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "requires": { - "abstract-leveldown": "~2.6.0" + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } } }, - "deffy": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.3.tgz", - "integrity": "sha512-c5JD8Z6V1aBWVzn1+aELL97R1pHCwEjXeU3hZXdigkZkxb9vhgFP162kAxGXl992TtAg0btwQyx7d54CqcQaXQ==", + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "requires": { - "typpy": "^2.0.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^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=", + "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=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } } }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "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": { - "object-keys": "^1.0.12" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "circom": { + "version": "github:LimeChain/circom#4ae2447b97d558820a7c7817d602185478ad0b92", + "from": "github:LimeChain/circom", "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "big-integer": "^1.6.32", + "optimist": "^0.6.1", + "yargs": "^12.0.2" }, "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==", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "kind-of": "^6.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.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==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "kind-of": "^6.0.0" + "ansi-regex": "^3.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==", + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.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 || ^4.0.0", + "yargs-parser": "^11.1.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==", + "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=", + "requires": { + "is-descriptor": "^0.1.0" } }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "cli-analytics-sdk": { + "version": "github:LimeChain/cli-analytics-sdk#a6889825b171d1a146936b13287357c93b5535b9", + "from": "github:LimeChain/cli-analytics-sdk", "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "axios": "^0.19.0", + "typescript": "^3.6.4" + }, + "dependencies": { + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + } } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "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=", "requires": { - "repeating": "^2.0.0" + "restore-cursor": "^2.0.0" } }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + } } }, - "docker-cli-js": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/docker-cli-js/-/docker-cli-js-2.7.1.tgz", - "integrity": "sha512-x0MfLInVShMHXVg1WH1fA2KFdtLgpw1qoBOZrcU4pGU1wH/7YvrMpLFLH/nXdLUdMy+YEtBH4IiYbBZ/aKvPwA==", + "cli-table-2-json": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/cli-table-2-json/-/cli-table-2-json-1.0.13.tgz", + "integrity": "sha512-CpUj9dubfuIZSEezwUPycAJqM2dlATyyRUyBkfGeK2KNfrqK3XrdaBohMt0XlkEvsZyDfUEmPWCNvUO+a/7Wsw==", "requires": { - "cli-table-2-json": "1.0.13", - "dockermachine-cli-js": "3.0.5", - "lodash.snakecase": "^4.1.1", - "nodeify-ts": "1.0.6" + "@types/blue-tape": "^0.1.30", + "@types/lodash": "4.14.119", + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } } }, - "dockermachine-cli-js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/dockermachine-cli-js/-/dockermachine-cli-js-3.0.5.tgz", - "integrity": "sha512-oV9RRKGvWrvsGl8JW9TWKpjBJVGxn/1qMvhqwPJiOPfRES0+lrq/Q8Wzixb6qinuXPVBhlWqhXb/Oxrh6Vuf/g==", + "cli-table2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cli-table2/-/cli-table2-0.2.0.tgz", + "integrity": "sha1-LR738hig54biFFQFYtS9F3/jLZc=", "requires": { - "cli-table-2-json": "1.0.13", - "nodeify-ts": "1.0.6" + "colors": "^1.1.2", + "lodash": "^3.10.1", + "string-width": "^1.0.1" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "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": { - "esutils": "^2.0.2" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "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" + } + } } }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "mimic-response": "^1.0.0" } }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "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=" }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "coinstring": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", + "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", "requires": { - "domelementtype": "1" + "bs58": "^2.0.1", + "create-hash": "^1.1.1" + }, + "dependencies": { + "bs58": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", + "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=" + } } }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" - }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "minimatch": "^3.0.4" + "color-name": "1.1.3" } }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } + "color-logger": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.6.tgz", + "integrity": "sha1-5WJF7ymCJlcRDHy3WpzXhstp7Rs=" }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "delayed-stream": "~1.0.0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", - "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==" + "command-exists": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", + "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "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" + "graceful-readlink": ">= 1.0.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + "connected-domain": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz", + "integrity": "sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=" }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true }, - "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==", + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "requires": { - "is-arrayish": "^0.2.1" - } + "safe-buffer": "5.1.2" + }, + "dependencies": { + "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==" + } + } }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "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==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "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.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "object-assign": "^4", + "vary": "^1" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, - "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=" - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" }, "dependencies": { - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" } } }, - "esdoc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esdoc/-/esdoc-1.1.0.tgz", - "integrity": "sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA==", + "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": { - "babel-generator": "6.26.1", - "babel-traverse": "6.26.0", - "babylon": "6.18.0", - "cheerio": "1.0.0-rc.2", - "color-logger": "0.0.6", - "escape-html": "1.0.3", - "fs-extra": "5.0.0", - "ice-cap": "0.0.4", - "marked": "0.3.19", - "minimist": "1.2.0", - "taffydb": "2.7.3" + "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": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "dependencies": { - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, - "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "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": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.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=" - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "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" - } - } + "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" } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - } + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" } }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "optional": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "optional": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "cssom": "0.3.x" } }, - "eslint-visitor-keys": { + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "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" + } + }, + "death": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=" }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" - } + "ms": "2.0.0" } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", + "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": { - "estraverse": "^4.0.0" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - } + "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" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { - "estraverse": "^4.1.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": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" } } }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "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" + } }, - "eth-block-tracker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", - "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", - "requires": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.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", - "tape": "^4.6.3" + "yauzl": "^2.4.2" }, "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" } } } }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - } + "type-detect": "^4.0.0" } }, - "eth-json-rpc-infura": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz", - "integrity": "sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==", + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "deffy": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.3.tgz", + "integrity": "sha512-c5JD8Z6V1aBWVzn1+aELL97R1pHCwEjXeU3hZXdigkZkxb9vhgFP162kAxGXl992TtAg0btwQyx7d54CqcQaXQ==", "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0" + "typpy": "^2.0.0" } }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", - "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "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==", "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" + "kind-of": "^6.0.0" } }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "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==", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "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.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" + "repeating": "^2.0.0" } }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" + "address": "^1.0.1", + "debug": "^2.6.0" }, "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "ms": "2.0.0" } } } }, - "eth-tx-summary": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz", - "integrity": "sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==", + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "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": { - "async": "^2.1.2", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.6.0", - "through2": "^2.0.3" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" }, "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" } } }, - "ethereum-bloom-filters": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz", - "integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "requires": { - "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - } + "path-type": "^4.0.0" } }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - }, - "ethereum-transaction-debugger": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/ethereum-transaction-debugger/-/ethereum-transaction-debugger-0.0.5.tgz", - "integrity": "sha512-ak0cOcblF9wK4zMlOTpkYMy/oRyeWwsnoX3ni+trE2QL+mNYd0idwV1T49+Q3kIv1qGnIyBIr1JGcgng6PnpxQ==", + "docker-cli-js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/docker-cli-js/-/docker-cli-js-2.7.1.tgz", + "integrity": "sha512-x0MfLInVShMHXVg1WH1fA2KFdtLgpw1qoBOZrcU4pGU1wH/7YvrMpLFLH/nXdLUdMy+YEtBH4IiYbBZ/aKvPwA==", "requires": { - "bn.js": "^4.11.8", - "debug": "^4.1.0", - "ethers": "^4.0.27", - "fast-levenshtein": "^2.0.6", - "json-pointer": "^0.6.0", - "json-stable-stringify": "^1.0.1", - "node-interval-tree": "^1.3.3", - "redux": "^3.7.2", - "redux-cli-logger": "^2.0.1", - "redux-saga": "1.0.0", - "remote-redux-devtools": "^0.5.12", - "reselect-tree": "^1.3.0", - "safe-eval": "^0.4.1", - "truffle-code-utils": "1.1.4", - "truffle-decode-utils": "1.0.4", - "truffle-decoder": "2.0.1", - "truffle-solidity-utils": "1.2.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "cli-table-2-json": "1.0.13", + "dockermachine-cli-js": "3.0.5", + "lodash.snakecase": "^4.1.1", + "nodeify-ts": "1.0.6" } }, - "ethereum-types": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/ethereum-types/-/ethereum-types-2.1.6.tgz", - "integrity": "sha512-xaN5TxLvkdFCGjGfUQ5wV00GHzDHStozP1j+K/YdmUeQXVGiD15cogYPhBVWG3pQJM/aBjtYrpMrjywvKkNC4A==", + "dockermachine-cli-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/dockermachine-cli-js/-/dockermachine-cli-js-3.0.5.tgz", + "integrity": "sha512-oV9RRKGvWrvsGl8JW9TWKpjBJVGxn/1qMvhqwPJiOPfRES0+lrq/Q8Wzixb6qinuXPVBhlWqhXb/Oxrh6Vuf/g==", "requires": { - "@types/node": "*", - "bignumber.js": "~8.0.2" + "cli-table-2-json": "1.0.13", + "nodeify-ts": "1.0.6" } }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" + "esutils": "^2.0.2" } }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } - } + "domelementtype": "^1.3.0", + "entities": "^1.1.1" } }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } - } + "domelementtype": "1" } }, - "ethereumjs-common": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", - "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==" - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } - } + "dom-serializer": "0", + "domelementtype": "1" } }, - "ethereumjs-util": { + "dotenv": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, + "drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", + "browserify-aes": "^1.0.6", "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" + "create-hmac": "^1.1.4" } }, - "ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.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" - } - } - } + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, - "ethereumjs-wallet": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz", - "integrity": "sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w==", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereumjs-util": "^6.0.0", - "hdkey": "^1.1.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scrypt.js": "^0.3.0", - "utf8": "^3.0.0", - "uuid": "^3.3.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "etherlime": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/etherlime/-/etherlime-2.2.4.tgz", - "integrity": "sha512-+2ZYnOsYY6z6MVgA7VWLgZwc/pn3CFdmy+BrF6qSPWldi02wD0lAsU/PAttWgKmG51PmYekqh8ZsPyRPH7fBng==", + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "requires": { - "@0x/sol-coverage": "3.0.12", - "axios": "^0.18.0", - "bn": "^1.0.1", - "chai": "4.1.2", - "circom": "github:LimeChain/circom", - "cli-table": "0.3.1", - "colors": "1.3.2", - "docker-cli-js": "^2.5.2", - "ethereum-transaction-debugger": "0.0.5", - "etherlime-config": "^1.0.0", - "etherlime-logger": "^1.1.3", - "etherlime-utils": "^1.1.3", - "ethers": "^4.0.27", - "find-cache-dir": "2.0.0", - "fs-extra": "7.0.1", - "ganache-cli": "6.4.1", - "mocha": "5.2.0", - "original-require": "1.0.1", - "require-from-string": "2.0.2", - "simple-git": "^1.107.0", - "snarkjs": "github:LimeChain/snarkjs", - "solc": "^0.5.1", - "tcp-port-used": "^1.0.1", - "yargs": "11.0.0" + "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" }, "dependencies": { - "colors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", - "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==" + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" } } }, - "etherlime-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/etherlime-config/-/etherlime-config-1.0.0.tgz", - "integrity": "sha512-Z0heb7c7qA4pxqhV63neqmJNR/Cux9JXrERSOvP+KuiJ9Z5tn/MG0eHArBWiR7U3kPu8AXZIJaAvBoeyJkN7VQ==" + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "etherlime-lib": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/etherlime-lib/-/etherlime-lib-1.1.3.tgz", - "integrity": "sha512-0H5hH7GG/3/2VxGJTjZth9zUUTsRAlDG+IY8ePZ95d276/N0GkPIdXjPdHmM+yQc/mMObMOuf/zmxPUP+wlq2g==", + "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.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { - "etherlime-config": "^1.0.0", - "etherlime-logger": "^1.1.2", - "etherlime-utils": "^1.1.2", - "ethers": "git+https://github.com/LimeChain/ethers.js.git#master", - "typescript": "^3.5.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.15.tgz", - "integrity": "sha512-daFGV9GSs6USfPgxceDA8nlSe48XrVCJfDeYm7eokxq/ye7iuOH87hKXgMtEAVLFapkczbZsx868PMDT1Y0a6A==" - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "ethers": { - "version": "git+https://github.com/LimeChain/ethers.js.git#13c82e89991c3cbe81c51d1ceec453a43dbb4415", - "from": "git+https://github.com/LimeChain/ethers.js.git#master", - "requires": { - "@types/node": "^10.3.2", - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.3.3", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } + "once": "^1.4.0" } }, - "etherlime-logger": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/etherlime-logger/-/etherlime-logger-1.1.4.tgz", - "integrity": "sha512-FQuB8tAVTN0YL/xXJRJbmDzYdctr5Kl4o25mQyJf5fxgc+zT2duMMBCOLl/S+8uI5yyB6CjUUu4RP3rkcv8QhQ==", + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + }, + "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==", "requires": { - "fs-extra": "7.0.1" + "is-arrayish": "^0.2.1" } }, - "etherlime-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/etherlime-utils/-/etherlime-utils-1.1.4.tgz", - "integrity": "sha512-kzvjA9f7e7mlOIY4pUve5+ynoVYIqThIzU6ENQjF/d6ZyIyEA3LR7MLTHwkuVHyJq6iV7nKnMTPZZfGlW9I71Q==", + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, "requires": { - "chalk": "2.4.1" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, - "ethers": { - "version": "4.0.45", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.45.tgz", - "integrity": "sha512-N/Wmc6Mw4pQO+Sss1HnKDCSS6KSCx0luoBMiPNq+1GbOaO3YaZOyplBEhj+NEoYsizZYODtkITg2oecPeNnidQ==", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.2", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - }, - "dependencies": { - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "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=" - } + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" } }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "ethlint": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/ethlint/-/ethlint-1.2.5.tgz", - "integrity": "sha512-x2nKK98zmd72SFWL3Ul1S6scWYf5QqG221N6/mFNMO661g7ASvTRINGIWVvHzsvflW6y4tvgMSjnTN5RCTuZug==", + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "requires": { - "ajv": "^5.2.2", - "chokidar": "^1.6.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "diff": "^3.5.0", - "eol": "^0.9.1", - "js-string-escape": "^1.0.1", - "lodash": "^4.14.2", - "sol-digger": "0.0.2", - "sol-explore": "1.6.1", - "solium-plugin-security": "0.1.1", - "solparse": "2.2.8", - "text-table": "^0.2.0" + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "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=" + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "optional": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { - "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" - } - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "esdoc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esdoc/-/esdoc-1.1.0.tgz", + "integrity": "sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA==", + "requires": { + "babel-generator": "6.26.1", + "babel-traverse": "6.26.0", + "babylon": "6.18.0", + "cheerio": "1.0.0-rc.2", + "color-logger": "0.0.6", + "escape-html": "1.0.3", + "fs-extra": "5.0.0", + "ice-cap": "0.0.4", + "marked": "0.3.19", + "minimist": "1.2.0", + "taffydb": "2.7.3" + }, + "dependencies": { + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "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=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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.0" } }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "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=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "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=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "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==" - } + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "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=", - "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=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, - "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=" + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "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=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "minimist": "^1.2.5" } }, - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "optional": true, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": 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.6", - "bundled": 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, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": 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, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": 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.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": 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, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" + "ansi-regex": "^4.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==", - "requires": { - "kind-of": "^6.0.0" - } + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "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=", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "has-flag": "^3.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==" - }, - "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==", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", + "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.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": { - "kind-of": "^6.0.0" + "ms": "2.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==", + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "path-parse": "^1.0.6" } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + } + } + }, + "eslint-module-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.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": { - "is-extglob": "^1.0.0" + "ms": "2.0.0" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "locate-path": "^2.0.0" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "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" + } }, - "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=" + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "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.1.0" + } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "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 }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "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" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", + "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.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": { - "remove-trailing-separator": "^1.0.1" + "ms": "2.0.0" } }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "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" - } - } + "esutils": "^2.0.2", + "isarray": "^1.0.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=", + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "path-parse": "^1.0.6" } } } }, - "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=" - }, - "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==", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "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" + "eslint-visitor-keys": "^1.1.0" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "requires": { - "is-posix-bracket": "^0.1.0" + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + } } }, - "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=", + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", + "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", "requires": { - "fill-range": "^2.1.0" + "estraverse": "^5.0.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==", - "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=", - "requires": { - "kind-of": "^3.0.2" - } + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==" } } }, - "expand-template": { + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "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.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" }, "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "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==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "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==", + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "requires": { - "is-plain-object": "^2.0.4" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } } } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "ethereum-bloom-filters": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz", + "integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", "requires": { - "is-extglob": "^1.0.0" + "js-sha3": "^0.8.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=" + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=", - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "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" - } - }, - "fetch-ponyfill": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", - "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", + "ethereum-transaction-debugger": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/ethereum-transaction-debugger/-/ethereum-transaction-debugger-0.0.5.tgz", + "integrity": "sha512-ak0cOcblF9wK4zMlOTpkYMy/oRyeWwsnoX3ni+trE2QL+mNYd0idwV1T49+Q3kIv1qGnIyBIr1JGcgng6PnpxQ==", "requires": { - "node-fetch": "~1.7.1" + "bn.js": "^4.11.8", + "debug": "^4.1.0", + "ethers": "^4.0.27", + "fast-levenshtein": "^2.0.6", + "json-pointer": "^0.6.0", + "json-stable-stringify": "^1.0.1", + "node-interval-tree": "^1.3.3", + "redux": "^3.7.2", + "redux-cli-logger": "^2.0.1", + "redux-saga": "1.0.0", + "remote-redux-devtools": "^0.5.12", + "reselect-tree": "^1.3.0", + "safe-eval": "^0.4.1", + "truffle-code-utils": "1.1.4", + "truffle-decode-utils": "1.0.4", + "truffle-decoder": "2.0.1", + "truffle-solidity-utils": "1.2.2" }, "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } + "ethereumjs-common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", + "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==" }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", "requires": { - "flat-cache": "^2.0.1" + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" } }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "ethereumjs-util": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", + "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", "requires": { - "to-regex-range": "^5.0.1" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^2.0.0", + "rlp": "^2.2.3", + "secp256k1": "^3.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "ethereumjs-wallet": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz", + "integrity": "sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w==", "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "aes-js": "^3.1.1", + "bs58check": "^2.1.2", + "ethereumjs-util": "^6.0.0", + "hdkey": "^1.1.0", + "randombytes": "^2.0.6", + "safe-buffer": "^5.1.2", + "scrypt.js": "^0.3.0", + "utf8": "^3.0.0", + "uuid": "^3.3.2" } }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "etherlime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/etherlime/-/etherlime-2.3.1.tgz", + "integrity": "sha512-J7quhmcOhjwCdi3/3uXQLeyUg5X4XBxsqNngygieaUCXLijyrCMhrFQP/mCzNcsgOJCjZRM63+Q33cA9dONXNg==", "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" + "axios": "^0.18.0", + "bn": "^1.0.1", + "chai": "4.1.2", + "circom": "github:LimeChain/circom", + "cli-analytics-sdk": "github:LimeChain/cli-analytics-sdk", + "cli-table": "0.3.1", + "colors": "1.3.2", + "docker-cli-js": "^2.5.2", + "ethereum-transaction-debugger": "0.0.5", + "etherlime-config": "^1.0.0", + "etherlime-logger": "^1.2.0", + "etherlime-utils": "^1.1.4", + "ethers": "^4.0.27", + "find-cache-dir": "2.0.0", + "fs-extra": "7.0.1", + "ganache-cli": "6.9.1", + "mocha": "5.2.0", + "original-require": "1.0.1", + "require-from-string": "2.0.2", + "simple-git": "^1.107.0", + "snarkjs": "github:LimeChain/snarkjs", + "solc": "^0.6.1", + "solidity-coverage": "0.7.2", + "tcp-port-used": "^1.0.1", + "yargs": "11.0.0" + }, + "dependencies": { + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==" + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "solc": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.4.tgz", + "integrity": "sha512-HjUCys7ue9n7lGCa1XNf+wDdEY/wY64CpwnD4iPxW+BYYUX6ytwWXKitoolPXOOVxq4jewvwtL7Pngs+5k954A==", + "requires": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + } + } + } } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "etherlime-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/etherlime-config/-/etherlime-config-1.0.0.tgz", + "integrity": "sha512-Z0heb7c7qA4pxqhV63neqmJNR/Cux9JXrERSOvP+KuiJ9Z5tn/MG0eHArBWiR7U3kPu8AXZIJaAvBoeyJkN7VQ==" + }, + "etherlime-lib": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/etherlime-lib/-/etherlime-lib-1.1.3.tgz", + "integrity": "sha512-0H5hH7GG/3/2VxGJTjZth9zUUTsRAlDG+IY8ePZ95d276/N0GkPIdXjPdHmM+yQc/mMObMOuf/zmxPUP+wlq2g==", "requires": { - "locate-path": "^2.0.0" + "etherlime-config": "^1.0.0", + "etherlime-logger": "^1.1.2", + "etherlime-utils": "^1.1.2", + "ethers": "git+https://github.com/LimeChain/ethers.js.git#master", + "typescript": "^3.5.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "elliptic": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", + "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "ethers": { + "version": "git+https://github.com/LimeChain/ethers.js.git#c68684b9f886ba09c1335e3bf00c5435b2056a99", + "from": "git+https://github.com/LimeChain/ethers.js.git#master", + "requires": { + "@types/node": "^10.3.2", + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.3.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "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==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } } }, - "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "etherlime-logger": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/etherlime-logger/-/etherlime-logger-1.2.0.tgz", + "integrity": "sha512-VvoqdLC0+y5IJcYQwxxQgNOU6sFtdPB6tnAiMLzJ7rgA1BC3hfvUS9k+kCiF8CQyOG/mVRf5rl++/LmgdTCchg==", "requires": { - "semver-regex": "^2.0.0" + "fs-extra": "7.0.1" } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "etherlime-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/etherlime-utils/-/etherlime-utils-1.1.4.tgz", + "integrity": "sha512-kzvjA9f7e7mlOIY4pUve5+ynoVYIqThIzU6ENQjF/d6ZyIyEA3LR7MLTHwkuVHyJq6iV7nKnMTPZZfGlW9I71Q==", "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "chalk": "2.4.1" }, "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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==", "requires": { - "glob": "^7.1.3" + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" } } } }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "ethers": { + "version": "4.0.46", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.46.tgz", + "integrity": "sha512-/dPMzzpInhtiip4hKFvsDiJKeRk64IhyA+Po7CtNXneQFSOCYXg8eBFt+jXbxUQyApgWnWOtYxWdfn9+CvvxDA==", "requires": { - "debug": "=3.1.0" + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.5.2", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "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==", "requires": { - "ms": "2.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" } } }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", "requires": { - "is-callable": "^1.1.3" + "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=" + } } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "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.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "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=", + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "requires": { - "map-cache": "^0.2.2" + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "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": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "ethlint": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/ethlint/-/ethlint-1.2.5.tgz", + "integrity": "sha512-x2nKK98zmd72SFWL3Ul1S6scWYf5QqG221N6/mFNMO661g7ASvTRINGIWVvHzsvflW6y4tvgMSjnTN5RCTuZug==", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "ajv": "^5.2.2", + "chokidar": "^1.6.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "diff": "^3.5.0", + "eol": "^0.9.1", + "js-string-escape": "^1.0.1", + "lodash": "^4.14.2", + "sol-digger": "0.0.2", + "sol-explore": "1.6.1", + "solium-plugin-security": "0.1.1", + "solparse": "2.2.8", + "text-table": "^0.2.0" }, "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "graceful-fs": "^4.1.6" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "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=" + }, + "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=" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" } } }, - "fs-promise": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", - "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "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=" + }, + "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": { - "any-promise": "^1.3.0", - "fs-extra": "^2.0.0", - "mz": "^2.6.0", - "thenify-all": "^1.6.0" - }, - "dependencies": { - "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" - } - } + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "fs.realpath": { + "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.name": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.12.tgz", - "integrity": "sha512-C7Tu+rAFrWW5RjXqtKtXp2xOdCujq+4i8ZH3w0uz/xrYHBwXZrPt96x8cDAEHrIjeyEv/Jm6iDGyqupbaVQTlw==", + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "noop6": "^1.0.1" + "is-posix-bracket": "^0.1.0" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "ganache-cli": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.4.1.tgz", - "integrity": "sha512-MUZ1DNnmlTrXnH6EuINuew75AI9d/wbIC0WpZCJo5Endsf6ZwEvfnfxGMpEnVizRri1mon2WWxLGAmALDxVcRQ==", + "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=", "requires": { - "bn.js": "4.11.8", - "source-map-support": "0.5.9", - "yargs": "11.1.0" + "fill-range": "^2.1.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "bn.js": { - "version": "4.11.8", - "bundled": true - }, - "buffer-from": { - "version": "1.1.1", - "bundled": true - }, - "camelcase": { - "version": "4.1.0", - "bundled": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "cross-spawn": { - "version": "5.1.0", - "bundled": true, + "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==", "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, - "decamelize": { - "version": "1.2.0", - "bundled": true + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "execa": { - "version": "0.7.0", - "bundled": true, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "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" + "kind-of": "^3.0.2" } }, - "find-up": { - "version": "2.1.0", - "bundled": true, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "locate-path": "^2.0.0" + "is-buffer": "^1.1.5" } - }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.4", - "bundled": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^3.0.2" - } - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "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.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "ms": "2.0.0" } }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "p-limit": { - "version": "1.3.0", - "bundled": true, - "requires": { - "p-try": "^1.0.0" - } + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "p-locate": { + "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==" + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { "version": "2.0.0", - "bundled": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true - }, - "path-exists": { - "version": "3.0.0", - "bundled": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true - }, - "require-directory": { - "version": "2.1.1", - "bundled": true - }, - "require-main-filename": { + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { "version": "1.0.1", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "source-map": { - "version": "0.6.1", - "bundled": true - }, - "source-map-support": { - "version": "0.5.9", - "bundled": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "ansi-regex": "^3.0.0" + "is-plain-object": "^2.0.4" } - }, - "strip-eof": { + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { "version": "1.0.0", - "bundled": true - }, - "which": { - "version": "1.3.1", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": 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", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true - }, - "yargs": { - "version": "11.1.0", - "bundled": 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", - "bundled": true, - "requires": { - "camelcase": "^4.1.0" - } + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" } } }, - "ganache-core": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.10.2.tgz", - "integrity": "sha512-4XEO0VsqQ1+OW7Za5fQs9/Kk7o8M0T1sRfFSF8h9NeJ2ABaqMO5waqxf567ZMcSkRKaTjUucBSz83xNfZv1HDg==", - "requires": { - "abstract-leveldown": "3.0.0", - "async": "2.6.2", - "bip39": "2.5.0", - "cachedown": "1.0.0", - "clone": "2.1.2", - "debug": "3.2.6", - "encoding-down": "5.0.4", - "eth-sig-util": "2.3.0", - "ethereumjs-abi": "0.6.7", - "ethereumjs-account": "3.0.0", - "ethereumjs-block": "2.2.2", - "ethereumjs-common": "1.5.0", - "ethereumjs-tx": "2.1.2", - "ethereumjs-util": "6.2.0", - "ethereumjs-vm": "4.1.3", - "ethereumjs-wallet": "0.6.3", - "heap": "0.2.6", - "level-sublevel": "6.6.4", - "levelup": "3.1.1", - "lodash": "4.17.14", - "merkle-patricia-tree": "2.3.2", - "seedrandom": "3.0.1", - "source-map-support": "0.5.12", - "tmp": "0.1.0", - "web3": "1.2.4", - "web3-provider-engine": "14.2.1", - "websocket": "1.0.29" + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastq": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "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=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "@babel/types": "^7.8.3" + "ms": "2.0.0" } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "glob": "^7.1.3" } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "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.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "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=", + "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=" + }, + "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": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.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" + }, + "dependencies": { + "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": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" - } + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" } }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "graceful-fs": "^4.1.6" } + } + } + }, + "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.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - } - } + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - } + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "@istanbuljs/load-nyc-config": { + "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" + "chownr": { + "version": "1.1.4", + "bundled": true, + "optional": 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==", - "requires": { - "any-observable": "^0.3.0" - } + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true }, - "@types/bignumber.js": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", - "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", - "requires": { - "bignumber.js": "*" - } + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true }, - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, "requires": { - "@types/node": "*" + "ms": "^2.1.1" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true }, - "@types/node": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.2.tgz", - "integrity": "sha512-Fr6a47c84PRLfd7M7u3/hEknyUdQrrBA6VoPmkze0tcflhU5UnpWEX2kn12ktA/lb+MNHSqFlSiPHIHsaErTPA==" + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true }, - "@types/web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-eFiYJKggNrOl0nsD+9cMh2MLk4zVBfXfGnVeRFbpiZzBE20eet4KLA3fXcjSuHaBn0RnQzwLAGdgzgzdet4C0A==", + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, "requires": { - "web3": "*" + "minipass": "^2.6.0" } }, - "@web3-js/scrypt-shim": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz", - "integrity": "sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw==", + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, "requires": { - "scryptsy": "^2.1.0", - "semver": "^6.3.0" - }, - "dependencies": { - "scryptsy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "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" } }, - "@web3-js/websocket": { - "version": "1.0.30", - "resolved": "https://registry.npmjs.org/@web3-js/websocket/-/websocket-1.0.30.tgz", - "integrity": "sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA==", + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, "requires": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - } + "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" } }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "safer-buffer": ">= 2.1.2 < 3" } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "minimatch": "^3.0.4" } }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "once": "^1.3.0", + "wrappy": "1" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, "requires": { - "@xtuc/ieee754": "^1.2.0" + "number-is-nan": "^1.0.0" } }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, "requires": { - "@xtuc/long": "4.2.2" + "brace-expansion": "^1.1.7" } }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + "minimist": { + "version": "1.2.5", + "bundled": true, + "optional": true }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "minipass": "^2.9.0" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "minimist": "^1.2.5" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" } }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "nopt": { + "version": "4.0.3", + "bundled": true, + "optional": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" + "abbrev": "1", + "osenv": "^0.1.4" } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true }, - "abstract-leveldown": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz", - "integrity": "sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==", + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "optional": true, "requires": { - "xtend": "~4.0.0" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, - "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true }, - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", + "object-assign": { + "version": "4.1.1", + "bundled": true, "optional": true }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "dependencies": { - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - } + "wrappy": "1" } }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "ajv-errors": { + "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "bundled": true, + "optional": true }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, "requires": { - "ansi-wrap": "^0.1.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "optional": true, "requires": { - "type-fest": "^0.8.1" + "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" } }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, "requires": { - "ansi-wrap": "0.1.0" + "glob": "^7.1.3" } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": 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==" + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true }, - "anymatch": { + "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true }, - "append-buffer": { + "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "bundled": true, + "optional": true, "requires": { - "buffer-equal": "^1.0.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "requires": { - "default-require-extensions": "^3.0.0" + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, "requires": { - "sprintf-js": "~1.0.2" + "ansi-regex": "^2.0.0" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, "requires": { - "make-iterator": "^1.0.0" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" } }, - "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==" + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, "requires": { - "make-iterator": "^1.0.0" + "string-width": "^1.0.2 || 2" } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.name": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.12.tgz", + "integrity": "sha512-C7Tu+rAFrWW5RjXqtKtXp2xOdCujq+4i8ZH3w0uz/xrYHBwXZrPt96x8cDAEHrIjeyEv/Jm6iDGyqupbaVQTlw==", + "requires": { + "noop6": "^1.0.1" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "ganache-cli": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.9.1.tgz", + "integrity": "sha512-VPBumkNUZzXDRQwVOby5YyQpd5t1clkr06xMgB28lZdEIn5ht1GMwUskOTFOAxdkQ4J12IWP0gdeacVRGowqbA==", + "requires": { + "ethereumjs-util": "6.1.0", + "source-map-support": "0.5.12", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "ansi-styles": { + "version": "3.2.1", + "bundled": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" + "color-convert": "^1.9.0" } }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "bindings": { + "version": "1.5.0", + "bundled": true, "requires": { - "array-slice": "^1.0.0", - "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==" - } + "file-uri-to-path": "1.0.0" } }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "bip66": { + "version": "1.1.5", + "bundled": 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==" - } + "safe-buffer": "^5.0.1" } }, - "array-slice": { + "bn.js": { + "version": "4.11.8", + "bundled": true + }, + "brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + "bundled": true }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "browserify-aes": { + "version": "1.2.0", + "bundled": true, "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "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==" - } + "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" } }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "buffer-from": { + "version": "1.1.1", + "bundled": true }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } + "buffer-xor": { + "version": "1.0.3", + "bundled": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } + "camelcase": { + "version": "5.3.1", + "bundled": true }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "cipher-base": { + "version": "1.0.4", + "bundled": true, "requires": { - "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "safe-buffer": "^5.0.1" } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "cliui": { + "version": "5.0.0", + "bundled": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "assert-match": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/assert-match/-/assert-match-1.1.1.tgz", - "integrity": "sha512-c0QY2kpYVrH/jis6cCq9Mnt4/bIdGALDh1N8HY9ZARZedsMs5LSbgywxkjd5A1uNVLN0L8evANxBPxKiabVoZw==", + "color-convert": { + "version": "1.9.3", + "bundled": true, "requires": { - "assert": "^1.4.1", - "babel-runtime": "^6.23.0", - "es-to-primitive": "^1.1.1", - "lodash.merge": "^4.6.0" + "color-name": "1.1.3" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + "color-name": { + "version": "1.1.3", + "bundled": true }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "create-hash": { + "version": "1.2.0", + "bundled": true, "requires": { - "lodash": "^4.17.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "create-hmac": { + "version": "1.1.7", + "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" + "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" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "cross-spawn": { + "version": "6.0.5", + "bundled": true, "requires": { - "async": "^2.4.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "decamelize": { + "version": "1.2.0", + "bundled": true }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "drbg.js": { + "version": "1.0.1", + "bundled": true, "requires": { - "async-done": "^1.2.2" + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "elliptic": { + "version": "6.5.0", + "bundled": true, + "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" + } }, - "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=" + "emoji-regex": { + "version": "7.0.3", + "bundled": true }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } }, - "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=", + "ethereumjs-util": { + "version": "6.1.0", + "bundled": 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==", - "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==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" } }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "ethjs-util": { + "version": "0.1.6", + "bundled": 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" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.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=", + "evp_bytestokey": { + "version": "1.0.3", + "bundled": true, "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.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=", + "execa": { + "version": "1.0.0", + "bundled": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" } }, - "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=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } + "file-uri-to-path": { + "version": "1.0.0", + "bundled": true }, - "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=", + "find-up": { + "version": "3.0.0", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "locate-path": "^3.0.0" } }, - "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=", + "get-caller-file": { + "version": "2.0.5", + "bundled": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": 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" + "pump": "^3.0.0" } }, - "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=", + "hash-base": { + "version": "3.0.4", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.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=", + "hash.js": { + "version": "1.1.7", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.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=", + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.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=", + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "is-hex-prefixed": { + "version": "1.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "keccak": { + "version": "1.4.0", + "bundled": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" } }, - "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=", + "lcid": { + "version": "2.0.0", + "bundled": 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" + "invert-kv": "^2.0.0" } }, - "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=", + "locate-path": { + "version": "3.0.0", + "bundled": 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" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "p-defer": "^1.0.0" } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "md5.js": { + "version": "1.3.5", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "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=", + "mem": { + "version": "4.3.0", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.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=" + "mimic-fn": { + "version": "2.1.0", + "bundled": 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=" + "minimalistic-assert": { + "version": "1.0.1", + "bundled": 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=" + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true }, - "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=", - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } + "nan": { + "version": "2.14.0", + "bundled": true }, - "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=", - "requires": { - "babel-runtime": "^6.22.0" - } + "nice-try": { + "version": "1.0.5", + "bundled": true }, - "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=", + "npm-run-path": { + "version": "2.0.2", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0" + "path-key": "^2.0.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=", + "once": { + "version": "1.4.0", + "bundled": 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" + "wrappy": "1" } }, - "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=", + "os-locale": { + "version": "3.1.0", + "bundled": 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" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "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=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "p-defer": { + "version": "1.0.0", + "bundled": true }, - "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=", - "requires": { - "babel-runtime": "^6.22.0" - } + "p-finally": { + "version": "1.0.0", + "bundled": true }, - "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=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "p-is-promise": { + "version": "2.1.0", + "bundled": true }, - "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=", + "p-limit": { + "version": "2.2.0", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0" + "p-try": "^2.0.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=", + "p-locate": { + "version": "3.0.0", + "bundled": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "p-limit": "^2.0.0" } }, - "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=", - "requires": { - "babel-runtime": "^6.22.0" - } + "p-try": { + "version": "2.2.0", + "bundled": true }, - "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=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "path-exists": { + "version": "3.0.0", + "bundled": true }, - "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==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } + "path-key": { + "version": "2.0.1", + "bundled": true }, - "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=", + "pump": { + "version": "3.0.0", + "bundled": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.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=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "require-directory": { + "version": "2.1.1", + "bundled": true }, - "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=", - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } + "require-main-filename": { + "version": "2.0.0", + "bundled": true }, - "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=", + "ripemd160": { + "version": "2.0.2", + "bundled": 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" + "hash-base": "^3.0.0", + "inherits": "^2.0.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=", + "rlp": { + "version": "2.2.3", + "bundled": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "bn.js": "^4.11.1", + "safe-buffer": "^5.1.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=", - "requires": { - "babel-runtime": "^6.22.0" - } + "safe-buffer": { + "version": "5.2.0", + "bundled": true }, - "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=", + "secp256k1": { + "version": "3.7.1", + "bundled": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" } }, - "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=", - "requires": { - "babel-runtime": "^6.22.0" - } + "semver": { + "version": "5.7.0", + "bundled": true }, - "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=", - "requires": { - "babel-runtime": "^6.22.0" - } + "set-blocking": { + "version": "2.0.0", + "bundled": true }, - "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=", + "sha.js": { + "version": "2.4.11", + "bundled": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "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=", + "shebang-command": { + "version": "1.2.0", + "bundled": 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" + "shebang-regex": "^1.0.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=", - "requires": { - "regenerator-transform": "^0.10.0" - } + "shebang-regex": { + "version": "1.0.0", + "bundled": true }, - "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=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "signal-exit": { + "version": "3.0.2", + "bundled": true }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^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.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "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.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } + "source-map": { + "version": "0.6.1", + "bundled": true }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "source-map-support": { + "version": "0.5.12", + "bundled": 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" - }, - "dependencies": { - "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" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "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==", - "requires": { - "source-map": "^0.5.6" - } - } + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "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=", + "string-width": { + "version": "3.1.0", + "bundled": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "strip-ansi": { + "version": "5.2.0", + "bundled": 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" + "ansi-regex": "^4.1.0" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "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==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } + "strip-eof": { + "version": "1.0.0", + "bundled": true }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "strip-hex-prefix": { + "version": "1.0.0", + "bundled": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "is-hex-prefixed": "1.0.0" } }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "which": { + "version": "1.3.1", + "bundled": true, "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" + "isexe": "^2.0.0" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "which-module": { + "version": "2.0.0", + "bundled": true }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" - } + "wrappy": { + "version": "1.0.2", + "bundled": true }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "y18n": { + "version": "4.0.0", + "bundled": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "yargs": { + "version": "13.2.4", + "bundled": 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=", - "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==", - "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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" } }, - "base-x": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz", - "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==", - "optional": true, + "yargs-parser": { + "version": "13.1.1", + "bundled": true, "requires": { - "safe-buffer": "^5.0.1" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-params": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", + "integrity": "sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "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" + } + }, + "ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "requires": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "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==", "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - } + "color-convert": "^1.9.0" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "file-uri-to-path": "1.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "bip39": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz", - "integrity": "sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" + "has-flag": "^3.0.0" } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + } + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "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=", "requires": { - "safe-buffer": "^5.0.1" + "is-glob": "^2.0.0" } }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "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.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "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" + "is-extglob": "^1.0.0" } + } + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" + } + } + }, + "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" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "handlebars": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", + "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^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=" + }, + "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-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "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==", + "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=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, + "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=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "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" + "kind-of": "^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=", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-extendable": "^0.1.0" + "is-buffer": "^1.1.5" } } } }, - "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.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "browserfs": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/browserfs/-/browserfs-1.4.3.tgz", - "integrity": "sha512-tz8HClVrzTJshcyIu8frE15cjqjcBIu15Bezxsvl/i+6f59iNCN3kznlWjz0FEb3DlnDx3gW5szxeT6D1x0s0w==", - "requires": { - "async": "^2.1.4", - "pako": "^1.0.4" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "is-buffer": "^1.1.5" } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + } + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hdkey": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.1.tgz", + "integrity": "sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==", + "requires": { + "coinstring": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "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" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "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" + } + }, + "husky": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", + "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", + "requires": { + "chalk": "^3.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.5.1", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "browserify-sha3": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", - "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "requires": { - "js-sha3": "^0.6.1", - "safe-buffer": "^5.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "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" + "color-name": "~1.1.4" } }, - "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==", - "requires": { - "pako": "~1.0.5" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "optional": true, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "base-x": "^3.0.2" + "p-locate": "^4.1.0" } }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "optional": true, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "p-limit": "^2.2.0" } }, - "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "find-up": "^4.0.0" } }, - "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==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "has-flag": "^4.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-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" - }, - "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.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "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-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "bytewise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", - "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=", + } + } + }, + "ice-cap": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ice-cap/-/ice-cap-0.0.4.tgz", + "integrity": "sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg=", + "requires": { + "cheerio": "0.20.0", + "color-logger": "0.0.3" + }, + "dependencies": { + "cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", + "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", "requires": { - "bytewise-core": "^1.2.2", - "typewise": "^1.0.3" + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "jsdom": "^7.0.2", + "lodash": "^4.1.0" } }, - "bytewise-core": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", - "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=", + "color-logger": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.3.tgz", + "integrity": "sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg=" + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", "requires": { - "typewise-core": "^1.2" + "domelementtype": "1" } }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" }, "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "requires": { - "yallist": "^4.0.0" - } - }, - "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" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "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": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, - "cachedown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz", - "integrity": "sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=", - "requires": { - "abstract-leveldown": "^2.4.1", - "lru-cache": "^3.2.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" } } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "caniuse-lite": { - "version": "1.0.30001023", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz", - "integrity": "sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, - "checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", - "requires": { - "functional-red-black-tree": "^1.0.1" - } + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "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=" + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "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.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "requires": { - "tslib": "^1.9.0" + "type-fest": "^0.11.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, - "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==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.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==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -8648,13436 +6843,1643 @@ "restore-cursor": "^3.1.0" } }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" - } + "color-name": "~1.1.4" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "cliui": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "escape-string-regexp": "^1.0.5" } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "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=" - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "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=" - }, - "coinstring": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", - "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", - "optional": true, - "requires": { - "bs58": "^2.0.1", - "create-hash": "^1.1.1" - }, - "dependencies": { - "bs58": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=", - "optional": true - } - } - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "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=" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-exists": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" - }, - "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" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "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==" - } - } - }, - "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.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "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==" - } - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "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" - } - } + "mimic-fn": "^2.1.0" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" - }, - "core-js-pure": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", - "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==" - }, - "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.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { - "object-assign": "^4", - "vary": "^1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "cosmiconfig": { + "strip-ansi": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "dependencies": { - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - } - } - }, - "coveralls": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.9.tgz", - "integrity": "sha512-nNBg3B1+4iDox5A5zqHKzUTiwl2ey4k2o0NEcVZYvl+GOSJdKBj4AJGKLv6h3SvWch7tABHePAQOSZWM9E2hMg==", - "requires": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.88.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "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==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "ansi-regex": "^5.0.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==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "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" + "has-flag": "^4.0.0" } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "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=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "cross-env": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", - "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "cross-spawn": "^7.0.0" + "is-buffer": "^1.1.5" } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "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=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "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=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "cross-fetch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz", - "integrity": "sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } + "is-buffer": "^1.1.5" } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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==" + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "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=", + "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=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "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" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "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": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "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==", + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, + "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=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "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==" + }, + "is2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", + "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^2.1.0", + "is-url": "^1.2.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, - "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==", + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "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" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" } }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "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" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "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" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-compare": { + "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "requires": { - "kind-of": "^5.0.2" - }, - "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==" - } - } - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "requires": { - "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "requires": { - "abstract-leveldown": "~2.6.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "requires": { - "xtend": "~4.0.0" - } - } - } + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", "requires": { - "object-keys": "^1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } + "minimist": "^1.2.5" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "optional": 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==", - "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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "amdefine": ">=0.0.4" } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "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.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "has-flag": "^1.0.0" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-file": { + "wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "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==" - }, - "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" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "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==" - }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "requires": { - "minimatch": "^3.0.4" - } - }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.341", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.341.tgz", - "integrity": "sha512-iezlV55/tan1rvdvt7yg7VHRSkt+sKfzQ16wTDqTbQqtl4+pSUkKPXpQHDvEt0c7gKcUHHwUbffOgXz6bn096g==" - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=" - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "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" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "encoding-down": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz", - "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", - "requires": { - "abstract-leveldown": "^5.0.0", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "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==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + } + } + }, + "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" + } + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsan": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.13.tgz", + "integrity": "sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "optional": true, + "requires": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + }, + "dependencies": { + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "optional": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "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==" + }, + "json-pointer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.0.tgz", + "integrity": "sha1-jlAFUKaqxUZKRzN32leqbMIoKNc=", + "requires": { + "foreach": "^2.0.4" + } + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "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=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "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=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "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=" + }, + "jsonschema": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.5.tgz", + "integrity": "sha512-kVTF+08x25PQ0CjuVc0gRM9EUPb0Fe9Ln/utFOgcdxEIOHuU7ooBk/UPTd7t1M91pP35m0MU1T8M5P7vP1bRRw==" + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", + "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", + "requires": { + "bindings": "^1.5.0", + "inherits": "^2.0.4", + "nan": "^2.14.0", + "safe-buffer": "^5.2.0" + } + }, + "keccakjs": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", + "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", + "requires": { + "browserify-sha3": "^0.0.4", + "sha3": "^1.2.2" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "linked-list": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/linked-list/-/linked-list-0.1.0.tgz", + "integrity": "sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=" + }, + "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" + }, + "dependencies": { + "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": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "error-ex": "^1.2.0" } - }, - "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=" - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "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==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "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" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "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=" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-standard": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", - "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==" - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-plugin-es": { + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.range": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.range/-/lodash.range-3.2.0.tgz", + "integrity": "sha1-9GHliPZmg/fq3q3lE+OKaaVloV0=" + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.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.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + }, + "dependencies": { + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "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/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", - "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==" - } - } - }, - "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.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" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "^2.0.2", - "isarray": "^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" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "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=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^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=" - } - } - }, - "eslint-plugin-node": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz", - "integrity": "sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg==", - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "eslint-plugin-promise": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", - "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==" - }, - "eslint-plugin-standard": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", - "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==" - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "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.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "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==", "requires": { - "eslint-visitor-keys": "^1.1.0" + "is-plain-object": "^2.0.4" } + } + } + }, + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==" + }, + "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": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" + "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" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { - "estraverse": "^4.0.0" + "minimist": "0.0.8" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "estraverse": "^4.1.0" + "has-flag": "^3.0.0" } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eth-block-tracker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", - "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", - "requires": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } + } + } + }, + "mock-fs": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.11.0.tgz", + "integrity": "sha512-Yp4o3/ZA15wsXqJTT+R+9w2AYIkD1i80Lds47wDbuUhOvQvm+O2EfjFZSz0pMgZZSPHRhGxgcd2+GL4+jZMtdw==" + }, + "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=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "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.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "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=" + }, + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "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-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": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-interval-tree": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-1.3.3.tgz", + "integrity": "sha512-K9vk96HdTK5fEipJwxSvIIqwTqr4e3HRJeJrNxBSeVMNSC/JWARRaX7etOLOuTmrRMeOI/K5TCJu3aWIwZiNTw==", + "requires": { + "shallowequal": "^1.0.2" + } + }, + "nodeify-ts": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/nodeify-ts/-/nodeify-ts-1.0.6.tgz", + "integrity": "sha512-jq+8sqVG1aLqy5maMTceL8NUJ1CvarWztlxvrYh3G0aao9BsVeoVmVedUnrUSBLetP7oLIAJrPrw4+iIo7v3GA==" + }, + "noop6": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.8.tgz", + "integrity": "sha512-+Al5csMVc40I8xRfJsyBcN1IbpyvebOuQmMfxdw+AL6ECELey12ANgNTRhMfTwNIDU4W9W0g8EHLcsb3+3qPFA==" + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" } }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, + "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" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.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=" + } + } + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "optional": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "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=", + "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=", "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - } + "is-descriptor": "^0.1.0" } }, - "eth-json-rpc-infura": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz", - "integrity": "sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==", - "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0" - } - }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", - "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - } - } - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - }, - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - } - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - } - } - }, - "eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-sig-util": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.3.0.tgz", - "integrity": "sha512-ugD1AvaggvKaZDgnS19W5qOfepjGc7qHrt7TrAaL54gJw9SHvgIXJ3r2xOMW30RWJZNP+1GlTOy5oye7yXA4xA==", - "requires": { - "buffer": "^5.2.1", - "elliptic": "^6.4.0", - "ethereumjs-abi": "0.6.5", - "ethereumjs-util": "^5.1.1", - "tweetnacl": "^1.0.0", - "tweetnacl-util": "^0.15.0" - }, - "dependencies": { - "ethereumjs-abi": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", - "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "eth-tx-summary": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz", - "integrity": "sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==", - "requires": { - "async": "^2.1.2", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - } - } - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - }, - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - } - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - } - } - }, - "ethashjs": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ethashjs/-/ethashjs-0.0.7.tgz", - "integrity": "sha1-ML/kGWcmaQoMWdO4Jy5w1NDDS64=", - "requires": { - "async": "^1.4.2", - "buffer-xor": "^1.0.3", - "ethereumjs-util": "^4.0.1", - "miller-rabin": "^4.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereum-bloom-filters": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz", - "integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", - "requires": { - "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - } - } - }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - }, - "ethereumjs-abi": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.7.tgz", - "integrity": "sha512-EMLOA8ICO5yAaXDhjVEfYjsJIXYutY8ufTE93eEKwsVtp2usQreKwsDTJ9zvam3omYqNuffr8IONIqb2uUslGQ==", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-account": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz", - "integrity": "sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==", - "requires": { - "ethereumjs-util": "^6.0.0", - "rlp": "^2.2.1", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-blockchain": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.3.tgz", - "integrity": "sha512-0nJWbyA+Gu0ZKZr/cywMtB/77aS/4lOVsIKbgUN2sFQYscXO5rPbUfrEe7G2Zhjp86/a0VqLllemDSTHvx3vZA==", - "requires": { - "async": "^2.6.1", - "ethashjs": "~0.0.7", - "ethereumjs-block": "~2.2.2", - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "~6.1.0", - "flow-stoplight": "^1.0.0", - "level-mem": "^3.0.1", - "lru-cache": "^5.1.1", - "rlp": "^2.2.2", - "semaphore": "^1.1.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - } - } - }, - "ethereumjs-common": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", - "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==" - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - }, - "dependencies": { - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - } - } - }, - "ethereumjs-vm": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.1.3.tgz", - "integrity": "sha512-RTrD0y7My4O6Qr1P2ZIsMfD6RzL6kU/RhBZ0a5XrPzAeR61crBS7or66ohDrvxDI/rDBxMi+6SnsELih6fzalw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "core-js-pure": "^3.0.1", - "ethereumjs-account": "^3.0.0", - "ethereumjs-block": "^2.2.2", - "ethereumjs-blockchain": "^4.0.3", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.2", - "ethereumjs-util": "^6.2.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1", - "util.promisify": "^1.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - }, - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - } - } + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "ethereumjs-wallet": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz", - "integrity": "sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w==", - "optional": true, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereumjs-util": "^6.0.0", - "hdkey": "^1.1.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scrypt.js": "^0.3.0", - "utf8": "^3.0.0", - "uuid": "^3.3.2" + "is-buffer": "^1.1.5" } - }, - "ethers": { - "version": "4.0.43", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.43.tgz", - "integrity": "sha512-VjQRVgPrlU12jSMvypdE1yEqYQccdVbH8bbiz67dLF7raHlRV4+zW70GlxHcZYqgsnz0XYWrn6C06gqTQRb5tw==", - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.2", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - }, - "dependencies": { - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } - } - }, - "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=" - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" - }, - "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": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "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==", - "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=", - "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=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "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.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "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==" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "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==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "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=", - "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=", - "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==", - "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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=", - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "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" - } - }, - "fetch-ponyfill": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", - "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", - "requires": { - "node-fetch": "~1.7.1" - }, - "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" - }, - "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "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=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - } - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" - }, - "flow-stoplight": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flow-stoplight/-/flow-stoplight-1.0.0.tgz", - "integrity": "sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "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=" - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" - } - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "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.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "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=", - "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=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fromentries": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", - "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==" - }, - "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": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "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.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": 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.6", - "bundled": 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, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": 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, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": 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.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": 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, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "generic-pool": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.4.tgz", - "integrity": "sha1-+XGN7agvoSXtXEPjQcmiFadm2aM=" - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "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" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "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-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "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=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "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==", - "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=", - "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==" - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "requires": { - "sparkles": "^1.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "^1.0.0" - } - }, - "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.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^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=" - }, - "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-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "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=", - "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=", - "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=", - "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.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasha": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.1.0.tgz", - "integrity": "sha512-OFPDWmzPN1l7atOV1TgBVmNtBxaIysToK6Ve9DK+vT6pYuklw/nPNT+HJbZi0KDcI6vWB+9tgvZ5YD7fA3CXcA==", - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - } - } - }, - "hdkey": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.1.tgz", - "integrity": "sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==", - "optional": true, - "requires": { - "coinstring": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "heap": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=" - }, - "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=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" - }, - "http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "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=" - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "humanize": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", - "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ=" - }, - "husky": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.0.10.tgz", - "integrity": "sha512-Ptm4k2DqOwxeK/kzu5RaJmNRoGvESrgDXObFcZ8aJZcyXyMBHhM2FqZj6zYKdetadmP3wCwxEHCBuB9xGlRp8A==", - "requires": { - "chalk": "^3.0.0", - "ci-info": "^2.0.0", - "cosmiconfig": "^6.0.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "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=" - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, - "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.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "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.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "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=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "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=", - "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==" - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" - }, - "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=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "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==" - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=" - }, - "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" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "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-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "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==", - "requires": { - "symbol-observable": "^1.1.0" - } - }, - "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==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" - }, - "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==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "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=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "dependencies": { - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.1.tgz", - "integrity": "sha512-IQ4ikL8SjBiEDZfk+DFVwqRK8md24RWMEJkdSlgNLkyyAImcjf8SWvU1qFMDOb4igBClbTQ/ugPqXcRwdFTxZw==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "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" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-scrypt": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/js-scrypt/-/js-scrypt-0.2.0.tgz", - "integrity": "sha1-emK3AbRhbnCtDN5URiequ5nX/jk=", - "requires": { - "generic-pool": "~2.0.4" - } - }, - "js-sha3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", - "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "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==" - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", - "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", - "requires": { - "inherits": "^2.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=" - }, - "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.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "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=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "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=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "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=" - }, - "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" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" - }, - "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" - } - }, - "keccakjs": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", - "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", - "requires": { - "browserify-sha3": "^0.0.4", - "sha3": "^1.2.2" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "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" - } - }, - "lcov-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=" - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "level-codec": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.1.tgz", - "integrity": "sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q==" - }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==" - }, - "level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "level-errors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.1.2.tgz", - "integrity": "sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==", - "requires": { - "errno": "~0.1.1" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-mem": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-3.0.1.tgz", - "integrity": "sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==", - "requires": { - "level-packager": "~4.0.0", - "memdown": "~3.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", - "requires": { - "xtend": "~4.0.0" - } - }, - "memdown": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz", - "integrity": "sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==", - "requires": { - "abstract-leveldown": "~5.0.0", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.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==" - } - } - }, - "level-packager": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-4.0.1.tgz", - "integrity": "sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==", - "requires": { - "encoding-down": "~5.0.0", - "levelup": "^3.0.0" - } - }, - "level-post": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", - "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", - "requires": { - "ltgt": "^2.1.2" - } - }, - "level-sublevel": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.6.4.tgz", - "integrity": "sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==", - "requires": { - "bytewise": "~1.1.0", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "level-iterator-stream": "^2.0.3", - "ltgt": "~2.1.1", - "pull-defer": "^0.2.2", - "pull-level": "^2.0.3", - "pull-stream": "^3.6.8", - "typewiselite": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-iterator-stream": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz", - "integrity": "sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5", - "xtend": "^4.0.0" - } - }, - "ltgt": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz", - "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=" - } - } - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "requires": { - "xtend": "^4.0.2" - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz", - "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", - "requires": { - "deferred-leveldown": "~4.0.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~3.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz", - "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", - "requires": { - "abstract-leveldown": "~5.0.0", - "inherits": "^2.0.3" - } - }, - "level-iterator-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz", - "integrity": "sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "xtend": "^4.0.0" - } - } - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "lint-staged": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.0.0.tgz", - "integrity": "sha512-/MrZOLMnljjMHakxlRd1Z5Kr8wWWlrWFasye7HaTv5tx56icwzT/STRty8flMKsyzBGTfTa9QszNVPsDS/yOug==", - "requires": { - "chalk": "^3.0.0", - "commander": "^4.0.1", - "cosmiconfig": "^6.0.0", - "debug": "^4.1.1", - "dedent": "^0.7.0", - "execa": "^3.4.0", - "listr": "^0.14.3", - "log-symbols": "^3.0.0", - "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "stringify-object": "^3.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "commander": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz", - "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "requires": { - "@samverschueren/stream-to-observable": "^0.3.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.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.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=" - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "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": "^2.3.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=", - "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=", - "requires": { - "chalk": "^1.0.0" - } - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^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=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.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=", - "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" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "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" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "requires": { - "chalk": "^2.4.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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "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=", - "requires": { - "restore-cursor": "^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=" - }, - "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==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^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=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "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" - } - }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - } - } - } - }, - "looper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz", - "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.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": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "requires": { - "pseudomap": "^1.0.1" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" - }, - "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=" - } - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "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": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "requires": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.2.tgz", - "integrity": "sha512-/a+Iwj0rn//CX0EJOasNyZJd2o8xur8Ce9C57Sznti/Ilt/cb6Qd8/k98A4ZOklXgTG+iAYYUs1OTG0s1eH+zQ==", - "requires": { - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.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=", - "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=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "requires": { - "xtend": "~4.0.0" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "requires": { - "errno": "~0.1.1" - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "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==" - } - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - } - } - }, - "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==", - "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" - } - }, - "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.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "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=" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "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==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==" - }, - "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": "7.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.0.tgz", - "integrity": "sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA==", - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.0", - "yargs-parser": "13.1.1", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^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=" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - }, - "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" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "requires": { - "picomatch": "^2.0.4" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.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=" - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "mocha-lcov-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", - "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=" - }, - "mock-fs": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.4.tgz", - "integrity": "sha512-gDfZDLaPIvtOusbusLinfx6YSe2YpQsDT8qdP41P47dQ/NQggtkHukz7hwqgt8QvMBmAv+Z6DGmXPyb5BWX2nQ==" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "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" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" - }, - "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.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "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-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" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "node-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "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": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "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.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "requires": { - "once": "^1.3.2" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.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=" - } - } - }, - "nyc": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", - "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "js-yaml": "^3.13.1", - "make-dir": "^3.0.0", - "node-preload": "^0.2.0", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "uuid": "^3.3.3", - "yargs": "^15.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "rimraf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.1.tgz", - "integrity": "sha512-IQ4ikL8SjBiEDZfk+DFVwqRK8md24RWMEJkdSlgNLkyyAImcjf8SWvU1qFMDOb4igBClbTQ/ugPqXcRwdFTxZw==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.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=" - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "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=", - "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "oboe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", - "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", - "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": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.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=" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "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=" - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "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", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "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": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" - }, - "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=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "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" - } - }, - "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=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "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" - } - } - } - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "requires": { - "semver-compare": "^1.0.0" - } - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "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" - } - } - } - }, - "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=" - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "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.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "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", - "safe-buffer": "^5.1.2" - } - }, - "pull-cat": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz", - "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=" - }, - "pull-defer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz", - "integrity": "sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==" - }, - "pull-level": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz", - "integrity": "sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==", - "requires": { - "level-post": "^1.0.7", - "pull-cat": "^1.1.9", - "pull-live": "^1.0.1", - "pull-pushable": "^2.0.0", - "pull-stream": "^3.4.0", - "pull-window": "^2.1.4", - "stream-to-pull-stream": "^1.7.1" - } - }, - "pull-live": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz", - "integrity": "sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=", - "requires": { - "pull-cat": "^1.1.9", - "pull-stream": "^3.4.0" - } - }, - "pull-pushable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", - "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=" - }, - "pull-stream": { - "version": "3.6.14", - "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz", - "integrity": "sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==" - }, - "pull-window": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", - "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", - "requires": { - "looper": "^2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "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=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "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" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "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=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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==" - }, - "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" - } - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "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=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "requires": { - "es6-error": "^4.0.1" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "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=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } - } - }, - "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": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "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.14.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", - "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "~2.3.4" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "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" - } - }, - "rlp": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", - "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", - "requires": { - "bn.js": "^4.11.1" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "^1.1.1" - } - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "requires": { - "events": "^3.0.0" - } - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "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==" - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "optional": true, - "requires": { - "nan": "^2.0.8" - } - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" - }, - "scrypt.js": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.3.0.tgz", - "integrity": "sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A==", - "optional": true, - "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=", - "optional": true, - "requires": { - "pbkdf2": "^3.0.3" - } - }, - "secp256k1": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", - "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "requires": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.5.2", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - } - } - }, - "seedrandom": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz", - "integrity": "sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==" - }, - "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" - } - }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" - }, - "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "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.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.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" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "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=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "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=", - "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.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "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.6", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.6.tgz", - "integrity": "sha512-KgLGmJGrmNB4JWVsAV11Yk6KbvsAiygWJc7t5IebWva/0NukNrjJqhtKhzy3Eiv2AKuGvhZZt7dt1mDo7HkoiQ==", - "requires": { - "nan": "2.13.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "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=" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "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==", - "requires": { - "color-convert": "^1.9.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=" - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "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==", - "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=", - "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=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "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==", - "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=", - "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==", - "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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "solc": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.1.tgz", - "integrity": "sha512-iKqNYps2p++x8L9sBg7JeAJb7EmW8VJ/2asAzwlLYcUhj86AzuWLe94UTSQHv1SSCCj/x6lya8twvXkZtlTbIQ==", - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "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" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "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.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "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=" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "rimraf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.1.tgz", - "integrity": "sha512-IQ4ikL8SjBiEDZfk+DFVwqRK8md24RWMEJkdSlgNLkyyAImcjf8SWvU1qFMDOb4igBClbTQ/ugPqXcRwdFTxZw==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "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==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, - "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==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "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" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - } - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - }, - "dependencies": { - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "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=", - "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.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" - }, - "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==", - "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" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "stream-to-pull-stream": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz", - "integrity": "sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==", - "requires": { - "looper": "^3.0.0", - "pull-stream": "^3.2.3" - }, - "dependencies": { - "looper": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", - "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=" - } - } - }, - "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-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" - } - }, - "string.prototype.trim": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", - "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^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=", - "requires": { - "ansi-regex": "^2.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=", - "requires": { - "is-utf8": "^0.2.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-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "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" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "swarm-js": { - "version": "0.1.39", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", - "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "decompress": "^4.0.0", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "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" - } - }, - "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==" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "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" - } - } - } - }, - "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==" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "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=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "tape": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.0.tgz", - "integrity": "sha512-J/hvA+GJnuWJ0Sj8Z0dmu3JgMNU+MmusvkCT7+SN4/2TklW18FNCp/UuHIEhPZwHfy4sXfKYgC7kypKg4umbOw==", - "requires": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.0", - "object-inspect": "~1.7.0", - "resolve": "~1.14.2", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "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" - } - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "temp": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", - "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", - "requires": { - "rimraf": "~2.6.2" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz", - "integrity": "sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA==", - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^24.9.0", - "schema-utils": "^2.6.1", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "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.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, - "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.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "requires": { - "rimraf": "^2.6.3" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "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=" - }, - "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=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "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=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "requires": { - "through2": "^2.0.3" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "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": "1.0.2", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.2.tgz", - "integrity": "sha512-+8aPRjmXgf1VqvyxSlBUzKzeYqVS9Ai8vZ28g+mL7dNQl1jlUTCMDZnvNQdAS1xTywMkIXwJsfipsR/6s2+syw==" - }, - "tweetnacl-util": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.0.tgz", - "integrity": "sha1-RXbBzuXi1j0gf+5S8boCgZSAvHU=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "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" - } - }, - "typewise": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", - "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=", - "requires": { - "typewise-core": "^1.2.0" - } - }, - "typewise-core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", - "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=" - }, - "typewiselite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz", - "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=" - }, - "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.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" - }, - "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=", - "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=", - "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=", - "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=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "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==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "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=" - } - } - }, - "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=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "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" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "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.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" - }, - "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": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "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" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "web3": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.4.tgz", - "integrity": "sha512-xPXGe+w0x0t88Wj+s/dmAdASr3O9wmA9mpZRtixGZxmBexAF0MjfqYM+MS4tVl5s11hMTN3AZb8cDD4VLfC57A==", - "requires": { - "@types/node": "^12.6.1", - "web3-bzz": "1.2.4", - "web3-core": "1.2.4", - "web3-eth": "1.2.4", - "web3-eth-personal": "1.2.4", - "web3-net": "1.2.4", - "web3-shh": "1.2.4", - "web3-utils": "1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "12.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz", - "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==" - } - } - }, - "web3-bzz": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.4.tgz", - "integrity": "sha512-MqhAo/+0iQSMBtt3/QI1rU83uvF08sYq8r25+OUZ+4VtihnYsmkkca+rdU0QbRyrXY2/yGIpI46PFdh0khD53A==", - "requires": { - "@types/node": "^10.12.18", - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.14.tgz", - "integrity": "sha512-G0UmX5uKEmW+ZAhmZ6PLTQ5eu/VPaT+d/tdLd5IFsKRPcbe6lPxocBtcYBFSaLaCW8O60AX90e91Nsp8lVHCNw==" - } - } - }, - "web3-core": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.4.tgz", - "integrity": "sha512-CHc27sMuET2cs1IKrkz7xzmTdMfZpYswe7f0HcuyneTwS1yTlTnHyqjAaTy0ZygAb/x4iaVox+Gvr4oSAqSI+A==", - "requires": { - "@types/bignumber.js": "^5.0.0", - "@types/bn.js": "^4.11.4", - "@types/node": "^12.6.1", - "web3-core-helpers": "1.2.4", - "web3-core-method": "1.2.4", - "web3-core-requestmanager": "1.2.4", - "web3-utils": "1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "12.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz", - "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==" - } - } - }, - "web3-core-helpers": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz", - "integrity": "sha512-U7wbsK8IbZvF3B7S+QMSNP0tni/6VipnJkB0tZVEpHEIV2WWeBHYmZDnULWcsS/x/jn9yKhJlXIxWGsEAMkjiw==", - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.4", - "web3-utils": "1.2.4" - } - }, - "web3-core-method": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.4.tgz", - "integrity": "sha512-8p9kpL7di2qOVPWgcM08kb+yKom0rxRCMv6m/K+H+yLSxev9TgMbCgMSbPWAHlyiF3SJHw7APFKahK5Z+8XT5A==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.4", - "web3-core-promievent": "1.2.4", - "web3-core-subscriptions": "1.2.4", - "web3-utils": "1.2.4" - } - }, - "web3-core-promievent": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz", - "integrity": "sha512-gEUlm27DewUsfUgC3T8AxkKi8Ecx+e+ZCaunB7X4Qk3i9F4C+5PSMGguolrShZ7Zb6717k79Y86f3A00O0VAZw==", - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - } - }, - "web3-core-requestmanager": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz", - "integrity": "sha512-eZJDjyNTDtmSmzd3S488nR/SMJtNnn/GuwxnMh3AzYCqG3ZMfOylqTad2eYJPvc2PM5/Gj1wAMQcRpwOjjLuPg==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.4", - "web3-providers-http": "1.2.4", - "web3-providers-ipc": "1.2.4", - "web3-providers-ws": "1.2.4" - } - }, - "web3-core-subscriptions": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz", - "integrity": "sha512-3D607J2M8ymY9V+/WZq4MLlBulwCkwEjjC2U+cXqgVO1rCyVqbxZNCmHyNYHjDDCxSEbks9Ju5xqJxDSxnyXEw==", - "requires": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.4" - } - }, - "web3-eth": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.4.tgz", - "integrity": "sha512-+j+kbfmZsbc3+KJpvHM16j1xRFHe2jBAniMo1BHKc3lho6A8Sn9Buyut6odubguX2AxoRArCdIDCkT9hjUERpA==", - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.4", - "web3-core-helpers": "1.2.4", - "web3-core-method": "1.2.4", - "web3-core-subscriptions": "1.2.4", - "web3-eth-abi": "1.2.4", - "web3-eth-accounts": "1.2.4", - "web3-eth-contract": "1.2.4", - "web3-eth-ens": "1.2.4", - "web3-eth-iban": "1.2.4", - "web3-eth-personal": "1.2.4", - "web3-net": "1.2.4", - "web3-utils": "1.2.4" - } - }, - "web3-eth-abi": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz", - "integrity": "sha512-8eLIY4xZKoU3DSVu1pORluAw9Ru0/v4CGdw5so31nn+7fR8zgHMgwbFe0aOqWQ5VU42PzMMXeIJwt4AEi2buFg==", - "requires": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "10.17.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.14.tgz", - "integrity": "sha512-G0UmX5uKEmW+ZAhmZ6PLTQ5eu/VPaT+d/tdLd5IFsKRPcbe6lPxocBtcYBFSaLaCW8O60AX90e91Nsp8lVHCNw==" - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "requires": { - "@types/node": "^10.3.2", - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.3.3", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } - } - }, - "web3-eth-accounts": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz", - "integrity": "sha512-04LzT/UtWmRFmi4hHRewP5Zz43fWhuHiK5XimP86sUQodk/ByOkXQ3RoXyGXFMNoRxdcAeRNxSfA2DpIBc9xUw==", - "requires": { - "@web3-js/scrypt-shim": "^0.1.0", - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.4", - "web3-core-helpers": "1.2.4", - "web3-core-method": "1.2.4", - "web3-utils": "1.2.4" - }, - "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": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "web3-eth-contract": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz", - "integrity": "sha512-b/9zC0qjVetEYnzRA1oZ8gF1OSSUkwSYi5LGr4GeckLkzXP7osEnp9lkO/AQcE4GpG+l+STnKPnASXJGZPgBRQ==", - "requires": { - "@types/bn.js": "^4.11.4", - "underscore": "1.9.1", - "web3-core": "1.2.4", - "web3-core-helpers": "1.2.4", - "web3-core-method": "1.2.4", - "web3-core-promievent": "1.2.4", - "web3-core-subscriptions": "1.2.4", - "web3-eth-abi": "1.2.4", - "web3-utils": "1.2.4" - } - }, - "web3-eth-ens": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz", - "integrity": "sha512-g8+JxnZlhdsCzCS38Zm6R/ngXhXzvc3h7bXlxgKU4coTzLLoMpgOAEz71GxyIJinWTFbLXk/WjNY0dazi9NwVw==", - "requires": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.4", - "web3-core-helpers": "1.2.4", - "web3-core-promievent": "1.2.4", - "web3-eth-abi": "1.2.4", - "web3-eth-contract": "1.2.4", - "web3-utils": "1.2.4" - } - }, - "web3-eth-iban": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz", - "integrity": "sha512-D9HIyctru/FLRpXakRwmwdjb5bWU2O6UE/3AXvRm6DCOf2e+7Ve11qQrPtaubHfpdW3KWjDKvlxV9iaFv/oTMQ==", - "requires": { - "bn.js": "4.11.8", - "web3-utils": "1.2.4" - } - }, - "web3-eth-personal": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz", - "integrity": "sha512-5Russ7ZECwHaZXcN3DLuLS7390Vzgrzepl4D87SD6Sn1DHsCZtvfdPIYwoTmKNp69LG3mORl7U23Ga5YxqkICw==", - "requires": { - "@types/node": "^12.6.1", - "web3-core": "1.2.4", - "web3-core-helpers": "1.2.4", - "web3-core-method": "1.2.4", - "web3-net": "1.2.4", - "web3-utils": "1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "12.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz", - "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==" - } - } - }, - "web3-net": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.4.tgz", - "integrity": "sha512-wKOsqhyXWPSYTGbp7ofVvni17yfRptpqoUdp3SC8RAhDmGkX6irsiT9pON79m6b3HUHfLoBilFQyt/fTUZOf7A==", - "requires": { - "web3-core": "1.2.4", - "web3-core-method": "1.2.4", - "web3-utils": "1.2.4" - } - }, - "web3-provider-engine": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz", - "integrity": "sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==", - "requires": { - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^3.0.0", - "eth-json-rpc-infura": "^3.1.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.85.0", - "semaphore": "^1.0.3", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - } - } - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - }, - "dependencies": { - "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" - } - } - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - } - } - }, - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "web3-providers-http": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.4.tgz", - "integrity": "sha512-dzVCkRrR/cqlIrcrWNiPt9gyt0AZTE0J+MfAu9rR6CyIgtnm1wFUVVGaxYRxuTGQRO4Dlo49gtoGwaGcyxqiTw==", - "requires": { - "web3-core-helpers": "1.2.4", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz", - "integrity": "sha512-8J3Dguffin51gckTaNrO3oMBo7g+j0UNk6hXmdmQMMNEtrYqw4ctT6t06YOf9GgtOMjSAc1YEh3LPrvgIsR7og==", - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.4" - } - }, - "web3-providers-ws": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz", - "integrity": "sha512-F/vQpDzeK+++oeeNROl1IVTufFCwCR2hpWe5yRXN0ApLwHqXrMI7UwQNdJ9iyibcWjJf/ECbauEEQ8CHgE+MYQ==", - "requires": { - "@web3-js/websocket": "^1.0.29", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.4" - } - }, - "web3-shh": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.4.tgz", - "integrity": "sha512-z+9SCw0dE+69Z/Hv8809XDbLj7lTfEv9Sgu8eKEIdGntZf4v7ewj5rzN5bZZSz8aCvfK7Y6ovz1PBAu4QzS4IQ==", - "requires": { - "web3-core": "1.2.4", - "web3-core-method": "1.2.4", - "web3-core-subscriptions": "1.2.4", - "web3-net": "1.2.4" - } - }, - "web3-utils": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.4.tgz", - "integrity": "sha512-+S86Ip+jqfIPQWvw2N/xBQq5JNqCO0dyvukGdJm8fEWHZbckT4WxSpHbx+9KLEWY4H4x9pUwnoRkK87pYyHfgQ==", - "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "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" - } - } - } - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "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" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - } - } - }, - "webpack-bundle-size-analyzer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-size-analyzer/-/webpack-bundle-size-analyzer-3.1.0.tgz", - "integrity": "sha512-8WlTT6uuCxZgZYNnCB0pRGukWRGH+Owg+HsqQUe1Zexakdno1eDYO+lE7ihBo9G0aCCZCJa8JWjYr9eLYfZrBA==", - "requires": { - "commander": "^2.19.0", - "filesize": "^3.6.1", - "humanize": "0.0.9" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "webpack-cli": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", - "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.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==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.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" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "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=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "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" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "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=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==" - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket": { - "version": "1.0.29", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.29.tgz", - "integrity": "sha512-WhU8jKXC8sTh6ocLSqpZRlOKMNYGwUvjA5+XcIgIk/G3JCaDfkZUr0zA19sVSxJ0TEvm0i5IBzr54RZC4vzW7g==", - "requires": { - "debug": "^2.2.0", - "gulp": "^4.0.2", - "nan": "^2.11.0", - "typedarray-to-buffer": "^3.1.5", - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "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": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "requires": { - "errno": "~0.1.7" - } - }, - "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" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "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" - } - } - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.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" - }, - "dependencies": { - "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==" - } - } - }, - "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-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "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": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "requires": { - "@babel/runtime": "^7.6.3" - } - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "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": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "^3.0.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "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=" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "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" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" - }, - "get-params": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", - "integrity": "sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=" - }, - "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=" - }, - "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" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "optional": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "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-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "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=", - "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=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "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" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "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" - }, - "dependencies": { - "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" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - } - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - }, - "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "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.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^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=" - }, - "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-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "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-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "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=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "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.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hdkey": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.1.tgz", - "integrity": "sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==", - "requires": { - "coinstring": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "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" - } - }, - "husky": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", - "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", - "requires": { - "chalk": "^3.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.5.1", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ice-cap": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/ice-cap/-/ice-cap-0.0.4.tgz", - "integrity": "sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg=", - "requires": { - "cheerio": "0.20.0", - "color-logger": "0.0.3" - }, - "dependencies": { - "cheerio": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", - "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "~3.8.1", - "jsdom": "^7.0.2", - "lodash": "^4.1.0" - } - }, - "color-logger": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.3.tgz", - "integrity": "sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg=" - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "requires": { - "domelementtype": "1" - } - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - }, - "dependencies": { - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" - } - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "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=" - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "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.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "optional": true - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } - } - } - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "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=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" - }, - "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=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" - }, - "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=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "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==" - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "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=", - "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=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=" - }, - "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" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "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": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "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==", - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "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=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" - }, - "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==" - }, - "is2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", - "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", - "requires": { - "deep-is": "^0.1.3", - "ip-regex": "^2.1.0", - "is-url": "^1.2.2" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - }, - "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.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=" - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "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" - } - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-sha3": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.7.0.tgz", - "integrity": "sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA==" - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - } - } - }, - "jsan": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.13.tgz", - "integrity": "sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", - "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", - "optional": true, - "requires": { - "abab": "^1.0.0", - "acorn": "^2.4.0", - "acorn-globals": "^1.0.4", - "cssom": ">= 0.3.0 < 0.4.0", - "cssstyle": ">= 0.2.29 < 0.3.0", - "escodegen": "^1.6.1", - "nwmatcher": ">= 1.3.7 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.55.0", - "sax": "^1.1.4", - "symbol-tree": ">= 3.1.0 < 4.0.0", - "tough-cookie": "^2.2.0", - "webidl-conversions": "^2.0.0", - "whatwg-url-compat": "~0.6.5", - "xml-name-validator": ">= 2.0.1 < 3.0.0" - }, - "dependencies": { - "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", - "optional": true - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "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==" - }, - "json-pointer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.0.tgz", - "integrity": "sha1-jlAFUKaqxUZKRzN32leqbMIoKNc=", - "requires": { - "foreach": "^2.0.4" - } - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", - "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", - "requires": { - "inherits": "^2.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=" - }, - "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.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "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=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "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=" - }, - "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=" - }, - "jsonschema": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.5.tgz", - "integrity": "sha512-kVTF+08x25PQ0CjuVc0gRM9EUPb0Fe9Ln/utFOgcdxEIOHuU7ooBk/UPTd7t1M91pP35m0MU1T8M5P7vP1bRRw==" - }, - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true }, - "keccakjs": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", - "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", - "requires": { - "browserify-sha3": "^0.0.4", - "sha3": "^1.2.2" - } + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "is-buffer": "^1.1.5" + "isobject": "^3.0.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "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" - } - }, - "level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, "requires": { - "errno": "~0.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "isobject": "^3.0.1" }, "dependencies": { - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "linked-list": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/linked-list/-/linked-list-0.1.0.tgz", - "integrity": "sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=" - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "oboe": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", + "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "http-https": "^1.0.0" } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - }, - "lodash-es": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.range": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.range/-/lodash.range-3.2.0.tgz", - "integrity": "sha1-9GHliPZmg/fq3q3lE+OKaaVloV0=" - }, - "lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" - }, - "lodash.values": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", - "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=" - }, - "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "ee-first": "1.1.1" } }, - "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.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "wrappy": "1" } }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "pify": "^3.0.0" + "mimic-fn": "^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=" + "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==" } } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "openzeppelin-solidity": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-2.3.0.tgz", + "integrity": "sha512-QYeiPLvB1oSbDt6lDQvvpx7k8ODczvE474hb2kLXZBPKMsxKT1WxTCHBYrCU7kS7hfAku4DcJ0jqOyL+jvjwQw==" }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { - "object-visit": "^1.0.0" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, - "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + "original-require": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", + "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=" }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "media-typer": { + "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=" + }, + "p-cancelable": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "requires": { - "mimic-fn": "^1.0.0" + "p-try": "^2.0.0" } }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "requires": { - "xtend": "~4.0.0" - } - }, - "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==" - } + "p-limit": "^2.0.0" } }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + "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" + } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, - "merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } - } + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" } }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "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", + "safe-buffer": "^5.1.1" + } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "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", + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.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" + "is-glob": "^2.0.0" }, "dependencies": { - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", @@ -22090,2243 +8492,3104 @@ "requires": { "is-extglob": "^1.0.0" } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } } } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "requires": { - "mime-db": "1.43.0" + "@types/node": "*" } }, - "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==" + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, - "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" - } + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, - "minimalistic-assert": { + "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "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=" + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "requires": { - "brace-expansion": "^1.1.7" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "minimist": { + "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/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "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==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "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": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "pinkie": "^2.0.0" } }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { - "mkdirp": "*" + "find-up": "^3.0.0" } }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - }, - "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" - } - }, - "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" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "^3.0.0" - } - } + "semver-compare": "^1.0.0" } }, - "mock-fs": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.4.tgz", - "integrity": "sha512-gDfZDLaPIvtOusbusLinfx6YSe2YpQsDT8qdP41P47dQ/NQggtkHukz7hwqgt8QvMBmAv+Z6DGmXPyb5BWX2nQ==" + "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=" }, - "mout": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", - "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "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.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" } }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "ps-node": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ps-node/-/ps-node-0.1.6.tgz", + "integrity": "sha1-mvZ6mdex0BMuUaUDCZ04qNKs4sM=", + "requires": { + "table-parser": "^0.1.3" + } }, - "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=" + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, - "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "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-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" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" }, "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" } } }, - "napi-build-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", - "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==", - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, - "node-abi": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", - "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", - "optional": 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==", "requires": { - "semver": "^5.4.1" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, - "node-hid": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/node-hid/-/node-hid-0.7.9.tgz", - "integrity": "sha512-vJnonTqmq3frCyTumJqG4g2IZcny3ynkfmbfDfQ90P3ZhRzcWYS/Um1ux6HFmAxmkaQnrZqIYHcGpL7kdqY8jA==", - "optional": true, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "requires": { - "bindings": "^1.5.0", - "nan": "^2.13.2", - "prebuild-install": "^5.3.0" + "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==" + } } }, - "node-interval-tree": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-1.3.3.tgz", - "integrity": "sha512-K9vk96HdTK5fEipJwxSvIIqwTqr4e3HRJeJrNxBSeVMNSC/JWARRaX7etOLOuTmrRMeOI/K5TCJu3aWIwZiNTw==", + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { - "shallowequal": "^1.0.2" + "safe-buffer": "^5.1.0" } }, - "nodeify-ts": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/nodeify-ts/-/nodeify-ts-1.0.6.tgz", - "integrity": "sha512-jq+8sqVG1aLqy5maMTceL8NUJ1CvarWztlxvrYh3G0aao9BsVeoVmVedUnrUSBLetP7oLIAJrPrw4+iIo7v3GA==" - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "optional": true - }, - "noop6": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.8.tgz", - "integrity": "sha512-+Al5csMVc40I8xRfJsyBcN1IbpyvebOuQmMfxdw+AL6ECELey12ANgNTRhMfTwNIDU4W9W0g8EHLcsb3+3qPFA==" - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "abbrev": "1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "randomhex": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", + "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" }, - "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=", + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "path-key": "^2.0.0" + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, + "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": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "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" + } + } } }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "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": { - "boolbase": "~1.0.0" + "find-up": "^2.0.0", + "read-pkg": "^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" + } + }, + "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" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "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=", + "dev": true, + "requires": { + "p-limit": "^1.1.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 + } } }, - "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=", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "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=" - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", - "optional": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "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=", + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.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=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "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==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "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=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "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==", + "requires": { + "kind-of": "^6.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==" + }, + "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==", + "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==", "requires": { - "is-descriptor": "^0.1.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - } - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "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=", - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "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=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" - }, - "openzeppelin-solidity": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-2.3.0.tgz", - "integrity": "sha512-QYeiPLvB1oSbDt6lDQvvpx7k8ODczvE474hb2kLXZBPKMsxKT1WxTCHBYrCU7kS7hfAku4DcJ0jqOyL+jvjwQw==" - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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==" + }, + "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" + } + }, + "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=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "original-require": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "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=" - }, - "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-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, - "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-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { - "p-finally": "^1.0.0" + "resolve": "^1.1.6" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { - "callsites": "^3.0.0" + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } } }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "redux-cli-logger": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/redux-cli-logger/-/redux-cli-logger-2.1.0.tgz", + "integrity": "sha512-75mVsggAJRSykWy2qxdGI7osocDWvc3RCMeN93hlvS/FxgdRww12NaXslez+W6gBOrSJKO7W16V0IzuISSfCxg==", "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", - "safe-buffer": "^5.1.1" + "colors": "^1.1.2" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "redux-devtools-core": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz", + "integrity": "sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ==", "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "get-params": "^0.1.2", + "jsan": "^3.1.13", + "lodash": "^4.17.11", + "nanoid": "^2.0.0", + "remotedev-serialize": "^0.1.8" }, "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" } } }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "redux-devtools-instrument": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.9.6.tgz", + "integrity": "sha512-MwvY4cLEB2tIfWWBzrUR02UM9qRG2i7daNzywRvabOSVdvAY7s9BxSwMmVRH1Y/7QWjplNtOwgT0apKhHg2Qew==", "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" + "lodash": "^4.2.0", + "symbol-observable": "^1.0.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } } }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "redux-saga": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.0.0.tgz", + "integrity": "sha512-GvJWs/SzMvEQgeaw6sRMXnS2FghlvEGsHiEtTLpJqc/FHF3I5EE/B+Hq5lyHZ8LSoT2r/X/46uWvkdCnK9WgHA==", "requires": { - "@types/node": "*" + "@redux-saga/core": "^1.0.0" } }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" }, - "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=" + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "^0.1.3" + } }, - "path-is-inside": { + "regex-not": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "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.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "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" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "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=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "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": { + "regexpp": { "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" - } + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "remote-redux-devtools": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz", + "integrity": "sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w==", "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - } + "jsan": "^3.1.13", + "querystring": "^0.2.0", + "redux-devtools-core": "^0.2.1", + "redux-devtools-instrument": "^1.9.4", + "rn-host-detect": "^1.1.5", + "socketcluster-client": "^14.2.1" } }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "remotedev-serialize": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.8.tgz", + "integrity": "sha512-3YG/FDcOmiK22bl5oMRM8RRnbGrFEuPGjbcDG+z2xi5aQaNQNZ8lqoRnZTwXVfaZtutXuiAQOgPRrogzQk8edg==", "requires": { - "semver-compare": "^1.0.0" + "jsan": "^3.1.13" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + "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=" }, - "popper.js": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.3.tgz", - "integrity": "sha1-FDj5jQRqz3tNeM1QK/QYrGTU8JU=" + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, - "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=" + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, - "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", - "optional": true, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.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.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" + "uuid": "^3.3.2" } }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "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=" }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + "reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + "reselect-tree": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/reselect-tree/-/reselect-tree-1.3.1.tgz", + "integrity": "sha512-odL2qQPc5Wu5fGLH0zAWn3vLh9IOvrWEckvQL/mDiKAV48t3mpsTYbIZsNcu0CcVYAvkDxvcMvRB+19TOgyODg==", + "requires": { + "debug": "^3.1.0", + "esdoc": "^1.0.4", + "json-pointer": "^0.6.0", + "reselect": "^4.0.0", + "source-map-support": "^0.5.3" + } }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" + "lowercase-keys": "^1.0.0" } }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, - "ps-node": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ps-node/-/ps-node-0.1.6.tgz", - "integrity": "sha1-mvZ6mdex0BMuUaUDCZ04qNKs4sM=", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { - "table-parser": "^0.1.3" + "glob": "^7.1.3" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "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" + } }, - "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" + "rlp": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", + "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", + "requires": { + "bn.js": "^4.11.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "rn-host-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.2.0.tgz", + "integrity": "sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==" + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "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", - "safe-buffer": "^5.1.2" + "is-promise": "^2.1.0" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "tslib": "^1.9.0" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safe-eval": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/safe-eval/-/safe-eval-0.4.1.tgz", + "integrity": "sha512-wmiu4RSYVZ690RP1+cv/LxfPK1dIlEN35aW7iv4SMYdqDrHbkll4+NJcHmKm7PbCuI1df1otOcPwgcc2iFR85g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "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==" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "sc-channel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sc-channel/-/sc-channel-1.2.0.tgz", + "integrity": "sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==", + "requires": { + "component-emitter": "1.2.1" + } + }, + "sc-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.1.tgz", + "integrity": "sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==" }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "sc-formatter": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sc-formatter/-/sc-formatter-3.0.2.tgz", + "integrity": "sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==" }, - "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==", + "scrypt": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", + "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "nan": "^2.0.8" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "scrypt-shim": { + "version": "github:web3-js/scrypt-shim#be5e616323a8b5e568788bf94d03c1b8410eac54", + "from": "github:web3-js/scrypt-shim", "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "scryptsy": "^2.1.0", + "semver": "^6.3.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==" + "scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "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==", + "scrypt.js": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.3.0.tgz", + "integrity": "sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A==", "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" } }, - "randomhex": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" - }, - "range-parser": { + "scryptsy": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "pbkdf2": "^3.0.3" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, + "secp256k1": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", + "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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" + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.5.2", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" }, "dependencies": { - "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==" + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" } } }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "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": { - "picomatch": "^2.0.7" + "commander": "~2.8.1" } }, - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "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.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "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" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, - "redux-cli-logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/redux-cli-logger/-/redux-cli-logger-2.1.0.tgz", - "integrity": "sha512-75mVsggAJRSykWy2qxdGI7osocDWvc3RCMeN93hlvS/FxgdRww12NaXslez+W6gBOrSJKO7W16V0IzuISSfCxg==", + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { - "colors": "^1.1.2" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" } }, - "redux-devtools-core": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz", - "integrity": "sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ==", + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "requires": { - "get-params": "^0.1.2", - "jsan": "^3.1.13", - "lodash": "^4.17.11", - "nanoid": "^2.0.0", - "remotedev-serialize": "^0.1.8" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - } + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" } }, - "redux-devtools-instrument": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.9.6.tgz", - "integrity": "sha512-MwvY4cLEB2tIfWWBzrUR02UM9qRG2i7daNzywRvabOSVdvAY7s9BxSwMmVRH1Y/7QWjplNtOwgT0apKhHg2Qew==", + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { - "lodash": "^4.2.0", - "symbol-observable": "^1.0.2" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } } } }, - "redux-saga": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.0.0.tgz", - "integrity": "sha512-GvJWs/SzMvEQgeaw6sRMXnS2FghlvEGsHiEtTLpJqc/FHF3I5EE/B+Hq5lyHZ8LSoT2r/X/46uWvkdCnK9WgHA==", - "requires": { - "@redux-saga/core": "^1.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "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": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "sha3": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.6.tgz", + "integrity": "sha512-KgLGmJGrmNB4JWVsAV11Yk6KbvsAiygWJc7t5IebWva/0NukNrjJqhtKhzy3Eiv2AKuGvhZZt7dt1mDo7HkoiQ==", "requires": { - "is-equal-shallow": "^0.1.3" + "nan": "2.13.2" + }, + "dependencies": { + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" + } } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "shebang-regex": "^1.0.0" } }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" }, - "remote-redux-devtools": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz", - "integrity": "sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w==", + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", "requires": { - "jsan": "^3.1.13", - "querystring": "^0.2.0", - "redux-devtools-core": "^0.2.1", - "redux-devtools-instrument": "^1.9.4", - "rn-host-detect": "^1.1.5", - "socketcluster-client": "^14.2.1" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "remotedev-serialize": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.8.tgz", - "integrity": "sha512-3YG/FDcOmiK22bl5oMRM8RRnbGrFEuPGjbcDG+z2xi5aQaNQNZ8lqoRnZTwXVfaZtutXuiAQOgPRrogzQk8edg==", + "simple-git": { + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", "requires": { - "jsan": "^3.1.13" + "debug": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, - "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=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "requires": { - "is-finite": "^1.0.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "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==", + "requires": { + "color-convert": "^1.9.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=" + } } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "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==", + "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=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "require-directory": { + "snapdragon-node": { "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": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "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=" - }, - "reselect": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" - }, - "reselect-tree": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/reselect-tree/-/reselect-tree-1.3.1.tgz", - "integrity": "sha512-odL2qQPc5Wu5fGLH0zAWn3vLh9IOvrWEckvQL/mDiKAV48t3mpsTYbIZsNcu0CcVYAvkDxvcMvRB+19TOgyODg==", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { - "debug": "^3.1.0", - "esdoc": "^1.0.4", - "json-pointer": "^0.6.0", - "reselect": "^4.0.0", - "source-map-support": "^0.5.3" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "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==", "requires": { - "ms": "^2.1.1" + "kind-of": "^6.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "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==", + "requires": { + "kind-of": "^6.0.0" + } }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, - "resolve": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", - "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "~2.3.4" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "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" - } - }, - "rlp": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", - "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", - "requires": { - "bn.js": "^4.11.1" - } - }, - "rn-host-detect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.2.0.tgz", - "integrity": "sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "tslib": "^1.9.0" + "kind-of": "^3.2.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safe-eval": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/safe-eval/-/safe-eval-0.4.1.tgz", - "integrity": "sha512-wmiu4RSYVZ690RP1+cv/LxfPK1dIlEN35aW7iv4SMYdqDrHbkll4+NJcHmKm7PbCuI1df1otOcPwgcc2iFR85g==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", + "snarkjs": { + "version": "github:LimeChain/snarkjs#f7036ebe9bfa3f3817077f050780c8ec1542e249", + "from": "github:LimeChain/snarkjs", "requires": { - "events": "^3.0.0" + "big-integer": "^1.6.35", + "chai": "^4.1.2", + "escape-string-regexp": "^1.0.5", + "eslint": "^5.3.0", + "yargs": "^12.0.2" }, "dependencies": { - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + "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": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.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=" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "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" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.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 || ^4.0.0", + "yargs-parser": "^11.1.1" + } } } }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "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==" - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "sc-channel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sc-channel/-/sc-channel-1.2.0.tgz", - "integrity": "sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==", - "requires": { - "component-emitter": "1.2.1" - } - }, - "sc-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.1.tgz", - "integrity": "sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==" - }, - "sc-formatter": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sc-formatter/-/sc-formatter-3.0.2.tgz", - "integrity": "sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==" - }, - "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": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "scrypt.js": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.3.0.tgz", - "integrity": "sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A==", - "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" - } - }, - "secp256k1": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", - "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "requires": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.5.2", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - } - }, - "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=", + "socketcluster-client": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.1.tgz", + "integrity": "sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==", "requires": { - "commander": "~2.8.1" + "buffer": "^5.2.1", + "clone": "2.1.1", + "component-emitter": "1.2.1", + "linked-list": "0.1.0", + "querystring": "0.2.0", + "sc-channel": "^1.2.0", + "sc-errors": "^2.0.1", + "sc-formatter": "^3.0.1", + "uuid": "3.2.1", + "ws": "7.1.0" }, "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "requires": { - "graceful-readlink": ">= 1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" } } }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" - }, - "semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + "sol-digger": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", + "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=" }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==" + "sol-explore": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz", + "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=" }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "solc": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.5.4.tgz", + "integrity": "sha512-Jz3yz2mct0AYzR83/jBgxDqrLXTHhYUg2G2PVJbMMt5Vu+8e3Of1Mn3nvjPw5mh46jrzt8l4fBN7vHqG5ZF0cw==", "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.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "command-exists": "^1.2.8", + "fs-extra": "^0.30.0", + "keccak": "^1.0.2", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33", + "yargs": "^11.0.0" }, "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "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" + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "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" + } + }, + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, - "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=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "solidity-coverage": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.2.tgz", + "integrity": "sha512-LizgpcrkMRmZdvOmwYN7l/h9ak0Yq/5BuXjEaH0Phds1Gu5hZfHGyvplgWYDFmzLwGB7hZ6d0/IdkdYm4HK0mg==", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "@truffle/provider": "^0.1.17", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "fs-extra": "^8.1.0", + "ganache-cli": "6.9.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "shelljs": "^0.8.3", + "solidity-parser-diligence": "^0.4.16", + "web3": "1.2.6" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "@types/node": { + "version": "12.12.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.30.tgz", + "integrity": "sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg==" + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + }, + "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==", "requires": { - "is-extendable": "^0.1.0" + "color-convert": "^1.9.0" + } + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" + }, + "ethers": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", + "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", + "requires": { + "@types/node": "^10.3.2", + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.3.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.3", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" + }, + "elliptic": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", + "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" + } + } + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "ganache-cli": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.9.0.tgz", + "integrity": "sha512-ZdL6kPrApXF/O+f6uU431OJcwxMk69H3KPDSHHrMP82ZvZRNpDHbR+rVv7XX/YUeoQ5q6nZ2AFiGiFAVn9pfzA==", + "requires": { + "ethereumjs-util": "6.1.0", + "source-map-support": "0.5.12", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "bindings": { + "version": "1.5.0", + "bundled": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bip66": { + "version": "1.1.5", + "bundled": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bn.js": { + "version": "4.11.8", + "bundled": true + }, + "brorand": { + "version": "1.1.0", + "bundled": true + }, + "browserify-aes": { + "version": "1.2.0", + "bundled": true, + "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-from": { + "version": "1.1.1", + "bundled": true + }, + "buffer-xor": { + "version": "1.0.3", + "bundled": true + }, + "camelcase": { + "version": "5.3.1", + "bundled": true + }, + "cipher-base": { + "version": "1.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cliui": { + "version": "5.0.0", + "bundled": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "bundled": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true + }, + "create-hash": { + "version": "1.2.0", + "bundled": true, + "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", + "bundled": true, + "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": "6.0.5", + "bundled": 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" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "drbg.js": { + "version": "1.0.1", + "bundled": true, + "requires": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + } + }, + "elliptic": { + "version": "6.5.0", + "bundled": true, + "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" + } + }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "ethereumjs-util": { + "version": "6.1.0", + "bundled": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "ethjs-util": { + "version": "0.1.6", + "bundled": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "bundled": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "bundled": true + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "bundled": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "requires": { + "pump": "^3.0.0" + } + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "is-hex-prefixed": { + "version": "1.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "keccak": { + "version": "1.4.0", + "bundled": true, + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "bundled": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "bundled": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "bundled": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true + }, + "nan": { + "version": "2.14.0", + "bundled": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "p-is-promise": { + "version": "2.1.0", + "bundled": true + }, + "p-limit": { + "version": "2.2.0", + "bundled": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true + }, + "path-exists": { + "version": "3.0.0", + "bundled": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "2.0.0", + "bundled": true + }, + "ripemd160": { + "version": "2.0.2", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.3", + "bundled": true, + "requires": { + "bn.js": "^4.11.1", + "safe-buffer": "^5.1.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "bundled": true + }, + "secp256k1": { + "version": "3.7.1", + "bundled": true, + "requires": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + } + }, + "semver": { + "version": "5.7.0", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "sha.js": { + "version": "2.4.11", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "source-map": { + "version": "0.6.1", + "bundled": true + }, + "source-map-support": { + "version": "0.5.12", + "bundled": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + }, + "strip-hex-prefix": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true + }, + "yargs": { + "version": "13.2.4", + "bundled": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "bundled": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } - } - } - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "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.6", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.6.tgz", - "integrity": "sha512-KgLGmJGrmNB4JWVsAV11Yk6KbvsAiygWJc7t5IebWva/0NukNrjJqhtKhzy3Eiv2AKuGvhZZt7dt1mDo7HkoiQ==", - "requires": { - "nan": "2.13.2" - }, - "dependencies": { - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" - } - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "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=" - }, - "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": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "optional": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-git": { - "version": "1.131.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.131.0.tgz", - "integrity": "sha512-z/art7YYtmPnnLItT/j+nKwJt6ap6nHZ4D8sYo9PdCKK/ug56SN6m/evfxJk7uDV3e9JuCa8qIyDU2P3cxmiNQ==", - "requires": { - "debug": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "requires": { - "ms": "^2.1.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.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=" - } - } - }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "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==", "requires": { - "is-descriptor": "^0.1.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^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=", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", "requires": { - "is-extendable": "^0.1.0" + "minimist": "^1.2.5" } - } - } - }, - "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==", - "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=", + }, + "oboe": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", + "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", "requires": { - "is-descriptor": "^1.0.0" + "http-https": "^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==", + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "sc-istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.5.tgz", + "integrity": "sha512-7wR5EZFLsC4w0wSm9BUuCgW+OGKAU7PNlW5L0qwVPbh+Q1sfVn2fyzfMXYCm6rkNA5ipaCOt94nApcguQwF5Gg==", + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "scrypt-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", + "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "optional": true, "requires": { - "kind-of": "^6.0.0" + "amdefine": ">=0.0.4" } }, - "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==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { - "kind-of": "^6.0.0" + "has-flag": "^3.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==", + "swarm-js": { + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", + "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "decompress": "^4.0.0", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "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" + } + }, + "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==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "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" + } + } } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - } - }, - "snarkjs": { - "version": "github:LimeChain/snarkjs#f7036ebe9bfa3f3817077f050780c8ec1542e249", - "from": "github:LimeChain/snarkjs", - "requires": { - "big-integer": "^1.6.35", - "chai": "^4.1.2", - "escape-string-regexp": "^1.0.5", - "eslint": "^5.3.0", - "yargs": "^12.0.2" - }, - "dependencies": { - "ansi-regex": { + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "url-parse-lax": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "web3": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.6.tgz", + "integrity": "sha512-tpu9fLIComgxGrFsD8LUtA4s4aCZk7px8UfcdEy6kS2uDi/ZfR07KJqpXZMij7Jvlq+cQrTAhsPSiBVvoMaivA==", "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "@types/node": "^12.6.1", + "web3-bzz": "1.2.6", + "web3-core": "1.2.6", + "web3-eth": "1.2.6", + "web3-eth-personal": "1.2.6", + "web3-net": "1.2.6", + "web3-shh": "1.2.6", + "web3-utils": "1.2.6" + } + }, + "web3-bzz": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.6.tgz", + "integrity": "sha512-9NiHLlxdI1XeFtbPJAmi2jnnIHVF+GNy517wvOS72P7ZfuJTPwZaSNXfT01vWgPPE9R96/uAHDWHOg+T4WaDQQ==", + "requires": { + "@types/node": "^10.12.18", + "got": "9.6.0", + "swarm-js": "0.1.39", + "underscore": "1.9.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" + } } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "web3-core": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.6.tgz", + "integrity": "sha512-y/QNBFtr5cIR8vxebnotbjWJpOnO8LDYEAzZjeRRUJh2ijmhjoYk7dSNx9ExgC0UCfNFRoNCa9dGRu/GAxwRlw==", "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.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" + "@types/bn.js": "^4.11.4", + "@types/node": "^12.6.1", + "web3-core-helpers": "1.2.6", + "web3-core-method": "1.2.6", + "web3-core-requestmanager": "1.2.6", + "web3-utils": "1.2.6" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "web3-core-helpers": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.6.tgz", + "integrity": "sha512-gYKWmC2HmO7RcDzpo4L1K8EIoy5L8iubNDuTC6q69UxczwqKF/Io0kbK/1Z10Av++NlzOSiuyGp2gc4t4UOsDw==", "requires": { - "locate-path": "^3.0.0" + "underscore": "1.9.1", + "web3-eth-iban": "1.2.6", + "web3-utils": "1.2.6" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "web3-core-method": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.6.tgz", + "integrity": "sha512-r2dzyPEonqkBg7Mugq5dknhV5PGaZTHBZlS/C+aMxNyQs3T3eaAsCTqlQDitwNUh/sUcYPEGF0Vo7ahYK4k91g==", "requires": { - "pump": "^3.0.0" + "underscore": "1.9.1", + "web3-core-helpers": "1.2.6", + "web3-core-promievent": "1.2.6", + "web3-core-subscriptions": "1.2.6", + "web3-utils": "1.2.6" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "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=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "web3-core-promievent": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.6.tgz", + "integrity": "sha512-km72kJef/qtQNiSjDJJVHIZvoVOm6ytW3FCYnOcCs7RIkviAb5JYlPiye0o4pJOLzCXYID7DK7Q9bhY8qWb1lw==", "requires": { - "invert-kv": "^2.0.0" + "any-promise": "1.3.0", + "eventemitter3": "3.1.2" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "web3-core-requestmanager": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.6.tgz", + "integrity": "sha512-QU2cbsj9Dm0r6om40oSwk8Oqbp3wTa08tXuMpSmeOTkGZ3EMHJ1/4LiJ8shwg1AvPMrKVU0Nri6+uBNCdReZ+g==", "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "underscore": "1.9.1", + "web3-core-helpers": "1.2.6", + "web3-providers-http": "1.2.6", + "web3-providers-ipc": "1.2.6", + "web3-providers-ws": "1.2.6" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "web3-core-subscriptions": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.6.tgz", + "integrity": "sha512-M0PzRrP2Ct13x3wPulFtc5kENH4UtnPxO9YxkfQlX2WRKENWjt4Rfq+BCVGYEk3rTutDfWrjfzjmqMRvXqEY5Q==", "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "eventemitter3": "3.1.2", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.6" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "web3-eth": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.6.tgz", + "integrity": "sha512-ROWlDPzh4QX6tlGGGlAK6X4kA2n0/cNj/4kb0nNVWkRouGmYO0R8k6s47YxYHvGiXt0s0++FUUv5vAbWovtUQw==", "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "underscore": "1.9.1", + "web3-core": "1.2.6", + "web3-core-helpers": "1.2.6", + "web3-core-method": "1.2.6", + "web3-core-subscriptions": "1.2.6", + "web3-eth-abi": "1.2.6", + "web3-eth-accounts": "1.2.6", + "web3-eth-contract": "1.2.6", + "web3-eth-ens": "1.2.6", + "web3-eth-iban": "1.2.6", + "web3-eth-personal": "1.2.6", + "web3-net": "1.2.6", + "web3-utils": "1.2.6" } }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "web3-eth-abi": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz", + "integrity": "sha512-w9GAyyikn8nSifSDZxAvU9fxtQSX+W2xQWMmrtTXmBGCaE4/ywKOSPAO78gq8AoU4Wq5yqVGKZLLbfpt7/sHlA==", "requires": { - "p-try": "^2.0.0" + "ethers": "4.0.0-beta.3", + "underscore": "1.9.1", + "web3-utils": "1.2.6" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "web3-eth-accounts": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.6.tgz", + "integrity": "sha512-cDVtonHRgzqi/ZHOOf8kfCQWFEipcfQNAMzXIaKZwc0UUD9mgSI5oJrN45a89Ze+E6Lz9m77cDG5Ax9zscSkcw==", "requires": { - "p-limit": "^2.0.0" + "@web3-js/scrypt-shim": "^0.1.0", + "any-promise": "1.3.0", + "crypto-browserify": "3.12.0", + "eth-lib": "^0.2.8", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "underscore": "1.9.1", + "uuid": "3.3.2", + "web3-core": "1.2.6", + "web3-core-helpers": "1.2.6", + "web3-core-method": "1.2.6", + "web3-utils": "1.2.6" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "web3-eth-contract": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.6.tgz", + "integrity": "sha512-ak4xbHIhWgsbdPCkSN+HnQc1SH4c856y7Ly+S57J/DQVzhFZemK5HvWdpwadJrQTcHET3ZeId1vq3kmW7UYodw==", + "requires": { + "@types/bn.js": "^4.11.4", + "underscore": "1.9.1", + "web3-core": "1.2.6", + "web3-core-helpers": "1.2.6", + "web3-core-method": "1.2.6", + "web3-core-promievent": "1.2.6", + "web3-core-subscriptions": "1.2.6", + "web3-eth-abi": "1.2.6", + "web3-utils": "1.2.6" + } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "web3-eth-ens": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.6.tgz", + "integrity": "sha512-8UEqt6fqR/dji/jBGPFAyBs16OJjwi0t2dPWXPyGXmty/fH+osnXwWXE4HRUyj4xuafiM5P1YkXMsPhKEadjiw==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "eth-ens-namehash": "2.0.8", + "underscore": "1.9.1", + "web3-core": "1.2.6", + "web3-core-helpers": "1.2.6", + "web3-core-promievent": "1.2.6", + "web3-eth-abi": "1.2.6", + "web3-eth-contract": "1.2.6", + "web3-utils": "1.2.6" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "web3-eth-iban": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.6.tgz", + "integrity": "sha512-TPMc3BW9Iso7H+9w+ytbqHK9wgOmtocyCD3PaAe5Eie50KQ/j7ThA60dGJnxItVo6yyRv5pZAYxPVob9x/fJlg==", "requires": { - "ansi-regex": "^3.0.0" + "bn.js": "4.11.8", + "web3-utils": "1.2.6" } }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "web3-eth-personal": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.6.tgz", + "integrity": "sha512-T2NUkh1plY8d7wePXSoHnaiKOd8dLNFaQfgBl9JHU6S7IJrG9jnYD9bVxLEgRUfHs9gKf9tQpDf7AcPFdq/A8g==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.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 || ^4.0.0", - "yargs-parser": "^11.1.1" + "@types/node": "^12.6.1", + "web3-core": "1.2.6", + "web3-core-helpers": "1.2.6", + "web3-core-method": "1.2.6", + "web3-net": "1.2.6", + "web3-utils": "1.2.6" } }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "web3-net": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.6.tgz", + "integrity": "sha512-hsNHAPddrhgjWLmbESW0KxJi2GnthPcow0Sqpnf4oB6+/+ZnQHU9OsIyHb83bnC1OmunrK2vf9Ye2mLPdFIu3A==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "web3-core": "1.2.6", + "web3-core-method": "1.2.6", + "web3-utils": "1.2.6" } - } - } - }, - "socketcluster-client": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.1.tgz", - "integrity": "sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==", - "requires": { - "buffer": "^5.2.1", - "clone": "2.1.1", - "component-emitter": "1.2.1", - "linked-list": "0.1.0", - "querystring": "0.2.0", - "sc-channel": "^1.2.0", - "sc-errors": "^2.0.1", - "sc-formatter": "^3.0.1", - "uuid": "3.2.1", - "ws": "7.1.0" - }, - "dependencies": { - "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + }, + "web3-providers-http": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.6.tgz", + "integrity": "sha512-2+SaFCspb5f82QKuHB3nEPQOF9iSWxRf7c18fHtmnLNVkfG9SwLN1zh67bYn3tZGUdOI3gj8aX4Uhfpwx9Ezpw==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "web3-core-helpers": "1.2.6", + "xhr2-cookies": "1.1.0" } }, - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "web3-providers-ipc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.6.tgz", + "integrity": "sha512-b0Es+/GTZyk5FG3SgUDW+2/mBwJAXWt5LuppODptiOas8bB2khLjG6+Gm1K4uwOb+1NJGPt5mZZ8Wi7vibtQ+A==", + "requires": { + "oboe": "2.1.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.6" + } }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + "web3-providers-ws": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.6.tgz", + "integrity": "sha512-20waSYX+gb5M5yKhug5FIwxBBvkKzlJH7sK6XEgdOx6BZ9YYamLmvg9wcRVtnSZO8hV/3cWenO/tRtTrHVvIgQ==", + "requires": { + "@web3-js/websocket": "^1.0.29", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.6" + } }, - "ws": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", - "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", + "web3-shh": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.6.tgz", + "integrity": "sha512-rouWyOOM6YMbLQd65grpj8BBezQfgNeRRX+cGyW4xsn6Xgu+B73Zvr6OtA/ftJwwa9bqHGpnLrrLMeWyy4YLUw==", "requires": { - "async-limiter": "^1.0.0" + "web3-core": "1.2.6", + "web3-core-method": "1.2.6", + "web3-core-subscriptions": "1.2.6", + "web3-net": "1.2.6" } - } - } - }, - "sol-digger": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", - "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=" - }, - "sol-explore": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz", - "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=" - }, - "solc": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.5.4.tgz", - "integrity": "sha512-Jz3yz2mct0AYzR83/jBgxDqrLXTHhYUg2G2PVJbMMt5Vu+8e3Of1Mn3nvjPw5mh46jrzt8l4fBN7vHqG5ZF0cw==", - "requires": { - "command-exists": "^1.2.8", - "fs-extra": "^0.30.0", - "keccak": "^1.0.2", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33", - "yargs": "^11.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + }, + "web3-utils": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.6.tgz", + "integrity": "sha512-8/HnqG/l7dGmKMgEL9JeKPTtjScxOePTzopv5aaKFExPfaBrYRkgoMqhoowCiAl/s16QaTn4DoIF1QC4YsT7Mg==", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "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" + } + } } }, - "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" - } + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" } } }, - "solidity-parser-antlr": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/solidity-parser-antlr/-/solidity-parser-antlr-0.4.11.tgz", - "integrity": "sha512-4jtxasNGmyC0midtjH/lTFPZYvTTUMy6agYcF+HoMnzW8+cqo3piFrINb4ZCzpPW+7tTVFCGa5ubP34zOzeuMg==" + "solidity-parser-diligence": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/solidity-parser-diligence/-/solidity-parser-diligence-0.4.18.tgz", + "integrity": "sha512-mauO/qG2v59W9sOn5TYV2dS7+fvFKqIHwiku+TH82e1Yca4H8s6EDG12ZpXO2cmgLlCKX3FOqqC73aYLB8WwNg==" }, "solium-plugin-security": { "version": "0.1.1", @@ -24353,17 +11616,24 @@ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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": { - "ms": "2.0.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "diff": { @@ -24371,6 +11641,33 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" }, + "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" + } + }, + "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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -24394,11 +11691,59 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, + "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=" + }, "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=" }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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==" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "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" + } + }, "mocha": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", @@ -24416,6 +11761,37 @@ "supports-color": "4.4.0" } }, + "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" + } + }, + "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-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -24441,6 +11817,11 @@ "has-flag": "^2.0.0" } }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, "yargs": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", @@ -24459,6 +11840,14 @@ "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" + } } } }, @@ -24480,11 +11869,19 @@ } }, "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==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, "source-map-url": { @@ -24492,6 +11889,38 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "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.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -24560,20 +11989,11 @@ "strip-ansi": "^3.0.0" } }, - "string.prototype.trim": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", - "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" - } - }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -24583,24 +12003,18 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "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-buffer": "~5.2.0" } }, "strip-ansi": { @@ -24611,6 +12025,12 @@ "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 + }, "strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", @@ -24638,12 +12058,9 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "swarm-js": { "version": "0.1.37", @@ -24666,27 +12083,14 @@ }, "dependencies": { "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" } }, - "eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, "fs-extra": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", @@ -24696,25 +12100,18 @@ "jsonfile": "^2.1.0" } }, - "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==" + "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" + } }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "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" - } } } }, @@ -24788,28 +12185,6 @@ "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", "integrity": "sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ=" }, - "tape": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.0.tgz", - "integrity": "sha512-J/hvA+GJnuWJ0Sj8Z0dmu3JgMNU+MmusvkCT7+SN4/2TklW18FNCp/UuHIEhPZwHfy4sXfKYgC7kypKg4umbOw==", - "requires": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.0", - "object-inspect": "~1.7.0", - "resolve": "~1.14.2", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - } - }, "tar": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", @@ -24820,40 +12195,45 @@ "inherits": "2" } }, - "tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "optional": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, "tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", - "optional": true, + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "requires": { - "bl": "^3.0.0", - "end-of-stream": "^1.4.1", + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "optional": true, + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "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" + } + }, + "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==" + }, + "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" } } } @@ -24874,11 +12254,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" } } }, @@ -24932,15 +12307,6 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "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", @@ -24981,8 +12347,28 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -25040,6 +12426,13 @@ "bn.js": "^4.11.8", "lodash.clonedeep": "^4.5.0", "web3": "1.0.0-beta.37" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, "truffle-decoder": { @@ -25059,6 +12452,11 @@ "web3": "1.0.0-beta.37" }, "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -25078,1221 +12476,460 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/truffle-solidity-utils/-/truffle-solidity-utils-1.2.2.tgz", "integrity": "sha512-27Eos1o33x+tdRogeR8WwWuhRXatHwbp9AHANGSCm46ZhRzSWcObW8Ctm2kKdAP0jZehDLT2e7l5oZ4NJofLMg==" - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "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=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "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" - } - }, - "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==" - }, - "typescript-compare": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", - "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", - "requires": { - "typescript-logic": "^0.0.0" - } - }, - "typescript-logic": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" - }, - "typescript-tuple": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", - "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", - "requires": { - "typescript-compare": "^0.0.2" - } - }, - "typpy": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.11.tgz", - "integrity": "sha512-Jh/fykZSaxeKO0ceMAs6agki9T5TNA9kiIR6fzKbvafKpIw8UlNlHhzuqKyi5lfJJ5VojJOx9tooIbyy7vHV/g==", - "requires": { - "function.name": "^1.0.3" - } - }, - "u2f-api": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/u2f-api/-/u2f-api-0.2.7.tgz", - "integrity": "sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg==" - }, - "uglify-js": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", - "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", - "optional": true, - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - } - } - }, - "ul": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.14.tgz", - "integrity": "sha512-VaIRQZ5nkEd8VtI3OYo5qNbhHQuBtPtu5k5GrYaKCmcP1H+FkuWtS+XFTSU1oz5GiuAg2FJL5ka8ufr9zdm8eg==", - "requires": { - "deffy": "^2.2.2", - "typpy": "^2.3.4" - } - }, - "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.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - }, - "dependencies": { - "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" - }, - "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=", - "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=", - "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=", - "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=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "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==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "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=" - } - } - }, - "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=", + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "prepend-http": "^1.0.1" + "safe-buffer": "^5.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=" + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, - "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=" + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, - "usb": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/usb/-/usb-1.6.2.tgz", - "integrity": "sha512-KcovLXRQuH63iEtnqXyDQGOi5dXHpLM5lZBIUsqSJQToua8nL2sVCieQTkzQBfLe5mCuvk40MgKciI61lgevWw==", - "optional": true, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { - "bindings": "^1.4.0", - "nan": "2.13.2", - "prebuild-install": "^5.3.3" - }, - "dependencies": { - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", - "optional": true - } + "prelude-ls": "~1.1.2" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "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" + } }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" + "typescript-compare": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", + "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", + "requires": { + "typescript-logic": "^0.0.0" + } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "typescript-logic": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "typescript-tuple": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", + "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "typescript-compare": "^0.0.2" } }, - "web3": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.37.tgz", - "integrity": "sha512-8XLgUspdzicC/xHG82TLrcF/Fxzj2XYNJ1KTYnepOI77bj5rvpsxxwHYBWQ6/JOjk0HkZqoBfnXWgcIHCDhZhQ==", + "typpy": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.11.tgz", + "integrity": "sha512-Jh/fykZSaxeKO0ceMAs6agki9T5TNA9kiIR6fzKbvafKpIw8UlNlHhzuqKyi5lfJJ5VojJOx9tooIbyy7vHV/g==", "requires": { - "web3-bzz": "1.0.0-beta.37", - "web3-core": "1.0.0-beta.37", - "web3-eth": "1.0.0-beta.37", - "web3-eth-personal": "1.0.0-beta.37", - "web3-net": "1.0.0-beta.37", - "web3-shh": "1.0.0-beta.37", - "web3-utils": "1.0.0-beta.37" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "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" - } - }, - "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==" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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" - } - }, - "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" - } - } + "function.name": "^1.0.3" } }, - "web3-bzz": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.37.tgz", - "integrity": "sha512-E+dho49Nsm/QpQvYWOF35YDsQrMvLB19AApENxhlQsu6HpWQt534DQul0t3Y/aAh8rlKD6Kanxt8LhHDG3vejQ==", + "uglify-js": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", + "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", + "optional": true, "requires": { - "got": "7.1.0", - "swarm-js": "0.1.37", - "underscore": "1.8.3" + "commander": "~2.20.3", + "source-map": "~0.6.1" }, "dependencies": { - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true } } }, - "web3-core": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.37.tgz", - "integrity": "sha512-cIwEqCj7OJyefQNauI0HOgW4sSaOQ98V99H2/HEIlnCZylsDzfw7gtQUdwnRFiIyIxjbWy3iWsjwDPoXNPZBYg==", + "ul": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.14.tgz", + "integrity": "sha512-VaIRQZ5nkEd8VtI3OYo5qNbhHQuBtPtu5k5GrYaKCmcP1H+FkuWtS+XFTSU1oz5GiuAg2FJL5ka8ufr9zdm8eg==", "requires": { - "web3-core-helpers": "1.0.0-beta.37", - "web3-core-method": "1.0.0-beta.37", - "web3-core-requestmanager": "1.0.0-beta.37", - "web3-utils": "1.0.0-beta.37" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "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" - } - }, - "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==" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "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.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } } } }, - "web3-core-helpers": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.37.tgz", - "integrity": "sha512-efaLOzN28RMnbugnyelgLwPWWaSwElQzcAJ/x3PZu+uPloM/lE5x0YuBKvIh7/PoSMlHqtRWj1B8CpuQOUQ5Ew==", + "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.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { - "underscore": "1.8.3", - "web3-eth-iban": "1.0.0-beta.37", - "web3-utils": "1.0.0-beta.37" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "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=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.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=" - }, - "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==", + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "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" + "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=", + "requires": { + "isarray": "1.0.0" + } + } } }, - "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==" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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" - } + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" }, - "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" - } + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, - "web3-core-method": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.37.tgz", - "integrity": "sha512-pKWFUeqnVmzx3VrZg+CseSdrl/Yrk2ioid/HzolNXZE6zdoITZL0uRjnsbqXGEzgRRd1Oe/pFndpTlRsnxXloA==", + "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==", "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.37", - "web3-core-promievent": "1.0.0-beta.37", - "web3-core-subscriptions": "1.0.0-beta.37", - "web3-utils": "1.0.0-beta.37" + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" }, "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "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" - } - }, - "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==" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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" - } - }, - "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" - } + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, - "web3-core-promievent": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.37.tgz", - "integrity": "sha512-GTF2r1lP8nJBeA5Gxq5yZpJy9l8Fb9CXGZPfF8jHvaRdQHtm2Z+NDhqYmF833lcdkokRSyfPcXlz1mlWeClFpg==", + "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.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "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": { - "any-promise": "1.3.0", - "eventemitter3": "1.1.1" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "web3-core-requestmanager": { + "web3": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.37.tgz", - "integrity": "sha512-66VUqye5BGp1Zz1r8psCxdNH+GtTjaFwroum2Osx+wbC5oRjAiXkkadiitf6wRb+edodjEMPn49u7B6WGNuewQ==", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.37.tgz", + "integrity": "sha512-8XLgUspdzicC/xHG82TLrcF/Fxzj2XYNJ1KTYnepOI77bj5rvpsxxwHYBWQ6/JOjk0HkZqoBfnXWgcIHCDhZhQ==", "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.37", - "web3-providers-http": "1.0.0-beta.37", - "web3-providers-ipc": "1.0.0-beta.37", - "web3-providers-ws": "1.0.0-beta.37" - }, - "dependencies": { - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - } + "web3-bzz": "1.0.0-beta.37", + "web3-core": "1.0.0-beta.37", + "web3-eth": "1.0.0-beta.37", + "web3-eth-personal": "1.0.0-beta.37", + "web3-net": "1.0.0-beta.37", + "web3-shh": "1.0.0-beta.37", + "web3-utils": "1.0.0-beta.37" } }, - "web3-core-subscriptions": { + "web3-bzz": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.37.tgz", - "integrity": "sha512-FdXl8so9kwkRRWziuCSpFsAuAdg9KvpXa1fQlT16uoGcYYfxwFO/nkwyBGQzkZt7emShI2IRugcazyPCZDwkOA==", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.37.tgz", + "integrity": "sha512-E+dho49Nsm/QpQvYWOF35YDsQrMvLB19AApENxhlQsu6HpWQt534DQul0t3Y/aAh8rlKD6Kanxt8LhHDG3vejQ==", "requires": { - "eventemitter3": "1.1.1", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.37" - }, - "dependencies": { - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - } + "got": "7.1.0", + "swarm-js": "0.1.37", + "underscore": "1.8.3" } }, - "web3-eth": { + "web3-core": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.37.tgz", - "integrity": "sha512-Eb3aGtkz3G9q+Z9DKgSQNbn/u8RtcZQQ0R4sW9hy5KK47GoT6vab5c6DiD3QWzI0BzitHzR5Ji+3VHf/hPUGgw==", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.37.tgz", + "integrity": "sha512-cIwEqCj7OJyefQNauI0HOgW4sSaOQ98V99H2/HEIlnCZylsDzfw7gtQUdwnRFiIyIxjbWy3iWsjwDPoXNPZBYg==", "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.37", "web3-core-helpers": "1.0.0-beta.37", "web3-core-method": "1.0.0-beta.37", - "web3-core-subscriptions": "1.0.0-beta.37", - "web3-eth-abi": "1.0.0-beta.37", - "web3-eth-accounts": "1.0.0-beta.37", - "web3-eth-contract": "1.0.0-beta.37", - "web3-eth-ens": "1.0.0-beta.37", - "web3-eth-iban": "1.0.0-beta.37", - "web3-eth-personal": "1.0.0-beta.37", - "web3-net": "1.0.0-beta.37", + "web3-core-requestmanager": "1.0.0-beta.37", "web3-utils": "1.0.0-beta.37" - }, - "dependencies": { - "@types/node": { - "version": "10.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.15.tgz", - "integrity": "sha512-daFGV9GSs6USfPgxceDA8nlSe48XrVCJfDeYm7eokxq/ye7iuOH87hKXgMtEAVLFapkczbZsx868PMDT1Y0a6A==" - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "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" - }, - "dependencies": { - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "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" - } - } - } - }, - "ethers": { - "version": "4.0.0-beta.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.1.tgz", - "integrity": "sha512-SoYhktEbLxf+fiux5SfCEwdzWENMvgIbMZD90I62s4GZD9nEjgEWy8ZboI3hck193Vs0bDoTohDISx84f2H2tw==", - "requires": { - "@types/node": "^10.3.2", - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.3.3", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "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==" - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - }, - "web3-eth-abi": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.37.tgz", - "integrity": "sha512-g9DKZGM2OqwKp/tX3W/yihcj7mQCtJ6CXyZXEIZfuDyRBED/iSEIFfieDOd+yo16sokLMig6FG7ADhhu+19hdA==", - "requires": { - "ethers": "4.0.0-beta.1", - "underscore": "1.8.3", - "web3-utils": "1.0.0-beta.37" - } - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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=" - } - } - }, - "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" - } - } } }, - "web3-eth-abi": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz", - "integrity": "sha512-w9GAyyikn8nSifSDZxAvU9fxtQSX+W2xQWMmrtTXmBGCaE4/ywKOSPAO78gq8AoU4Wq5yqVGKZLLbfpt7/sHlA==", - "requires": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.6" - }, - "dependencies": { - "@types/node": { - "version": "10.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.15.tgz", - "integrity": "sha512-daFGV9GSs6USfPgxceDA8nlSe48XrVCJfDeYm7eokxq/ye7iuOH87hKXgMtEAVLFapkczbZsx868PMDT1Y0a6A==" - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "requires": { - "@types/node": "^10.3.2", - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.3.3", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } + "web3-core-helpers": { + "version": "1.0.0-beta.37", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.37.tgz", + "integrity": "sha512-efaLOzN28RMnbugnyelgLwPWWaSwElQzcAJ/x3PZu+uPloM/lE5x0YuBKvIh7/PoSMlHqtRWj1B8CpuQOUQ5Ew==", + "requires": { + "underscore": "1.8.3", + "web3-eth-iban": "1.0.0-beta.37", + "web3-utils": "1.0.0-beta.37" } }, - "web3-eth-accounts": { + "web3-core-method": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.37.tgz", - "integrity": "sha512-uvbHL62/zwo4GDmwKdqH9c/EgYd8QVnAfpVw8D3epSISpgbONNY7Hr4MRMSd/CqAP12l2Ls9JVQGLhhC83bW6g==", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.37.tgz", + "integrity": "sha512-pKWFUeqnVmzx3VrZg+CseSdrl/Yrk2ioid/HzolNXZE6zdoITZL0uRjnsbqXGEzgRRd1Oe/pFndpTlRsnxXloA==", "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.37", "web3-core-helpers": "1.0.0-beta.37", - "web3-core-method": "1.0.0-beta.37", + "web3-core-promievent": "1.0.0-beta.37", + "web3-core-subscriptions": "1.0.0-beta.37", "web3-utils": "1.0.0-beta.37" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "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==" - }, - "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" - } - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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": { - "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" - } - } - } - }, - "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" - } - } } }, - "web3-eth-contract": { + "web3-core-promievent": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.37.tgz", - "integrity": "sha512-h1B3A8Z/C7BlnTCHkrWbXZQTViDxfR12lKMeTkT8Sqj5phFmxrBlPE4ORy4lf1Dk5b23mZYE0r/IRACx4ThCrQ==", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.37.tgz", + "integrity": "sha512-GTF2r1lP8nJBeA5Gxq5yZpJy9l8Fb9CXGZPfF8jHvaRdQHtm2Z+NDhqYmF833lcdkokRSyfPcXlz1mlWeClFpg==", + "requires": { + "any-promise": "1.3.0", + "eventemitter3": "1.1.1" + } + }, + "web3-core-requestmanager": { + "version": "1.0.0-beta.37", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.37.tgz", + "integrity": "sha512-66VUqye5BGp1Zz1r8psCxdNH+GtTjaFwroum2Osx+wbC5oRjAiXkkadiitf6wRb+edodjEMPn49u7B6WGNuewQ==", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.37", + "web3-providers-http": "1.0.0-beta.37", + "web3-providers-ipc": "1.0.0-beta.37", + "web3-providers-ws": "1.0.0-beta.37" + } + }, + "web3-core-subscriptions": { + "version": "1.0.0-beta.37", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.37.tgz", + "integrity": "sha512-FdXl8so9kwkRRWziuCSpFsAuAdg9KvpXa1fQlT16uoGcYYfxwFO/nkwyBGQzkZt7emShI2IRugcazyPCZDwkOA==", + "requires": { + "eventemitter3": "1.1.1", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.37" + } + }, + "web3-eth": { + "version": "1.0.0-beta.37", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.37.tgz", + "integrity": "sha512-Eb3aGtkz3G9q+Z9DKgSQNbn/u8RtcZQQ0R4sW9hy5KK47GoT6vab5c6DiD3QWzI0BzitHzR5Ji+3VHf/hPUGgw==", "requires": { "underscore": "1.8.3", "web3-core": "1.0.0-beta.37", "web3-core-helpers": "1.0.0-beta.37", "web3-core-method": "1.0.0-beta.37", - "web3-core-promievent": "1.0.0-beta.37", "web3-core-subscriptions": "1.0.0-beta.37", "web3-eth-abi": "1.0.0-beta.37", + "web3-eth-accounts": "1.0.0-beta.37", + "web3-eth-contract": "1.0.0-beta.37", + "web3-eth-ens": "1.0.0-beta.37", + "web3-eth-iban": "1.0.0-beta.37", + "web3-eth-personal": "1.0.0-beta.37", + "web3-net": "1.0.0-beta.37", "web3-utils": "1.0.0-beta.37" - }, - "dependencies": { - "@types/node": { - "version": "10.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.15.tgz", - "integrity": "sha512-daFGV9GSs6USfPgxceDA8nlSe48XrVCJfDeYm7eokxq/ye7iuOH87hKXgMtEAVLFapkczbZsx868PMDT1Y0a6A==" - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "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" - }, - "dependencies": { - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "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" - } - } - } - }, - "ethers": { - "version": "4.0.0-beta.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.1.tgz", - "integrity": "sha512-SoYhktEbLxf+fiux5SfCEwdzWENMvgIbMZD90I62s4GZD9nEjgEWy8ZboI3hck193Vs0bDoTohDISx84f2H2tw==", - "requires": { - "@types/node": "^10.3.2", - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.3.3", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "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==" - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - }, - "web3-eth-abi": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.37.tgz", - "integrity": "sha512-g9DKZGM2OqwKp/tX3W/yihcj7mQCtJ6CXyZXEIZfuDyRBED/iSEIFfieDOd+yo16sokLMig6FG7ADhhu+19hdA==", - "requires": { - "ethers": "4.0.0-beta.1", - "underscore": "1.8.3", - "web3-utils": "1.0.0-beta.37" - } - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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=" - } - } - }, - "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" - } - } } }, - "web3-eth-ens": { + "web3-eth-abi": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.0.0-beta.37.tgz", - "integrity": "sha512-dR3UkrVzdRrJhfP57xBPx0CMiVnCcYFvh+u2XMkGydrhHgupSUkjqGr89xry/j1T0BkuN9mikpbyhdCVMXqMbg==", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.37.tgz", + "integrity": "sha512-g9DKZGM2OqwKp/tX3W/yihcj7mQCtJ6CXyZXEIZfuDyRBED/iSEIFfieDOd+yo16sokLMig6FG7ADhhu+19hdA==", "requires": { - "eth-ens-namehash": "2.0.8", + "ethers": "4.0.0-beta.1", "underscore": "1.8.3", - "web3-core": "1.0.0-beta.37", - "web3-core-helpers": "1.0.0-beta.37", - "web3-core-promievent": "1.0.0-beta.37", - "web3-eth-abi": "1.0.0-beta.37", - "web3-eth-contract": "1.0.0-beta.37", "web3-utils": "1.0.0-beta.37" }, "dependencies": { "@types/node": { - "version": "10.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.15.tgz", - "integrity": "sha512-daFGV9GSs6USfPgxceDA8nlSe48XrVCJfDeYm7eokxq/ye7iuOH87hKXgMtEAVLFapkczbZsx868PMDT1Y0a6A==" + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" }, "aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, "elliptic": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", @@ -26304,36 +12941,6 @@ "inherits": "^2.0.1" } }, - "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" - }, - "dependencies": { - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "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" - } - } - } - }, "ethers": { "version": "4.0.0-beta.1", "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.1.tgz", @@ -26360,345 +12967,134 @@ "minimalistic-assert": "^1.0.0" } }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "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==" - }, "scrypt-js": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, "uuid": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - }, - "web3-eth-abi": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.37.tgz", - "integrity": "sha512-g9DKZGM2OqwKp/tX3W/yihcj7mQCtJ6CXyZXEIZfuDyRBED/iSEIFfieDOd+yo16sokLMig6FG7ADhhu+19hdA==", - "requires": { - "ethers": "4.0.0-beta.1", - "underscore": "1.8.3", - "web3-utils": "1.0.0-beta.37" - } - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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=" - } - } - }, - "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" - } } } }, - "web3-eth-iban": { + "web3-eth-accounts": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.37.tgz", - "integrity": "sha512-WQRniGJFxH/XCbd7miO6+jnUG+6bvuzfeufPIiOtCbeIC1ypp1kSqER8YVBDrTyinU1xnf1U5v0KBZ2yiWBJxQ==", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.37.tgz", + "integrity": "sha512-uvbHL62/zwo4GDmwKdqH9c/EgYd8QVnAfpVw8D3epSISpgbONNY7Hr4MRMSd/CqAP12l2Ls9JVQGLhhC83bW6g==", "requires": { - "bn.js": "4.11.6", + "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.37", + "web3-core-helpers": "1.0.0-beta.37", + "web3-core-method": "1.0.0-beta.37", "web3-utils": "1.0.0-beta.37" }, "dependencies": { "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "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==", + "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", - "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" } }, - "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==" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", "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" + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" } }, - "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" - } + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" } } }, - "web3-eth-personal": { + "web3-eth-contract": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.37.tgz", - "integrity": "sha512-B4dZpGbD+nGnn48i6nJBqrQ+HB7oDmd+Q3wGRKOsHSK5HRWO/KwYeA7wgwamMAElkut50lIsT9EJl4Apfk3G5Q==", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.37.tgz", + "integrity": "sha512-h1B3A8Z/C7BlnTCHkrWbXZQTViDxfR12lKMeTkT8Sqj5phFmxrBlPE4ORy4lf1Dk5b23mZYE0r/IRACx4ThCrQ==", "requires": { + "underscore": "1.8.3", "web3-core": "1.0.0-beta.37", "web3-core-helpers": "1.0.0-beta.37", "web3-core-method": "1.0.0-beta.37", - "web3-net": "1.0.0-beta.37", + "web3-core-promievent": "1.0.0-beta.37", + "web3-core-subscriptions": "1.0.0-beta.37", + "web3-eth-abi": "1.0.0-beta.37", "web3-utils": "1.0.0-beta.37" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "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" - } - }, - "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==" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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" - } - }, - "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" - } - } } }, - "web3-net": { + "web3-eth-ens": { "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.37.tgz", - "integrity": "sha512-xG/uBtMdDa1UMXw9KjDUgf3fXA/fDEJUYUS0TDn+U9PMgngA+UVECHNNvQTrVVDxEky38V3sahwIDiopNsQdsw==", - "requires": { - "web3-core": "1.0.0-beta.37", - "web3-core-method": "1.0.0-beta.37", - "web3-utils": "1.0.0-beta.37" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "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" - } - }, - "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==" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "web3-utils": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", - "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", - "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" - } - }, - "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" - } - } + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.0.0-beta.37.tgz", + "integrity": "sha512-dR3UkrVzdRrJhfP57xBPx0CMiVnCcYFvh+u2XMkGydrhHgupSUkjqGr89xry/j1T0BkuN9mikpbyhdCVMXqMbg==", + "requires": { + "eth-ens-namehash": "2.0.8", + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.37", + "web3-core-helpers": "1.0.0-beta.37", + "web3-core-promievent": "1.0.0-beta.37", + "web3-eth-abi": "1.0.0-beta.37", + "web3-eth-contract": "1.0.0-beta.37", + "web3-utils": "1.0.0-beta.37" } }, - "web3-provider-engine": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz", - "integrity": "sha512-tr5cGSyxfSC/JqiUpBlJtfZpwQf1yAA8L/zy1C6fDFm0ntR974pobJ4v4676atpZne4Ze5VFy3kPPahHe9gQiQ==", - "requires": { - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^3.0.0", - "eth-json-rpc-infura": "^3.1.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.67.0", - "semaphore": "^1.0.3", - "tape": "^4.4.0", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" + "web3-eth-iban": { + "version": "1.0.0-beta.37", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.37.tgz", + "integrity": "sha512-WQRniGJFxH/XCbd7miO6+jnUG+6bvuzfeufPIiOtCbeIC1ypp1kSqER8YVBDrTyinU1xnf1U5v0KBZ2yiWBJxQ==", + "requires": { + "bn.js": "4.11.6", + "web3-utils": "1.0.0-beta.37" }, "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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" - } + "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.37", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.37.tgz", + "integrity": "sha512-B4dZpGbD+nGnn48i6nJBqrQ+HB7oDmd+Q3wGRKOsHSK5HRWO/KwYeA7wgwamMAElkut50lIsT9EJl4Apfk3G5Q==", + "requires": { + "web3-core": "1.0.0-beta.37", + "web3-core-helpers": "1.0.0-beta.37", + "web3-core-method": "1.0.0-beta.37", + "web3-net": "1.0.0-beta.37", + "web3-utils": "1.0.0-beta.37" + } + }, + "web3-net": { + "version": "1.0.0-beta.37", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.37.tgz", + "integrity": "sha512-xG/uBtMdDa1UMXw9KjDUgf3fXA/fDEJUYUS0TDn+U9PMgngA+UVECHNNvQTrVVDxEky38V3sahwIDiopNsQdsw==", + "requires": { + "web3-core": "1.0.0-beta.37", + "web3-core-method": "1.0.0-beta.37", + "web3-utils": "1.0.0-beta.37" + } + }, "web3-providers-http": { "version": "1.0.0-beta.37", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.37.tgz", @@ -26716,13 +13112,6 @@ "oboe": "2.1.3", "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.37" - }, - "dependencies": { - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - } } }, "web3-providers-ws": { @@ -26733,13 +13122,6 @@ "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.37", "websocket": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" - }, - "dependencies": { - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - } } }, "web3-shh": { @@ -26754,18 +13136,58 @@ } }, "web3-utils": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.6.tgz", - "integrity": "sha512-8/HnqG/l7dGmKMgEL9JeKPTtjScxOePTzopv5aaKFExPfaBrYRkgoMqhoowCiAl/s16QaTn4DoIF1QC4YsT7Mg==", + "version": "1.0.0-beta.37", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.37.tgz", + "integrity": "sha512-kA1fyhO8nKgU21wi30oJQ/ssvu+9srMdjOTKbHYbQe4ATPcr5YNwwrxG3Bcpbu1bEwRUVKHCkqi+wTvcAWBdlQ==", "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethereum-bloom-filters": "^1.0.6", + "bn.js": "4.11.6", + "eth-lib": "0.1.27", "ethjs-unit": "0.1.6", "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.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=" + }, + "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" + } + }, + "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==" + }, + "utf8": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" + }, + "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" + } + } } }, "webidl-conversions": { @@ -26782,13 +13204,18 @@ "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" + } + } } }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, "whatwg-url-compat": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", @@ -26816,24 +13243,15 @@ "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, "wrap-ansi": { "version": "2.1.0", @@ -26855,14 +13273,29 @@ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "requires": { "mkdirp": "^0.5.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", + "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", "requires": { - "async-limiter": "~1.0.0" + "async-limiter": "^1.0.0" } }, "xhr": { @@ -26888,31 +13321,6 @@ "timed-out": "^4.0.1", "url-set-query": "^1.0.0", "xhr": "^2.0.4" - }, - "dependencies": { - "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" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "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" - } - } } }, "xhr-request-promise": { @@ -26967,9 +13375,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yaeti": { "version": "0.0.6", @@ -26977,16 +13385,16 @@ "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", + "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", "requires": { - "@babel/runtime": "^7.6.3" + "@babel/runtime": "^7.8.7" } }, "yargs": { @@ -27013,11 +13421,119 @@ "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=" + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "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=" + }, "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=" }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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==" + }, + "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" + } + }, + "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-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -27035,6 +13551,11 @@ "ansi-regex": "^3.0.0" } }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, "yargs-parser": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", @@ -27046,11 +13567,12 @@ } }, "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "yauzl": { diff --git a/package.json b/package.json index 351f4e460..65f7a40f7 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,21 @@ "compile:lib": "npx etherlime compile --workingDirectory lib --runs=200", "compile": "npx etherlime compile --runs=999", "ganache": "npx etherlime ganache --gasLimit=10700000 -e 10000", + "kovan-fork": "npx ganache-cli -i 42 -l 10700000 -f https://kovan.infura.io/v3/$(cat .env | sed -En 's/INFURA_KEY=''\"''([^''\"'']+)''\"''/\\1/p')@16988040", + "kovan-fork-latest": "npx ganache-cli -i 42 -l 10700000 -f https://kovan.infura.io/v3/$(cat .env | sed -En 's/INFURA_KEY=''\"''([^''\"'']+)''\"''/\\1/p')", "test": "npx etherlime test --skip-compilation", "ctest": "npm run compile && npm run test", + "provision:lib:artefacts": "bash ./scripts/provision_lib_artefacts.sh", + "test:coverage": "bash ./scripts/provision_lib_artefacts.sh & COVERAGE=1 npx etherlime coverage --solcVersion 0.5.4 && istanbul check-coverage --statements 71 --branches 61 --functions 73 --lines 71", "lint:contracts": "npx ethlint --dir .", - "ethlint-staged": "bash ./scripts/ethlint.sh", - "test:deployment": "./deploy.sh ganache `seq 1 7`" + "lint:contracts:staged": "bash ./scripts/ethlint.sh", + "test:deployment": "./scripts/deploy.sh ganache `seq 1 7`", + "lint:js": "eslint .", + "lint:js:staged": "bash ./scripts/eslint.sh" }, "husky": { "hooks": { - "pre-commit": "npm run ethlint-staged" + "pre-commit": "npm run lint:contracts:staged && npm run lint:js:staged" } }, "repository": { @@ -34,19 +40,28 @@ "ajv": "^6.10.0", "aws-sdk": "^2.521.0", "bip39": "^3.0.2", + "bn.js": "^5.1.1", "cli-table2": "^0.2.0", "dotenv": "^6.2.0", "ethereumjs-wallet": "^0.6.3", - "etherlime": "2.2.4", + "etherlime": "^2.3.0", "etherlime-lib": "1.1.3", "ethers": "^4.0.28", "ethlint": "^1.2.5", + "ganache-cli": "^6.8.0-istanbul.0", "husky": "^4.2.3", "inquirer": "^7.0.0", + "istanbul": "^0.4.5", "node-fetch": "^2.3.0", "openzeppelin-solidity": "2.3.0", "ps-node": "^0.1.6", + "semver": "^7.1.3", "solc": "0.5.4", "tinyreq": "^3.4.1" + }, + "devDependencies": { + "eslint": "^6.8.0", + "eslint-config-airbnb-base": "^14.0.0", + "eslint-plugin-import": "^2.20.1" } } diff --git a/scripts/compound.js b/scripts/compound.js index 1cc4608af..52c8563d3 100644 --- a/scripts/compound.js +++ b/scripts/compound.js @@ -1,62 +1,57 @@ -const CompoundRegistry = require('../build/CompoundRegistry'); -const MultiSig = require('../build/MultiSigWallet'); - -const utils = require('../utils/utilities.js'); -const DeployManager = require('../utils/deploy-manager.js'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); - - -async function main() { - - var add; - - // Read Command Line Arguments - let idx = process.argv.indexOf("--network"); - const network = process.argv[idx + 1]; - - idx = process.argv.indexOf("--add"); - if(idx > 0) { - add = true; - } - else { - idx = process.argv.indexOf("--remove"); - if(idx > 0) { - add = false; - } - else { - console.log("Error: Use --add or --remove to add or remove tokens from Compound"); - return; - } - } - - idx = process.argv.indexOf("--token"); - const token = process.argv[idx + 1]; - - idx = process.argv.indexOf("--ctoken"); - const ctoken = process.argv[idx + 1]; - - // Setup deployer - const manager = new DeployManager(network); - await manager.setup(); - const configurator = manager.configurator; - const deployer = manager.deployer; - const deploymentWallet = deployer.signer; - const config = configurator.config; - - const CompoundRegistryWrapper = await deployer.wrapDeployedContract(CompoundRegistry, config.contracts.CompoundRegistry); - const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); - const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); - - if(add) { - console.log(`Adding token ${token} to Compound`); - await multisigExecutor.executeCall(CompoundRegistryWrapper, "addCToken", [token, ctoken]); - } - else { - console.log(`Removing token ${token} from Compound`); - await multisigExecutor.executeCall(CompoundRegistryWrapper, "removeCToken", [token]); +const CompoundRegistry = require("../build/CompoundRegistry"); +const MultiSig = require("../build/MultiSigWallet"); + +const DeployManager = require("../utils/deploy-manager.js"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); + + +async function main() { + let add; + + // Read Command Line Arguments + let idx = process.argv.indexOf("--network"); + const network = process.argv[idx + 1]; + + idx = process.argv.indexOf("--add"); + if (idx > 0) { + add = true; + } else { + idx = process.argv.indexOf("--remove"); + if (idx > 0) { + add = false; + } else { + console.log("Error: Use --add or --remove to add or remove tokens from Compound"); + return; } + } + + idx = process.argv.indexOf("--token"); + const token = process.argv[idx + 1]; + + idx = process.argv.indexOf("--ctoken"); + const ctoken = process.argv[idx + 1]; + + // Setup deployer + const manager = new DeployManager(network); + await manager.setup(); + const { configurator } = manager; + const { deployer } = manager; + const deploymentWallet = deployer.signer; + const { config } = configurator; + + const CompoundRegistryWrapper = await deployer.wrapDeployedContract(CompoundRegistry, config.contracts.CompoundRegistry); + const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); + + if (add) { + console.log(`Adding token ${token} to Compound`); + await multisigExecutor.executeCall(CompoundRegistryWrapper, "addCToken", [token, ctoken]); + } else { + console.log(`Removing token ${token} from Compound`); + await multisigExecutor.executeCall(CompoundRegistryWrapper, "removeCToken", [token]); + } } -main().catch(err => { - throw err; -}); \ No newline at end of file +main().catch((err) => { + throw err; +}); diff --git a/scripts/createWallet.js b/scripts/createWallet.js index 5dfd0db76..e89027871 100644 --- a/scripts/createWallet.js +++ b/scripts/createWallet.js @@ -1,69 +1,69 @@ // Example Usage: -// node createWallet.js --network dev --ens john --owner 0x10391442e6ca847151372b6c7cbcc1fd06afda86 +// node scripts/createWallet.js --network kovan --ens john --owner 0x10391442e6ca847151372b6c7cbcc1fd06afda86 -const WalletFactory = require('../build/WalletFactory'); -const MultiSigWallet = require('../build/MultiSigWallet'); +const WalletFactory = require("../build/WalletFactory"); +const MultiSigWallet = require("../build/MultiSigWallet"); -const MultisigExecutor = require('../utils/multisigexecutor.js'); -const DeployManager = require('../utils/deploy-manager.js'); +const MultisigExecutor = require("../utils/multisigexecutor.js"); +const DeployManager = require("../utils/deploy-manager.js"); async function main() { + // Read Command Line Arguments + let idx = process.argv.indexOf("--network"); + const network = process.argv[idx + 1]; - // Read Command Line Arguments - let idx = process.argv.indexOf("--network"); - const network = process.argv[idx + 1]; + const deployManager = new DeployManager(network); + await deployManager.setup(); - const deployManager = new DeployManager(network); - await deployManager.setup(); + const { configurator } = deployManager; + const { deployer } = deployManager; + const manager = deployer.signer; - const configurator = deployManager.configurator; - const deployer = deployManager.deployer; - const manager = deployer.signer; + idx = process.argv.indexOf("--ens"); + const walletEns = idx > -1 ? process.argv[idx + 1] : Math.random().toString(36).replace(/[^a-z]+/g, "").substr(0, 5); - idx = process.argv.indexOf("--ens"); - const walletEns = idx > -1 ? process.argv[idx + 1] : Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5); + idx = process.argv.indexOf("--owner"); + const owner = idx > -1 ? process.argv[idx + 1] : manager.address; - idx = process.argv.indexOf("--owner"); - const owner = idx > -1 ? process.argv[idx + 1] : manager.address; + const { config } = configurator; + console.log("Config:", config); - const config = configurator.config; - console.log('Config:', config); + const walletFactoryWrapper = await deployer.wrapDeployedContract(WalletFactory, config.contracts.WalletFactory); + const multisigWrapper = await deployer.wrapDeployedContract(MultiSigWallet, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(multisigWrapper, manager, config.multisig.autosign); - const walletFactoryWrapper = await deployer.wrapDeployedContract(WalletFactory, config.contracts.WalletFactory); - const multisigWrapper = await deployer.wrapDeployedContract(MultiSigWallet, config.contracts.MultiSigWallet); - const multisigExecutor = new MultisigExecutor(multisigWrapper, manager, config.multisig.autosign); + // Make manager a temporary manager of WalletFactory to facilitate wallet initialization + let revokeManager = false; + if (!await walletFactoryWrapper.managers(manager.address)) { + console.log(`Adding accounts[0] (${manager.address}) as Manager of WalletFactory...`); + await multisigExecutor.executeCall(walletFactoryWrapper, "addManager", [manager.address]); + revokeManager = true; + } - // Make manager a temporary manager of WalletFactory to facilitate wallet initialization - let revokeManager = false; - if (!await walletFactoryWrapper.managers(manager.address)) { - console.log(`Adding accounts[0] (${manager.address}) as Manager of WalletFactory...`) - await multisigExecutor.executeCall(walletFactoryWrapper, "addManager", [manager.address]); - revokeManager = true; - } + // Create Wallet + console.log("Creating new wallet..."); + const modules = [ + "GuardianManager", + "LockManager", + "RecoveryManager", + "ApprovedTransfer", + "TransferManager", + "TokenExchanger", + "MakerV2Manager", + ].map((name) => config.modules[name]).filter((x) => x); + const tx = await ((walletFactoryWrapper.from && walletFactoryWrapper.from(manager)) + || walletFactoryWrapper).createWallet(owner, modules, walletEns); + const txReceipt = await walletFactoryWrapper.verboseWaitForTransaction(tx); + const walletAddress = txReceipt.events.find((log) => log.event === "WalletCreated").args._wallet; + console.log(`New wallet ${walletEns}.${config.ENS.domain} successfully created at address ${walletAddress} for owner ${owner}.`); - // Create Wallet - console.log("Creating new wallet..."); - const modules = [ - config.modules.GuardianManager, - config.modules.LockManager, - config.modules.RecoveryManager, - config.modules.ApprovedTransfer, - config.modules.TransferManager, - config.modules.TokenExchanger, - config.modules.MakerV2Manager - ]; - const tx = await (walletFactoryWrapper.from && walletFactoryWrapper.from(manager) || walletFactoryWrapper).createWallet(owner, modules, walletEns); - const txReceipt = await walletFactoryWrapper.verboseWaitForTransaction(tx); - const walletAddress = txReceipt.events.find(log => log.event === "WalletCreated").args["_wallet"]; - console.log(`New wallet ${walletEns}.${config.ENS.domain} successfully created at address ${walletAddress} for owner ${owner}.`); - - // Remove temporary manager from WalletFactory - if (revokeManager === true) { - console.log(`Removing manager (${manager.address}) as Manager of WalletFactory...`) - await multisigExecutor.executeCall(walletFactoryWrapper, "revokeManager", [manager.address]); - } + // Remove temporary manager from WalletFactory + if (revokeManager === true) { + console.log(`Removing manager (${manager.address}) as Manager of WalletFactory...`); + await multisigExecutor.executeCall(walletFactoryWrapper, "revokeManager", [manager.address]); + } } -main().catch(err => { - throw err; +main().catch((err) => { + throw err; }); diff --git a/deploy.sh b/scripts/deploy.sh similarity index 59% rename from deploy.sh rename to scripts/deploy.sh index 02edf4a94..61fe171b5 100755 --- a/deploy.sh +++ b/scripts/deploy.sh @@ -26,7 +26,14 @@ npx etherlime compile --runs 999 for IDX in "$@" do FILE=`ls ./deployment/${IDX}_*.js` - AWS_PROFILE=argent-$PROFILE AWS_SDK_LOAD_CONFIG=true npx etherlime deploy --file $FILE --network $NETWORK --compile false + if [ ! -z "${CI:-}" ]; then + echo "Waiting for ganache to launch on port 8545..." + while ! nc -z localhost 8545; do sleep 1; done + echo "ganache running on port 8545" + npx etherlime deploy --file $FILE --network $NETWORK --compile false + else + AWS_PROFILE=argent-$PROFILE AWS_SDK_LOAD_CONFIG=true npx etherlime deploy --file $FILE --network $NETWORK --compile false + fi if [ $? -ne 0 ]; then exit 1 # exit with failure status fi diff --git a/scripts/deploy_custom_upgrader.js b/scripts/deploy_custom_upgrader.js index d006f3bd7..ff9e5fcfe 100644 --- a/scripts/deploy_custom_upgrader.js +++ b/scripts/deploy_custom_upgrader.js @@ -1,44 +1,48 @@ // AWS_PROFILE=argent-test AWS_SDK_LOAD_CONFIG=true etherlime deploy --file ./scripts/deploy_custom_upgrader.js --compile false -const ModuleRegistry = require('../build/ModuleRegistry'); -const MultiSig = require('../build/MultiSigWallet'); -const Upgrader = require('../build/SimpleUpgrader'); - -const utils = require('../utils/utilities.js'); -const DeployManager = require('../utils/deploy-manager.js'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); - - -async function deploy() { - - const network = 'test'; - const modules_to_remove = []; - const modules_to_add = ["0x624EbBd0f4169E2e11861618045491b6A4e29E77", "0xF6E1AB6cA27c995433C6b71E15270F0b11AE38E2", "0xeAD317AAeAecE3048338D158A64012378bE0bcE2", "0xE739e93dD617D28216dB669AcFdbFC70BF95663c"]; - const upgrader_name = "0x4ef2f261_0xee7263da"; - - const manager = new DeployManager(network); - await manager.setup(); - - const configurator = manager.configurator; - const deployer = manager.deployer; - const deploymentWallet = deployer.signer; - const config = configurator.config; - - const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); - const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); - const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); - - const UpgraderWrapper = await deployer.deploy( - Upgrader, - {}, - modules_to_remove, - modules_to_add - ); - - await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerUpgrader", [UpgraderWrapper.contractAddress, utils.asciiToBytes32(upgrader_name)]); - +const ModuleRegistry = require("../build/ModuleRegistry"); +const MultiSig = require("../build/MultiSigWallet"); +const Upgrader = require("../build/SimpleUpgrader"); + +const utils = require("../utils/utilities.js"); +const DeployManager = require("../utils/deploy-manager.js"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); + + +async function deploy() { + const network = "test"; + const modulesToRemove = []; + const modulesToAdd = [ + "0x624EbBd0f4169E2e11861618045491b6A4e29E77", + "0xF6E1AB6cA27c995433C6b71E15270F0b11AE38E2", + "0xeAD317AAeAecE3048338D158A64012378bE0bcE2", + "0xE739e93dD617D28216dB669AcFdbFC70BF95663c", + ]; + const upgraderName = "0x4ef2f261_0xee7263da"; + + const manager = new DeployManager(network); + await manager.setup(); + + const { configurator } = manager; + const { deployer } = manager; + const deploymentWallet = deployer.signer; + const { config } = configurator; + + const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); + + const UpgraderWrapper = await deployer.deploy( + Upgrader, + {}, + modulesToRemove, + modulesToAdd, + ); + + await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerUpgrader", + [UpgraderWrapper.contractAddress, utils.asciiToBytes32(upgraderName)]); } module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/scripts/deploy_defi.js b/scripts/deploy_defi.js index 5b7ebd104..c81c178a6 100644 --- a/scripts/deploy_defi.js +++ b/scripts/deploy_defi.js @@ -1,112 +1,112 @@ // AWS_PROFILE=argent-test AWS_SDK_LOAD_CONFIG=true etherlime deploy --file ./scripts/deploy_defi.js --compile false +const { parseEther, formatBytes32String, bigNumberify } = require("ethers").utils; -const DeployManager = require('../utils/deploy-manager.js'); +const DeployManager = require("../utils/deploy-manager.js"); -const UniswapFactory = require("../contracts/test/uniswap/UniswapFactory"); -const UniswapExchange = require("../contracts/test/uniswap/UniswapExchange"); +const UniswapFactory = require("../lib/uniswap/UniswapFactory"); +const UniswapExchange = require("../lib/uniswap/UniswapExchange"); const Vox = require("../build/SaiVox"); const Tub = require("../build/SaiTub"); const DSToken = require("../build/DSToken"); const WETH = require("../build/WETH9"); const DSValue = require("../build/DSValue"); -const { parseEther, formatBytes32String, bigNumberify } = require('ethers').utils; -const RAY = bigNumberify('1000000000000000000000000000') // 10**27 -const WAD = bigNumberify('1000000000000000000') // 10**18 +const RAY = bigNumberify("1000000000000000000000000000"); // 10**27 +const WAD = bigNumberify("1000000000000000000"); // 10**18 const USD_PER_DAI = RAY; // 1 DAI = 1 USD const USD_PER_ETH = WAD.mul(250); // 1 ETH = 250 USD const USD_PER_MKR = WAD.mul(700); // 1 MKR = 700 USD const ETH_PER_MKR = WAD.mul(USD_PER_MKR).div(USD_PER_ETH); // 1 MKR = 2.8 ETH -async function deploy() { - const idx = process.argv.indexOf("--network"); - const network = idx > -1 ? process.argv[idx + 1] : 'test'; - - const deployManager = new DeployManager(network); - await deployManager.setup(); - const deployer = deployManager.deployer; - const manager = deployer.signer; // the pit - - /* ************* Deploy Maker *************** */ - const vox = await deployer.deploy(Vox, {}, USD_PER_DAI); - const sai = await deployer.deploy(DSToken, {}, formatBytes32String("DAI")); - const gov = await deployer.deploy(DSToken, {}, formatBytes32String("MKR")); - const sin = await deployer.deploy(DSToken, {}, formatBytes32String("SIN")); - const skr = await deployer.deploy(DSToken, {}, formatBytes32String("PETH")); - const gem = await deployer.deploy(WETH); - const pip = await deployer.deploy(DSValue); - const pep = await deployer.deploy(DSValue); - const tub = await deployer.deploy(Tub, {}, - sai.contractAddress, - sin.contractAddress, - skr.contractAddress, - gem.contractAddress, - gov.contractAddress, - pip.contractAddress, - pep.contractAddress, - vox.contractAddress, - manager.address); - - // let the Tub mint PETH and DAI - await skr.setOwner(tub.contractAddress); - await sai.setOwner(tub.contractAddress); - // setup USD/ETH oracle with a convertion rate of 100 USD/ETH - await pip.poke('0x' + USD_PER_ETH.toHexString().slice(2).padStart(64, '0')); - // setup USD/MKR oracle with a convertion rate of 400 USD/MKR - await pep.poke('0x' + USD_PER_MKR.toHexString().slice(2).padStart(64, '0')); - // set the total DAI debt ceiling to 50,000 DAI - await tub.mold(formatBytes32String('cap'), parseEther('50000')); - // set the liquidity ratio to 150% - await tub.mold(formatBytes32String('mat'), RAY.mul(3).div(2)); - // set the governance fee to 7.5% APR - await tub.mold(formatBytes32String('fee'), '1000000002293273137447730714', { gasLimit: 150000 }); - // set the liquidation penalty to 13% - await tub.mold(formatBytes32String('axe'), '1130000000000000000000000000', { gasLimit: 150000 }); - - /* ************* Deploy Uniswap ****************** */ - - const uniswapFactory = await deployer.deploy(UniswapFactory); - const uniswapTemplateExchange = await deployer.deploy(UniswapExchange); - await uniswapFactory.initializeFactory(uniswapTemplateExchange.contractAddress); - - /* *************** create MKR exchange ***************** */ - - const ethLiquidity = parseEther('1'); - const mkrLiquidity = ethLiquidity.mul(WAD).div(ETH_PER_MKR); - await gov['mint(address,uint256)'](manager.address, mkrLiquidity); - - await uniswapFactory.createExchange(gov.contractAddress, { gasLimit: 450000 }); - let exchange = '0x0000000000000000000000000000000000000000'; - while (exchange == '0x0000000000000000000000000000000000000000') { - exchange = await uniswapFactory.getExchange(gov.contractAddress); - console.log("exchange: ", exchange); - await sleep(5000); - } - const mkrExchange = await deployer.wrapDeployedContract(UniswapExchange, exchange); - await gov.approve(mkrExchange.contractAddress, mkrLiquidity); - const timestamp = await getTimestamp(deployer); - await mkrExchange.addLiquidity(1, mkrLiquidity, timestamp + 300, { value: ethLiquidity, gasLimit: 250000 }); - - console.log(`******* contracts *******`); - console.log(`DAI: ${sai.contractAddress}`); - console.log(`MKR: ${gov.contractAddress}`); - console.log(`MAKER TUB: ${tub.contractAddress}`); - console.log(`UNISWAP FACTORY: ${uniswapFactory.contractAddress}`); - console.log(`********************************`); -} - async function getTimestamp(deployer) { - let block = await deployer.provider.getBlock('latest'); - return block.timestamp; + const block = await deployer.provider.getBlock("latest"); + return block.timestamp; } function sleep(ms) { - console.log("sleeping..."); - return new Promise(resolve => setTimeout(resolve, ms)); + console.log("sleeping..."); + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function deploy() { + const idx = process.argv.indexOf("--network"); + const network = idx > -1 ? process.argv[idx + 1] : "test"; + + const deployManager = new DeployManager(network); + await deployManager.setup(); + const { deployer } = deployManager; + const manager = deployer.signer; // the pit + + /* ************* Deploy Maker *************** */ + const vox = await deployer.deploy(Vox, {}, USD_PER_DAI); + const sai = await deployer.deploy(DSToken, {}, formatBytes32String("DAI")); + const gov = await deployer.deploy(DSToken, {}, formatBytes32String("MKR")); + const sin = await deployer.deploy(DSToken, {}, formatBytes32String("SIN")); + const skr = await deployer.deploy(DSToken, {}, formatBytes32String("PETH")); + const gem = await deployer.deploy(WETH); + const pip = await deployer.deploy(DSValue); + const pep = await deployer.deploy(DSValue); + const tub = await deployer.deploy(Tub, {}, + sai.contractAddress, + sin.contractAddress, + skr.contractAddress, + gem.contractAddress, + gov.contractAddress, + pip.contractAddress, + pep.contractAddress, + vox.contractAddress, + manager.address); + + // let the Tub mint PETH and DAI + await skr.setOwner(tub.contractAddress); + await sai.setOwner(tub.contractAddress); + // setup USD/ETH oracle with a convertion rate of 100 USD/ETH + await pip.poke(`0x${USD_PER_ETH.toHexString().slice(2).padStart(64, "0")}`); + // setup USD/MKR oracle with a convertion rate of 400 USD/MKR + await pep.poke(`0x${USD_PER_MKR.toHexString().slice(2).padStart(64, "0")}`); + // set the total DAI debt ceiling to 50,000 DAI + await tub.mold(formatBytes32String("cap"), parseEther("50000")); + // set the liquidity ratio to 150% + await tub.mold(formatBytes32String("mat"), RAY.mul(3).div(2)); + // set the governance fee to 7.5% APR + await tub.mold(formatBytes32String("fee"), "1000000002293273137447730714", { gasLimit: 150000 }); + // set the liquidation penalty to 13% + await tub.mold(formatBytes32String("axe"), "1130000000000000000000000000", { gasLimit: 150000 }); + + /* ************* Deploy Uniswap ****************** */ + + const uniswapFactory = await deployer.deploy(UniswapFactory); + const uniswapTemplateExchange = await deployer.deploy(UniswapExchange); + await uniswapFactory.initializeFactory(uniswapTemplateExchange.contractAddress); + + /* *************** create MKR exchange ***************** */ + + const ethLiquidity = parseEther("1"); + const mkrLiquidity = ethLiquidity.mul(WAD).div(ETH_PER_MKR); + await gov["mint(address,uint256)"](manager.address, mkrLiquidity); + + await uniswapFactory.createExchange(gov.contractAddress, { gasLimit: 450000 }); + let exchange = "0x0000000000000000000000000000000000000000"; + while (exchange === "0x0000000000000000000000000000000000000000") { + exchange = await uniswapFactory.getExchange(gov.contractAddress); + console.log("exchange: ", exchange); + await sleep(5000); + } + const mkrExchange = await deployer.wrapDeployedContract(UniswapExchange, exchange); + await gov.approve(mkrExchange.contractAddress, mkrLiquidity); + const timestamp = await getTimestamp(deployer); + await mkrExchange.addLiquidity(1, mkrLiquidity, timestamp + 300, { value: ethLiquidity, gasLimit: 250000 }); + + console.log("******* contracts *******"); + console.log(`DAI: ${sai.contractAddress}`); + console.log(`MKR: ${gov.contractAddress}`); + console.log(`MAKER TUB: ${tub.contractAddress}`); + console.log(`UNISWAP FACTORY: ${uniswapFactory.contractAddress}`); + console.log("********************************"); } module.exports = { - deploy -}; \ No newline at end of file + deploy, +}; diff --git a/scripts/deregister.js b/scripts/deregister.js index 00e15b2fd..1cb9a9e09 100644 --- a/scripts/deregister.js +++ b/scripts/deregister.js @@ -1,38 +1,36 @@ // Usage: ./execute.sh deregister.js staging --module 0x9ABb5Db4B23A866ffd649716c6ce2674b2C28C17abc -const ModuleRegistry = require('../build/ModuleRegistry'); -const MultiSig = require('../build/MultiSigWallet'); +const ModuleRegistry = require("../build/ModuleRegistry"); +const MultiSig = require("../build/MultiSigWallet"); -const DeployManager = require('../utils/deploy-manager.js'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); +const DeployManager = require("../utils/deploy-manager.js"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); -async function main() { +async function main() { + // Read Command Line Arguments + let idx = process.argv.indexOf("--network"); + const network = process.argv[idx + 1]; - // Read Command Line Arguments - let idx = process.argv.indexOf("--network"); - const network = process.argv[idx + 1]; + idx = process.argv.indexOf("--module"); + const targetModule = process.argv[idx + 1]; - idx = process.argv.indexOf("--module"); - const targetModule = process.argv[idx + 1]; - - // Setup deployer - const manager = new DeployManager(network); - await manager.setup(); - const configurator = manager.configurator; - const deployer = manager.deployer; - const deploymentWallet = deployer.signer; - const config = configurator.config; + // Setup deployer + const manager = new DeployManager(network); + await manager.setup(); + const { configurator } = manager; + const { deployer } = manager; + const deploymentWallet = deployer.signer; + const { config } = configurator; - const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); - const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); - const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); - - // deregister - await multisigExecutor.executeCall(ModuleRegistryWrapper, "deregisterModule", [targetModule]); + const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); + // deregister + await multisigExecutor.executeCall(ModuleRegistryWrapper, "deregisterModule", [targetModule]); } -main().catch(err => { - throw err; -}); \ No newline at end of file +main().catch((err) => { + throw err; +}); diff --git a/scripts/dsr_demo.js b/scripts/dsr_demo.js deleted file mode 100644 index cde136b91..000000000 --- a/scripts/dsr_demo.js +++ /dev/null @@ -1,108 +0,0 @@ -// Example Usage: -// node scripts/dsr_demo.js [--to-dai 1.0] [--stake 10.0] [--unstake 5.0] [--unstake-all] [--to-sai 0.5] [--network kovan] [--wallet 0x62Da0Aca40650CB06361288FD0248Ad4eaB1d652] - -const DeployManager = require('../utils/deploy-manager.js'); -const MakerV2Manager = require('../build/MakerV2Manager'); -const DSToken = require('../build/DSToken'); - -const { parseEther, formatEther } = require('ethers').utils; - -const defaultWalletAddress = '0x779B2D281238993fD7276F2E13fA82db27AE72d9'; -const defaultNetwork = 'kovan'; - -async function main() { - - // Read Command Line Arguments - let idx = process.argv.indexOf("--network"); - const network = idx > -1 ? process.argv[idx + 1] : defaultNetwork; - - const deployManager = new DeployManager(network); - await deployManager.setup(); - const configurator = deployManager.configurator; - const deployer = deployManager.deployer; - const config = configurator.config; - - idx = process.argv.indexOf("--wallet"); - const walletAddress = idx > -1 ? process.argv[idx + 1] : defaultWalletAddress; - - idx = process.argv.indexOf("--stake"); - const staked = parseEther(idx > -1 ? process.argv[idx + 1] : '0'); - - idx = process.argv.indexOf("--unstake"); - const unstaked = parseEther(idx > -1 ? process.argv[idx + 1] : '0'); - - idx = process.argv.indexOf("--unstake-all"); - const unstakeAll = idx > -1; - - idx = process.argv.indexOf("--to-dai"); - const toDai = parseEther(idx > -1 ? process.argv[idx + 1] : '0'); - - idx = process.argv.indexOf("--to-sai"); - const toSai = parseEther(idx > -1 ? process.argv[idx + 1] : '0'); - - const makerV2 = await deployer.wrapDeployedContract(MakerV2Manager, config.modules.MakerV2Manager); - const saiToken = await deployer.wrapDeployedContract(DSToken, await makerV2.saiToken()); - const daiToken = await deployer.wrapDeployedContract(DSToken, await makerV2.daiToken()); - - async function printBalances() { - let walletSai = await saiToken.balanceOf(walletAddress); - let walletDai = await daiToken.balanceOf(walletAddress); - let invested = (await makerV2.getInvestment(walletAddress, daiToken.contractAddress))._tokenValue; - console.log('Balances:') - console.log('SAI in the wallet:', formatEther(walletSai)); - console.log('DAI in the wallet:', formatEther(walletDai)); - console.log('DAI in the Pot:', formatEther(invested), '\n'); - } - - // Print initial balances - await printBalances() - - // Swap SAI to DAI - if (toDai.gt(0)) { - await makerV2.verboseWaitForTransaction( - await makerV2.swapSaiToDai(walletAddress, toDai) - ); - console.log(`Converted ${formatEther(toDai)} SAI to DAI.`) - await printBalances() - } - - // Send DAI to the Pot - if (staked.gt(0)) { - await makerV2.verboseWaitForTransaction( - await makerV2.joinDsr(walletAddress, staked, { 'gasLimit': 1000000 }) - ); - console.log(`Sent ${formatEther(staked)} DAI to the Pot.`) - await printBalances() - } - - // Remove DAI from the Pot - if (unstaked.gt(0)) { - await makerV2.verboseWaitForTransaction( - await makerV2.exitDsr(walletAddress, unstaked, { 'gasLimit': 1000000 }) - ); - console.log(`Removed ${formatEther(unstaked)} DAI from the Pot.`) - await printBalances() - } - - // Remove DAI from the Pot - if (unstakeAll) { - await makerV2.verboseWaitForTransaction( - await makerV2.exitAllDsr(walletAddress, { 'gasLimit': 1000000 }) - ); - console.log(`Removed all DAI from the Pot.`) - await printBalances() - } - - // Swap DAI to SAI - if (toSai.gt(0)) { - await makerV2.verboseWaitForTransaction( - await makerV2.swapDaiToSai(walletAddress, toSai) - ); - console.log(`Converted ${formatEther(toSai)} DAI to SAI.`) - await printBalances() - } -} - -main().catch(err => { - throw err; -}); diff --git a/scripts/eslint.sh b/scripts/eslint.sh new file mode 100644 index 000000000..9b55a946a --- /dev/null +++ b/scripts/eslint.sh @@ -0,0 +1,8 @@ +for file in $(git diff --cached --name-only | grep -E '\.(js)$') +do + git show ":$file" | node_modules/.bin/eslint --stdin --stdin-filename "$file" # we only want to lint the staged changes, not any un-staged changes + if [ $? -ne 0 ]; then + echo "eslint failed on staged file '$file'." + exit 1 # exit with failure status + fi +done \ No newline at end of file diff --git a/scripts/ethlint.sh b/scripts/ethlint.sh index 27e329e7b..97db2d251 100644 --- a/scripts/ethlint.sh +++ b/scripts/ethlint.sh @@ -1,10 +1,12 @@ #!/bin/bash -for file in $(git diff --cached --name-only | grep -E '\.sol$') +for file in $(git diff --cached --name-only | grep -E '^contracts/.*\.sol$') + do + echo "Checking $file" git show ":$file" | node_modules/.bin/solium --stdin "$file" # we only want to lint the staged changes, not any un-staged changes if [ $? -ne 0 ]; then - echo "Ethlint failed on staged file '$file'." + echo "ethlint failed on staged file '$file'." exit 1 # exit with failure status fi done diff --git a/scripts/execute.sh b/scripts/execute.sh new file mode 100644 index 000000000..0e60fd46a --- /dev/null +++ b/scripts/execute.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# +# Usage: ./execute.sh [file] [network] [...params] +# +# Examples: ./execute.sh deregister.js staging --module "0xabc" + +set -e # stop the script if any subprocess fails + +etherlime compile --runs 999 + +FILE=$1 +shift + +NETWORK=$1 +shift + +AWS_PROFILE=argent-$NETWORK AWS_SDK_LOAD_CONFIG=true node $FILE --network $NETWORK "$@" \ No newline at end of file diff --git a/scripts/provision_lib_artefacts.sh b/scripts/provision_lib_artefacts.sh new file mode 100644 index 000000000..11802082c --- /dev/null +++ b/scripts/provision_lib_artefacts.sh @@ -0,0 +1,29 @@ +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +cd $DIR +cd .. + +while [ ! -d ./.coverage_artifacts ]; do sleep 1; done + +cp build/ENSRegistry.json .coverage_artifacts/ENSRegistry.json +cp build/ENSRegistryWithFallback.json .coverage_artifacts/ENSRegistryWithFallback.json +cp build/ReverseRegistrar.json .coverage_artifacts/ReverseRegistrar.json +cp build/KyberNetworkTest.json .coverage_artifacts/KyberNetworkTest.json +cp build/TestERC20.json .coverage_artifacts/TestERC20.json +cp build/TestERC721.json .coverage_artifacts/TestERC721.json +cp build/TestContract.json .coverage_artifacts/TestContract.json +cp build/Unitroller.json .coverage_artifacts/Unitroller.json +cp build/SimplePriceOracle.json .coverage_artifacts/SimplePriceOracle.json +cp build/PriceOracleProxy.json .coverage_artifacts/PriceOracleProxy.json +cp build/Comptroller.json .coverage_artifacts/Comptroller.json +cp build/WhitePaperInterestRateModel.json .coverage_artifacts/WhitePaperInterestRateModel.json +cp build/CEther.json .coverage_artifacts/CEther.json +cp build/CErc20.json .coverage_artifacts/CErc20.json +cp build/SaiVox.json .coverage_artifacts/SaiVox.json +cp build/SaiTub.json .coverage_artifacts/SaiTub.json +cp build/WETH9.json .coverage_artifacts/WETH9.json +cp build/DSToken.json .coverage_artifacts/DSToken.json +cp build/DSValue.json .coverage_artifacts/DSValue.json +cp build/CryptoKittyTest.json .coverage_artifacts/CryptoKittyTest.json +cp build/TestRegistry.json .coverage_artifacts/TestRegistry.json +cp build/GemJoin.json .coverage_artifacts/GemJoin.json \ No newline at end of file diff --git a/scripts/register.js b/scripts/register.js index 7869f1932..bcae36f88 100644 --- a/scripts/register.js +++ b/scripts/register.js @@ -1,42 +1,40 @@ // Usage: ./execute.sh register.js staging --module 0x9ABb5Db4B23A866ffd649716c6ce2674b2C28C17abc --name GuardianManager -const ModuleRegistry = require('../build/ModuleRegistry'); -const MultiSig = require('../build/MultiSigWallet'); +const ModuleRegistry = require("../build/ModuleRegistry"); +const MultiSig = require("../build/MultiSigWallet"); -const utils = require('../utils/utilities.js'); -const DeployManager = require('../utils/deploy-manager.js'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); +const utils = require("../utils/utilities.js"); +const DeployManager = require("../utils/deploy-manager.js"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); -async function main() { +async function main() { + // Read Command Line Arguments + let idx = process.argv.indexOf("--network"); + const network = process.argv[idx + 1]; - // Read Command Line Arguments - let idx = process.argv.indexOf("--network"); - const network = process.argv[idx + 1]; + idx = process.argv.indexOf("--module"); + const targetModule = process.argv[idx + 1]; - idx = process.argv.indexOf("--module"); - const targetModule = process.argv[idx + 1]; + idx = process.argv.indexOf("--name"); + const targetName = process.argv[idx + 1]; - idx = process.argv.indexOf("--name"); - const targetName = process.argv[idx + 1]; - - // Setup deployer - const manager = new DeployManager(network); - await manager.setup(); - const configurator = manager.configurator; - const deployer = manager.deployer; - const deploymentWallet = deployer.signer; - const config = configurator.config; + // Setup deployer + const manager = new DeployManager(network); + await manager.setup(); + const { configurator } = manager; + const { deployer } = manager; + const deploymentWallet = deployer.signer; + const { config } = configurator; - const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); - const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); - const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); - - // deregister - await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerModule", [targetModule, utils.asciiToBytes32(targetName)]); + const ModuleRegistryWrapper = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); + // deregister + await multisigExecutor.executeCall(ModuleRegistryWrapper, "registerModule", [targetModule, utils.asciiToBytes32(targetName)]); } -main().catch(err => { - throw err; -}); \ No newline at end of file +main().catch((err) => { + throw err; +}); diff --git a/scripts/setThreshold.js b/scripts/setThreshold.js index 96f3fa3ac..a608c68d9 100644 --- a/scripts/setThreshold.js +++ b/scripts/setThreshold.js @@ -1,34 +1,32 @@ -const MultiSig = require('../build/MultiSigWallet'); +const MultiSig = require("../build/MultiSigWallet"); -const DeployManager = require('../utils/deploy-manager.js'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); +const DeployManager = require("../utils/deploy-manager.js"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); -async function main() { +async function main() { + // Read Command Line Arguments + let idx = process.argv.indexOf("--network"); + const network = process.argv[idx + 1]; - // Read Command Line Arguments - let idx = process.argv.indexOf("--network"); - const network = process.argv[idx + 1]; + idx = process.argv.indexOf("--threshold"); + const threshold = process.argv[idx + 1]; - idx = process.argv.indexOf("--threshold"); - const threshold = process.argv[idx + 1]; - - // Setup deployer - const manager = new DeployManager(network); - await manager.setup(); - const configurator = manager.configurator; - const deployer = manager.deployer; - const deploymentWallet = deployer.signer; - const config = configurator.config; + // Setup deployer + const manager = new DeployManager(network); + await manager.setup(); + const { configurator } = manager; + const { deployer } = manager; + const deploymentWallet = deployer.signer; + const { config } = configurator; - const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); - const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); - - // deregister - await multisigExecutor.executeCall(MultiSigWrapper, "changeThreshold", [threshold]); + const MultiSigWrapper = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(MultiSigWrapper, deploymentWallet, config.multisig.autosign); + // deregister + await multisigExecutor.executeCall(MultiSigWrapper, "changeThreshold", [threshold]); } -main().catch(err => { - throw err; -}); \ No newline at end of file +main().catch((err) => { + throw err; +}); diff --git a/scripts/updateBaseWallet.js b/scripts/updateBaseWallet.js index b0bef1122..95a3b001e 100644 --- a/scripts/updateBaseWallet.js +++ b/scripts/updateBaseWallet.js @@ -1,50 +1,49 @@ // Usage: ./execute.sh updateBaseWallet.js staging -const BaseWallet = require('../build/BaseWallet'); -const WalletFactory = require('../build/WalletFactory'); -const MultiSigWallet = require('../build/MultiSigWallet'); -const MultisigExecutor = require('../utils/multisigexecutor.js'); -const DeployManager = require('../utils/deploy-manager.js'); +const BaseWallet = require("../build/BaseWallet"); +const WalletFactory = require("../build/WalletFactory"); +const MultiSigWallet = require("../build/MultiSigWallet"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); +const DeployManager = require("../utils/deploy-manager.js"); -const defaultNetwork = 'test'; +const defaultNetwork = "test"; async function main() { - - // Read Command Line Arguments - let idx = process.argv.indexOf("--network"); - const network = idx > -1 ? process.argv[idx + 1] : defaultNetwork; - - const deployManager = new DeployManager(network); - await deployManager.setup(); - const configurator = deployManager.configurator; - const deployer = deployManager.deployer; - const manager = deployer.signer; - const config = configurator.config; - console.log('Config:', config); - - // Deploy new BaseWallet - console.log('Deploying new BaseWallet...') - const BaseWalletWrapper = await deployer.deploy(BaseWallet); - - // Setup WalletFactory with new BaseWallet - console.log('Setting up WalletFactory with new BaseWallet...') - const walletFactoryWrapper = await deployer.wrapDeployedContract(WalletFactory, config.contracts.WalletFactory); - const multisigWrapper = await deployer.wrapDeployedContract(MultiSigWallet, config.contracts.MultiSigWallet); - const multisigExecutor = new MultisigExecutor(multisigWrapper, manager, config.multisig.autosign); - await multisigExecutor.executeCall( - walletFactoryWrapper, - "changeWalletImplementation", - [BaseWalletWrapper.contractAddress] - ); - - console.log('Saving new config...') - configurator.updateInfrastructureAddresses({ BaseWallet: BaseWalletWrapper.contractAddress }); - await configurator.save(); - await deployManager.abiUploader.upload(BaseWalletWrapper, "contracts") - - console.log('BaseWallet Update DONE.') + // Read Command Line Arguments + const idx = process.argv.indexOf("--network"); + const network = idx > -1 ? process.argv[idx + 1] : defaultNetwork; + + const deployManager = new DeployManager(network); + await deployManager.setup(); + const { configurator } = deployManager; + const { deployer } = deployManager; + const manager = deployer.signer; + const { config } = configurator; + console.log("Config:", config); + + // Deploy new BaseWallet + console.log("Deploying new BaseWallet..."); + const BaseWalletWrapper = await deployer.deploy(BaseWallet); + + // Setup WalletFactory with new BaseWallet + console.log("Setting up WalletFactory with new BaseWallet..."); + const walletFactoryWrapper = await deployer.wrapDeployedContract(WalletFactory, config.contracts.WalletFactory); + const multisigWrapper = await deployer.wrapDeployedContract(MultiSigWallet, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(multisigWrapper, manager, config.multisig.autosign); + await multisigExecutor.executeCall( + walletFactoryWrapper, + "changeWalletImplementation", + [BaseWalletWrapper.contractAddress], + ); + + console.log("Saving new config..."); + configurator.updateInfrastructureAddresses({ BaseWallet: BaseWalletWrapper.contractAddress }); + await configurator.save(); + await deployManager.abiUploader.upload(BaseWalletWrapper, "contracts"); + + console.log("BaseWallet Update DONE."); } -main().catch(err => { - throw err; +main().catch((err) => { + throw err; }); diff --git a/specifications/specifications.pdf b/specifications/specifications.pdf index f522a00d7..bd9b854d8 100644 Binary files a/specifications/specifications.pdf and b/specifications/specifications.pdf differ diff --git a/specifications/specifications.tex b/specifications/specifications.tex index c9c7a5549..76fb26237 100644 --- a/specifications/specifications.tex +++ b/specifications/specifications.tex @@ -5,8 +5,8 @@ \graphicspath{ {./images/} } -\title{Argent Documentation} -\author{Argent Team} +\title{Argent Smart Wallet Specification} +\author{v1.6} \date{\today} @@ -29,7 +29,7 @@ \subsection{Guardians} The wallet security model is based on the ability to add Guardians. A Guardian is an account (EOA or smart contract) that has been given permission by the wallet's owner to execute certain specific operations on their wallet. In particular guardians can lock, unlock, and trigger a recovery procedure on the wallet as well as approve the execution of a large transfer to an unknown account. -We do not impose restrictions on who or what Guardians are. They can be can be a friend's Argent wallet, a friend's EOA, a hardware wallet, or even a paid third-party service. +We do not impose restrictions on who or what Guardians are. They can be a friend's Argent wallet, a friend's EOA, a hardware wallet, or even a paid third-party service. Adding a Guardian is an action triggered by the wallet owner. While the first Guardian is added immediately, all subsequent additions must be confirmed after 24 hours and no longer then 36 hours after the addition was requested. This confirmation windows ensures that a pending addition will be canceled (expire) should the wallet be locked or recovered. @@ -45,11 +45,11 @@ \subsection{Locking} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Recovery} -Wallet recovery is a process requested by a user who asserts ownership of a wallet. A successful recovery sets a new account as the wallet owner. This process should be validated by the wallet's guardians to be executed. Once a recovery has been executed it may be finalised after 36 hours, unless it has been cancelled. +Wallet recovery is a process requested by a user who asserts ownership of a wallet while not being in possession of the owner key. A successful recovery sets a new account as the wallet owner. This process should be validated by the wallet's guardians to be executed. Once a recovery has been executed it may be finalised after 36 hours, unless it has been cancelled. -The number of signatures (owner and/or guardians) needed to execute a recovery is given by +The number of signatures needed to execute a recovery is given by \begin{equation*} - \left\lceil {\frac{n+1}{2}} \right\rceil + \left\lceil {\frac{n}{2}} \right\rceil \end{equation*} where $n$ is the total number of guardians and $\lceil\rceil$ is the ceiling function. @@ -61,6 +61,15 @@ \subsection{Recovery} Once a recovery is started the wallet is automatically locked. The wallet can only be unlock by finalising or cancelling the ongoing procedure, i.e. Guardians cannot unlock during a recovery. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Ownership Transfer} + +In addition to recovery it is possible for a user to transfer ownership of his wallet to a new device while still being in possession of the actual phone. This transfer is immediate to avoid service interruption but must be approved by guardians. The number of required signatures is given by +\begin{equation*} + 1+\left\lceil {\frac{n}{2}} \right\rceil +\end{equation*} +where the first signature is the owner and $n$ is the total number of guardians. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Daily Transfer Limit} \label{sec:dailylimit} @@ -70,7 +79,7 @@ \subsection{Daily Transfer Limit} Transfers to whitelisted addresses (see Section~\ref{sec:whitelist}) and transfers approved by guardians (see Section~\ref{sec:approved-transfer}) do not contribute to the daily limit. -The daily limit is cross-token (ETH + ERC20) and we're using an on-chain exchange (i.e. Kyber Network) to get the conversion rates for ERC20 tokens. +The daily limit is cross-token (ETH + ERC20) and we're using an on-chain oracle to get the conversion rates for ERC20 tokens. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Whitelist} @@ -84,50 +93,49 @@ \subsection{Whitelist} \subsection{Approved Transfer} \label{sec:approved-transfer} -Pending transfers exceeding the daily limit can be executed immediately by the owner, provided that he obtains signed approval from a number of guardians given by +Transfers exceeding the daily limit can be executed immediately by the owner, provided that he obtains approval from their guardians. The number of required signatures for an approved transfer is given by \begin{equation*} - \left\lceil {\frac{n}{2}} \right\rceil + 1+\left\lceil {\frac{n}{2}} \right\rceil \end{equation*} +where the first signature is the owner and $n$ is the total number of guardians. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{ERC20 Exchange} -The owner will be able to exchange ETH against ERC20 tokens. We're using an on-chain exchange (i.e. Kyber Network) to allow this. we (intend to) charge a fee on each transaction. +The owner is able to exchange ETH against ERC20 tokens through the KyberNetwork on-chain exchange and a fee of 0,15\% is charged on every transaction. The fee is paid in ETH. + +Swapping tokens is not constrained by the daily limit since no value is leaving the wallet. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{ENS} -The Wallet will be associated to an ENS. This association should be forward and backward meaning that it should be possible to obtain the Wallet address from the ENS and the ENS from the Wallet address. +The Wallet is associated to an ENS. This association is forward and backward meaning that it is possible to obtain the Wallet address from the ENS and the ENS from the Wallet address. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Upgradability} -The wallet must be upgradable to fix potential bugs and add new features. The choice of whether to upgrade or not a wallet will be left to the wallet owner. In particular, it should not be possible for a centralised party such as Argent to force a wallet upgrade and change an implementation that is assumed to be immutable by the owner. +The wallet is upgradable to add new features and fix potential bugs. The choice of whether to upgrade or not a wallet is left to the wallet owner. In particular, it is not possible for a centralised party such as Argent to force a wallet upgrade and change an implementation that is assumed to be immutable by the owner. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{ETH-less Account} \label{sec:eth-less-account} -In order to execute a wallet operation, owner and guardians should be able to use their account's private keys to sign a message showing intent of execution, and allow a third party relayer to execute them. Therefore their account don't pay transaction fees and don't need ethers (ETH-less account). In that case the wallet contract should be able to refund the gas (partially or totally) required to execute the transaction to the third party relayer. This pattern is similar to what is described in EIP 1077\footnote{https://eips.ethereum.org/EIPS/eip-1077}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{Authorized Third-Party Accounts} - -Wallet owners can authorize (and revoke at any time) specific third-party accounts to transfer ETH or call external contracts (optionally attaching ether to these calls) from their wallets. The wallet owner can specify a daily limit in ETH that applies across all third-party accounts. This functionality allows third-party Dapps to perform the aforementioned wallet operations without every time requiring a confirmation from the user. Authorizing (and revoking) a third-party account is always immediate. +Owner and guardians can execute wallet operations without the need to pay transaction fees and own ETH, i.e. they are ETH-less account. This is achieved by enabling accounts to sign a message showing intent of execution, and allowing a third party relayer to execute the transaction and pay the fee on their behalf. The party signing the transaction can specify if the wallet should refund the gas (partially or totally) required to execute the transaction to the third party relayer. This pattern, now called meta-transactions, is described in EIP 1077\footnote{https://eips.ethereum.org/EIPS/eip-1077} and implemented in the abstract \emph{Relayer Module} (see Section~\ref{sec:meta-transactions}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Summary of Guardian Operations} \begin{table}[ht] - \begin{tabular}{ |c|m{6em}|m{8em}|m{8em}|m{8em}| } + \begin{tabular}{ |c|m{6em}|m{6em}|m{6em}|m{6em}|m{6em}| } \hline - & Lock/Unlock & Execute Recovery & Cancel Recovery & Approve Transfer \\ + & Lock/Unlock & Execute \newline Recovery & Cancel \newline Recovery & Transfer Ownership & Approve Transfer \\ \hline \hline - & Guardians & Owner OR Guardians & Owner OR Guardians & Owner AND Guardians \\ + & Guardians & Guardians & Owner OR Guardians & Owner AND Guardians & Owner AND Guardians \\ \hline - 1 & 1 & 1 & 1 & 2 \\ - 2 & 1 & 2 & 2 & 2 \\ - 3 & 1 & 2 & 2 & 3 \\ - 4 & 1 & 3 & 3 & 3 \\ - 5 & 1 & 3 & 3 & 4 \\ + 1 & 1 & 1 & 1 & 2 & 2 \\ + 2 & 1 & 1 & 2 & 2 & 2 \\ + 3 & 1 & 2 & 2 & 3 & 3 \\ + 4 & 1 & 2 & 3 & 3 & 3 \\ + 5 & 1 & 3 & 3 & 4 & 4 \\ \hline \end{tabular} @@ -153,13 +161,16 @@ \subsection{Smart Contracts architecture} % \caption{Smart Contracts architecture: create/assign wallet and proxy wallet delegation flows} % \end{figure} -Our architecture is made up of multiple contracts (see Figure~\ref{fig:sc-arch-1}). A first group of contracts form the infrastructure required to deploy or update user wallets. These infrastructure contracts are meant to be deployed only once (in theory): +Our architecture is made up of multiple contracts (see Figure~\ref{fig:sc-arch-1}). A first group of contracts form the infrastructure required to deploy or update user wallets. These infrastructure contracts are meant to be deployed only once: \begin{itemize} \item \textbf{Multisig Wallet:} Custom-made multi-signatures wallet which is the owner of most of other infrastructure contracts. All calls on those contracts will therefore need to be approved by multiple persons. - \item \textbf{Wallet Factory:} Wallet factory contract used to create proxy wallets (in batches) and assign them to users. + \item \textbf{Wallet Factory:} Wallet factory contract used to create proxy wallets using CREATE or CREATE2 and assign them to users. \item \textbf{ENS Manager:} The ENS Manager is responsible for registering ENS subdomains (e.g. mike.argent.xyz) and assigning them to wallets. \item \textbf{ENS Resolver:} The ENS Resolver keeps links between ENS subdomains and wallet addresses and allows to resolve them in both directions. \item \textbf{Module Registry:} The Module Registry maintains a list of the registered \emph{Module} contracts that can be used with user wallets. It also maintains a list of registered \emph{Upgrader} contracts that a user can use to migrate the modules used with their wallet (see Section~\ref{sec:upgradability}). + \item \textbf{Compound Registry:} Registry maintaining a mapping between underlying assets (ETH, DAI, BAT, etc) and their corresponding Compound Token (cETH, cDAI, cBAT, etc). + \item \textbf{Maker Registry:} Registry maintaining a mapping between token collaterals (ETH, BAT, USDC, WBTC) and their corresponding Maker Join adapters. + \item \textbf{Token Price Provider:} On-chain price oracle for ERC20 tokens. It is used by wallets to estimate the value in ETH of ERC-20 transfers and update the daily limit. \end{itemize} A second group of contracts implements the functionalities of the wallet: @@ -174,14 +185,21 @@ \subsection{Smart Contracts architecture} \subsection{Upgradability} \label{sec:upgradability} -Argent maintains an evolving set of registered \emph{Module} contracts as well as a list of registered \emph{Upgrader} contracts. \emph{Upgrader} contracts define a migration from a particular set of old modules to disable to a set of new registered modules to enable. A user can perform an upgrade of their modules using one of the registered \emph{Upgrader} contracts. +Argent maintains an evolving set of registered \emph{Module} contracts. A subset of these \emph{Module} contracts are \emph{SimpleUpgrader} modules that define a migration path from a particular set of old modules to a new set of registered modules, i.e. it contains the list of modules to disable and the list of modules to enable to go from the old set to the new set. A user can perform an upgrade of their modules using one of the registered \emph{SimpleUpgrader} contracts. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Storage} \label{sec:storage} -In general, each module stores the entire state pertaining to all the wallets that use that module. For example, the \emph{TokenTransfer} module stores how much of their daily allowance has been used by each wallet. Some modules such as \emph{TokenTransfer} make use of an additional storage contract (e.g. \emph{TransferStorage}). This is the case when their storage needs to be accessed by other modules and/or to simplify the upgradability of the module. +In general, each module stores the entire state pertaining to all the wallets that use that module. For example, the \emph{TransferManager} module stores how much of their daily allowance has been used by each wallet. Some modules such as \emph{TransferManager} make use of an additional storage contract (e.g. \emph{TransferStorage}). This is the case when their storage needs to be accessed by other modules and/or to simplify the upgradability of that module in the future. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Meta-Transactions} +\label{sec:meta-transactions} +Meta-Transactions are implemented in the abstract \emph{RelayerModule} from which all modules inherit. It implements a permissionless method \emph{execute()} that is meant to be called by a relayer account. The relayer must pass to the \emph{execute()} function an intention and the signature(s) of this intention by the originator(s) of that intention. As described in Section~\ref{sec:eth-less-account}, this pattern allows ether-less accounts to perform operations on the wallet without the need to directly call the corresponding module methods to do so. + +The RelayerModule delegates the implementation of the code that verifies the intention and the signature(s) to the subclass modules that implement it. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Modules} @@ -196,28 +214,32 @@ \subsubsection{LockManager module} \subsubsection{RecoveryManager module} -This module is used by guardians to perform a recovery of the wallet, i.e. change the owner to a new owner. The recovery is triggered by a majority of guardians and needs to be manually finalized after a security period of 24h. Upon finalization, the RecoveryManager module calls the \emph{setOwner()} method on the user wallet. +This module is used to change the owner of a wallet to a new owner. It can be executed immediately if the owner is still in possession of the current owner account (transfer ownership), or with a delay if the owner account is lost or stolen (recovery). Both operations need to be approved by guardians. + +\subsubsection{TransferManager module} -\subsubsection{TokenTransfer module} +This module lets users perform transfers of ETH and ERC20 tokens, approve ERC20 tokens for third-party contracts, or call third-party contracts directly. Calling contracts can be coupled with a value transfer by either providing an ETH amount or approving a spender to widthraw an ERC20 amount as part of the same transaction. -This module lets users perform transfers of ETH and ERC20 tokens, either to whitelisted addresses without any limit, or to non-whitelisted addresses within a certain daily allowance. If the daily limit is reached for a transfer, the transfer is set to a pending state and will only be executable by the user after 24h. +All transfers of value can be done either to whitelisted addresses without any limit, or to non-whitelisted addresses within a certain daily allowance. If the daily limit is reached for a given period, the transfer is set to a pending state and will only be executed after 24h. \subsubsection{ApprovedTransfer module} -This module lets users perform instant transfers of ETH and ERC20 tokens to non-whitelisted addresses with the signed approval of a majority of guardians. +This module lets users perform instant transfers of ETH and ERC20 tokens, approval of ERC20 tokens, or contract calls to non-whitelisted addresses with the signed approval of a majority of guardians. \subsubsection{TokenExchanger module} This module lets users exchange ETH or ERC20 tokens for ETH or other ERC20 tokens using Kyber Network. -\subsubsection{DappManager module} +\subsubsection{CompoundManager module} -This module lets users authorize third-party Dapps to call third-party contracts or transfer ETH on behalf of the user within a fixed spending limit. The authorized Dapps interact with the same module to execute the operations they have been authorized to perform. +This module lets users lend and borrow tokens with the Compound protocol. -\subsubsection{RelayerModule} +\subsubsection{NftTransfer module} -This is an abstract contract from which all modules inherit. It implements a permissionless method \emph{execute()} that is meant to be called by a relayer account. The relayer must pass to the \emph{execute()} function an intention and the signature(s) of this intention by the originator(s) of that intention. As described in Section~\ref{sec:eth-less-account}, this pattern allows ether-less accounts to perform operations on the wallet without the need to directly call the corresponding module methods to do so. +This module lets users transfer collectibles that comply to the ERC-721 interface. -The RelayerModule delegates the implementation of the code that verifies the intention and the signature(s) to the subclass modules that implement it. +\subsubsection{MakerManagerV2 module} + +This module lets users invest their DAI in the DSR (Dai Savings Rate) or borrow DAI with the Maker protocol. \end{document} \ No newline at end of file diff --git a/test/approvedTransfer.js b/test/approvedTransfer.js index 8eeaadb6a..d59623664 100644 --- a/test/approvedTransfer.js +++ b/test/approvedTransfer.js @@ -1,309 +1,335 @@ +/* global accounts */ +const ethers = require("ethers"); + const Wallet = require("../build/BaseWallet"); const Registry = require("../build/ModuleRegistry"); const GuardianStorage = require("../build/GuardianStorage"); const GuardianManager = require("../build/GuardianManager"); -const TransferModule = require("../build/ApprovedTransfer"); +const ApprovedTransfer = require("../build/ApprovedTransfer"); const KyberNetwork = require("../build/KyberNetworkTest"); const TokenPriceProvider = require("../build/TokenPriceProvider"); const ERC20 = require("../build/TestERC20"); -const TestContract = require('../build/TestContract'); +const TestContract = require("../build/TestContract"); const TestManager = require("../utils/test-manager"); -const { sortWalletByAddress, parseRelayReceipt } = require("../utils/utilities.js"); +const { sortWalletByAddress, parseRelayReceipt, ETH_TOKEN } = require("../utils/utilities.js"); -const ETH_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' const DECIMALS = 12; // number of decimal for TOKN contract const KYBER_RATE = 51 * 10 ** 13; // 1 TOKN = 0.00051 ETH const ZERO_BYTES32 = ethers.constants.HashZero; -describe("Test Approved Transfer", function () { - this.timeout(10000); - - const manager = new TestManager(); - - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - let nonowner = accounts[2].signer; - let guardian1 = accounts[3].signer; - let guardian2 = accounts[4].signer; - let guardian3 = accounts[5].signer; - let recipient = accounts[6].signer; - - let wallet, guardianManager, transferModule, priceProvider, kyber, erc20; - - before(async () => { - deployer = manager.newDeployer(); - const registry = await deployer.deploy(Registry); - const guardianStorage = await deployer.deploy(GuardianStorage); - kyber = await deployer.deploy(KyberNetwork); - priceProvider = await deployer.deploy(TokenPriceProvider, {}, kyber.contractAddress); - await priceProvider.addManager(infrastructure.address); - guardianManager = await deployer.deploy(GuardianManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24, 12); - transferModule = await deployer.deploy(TransferModule, {}, registry.contractAddress, guardianStorage.contractAddress); - }); +const WRONG_SIGNATURE_NUMBER_REVERT_MSG = "RM: Wrong number of signatures"; +const INVALID_SIGNATURES_REVERT_MSG = "RM: Invalid signatures"; + +describe("Approved Transfer", function () { + this.timeout(10000); + + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + const guardian1 = accounts[2].signer; + const guardian2 = accounts[3].signer; + const guardian3 = accounts[4].signer; + const recipient = accounts[5].signer; + + let deployer; + let wallet; + let guardianManager; + let approvedTransfer; + let priceProvider; + let kyber; + let erc20; + const amountToTransfer = 10000; + + before(async () => { + deployer = manager.newDeployer(); + const registry = await deployer.deploy(Registry); + const guardianStorage = await deployer.deploy(GuardianStorage); + kyber = await deployer.deploy(KyberNetwork); + priceProvider = await deployer.deploy(TokenPriceProvider, {}, kyber.contractAddress); + await priceProvider.addManager(infrastructure.address); + guardianManager = await deployer.deploy(GuardianManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24, 12); + approvedTransfer = await deployer.deploy(ApprovedTransfer, {}, registry.contractAddress, guardianStorage.contractAddress); + }); + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [approvedTransfer.contractAddress, guardianManager.contractAddress]); + erc20 = await deployer.deploy(ERC20, {}, [infrastructure.address, wallet.contractAddress], 10000000, DECIMALS); // TOKN contract with 10M tokens (5M TOKN for wallet and 5M TOKN for account[0]) + await kyber.addToken(erc20.contractAddress, KYBER_RATE, DECIMALS); + await priceProvider.syncPrice(erc20.contractAddress); + await infrastructure.sendTransaction({ to: wallet.contractAddress, value: 50000000 }); + }); - beforeEach(async () => { - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [transferModule.contractAddress, guardianManager.contractAddress]); - erc20 = await deployer.deploy(ERC20, {}, [infrastructure.address, wallet.contractAddress], 10000000, DECIMALS); // TOKN contract with 10M tokens (5M TOKN for wallet and 5M TOKN for account[0]) - await kyber.addToken(erc20.contractAddress, KYBER_RATE, DECIMALS); - await priceProvider.syncPrice(erc20.contractAddress); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: 50000000 }); + async function addGuardians(guardians) { + // guardians can be Wallet or ContractWrapper objects + const guardianAddresses = guardians.map((guardian) => { + if (guardian.address) return guardian.address; + return guardian.contractAddress; }); - async function addGuardians(guardians) { - // guardians can be Wallet or ContractWrapper objects - let guardianAddresses = guardians.map(guardian => { - if (guardian.address) - return guardian.address; - return guardian.contractAddress; - }); + for (const address of guardianAddresses) { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, address, { gasLimit: 500000 }); + } - for (const address of guardianAddresses) { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, address, { gasLimit: 500000 }); - } + await manager.increaseTime(30); + for (let i = 1; i < guardianAddresses.length; i += 1) { + await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardianAddresses[i]); + } + const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); + assert.equal(count, guardians.length, `${guardians.length} guardians should be added`); + } - await manager.increaseTime(30); - for (let i = 1; i < guardianAddresses.length; i++) { - await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardianAddresses[i]); - } - const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, guardians.length, `${guardians.length} guardians should be added`); + async function createSmartContractGuardians(guardians) { + const wallets = []; + for (const g of guardians) { + const guardianWallet = await deployer.deploy(Wallet); + await guardianWallet.init(g.address, [guardianManager.contractAddress]); + wallets.push(guardianWallet); } + return wallets; + } - async function createSmartContractGuardians(guardians) { - const wallets = [] - for (g of guardians) { - const wallet = await deployer.deploy(Wallet); - await wallet.init(g.address, [guardianManager.contractAddress]); - wallets.push(wallet) - } - return wallets + describe("Transfer", () => { + async function transferToken(_token, _signers) { + const to = recipient.address; + const before = _token === ETH_TOKEN ? await deployer.provider.getBalance(to) : await erc20.balanceOf(to); + await manager.relay(approvedTransfer, "transferToken", + [wallet.contractAddress, _token, to, amountToTransfer, ZERO_BYTES32], wallet, _signers); + const after = _token === ETH_TOKEN ? await deployer.provider.getBalance(to) : await erc20.balanceOf(to); + assert.equal(after.sub(before).toNumber(), amountToTransfer, "should have transfered the amount"); } - describe("Transfer approved by EOA guardians", () => { - it('should transfer ETH with 1 confirmations for 1 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians([guardian1]) - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 1, '1 guardians should be active'); - let before = await deployer.provider.getBalance(recipient.address); - // should succeed with one confirmation - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - let after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + async function expectFailingTransferToken(_token, _signers, _reason) { + await assert.revertWith( + manager.relay( + approvedTransfer, + "transferToken", + [wallet.contractAddress, _token, recipient.address, amountToTransfer, ZERO_BYTES32], + wallet, + _signers, + ), _reason, + ); + } + + describe("Approved by EOA guardians", () => { + describe("1 guardian", () => { + beforeEach(async () => { + await addGuardians([guardian1]); }); - it('should transfer ETH with 1 confirmations for 2 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians([guardian1, guardian2]) - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 2, '2 guardians should be active'); - let before = await deployer.provider.getBalance(recipient.address); - // should succeed with one confirmation - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - let after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + it("should transfer ETH with 1 confirmation for 1 guardian", async () => { + await transferToken(ETH_TOKEN, [owner, guardian1]); }); - it('should only transfer ETH with 2 confirmations for 3 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians([guardian1, guardian2, guardian3]) - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 3, '3 guardians should be active'); - let before = await deployer.provider.getBalance(recipient.address); - // should fail with one confirmation - let txReceipt = await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "transfer should fail with 1 guardian confirmation"); - // should succeed with 2 confirmations - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); - let after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + it("should fail to transfer ETH when signer is not a guardian", async () => { + await expectFailingTransferToken(ETH_TOKEN, [owner, guardian2], INVALID_SIGNATURES_REVERT_MSG); }); - it('should fail to transfer ETH when signer is not a guardians', async () => { - let amountToTransfer = 10000; - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 0, '0 guardians should be active'); - // should fail - let txReceipt = await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "transfer should fail when signer is not a guardian"); + it("should transfer ERC20 with 1 confirmation for 1 guardian", async () => { + await transferToken(erc20.contractAddress, [owner, guardian1]); }); - it('should transfer ERC20 with 1 confirmations for 1 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians([guardian1]) - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 1, '1 guardians should be active'); - let before = await erc20.balanceOf(recipient.address); - // should succeed with one confirmation - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, erc20.contractAddress, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - let after = await erc20.balanceOf(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ERC20 amount'); + }); + describe("2 guardians", () => { + beforeEach(async () => { + await addGuardians([guardian1, guardian2]); + }); + it("should transfer ETH with 1 confirmation for 2 guardians", async () => { + await transferToken(ETH_TOKEN, [owner, guardian1]); + }); + }); + describe("3 guardians", () => { + beforeEach(async () => { + await addGuardians([guardian1, guardian2, guardian3]); }); - it('should only transfer ERC20 with 2 confirmations for 3 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians([guardian1, guardian2, guardian3]) - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 3, '3 guardians should be active'); - let before = await erc20.balanceOf(recipient.address); - // should fail with one confirmation - let txReceipt = await manager.relay(transferModule, "transferToken", [wallet.contractAddress, erc20.contractAddress, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "transfer with 1 guardian signature should fail"); - // should succeed with 2 confirmations - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, erc20.contractAddress, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); - let after = await erc20.balanceOf(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ERC20 amount'); + it("should not transfer ETH with 1 confirmation for 3 guardians", async () => { + await expectFailingTransferToken(ETH_TOKEN, [owner, guardian1], WRONG_SIGNATURE_NUMBER_REVERT_MSG); }); + it("should transfer ETH with 2 confirmations for 3 guardians", async () => { + await transferToken(ETH_TOKEN, [owner, ...sortWalletByAddress([guardian1, guardian2])]); + }); + it("should fail to transfer ERC20 with 1 confirmation for 3 guardians", async () => { + await expectFailingTransferToken(erc20.contractAddress, [owner, guardian1], WRONG_SIGNATURE_NUMBER_REVERT_MSG); + }); + it("should transfer ERC20 with 2 confirmations for 3 guardians", async () => { + await transferToken(erc20.contractAddress, [owner, ...sortWalletByAddress([guardian1, guardian2])]); + }); + }); }); - describe("Transfer approved by smart-contract guardians", () => { - it('should transfer ETH with 1 confirmations for 1 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians(await createSmartContractGuardians([guardian1])); - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 1, '1 guardians should be active'); - let before = await deployer.provider.getBalance(recipient.address); - // should succeed with one confirmation - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - let after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + describe("Approved by smart-contract guardians", () => { + describe("1 guardian", () => { + beforeEach(async () => { + await addGuardians(await createSmartContractGuardians([guardian1])); + }); + it("should transfer ETH with 1 confirmation for 1 guardian", async () => { + await transferToken(ETH_TOKEN, [owner, guardian1]); + }); + it("should transfer ERC20 with 1 confirmation for 1 guardian", async () => { + await transferToken(erc20.contractAddress, [owner, guardian1]); }); - it('should transfer ETH with 1 confirmations for 2 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians(await createSmartContractGuardians([guardian1, guardian2])); - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 2, '2 guardians should be active'); - let before = await deployer.provider.getBalance(recipient.address); - // should succeed with one confirmation - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - let after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + }); + describe("2 guardians", () => { + beforeEach(async () => { + await addGuardians(await createSmartContractGuardians([guardian1, guardian2])); + }); + it("should transfer ETH with 1 confirmation for 2 guardians", async () => { + await transferToken(ETH_TOKEN, [owner, guardian1]); + }); + }); + describe("3 guardians", () => { + beforeEach(async () => { + await addGuardians(await createSmartContractGuardians([guardian1, guardian2, guardian3])); }); - it('should only transfer ETH with 2 confirmations for 3 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians(await createSmartContractGuardians([guardian1, guardian2, guardian3])); - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 3, '3 guardians should be active'); - let before = await deployer.provider.getBalance(recipient.address); - // should fail with one confirmation - let txReceipt = await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "transfer with 1 guardian signature should fail"); - // should succeed with 2 confirmations - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); - let after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + it("should not transfer ETH with 1 confirmation for 3 guardians", async () => { + await expectFailingTransferToken(ETH_TOKEN, [owner, guardian1], WRONG_SIGNATURE_NUMBER_REVERT_MSG); }); - it('should transfer ERC20 with 1 confirmations for 1 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians(await createSmartContractGuardians([guardian1])); - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 1, '1 guardians should be active'); - let before = await erc20.balanceOf(recipient.address); - // should succeed with one confirmation - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, erc20.contractAddress, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - let after = await erc20.balanceOf(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + it("should transfer ETH with 2 confirmations for 3 guardians", async () => { + await transferToken(ETH_TOKEN, [owner, ...sortWalletByAddress([guardian1, guardian2])]); }); - it('should only transfer ERC20 with 2 confirmations for 3 guardians', async () => { - let amountToTransfer = 10000; - await addGuardians(await createSmartContractGuardians([guardian1, guardian2, guardian3])); - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 3, '3 guardians should be active'); - let before = await erc20.balanceOf(recipient.address); - // should fail with one confirmation - let txReceipt = await manager.relay(transferModule, "transferToken", [wallet.contractAddress, erc20.contractAddress, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, guardian1]); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "transfer with 1 guardian signature should throw"); - // should succeed with 2 confirmations - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, erc20.contractAddress, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); - let after = await erc20.balanceOf(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ERC20 amount'); + it("should not transfer ERC20 with 1 confirmations for 3 guardians", async () => { + await expectFailingTransferToken(erc20.contractAddress, [owner, guardian1], WRONG_SIGNATURE_NUMBER_REVERT_MSG); }); + it("should transfer ERC20 with 2 confirmations for 3 guardians", async () => { + await transferToken(erc20.contractAddress, [owner, ...sortWalletByAddress([guardian1, guardian2])]); + }); + }); + }); + + describe("Approved by EOA and smart-contract guardians", () => { + it("should transfer ETH with 1 EOA guardian and 2 smart-contract guardians", async () => { + await addGuardians([guardian1, ...(await createSmartContractGuardians([guardian2, guardian3]))]); + await transferToken(ETH_TOKEN, [owner, ...sortWalletByAddress([guardian1, guardian2])]); + await transferToken(ETH_TOKEN, [owner, ...sortWalletByAddress([guardian1, guardian3])]); + await transferToken(ETH_TOKEN, [owner, ...sortWalletByAddress([guardian2, guardian3])]); + }); + it("should transfer ETH with 2 EOA guardians and 1 smart-contract guardian", async () => { + await addGuardians([guardian1, guardian2, ...await createSmartContractGuardians([guardian3])]); + await transferToken(ETH_TOKEN, [owner, ...sortWalletByAddress([guardian1, guardian2])]); + await transferToken(ETH_TOKEN, [owner, ...sortWalletByAddress([guardian1, guardian3])]); + await transferToken(ETH_TOKEN, [owner, ...sortWalletByAddress([guardian2, guardian3])]); + }); + }); + }); + + describe("Contract call", () => { + describe("Approved by 1 EOA and 2 smart-contract guardians", () => { + let contract; + + beforeEach(async () => { + contract = await deployer.deploy(TestContract); + assert.equal(await contract.state(), 0, "initial contract state should be 0"); + await addGuardians([guardian1, ...(await createSmartContractGuardians([guardian2, guardian3]))]); + }); + + async function callContract(_signers) { + const before = await deployer.provider.getBalance(contract.contractAddress); + const newState = parseInt((await contract.state()).toString(), 10) + 1; + const dataToTransfer = contract.contract.interface.functions.setState.encode([newState]); + await manager.relay(approvedTransfer, "callContract", + [wallet.contractAddress, contract.contractAddress, amountToTransfer, dataToTransfer], wallet, _signers); + const after = await deployer.provider.getBalance(contract.contractAddress); + assert.equal(after.sub(before).toNumber(), amountToTransfer, "should have transfered the ETH amount"); + assert.equal((await contract.state()).toNumber(), newState, "the state of the external contract should have been changed"); + } + + it("should call a contract and transfer ETH with 1 EOA guardian and 2 smart-contract guardians", async () => { + await callContract([owner, ...sortWalletByAddress([guardian1, guardian2])]); + await callContract([owner, ...sortWalletByAddress([guardian1, guardian3])]); + await callContract([owner, ...sortWalletByAddress([guardian2, guardian3])]); + }); + + it("should not be able to call the wallet itself", async () => { + const txReceipt = await manager.relay(approvedTransfer, "callContract", + [wallet.contractAddress, wallet.contractAddress, amountToTransfer, ethers.constants.HashZero], + wallet, + [owner, ...sortWalletByAddress([guardian1, guardian2])]); + const success = parseRelayReceipt(txReceipt); + assert.isFalse(success); + }); }); + }); - describe("Transfer approved by EOA and smart-contract guardians", () => { - it('should transfer ETH with 1 EOA guardian and 2 smart-contract guardians', async () => { - let amountToTransfer = 10000; - await addGuardians([guardian1, ...(await createSmartContractGuardians([guardian2, guardian3]))]); - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 3, '3 guardians should be active'); - let before = await deployer.provider.getBalance(recipient.address); - // should succeed with 2 confirmations - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); - let after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); - // should succeed with 2 confirmations - before = after; - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian1, guardian3])]); - after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); - // should succeed with 2 confirmations - before = after; - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian2, guardian3])]); - after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + describe("Approve token and Contract call", () => { + describe("Approved by 1 EOA and 2 smart-contract guardians", () => { + let contract; + const amountToApprove = 10000; + + beforeEach(async () => { + contract = await deployer.deploy(TestContract); + assert.equal(await contract.state(), 0, "initial contract state should be 0"); + await addGuardians([guardian1, ...(await createSmartContractGuardians([guardian2, guardian3]))]); + }); + + describe("Invalid Target", () => { + async function expectFailingApproveTokenAndCallContract(target) { + const invalidData = contract.contract.interface.functions.setStateAndPayToken.encode([2, erc20.contractAddress, amountToApprove]); + const txReceipt = await manager.relay(approvedTransfer, "approveTokenAndCallContract", + [wallet.contractAddress, erc20.contractAddress, wallet.contractAddress, amountToApprove, target.contractAddress, invalidData], + wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); + const success = parseRelayReceipt(txReceipt); + assert.isNotOk(success, "approveTokenAndCall should fail when target contract is invalid"); + } + + it("should revert when target contract is the wallet", async () => { + await expectFailingApproveTokenAndCallContract(wallet); }); - it('should transfer ETH with 2 EOA guardian and 1 smart-contract guardians', async () => { - let amountToTransfer = 10000; - await addGuardians([guardian1, guardian2, ...await createSmartContractGuardians([guardian3])]); - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 3, '3 guardians should be active'); - let before = await deployer.provider.getBalance(recipient.address); - // should succeed with 2 confirmations - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); - let after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); - // should succeed with 2 confirmations - before = after; - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian1, guardian3])]); - after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); - // should succeed with 2 confirmations - before = after; - await manager.relay(transferModule, "transferToken", [wallet.contractAddress, ETH_TOKEN, recipient.address, amountToTransfer, ZERO_BYTES32], wallet, [owner, ...sortWalletByAddress([guardian2, guardian3])]); - after = await deployer.provider.getBalance(recipient.address); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); + + it("should revert when target contract is an authorised module", async () => { + await expectFailingApproveTokenAndCallContract(approvedTransfer); }); - }); + }); - describe("Transfer with data approved by EOA and smart-contract guardians", () => { + describe("Valid Target", () => { + async function approveTokenAndCallContract(_signers, _consumerAddress = contract.contractAddress) { + const newState = parseInt((await contract.state()).toString(), 10) + 1; + const fun = _consumerAddress === contract.contractAddress ? "setStateAndPayToken" : "setStateAndPayTokenWithConsumer"; + const data = contract.contract.interface.functions[fun].encode( + [newState, erc20.contractAddress, amountToApprove], + ); + const before = await erc20.balanceOf(contract.contractAddress); + await manager.relay( + approvedTransfer, + "approveTokenAndCallContract", + [wallet.contractAddress, erc20.contractAddress, _consumerAddress, amountToApprove, contract.contractAddress, data], + wallet, + _signers, + ); + const after = await erc20.balanceOf(contract.contractAddress); + assert.equal(after.sub(before).toNumber(), amountToApprove, "should have approved and transfered the token amount"); + assert.equal((await contract.state()).toNumber(), newState, "the state of the external contract should have been changed"); + } - let contract, dataToTransfer; + it("should approve token for a spender then call a contract with 3 guardians, spender = contract", async () => { + await approveTokenAndCallContract([owner, ...sortWalletByAddress([guardian1, guardian2])]); + await approveTokenAndCallContract([owner, ...sortWalletByAddress([guardian1, guardian3])]); + await approveTokenAndCallContract([owner, ...sortWalletByAddress([guardian2, guardian3])]); + }); - beforeEach(async () => { - contract = await deployer.deploy(TestContract); - assert.equal(await contract.state(), 0, "initial contract state should be 0"); + it("should approve token for a spender then call a contract with 3 guardians, spender != contract", async () => { + const consumer = await contract.tokenConsumer(); + await approveTokenAndCallContract([owner, ...sortWalletByAddress([guardian1, guardian2])], consumer); + await approveTokenAndCallContract([owner, ...sortWalletByAddress([guardian1, guardian3])], consumer); + await approveTokenAndCallContract([owner, ...sortWalletByAddress([guardian2, guardian3])], consumer); }); - it('should call a contract and transfer ETH with 1 EOA guardian and 2 smart-contract guardians', async () => { - let amountToTransfer = 10000; - await addGuardians([guardian1, ...(await createSmartContractGuardians([guardian2, guardian3]))]); - let count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 3, '3 guardians should be active'); - let before = await deployer.provider.getBalance(contract.contractAddress); - // should succeed with 2 confirmations - dataToTransfer = contract.contract.interface.functions['setState'].encode([2]); - let txReceipt = await manager.relay(transferModule, "callContract", [wallet.contractAddress, contract.contractAddress, amountToTransfer, dataToTransfer], wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); - let after = await deployer.provider.getBalance(contract.contractAddress); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); - assert.equal((await contract.state()).toNumber(), 2, 'the state of the external contract should have been changed'); - // should succeed with 2 confirmations - before = after; - dataToTransfer = contract.contract.interface.functions['setState'].encode([3]); - await manager.relay(transferModule, "callContract", [wallet.contractAddress, contract.contractAddress, amountToTransfer, dataToTransfer], wallet, [owner, ...sortWalletByAddress([guardian1, guardian3])]); - after = await deployer.provider.getBalance(contract.contractAddress); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); - assert.equal((await contract.state()).toNumber(), 3, 'the state of the external contract should have been changed'); - // should succeed with 2 confirmations - before = after; - dataToTransfer = contract.contract.interface.functions['setState'].encode([4]); - await manager.relay(transferModule, "callContract", [wallet.contractAddress, contract.contractAddress, amountToTransfer, dataToTransfer], wallet, [owner, ...sortWalletByAddress([guardian2, guardian3])]); - after = await deployer.provider.getBalance(contract.contractAddress); - assert.equal(after.sub(before).toNumber(), amountToTransfer, 'should have transfered the ETH amount'); - assert.equal((await contract.state()).toNumber(), 4, 'the state of the external contract should have been changed'); + it("should restore the original approved amount", async () => { + const consumer = await contract.tokenConsumer(); + const allowanceBefore = await erc20.allowance(wallet.contractAddress, consumer); + const balanceBefore = await erc20.balanceOf(contract.contractAddress); + + const dataToTransfer = contract.contract.interface.functions + .setStateAndPayTokenWithConsumer.encode([2, erc20.contractAddress, amountToApprove]); + await manager.relay(approvedTransfer, "approveTokenAndCallContract", + [wallet.contractAddress, erc20.contractAddress, consumer, amountToApprove, contract.contractAddress, dataToTransfer], + wallet, [owner, ...sortWalletByAddress([guardian1, guardian2])]); + + const balanceAfter = await erc20.balanceOf(contract.contractAddress); + assert.equal(balanceAfter.sub(balanceBefore).toNumber(), amountToApprove, "should have approved and transfered the token amount"); + assert.equal((await contract.state()).toNumber(), 2, "the state of the external contract should have been changed"); + + const allowanceAfter = await erc20.allowance(wallet.contractAddress, consumer); + assert.equal(allowanceAfter.toNumber(), allowanceBefore.toNumber()); }); + }); }); - -}); \ No newline at end of file + }); +}); diff --git a/test/baseContracts.js b/test/baseContracts.js new file mode 100644 index 000000000..ba3e73138 --- /dev/null +++ b/test/baseContracts.js @@ -0,0 +1,105 @@ +/* global accounts */ +const ethers = require("ethers"); +const Managed = require("../build/Managed"); + +const TestManager = require("../utils/test-manager"); + +describe("Token Price Provider", () => { + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const manager1 = accounts[1].signer; + const manager2 = accounts[2].signer; + const nonOwner = accounts[3].signer; + + let deployer; + let managed; + + before(async () => { + deployer = manager.newDeployer(); + }); + + beforeEach(async () => { + managed = await deployer.deploy(Managed); + }); + + describe("Owned contract logic", () => { + it("should set owner to caller", async () => { + const owner = await managed.owner(); + assert.equal(owner, infrastructure.address); + }); + + it("should be able to change owner", async () => { + const newOwner = accounts[1].signer; + await managed.changeOwner(newOwner.address); + const owner = await managed.owner(); + assert.equal(owner, newOwner.address); + }); + + it("should not be able to change owner to zero address", async () => { + await assert.revertWith(managed.changeOwner(ethers.constants.AddressZero), "Address must not be null"); + }); + }); + + describe("Managed contract logic", () => { + it("should be able to add manager", async () => { + // Ensure the manager test accounts are not managers to start with + let isManager1 = await managed.managers(manager1.address); + assert.isFalse(isManager1); + let isManager2 = await managed.managers(manager2.address); + assert.isFalse(isManager2); + + // Add managers + await managed.addManager(manager1.address); + await managed.addManager(manager2.address); + + isManager1 = await managed.managers(manager1.address); + assert.isTrue(isManager1); + isManager2 = await managed.managers(manager2.address); + assert.isTrue(isManager2); + }); + + it("should not be able to add manager if not called by owner", async () => { + await assert.revertWith(managed.from(nonOwner.address).addManager(manager1.address), "Must be owner"); + }); + + it("should not be able to set manager to zero address", async () => { + await assert.revertWith(managed.addManager(ethers.constants.AddressZero), "M: Address must not be null"); + }); + + it("should be able to set manager twice without error", async () => { + // Set manager once + await managed.addManager(manager1.address); + let isManager1 = await managed.managers(manager1.address); + assert.isTrue(isManager1); + + // Set manager twice + await managed.addManager(manager1.address); + isManager1 = await managed.managers(manager1.address); + assert.isTrue(isManager1); + }); + + it("should be able to revoke manager", async () => { + // Add managers + await managed.addManager(manager1.address); + await managed.addManager(manager2.address); + + // Revoke only the second manager + await managed.revokeManager(manager2.address); + + const isManager1 = await managed.managers(manager1.address); + assert.isTrue(isManager1); + const isManager2 = await managed.managers(manager2.address); + assert.isFalse(isManager2); + }); + + it("should not be able to revoke manager if not called by owner", async () => { + await managed.addManager(manager1.address); + await assert.revertWith(managed.from(nonOwner.address).revokeManager(manager1.address), "Must be owner"); + }); + + it("should not be able to revoke a nonexisting managerr", async () => { + await assert.revertWith(managed.revokeManager(manager2.address), "M: Target must be an existing manager"); + }); + }); +}); diff --git a/test/baseWallet.js b/test/baseWallet.js index 83dd6627f..31fdc3900 100644 --- a/test/baseWallet.js +++ b/test/baseWallet.js @@ -1,110 +1,181 @@ -const Wallet = require('../build/BaseWallet'); -const OldWallet = require('../build/LegacyBaseWallet'); -const Module = require('../build/TestModule'); -const OldTestModule = require('../build/OldTestModule'); -const NewTestModule = require('../build/NewTestModule'); -const Registry = require('../build/ModuleRegistry'); +/* global accounts */ +const ethers = require("ethers"); -const TestManager = require("../utils/test-manager"); +const Wallet = require("../build/BaseWallet"); +const OldWallet = require("../build/LegacyBaseWallet"); +const Module = require("../build/TestModule"); +const OldTestModule = require("../build/OldTestModule"); +const NewTestModule = require("../build/NewTestModule"); +const Registry = require("../build/ModuleRegistry"); +const SimpleUpgrader = require("../build/SimpleUpgrader"); -describe("Test BaseWallet", function () { - this.timeout(10000); +const TestManager = require("../utils/test-manager"); - const manager = new TestManager(); +describe("BaseWallet", function () { + this.timeout(10000); + + const manager = new TestManager(); + + const owner = accounts[1].signer; + const nonowner = accounts[2].signer; + + let deployer; + let wallet; + let registry; + let module1; + let module2; + let module3; + let oldModule; + let newModule; + + before(async () => { + deployer = manager.newDeployer(); + registry = await deployer.deploy(Registry); + module1 = await deployer.deploy(Module, {}, registry.contractAddress, true, 42); + module2 = await deployer.deploy(Module, {}, registry.contractAddress, false, 42); + module3 = await deployer.deploy(Module, {}, registry.contractAddress, true, 42); + oldModule = await deployer.deploy(OldTestModule, {}, registry.contractAddress); + newModule = await deployer.deploy(NewTestModule, {}, registry.contractAddress); + }); + + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + }); + + describe("Old and New BaseWallets", () => { + describe("wallet init", () => { + it("should create a wallet with the correct owner", async () => { + let walletOwner = await wallet.owner(); + assert.equal(walletOwner, "0x0000000000000000000000000000000000000000", "owner should be null before init"); + await wallet.init(owner.address, [module1.contractAddress]); + walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "owner should be the owner after init"); + }); + + it("should create a wallet with the correct modules", async () => { + await wallet.init(owner.address, [module1.contractAddress, module2.contractAddress]); + const module1IsAuthorised = await wallet.authorised(module1.contractAddress); + const module2IsAuthorised = await wallet.authorised(module2.contractAddress); + const module3IsAuthorised = await wallet.authorised(module3.contractAddress); + assert.equal(module1IsAuthorised, true, "module1 should be authorised"); + assert.equal(module2IsAuthorised, true, "module2 should be authorised"); + assert.equal(module3IsAuthorised, false, "module3 should not be authorised"); + }); + + it("should not reinitialize a wallet", async () => { + await wallet.init(owner.address, [module1.contractAddress]); + await assert.revertWith(wallet.init(owner.address, [module1.contractAddress]), "BW: wallet already initialised"); + }); + + it("should not initialize a wallet with no module", async () => { + await assert.revertWith(wallet.init(owner.address, []), "BW: construction requires at least 1 module"); + }); + + it("should not initialize a wallet with duplicate modules", async () => { + await assert.revertWith(wallet.init(owner.address, [module1.contractAddress, module1.contractAddress]), "BW: module is already added"); + }); + }); - let owner = accounts[1].signer; - let nonowner = accounts[2].signer; + describe("Receiving ETH", () => { + it("should accept ETH", async () => { + const before = await deployer.provider.getBalance(wallet.contractAddress); + await nonowner.sendTransaction({ to: wallet.contractAddress, value: 50000000 }); + const after = await deployer.provider.getBalance(wallet.contractAddress); + assert.equal(after.sub(before).toNumber(), 50000000, "should have received ETH"); + }); + + it("should accept ETH with data", async () => { + const before = await deployer.provider.getBalance(wallet.contractAddress); + await nonowner.sendTransaction({ to: wallet.contractAddress, value: 50000000, data: 0x1234 }); + const after = await deployer.provider.getBalance(wallet.contractAddress); + assert.equal(after.sub(before).toNumber(), 50000000, "should have received ETH"); + }); + }); - let wallet; - let module1, module2, module3, oldModule, newModule; + describe("Authorisations", () => { + it("should not let a non-module deauthorise a module", async () => { + await wallet.init(owner.address, [module1.contractAddress]); + await assert.revertWith(wallet.authoriseModule(module1.contractAddress, false), "BW: msg.sender not an authorized module"); + }); - before(async () => { - deployer = manager.newDeployer(); - const registry = await deployer.deploy(Registry); - module1 = await deployer.deploy(Module, {}, registry.contractAddress, true, 42); - module2 = await deployer.deploy(Module, {}, registry.contractAddress, false, 42); - module3 = await deployer.deploy(Module, {}, registry.contractAddress, true, 42); - oldModule = await deployer.deploy(OldTestModule, {}, registry.contractAddress); - newModule = await deployer.deploy(NewTestModule, {}, registry.contractAddress); + it("should not let a module set the owner to address(0)", async () => { + await wallet.init(owner.address, [module1.contractAddress]); + await assert.revertWith(module1.invalidOwnerChange(wallet.contractAddress), "BW: address cannot be null"); + }); }); - beforeEach(async () => { - wallet = await deployer.deploy(Wallet); + describe("Static calls", () => { + it("should delegate static calls to the modules", async () => { + await wallet.init(owner.address, [module1.contractAddress]); + const module1IsAuthorised = await wallet.authorised(module1.contractAddress); + assert.equal(module1IsAuthorised, true, "module1 should be authorised"); + const walletAsModule = deployer.wrapDeployedContract(Module, wallet.contractAddress); + const boolVal = await walletAsModule.contract.getBoolean(); + const uintVal = await walletAsModule.contract.getUint(); + const addressVal = await walletAsModule.contract.getAddress(nonowner.address); + assert.equal(boolVal, true, "should have the correct bool"); + assert.equal(uintVal, 42, "should have the correct uint"); + assert.equal(addressVal, nonowner.address, "should have the address"); + }); + + it("should not delegate static calls to unauthorised modules ", async () => { + await wallet.init(owner.address, [module1.contractAddress]); + const module1IsAuthorised = await wallet.authorised(module1.contractAddress); + assert.equal(module1IsAuthorised, true, "module1 should be authorised"); + const module2IsAuthorised = await wallet.authorised(module2.contractAddress); + assert.equal(module2IsAuthorised, false, "module2 should not be authorised"); + await assert.revertWith(module1.enableStaticCalls(wallet.contractAddress, module2.contractAddress), + "BW: must be an authorised module for static call"); + }); + + it("should not delegate static calls to no longer authorised modules ", async () => { + await wallet.init(owner.address, [module2.contractAddress, module1.contractAddress]); + let module1IsAuthorised = await wallet.authorised(module1.contractAddress); + assert.equal(module1IsAuthorised, true, "module1 should be authorised"); + + // removing module 1 + const upgrader = await deployer.deploy(SimpleUpgrader, {}, registry.contractAddress, [module1.contractAddress], []); + await registry.registerModule(upgrader.contractAddress, ethers.utils.formatBytes32String("Removing module1")); + await module1.from(owner).addModule(wallet.contractAddress, upgrader.contractAddress, { gasLimit: 1000000 }); + module1IsAuthorised = await wallet.authorised(module1.contractAddress); + assert.equal(module1IsAuthorised, false, "module1 should not be authorised"); + + // trying to execute static call delegated to module1 (it should fail) + const walletAsModule = deployer.wrapDeployedContract(Module, wallet.contractAddress); + await assert.revertWith(walletAsModule.contract.getBoolean(), "BW: must be an authorised module for static call"); + }); }); + }); - describe("Old and New BaseWallets", () => { - - it("should create a wallet with the correct owner", async () => { - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, "0x0000000000000000000000000000000000000000", "owner should be null before init"); - await wallet.init(owner.address, [module1.contractAddress]); - walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, "owner should be the owner after init"); - }); - - it("should create a wallet with the correct modules", async () => { - await wallet.init(owner.address, [module1.contractAddress, module2.contractAddress]); - let module1IsAuthorised = await wallet.authorised(module1.contractAddress); - let module2IsAuthorised = await wallet.authorised(module2.contractAddress); - let module3IsAuthorised = await wallet.authorised(module3.contractAddress); - assert.equal(module1IsAuthorised, true, "module1 should be authorised"); - assert.equal(module2IsAuthorised, true, "module2 should be authorised"); - assert.equal(module3IsAuthorised, false, "module3 should not be authorised"); - }); - - it("should accept ETH", async () => { - let before = await deployer.provider.getBalance(wallet.contractAddress); - await nonowner.sendTransaction({ to: wallet.contractAddress, value: 50000000 }); - let after = await deployer.provider.getBalance(wallet.contractAddress); - assert.equal(after.sub(before).toNumber(), 50000000, "should have received ETH"); - }); - - it("should delegate static calls to the modules", async () => { - await wallet.init(owner.address, [module1.contractAddress]); - let module1IsAuthorised = await wallet.authorised(module1.contractAddress); - assert.equal(module1IsAuthorised, true, "module1 should be authorised"); - let walletAsModule = deployer.wrapDeployedContract(Module, wallet.contractAddress); - let boolVal = await walletAsModule.contract.getBoolean(); - let uintVal = await walletAsModule.contract.getUint(); - let addressVal = await walletAsModule.contract.getAddress(nonowner.address); - assert.equal(boolVal, true, "should have the correct bool"); - assert.equal(uintVal, 42, "should have the correct uint"); - assert.equal(addressVal, nonowner.address, "should have the address"); - }); - - }) - - describe("New BaseWallet", () => { - it("should work with old modules", async () => { - await wallet.init(owner.address, [oldModule.contractAddress]); - await oldModule.callDapp(wallet.contractAddress, { gasLimit: 500000 }); - await oldModule.callDapp2(wallet.contractAddress, { gasLimit: 500000 }); - }) - it("should work with new modules", async () => { - await wallet.init(owner.address, [newModule.contractAddress]); - await newModule.callDapp(wallet.contractAddress); - await newModule.callDapp2(wallet.contractAddress, 2, true); - }) - it("should bubble the reason message up when reverting", async () => { - await wallet.init(owner.address, [newModule.contractAddress]); - const reason = "I'm hereby reverting this transaction using a reason message that is longer than 32 bytes!" - try { - await newModule.fail(wallet.contractAddress, reason); - } catch (e) { - assert.isTrue(await manager.isRevertReason(e, reason), "invalid reason message"); - } - - }) + describe("New BaseWallet", () => { + it("should work with old modules", async () => { + await wallet.init(owner.address, [oldModule.contractAddress]); + await oldModule.callDapp(wallet.contractAddress, { gasLimit: 500000 }); + await oldModule.callDapp2(wallet.contractAddress, { gasLimit: 500000 }); }); - - describe("Old BaseWallet", () => { - it("should work with new modules", async () => { - const oldWallet = await deployer.deploy(OldWallet); - await oldWallet.init(owner.address, [oldModule.contractAddress, newModule.contractAddress]); - await newModule.callDapp(oldWallet.contractAddress); - await newModule.callDapp2(oldWallet.contractAddress, 2, false); - await assert.revert(newModule.fail(oldWallet.contractAddress, "just because")) - }) + it("should work with new modules", async () => { + await wallet.init(owner.address, [newModule.contractAddress]); + await newModule.callDapp(wallet.contractAddress); + await newModule.callDapp2(wallet.contractAddress, 2, true); }); - -}); \ No newline at end of file + it("should bubble the reason message up when reverting", async () => { + await wallet.init(owner.address, [newModule.contractAddress]); + const reason = "I'm hereby reverting this transaction using a reason message that is longer than 32 bytes!"; + try { + await newModule.fail(wallet.contractAddress, reason); + } catch (e) { + assert.isTrue(await manager.isRevertReason(e, reason), "invalid reason message"); + } + }); + }); + + describe("Old BaseWallet", () => { + it("should work with new modules", async () => { + const oldWallet = await deployer.deploy(OldWallet); + await oldWallet.init(owner.address, [oldModule.contractAddress, newModule.contractAddress]); + await newModule.callDapp(oldWallet.contractAddress); + await newModule.callDapp2(oldWallet.contractAddress, 2, false); + await assert.revert(newModule.fail(oldWallet.contractAddress, "just because")); + }); + }); +}); diff --git a/test/compoundManager_invest.js b/test/compoundManager_invest.js index d175c123b..101d81342 100644 --- a/test/compoundManager_invest.js +++ b/test/compoundManager_invest.js @@ -1,4 +1,7 @@ -const { parseEther, formatBytes32String, bigNumberify } = require('ethers').utils; +/* global accounts, utils */ +const { + parseEther, formatBytes32String, bigNumberify, +} = require("ethers").utils; const GuardianStorage = require("../build/GuardianStorage"); const Registry = require("../build/ModuleRegistry"); @@ -16,253 +19,255 @@ const CEther = require("../build/CEther"); const CErc20 = require("../build/CErc20"); const CompoundRegistry = require("../build/CompoundRegistry"); -const WAD = bigNumberify('1000000000000000000') // 10**18 -const ETH_EXCHANGE_RATE = bigNumberify('200000000000000000000000000'); +const WAD = bigNumberify("1000000000000000000"); // 10**18 +const ETH_EXCHANGE_RATE = bigNumberify("200000000000000000000000000"); const ERC20 = require("../build/TestERC20"); -const ETH_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; + +const { ETH_TOKEN } = require("../utils/utilities.js"); const TestManager = require("../utils/test-manager"); describe("Invest Manager with Compound", function () { - this.timeout(1000000); - - const manager = new TestManager(); - - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - let liquidityProvider = accounts[2].signer; - let borrower = accounts[3].signer; - - let wallet, investManager, compoundRegistry, token, cToken, cEther, comptroller, oracleProxy; - - before(async () => { - deployer = manager.newDeployer(); - - /* Deploy Compound V2 Architecture */ - - // deploy price oracle - const oracle = await deployer.deploy(PriceOracle); - - // deploy comptroller - const comptrollerProxy = await deployer.deploy(Unitroller); - const comptrollerImpl = await deployer.deploy(Comptroller); - await comptrollerProxy._setPendingImplementation(comptrollerImpl.contractAddress); - await comptrollerImpl._become(comptrollerProxy.contractAddress, oracle.contractAddress, WAD.div(10), 5, false, { gasLimit: 500000 }); - comptroller = deployer.wrapDeployedContract(Comptroller, comptrollerProxy.contractAddress); - // deploy Interest rate model - const interestModel = await deployer.deploy(InterestModel, {}, WAD.mul(250).div(10000), WAD.mul(2000).div(10000)); - // deploy CEther - cEther = await deployer.deploy( - CEther, - {}, - comptroller.contractAddress, - interestModel.contractAddress, - ETH_EXCHANGE_RATE, - formatBytes32String("Compound Ether"), - formatBytes32String("cETH"), - 8); - - // deploy token - token = await deployer.deploy(ERC20, {}, [infrastructure.address, liquidityProvider.address, borrower.address], 10000000, 18); - // deploy CToken - cToken = await deployer.deploy( - CErc20, - {}, - token.contractAddress, - comptroller.contractAddress, - interestModel.contractAddress, - ETH_EXCHANGE_RATE, - "Compound Token", - "cTOKEN", - 18); - // add price to Oracle - await oracle.setUnderlyingPrice(cToken.contractAddress, WAD.div(10)); - // list cToken in Comptroller - await comptroller._supportMarket(cEther.contractAddress, { gasLimit: 500000 }); - await comptroller._supportMarket(cToken.contractAddress, { gasLimit: 500000 }); - // deploy Price Oracle proxy - oracleProxy = await deployer.deploy(PriceOracleProxy, {}, comptroller.contractAddress, oracle.contractAddress, cEther.contractAddress); - await comptroller._setPriceOracle(oracleProxy.contractAddress, { gasLimit: 200000 }); - // set collateral factor - await comptroller._setCollateralFactor(cToken.contractAddress, WAD.div(10), { gasLimit: 500000 }); - await comptroller._setCollateralFactor(cEther.contractAddress, WAD.div(10), { gasLimit: 500000 }); - - // add liquidity to tokens - await cEther.from(liquidityProvider).mint({ value: parseEther('100') }); - await token.from(liquidityProvider).approve(cToken.contractAddress, parseEther('100')); - await cToken.from(liquidityProvider).mint(parseEther('10')); - - /* Deploy Argent Architecture */ - - compoundRegistry = await deployer.deploy(CompoundRegistry); - await compoundRegistry.addCToken(ETH_TOKEN, cEther.contractAddress); - await compoundRegistry.addCToken(token.contractAddress, cToken.contractAddress); - const registry = await deployer.deploy(Registry); - const guardianStorage = await deployer.deploy(GuardianStorage); - investManager = await deployer.deploy( - CompoundManager, - {}, - registry.contractAddress, - guardianStorage.contractAddress, - comptroller.contractAddress, - compoundRegistry.contractAddress - ); + this.timeout(1000000); + + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + const liquidityProvider = accounts[2].signer; + const borrower = accounts[3].signer; + + let deployer; + let wallet; + let investManager; + let compoundRegistry; + let token; + let cToken; + let cEther; + let comptroller; + let oracleProxy; + + before(async () => { + deployer = manager.newDeployer(); + + /* Deploy Compound V2 Architecture */ + + // deploy price oracle + const oracle = await deployer.deploy(PriceOracle); + + // deploy comptroller + const comptrollerProxy = await deployer.deploy(Unitroller); + const comptrollerImpl = await deployer.deploy(Comptroller); + await comptrollerProxy._setPendingImplementation(comptrollerImpl.contractAddress); + await comptrollerImpl._become(comptrollerProxy.contractAddress, oracle.contractAddress, WAD.div(10), 5, false, { gasLimit: 500000 }); + comptroller = deployer.wrapDeployedContract(Comptroller, comptrollerProxy.contractAddress); + // deploy Interest rate model + const interestModel = await deployer.deploy(InterestModel, {}, WAD.mul(250).div(10000), WAD.mul(2000).div(10000)); + // deploy CEther + cEther = await deployer.deploy( + CEther, + {}, + comptroller.contractAddress, + interestModel.contractAddress, + ETH_EXCHANGE_RATE, + formatBytes32String("Compound Ether"), + formatBytes32String("cETH"), + 8, + ); + + // deploy token + token = await deployer.deploy(ERC20, {}, [infrastructure.address, liquidityProvider.address, borrower.address], 10000000, 18); + // deploy CToken + cToken = await deployer.deploy( + CErc20, + {}, + token.contractAddress, + comptroller.contractAddress, + interestModel.contractAddress, + ETH_EXCHANGE_RATE, + "Compound Token", + "cTOKEN", + 18, + ); + // add price to Oracle + await oracle.setUnderlyingPrice(cToken.contractAddress, WAD.div(10)); + // list cToken in Comptroller + await comptroller._supportMarket(cEther.contractAddress, { gasLimit: 500000 }); + await comptroller._supportMarket(cToken.contractAddress, { gasLimit: 500000 }); + // deploy Price Oracle proxy + oracleProxy = await deployer.deploy(PriceOracleProxy, {}, comptroller.contractAddress, oracle.contractAddress, cEther.contractAddress); + await comptroller._setPriceOracle(oracleProxy.contractAddress, { gasLimit: 200000 }); + // set collateral factor + await comptroller._setCollateralFactor(cToken.contractAddress, WAD.div(10), { gasLimit: 500000 }); + await comptroller._setCollateralFactor(cEther.contractAddress, WAD.div(10), { gasLimit: 500000 }); + + // add liquidity to tokens + await cEther.from(liquidityProvider).mint({ value: parseEther("100") }); + await token.from(liquidityProvider).approve(cToken.contractAddress, parseEther("100")); + await cToken.from(liquidityProvider).mint(parseEther("10")); + + /* Deploy Argent Architecture */ + + compoundRegistry = await deployer.deploy(CompoundRegistry); + await compoundRegistry.addCToken(ETH_TOKEN, cEther.contractAddress); + await compoundRegistry.addCToken(token.contractAddress, cToken.contractAddress); + const registry = await deployer.deploy(Registry); + const guardianStorage = await deployer.deploy(GuardianStorage); + investManager = await deployer.deploy( + CompoundManager, + {}, + registry.contractAddress, + guardianStorage.contractAddress, + comptroller.contractAddress, + compoundRegistry.contractAddress, + ); + }); + + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [investManager.contractAddress]); + }); + + describe("Environment", () => { + it("should deploy the environment correctly", async () => { + const getCToken = await compoundRegistry.getCToken(token.contractAddress); + assert.isTrue(getCToken === cToken.contractAddress, "cToken should be registered"); + const getCEther = await compoundRegistry.getCToken(ETH_TOKEN); + assert.isTrue(getCEther === cEther.contractAddress, "cEther should be registered"); + const cOracle = await comptroller.oracle(); + assert.isTrue(cOracle === oracleProxy.contractAddress, "oracle should be registered"); + const cTokenPrice = await oracleProxy.getUnderlyingPrice(cToken.contractAddress); + assert.isTrue(cTokenPrice.eq(WAD.div(10)), "cToken price should be 1e17"); + const cEtherPrice = await oracleProxy.getUnderlyingPrice(cEther.contractAddress); + assert.isTrue(cEtherPrice.eq(WAD), "cEther price should be 1e18"); }); - - beforeEach(async () => { - - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [investManager.contractAddress]); + }); + + describe("Investment", () => { + async function accrueInterests(days, investInEth) { + let tx; let + txReceipt; + // genrate borrows to create interests + await comptroller.from(borrower).enterMarkets([cEther.contractAddress, cToken.contractAddress], { gasLimit: 200000 }); + if (investInEth) { + await token.from(borrower).approve(cToken.contractAddress, parseEther("20")); + await cToken.from(borrower).mint(parseEther("20")); + tx = await cEther.from(borrower).borrow(parseEther("0.1"), { gasLimit: 8000000 }); + txReceipt = await cEther.verboseWaitForTransaction(tx); + assert.isTrue(await utils.hasEvent(txReceipt, cEther, "Borrow"), "should have generated Borrow event"); + } else { + await cEther.from(borrower).mint({ value: parseEther("2") }); + tx = await cToken.from(borrower).borrow(parseEther("0.1")); + txReceipt = await cToken.verboseWaitForTransaction(tx); + assert.isTrue(await utils.hasEvent(txReceipt, cToken, "Borrow"), "should have generated Borrow event"); + } + // increase time to accumulate interests + await manager.increaseTime(3600 * 24 * days); + await cToken.accrueInterest(); + await cEther.accrueInterest(); + } + + async function addInvestment(tokenAddress, amount, days, relay = false) { + let tx; let + txReceipt; + const investInEth = (tokenAddress === ETH_TOKEN); + + if (investInEth) { + // const bef = (await deployer.provider.getBalance(infrastructure.address)).toString() + // console.log('infra before', bef); + // console.log({ to: wallet.contractAddress, value: amount }); + + tx = await infrastructure.sendTransaction({ to: wallet.contractAddress, value: amount, gasLimit: 8000000 }); + // tx = await infrastructure.sendTransaction({ to: wallet.contractAddress, value: 100, gasLimit: 8000000 }); + // txReceipt = await wallet.verboseWaitForTransaction(tx); + + // console.log('resu', txReceipt) + // const aft = (await deployer.provider.getBalance(infrastructure.address)).toString() + // const aftW = (await deployer.provider.getBalance(wallet.contractAddress)).toString() + // console.log('infra after', aft); + // console.log('W after', aftW); + // console.log('inc?', aft !=== bef) + // return + } else { + await token.from(infrastructure).transfer(wallet.contractAddress, amount); + } + const params = [wallet.contractAddress, tokenAddress, amount, 0]; + if (relay) { + txReceipt = await manager.relay(investManager, "addInvestment", params, wallet, [owner]); + } else { + // console.log(owner.address, 'bal=', await deployer.provider.getBalance(wallet.contractAddress), 'p', wallet.contractAddress, tokenAddress, amount.toString(), 0); + + tx = await investManager.from(owner).addInvestment(...params, { gasLimit: 4000000 }); + txReceipt = await investManager.verboseWaitForTransaction(tx); + } + + assert.isTrue(await utils.hasEvent(txReceipt, investManager, "InvestmentAdded"), "should have generated InvestmentAdded event"); + + await accrueInterests(days, investInEth); + + const output = await investManager.getInvestment(wallet.contractAddress, tokenAddress); + assert.isTrue(output._tokenValue > amount, "investment should have gained value"); + + return output._tokenValue; + } + + async function removeInvestment(tokenAddress, fraction, relay = false) { + let tx; let + txReceipt; + const investInEth = (tokenAddress === ETH_TOKEN); + + await addInvestment(tokenAddress, parseEther("0.1"), 365, false); + const before = investInEth ? await cEther.balanceOf(wallet.contractAddress) : await cToken.balanceOf(wallet.contractAddress); + + const params = [wallet.contractAddress, tokenAddress, fraction]; + if (relay) { + txReceipt = await manager.relay(investManager, "removeInvestment", params, wallet, [owner]); + } else { + tx = await investManager.from(owner).removeInvestment(...params, { gasLimit: 400000 }); + txReceipt = await investManager.verboseWaitForTransaction(tx); + } + assert.isTrue(await utils.hasEvent(txReceipt, investManager, "InvestmentRemoved"), "should have generated InvestmentRemoved event"); + + const after = investInEth ? await cEther.balanceOf(wallet.contractAddress) : await cToken.balanceOf(wallet.contractAddress); + assert.isTrue(after.eq(Math.ceil((before * (10000 - fraction)) / 10000)), "should have removed the correct fraction"); + } + + describe("Add Investment", () => { + it("should invest in ERC20 for 1 year and gain interests (blockchain tx)", async () => { + await addInvestment(token.contractAddress, parseEther("1"), 365, false); + }); + + it("should invest in ERC20 for 1 year and gain interests (relay tx)", async () => { + await addInvestment(token.contractAddress, parseEther("1"), 365, true); + }); + + it("should invest in ETH for 1 year and gain interests (blockchain tx)", async () => { + await addInvestment(ETH_TOKEN, parseEther("1"), 365, false); + }); + + it("should invest in ETH for 1 year and gain interests (relay tx)", async () => { + await addInvestment(ETH_TOKEN, parseEther("1"), 365, true); + }); }); - describe("Environment", () => { - it('should deploy the environment correctly', async () => { - let getCToken = await compoundRegistry.getCToken(token.contractAddress); - assert.isTrue(getCToken == cToken.contractAddress, "cToken should be registered"); - let getCEther = await compoundRegistry.getCToken(ETH_TOKEN); - assert.isTrue(getCEther == cEther.contractAddress, "cEther should be registered"); - let cOracle = await comptroller.oracle(); - assert.isTrue(cOracle == oracleProxy.contractAddress, "oracle should be registered"); - let cTokenPrice = await oracleProxy.getUnderlyingPrice(cToken.contractAddress); - assert.isTrue(cTokenPrice.eq(WAD.div(10)), "cToken price should be 1e17"); - let cEtherPrice = await oracleProxy.getUnderlyingPrice(cEther.contractAddress); - assert.isTrue(cEtherPrice.eq(WAD), "cEther price should be 1e18"); + describe("Remove Investment", () => { + function testRemoveERC20Investment(fraction, relay) { + it(`should remove ${fraction / 100}% of an ERC20 investment (${relay ? "relay" : "blockchain"} tx)`, async () => { + await removeInvestment(token.contractAddress, fraction, relay); }); - }); - - describe("Investment", () => { - - async function addInvestment(tokenAddress, amount, days, relay = false) { - let tx, txReceipt; - let investInEth = (tokenAddress == ETH_TOKEN) ? true : false; - - if (investInEth) { - // const bef = (await deployer.provider.getBalance(infrastructure.address)).toString() - // console.log('infra before', bef); - // console.log({ to: wallet.contractAddress, value: amount }); - - tx = await infrastructure.sendTransaction({ to: wallet.contractAddress, value: amount, gasLimit: 8000000 }); - // tx = await infrastructure.sendTransaction({ to: wallet.contractAddress, value: 100, gasLimit: 8000000 }); - // txReceipt = await wallet.verboseWaitForTransaction(tx); - - // console.log('resu', txReceipt) - // const aft = (await deployer.provider.getBalance(infrastructure.address)).toString() - // const aftW = (await deployer.provider.getBalance(wallet.contractAddress)).toString() - // console.log('infra after', aft); - // console.log('W after', aftW); - // console.log('inc?', aft !== bef) - // return - } - else { - await token.from(infrastructure).transfer(wallet.contractAddress, amount); - } - const params = [wallet.contractAddress, tokenAddress, amount, 0]; - if (relay) { - txReceipt = await manager.relay(investManager, 'addInvestment', params, wallet, [owner]); - } - else { - // console.log(owner.address, 'bal=', await deployer.provider.getBalance(wallet.contractAddress), 'p', wallet.contractAddress, tokenAddress, amount.toString(), 0); - - tx = await investManager.from(owner).addInvestment(...params, { gasLimit: 4000000 }); - txReceipt = await investManager.verboseWaitForTransaction(tx); - } - - assert.isTrue(await utils.hasEvent(txReceipt, investManager, "InvestmentAdded"), "should have generated InvestmentAdded event"); - - await accrueInterests(days, investInEth); - - let output = await investManager.getInvestment(wallet.contractAddress, tokenAddress); - assert.isTrue(output._tokenValue > amount, 'investment should have gained value'); - - return output._tokenValue; - } - - async function removeInvestment(tokenAddress, fraction, relay = false) { - - let tx, txReceipt; - let investInEth = (tokenAddress == ETH_TOKEN) ? true : false; - - await addInvestment(tokenAddress, parseEther('0.1'), 365, false); - let before = investInEth ? await cEther.balanceOf(wallet.contractAddress) : await cToken.balanceOf(wallet.contractAddress); - - const params = [wallet.contractAddress, tokenAddress, fraction]; - if (relay) { - txReceipt = await manager.relay(investManager, 'removeInvestment', params, wallet, [owner]); - } - else { - tx = await investManager.from(owner).removeInvestment(...params, { gasLimit: 400000 }); - txReceipt = await investManager.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, investManager, "InvestmentRemoved"), "should have generated InvestmentRemoved event"); - - let after = investInEth ? await cEther.balanceOf(wallet.contractAddress) : await cToken.balanceOf(wallet.contractAddress); - assert.isTrue(after == Math.ceil(before * (10000 - fraction) / 10000), "should have removed the correct fraction"); - } - - async function accrueInterests(days, investInEth) { - let tx, txReceipt; - // genrate borrows to create interests - await comptroller.from(borrower).enterMarkets([cEther.contractAddress, cToken.contractAddress], { gasLimit: 200000 }); - if (investInEth) { - await token.from(borrower).approve(cToken.contractAddress, parseEther('20')); - await cToken.from(borrower).mint(parseEther('20')); - tx = await cEther.from(borrower).borrow(parseEther('0.1'), { gasLimit: 8000000 }); - txReceipt = await cEther.verboseWaitForTransaction(tx); - console.log('EVVVV:', utils.parseLogs(txReceipt, cEther, 'Failure')); - - assert.isTrue(await utils.hasEvent(txReceipt, cEther, "Borrow"), "should have generated Borrow event"); - } - else { - await cEther.from(borrower).mint({ value: parseEther('2') }); - tx = await cToken.from(borrower).borrow(parseEther('0.1')); - txReceipt = await cToken.verboseWaitForTransaction(tx); - assert.isTrue(await utils.hasEvent(txReceipt, cToken, "Borrow"), "should have generated Borrow event"); - } - // increase time to accumulate interests - await manager.increaseTime(3600 * 24 * days); - await cToken.accrueInterest(); - await cEther.accrueInterest(); - } - - describe("Add Investment", () => { - - it('should invest in ERC20 for 1 year and gain interests (blockchain tx)', async () => { - await addInvestment(token.contractAddress, parseEther('1'), 365, false); - }); - - it('should invest in ERC20 for 1 year and gain interests (relay tx)', async () => { - await addInvestment(token.contractAddress, parseEther('1'), 365, true); - }); - - it('should invest in ETH for 1 year and gain interests (blockchain tx)', async () => { - await addInvestment(ETH_TOKEN, parseEther('1'), 365, false); - }); - - it('should invest in ETH for 1 year and gain interests (relay tx)', async () => { - await addInvestment(ETH_TOKEN, parseEther('1'), 365, true); - }); + } + function testRemoveETHInvestment(fraction, relay) { + it(`should remove ${fraction / 100}% of an ETH investment (${relay ? "relay" : "blockchain"} tx)`, async () => { + await removeInvestment(token.contractAddress, fraction, relay); }); - - describe("Remove Investment", () => { - function testRemoveERC20Investment(fraction, relay) { - it(`should remove ${fraction / 100}% of an ERC20 investment (${relay ? "relay" : "blockchain"} tx)`, async () => { - await removeInvestment(token.contractAddress, fraction, relay); - }); - } - function testRemoveETHInvestment(fraction, relay) { - it(`should remove ${fraction / 100}% of an ETH investment (${relay ? "relay" : "blockchain"} tx)`, async () => { - await removeInvestment(token.contractAddress, fraction, relay); - }); - } - - for (i = 1; i < 6; i++) { - testRemoveERC20Investment(i * 2000, true); - testRemoveERC20Investment(i * 2000, false); - testRemoveETHInvestment(i * 2000, true); - testRemoveETHInvestment(i * 2000, false); - } - }); - + } + + for (let i = 1; i < 6; i += 1) { + testRemoveERC20Investment(i * 2000, true); + testRemoveERC20Investment(i * 2000, false); + testRemoveETHInvestment(i * 2000, true); + testRemoveETHInvestment(i * 2000, false); + } }); - -}); \ No newline at end of file + }); +}); diff --git a/test/compoundManager_loan.js b/test/compoundManager_loan.js index 87a675a20..8c536616e 100644 --- a/test/compoundManager_loan.js +++ b/test/compoundManager_loan.js @@ -1,4 +1,6 @@ -const { parseEther, formatBytes32String, bigNumberify } = require('ethers').utils; +/* global accounts, utils */ +const ethers = require("ethers"); +const { parseEther, bigNumberify } = require("ethers").utils; const GuardianStorage = require("../build/GuardianStorage"); const Registry = require("../build/ModuleRegistry"); @@ -16,430 +18,549 @@ const CEther = require("../build/CEther"); const CErc20 = require("../build/CErc20"); const CompoundRegistry = require("../build/CompoundRegistry"); -const WAD = bigNumberify('1000000000000000000') // 10**18 -const ETH_EXCHANGE_RATE = bigNumberify('200000000000000000000000000'); +const WAD = bigNumberify("1000000000000000000"); // 10**18 +const ETH_EXCHANGE_RATE = bigNumberify("200000000000000000000000000"); const ERC20 = require("../build/TestERC20"); -const ETH_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; + +const { ETH_TOKEN } = require("../utils/utilities.js"); const TestManager = require("../utils/test-manager"); + const ZERO_BYTES32 = ethers.constants.HashZero; -describe("Test Loan Module", function () { - this.timeout(1000000); - - const manager = new TestManager(); - - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - let liquidityProvider = accounts[2].signer; - let borrower = accounts[3].signer; - - let wallet, loanManager, compoundRegistry, token1, token2, cToken1, cToken2, cEther, comptroller, oracleProxy; - - before(async () => { - deployer = manager.newDeployer(); - - /* Deploy Compound V2 Architecture */ - - // deploy price oracle - const oracle = await deployer.deploy(PriceOracle); - // deploy comptroller - const comptrollerProxy = await deployer.deploy(Unitroller); - const comptrollerImpl = await deployer.deploy(Comptroller); - await comptrollerProxy._setPendingImplementation(comptrollerImpl.contractAddress); - await comptrollerImpl._become(comptrollerProxy.contractAddress, oracle.contractAddress, WAD.div(10), 5, false, { gasLimit: 500000 }); - comptroller = deployer.wrapDeployedContract(Comptroller, comptrollerProxy.contractAddress); - // deploy Interest rate model - const interestModel = await deployer.deploy(InterestModel, {}, WAD.mul(250).div(10000), WAD.mul(2000).div(10000)); - // deploy CEther - cEther = await deployer.deploy( - CEther, - {}, - comptroller.contractAddress, - interestModel.contractAddress, - ETH_EXCHANGE_RATE, - "Compound Ether", - "cETH", - 8); - - // deploy token - token1 = await deployer.deploy(ERC20, {}, [infrastructure.address, liquidityProvider.address, borrower.address], 10000000, 18); - token2 = await deployer.deploy(ERC20, {}, [infrastructure.address, liquidityProvider.address, borrower.address], 10000000, 18); - // deploy CToken - cToken1 = await deployer.deploy( - CErc20, - {}, - token1.contractAddress, - comptroller.contractAddress, - interestModel.contractAddress, - ETH_EXCHANGE_RATE, - "Compound Token 1", - "cTOKEN1", - 18); - cToken2 = await deployer.deploy( - CErc20, - {}, - token2.contractAddress, - comptroller.contractAddress, - interestModel.contractAddress, - ETH_EXCHANGE_RATE, - "Compound Token 2", - "cTOKEN2", - 18); - - // add price to Oracle - await oracle.setUnderlyingPrice(cToken1.contractAddress, WAD.div(10)); - await oracle.setUnderlyingPrice(cToken2.contractAddress, WAD.div(10)); - // list cToken in Comptroller - await comptroller._supportMarket(cEther.contractAddress, { gasLimit: 500000 }); - await comptroller._supportMarket(cToken1.contractAddress, { gasLimit: 500000 }); - await comptroller._supportMarket(cToken2.contractAddress, { gasLimit: 500000 }); - // deploy Price Oracle proxy - oracleProxy = await deployer.deploy(PriceOracleProxy, {}, comptroller.contractAddress, oracle.contractAddress, cEther.contractAddress); - await comptroller._setPriceOracle(oracleProxy.contractAddress, { gasLimit: 200000 }); - // set collateral factor - await comptroller._setCollateralFactor(cToken1.contractAddress, WAD.div(10), { gasLimit: 500000 }); - await comptroller._setCollateralFactor(cToken2.contractAddress, WAD.div(10), { gasLimit: 500000 }); - await comptroller._setCollateralFactor(cEther.contractAddress, WAD.div(10), { gasLimit: 500000 }); - - // add liquidity to tokens - await cEther.from(liquidityProvider).mint({ value: parseEther('100') }); - await token1.from(liquidityProvider).approve(cToken1.contractAddress, parseEther('10')); - await cToken1.from(liquidityProvider).mint(parseEther('10')); - await token2.from(liquidityProvider).approve(cToken2.contractAddress, parseEther('10')); - await cToken2.from(liquidityProvider).mint(parseEther('10')); - - /* Deploy Argent Architecture */ - - compoundRegistry = await deployer.deploy(CompoundRegistry); - await compoundRegistry.addCToken(ETH_TOKEN, cEther.contractAddress); - await compoundRegistry.addCToken(token1.contractAddress, cToken1.contractAddress); - await compoundRegistry.addCToken(token2.contractAddress, cToken2.contractAddress); - const registry = await deployer.deploy(Registry); - const guardianStorage = await deployer.deploy(GuardianStorage); - - loanManager = await deployer.deploy( - CompoundManager, - {}, - registry.contractAddress, - guardianStorage.contractAddress, - comptroller.contractAddress, - compoundRegistry.contractAddress - ); +describe("Loan Module", function () { + this.timeout(1000000); + + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + const liquidityProvider = accounts[2].signer; + const borrower = accounts[3].signer; + + let deployer; + let wallet; + let loanManager; + let compoundRegistry; + let token1; + let token2; + let cToken1; + let cToken2; + let cEther; + let comptroller; + let oracleProxy; + + before(async () => { + deployer = manager.newDeployer(); + + /* Deploy Compound V2 Architecture */ + + // deploy price oracle + const oracle = await deployer.deploy(PriceOracle); + // deploy comptroller + const comptrollerProxy = await deployer.deploy(Unitroller); + const comptrollerImpl = await deployer.deploy(Comptroller); + await comptrollerProxy._setPendingImplementation(comptrollerImpl.contractAddress); + await comptrollerImpl._become(comptrollerProxy.contractAddress, oracle.contractAddress, WAD.div(10), 5, false, { gasLimit: 500000 }); + comptroller = deployer.wrapDeployedContract(Comptroller, comptrollerProxy.contractAddress); + // deploy Interest rate model + const interestModel = await deployer.deploy(InterestModel, {}, WAD.mul(250).div(10000), WAD.mul(2000).div(10000)); + // deploy CEther + cEther = await deployer.deploy( + CEther, + {}, + comptroller.contractAddress, + interestModel.contractAddress, + ETH_EXCHANGE_RATE, + "Compound Ether", + "cETH", + 8, + ); + + // deploy token + token1 = await deployer.deploy(ERC20, {}, [infrastructure.address, liquidityProvider.address, borrower.address], 10000000, 18); + token2 = await deployer.deploy(ERC20, {}, [infrastructure.address, liquidityProvider.address, borrower.address], 10000000, 18); + // deploy CToken + cToken1 = await deployer.deploy( + CErc20, + {}, + token1.contractAddress, + comptroller.contractAddress, + interestModel.contractAddress, + ETH_EXCHANGE_RATE, + "Compound Token 1", + "cTOKEN1", + 18, + ); + cToken2 = await deployer.deploy( + CErc20, + {}, + token2.contractAddress, + comptroller.contractAddress, + interestModel.contractAddress, + ETH_EXCHANGE_RATE, + "Compound Token 2", + "cTOKEN2", + 18, + ); + + // add price to Oracle + await oracle.setUnderlyingPrice(cToken1.contractAddress, WAD.div(10)); + await oracle.setUnderlyingPrice(cToken2.contractAddress, WAD.div(10)); + // list cToken in Comptroller + await comptroller._supportMarket(cEther.contractAddress, { gasLimit: 500000 }); + await comptroller._supportMarket(cToken1.contractAddress, { gasLimit: 500000 }); + await comptroller._supportMarket(cToken2.contractAddress, { gasLimit: 500000 }); + // deploy Price Oracle proxy + oracleProxy = await deployer.deploy(PriceOracleProxy, {}, comptroller.contractAddress, oracle.contractAddress, cEther.contractAddress); + await comptroller._setPriceOracle(oracleProxy.contractAddress, { gasLimit: 200000 }); + // set collateral factor + await comptroller._setCollateralFactor(cToken1.contractAddress, WAD.div(10), { gasLimit: 500000 }); + await comptroller._setCollateralFactor(cToken2.contractAddress, WAD.div(10), { gasLimit: 500000 }); + await comptroller._setCollateralFactor(cEther.contractAddress, WAD.div(10), { gasLimit: 500000 }); + + // add liquidity to tokens + await cEther.from(liquidityProvider).mint({ value: parseEther("100") }); + await token1.from(liquidityProvider).approve(cToken1.contractAddress, parseEther("10")); + await cToken1.from(liquidityProvider).mint(parseEther("10")); + await token2.from(liquidityProvider).approve(cToken2.contractAddress, parseEther("10")); + await cToken2.from(liquidityProvider).mint(parseEther("10")); + + /* Deploy Argent Architecture */ + + compoundRegistry = await deployer.deploy(CompoundRegistry); + await compoundRegistry.addCToken(ETH_TOKEN, cEther.contractAddress); + await compoundRegistry.addCToken(token1.contractAddress, cToken1.contractAddress); + await compoundRegistry.addCToken(token2.contractAddress, cToken2.contractAddress); + const registry = await deployer.deploy(Registry); + const guardianStorage = await deployer.deploy(GuardianStorage); + + loanManager = await deployer.deploy( + CompoundManager, + {}, + registry.contractAddress, + guardianStorage.contractAddress, + comptroller.contractAddress, + compoundRegistry.contractAddress, + ); + }); + + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [loanManager.contractAddress]); + }); + + async function fundWallet({ ethAmount, token1Amount, token2Amount = 0 }) { + if (ethAmount > 0) await infrastructure.sendTransaction({ to: wallet.contractAddress, value: ethAmount }); + if (token1Amount > 0) await token1.from(infrastructure).transfer(wallet.contractAddress, token1Amount); + if (token2Amount > 0) await token2.from(infrastructure).transfer(wallet.contractAddress, token2Amount); + } + + describe("Loan", () => { + async function testOpenLoan({ + collateral, collateralAmount, debt, debtAmount, relayed, + }) { + const collateralBefore = (collateral === ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) + : await collateral.balanceOf(wallet.contractAddress); + const debtBefore = (debt === ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) + : await debt.balanceOf(wallet.contractAddress); + + const params = [ + wallet.contractAddress, + (collateral === ETH_TOKEN) ? ETH_TOKEN : collateral.contractAddress, + collateralAmount, + (debt === ETH_TOKEN) ? ETH_TOKEN : debt.contractAddress, + debtAmount]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(loanManager, "openLoan", params, wallet, [owner]); + } else { + const tx = await loanManager.from(owner).openLoan(...params, { gasLimit: 2000000 }); + txReceipt = await loanManager.verboseWaitForTransaction(tx); + } + assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "LoanOpened"), "should have generated LoanOpened event"); + const loanId = txReceipt.events.find((e) => e.event === "LoanOpened").args._loanId; + assert.isDefined(loanId, "Loan ID should be defined"); + + const collateralAfter = (collateral === ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) + : await collateral.balanceOf(wallet.contractAddress); + const debtAfter = (debt === ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) + : await debt.balanceOf(wallet.contractAddress); + + assert.isTrue(collateralBefore.sub(collateralAfter).eq(collateralAmount), + `wallet should have ${collateralAmount} less ETH (relayed: ${relayed})`); + assert.isTrue(debtAfter.sub(debtBefore).eq(debtAmount), `wallet should have ${debtAmount} more token (relayed: ${relayed})`); + + return loanId; + } + + async function testChangeCollateral({ + loanId, collateral, amount, add, relayed, + }) { + const collateralBalanceBefore = (collateral === ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) + : await collateral.balanceOf(wallet.contractAddress); + + const method = add ? "addCollateral" : "removeCollateral"; + const params = [ + wallet.contractAddress, + loanId, + (collateral === ETH_TOKEN) ? ETH_TOKEN : collateral.contractAddress, + amount]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(loanManager, method, params, wallet, [owner]); + } else { + const tx = await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); + txReceipt = await loanManager.verboseWaitForTransaction(tx); + } + const collateralBalanceAfter = (collateral === ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) + : await collateral.balanceOf(wallet.contractAddress); + if (add) { + assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "CollateralAdded"), "should have generated CollateralAdded event"); + assert.isTrue(collateralBalanceAfter.eq(collateralBalanceBefore.sub(amount)), + `wallet collateral should have decreased by ${amount} (relayed: ${relayed})`); + } else { + assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "CollateralRemoved"), "should have generated CollateralRemoved event"); + assert.isTrue(collateralBalanceAfter.eq(collateralBalanceBefore.add(amount)), + `wallet collateral should have invcreased by ${amount} (relayed: ${relayed})`); + } + } + + async function testChangeDebt({ + loanId, debtToken, amount, add, relayed, + }) { + const debtBalanceBefore = (debtToken === ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) + : await debtToken.balanceOf(wallet.contractAddress); + + const method = add ? "addDebt" : "removeDebt"; + const params = [ + wallet.contractAddress, + loanId, + (debtToken === ETH_TOKEN) ? ETH_TOKEN : debtToken.contractAddress, + amount]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(loanManager, method, params, wallet, [owner]); + } else { + const tx = await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); + txReceipt = await loanManager.verboseWaitForTransaction(tx); + } + const debtBalanceAfter = (debtToken === ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) + : await debtToken.balanceOf(wallet.contractAddress); + if (add) { + assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "DebtAdded"), "should have generated DebtAdded event"); + assert.isTrue(debtBalanceAfter.eq(debtBalanceBefore.add(amount)), `wallet debt should have increase by ${amount} (relayed: ${relayed})`); + } else { + assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "DebtRemoved"), "should have generated DebtRemoved event"); + assert.isTrue(debtBalanceAfter.eq(debtBalanceBefore.sub(amount)), `wallet debt should have decreased by ${amount} (relayed: ${relayed})`); + } + } + + describe("Open Loan", () => { + it("should borrow token with ETH as collateral (blockchain tx)", async () => { + const collateralAmount = parseEther("0.1"); + const debtAmount = parseEther("0.05"); + await fundWallet({ ethAmount: collateralAmount, token1Amount: 0 }); + await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount, debt: token1, debtAmount, relayed: false, + }); + }); + + it("should borrow ETH with token as collateral (blockchain tx)", async () => { + const collateralAmount = parseEther("0.5"); + const debtAmount = parseEther("0.001"); + await fundWallet({ ethAmount: 0, token1Amount: collateralAmount }); + await testOpenLoan({ + collateral: token1, collateralAmount, debt: ETH_TOKEN, debtAmount, relayed: false, + }); + }); + + it("should borrow token with ETH as collateral (relay tx)", async () => { + const collateralAmount = parseEther("0.1"); + const debtAmount = parseEther("0.05"); + await fundWallet({ ethAmount: collateralAmount, token1Amount: 0 }); + await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount, debt: token1, debtAmount, relayed: true, + }); + }); + + it("should borrow ETH with token as collateral (relay tx)", async () => { + const collateralAmount = parseEther("0.5"); + const debtAmount = parseEther("0.001"); + await fundWallet({ ethAmount: 0, token1Amount: collateralAmount }); + await testOpenLoan({ + collateral: token1, collateralAmount, debt: ETH_TOKEN, debtAmount, relayed: true, + }); + }); + + it("should get the info of a loan", async () => { + const collateralAmount = parseEther("0.1"); + const debtAmount = parseEther("0.01"); + await fundWallet({ ethAmount: collateralAmount, token1Amount: 0 }); + await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount, debt: token1, debtAmount, relayed: false, + }); + const loan = await loanManager.getLoan(wallet.contractAddress, ZERO_BYTES32); + assert.isTrue(loan._status === 1 && loan._ethValue > 0, "should have obtained the info of the loan"); + }); }); - beforeEach(async () => { - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [loanManager.contractAddress]); + describe("Add/Remove Collateral", () => { + it("should add ETH collateral to a loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.2"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.1"), debt: token1, debtAmount: parseEther("0.05"), relayed: false, + }); + await testChangeCollateral({ + loanId, collateral: ETH_TOKEN, amount: parseEther("0.1"), add: true, relayed: false, + }); + }); + + it("should add ETH collateral to a loan (relayed tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.2"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.1"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeCollateral({ + loanId, collateral: ETH_TOKEN, amount: parseEther("0.1"), add: true, relayed: true, + }); + }); + + it("should remove ETH collateral from a loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.2"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.2"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeCollateral({ + loanId, collateral: ETH_TOKEN, amount: parseEther("0.001"), add: false, relayed: false, + }); + }); + + it("should remove ETH collateral from a loan (relayed tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.2"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.1"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeCollateral({ + loanId, collateral: ETH_TOKEN, amount: parseEther("0.001"), add: false, relayed: true, + }); + }); + + it("should add token collateral to a loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: 0, token1Amount: parseEther("0.6") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testChangeCollateral({ + loanId, collateral: token1, amount: parseEther("0.1"), add: true, relayed: false, + }); + }); + + it("should add token collateral to a loan (relayed tx)", async () => { + await fundWallet({ ethAmount: 0, token1Amount: parseEther("0.6") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testChangeCollateral({ + loanId, collateral: token1, amount: parseEther("0.1"), add: true, relayed: true, + }); + }); + + it("should remove token collateral from a loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: 0, token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testChangeCollateral({ + loanId, collateral: token1, amount: parseEther("0.1"), add: false, relayed: false, + }); + }); + + it("should remove token collateral from a loan (relayed tx)", async () => { + await fundWallet({ ethAmount: 0, token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testChangeCollateral({ + loanId, collateral: token1, amount: parseEther("0.1"), add: false, relayed: true, + }); + }); }); - async function fundWallet({ ethAmount, token1Amount, token2Amount = 0 }) { - if (ethAmount > 0) await infrastructure.sendTransaction({ to: wallet.contractAddress, value: ethAmount }); - if (token1Amount > 0) await token1.from(infrastructure).transfer(wallet.contractAddress, token1Amount); - if (token2Amount > 0) await token2.from(infrastructure).transfer(wallet.contractAddress, token2Amount); - } + describe("Increase/Decrease Debt", () => { + it("should increase ETH debt to a token1/ETH loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: 0, token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: ETH_TOKEN, amount: parseEther("0.001"), add: true, relayed: false, + }); + }); - describe("Loan", () => { - - async function testOpenLoan({ collateral, collateralAmount, debt, debtAmount, relayed }) { - const collateralBefore = (collateral == ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) : await collateral.balanceOf(wallet.contractAddress); - const debtBefore = (debt == ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) : await debt.balanceOf(wallet.contractAddress); - - const params = [ - wallet.contractAddress, - (collateral == ETH_TOKEN) ? ETH_TOKEN : collateral.contractAddress, - collateralAmount, - (debt == ETH_TOKEN) ? ETH_TOKEN : debt.contractAddress, - debtAmount]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(loanManager, 'openLoan', params, wallet, [owner]); - } else { - const tx = await loanManager.from(owner).openLoan(...params, { gasLimit: 2000000 }); - txReceipt = await loanManager.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "LoanOpened"), "should have generated LoanOpened event"); - const loanId = txReceipt.events.find(e => e.event === 'LoanOpened').args._loanId; - assert.isDefined(loanId, 'Loan ID should be defined') - - const collateralAfter = (collateral == ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) : await collateral.balanceOf(wallet.contractAddress); - const debtAfter = (debt == ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) : await debt.balanceOf(wallet.contractAddress); - - assert.isTrue(collateralBefore.sub(collateralAfter).eq(collateralAmount), `wallet should have ${collateralAmount} less ETH (relayed: ${relayed})`); - assert.isTrue(debtAfter.sub(debtBefore).eq(debtAmount), `wallet should have ${debtAmount} more token (relayed: ${relayed})`); - - return loanId; - } + it("should increase ETH debt to a token1/ETH loan (relayed tx)", async () => { + await fundWallet({ ethAmount: 0, token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: ETH_TOKEN, amount: parseEther("0.001"), add: true, relayed: true, + }); + }); - async function testChangeCollateral({ loanId, collateral, amount, add, relayed }) { - - const collateralBalanceBefore = (collateral == ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) : await collateral.balanceOf(wallet.contractAddress); - - const method = add ? 'addCollateral' : 'removeCollateral'; - const params = [ - wallet.contractAddress, - loanId, - (collateral == ETH_TOKEN) ? ETH_TOKEN : collateral.contractAddress, - amount]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(loanManager, method, params, wallet, [owner]); - } else { - let tx = await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); - txReceipt = await loanManager.verboseWaitForTransaction(tx); - } - const collateralBalanceAfter = (collateral == ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) : await collateral.balanceOf(wallet.contractAddress); - if (add) { - assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "CollateralAdded"), "should have generated CollateralAdded event"); - assert.isTrue(collateralBalanceAfter.eq(collateralBalanceBefore.sub(amount)), `wallet collateral should have decreased by ${amount} (relayed: ${relayed})`); - } - else { - assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "CollateralRemoved"), "should have generated CollateralRemoved event"); - assert.isTrue(collateralBalanceAfter.eq(collateralBalanceBefore.add(amount)), `wallet collateral should have invcreased by ${amount} (relayed: ${relayed})`); - } - } + it("should increase token1 debt to a ETH/token1 loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.5"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.5"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: token1, amount: parseEther("0.01"), add: true, relayed: false, + }); + }); + + it("should increase token1 debt to a ETH/token1 loan (relayed tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.5"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.5"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: token1, amount: parseEther("0.01"), add: true, relayed: true, + }); + }); + + it("should increase token2 debt to a ETH/token1 loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.5"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.5"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: token2, amount: parseEther("0.01"), add: true, relayed: false, + }); + }); + + it("should increase token2 debt to a ETH/token1 loan (relayed tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.5"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.5"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: token2, amount: parseEther("0.01"), add: true, relayed: true, + }); + }); + + it("should repay ETH debt to a token1/ETH loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: 0, token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: ETH_TOKEN, amount: parseEther("0.0005"), add: false, relayed: false, + }); + }); + + it("should repay ETH debt to a token1/ETH loan (relay tx)", async () => { + await fundWallet({ ethAmount: 0, token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: ETH_TOKEN, amount: parseEther("0.0005"), add: false, relayed: true, + }); + }); - async function testChangeDebt({ loanId, debtToken, amount, add, relayed }) { - - const debtBalanceBefore = (debtToken == ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) : await debtToken.balanceOf(wallet.contractAddress); - - const method = add ? 'addDebt' : 'removeDebt'; - const params = [ - wallet.contractAddress, - loanId, - (debtToken == ETH_TOKEN) ? ETH_TOKEN : debtToken.contractAddress, - amount]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(loanManager, method, params, wallet, [owner]); - } else { - let tx = await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); - txReceipt = await loanManager.verboseWaitForTransaction(tx); - } - const debtBalanceAfter = (debtToken == ETH_TOKEN) ? await deployer.provider.getBalance(wallet.contractAddress) : await debtToken.balanceOf(wallet.contractAddress); - if (add) { - assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "DebtAdded"), "should have generated DebtAdded event"); - assert.isTrue(debtBalanceAfter.eq(debtBalanceBefore.add(amount)), `wallet debt should have increase by ${amount} (relayed: ${relayed})`); - } - else { - assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "DebtRemoved"), "should have generated DebtRemoved event"); - assert.isTrue(debtBalanceAfter.eq(debtBalanceBefore.sub(amount)), `wallet debt should have decreased by ${amount} (relayed: ${relayed})`); - } + it("should repay token1 debt to a ETH/token1 loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.5"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.5"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: token1, amount: parseEther("0.005"), add: true, relayed: false, + }); + }); + + it("should repay token1 debt to a ETH/token1 loan (relayed tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.5"), token1Amount: 0 }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.5"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: token1, amount: parseEther("0.005"), add: true, relayed: true, + }); + }); + }); + + describe("Close Loan", () => { + async function testCloseLoan({ loanId, relayed, debtMarkets = 1 }) { + const marketsBefore = await comptroller.getAssetsIn(wallet.contractAddress); + const method = "closeLoan"; + const params = [wallet.contractAddress, loanId]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(loanManager, method, params, wallet, [owner], accounts[9].signer, false, 2000000); + } else { + const tx = await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); + txReceipt = await loanManager.verboseWaitForTransaction(tx); } + assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "LoanClosed"), "should have generated LoanClosed event"); - describe("Open Loan", () => { - - it('should borrow token with ETH as collateral (blockchain tx)', async () => { - let collateralAmount = parseEther('0.1'); - let debtAmount = parseEther('0.05'); - await fundWallet({ ethAmount: collateralAmount, token1Amount: 0 }); - await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount, debt: token1, debtAmount, relayed: false }); - }); - - it('should borrow ETH with token as collateral (blockchain tx)', async () => { - let collateralAmount = parseEther('0.5'); - let debtAmount = parseEther('0.001'); - await fundWallet({ ethAmount: 0, token1Amount: collateralAmount }); - await testOpenLoan({ collateral: token1, collateralAmount, debt: ETH_TOKEN, debtAmount, relayed: false }); - }); - - it('should borrow token with ETH as collateral (relay tx)', async () => { - let collateralAmount = parseEther('0.1'); - let debtAmount = parseEther('0.05'); - await fundWallet({ ethAmount: collateralAmount, token1Amount: 0 }); - await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount, debt: token1, debtAmount, relayed: true }); - }); - - it('should borrow ETH with token as collateral (relay tx)', async () => { - let collateralAmount = parseEther('0.5'); - let debtAmount = parseEther('0.001'); - await fundWallet({ ethAmount: 0, token1Amount: collateralAmount }); - await testOpenLoan({ collateral: token1, collateralAmount, debt: ETH_TOKEN, debtAmount, relayed: true }); - }); - - it('should get the info of a loan', async () => { - let collateralAmount = parseEther('0.1'); - let debtAmount = parseEther('0.01'); - await fundWallet({ ethAmount: collateralAmount, token1Amount: 0 }); - await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount, debt: token1, debtAmount, relayed: false }); - let loan = await loanManager.getLoan(wallet.contractAddress, ZERO_BYTES32); - assert.isTrue(loan._status == 1 && loan._ethValue > 0, "should have obtained the info of the loan"); - }); - }); - - describe("Add/Remove Collateral", () => { - - it('should add ETH collateral to a loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.2'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.1'), debt: token1, debtAmount: parseEther('0.05'), relayed: false }); - await testChangeCollateral({ loanId: loanId, collateral: ETH_TOKEN, amount: parseEther('0.1'), add: true, relayed: false }); - }); - - it('should add ETH collateral to a loan (relayed tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.2'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.1'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeCollateral({ loanId: loanId, collateral: ETH_TOKEN, amount: parseEther('0.1'), add: true, relayed: true }); - }); - - it('should remove ETH collateral from a loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.2'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.2'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeCollateral({ loanId: loanId, collateral: ETH_TOKEN, amount: parseEther('0.001'), add: false, relayed: false }); - }); - - it('should remove ETH collateral from a loan (relayed tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.2'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.1'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeCollateral({ loanId: loanId, collateral: ETH_TOKEN, amount: parseEther('0.001'), add: false, relayed: true }); - }); - - it('should add token collateral to a loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: 0, token1Amount: parseEther('0.6') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testChangeCollateral({ loanId: loanId, collateral: token1, amount: parseEther('0.1'), add: true, relayed: false }); - }); - - it('should add token collateral to a loan (relayed tx)', async () => { - await fundWallet({ ethAmount: 0, token1Amount: parseEther('0.6') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testChangeCollateral({ loanId: loanId, collateral: token1, amount: parseEther('0.1'), add: true, relayed: true }); - }); - - it('should remove token collateral from a loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: 0, token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testChangeCollateral({ loanId: loanId, collateral: token1, amount: parseEther('0.1'), add: false, relayed: false }); - }); - - it('should remove token collateral from a loan (relayed tx)', async () => { - await fundWallet({ ethAmount: 0, token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testChangeCollateral({ loanId: loanId, collateral: token1, amount: parseEther('0.1'), add: false, relayed: true }); - }); - }); - - describe("Increase/Decrease Debt", () => { - - it('should increase ETH debt to a token1/ETH loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: 0, token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: ETH_TOKEN, amount: parseEther('0.001'), add: true, relayed: false }); - }); - - it('should increase ETH debt to a token1/ETH loan (relayed tx)', async () => { - await fundWallet({ ethAmount: 0, token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: ETH_TOKEN, amount: parseEther('0.001'), add: true, relayed: true }); - }); - - it('should increase token1 debt to a ETH/token1 loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.5'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.5'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: token1, amount: parseEther('0.01'), add: true, relayed: false }); - }); - - it('should increase token1 debt to a ETH/token1 loan (relayed tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.5'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.5'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: token1, amount: parseEther('0.01'), add: true, relayed: true }); - }); - - it('should increase token2 debt to a ETH/token1 loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.5'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.5'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: token2, amount: parseEther('0.01'), add: true, relayed: false }); - }); - - it('should increase token2 debt to a ETH/token1 loan (relayed tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.5'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.5'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: token2, amount: parseEther('0.01'), add: true, relayed: true }); - }); - - it('should repay ETH debt to a token1/ETH loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: 0, token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: ETH_TOKEN, amount: parseEther('0.0005'), add: false, relayed: false }); - }); - - it('should repay ETH debt to a token1/ETH loan (relay tx)', async () => { - await fundWallet({ ethAmount: 0, token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: ETH_TOKEN, amount: parseEther('0.0005'), add: false, relayed: true }); - }); - - it('should repay token1 debt to a ETH/token1 loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.5'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.5'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: token1, amount: parseEther('0.005'), add: true, relayed: false }); - }); - - it('should repay token1 debt to a ETH/token1 loan (relayed tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.5'), token1Amount: 0 }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.5'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: token1, amount: parseEther('0.005'), add: true, relayed: true }); - }); - }); - - describe("Close Loan", () => { - - async function testCloseLoan({ loanId, relayed, debtMarkets = 1 }) { - - let marketsBefore = await comptroller.getAssetsIn(wallet.contractAddress); - const method = 'closeLoan' - const params = [wallet.contractAddress, loanId]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(loanManager, method, params, wallet, [owner], accounts[9].signer, false, 2000000); - } else { - let tx = await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); - txReceipt = await loanManager.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, loanManager, "LoanClosed"), "should have generated LoanClosed event"); - - let marketsAfter = await comptroller.getAssetsIn(wallet.contractAddress); - assert.isTrue(marketsAfter.length == marketsBefore.length - debtMarkets, `should have exited ${debtMarkets} market (relayed: ${relayed})`); - } - - it('should close an ETH/token1 loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.5'), token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.1'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testCloseLoan({ loanId, relayed: false }); - }); - - it('should close an ETH/token1 loan (relayed tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.5'), token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.1'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testCloseLoan({ loanId, relayed: true }); - }); - - it('should close an token1/ETH loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.1'), token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testCloseLoan({ loanId, relayed: false }); - }); - - it('should close an token1/ETH loan (relayed tx)', async () => { - await fundWallet({ ethAmount: parseEther('0.1'), token1Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: token1, collateralAmount: parseEther('0.5'), debt: ETH_TOKEN, debtAmount: parseEther('0.001'), relayed: false }); - await testCloseLoan({ loanId, relayed: true }); - }); - - it('should close an ETH/token1+token2 loan (blockchain tx)', async () => { - await fundWallet({ ethAmount: parseEther('1'), token1Amount: parseEther('0.5'), token2Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.2'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: token2, amount: parseEther('0.001'), add: true, relayed: false }); - await testCloseLoan({ loanId, relayed: false, debtMarkets: 2 }); - }); - - it('should close an ETH/token1+token2 loan (relayed tx)', async () => { - await fundWallet({ ethAmount: parseEther('1'), token1Amount: parseEther('0.5'), token2Amount: parseEther('0.5') }); - const loanId = await testOpenLoan({ collateral: ETH_TOKEN, collateralAmount: parseEther('0.2'), debt: token1, debtAmount: parseEther('0.01'), relayed: false }); - await testChangeDebt({ loanId: loanId, debtToken: token2, amount: parseEther('0.001'), add: true, relayed: false }); - await testCloseLoan({ loanId, relayed: true, debtMarkets: 2 }); - }); + const marketsAfter = await comptroller.getAssetsIn(wallet.contractAddress); + assert.isTrue(marketsAfter.length === marketsBefore.length - debtMarkets, `should have exited ${debtMarkets} market (relayed: ${relayed})`); + } + it("should close an ETH/token1 loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.5"), token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.1"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testCloseLoan({ loanId, relayed: false }); + }); + + it("should close an ETH/token1 loan (relayed tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.5"), token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.1"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testCloseLoan({ loanId, relayed: true }); + }); + + it("should close an token1/ETH loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.1"), token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testCloseLoan({ loanId, relayed: false }); + }); + + it("should close an token1/ETH loan (relayed tx)", async () => { + await fundWallet({ ethAmount: parseEther("0.1"), token1Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: token1, collateralAmount: parseEther("0.5"), debt: ETH_TOKEN, debtAmount: parseEther("0.001"), relayed: false, + }); + await testCloseLoan({ loanId, relayed: true }); + }); + + it("should close an ETH/token1+token2 loan (blockchain tx)", async () => { + await fundWallet({ ethAmount: parseEther("1"), token1Amount: parseEther("0.5"), token2Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.2"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: token2, amount: parseEther("0.001"), add: true, relayed: false, + }); + await testCloseLoan({ loanId, relayed: false, debtMarkets: 2 }); + }); + + it("should close an ETH/token1+token2 loan (relayed tx)", async () => { + await fundWallet({ ethAmount: parseEther("1"), token1Amount: parseEther("0.5"), token2Amount: parseEther("0.5") }); + const loanId = await testOpenLoan({ + collateral: ETH_TOKEN, collateralAmount: parseEther("0.2"), debt: token1, debtAmount: parseEther("0.01"), relayed: false, + }); + await testChangeDebt({ + loanId, debtToken: token2, amount: parseEther("0.001"), add: true, relayed: false, }); + await testCloseLoan({ loanId, relayed: true, debtMarkets: 2 }); + }); }); -}); \ No newline at end of file + }); +}); diff --git a/test/ens.js b/test/ens.js index 96af1fde2..2cb46c762 100644 --- a/test/ens.js +++ b/test/ens.js @@ -1,111 +1,172 @@ -const ENSRegistry = require('../build/ENSRegistry'); -const ENSRegistryWithFallback = require('../build/ENSRegistryWithFallback'); -const ENSManager = require('../build/ArgentENSManager'); -const ENSResolver = require('../build/ArgentENSResolver'); -const ENSReverseRegistrar = require('../build/ReverseRegistrar'); +/* global accounts */ +const ethers = require("ethers"); + +const ENSRegistry = require("../build/ENSRegistry"); +const ENSRegistryWithFallback = require("../build/ENSRegistryWithFallback"); +const ENSManager = require("../build/ArgentENSManager"); +const ENSResolver = require("../build/ArgentENSResolver"); +const ENSReverseRegistrar = require("../build/ReverseRegistrar"); const TestManager = require("../utils/test-manager"); +const utilities = require("../utils/utilities.js"); const ZERO_BYTES32 = ethers.constants.HashZero; -describe("Test ENS contracts", function () { - this.timeout(10000); - - const manager = new TestManager(); - - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - let amanager = accounts[2].signer; - let anonmanager = accounts[3].signer; - - let root = "xyz"; - let subnameWallet = "argent"; - let walletNode = ethers.utils.namehash(subnameWallet + '.' + root); - - let ensRegistry, ensResolver, ensReverse, ensManager; - - beforeEach(async () => { - deployer = manager.newDeployer(); - const ensRegistryWithoutFallback = await deployer.deploy(ENSRegistry); - ensRegistry = await deployer.deploy(ENSRegistryWithFallback, {}, ensRegistryWithoutFallback.contractAddress); - ensResolver = await deployer.deploy(ENSResolver); - ensReverse = await deployer.deploy(ENSReverseRegistrar, {}, ensRegistry.contractAddress, ensResolver.contractAddress); - ensManager = await deployer.deploy(ENSManager, {}, subnameWallet + '.' + root, walletNode, ensRegistry.contractAddress, ensResolver.contractAddress); - await ensResolver.addManager(ensManager.contractAddress); - await ensResolver.addManager(infrastructure.address); - await ensManager.addManager(infrastructure.address); - - await ensRegistry.setSubnodeOwner(ZERO_BYTES32, ethers.utils.keccak256(ethers.utils.toUtf8Bytes(root)), infrastructure.address); - await ensRegistry.setSubnodeOwner(ethers.utils.namehash(root), ethers.utils.keccak256(ethers.utils.toUtf8Bytes(subnameWallet)), ensManager.contractAddress); - await ensRegistry.setSubnodeOwner(ZERO_BYTES32, ethers.utils.keccak256(ethers.utils.toUtf8Bytes('reverse')), infrastructure.address); - await ensRegistry.setSubnodeOwner(ethers.utils.namehash('reverse'), ethers.utils.keccak256(ethers.utils.toUtf8Bytes('addr')), ensReverse.contractAddress); +describe("ENS contracts", function () { + this.timeout(10000); + + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + const amanager = accounts[2].signer; + const anonmanager = accounts[3].signer; + + const root = "xyz"; + const subnameWallet = "argent"; + const walletNode = ethers.utils.namehash(`${subnameWallet}.${root}`); + + let deployer; + let ensRegistry; + let ensResolver; + let ensReverse; + let ensManager; + + beforeEach(async () => { + deployer = manager.newDeployer(); + const ensRegistryWithoutFallback = await deployer.deploy(ENSRegistry); + ensRegistry = await deployer.deploy(ENSRegistryWithFallback, {}, ensRegistryWithoutFallback.contractAddress); + ensResolver = await deployer.deploy(ENSResolver); + ensReverse = await deployer.deploy(ENSReverseRegistrar, {}, ensRegistry.contractAddress, ensResolver.contractAddress); + ensManager = await deployer.deploy(ENSManager, {}, + `${subnameWallet}.${root}`, walletNode, ensRegistry.contractAddress, ensResolver.contractAddress); + await ensResolver.addManager(ensManager.contractAddress); + await ensResolver.addManager(infrastructure.address); + await ensManager.addManager(infrastructure.address); + + await ensRegistry.setSubnodeOwner(ZERO_BYTES32, ethers.utils.keccak256(ethers.utils.toUtf8Bytes(root)), infrastructure.address); + await ensRegistry.setSubnodeOwner( + ethers.utils.namehash(root), ethers.utils.keccak256(ethers.utils.toUtf8Bytes(subnameWallet)), ensManager.contractAddress, + ); + await ensRegistry.setSubnodeOwner(ZERO_BYTES32, ethers.utils.keccak256(ethers.utils.toUtf8Bytes("reverse")), infrastructure.address); + await ensRegistry.setSubnodeOwner( + ethers.utils.namehash("reverse"), ethers.utils.keccak256(ethers.utils.toUtf8Bytes("addr")), ensReverse.contractAddress, + ); + }); + + describe("ENS Manager", () => { + it("should be the owner of the wallet root", async () => { + const nodeOwner = await ensRegistry.owner(walletNode); + assert.equal(nodeOwner, ensManager.contractAddress, "ens manager should be the owner of the wallet root node"); + }); + + it("should return correct ENSResolver", async () => { + const ensResolverOnManager = await ensManager.ensResolver(); + assert.equal(ensResolverOnManager, ensResolver.contractAddress, "should have the correct ENSResolver addrress"); + }); + + it("should register an ENS name", async () => { + const label = "wallet"; + const labelNode = ethers.utils.namehash(`${label}.${subnameWallet}.${root}`); + await ensManager.from(infrastructure).register(label, owner.address); + + const recordExists = await ensRegistry.recordExists(labelNode); + assert.isTrue(recordExists); + const nodeOwner = await ensRegistry.owner(labelNode); + assert.equal(nodeOwner, owner.address); + const res = await ensRegistry.resolver(labelNode); + assert.equal(res, ensResolver.contractAddress); + }); + + it("should return the correct availability for a subnode", async () => { + const label = "wallet"; + const labelNode = ethers.utils.namehash(`${label}.${subnameWallet}.${root}`); + const labelNode1 = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(label)); + // Node is initially available + let available = await ensManager.isAvailable(labelNode1); + assert.isTrue(available); + + // then we register it + await ensManager.from(infrastructure).register(label, owner.address); + + const nodeOwner = await ensRegistry.owner(labelNode); + assert.equal(nodeOwner, owner.address); + + // then the node is unavailable + available = await ensManager.isAvailable(labelNode1); + assert.isFalse(available); + }); + + it("should add a new manager and register an ENS name", async () => { + const label = "wallet"; + const labelNode = ethers.utils.namehash(`${label}.${subnameWallet}.${root}`); + await ensManager.addManager(amanager.address); + await ensManager.from(amanager).register(label, owner.address); + const nodeOwner = await ensRegistry.owner(labelNode); + assert.equal(nodeOwner, owner.address, "new manager should have registered the ens name"); + }); + + it("should fail to register an ENS name when the caller is not a manager", async () => { + const label = "wallet"; + await assert.revert(ensManager.from(anonmanager).register(label, owner.address), "registering should throw"); + }); + + it("should be able to change the root node owner", async () => { + const randomAddress = await utilities.getRandomAddress(); + await ensManager.changeRootnodeOwner(randomAddress); + const rootNodeOwner = await ensRegistry.owner(walletNode); + assert.equal(rootNodeOwner, randomAddress); + }); + + it("should not be able to change the root node owner if not the owner", async () => { + const randomAddress = await utilities.getRandomAddress(); + await assert.revertWith(ensManager.from(amanager).changeRootnodeOwner(randomAddress), "Must be owner"); + }); + + it("should be able to change the ens resolver", async () => { + const randomAddress = await utilities.getRandomAddress(); + await ensManager.changeENSResolver(randomAddress); + const resolver = await ensManager.ensResolver(); + assert.equal(resolver, randomAddress); }); - describe("ENS Manager", () => { - it("should be the owner of the wallet root", async () => { - var owner = await ensRegistry.owner(walletNode); - assert.equal(owner, ensManager.contractAddress, "ens manager should be the owner of the wallet root node"); - }); - - it("should return correct ENSResolver", async () => { - const ensResolverOnManager = await ensManager.ensResolver(); - assert.equal(ensResolverOnManager, ensResolver.contractAddress, 'should have the correct ENSResolver addrress'); - }); - - it("should register an ENS name", async () => { - let label = "wallet"; - let labelNode = ethers.utils.namehash(label + '.' + subnameWallet + "." + root); - await ensManager.from(infrastructure).register(label, owner.address); - - const recordExists = await ensRegistry.recordExists(labelNode); - assert.isTrue(recordExists); - const nodeOwner = await ensRegistry.owner(labelNode); - assert.equal(nodeOwner, owner.address); - const res = await ensRegistry.resolver(labelNode); - assert.equal(res, ensResolver.contractAddress); - }); - - it("should add a new manager and register an ENS name", async () => { - let label = "wallet"; - let labelNode = ethers.utils.namehash(label + '.' + subnameWallet + "." + root); - await ensManager.addManager(amanager.address); - await ensManager.from(amanager).register(label, owner.address); - let nodeOwner = await ensRegistry.owner(labelNode); - assert.equal(nodeOwner, owner.address, "new manager should have registered the ens name"); - }); - - it("should fail to register an ENS name when the caller is not a manager", async () => { - let label = "wallet"; - await assert.revert(ensManager.from(anonmanager).register(label, owner.address), "registering should throw"); - }); + it("should not be able to change the ens resolver if not owner", async () => { + const randomAddress = await utilities.getRandomAddress(); + await assert.revertWith(ensManager.from(amanager).changeENSResolver(randomAddress), "Must be owner"); }); - describe("ENS Resolver", () => { - it("should return correct ENS interface support responses", async () => { - const SUPPORT_INTERFACE_ID = "0x01ffc9a7"; // EIP 165 - const ADDR_INTERFACE_ID = "0x3b3b57de"; // EIP 137 - const NAME_INTERFACE_ID = "0x691f3431"; // EIP 181 - - let support = await ensResolver.supportsInterface(SUPPORT_INTERFACE_ID); - assert.isTrue(support); - support = await ensResolver.supportsInterface(ADDR_INTERFACE_ID); - assert.isTrue(support); - support = await ensResolver.supportsInterface(NAME_INTERFACE_ID); - assert.isTrue(support); - }); - - it("should return 0 address for a non-existent record", async () => { - const labelNode = ethers.utils.namehash('missingnode' + '.' + subnameWallet + "." + root); - const nonExistentRecord = await ensResolver.addr(labelNode); - assert.equal(nonExistentRecord, ethers.constants.AddressZero); - }); - - it("should resolve a name", async () => { - let label = "wallet"; - let ensName = label + '.' + subnameWallet + "." + root; - await ensManager.from(infrastructure).register(label, owner.address); - let resolved = await ensResolver.addr(ethers.utils.namehash(ensName)); - assert.equal(resolved, owner.address, "should resolve to owner"); - }); + it("should not be able to change the ens resolver to an empty address", async () => { + await assert.revertWith(ensManager.changeENSResolver(ethers.constants.AddressZero), "WF: address cannot be null"); + }); + }); + + describe("ENS Resolver", () => { + it("should return correct ENS interface support responses", async () => { + const SUPPORT_INTERFACE_ID = "0x01ffc9a7"; // EIP 165 + const ADDR_INTERFACE_ID = "0x3b3b57de"; // EIP 137 + const NAME_INTERFACE_ID = "0x691f3431"; // EIP 181 + + let support = await ensResolver.supportsInterface(SUPPORT_INTERFACE_ID); + assert.isTrue(support); + support = await ensResolver.supportsInterface(ADDR_INTERFACE_ID); + assert.isTrue(support); + support = await ensResolver.supportsInterface(NAME_INTERFACE_ID); + assert.isTrue(support); + }); + + it("should return 0 address for a non-existent record", async () => { + const labelNode = ethers.utils.namehash(`${"missingnode"}.${subnameWallet}.${root}`); + const nonExistentRecord = await ensResolver.addr(labelNode); + assert.equal(nonExistentRecord, ethers.constants.AddressZero); + }); + + it("should resolve a name", async () => { + const label = "wallet"; + await ensManager.from(infrastructure).register(label, owner.address); + + const node = await ensReverse.node(owner.address); + const name = await ensResolver.name(node); + assert.equal(name, "wallet.argent.xyz"); }); -}); \ No newline at end of file + }); +}); diff --git a/test/factory.js b/test/factory.js index 50badeee0..6c7dc3ecf 100644 --- a/test/factory.js +++ b/test/factory.js @@ -1,579 +1,596 @@ +/* global accounts, utils */ +const ethers = require("ethers"); +const { bigNumberify } = require("ethers").utils; + const Wallet = require("../build/BaseWallet"); const Module = require("../build/BaseModule"); const ModuleRegistry = require("../build/ModuleRegistry"); -const ENSRegistry = require('../build/ENSRegistry'); -const ENSRegistryWithFallback = require('../build/ENSRegistryWithFallback'); -const ENSManager = require('../build/ArgentENSManager'); -const ENSResolver = require('../build/ArgentENSResolver'); -const ENSReverseRegistrar = require('../build/ReverseRegistrar'); -const Factory = require('../build/WalletFactory'); +const ENSRegistry = require("../build/ENSRegistry"); +const ENSRegistryWithFallback = require("../build/ENSRegistryWithFallback"); +const ENSManager = require("../build/ArgentENSManager"); +const ENSResolver = require("../build/ArgentENSResolver"); +const ENSReverseRegistrar = require("../build/ReverseRegistrar"); +const Factory = require("../build/WalletFactory"); const GuardianStorage = require("../build/GuardianStorage"); const TestManager = require("../utils/test-manager"); -const { randomBytes, bigNumberify } = require('ethers').utils; -const utilities = require('../utils/utilities.js'); +const utilities = require("../utils/utilities.js"); + const ZERO_BYTES32 = ethers.constants.HashZero; const ZERO_ADDRESS = ethers.constants.AddressZero; const NO_ENS = ""; -describe("Test Wallet Factory", function () { - this.timeout(10000); +describe("Wallet Factory", function () { + this.timeout(10000); + + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + const guardian = accounts[4].signer; + const other = accounts[6].signer; + + const root = "xyz"; + const subnameWallet = "argent"; + const walletNode = ethers.utils.namehash(`${subnameWallet}.${root}`); + + let index = 0; + + let deployer; + let ensRegistry; + let ensResolver; + let ensReverse; + let ensManager; + let implementation; + let moduleRegistry; + let guardianStorage; + let factory; + let factoryWithoutGuardianStorage; + + before(async () => { + deployer = manager.newDeployer(); + const ensRegistryWithoutFallback = await deployer.deploy(ENSRegistry); + ensRegistry = await deployer.deploy(ENSRegistryWithFallback, {}, ensRegistryWithoutFallback.contractAddress); + ensResolver = await deployer.deploy(ENSResolver); + ensReverse = await deployer.deploy(ENSReverseRegistrar, {}, ensRegistry.contractAddress, ensResolver.contractAddress); + ensManager = await deployer.deploy(ENSManager, {}, `${subnameWallet}.${root}`, + walletNode, ensRegistry.contractAddress, ensResolver.contractAddress); + await ensResolver.addManager(ensManager.contractAddress); + await ensResolver.addManager(infrastructure.address); + await ensManager.addManager(infrastructure.address); + + await ensRegistry.setSubnodeOwner(ZERO_BYTES32, ethers.utils.keccak256(ethers.utils.toUtf8Bytes(root)), infrastructure.address); + await ensRegistry.setSubnodeOwner( + ethers.utils.namehash(root), ethers.utils.keccak256(ethers.utils.toUtf8Bytes(subnameWallet)), ensManager.contractAddress, + ); + await ensRegistry.setSubnodeOwner(ZERO_BYTES32, ethers.utils.keccak256(ethers.utils.toUtf8Bytes("reverse")), infrastructure.address); + await ensRegistry.setSubnodeOwner( + ethers.utils.namehash("reverse"), ethers.utils.keccak256(ethers.utils.toUtf8Bytes("addr")), ensReverse.contractAddress, + ); + + implementation = await deployer.deploy(Wallet); + + moduleRegistry = await deployer.deploy(ModuleRegistry); + + guardianStorage = await deployer.deploy(GuardianStorage); + + factory = await deployer.deploy(Factory, {}, + moduleRegistry.contractAddress, + implementation.contractAddress, + ensManager.contractAddress); + await factory.addManager(infrastructure.address); + await factory.changeGuardianStorage(guardianStorage.contractAddress); + await ensManager.addManager(factory.contractAddress); + + factoryWithoutGuardianStorage = await deployer.deploy(Factory, {}, + moduleRegistry.contractAddress, + implementation.contractAddress, + ensManager.contractAddress); + await factoryWithoutGuardianStorage.addManager(infrastructure.address); + await ensManager.addManager(factoryWithoutGuardianStorage.contractAddress); + }); + + let module1; + let module2; + + beforeEach(async () => { + // Restore the good state of factory (we set these to bad addresses in some tests) + await factory.changeModuleRegistry(moduleRegistry.contractAddress); + await factory.changeENSManager(ensManager.contractAddress); + + module1 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); + module2 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); + await moduleRegistry.registerModule(module1.contractAddress, ethers.utils.formatBytes32String("module1")); + await moduleRegistry.registerModule(module2.contractAddress, ethers.utils.formatBytes32String("module2")); + + index += 1; + }); + + describe("Configure the factory", () => { + it("should allow owner to change the module registry", async () => { + const randomAddress = utilities.getRandomAddress(); + await factory.changeModuleRegistry(randomAddress); + const updatedModuleRegistry = await factory.moduleRegistry(); + assert.equal(updatedModuleRegistry, randomAddress); + }); + + it("should not allow owner to change the module registry to zero address", async () => { + await assert.revertWith(factory.changeModuleRegistry(ethers.constants.AddressZero), "WF: address cannot be null"); + }); + + it("should not allow non-owner to change the module registry", async () => { + const randomAddress = utilities.getRandomAddress(); + await assert.revertWith(factory.from(other).changeModuleRegistry(randomAddress), "Must be owner"); + }); + + it("should allow owner to change the ens manager", async () => { + const randomAddress = utilities.getRandomAddress(); + await factory.changeENSManager(randomAddress); + const updatedEnsManager = await factory.ensManager(); + assert.equal(updatedEnsManager, randomAddress); + }); + + it("should not allow owner to change the ens manager to a zero address", async () => { + await assert.revertWith(factory.changeENSManager(ethers.constants.AddressZero), "WF: address cannot be null"); + }); + + it("should not allow non-owner to change the ens manager", async () => { + const randomAddress = utilities.getRandomAddress(); + await assert.revertWith(factory.from(other).changeENSManager(randomAddress), "Must be owner"); + }); + + it("should not allow guardian storage address to be set to zero", async () => { + await assert.revertWith(factory.changeGuardianStorage(ethers.constants.AddressZero), "WF: address cannot be null"); + }); + }); + + describe("Create wallets with CREATE", () => { + it("should create with the correct owner", async () => { + // we create the wallet + const label = `wallet${index}`; + const modules = [module1.contractAddress]; + const tx = await factory.from(infrastructure).createWallet(owner.address, modules, label); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet has the correct owner + const wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "should have the correct owner"); + }); + + it("should create with the correct modules", async () => { + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we create the wallet + const tx = await factory.from(infrastructure).createWallet(owner.address, modules, label); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet has the correct modules + const wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); + let isAuthorised = await wallet.authorised(module1.contractAddress); + assert.equal(isAuthorised, true, "module1 should be authorised"); + isAuthorised = await wallet.authorised(module2.contractAddress); + assert.equal(isAuthorised, true, "module2 should be authorised"); + }); + + it("should create with the correct ENS name", async () => { + const label = `wallet${index}`; + const labelNode = ethers.utils.namehash(`${label}.${subnameWallet}.${root}`); + const modules = [module1.contractAddress, module2.contractAddress]; + // we create the wallet + const tx = await factory.from(infrastructure).createWallet(owner.address, modules, label); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet has the correct ENS + const nodeOwner = await ensRegistry.owner(labelNode); + assert.equal(nodeOwner, walletAddr); + const res = await ensRegistry.resolver(labelNode); + assert.equal(res, ensResolver.contractAddress); + }); + + it("should fail to create when there are no modules", async () => { + const label = `wallet${index}`; + const modules = []; + await assert.revertWith(factory.from(deployer).createWallet(owner.address, modules, label), "WF: cannot assign with less than 1 module"); + }); + + it("should fail to create when there is no ENS", async () => { + const modules = [module1.contractAddress, module2.contractAddress]; + await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, NO_ENS), "WF: ENS lable must be defined"); + }); + + it("should fail to create with an existing ENS", async () => { + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + await factory.from(infrastructure).createWallet(owner.address, modules, label); + await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, label), "AEM: _label is alrealdy owned"); + }); + + it("should fail to create with zero address as owner", async () => { + const label = `wallet${index}`; + const modules = [module1.contractAddress]; + await assert.revertWith(factory.from(infrastructure).createWallet(ethers.constants.AddressZero, modules, label), + "WF: owner cannot be null"); + }); + + it("should fail to create with no modules", async () => { + const label = `wallet${index}`; + const modules = []; + await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, label), + "WF: cannot assign with less than 1 module"); + }); + + it("should fail to create with unregistered module", async () => { + const label = `wallet${index}`; + const randomAddress = utilities.getRandomAddress(); + const modules = [randomAddress]; + await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, label), + "WF: one or more modules are not registered"); + }); + + it("should fail to create with empty label", async () => { + const label = ""; + const modules = [module1.contractAddress]; + await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, label), "WF: ENS lable must be defined"); + }); + }); + + describe("Create wallets with CREATE and default guardian", () => { + it("should create with the correct owner", async () => { + // we create the wallet + const label = `wallet${index}`; + const modules = [module1.contractAddress]; + const tx = await factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet has the correct owner + const wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "should have the correct owner"); + }); + + it("should create with the correct modules", async () => { + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we create the wallet + const tx = await factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet has the correct modules + const wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); + let isAuthorised = await wallet.authorised(module1.contractAddress); + assert.equal(isAuthorised, true, "module1 should be authorised"); + isAuthorised = await wallet.authorised(module2.contractAddress); + assert.equal(isAuthorised, true, "module2 should be authorised"); + }); - const manager = new TestManager(); + it("should create with the correct guardian", async () => { + // we create the wallet + const label = `wallet${index}`; + const modules = [module1.contractAddress]; + const tx = await factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet has the correct guardian + const success = await guardianStorage.isGuardian(walletAddr, guardian.address); + assert.equal(success, true, "should have the correct guardian"); + }); - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - let guardian = accounts[4].signer; - let other = accounts[6].signer; + it("should create with the correct ENS name", async () => { + const label = `wallet${index}`; + const labelNode = ethers.utils.namehash(`${label}.${subnameWallet}.${root}`); + const modules = [module1.contractAddress, module2.contractAddress]; + // we create the wallet + const tx = await factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet has the correct ENS + const nodeOwner = await ensRegistry.owner(labelNode); + assert.equal(nodeOwner, walletAddr); + const res = await ensRegistry.resolver(labelNode); + assert.equal(res, ensResolver.contractAddress); + }); - let root = "xyz"; - let subnameWallet = "argent"; - let walletNode = ethers.utils.namehash(subnameWallet + '.' + root); + it("should fail to create with a guardian when the guardian storage is not defined", async () => { + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + await assert.revertWith(factoryWithoutGuardianStorage.from(infrastructure) + .createWalletWithGuardian(owner.address, modules, label, guardian.address), + "GuardianStorage address not defined"); + }); - let index = 0; + it("should fail to create when the guardian is empty", async () => { + // we create the wallet + const label = `wallet${index}`; + const modules = [module1.contractAddress]; + await assert.revertWith(factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, ZERO_ADDRESS), + "WF: guardian cannot be null"); + }); + }); - let ensRegistry, - ensResolver, - ensReverse, - ensManager, - implementation, - moduleRegistry, - guardianStorage, - factory, - factoryWithoutGuardianStorage; + describe("Create wallets with CREATE2", () => { + beforeEach(async () => { + module1 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); + module2 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); + await moduleRegistry.registerModule(module1.contractAddress, ethers.utils.formatBytes32String("module1")); + await moduleRegistry.registerModule(module2.contractAddress, ethers.utils.formatBytes32String("module2")); + }); - before(async () => { - deployer = manager.newDeployer(); - const ensRegistryWithoutFallback = await deployer.deploy(ENSRegistry); - ensRegistry = await deployer.deploy(ENSRegistryWithFallback, {}, ensRegistryWithoutFallback.contractAddress); - ensResolver = await deployer.deploy(ENSResolver); - ensReverse = await deployer.deploy(ENSReverseRegistrar, {}, ensRegistry.contractAddress, ensResolver.contractAddress); - ensManager = await deployer.deploy(ENSManager, {}, subnameWallet + '.' + root, walletNode, ensRegistry.contractAddress, ensResolver.contractAddress); - await ensResolver.addManager(ensManager.contractAddress); - await ensResolver.addManager(infrastructure.address); - await ensManager.addManager(infrastructure.address); + it("should create a wallet at the correct address", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + }); - await ensRegistry.setSubnodeOwner(ZERO_BYTES32, ethers.utils.keccak256(ethers.utils.toUtf8Bytes(root)), infrastructure.address); - await ensRegistry.setSubnodeOwner(ethers.utils.namehash(root), ethers.utils.keccak256(ethers.utils.toUtf8Bytes(subnameWallet)), ensManager.contractAddress); - await ensRegistry.setSubnodeOwner(ZERO_BYTES32, ethers.utils.keccak256(ethers.utils.toUtf8Bytes('reverse')), infrastructure.address); - await ensRegistry.setSubnodeOwner(ethers.utils.namehash('reverse'), ethers.utils.keccak256(ethers.utils.toUtf8Bytes('addr')), ensReverse.contractAddress); + it("should create with the correct owner", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we test that the wallet has the correct owner + const wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "should have the correct owner"); + }); - implementation = await deployer.deploy(Wallet); + it("should create with the correct modules", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we test that the wallet has the correct modules + const wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); + let isAuthorised = await wallet.authorised(module1.contractAddress); + assert.equal(isAuthorised, true, "module1 should be authorised"); + isAuthorised = await wallet.authorised(module2.contractAddress); + assert.equal(isAuthorised, true, "module2 should be authorised"); + }); - moduleRegistry = await deployer.deploy(ModuleRegistry); + it("should create with the correct ENS name", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const labelNode = ethers.utils.namehash(`${label}.${subnameWallet}.${root}`); + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we test that the wallet has the correct ENS + const nodeOwner = await ensRegistry.owner(labelNode); + assert.equal(nodeOwner, walletAddr); + const res = await ensRegistry.resolver(labelNode); + assert.equal(res, ensResolver.contractAddress); + }); - guardianStorage = await deployer.deploy(GuardianStorage); + it("should fail to create a wallet at an existing address", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); + // we create the first wallet + const tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we create the second wallet + await assert.revert(factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt), + "should fail when address is in use"); + }); - factory = await deployer.deploy(Factory, {}, - moduleRegistry.contractAddress, - implementation.contractAddress, - ensManager.contractAddress); - await factory.addManager(infrastructure.address); - await factory.changeGuardianStorage(guardianStorage.contractAddress); - await ensManager.addManager(factory.contractAddress); + it("should fail to create counterfactually when there are no modules (without guardian)", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = []; + await assert.revertWith(factory.from(deployer).createCounterfactualWallet(owner.address, modules, label, salt), + "WF: cannot assign with less than 1 module"); + }); - factoryWithoutGuardianStorage = await deployer.deploy(Factory, {}, - moduleRegistry.contractAddress, - implementation.contractAddress, - ensManager.contractAddress); - await factoryWithoutGuardianStorage.addManager(infrastructure.address); - await ensManager.addManager(factoryWithoutGuardianStorage.contractAddress); + it("should fail to create when there is no ENS", async () => { + const salt = utilities.generateSaltValue(); + const label = ""; + const modules = [module1.contractAddress, module2.contractAddress]; + await assert.revertWith(factory.from(deployer).createCounterfactualWallet(owner.address, modules, label, salt), + "WF: ENS lable must be defined"); }); - let module1, module2; + it("should emit and event when the balance is non zero at creation", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + const amount = bigNumberify("10000000000000"); + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); + // We send ETH to the address + await infrastructure.sendTransaction({ to: futureAddr, value: amount }); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const wallet = deployer.wrapDeployedContract(Wallet, futureAddr); + assert.isTrue(await utils.hasEvent(txReceipt, wallet, "Received"), "should have generated Received event"); + const log = await utils.parseLogs(txReceipt, wallet, "Received"); + assert.equal(log[0].value.toNumber(), amount, "should log the correct amount"); + assert.equal(log[0].sender, "0x0000000000000000000000000000000000000000", "sender should be address(0)"); + }); + }); + describe("Create wallets with CREATE2 and default guardian", () => { beforeEach(async () => { - // Restore the good state of factory (we set these to bad addresses in some tests) - await factory.changeModuleRegistry(moduleRegistry.contractAddress); - await factory.changeENSManager(ensManager.contractAddress); - - module1 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); - module2 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); - await moduleRegistry.registerModule(module1.contractAddress, ethers.utils.formatBytes32String("module1")); - await moduleRegistry.registerModule(module2.contractAddress, ethers.utils.formatBytes32String("module2")); - - index++; - }); - - describe("Configure the factory", () => { - it("should allow owner to change the module registry", async () => { - const randomAddress = utilities.getRandomAddress(); - await factory.changeModuleRegistry(randomAddress); - const updatedModuleRegistry = await factory.moduleRegistry(); - assert.equal(updatedModuleRegistry, randomAddress); - }); - - it("should not allow owner to change the module registry to zero address", async () => { - await assert.revertWith(factory.changeModuleRegistry(ethers.constants.AddressZero), "WF: address cannot be null"); - }); - - it("should not allow non-owner to change the module registry", async () => { - const randomAddress = utilities.getRandomAddress(); - await assert.revertWith(factory.from(other).changeModuleRegistry(randomAddress), "Must be owner"); - }); - - it("should allow owner to change the ens manager", async () => { - const randomAddress = utilities.getRandomAddress(); - await factory.changeENSManager(randomAddress); - const updatedEnsManager = await factory.ensManager(); - assert.equal(updatedEnsManager, randomAddress); - }); - - it("should not allow owner to change the ens manager to a zero address", async () => { - await assert.revertWith(factory.changeENSManager(ethers.constants.AddressZero), "WF: address cannot be null"); - }); - - it("should not allow non-owner to change the ens manager", async () => { - const randomAddress = utilities.getRandomAddress(); - await assert.revertWith(factory.from(other).changeENSManager(randomAddress), "Must be owner"); - }); - - it("should not allow guardian storage address to be set to zero", async () => { - await assert.revertWith(factory.changeGuardianStorage(ethers.constants.AddressZero), "WF: address cannot be null"); - }); - }); - - describe("Create wallets with CREATE", () => { - - it("should create with the correct owner", async () => { - // we create the wallet - let label = "wallet" + index; - let modules = [module1.contractAddress]; - let tx = await factory.from(infrastructure).createWallet(owner.address, modules, label); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet has the correct owner - let wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'should have the correct owner'); - }); - - it("should create with the correct modules", async () => { - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we create the wallet - let tx = await factory.from(infrastructure).createWallet(owner.address, modules, label); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet has the correct modules - let wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); - let isAuthorised = await wallet.authorised(module1.contractAddress); - assert.equal(isAuthorised, true, 'module1 should be authorised'); - isAuthorised = await wallet.authorised(module2.contractAddress); - assert.equal(isAuthorised, true, 'module2 should be authorised'); - }); - - it("should create with the correct ENS name", async () => { - let label = "wallet" + index; - let labelNode = ethers.utils.namehash(label + '.' + subnameWallet + "." + root); - let modules = [module1.contractAddress, module2.contractAddress]; - // we create the wallet - let tx = await factory.from(infrastructure).createWallet(owner.address, modules, label); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet has the correct ENS - let nodeOwner = await ensRegistry.owner(labelNode); - assert.equal(nodeOwner, walletAddr); - let res = await ensRegistry.resolver(labelNode); - assert.equal(res, ensResolver.contractAddress); - }); - - it("should fail to create when there is no modules", async () => { - let label = "wallet" + index; - let modules = []; - await assert.revertWith(factory.from(deployer).createWallet(owner.address, modules, label), "WF: cannot assign with less than 1 module"); - }); - - it("should fail to create when there is no ENS", async () => { - let modules = [module1.contractAddress, module2.contractAddress]; - await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, NO_ENS), "WF: ENS lable must be defined"); - }); - - it("should fail to create with an existing ENS", async () => { - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - await factory.from(infrastructure).createWallet(owner.address, modules, label); - await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, label), "AEM: _label is alrealdy owned"); - }); - - it("should fail to create with zero address as owner", async () => { - let label = "wallet" + index; - let modules = [module1.contractAddress]; - await assert.revertWith(factory.from(infrastructure).createWallet(ethers.constants.AddressZero, modules, label), "WF: owner cannot be null"); - }); - - it("should fail to create with no modules", async () => { - let label = "wallet" + index; - let modules = []; - await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, label), "WF: cannot assign with less than 1 module"); - }); - - it("should fail to create with unregistered module", async () => { - let label = "wallet" + index; - const randomAddress = utilities.getRandomAddress(); - let modules = [randomAddress]; - await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, label), "WF: one or more modules are not registered"); - }); - - it("should fail to create with empty label", async () => { - let label = ""; - let modules = [module1.contractAddress]; - await assert.revertWith(factory.from(infrastructure).createWallet(owner.address, modules, label), "WF: ENS lable must be defined"); - }); - }); - - describe("Create wallets with CREATE and default guardian", () => { - - it("should create with the correct owner", async () => { - // we create the wallet - let label = "wallet" + index; - let modules = [module1.contractAddress]; - let tx = await factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet has the correct owner - let wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'should have the correct owner'); - }); - - it("should create with the correct modules", async () => { - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we create the wallet - let tx = await factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet has the correct modules - let wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); - let isAuthorised = await wallet.authorised(module1.contractAddress); - assert.equal(isAuthorised, true, 'module1 should be authorised'); - isAuthorised = await wallet.authorised(module2.contractAddress); - assert.equal(isAuthorised, true, 'module2 should be authorised'); - }); - - it("should create with the correct guardian", async () => { - // we create the wallet - let label = "wallet" + index; - let modules = [module1.contractAddress]; - let tx = await factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet has the correct guardian - let success = await guardianStorage.isGuardian(walletAddr, guardian.address); - assert.equal(success, true, 'should have the correct guardian'); - }); - - it("should create with the correct ENS name", async () => { - let label = "wallet" + index; - let labelNode = ethers.utils.namehash(label + '.' + subnameWallet + "." + root); - let modules = [module1.contractAddress, module2.contractAddress]; - // we create the wallet - let tx = await factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet has the correct ENS - let nodeOwner = await ensRegistry.owner(labelNode); - assert.equal(nodeOwner, walletAddr); - let res = await ensRegistry.resolver(labelNode); - assert.equal(res, ensResolver.contractAddress); - }); - - it("should fail to create with a guardian when the guardian storage is not defined", async () => { - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - await assert.revertWith(factoryWithoutGuardianStorage.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, guardian.address), "GuardianStorage address not defined"); - }); - - it("should fail to create when the guardian is empty", async () => { - // we create the wallet - let label = "wallet" + index; - let modules = [module1.contractAddress]; - await assert.revertWith(factory.from(infrastructure).createWalletWithGuardian(owner.address, modules, label, ZERO_ADDRESS), "WF: guardian cannot be null"); - }); - }); - - describe("Create wallets with CREATE2", () => { - - let module1, module2; - - beforeEach(async () => { - module1 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); - module2 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); - await moduleRegistry.registerModule(module1.contractAddress, ethers.utils.formatBytes32String("module1")); - await moduleRegistry.registerModule(module2.contractAddress, ethers.utils.formatBytes32String("module2")); - }); - - it("should create a wallet at the correct address", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - }); - - it("should create with the correct owner", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we test that the wallet has the correct owner - let wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'should have the correct owner'); - }); - - it("should create with the correct modules", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we test that the wallet has the correct modules - let wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); - let isAuthorised = await wallet.authorised(module1.contractAddress); - assert.equal(isAuthorised, true, 'module1 should be authorised'); - isAuthorised = await wallet.authorised(module2.contractAddress); - assert.equal(isAuthorised, true, 'module2 should be authorised'); - }); - - it("should create with the correct ENS name", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let labelNode = ethers.utils.namehash(label + '.' + subnameWallet + "." + root); - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we test that the wallet has the correct ENS - let nodeOwner = await ensRegistry.owner(labelNode); - assert.equal(nodeOwner, walletAddr); - let res = await ensRegistry.resolver(labelNode); - assert.equal(res, ensResolver.contractAddress); - }); - - it("should fail to create a wallet at an existing address", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); - // we create the first wallet - let tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we create the second wallet - await assert.revert(factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt), "should fail when address is in use"); - }); - - it("should fail to create when there is no modules", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = []; - await assert.revertWith(factory.from(deployer).createCounterfactualWallet(owner.address, modules, label, salt), "WF: cannot assign with less than 1 module"); - }); - - it("should fail to create when there is no ENS", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = ""; - let modules = [module1.contractAddress, module2.contractAddress]; - await assert.revertWith(factory.from(deployer).createCounterfactualWallet(owner.address, modules, label, salt), "WF: ENS lable must be defined"); - }); - - it("should emit and event when the balance is non zero at creation", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - let amount = bigNumberify('10000000000000'); - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWallet(owner.address, modules, salt); - // We send ETH to the address - await infrastructure.sendTransaction({ to: futureAddr, value: amount }); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWallet(owner.address, modules, label, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let wallet = deployer.wrapDeployedContract(Wallet, futureAddr); - assert.isTrue(await utils.hasEvent(txReceipt, wallet, "Received"), "should have generated Received event"); - let log = await utils.parseLogs(txReceipt, wallet, "Received"); - assert.equal(log[0].value.toNumber(), amount, "should log the correct amount"); - assert.equal(log[0].sender, '0x0000000000000000000000000000000000000000', "sender should be address(0)"); - }); - }); - - describe("Create wallets with CREATE2 and default guardian", () => { - - let module1, module2; - - beforeEach(async () => { - module1 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); - module2 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); - await moduleRegistry.registerModule(module1.contractAddress, ethers.utils.formatBytes32String("module1")); - await moduleRegistry.registerModule(module2.contractAddress, ethers.utils.formatBytes32String("module2")); - }); - - it("should create a wallet at the correct address", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - }); - - it("should create with the correct owner", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we test that the wallet has the correct owner - let wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'should have the correct owner'); - }); - - it("should create with the correct guardian", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we test that the wallet has the correct guardian - let success = await guardianStorage.isGuardian(walletAddr, guardian.address); - assert.equal(success, true, 'should have the correct guardian'); - }); - - it("should create with the correct modules", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we test that the wallet has the correct modules - let wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); - let isAuthorised = await wallet.authorised(module1.contractAddress); - assert.equal(isAuthorised, true, 'module1 should be authorised'); - isAuthorised = await wallet.authorised(module2.contractAddress); - assert.equal(isAuthorised, true, 'module2 should be authorised'); - }); - - it("should create with the correct ENS name", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let labelNode = ethers.utils.namehash(label + '.' + subnameWallet + "." + root); - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); - // we create the wallet - let tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we test that the wallet has the correct ENS - let nodeOwner = await ensRegistry.owner(labelNode); - assert.equal(nodeOwner, walletAddr); - let res = await ensRegistry.resolver(labelNode); - assert.equal(res, ensResolver.contractAddress); - }); - - it("should fail to create a wallet at an existing address", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - // we get the future address - let futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); - // we create the first wallet - let tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); - let txReceipt = await factory.verboseWaitForTransaction(tx); - let walletAddr = txReceipt.events.filter(event => event.event == 'WalletCreated')[0].args.wallet; - // we test that the wallet is at the correct address - assert.equal(futureAddr, walletAddr, 'should have the correct address'); - // we create the second wallet - await assert.revert(factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt), "should fail when address is in use"); - }); - - it("should fail to create when there is no modules", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = []; - await assert.revertWith(factory.from(deployer).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt), "WF: cannot assign with less than 1 module"); - }); - - it("should return the correct ENSManager", async () => { - const ensManagerOnFactory = await factory.ensManager(); - assert.equal(ensManagerOnFactory, ensManager.contractAddress, 'should have the correct ENSManager addrress'); - }); - - - it("should fail to create with a guardian when the guardian storage is not defined", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - await assert.revertWith(factoryWithoutGuardianStorage.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt), "GuardianStorage address not defined"); - }); - - it("should fail to get an address when the guardian is empty", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - await assert.revertWith(factory.from(infrastructure).getAddressForCounterfactualWalletWithGuardian(owner.address, modules, ZERO_ADDRESS, salt), "WF: guardian cannot be null"); - }); - - it("should fail to create when the guardian is empty", async () => { - let salt = bigNumberify(randomBytes(32)).toHexString (); - let label = "wallet" + index; - let modules = [module1.contractAddress, module2.contractAddress]; - await assert.revertWith(factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, ZERO_ADDRESS, salt), "WF: guardian cannot be null"); - }); - }); -}); \ No newline at end of file + module1 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); + module2 = await deployer.deploy(Module, {}, moduleRegistry.contractAddress, guardianStorage.contractAddress, ZERO_BYTES32); + await moduleRegistry.registerModule(module1.contractAddress, ethers.utils.formatBytes32String("module1")); + await moduleRegistry.registerModule(module2.contractAddress, ethers.utils.formatBytes32String("module2")); + }); + + it("should create a wallet at the correct address", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + }); + + it("should create with the correct owner", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we test that the wallet has the correct owner + const wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "should have the correct owner"); + }); + + it("should create with the correct guardian", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we test that the wallet has the correct guardian + const success = await guardianStorage.isGuardian(walletAddr, guardian.address); + assert.equal(success, true, "should have the correct guardian"); + }); + + it("should create with the correct modules", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we test that the wallet has the correct modules + const wallet = await deployer.wrapDeployedContract(Wallet, walletAddr); + let isAuthorised = await wallet.authorised(module1.contractAddress); + assert.equal(isAuthorised, true, "module1 should be authorised"); + isAuthorised = await wallet.authorised(module2.contractAddress); + assert.equal(isAuthorised, true, "module2 should be authorised"); + }); + + it("should create with the correct ENS name", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const labelNode = ethers.utils.namehash(`${label}.${subnameWallet}.${root}`); + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); + // we create the wallet + const tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we test that the wallet has the correct ENS + const nodeOwner = await ensRegistry.owner(labelNode); + assert.equal(nodeOwner, walletAddr); + const res = await ensRegistry.resolver(labelNode); + assert.equal(res, ensResolver.contractAddress); + }); + + it("should fail to create a wallet at an existing address", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + // we get the future address + const futureAddr = await factory.getAddressForCounterfactualWalletWithGuardian(owner.address, modules, guardian.address, salt); + // we create the first wallet + const tx = await factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt); + const txReceipt = await factory.verboseWaitForTransaction(tx); + const walletAddr = txReceipt.events.filter((event) => event.event === "WalletCreated")[0].args.wallet; + // we test that the wallet is at the correct address + assert.equal(futureAddr, walletAddr, "should have the correct address"); + // we create the second wallet + await assert.revert(factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt), + "should fail when address is in use"); + }); + + it("should fail to create counterfactually when there are no modules (with guardian)", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = []; + await assert.revertWith(factory.from(deployer).createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt), + "WF: cannot assign with less than 1 module"); + }); + + it("should return the correct ENSManager", async () => { + const ensManagerOnFactory = await factory.ensManager(); + assert.equal(ensManagerOnFactory, ensManager.contractAddress, "should have the correct ENSManager addrress"); + }); + + + it("should fail to create with a guardian when the guardian storage is not defined", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + await assert.revertWith(factoryWithoutGuardianStorage.from(infrastructure) + .createCounterfactualWalletWithGuardian(owner.address, modules, label, guardian.address, salt), + "GuardianStorage address not defined"); + }); + + it("should fail to get an address when the guardian is empty", async () => { + const salt = utilities.generateSaltValue(); + const modules = [module1.contractAddress, module2.contractAddress]; + await assert.revertWith(factory.from(infrastructure).getAddressForCounterfactualWalletWithGuardian(owner.address, modules, ZERO_ADDRESS, salt), + "WF: guardian cannot be null"); + }); + + it("should fail to create when the guardian is empty", async () => { + const salt = utilities.generateSaltValue(); + const label = `wallet${index}`; + const modules = [module1.contractAddress, module2.contractAddress]; + await assert.revertWith(factory.from(infrastructure).createCounterfactualWalletWithGuardian(owner.address, modules, label, ZERO_ADDRESS, salt), + "WF: guardian cannot be null"); + }); + }); +}); diff --git a/test/guardianManager.js b/test/guardianManager.js index 05a12231d..ded99c214 100644 --- a/test/guardianManager.js +++ b/test/guardianManager.js @@ -1,3 +1,4 @@ +/* global accounts */ const GuardianManager = require("../build/GuardianManager"); const GuardianStorage = require("../build/GuardianStorage"); const Wallet = require("../build/BaseWallet"); @@ -8,348 +9,374 @@ const NonCompliantGuardian = require("../build/NonCompliantGuardian"); const TestManager = require("../utils/test-manager"); describe("GuardianManager", function () { - this.timeout(10000); - - const manager = new TestManager(accounts); - - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - let guardian1 = accounts[2].signer; - let guardian2 = accounts[3].signer; - let guardian3 = accounts[4].signer; - let guardian4 = accounts[5].signer; - let guardian5 = accounts[6].signer; - let nonowner = accounts[7].signer; - - let wallet, guardianStorage, guardianManager; - - beforeEach(async () => { - deployer = manager.newDeployer(); - const registry = await deployer.deploy(Registry); - guardianStorage = await deployer.deploy(GuardianStorage); - guardianManager = await deployer.deploy(GuardianManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24, 12); - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [guardianManager.contractAddress]); + this.timeout(10000); + + const manager = new TestManager(accounts); + + const owner = accounts[1].signer; + const guardian1 = accounts[2].signer; + const guardian2 = accounts[3].signer; + const guardian3 = accounts[4].signer; + const guardian4 = accounts[5].signer; + const guardian5 = accounts[6].signer; + const nonowner = accounts[7].signer; + + let deployer; + let wallet; + let guardianStorage; + let guardianManager; + + beforeEach(async () => { + deployer = manager.newDeployer(); + const registry = await deployer.deploy(Registry); + guardianStorage = await deployer.deploy(GuardianStorage); + guardianManager = await deployer.deploy(GuardianManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24, 12); + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [guardianManager.contractAddress]); + }); + + describe("Adding Guardians", () => { + describe("EOA Guardians", () => { + it("should let the owner add EOA Guardians (blockchain transaction)", async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isTrue(active, "first guardian should be active"); + assert.equal(count, 1, "1 guardian should be active"); + + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); + assert.isFalse(active, "second guardian should not yet be active"); + assert.equal(count, 1, "second guardian should be pending during security period"); + + await manager.increaseTime(30); + await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address); + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); + assert.isTrue(active, "second guardian should be active"); + assert.equal(count, 2, "2 guardians should be active after security period"); + }); + + it("should not let the owner add EOA Guardians after two security periods (blockchain transaction)", async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); + + await manager.increaseTime(48); // 42 == 2 * security_period + await assert.revertWith(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), + "GM: Too late to confirm guardian addition"); + + const count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + const active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); + assert.isFalse(active, "second guardian should not be active (addition confirmation was too late)"); + assert.equal(count, 1, "1 guardian should be active after two security periods (addition confirmation was too late)"); + }); + + it("should not allow confirming too early", async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); + await assert.revertWith(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), + "GM: Too early to confirm guardian addition"); + }); + + it("should let the owner re-add EOA Guardians after missing the confirmation window (blockchain transaction)", async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + + // first time + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); + + await manager.increaseTime(48); // 42 == 2 * security_period + await assert.revertWith(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), + "GM: Too late to confirm guardian addition"); + + // second time + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); + let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + let active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); + assert.isFalse(active, "second guardian should not yet be active"); + assert.equal(count, 1, "second guardian should be pending during security period"); + + await manager.increaseTime(30); + await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address); + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); + assert.isTrue(active, "second guardian should be active"); + assert.equal(count, 2, "2 guardians should be active after security period"); + }); + + it("should only let the owner add an EOA guardian", async () => { + await assert.revertWith(guardianManager.from(nonowner).addGuardian(wallet.contractAddress, guardian1.address), + "BM: must be an owner for the wallet"); + }); + + it("should not allow adding wallet owner as guardian", async () => { + await assert.revertWith(guardianManager.from(owner).addGuardian(wallet.contractAddress, owner.address), + "GM: target guardian cannot be owner"); + }); + + it("should not allow adding an existing guardian twice", async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + await assert.revertWith(guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address), + "GM: target is already a guardian"); + }); + + it("should not allow adding a duplicate request to add a guardian to the request queue", async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); + await assert.revertWith(guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address), + "GM: addition of target as guardian is already pending"); + }); + + it("should let the owner add an EOA guardian (relayed transaction)", async () => { + await manager.relay(guardianManager, "addGuardian", [wallet.contractAddress, guardian1.address], wallet, [owner]); + const count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + const active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isTrue(active, "first guardian should be active"); + assert.equal(count, 1, "1 guardian should be active"); + }); + + it("should add many Guardians (blockchain transaction)", async () => { + const guardians = [guardian1, guardian2, guardian3, guardian4, guardian5]; + let count; + let active; + for (let i = 1; i <= 5; i += 1) { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardians[i - 1].address); + if (i > 1) { + await manager.increaseTime(31); + await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardians[i - 1].address); + } + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardians[i - 1].address); + assert.equal(count, i, `guardian ${i} should be added`); + assert.isTrue(active, `guardian ${i} should be active`); + } + }); + + it("should add many Guardians (relayed transaction)", async () => { + const guardians = [guardian1, guardian2, guardian3, guardian4, guardian5]; + let count; + let active; + for (let i = 1; i <= 3; i += 1) { + await manager.relay(guardianManager, "addGuardian", [wallet.contractAddress, guardians[i - 1].address], wallet, [owner]); + if (i > 1) { + await manager.increaseTime(30); + await manager.relay(guardianManager, "confirmGuardianAddition", [wallet.contractAddress, guardians[i - 1].address], wallet, []); + } + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardians[i - 1].address); + assert.equal(count, i, `guardian ${i} should be added`); + assert.isTrue(active, `guardian ${i} should be active`); + } + }); }); - describe("Adding Guardians", () => { - describe("EOA Guardians", () => { - it("should let the owner add EOA Guardians (blockchain transaction)", async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); - let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'first guardian should be active'); - assert.equal(count, 1, '1 guardian should be active'); - - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isFalse(active, 'second guardian should not yet be active'); - assert.equal(count, 1, 'second guardian should be pending during security period'); - - await manager.increaseTime(30); - await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isTrue(active, 'second guardian should be active'); - assert.equal(count, 2, '2 guardians should be active after security period'); - }); - - it("should not let the owner add EOA Guardians after two security periods (blockchain transaction)", async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); - let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'first guardian should be active'); - assert.equal(count, 1, '1 guardian should be active'); - - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isFalse(active, 'second guardian should not yet be active'); - assert.equal(count, 1, 'second guardian should be pending during security period'); - - await manager.increaseTime(48); // 42 == 2 * security_period - await assert.revert(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), "confirming the addition should throw"); - - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isFalse(active, 'second guardian should not be active (addition confirmation was too late)'); - assert.equal(count, 1, '1 guardian should be active after two security periods (addition confirmation was too late)'); - }); - - it("should let the owner re-add EOA Guardians after missing the confirmation window (blockchain transaction)", async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); - let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'first guardian should be active'); - assert.equal(count, 1, '1 guardian should be active'); - - // first time - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isFalse(active, 'second guardian should not yet be active'); - assert.equal(count, 1, 'second guardian should be pending during security period'); - - await manager.increaseTime(48); // 42 == 2 * security_period - await assert.revert(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), "confirming the addition should throw"); - - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isFalse(active, 'second guardian should not be active (addition confirmation was too late)'); - assert.equal(count, 1, '1 guardian should be active after two security periods (addition confirmation was too late)'); - - // second time - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isFalse(active, 'second guardian should not yet be active'); - assert.equal(count, 1, 'second guardian should be pending during security period'); - - await manager.increaseTime(30); - await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isTrue(active, 'second guardian should be active'); - assert.equal(count, 2, '2 guardians should be active after security period'); - - }); - - it("should only let the owner add an EOA guardian (blockchain transaction)", async () => { - await assert.revert(guardianManager.from(nonowner).addGuardian(wallet.contractAddress, guardian1.address), "adding from nonowner should throw"); - }); - - it("should let the owner add an EOA guardian (relayed transaction)", async () => { - await manager.relay(guardianManager, 'addGuardian', [wallet.contractAddress, guardian1.address], wallet, [owner]) - const count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - const active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'first guardian should be active'); - assert.equal(count, 1, '1 guardian should be active'); - }); - - it("should add many Guardians (blockchain transaction)", async () => { - const guardians = [guardian1, guardian2, guardian3, guardian4, guardian5]; - let count, active; - for (let i = 1; i <= 5; i++) { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardians[i - 1].address); - if (i > 1) { - await manager.increaseTime(31); - await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardians[i - 1].address); - } - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardians[i - 1].address); - assert.equal(count, i, 'guardian ' + i + ' should be added'); - assert.isTrue(active, 'guardian ' + i + ' should be active'); - } - }); - - it("should add many Guardians (relayed transaction)", async () => { - const guardians = [guardian1, guardian2, guardian3, guardian4, guardian5]; - let count, active; - for (let i = 1; i <= 3; i++) { - await manager.relay(guardianManager, 'addGuardian', [wallet.contractAddress, guardians[i - 1].address], wallet, [owner]); - if (i > 1) { - await manager.increaseTime(30); - await manager.relay(guardianManager, 'confirmGuardianAddition', [wallet.contractAddress, guardians[i - 1].address], wallet, []); - } - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardians[i - 1].address); - assert.equal(count, i, 'guardian ' + i + ' should be added'); - assert.isTrue(active, 'guardian ' + i + ' should be active'); - } - }); + describe("Smart Contract Guardians", () => { + let guardianWallet1; + let guardianWallet2; + let dumbContract; + + beforeEach(async () => { + guardianWallet1 = await deployer.deploy(Wallet); + await guardianWallet1.init(guardian1.address, [guardianManager.contractAddress]); + guardianWallet2 = await deployer.deploy(Wallet); + await guardianWallet2.init(guardian2.address, [guardianManager.contractAddress]); + dumbContract = await deployer.deploy(DumbContract); + }); + + it("should let the owner add Smart Contract Guardians (blockchain transaction)", async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardianWallet1.contractAddress); + let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isTrue(active, "first guardian owner should be recognized as guardian"); + active = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet1.contractAddress); + assert.isTrue(active, "first guardian should be recognized as guardian"); + assert.equal(count, 1, "1 guardian should be active"); + + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardianWallet2.contractAddress); + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); + assert.isFalse(active, "second guardian owner should not yet be active"); + active = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet2.contractAddress); + assert.isFalse(active, "second guardian should not yet be active"); + assert.equal(count, 1, "second guardian should be pending during security period"); + + await manager.increaseTime(30); + await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardianWallet2.contractAddress); + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); + assert.isTrue(active, "second guardian owner should be active"); + active = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet2.contractAddress); + assert.isTrue(active, "second guardian should be active"); + assert.equal(count, 2, "2 guardians should be active after security period"); + }); + + it("should let the owner add a Smart Contract guardian (relayed transaction)", async () => { + await manager.relay(guardianManager, "addGuardian", [wallet.contractAddress, guardianWallet1.contractAddress], wallet, [owner]); + const count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + let active = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet1.contractAddress); + assert.isTrue(active, "first guardian should be active"); + active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isTrue(active, "first guardian owner should be active"); + assert.equal(count, 1, "1 guardian should be active"); + }); + + it("should not let owner add a Smart Contract guardian that does not have an owner manager", async () => { + await assert.revertWith(guardianManager.from(owner).addGuardian(wallet.contractAddress, dumbContract.contractAddress), + "GM: guardian must be EOA or implement owner()"); + }); + + describe("Non-Compliant Guardians", () => { + let nonCompliantGuardian; + beforeEach(async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + nonCompliantGuardian = await deployer.deploy(NonCompliantGuardian); }); - - describe("Smart Contract Guardians", () => { - - let guardianWallet1, guardianWallet2, dumbContract; - - beforeEach(async () => { - guardianWallet1 = await deployer.deploy(Wallet); - await guardianWallet1.init(guardian1.address, [guardianManager.contractAddress]); - guardianWallet2 = await deployer.deploy(Wallet); - await guardianWallet2.init(guardian2.address, [guardianManager.contractAddress]); - dumbContract = await deployer.deploy(DumbContract); - }); - - it("should let the owner add Smart Contract Guardians (blockchain transaction)", async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardianWallet1.contractAddress); - let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'first guardian owner should be recognized as guardian'); - active = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet1.contractAddress); - assert.isTrue(active, 'first guardian should be recognized as guardian'); - assert.equal(count, 1, '1 guardian should be active'); - - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardianWallet2.contractAddress); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isFalse(active, 'second guardian owner should not yet be active'); - active = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet2.contractAddress); - assert.isFalse(active, 'second guardian should not yet be active'); - assert.equal(count, 1, 'second guardian should be pending during security period'); - - await manager.increaseTime(30); - await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardianWallet2.contractAddress); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian2.address); - assert.isTrue(active, 'second guardian owner should be active'); - active = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet2.contractAddress); - assert.isTrue(active, 'second guardian should be active'); - assert.equal(count, 2, '2 guardians should be active after security period'); - }); - - it("should let the owner add a Smart Contract guardian (relayed transaction)", async () => { - await manager.relay(guardianManager, 'addGuardian', [wallet.contractAddress, guardianWallet1.contractAddress], wallet, [owner]) - const count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - let active = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet1.contractAddress); - assert.isTrue(active, 'first guardian should be active'); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'first guardian owner should be active'); - assert.equal(count, 1, '1 guardian should be active'); - }); - - it("should not let owner add a Smart Contract guardian that does not have an owner manager", async () => { - await assert.revert(guardianManager.from(owner).addGuardian(wallet.contractAddress, dumbContract.contractAddress), "adding invalid guardian contract should throw"); - }); - - describe("Non-Compliant Guardians", () => { - let nonCompliantGuardian; - beforeEach(async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); - nonCompliantGuardian = await deployer.deploy(NonCompliantGuardian); - }); - it("it should fail to add a non-compliant guardian", async () => { - await assert.revert(guardianManager.from(owner).addGuardian(wallet.contractAddress, nonCompliantGuardian.contractAddress, { gasLimit: 2000000 })); - }); - }); + it("it should fail to add a non-compliant guardian", async () => { + await assert.revert(guardianManager.from(owner).addGuardian(wallet.contractAddress, nonCompliantGuardian.contractAddress)); }); + }); }); + }); - describe("Revoking Guardians", () => { - beforeEach(async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); - await manager.increaseTime(30); - await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address); - const count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 2, '2 guardians should be added'); - }); + describe("Revoking Guardians", () => { + beforeEach(async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); + await manager.increaseTime(30); + await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address); + const count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + assert.equal(count, 2, "2 guardians should be added"); + }); - it("should revoke a guardian (blockchain transaction)", async () => { - await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); - let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'the revoked guardian should still be active during the security period'); - assert.equal(count, 2, 'the revoked guardian should go through a security period'); + it("should revoke a guardian (blockchain transaction)", async () => { + await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); + let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isTrue(active, "the revoked guardian should still be active during the security period"); + assert.equal(count, 2, "the revoked guardian should go through a security period"); + + await manager.increaseTime(30); + await guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address); + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isFalse(active, "the revoked guardian should no longer be active after the security period"); + assert.equal(count, 1, "the revoked guardian should be removed after the security period"); + }); - await manager.increaseTime(30); - await guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isFalse(active, 'the revoked guardian should no longer be active after the security period'); - assert.equal(count, 1, 'the revoked guardian should be removed after the security period'); - }); + it("should not be able to revoke a nonexistent guardian", async () => { + await assert.revertWith(guardianManager.from(owner).revokeGuardian(wallet.contractAddress, nonowner.address), + "GM: must be an existing guardian"); + }); - it("should not confirm a guardian revokation after two security periods (blockchain transaction)", async () => { - await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); - let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'the revoked guardian should still be active during the security period'); - assert.equal(count, 2, 'the revoked guardian should go through a security period'); + it("should not confirm a guardian revokation too early", async () => { + await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); + await assert.revertWith(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), + "GM: Too early to confirm guardian revokation"); + }); - await manager.increaseTime(48); // 48 == 2 * security_period - await assert.revert(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), "confirming the revokation should throw"); + it("should not confirm a guardian revokation after two security periods (blockchain transaction)", async () => { + await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'the revoked guardian should still be active (confirmation was too late)'); - assert.equal(count, 2, 'there should still be two guardians (revokation confirmation was too late)'); - }); + await manager.increaseTime(48); // 48 == 2 * security_period + await assert.revertWith(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), + "GM: Too late to confirm guardian revokation"); + }); - it("should revoke a guardian again after missing the confirmation window the first time (blockchain transaction)", async () => { - // first time - await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); - let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'the revoked guardian should still be active during the security period'); - assert.equal(count, 2, 'the revoked guardian should go through a security period'); - - await manager.increaseTime(48); // 48 == 2 * security_period - await assert.revert(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), "confirming the revokation should throw"); - - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'the revoked guardian should still be active (confirmation was too late)'); - assert.equal(count, 2, 'there should still be two guardians (revokation confirmation was too late)'); - - // second time - await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(active, 'the revoked guardian should still be active during the security period'); - assert.equal(count, 2, 'the revoked guardian should go through a security period'); + it("should not be able to revoke a guardian twice", async () => { + await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); + await assert.revertWith(guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address), + "GM: revokation of target as guardian is already pending"); + }); - await manager.increaseTime(30); - await guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isFalse(active, 'the revoked guardian should no longer be active after the security period'); - assert.equal(count, 1, 'the revoked guardian should be removed after the security period'); - }); + it("should revoke a guardian again after missing the confirmation window the first time (blockchain transaction)", async () => { + // first time + await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); + + await manager.increaseTime(48); // 48 == 2 * security_period + await assert.revertWith(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), + "GM: Too late to confirm guardian revokation"); + + // second time + await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); + let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + let active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isTrue(active, "the revoked guardian should still be active during the security period"); + assert.equal(count, 2, "the revoked guardian should go through a security period"); + + await manager.increaseTime(30); + await guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address); + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + active = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isFalse(active, "the revoked guardian should no longer be active after the security period"); + assert.equal(count, 1, "the revoked guardian should be removed after the security period"); + }); - it("should add a guardian after a revoke (blockchain transaction)", async () => { - await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); - await manager.increaseTime(30); - await guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address); - let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 1, 'there should be 1 guardian left'); + it("should add a guardian after a revoke (blockchain transaction)", async () => { + await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); + await manager.increaseTime(30); + await guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address); + let count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + assert.equal(count, 1, "there should be 1 guardian left"); + + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian3.address); + await manager.increaseTime(30); + await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian3.address); + count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); + assert.equal(count, 2, "there should be 2 guardians again"); + }); + }); - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian3.address); - await manager.increaseTime(30); - await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian3.address); - count = (await guardianStorage.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 2, 'there should be 2 guardians again'); - }); + describe("Cancelling Pending Guardians", () => { + beforeEach(async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); + assert.equal(count, 1, "1 guardian should be added"); }); - describe("Cancelling Pending Guardians", () => { - beforeEach(async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); - const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 1, "1 guardian should be added"); - }); + it("owner should be able to cancel pending addition of guardian (blockchain transaction)", async () => { + // Add guardian 2 and cancel its addition + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); + await guardianManager.from(owner).cancelGuardianAddition(wallet.contractAddress, guardian2.address); + await manager.increaseTime(30); + await assert.revertWith(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), + "GM: no pending addition as guardian for target"); + }); - it("owner should be able to cancel pending addition of guardian (blockchain transaction)", async () => { - // Add guardian 2 and cancel its addition - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian2.address); - await guardianManager.from(owner).cancelGuardianAddition(wallet.contractAddress, guardian2.address); - await manager.increaseTime(30); - await assert.revert(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), "confirmGuardianAddition should throw"); - }); + it("owner should not be able to cancel a nonexistent addition of a guardian request", async () => { + await assert.revertWith(guardianManager.from(owner).cancelGuardianAddition(wallet.contractAddress, guardian2.address), + "GM: no pending addition as guardian for target"); + }); - it("owner should be able to cancel pending revokation of guardian (blockchain transaction)", async () => { - // Revoke guardian 1 and cancel its revokation - await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); - await guardianManager.from(owner).cancelGuardianRevokation(wallet.contractAddress, guardian1.address); - await manager.increaseTime(30); - await assert.revert(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), "confirmGuardianRevokation should throw"); - }); + it("owner should be able to cancel pending revokation of guardian (blockchain transaction)", async () => { + // Revoke guardian 1 and cancel its revokation + await guardianManager.from(owner).revokeGuardian(wallet.contractAddress, guardian1.address); + await guardianManager.from(owner).cancelGuardianRevokation(wallet.contractAddress, guardian1.address); + await manager.increaseTime(30); + await assert.revertWith(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), + "GM: no pending guardian revokation for target"); + }); - it("owner should be able to cancel pending addition of guardian (relayed transaction)", async () => { - // Add guardian 2 and cancel its addition - await manager.relay(guardianManager, 'addGuardian', [wallet.contractAddress, guardian2.address], wallet, [owner]); - await manager.relay(guardianManager, 'cancelGuardianAddition', [wallet.contractAddress, guardian2.address], wallet, [owner]); - await manager.increaseTime(30); - await assert.revert(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), "confirmGuardianAddition should throw"); - }); + it("owner should not be able to cancel a nonexistent pending revokation of guardian", async () => { + await assert.revertWith(guardianManager.from(owner).cancelGuardianRevokation(wallet.contractAddress, nonowner.address), + "GM: no pending guardian revokation for target"); + }); - it("owner should be able to cancel pending revokation of guardian (relayed transaction)", async () => { - // Revoke guardian 1 and cancel its revokation - await manager.relay(guardianManager, 'revokeGuardian', [wallet.contractAddress, guardian1.address], wallet, [owner]); - await manager.relay(guardianManager, 'cancelGuardianRevokation', [wallet.contractAddress, guardian1.address], wallet, [owner]); - await manager.increaseTime(30); - await assert.revert(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), "confirmGuardianRevokation should throw"); - }); + it("owner should be able to cancel pending addition of guardian (relayed transaction)", async () => { + // Add guardian 2 and cancel its addition + await manager.relay(guardianManager, "addGuardian", [wallet.contractAddress, guardian2.address], wallet, [owner]); + await manager.relay(guardianManager, "cancelGuardianAddition", [wallet.contractAddress, guardian2.address], wallet, [owner]); + await manager.increaseTime(30); + await assert.revertWith(guardianManager.confirmGuardianAddition(wallet.contractAddress, guardian2.address), + "GM: no pending addition as guardian for target"); + }); + + it("owner should be able to cancel pending revokation of guardian (relayed transaction)", async () => { + // Revoke guardian 1 and cancel its revokation + await manager.relay(guardianManager, "revokeGuardian", [wallet.contractAddress, guardian1.address], wallet, [owner]); + await manager.relay(guardianManager, "cancelGuardianRevokation", [wallet.contractAddress, guardian1.address], wallet, [owner]); + await manager.increaseTime(30); + await assert.revertWith(guardianManager.confirmGuardianRevokation(wallet.contractAddress, guardian1.address), + "GM: no pending guardian revokation for target"); }); -}); \ No newline at end of file + }); +}); diff --git a/test/integration/makerV2Manager_invest.js b/test/integration/makerV2Manager_invest.js new file mode 100644 index 000000000..1f43a4873 --- /dev/null +++ b/test/integration/makerV2Manager_invest.js @@ -0,0 +1,173 @@ +// How to run this test file: +// 1. add your private key (KOVAN_PRIV_KEY) and Infura API key (INFURA_KEY) to .env +// --- TO TEST ON KOVAN: ---- +// 2. npx etherlime test test/makerV2Manager_invest.js --skip-compilation --network kovan +// --- TO TEST ON KOVAN-FORK: ---- +// 2. npm run kovan-fork +// 3. npx etherlime test test/makerV2Manager_invest.js --skip-compilation --network kovan-fork + +const { parseEther } = require("ethers").utils; +const TestManager = require("../../utils/test-manager"); +const DeployManager = require("../../utils/deploy-manager.js"); +const UniswapFactory = require("../../lib/uniswap/UniswapFactory"); +const UniswapExchange = require("../../lib/uniswap/UniswapExchange"); +const ScdMcdMigration = require("../../build/ScdMcdMigration"); +const Join = require("../../build/JoinLike"); +const MakerV2Manager = require("../../build/MakerV2Manager"); +const MakerRegistry = require("../../build/MakerRegistry"); +const Wallet = require("../../build/BaseWallet"); +const DSToken = require("../../build/DSToken"); + +const DEFAULT_NETWORK = "kovan"; // a bug in kovan-fork makes some tests fail => use kovan +const SENT_AMOUNT = parseEther("0.00000001"); + +describe("Test MakerV2 DSR", function () { + this.timeout(1000000); + + if (!process.argv.join(" ").includes(__filename.slice(__dirname.length + 1))) { + // We do not want to run this file as part of the complete test suite. + // This is because this test file can only be run on kovan or kovan-fork + // (using the --fork option of ganache-cli) whereas other test files are run using ganache + return; + } + + let wallet; + let testManager; + let makerV2; + let saiToken; + let daiToken; + let walletAddress; + let owner; + let deployer; + + before(async () => { + const idx = process.argv.indexOf("--network"); + const network = idx > -1 ? process.argv[idx + 1] : DEFAULT_NETWORK; + if (!network.includes("kovan")) throw new Error("--network must be 'kovan' or 'kovan-fork'"); + + const deployManager = new DeployManager(network); + await deployManager.setup(); + const { configurator } = deployManager; + deployer = deployManager.deployer; + testManager = new TestManager([...Array(10)].map(() => deployer), network, deployer); + owner = deployer.signer; + const { config } = configurator; + + const migration = await deployer.wrapDeployedContract(ScdMcdMigration, config.defi.maker.migration); + const vat = await migration.vat(); + const makerRegistry = await deployer.deploy(MakerRegistry, {}, vat); + makerV2 = await deployer.deploy( + MakerV2Manager, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + config.defi.maker.migration, + config.defi.maker.pot, + config.defi.maker.jug, + makerRegistry.contractAddress, + config.defi.uniswap.factory, + { gasLimit: 8000000 }, + ); + + const daiJoin = await deployer.wrapDeployedContract(Join, await migration.daiJoin()); + const saiJoin = await deployer.wrapDeployedContract(Join, await migration.saiJoin()); + daiToken = await deployer.wrapDeployedContract(DSToken, await daiJoin.dai()); + saiToken = await deployer.wrapDeployedContract(DSToken, await saiJoin.gem()); + + const daiBalance = await daiToken.balanceOf(owner.address); + if (daiBalance.lt(parseEther("1"))) { + const uniswapFactory = await deployer.wrapDeployedContract(UniswapFactory, config.defi.uniswap.factory); + const daiExchange = await deployer.wrapDeployedContract(UniswapExchange, await uniswapFactory.getExchange(daiToken.contractAddress)); + await (await owner.sendTransaction({ to: daiExchange.contractAddress, value: parseEther("0.02"), gasLimit: 3000000 })).wait(); + } + + const saiBalance = await saiToken.balanceOf(owner.address); + if (saiBalance.lt(parseEther("1"))) { + const convertedToSai = (await daiToken.balanceOf(owner.address)).div(2); + await (await daiToken.approve(migration.contractAddress, convertedToSai)).wait(); + await (await migration.swapDaiToSai(convertedToSai)).wait(); + } + + wallet = await deployer.deploy(Wallet); + await (await wallet.init(owner.address, [makerV2.contractAddress])).wait(); + walletAddress = wallet.contractAddress; + }); + + async function topUpDai() { + const walletDai = await daiToken.balanceOf(walletAddress); + if (walletDai.lt(SENT_AMOUNT)) { + await (await daiToken.transfer(walletAddress, SENT_AMOUNT)).wait(); + } + } + + async function topUpPot() { + const invested = await makerV2.dsrBalance(walletAddress); + if (invested.lt(SENT_AMOUNT)) { + await topUpDai(); + await (await daiToken.transfer(walletAddress, SENT_AMOUNT)).wait(); + await (await makerV2.joinDsr(walletAddress, SENT_AMOUNT, { gasLimit: 2000000 })).wait(); + } + } + + describe("DSR", () => { + async function exchangeWithPot({ toPot, relayed, all = false }) { + const walletBefore = (await daiToken.balanceOf(walletAddress)).add(await saiToken.balanceOf(walletAddress)); + const investedBefore = await makerV2.dsrBalance(walletAddress); + let method; + if (toPot) { + method = "joinDsr"; + } else if (all) { + method = "exitAllDsr"; + } else { + method = "exitDsr"; + } + const params = [walletAddress].concat(all ? [] : [SENT_AMOUNT]); + if (relayed) { + await testManager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + } else { + await (await makerV2[method](...params, { gasLimit: 2000000 })).wait(); + } + const walletAfter = (await daiToken.balanceOf(walletAddress)).add(await saiToken.balanceOf(walletAddress)); + const investedAfter = await makerV2.dsrBalance(walletAddress); + const deltaInvested = toPot ? investedAfter.sub(investedBefore) : investedBefore.sub(investedAfter); + const deltaWallet = toPot ? walletBefore.sub(walletAfter) : walletAfter.sub(walletBefore); + assert.isTrue(deltaInvested.gt(0), "DAI in DSR should have changed."); + assert.isTrue(deltaWallet.gt(0), "DAI in wallet should have changed."); + + if (all) { + assert.isTrue(investedAfter.eq(0), "Pot should be emptied"); + assert.isTrue(walletAfter.gt(walletBefore), "DAI in wallet should have increased"); + } + } + + it("sends DAI to the pot (blockchain tx)", async () => { + await topUpDai(); + await exchangeWithPot({ toPot: true, relayed: false }); + }); + + it("sends DAI to the pot (relayed tx)", async () => { + await topUpDai(); + await exchangeWithPot({ toPot: true, relayed: true }); + }); + + it("withdraw DAI from the pot (blockchain tx)", async () => { + await topUpPot(); + await exchangeWithPot({ toPot: false, relayed: false }); + }); + + it("withdraw DAI from the pot (relayed tx)", async () => { + await topUpPot(); + await exchangeWithPot({ toPot: false, relayed: true }); + }); + + it("withdraw ALL DAI from the pot (blockchain tx)", async () => { + await topUpPot(); + await exchangeWithPot({ toPot: false, relayed: false, all: true }); + }); + + it("withdraw ALL DAI from the pot (relayed tx)", async () => { + await topUpPot(); + await exchangeWithPot({ toPot: false, relayed: true, all: true }); + }); + }); +}); diff --git a/test/integration/makerV2Manager_loan.js b/test/integration/makerV2Manager_loan.js new file mode 100644 index 000000000..4683b1884 --- /dev/null +++ b/test/integration/makerV2Manager_loan.js @@ -0,0 +1,683 @@ +// How to run this test file: +// 1. add your private key (KOVAN_PRIV_KEY) and Infura API key (INFURA_KEY) to .env +// --- TO TEST ON KOVAN: ---- +// 2. npx etherlime test test/makerV2Manager_loan.js --skip-compilation --network kovan +// --- TO TEST ON KOVAN-FORK: ---- +// 2. npm run kovan-fork +// 3. npx etherlime test test/makerV2Manager_loan.js --skip-compilation --network kovan-fork + +const ethers = require("ethers"); +const TestManager = require("../../utils/test-manager"); +const DeployManager = require("../../utils/deploy-manager.js"); +const MultisigExecutor = require("../../utils/multisigexecutor.js"); + +const MultiSig = require("../../build/MultiSigWallet"); +const UniswapFactory = require("../../lib/uniswap/UniswapFactory"); +const UniswapExchange = require("../../lib/uniswap/UniswapExchange"); +const Join = require("../../build/JoinLike"); +const Vat = require("../../build/VatLike"); +const FaucetUser = require("../../build/FaucetUser"); +const CdpManager = require("../../build/TestCdpManager"); +const MakerV1Manager = require("../../build/MakerManager"); +const MakerV2Manager = require("../../build/MakerV2Manager"); +const UpgradedMakerV2Manager = require("../../build/TestUpgradedMakerV2Manager"); +const TransferManager = require("../../build/TransferManager"); +const MakerRegistry = require("../../build/MakerRegistry"); +const ModuleRegistry = require("../../build/ModuleRegistry"); +const ScdMcdMigration = require("../../build/ScdMcdMigration"); +const Wallet = require("../../build/BaseWallet"); +const DSToken = require("../../build/DSToken"); + +const { parseEther, formatBytes32String } = ethers.utils; +const { HashZero } = ethers.constants; +const { bigNumToBytes32, ETH_TOKEN } = require("../../utils/utilities.js"); +const { RAY } = require("../../utils/defi-deployer"); + +const DEFAULT_NETWORK = "kovan-fork"; // also works on kovan (faster, but uses real KETH) + +describe("Test MakerV2 Vaults", function () { + this.timeout(1000000); + + if (!process.argv.join(" ").includes(__filename.slice(__dirname.length + 1))) { + // We do not want to run this file as part of the complete test suite. + // This is because this test file can currently only be run on kovan or kovan-fork + // (using the --fork option of ganache-cli) whereas other test files are run using ganache + return; + } + + let network; + let testManager; + let transferManager; + let migration; + let makerV1; + let makerV2; + let daiJoin; + let daiToken; + let saiJoin; + let saiToken; + let wethJoin; + let wethToken; + let batJoin; + let batToken; + let daiExchange; + let wallet; + let walletAddress; + let owner; + let makerRegistry; + let lastLoanId; + let config; + let deployer; + + before(async () => { + const idx = process.argv.indexOf("--network"); + network = idx > -1 ? process.argv[idx + 1] : DEFAULT_NETWORK; + if (!network.includes("kovan")) throw new Error("--network must be 'kovan' or 'kovan-fork'"); + + const deployManager = new DeployManager(network); + await deployManager.setup(); + const { configurator } = deployManager; + deployer = deployManager.deployer; + testManager = new TestManager([...Array(10)].map(() => deployer), network, deployer); + owner = deployer.signer; + config = configurator.config; + + migration = await deployer.wrapDeployedContract(ScdMcdMigration, config.defi.maker.migration); + daiJoin = await deployer.wrapDeployedContract(Join, await migration.daiJoin()); + daiToken = await deployer.wrapDeployedContract(DSToken, await daiJoin.dai()); + saiJoin = await deployer.wrapDeployedContract(Join, await migration.saiJoin()); + saiToken = await deployer.wrapDeployedContract(DSToken, await saiJoin.gem()); + wethJoin = await deployer.wrapDeployedContract(Join, await migration.wethJoin()); + wethToken = await deployer.wrapDeployedContract(DSToken, await wethJoin.gem()); + batJoin = await deployer.wrapDeployedContract(Join, config.defi.maker.batJoin); + batToken = await deployer.wrapDeployedContract(DSToken, await batJoin.gem()); + + const uniswapFactory = await deployer.wrapDeployedContract(UniswapFactory, config.defi.uniswap.factory); + daiExchange = await deployer.wrapDeployedContract(UniswapExchange, await uniswapFactory.getExchange(daiToken.contractAddress)); + + const vat = await migration.vat(); + makerRegistry = await deployer.deploy(MakerRegistry, {}, vat); + await (await makerRegistry.addCollateral(wethJoin.contractAddress)).wait(); + + makerV2 = await deployer.deploy( + MakerV2Manager, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + config.defi.maker.migration, + config.defi.maker.pot, + config.defi.maker.jug, + makerRegistry.contractAddress, + config.defi.uniswap.factory, + { gasLimit: 8000000 }, + ); + transferManager = await deployer.wrapDeployedContract(TransferManager, config.modules.TransferManager); + makerV1 = await deployer.wrapDeployedContract(MakerV1Manager, config.modules.MakerManager); + }); + + beforeEach(async () => { + lastLoanId = null; + wallet = await deployer.deploy(Wallet); + await wallet.verboseWaitForTransaction(await wallet.init(owner.address, [ + config.modules.MakerManager, // MakerV1 + makerV2.contractAddress, + transferManager.contractAddress, + ])); + walletAddress = wallet.contractAddress; + await (await owner.sendTransaction({ to: walletAddress, value: parseEther("0.3") })).wait(); + }); + + async function cleanup() { + if (lastLoanId) { + await (await makerV2.closeLoan(walletAddress, lastLoanId, { gasLimit: 4500000 })).wait(); + } + + + const ethBalance = await deployer.provider.getBalance(walletAddress); + const daiBalance = await daiToken.balanceOf(walletAddress); + await (await transferManager.transferToken(walletAddress, ETH_TOKEN, owner.address, ethBalance, HashZero, { gasLimit: 2000000 })).wait(); + await (await transferManager.transferToken( + walletAddress, + daiToken.contractAddress, + owner.address, + daiBalance, + HashZero, + { gasLimit: 2000000 }, + )).wait(); + const afterDAI = await daiToken.balanceOf(owner.address); + if (afterDAI.gt(0)) { + await (await daiToken.approve(daiExchange.contractAddress, afterDAI)).wait(); + const currentBlock = await testManager.getCurrentBlock(); + const timestamp = await testManager.getTimestamp(currentBlock); + await (await daiExchange.tokenToEthSwapInput(afterDAI, 1, timestamp + 24 * 3600, { gasLimit: 3000000 })).wait(); + } + } + + afterEach(async () => { + await cleanup(); + }); + + describe("Loan", () => { + async function getTestAmounts(tokenAddress) { + const tokenAddress_ = (tokenAddress === ETH_TOKEN) ? wethToken.contractAddress : tokenAddress; + const { ilk } = await makerRegistry.collaterals(tokenAddress_); + const vat = await deployer.wrapDeployedContract(Vat, await daiJoin.vat()); + const { spot, dust } = await vat.ilks(ilk); + const daiAmount = dust.div(RAY); + const collateralAmount = dust.div(spot).mul(12).div(10); + return { daiAmount, collateralAmount }; + } + + async function testOpenLoan({ + collateralAmount, daiAmount, relayed, collateral = { contractAddress: ETH_TOKEN }, + }) { + const beforeCollateral = (collateral.contractAddress === ETH_TOKEN) + ? await deployer.provider.getBalance(walletAddress) + : await collateral.balanceOf(walletAddress); + + const beforeDAI = await daiToken.balanceOf(walletAddress); + const beforeDAISupply = await daiToken.totalSupply(); + + const method = "openLoan"; + const params = [walletAddress, collateral.contractAddress, collateralAmount, daiToken.contractAddress, daiAmount]; + let txR; + if (relayed) { + txR = await testManager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + txR = await makerV2.verboseWaitForTransaction(await makerV2[method](...params, { gasLimit: 2000000 })); + } + lastLoanId = txR.events.find((e) => e.event === "LoanOpened").args._loanId; + assert.isDefined(lastLoanId, "Loan ID should be defined"); + + const afterCollateral = (collateral.contractAddress === ETH_TOKEN) + ? await deployer.provider.getBalance(walletAddress) + : await collateral.balanceOf(walletAddress); + const afterDAI = await daiToken.balanceOf(walletAddress); + const afterDAISupply = await daiToken.totalSupply(); + + assert.equal( + beforeCollateral.sub(afterCollateral).toString(), + collateralAmount.toString(), + `wallet should have ${collateralAmount} less collateral (relayed: ${relayed})`, + ); + assert.equal( + afterDAI.sub(beforeDAI).toString(), + daiAmount.toString(), + `wallet should have ${daiAmount} more DAI (relayed: ${relayed})`, + ); + assert.equal( + afterDAISupply.sub(beforeDAISupply).toString(), + daiAmount.toString(), + `${daiAmount} DAI should have been minted (relayed: ${relayed})`, + ); + + return lastLoanId; + } + + describe("Open Loan", () => { + let daiAmount; let + collateralAmount; + before(async () => { + const testAmounts = await getTestAmounts(ETH_TOKEN); + daiAmount = testAmounts.daiAmount; + collateralAmount = testAmounts.collateralAmount; + }); + + it("should open a Loan (blockchain tx)", async () => { + await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + }); + + it("should open a Loan (relayed tx)", async () => { + await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + }); + + it("should open>close>reopen a Loan (blockchain tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await (await makerV2.closeLoan(walletAddress, loanId, { gasLimit: 4500000 })).wait(); + await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + }); + + it("should open>close>reopen a Loan (relayed tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await (await makerV2.closeLoan(walletAddress, loanId, { gasLimit: 4500000 })).wait(); + await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + }); + }); + + async function testChangeCollateral({ + loanId, collateralAmount, add, relayed, collateral = { contractAddress: ETH_TOKEN }, makerV2Manager = makerV2, + }) { + const beforeCollateral = (collateral.contractAddress === ETH_TOKEN) + ? await deployer.provider.getBalance(walletAddress) + : await collateral.balanceOf(walletAddress); + + const method = add ? "addCollateral" : "removeCollateral"; + const params = [wallet.contractAddress, loanId, collateral.contractAddress, collateralAmount]; + if (relayed) { + const txR = await testManager.relay(makerV2Manager, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await makerV2Manager.verboseWaitForTransaction(await makerV2Manager[method](...params, { gasLimit: 2000000 })); + } + + const afterCollateral = (collateral.contractAddress === ETH_TOKEN) + ? await deployer.provider.getBalance(walletAddress) + : await collateral.balanceOf(walletAddress); + + const expectedCollateralChange = collateralAmount.mul(add ? -1 : 1).toString(); + assert.equal( + afterCollateral.sub(beforeCollateral).toString(), + expectedCollateralChange, + `wallet collateral should have changed by ${expectedCollateralChange} (relayed: ${relayed})`, + ); + } + + describe("Add/Remove Collateral", () => { + let daiAmount; let + collateralAmount; + before(async () => { + const testAmounts = await getTestAmounts(ETH_TOKEN); + daiAmount = testAmounts.daiAmount; + collateralAmount = testAmounts.collateralAmount; + }); + it("should add collateral (blockchain tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await testChangeCollateral({ + loanId, collateralAmount: parseEther("0.010"), add: true, relayed: false, + }); + }); + it("should add collateral (relayed tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await testChangeCollateral({ + loanId, collateralAmount: parseEther("0.010"), add: true, relayed: true, + }); + }); + it("should remove collateral (blockchain tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await testChangeCollateral({ + loanId, collateralAmount: parseEther("0.010"), add: false, relayed: false, + }); + }); + it("should remove collateral (relayed tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await testChangeCollateral({ + loanId, collateralAmount: parseEther("0.010"), add: false, relayed: true, + }); + }); + }); + + async function testChangeDebt({ + loanId, daiAmount, add, relayed, + }) { + const beforeDAI = await daiToken.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + const method = add ? "addDebt" : "removeDebt"; + const params = [wallet.contractAddress, loanId, daiToken.contractAddress, daiAmount]; + if (relayed) { + const txR = await testManager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await makerV2.verboseWaitForTransaction(await makerV2[method](...params, { gasLimit: 2000000 })); + } + const afterDAI = await daiToken.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + if (add) { + assert.equal( + afterDAI.sub(beforeDAI).toString(), + daiAmount.toString(), + `wallet DAI should have increased by ${daiAmount.toString()} (relayed: ${relayed})`, + ); + } else { + assert.isTrue( + afterDAI.lt(beforeDAI) || afterETH.lt(beforeETH), + `wallet DAI or ETH should have decreased (relayed: ${relayed})`, + ); + } + } + + describe("Increase Debt", () => { + let daiAmount; let + collateralAmount; + before(async () => { + const testAmounts = await getTestAmounts(ETH_TOKEN); + daiAmount = testAmounts.daiAmount; + collateralAmount = testAmounts.collateralAmount; + }); + it("should increase debt (blockchain tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.5"), add: true, relayed: false, + }); + }); + it("should increase debt (relayed tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.5"), add: true, relayed: true, + }); + }); + }); + + async function testRepayDebt({ useDai, relayed }) { + const { collateralAmount, daiAmount: daiAmount_ } = await getTestAmounts(ETH_TOKEN); + const daiAmount = daiAmount_.add(parseEther("0.3")); + + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed }); + if (!useDai) { + // move the borrowed DAI from the wallet to the owner + await (await transferManager.transferToken( + walletAddress, daiToken.contractAddress, owner.address, daiAmount, HashZero, { gasLimit: 3000000 }, + )).wait(); + // give some ETH to the wallet to be used for repayment + await (await owner.sendTransaction({ to: walletAddress, value: collateralAmount })).wait(); + } + await testManager.increaseTime(3); // wait 3 seconds + const beforeDAI = await daiToken.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.2"), add: false, relayed, + }); + const afterDAI = await daiToken.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + + if (useDai) assert.isTrue(afterDAI.lt(beforeDAI) && afterETH.eq(beforeETH), "should have less DAI"); + else assert.isTrue(afterDAI.eq(beforeDAI) && afterETH.lt(beforeETH), "should have less ETH"); + + // Send the borrowed DAI back to the wallet + if (!useDai) await (await daiToken.transfer(walletAddress, daiAmount)).wait(); + } + + describe("Repay Debt", () => { + it("should repay debt when paying fee in DAI (blockchain tx)", async () => { + await testRepayDebt({ useDai: true, relayed: false }); + }); + it("should repay debt when paying fee in DAI (relayed tx)", async () => { + await testRepayDebt({ useDai: true, relayed: true }); + }); + it("should repay debt when paying fee in ETH (blockchain tx)", async () => { + await testRepayDebt({ useDai: false, relayed: false }); + }); + it("should repay debt when paying fee in ETH (relayed tx)", async () => { + await testRepayDebt({ useDai: false, relayed: true }); + }); + }); + + async function testCloseLoan({ useDai, relayed }) { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed }); + // give some ETH to the wallet to be used for repayment + await (await owner.sendTransaction({ to: walletAddress, value: collateralAmount.mul(2) })).wait(); + if (!useDai) { + // move the borrowed DAI from the wallet to the owner + await (await transferManager.transferToken( + walletAddress, daiToken.contractAddress, owner.address, daiAmount, HashZero, { gasLimit: 3000000 }, + )).wait(); + } + await testManager.increaseTime(3); // wait 3 seconds + const beforeDAI = await daiToken.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + const method = "closeLoan"; + const params = [wallet.contractAddress, loanId]; + if (relayed) { + const txR = await testManager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await makerV2.verboseWaitForTransaction(await makerV2[method](...params, { gasLimit: 3000000 })); + } + lastLoanId = null; + const afterDAI = await daiToken.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + + if (useDai) assert.isTrue(afterDAI.lt(beforeDAI) && afterETH.sub(collateralAmount).lt(beforeETH), "should have spent some DAI and some ETH"); + else assert.isTrue(afterDAI.eq(beforeDAI) && afterETH.sub(collateralAmount).lt(beforeETH), "should have spent some ETH"); + + // Send the borrowed DAI back to the wallet + if (!useDai) await (await daiToken.transfer(walletAddress, daiAmount)).wait(); + } + + describe("Close Vaults", () => { + it("should close a vault when paying fee in DAI + ETH (blockchain tx)", async () => { + await testCloseLoan({ useDai: true, relayed: false }); + }); + it("should close a vault when paying fee in DAI + ETH (relayed tx)", async () => { + await testCloseLoan({ useDai: true, relayed: true }); + }); + it("should close a vault when paying fee in ETH (blockchain tx)", async () => { + await testCloseLoan({ useDai: false, relayed: false }); + }); + it("should close a vault when paying fee in ETH (relayed tx)", async () => { + await testCloseLoan({ useDai: false, relayed: true }); + }); + }); + + async function topupWalletToken(token, amount) { + while ((await token.balanceOf(owner.address)).lt(amount)) { + await deployer.deploy( + FaucetUser, + {}, + config.defi.maker.batFaucet, + token.contractAddress, + ); + } + await (await token.transfer(walletAddress, amount)).wait(); + } + + describe("Adding new collateral token to registry", () => { + it("should open a loan with a newly added collateral token", async () => { + await (await makerRegistry.addCollateral(batJoin.contractAddress)).wait(); + const { daiAmount, collateralAmount } = await getTestAmounts(batToken.contractAddress); + await topupWalletToken(batToken, collateralAmount); + await testOpenLoan({ + collateralAmount, daiAmount, collateral: batToken, relayed: false, + }); + await testManager.increaseTime(3); // wait 3 seconds + }); + }); + + describe("Acquiring a wallet's vault", () => { + async function testAcquireVault({ relayed }) { + // Create the vault with `owner` as owner + const cdpManager = await deployer.wrapDeployedContract(CdpManager, await migration.cdpManager()); + const { ilk } = await makerRegistry.collaterals(wethToken.contractAddress); + let txR = await (await cdpManager.open(ilk, owner.address)).wait(); + const vaultId = txR.events.find((e) => e.event === "NewCdp").args.cdp; + // Transfer the vault to the wallet + await (await cdpManager.give(vaultId, walletAddress)).wait(); + // Transfer the vault to the module + const loanId = bigNumToBytes32(vaultId); + const method = "acquireLoan"; + const params = [walletAddress, loanId]; + if (relayed) { + txR = await testManager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await (await makerV2[method](...params, { gasLimit: 1000000 })).wait(); + } + // Add some collateral and debt + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + await testChangeCollateral({ + loanId, collateralAmount, add: true, relayed, makerV2, + }); + await testChangeDebt({ + loanId, daiAmount, add: true, relayed, + }); + // Make it so that afterEach can close the newly acquired vault + lastLoanId = loanId; + } + + it("should transfer a vault from a wallet to the module (blockchain tx)", async () => { + await testAcquireVault({ relayed: false }); + }); + + it("should transfer a vault from a wallet to the module (relayed tx)", async () => { + await testAcquireVault({ relayed: true }); + }); + }); + + describe("Migrating an SCD CDP to an MCD vault", () => { + let walletAddressToMigrate; let + oldCdpId; + beforeEach(async () => { + if (network === "kovan-fork") { + // kovan-fork has a bug that prevents makerV1 from succesfully calling `saiTub.join(wad)` + // => we use a kovan wallet with an existing CDP + // the downside is that it can only be migrated once + oldCdpId = "0x0000000000000000000000000000000000000000000000000000000000001d04"; + walletAddressToMigrate = "0xAB3f50Ff1e4a516ef494b9C226ef0a26065766df"; + const walletToMigrate = await deployer.wrapDeployedContract(Wallet, walletAddressToMigrate); + if (!(await walletToMigrate.authorised(makerV2.contractAddress))) { + // Register the MakerV2 module in the ModuleRegistry + const moduleRegistry = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + const multisig = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(multisig, owner, config.multisig.autosign); + await multisigExecutor.executeCall(moduleRegistry, "registerModule", [makerV2.contractAddress, formatBytes32String("MakerV2Manager")]); + // Add the MakerV2 module to the existing wallet + await (await makerV1.addModule(walletAddressToMigrate, makerV2.contractAddress)).wait(); + } + } else { + const { daiAmount, collateralAmount } = await getTestAmounts(ETH_TOKEN); + const params = [walletAddress, ETH_TOKEN, collateralAmount, saiToken.contractAddress, daiAmount]; + const txReceipt = await (await makerV1.openLoan(...params, { gasLimit: 2000000 })).wait(); + oldCdpId = txReceipt.events.find((e) => e.event === "LoanOpened").args._loanId; + assert.isDefined(oldCdpId, "The old CDP ID should be defined"); + walletAddressToMigrate = walletAddress; + } + }); + + async function testMigrateCdp({ relayed }) { + // abort if oldCdpId no longer exists (it can only be migrated once on kovan-fork) + if (!await makerV1.exists(oldCdpId, await makerV1.makerCdp())) return; + + const method = "migrateCdp"; + const params = [walletAddressToMigrate, oldCdpId]; + let txR; + if (relayed) { + txR = await testManager.relay(makerV2, method, params, { contractAddress: walletAddressToMigrate }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + txR = await (await makerV2[method](...params, { gasLimit: 2000000 })).wait(); + } + const loanId = txR.events.find((e) => e.event === "CdpMigrated").args._newVaultId; + assert.isDefined(loanId, "The new vault ID should be defined"); + } + + it("should migrate a CDP (blockchain tx)", async () => { + await testMigrateCdp({ relayed: false }); + }); + + it("should migrate a CDP (relayed tx)", async () => { + // Note that this test will be skipped on kovan-fork as the CDP used can only be migrated once + await testMigrateCdp({ relayed: true }); + }); + }); + + describe("Upgrade of MakerV2Manager", () => { + let upgradedMakerV2; let daiAmount; let + collateralAmount; + before(async () => { + // Generate test amounts + const testAmounts = await getTestAmounts(ETH_TOKEN); + daiAmount = testAmounts.daiAmount; + collateralAmount = testAmounts.collateralAmount; + + // Deploy the upgraded MakerV2 module + upgradedMakerV2 = await deployer.deploy( + UpgradedMakerV2Manager, + {}, + config.contracts.ModuleRegistry, + config.modules.GuardianStorage, + config.defi.maker.migration, + config.defi.maker.pot, + config.defi.maker.jug, + makerRegistry.contractAddress, + config.defi.uniswap.factory, + makerV2.contractAddress, + { gasLimit: 10700000 }, + ); + + // Register the upgraded MakerV2 module in the ModuleRegistry + const moduleRegistry = await deployer.wrapDeployedContract(ModuleRegistry, config.contracts.ModuleRegistry); + const multisig = await deployer.wrapDeployedContract(MultiSig, config.contracts.MultiSigWallet); + const multisigExecutor = new MultisigExecutor(multisig, owner, config.multisig.autosign); + await multisigExecutor.executeCall( + moduleRegistry, + "registerModule", + [upgradedMakerV2.contractAddress, formatBytes32String("UpgradedMakerV2Manager")], + ); + + // Adding BAT to the registry of supported collateral tokens + if (!(await makerRegistry.collaterals(batToken.contractAddress)).exists) { + await (await makerRegistry.addCollateral(batJoin.contractAddress)).wait(); + } + }); + + async function testUpgradeModule({ relayed, withBatVault = false }) { + // Open a WETH vault with the old MakerV2 module + const loanId1 = await testOpenLoan({ collateralAmount, daiAmount, relayed }); + + let loanId2; + if (withBatVault) { + // Open a BAT vault with the old MakerV2 module + const batTestAmounts = await getTestAmounts(batToken.contractAddress); + await topupWalletToken(batToken, batTestAmounts.collateralAmount.add(parseEther("0.01"))); + loanId2 = await testOpenLoan({ + collateralAmount: batTestAmounts.collateralAmount, + daiAmount: batTestAmounts.daiAmount, + collateral: batToken, + relayed, + }); + } + + // Add the upgraded module + const method = "addModule"; + const params = [walletAddress, upgradedMakerV2.contractAddress]; + if (relayed) { + const txR = await testManager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await (await makerV2[method](...params, { gasLimit: 2000000 })).wait(); + } + + // Make sure that the vaults can be manipulated from the upgraded module + await testChangeCollateral({ + loanId: loanId1, + collateralAmount: parseEther("0.010"), + add: true, + relayed, + makerV2Manager: upgradedMakerV2, + }); + await (await upgradedMakerV2.closeLoan(walletAddress, loanId1, { gasLimit: 4500000 })).wait(); + + if (withBatVault) { + await testChangeCollateral({ + loanId: loanId2, + collateralAmount: parseEther("0.010"), + add: true, + relayed, + collateral: batToken, + makerV2Manager: upgradedMakerV2, + }); + await (await upgradedMakerV2.closeLoan(walletAddress, loanId2, { gasLimit: 4500000 })).wait(); + } + + // Prevent afterEach from closing the (already closed) last loan + lastLoanId = null; + } + + it("should move a vault after a module upgrade (blockchain tx)", async () => { + await testUpgradeModule({ relayed: false }); + }); + + it("should move a vault after a module upgrade (relayed tx)", async () => { + await testUpgradeModule({ relayed: true }); + }); + + it("should move 2 vaults after a module upgrade (blockchain tx)", async () => { + await testUpgradeModule({ withBatVault: true, relayed: false }); + }); + + it("should move 2 vaults after a module upgrade (relayed tx)", async () => { + await testUpgradeModule({ withBatVault: true, relayed: true }); + }); + }); + }); +}); diff --git a/test/kyber.js b/test/kyber.js index 31dc387bc..acd3274ef 100644 --- a/test/kyber.js +++ b/test/kyber.js @@ -1,70 +1,74 @@ -const BN = require('bn.js'); +/* global accounts */ +const ethers = require("ethers"); -const KyberNetwork = require('../build/KyberNetworkTest') -const ERC20 = require('../build/TestERC20'); +const KyberNetwork = require("../build/KyberNetworkTest"); +const ERC20 = require("../build/TestERC20"); const TestManager = require("../utils/test-manager"); +const { ETH_TOKEN } = require("../utils/utilities.js"); -const ETH_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' const ERC20_SUPPLY = 10000000; const ERC20_DECIMALS = 18; const ERC20_RATE = 51 * 10 ** 13; // 1 ERC20 = 0.00051 ETH -describe('Test Kyber', function () { - this.timeout(10000); +describe("Kyber", function () { + this.timeout(10000); - const manager = new TestManager(); + const manager = new TestManager(); - let trader = accounts[1].signer; + const trader = accounts[1].signer; - let erc20; - let kyber; + let deployer; + let erc20; + let kyber; - beforeEach(async function () { - deployer = manager.newDeployer(); - kyber = await deployer.deploy(KyberNetwork); - erc20 = await deployer.deploy(ERC20, {}, [kyber.contractAddress], ERC20_SUPPLY, ERC20_DECIMALS); - await kyber.addToken(erc20.contractAddress, ERC20_RATE, ERC20_DECIMALS); - }); + beforeEach(async () => { + deployer = manager.newDeployer(); + kyber = await deployer.deploy(KyberNetwork); + erc20 = await deployer.deploy(ERC20, {}, [kyber.contractAddress], ERC20_SUPPLY, ERC20_DECIMALS); + await kyber.addToken(erc20.contractAddress, ERC20_RATE, ERC20_DECIMALS); + }); - it('should return the expected rate for a token pair', async function () { - let rate = await kyber.getExpectedRate(erc20.contractAddress, ETH_TOKEN, 1); - assert.equal(rate[0], ERC20_RATE, "rate should be correct"); - }); + it("should return the expected rate for a token pair", async () => { + const rate = await kyber.getExpectedRate(erc20.contractAddress, ETH_TOKEN, 1); + assert.equal(rate[0], ERC20_RATE, "rate should be correct"); + }); - it('should exchange ETH for ERC20', async function () { - let beforeERC20 = await erc20.balanceOf(trader.address); - let beforeETH = await deployer.provider.getBalance(trader.address); - assert.equal(beforeERC20.toNumber(), 0, "trader should have no ERC20"); - await kyber.from(trader).trade(ETH_TOKEN, 10000, erc20.contractAddress, trader.address, ethers.utils.bigNumberify('10000000000000000000000'), 1, '0x0000000000000000000000000000000000000000', { value: 10000, gasLimit: 200000 }); - let afterERC20 = await erc20.balanceOf(trader.address); - let afterETH = await deployer.provider.getBalance(trader.address); - assert.equal(beforeETH.sub(afterETH).gt(10000), true, "trader should have exchanged 10000 wei"); - assert.equal(afterERC20.gt(0), true, "trader should have received ERC20"); - }); + it("should exchange ETH for ERC20", async () => { + const beforeERC20 = await erc20.balanceOf(trader.address); + const beforeETH = await deployer.provider.getBalance(trader.address); + assert.equal(beforeERC20.toNumber(), 0, "trader should have no ERC20"); + await kyber.from(trader).trade(ETH_TOKEN, 10000, erc20.contractAddress, trader.address, + ethers.utils.bigNumberify("10000000000000000000000"), 1, "0x0000000000000000000000000000000000000000", { value: 10000, gasLimit: 200000 }); + const afterERC20 = await erc20.balanceOf(trader.address); + const afterETH = await deployer.provider.getBalance(trader.address); + assert.equal(beforeETH.sub(afterETH).gt(10000), true, "trader should have exchanged 10000 wei"); + assert.equal(afterERC20.gt(0), true, "trader should have received ERC20"); + }); - it('should exchange ERC20 for ETH', async function () { - // provision ERC20 to trader - await kyber.trade( - ETH_TOKEN, - ethers.utils.bigNumberify('1000000000000000000'), - erc20.contractAddress, - trader.address, - ethers.utils.bigNumberify('10000000000000000000000'), - 1, - '0x0000000000000000000000000000000000000000', - { value: ethers.utils.bigNumberify('1000000000000000000'), gasLimit: 200000 } - ); - let beforeERC20 = await erc20.balanceOf(trader.address); - let beforeETH = await deployer.provider.getBalance(trader.address); - assert.equal(beforeERC20 > 0, true, "trader should have some ERC20"); - // exchange ERC20 - let srcAmount = beforeERC20.div(ethers.utils.bigNumberify(2)); - await erc20.from(trader).approve(kyber.contractAddress, srcAmount); - await kyber.from(trader).trade(erc20.contractAddress, srcAmount, ETH_TOKEN, trader.address, ethers.utils.bigNumberify('10000000000000000000000'), 1, '0x0000000000000000000000000000000000000000', { gasLimit: 200000 }); - let afterERC20 = await erc20.balanceOf(trader.address); - let afterETH = await deployer.provider.getBalance(trader.address); - assert.equal(beforeERC20.sub(afterERC20).eq(srcAmount), true, "trader should have exchanged ERC20"); - assert.equal(afterETH.sub(beforeETH).gt(0), true, "trader should have received wei"); - }); -}); \ No newline at end of file + it("should exchange ERC20 for ETH", async () => { + // provision ERC20 to trader + await kyber.trade( + ETH_TOKEN, + ethers.utils.bigNumberify("1000000000000000000"), + erc20.contractAddress, + trader.address, + ethers.utils.bigNumberify("10000000000000000000000"), + 1, + "0x0000000000000000000000000000000000000000", + { value: ethers.utils.bigNumberify("1000000000000000000"), gasLimit: 200000 }, + ); + const beforeERC20 = await erc20.balanceOf(trader.address); + const beforeETH = await deployer.provider.getBalance(trader.address); + assert.equal(beforeERC20 > 0, true, "trader should have some ERC20"); + // exchange ERC20 + const srcAmount = beforeERC20.div(ethers.utils.bigNumberify(2)); + await erc20.from(trader).approve(kyber.contractAddress, srcAmount); + await kyber.from(trader).trade(erc20.contractAddress, srcAmount, ETH_TOKEN, trader.address, + ethers.utils.bigNumberify("10000000000000000000000"), 1, "0x0000000000000000000000000000000000000000", { gasLimit: 200000 }); + const afterERC20 = await erc20.balanceOf(trader.address); + const afterETH = await deployer.provider.getBalance(trader.address); + assert.equal(beforeERC20.sub(afterERC20).eq(srcAmount), true, "trader should have exchanged ERC20"); + assert.equal(afterETH.sub(beforeETH).gt(0), true, "trader should have received wei"); + }); +}); diff --git a/test/lockManager.js b/test/lockManager.js index fd377ea6a..e05a24e8a 100644 --- a/test/lockManager.js +++ b/test/lockManager.js @@ -1,124 +1,159 @@ +/* global accounts */ const GuardianManager = require("../build/GuardianManager"); const LockManager = require("../build/LockManager"); const GuardianStorage = require("../build/GuardianStorage"); const Wallet = require("../build/BaseWallet"); const Registry = require("../build/ModuleRegistry"); +const RecoveryManager = require("../build/RecoveryManager"); const TestManager = require("../utils/test-manager"); const { parseRelayReceipt } = require("../utils/utilities.js"); describe("LockManager", function () { - this.timeout(10000); + this.timeout(10000); + + const manager = new TestManager(); + + const owner = accounts[1].signer; + const guardian1 = accounts[2].signer; + const nonguardian = accounts[3].signer; + + let deployer; + let guardianManager; + let guardianStorage; + let registry; + let lockManager; + let recoveryManager; + let wallet; + + beforeEach(async () => { + deployer = manager.newDeployer(); + registry = await deployer.deploy(Registry); + guardianStorage = await deployer.deploy(GuardianStorage); + guardianManager = await deployer.deploy(GuardianManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24, 12); + lockManager = await deployer.deploy(LockManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24 * 5); + recoveryManager = await deployer.deploy(RecoveryManager, {}, registry.contractAddress, guardianStorage.contractAddress, 36, 24 * 5, 24, 12); + + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [guardianManager.contractAddress, lockManager.contractAddress, recoveryManager.contractAddress]); + }); + + describe("(Un)Lock by EOA guardians", () => { + beforeEach(async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); + assert.equal(count, 1, "1 guardian should be added"); + const isGuardian = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); + assert.isTrue(isGuardian, "guardian1 should be a guardian of the wallet"); + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(isLocked, "should be unlocked by default"); + }); + + it("should be locked/unlocked by EOA guardians (blockchain transaction)", async () => { + // lock + await lockManager.from(guardian1).lock(wallet.contractAddress); + let state = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(state, "should be locked by guardian"); + let releaseTime = await lockManager.getLock(wallet.contractAddress); + assert.isTrue(releaseTime > 0, "releaseTime should be positive"); + // unlock + await lockManager.from(guardian1).unlock(wallet.contractAddress); + state = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(state, "should be unlocked by guardian"); + releaseTime = await lockManager.getLock(wallet.contractAddress); + assert.equal(releaseTime, 0, "releaseTime should be zero"); + }); - const manager = new TestManager(); + it("should be locked/unlocked by EOA guardians (relayed transaction)", async () => { + await manager.relay(lockManager, "lock", [wallet.contractAddress], wallet, [guardian1]); + let state = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(state, "should be locked by guardian"); - let owner = accounts[1].signer; - let guardian1 = accounts[2].signer; - let nonguardian = accounts[3].signer; + await manager.relay(lockManager, "unlock", [wallet.contractAddress], wallet, [guardian1]); + state = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(state, "should be unlocked by guardian"); + }); + + it("should fail to lock/unlock by non-guardian EOAs (blockchain transaction)", async () => { + await assert.revert(lockManager.from(nonguardian).lock(wallet.contractAddress), "locking from non-guardian should fail"); - let guardianManager, lockManager, wallet; + await lockManager.from(guardian1).lock(wallet.contractAddress); + const state = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(state, "should be locked by guardian1"); + + await assert.revert(lockManager.from(nonguardian).unlock(wallet.contractAddress)); + }); + }); + describe("(Un)Lock by Smart Contract guardians", () => { beforeEach(async () => { - deployer = manager.newDeployer(); - const registry = await deployer.deploy(Registry); - let guardianStorage = await deployer.deploy(GuardianStorage); - guardianManager = await deployer.deploy(GuardianManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24, 12); - lockManager = await deployer.deploy(LockManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24 * 5); - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [guardianManager.contractAddress, lockManager.contractAddress]); + const guardianWallet = await deployer.deploy(Wallet); + await guardianWallet.init(guardian1.address, [guardianManager.contractAddress, lockManager.contractAddress]); + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardianWallet.contractAddress); + const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); + assert.equal(count, 1, "1 guardian should be added"); + const isGuardian = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet.contractAddress); + assert.isTrue(isGuardian, "guardian1 should be a guardian of the wallet"); + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(isLocked, "should be unlocked by default"); }); - describe("(Un)Lock by EOA guardians", () => { - beforeEach(async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address, { gasLimit: 500000 }); - const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 1, "1 guardian should be added"); - const isGuardian = await guardianManager.isGuardian(wallet.contractAddress, guardian1.address); - assert.isTrue(isGuardian, "guardian1 should be a guardian of the wallet"); - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(isLocked, "should be unlocked by default"); - }); - - it("should be locked/unlocked by EOA guardians (blockchain transaction)", async () => { - // lock - await lockManager.from(guardian1).lock(wallet.contractAddress); - let state = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(state, "should be locked by guardian"); - let releaseTime = await lockManager.getLock(wallet.contractAddress); - assert.isTrue(releaseTime > 0, "releaseTime should be positive"); - // unlock - await lockManager.from(guardian1).unlock(wallet.contractAddress); - state = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(state, "should be unlocked by guardian"); - releaseTime = await lockManager.getLock(wallet.contractAddress); - assert.equal(releaseTime, 0, "releaseTime should be zero"); - }); - - it("should be locked/unlocked by EOA guardians (relayed transaction)", async () => { - await manager.relay(lockManager, "lock", [wallet.contractAddress], wallet, [guardian1]); - let state = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(state, "should be locked by guardian"); - - await manager.relay(lockManager, "unlock", [wallet.contractAddress], wallet, [guardian1]); - state = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(state, "should be unlocked by guardian"); - }); - - it("should fail to lock/unlock by non-guardian EOAs (blockchain transaction)", async () => { - await assert.revert(lockManager.from(nonguardian).lock(wallet.contractAddress), "locking from non-guardian should fail"); - - await lockManager.from(guardian1).lock(wallet.contractAddress); - const state = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(state, "should be locked by guardian1"); - - await assert.revert(lockManager.from(nonguardian).unlock(wallet.contractAddress)); - }); + it("should be locked/unlocked by Smart Contract guardians (relayed transaction)", async () => { + await manager.relay(lockManager, "lock", [wallet.contractAddress], wallet, [guardian1]); + let state = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(state, "should be locked by guardian"); + + await manager.relay(lockManager, "unlock", [wallet.contractAddress], wallet, [guardian1]); + state = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(state, "should be unlocked by locker"); + }); + + it("should fail to lock/unlock by Smart Contract guardians when signer is not authorized (relayed transaction)", async () => { + const txReceipt = await manager.relay(lockManager, "lock", [wallet.contractAddress], wallet, [nonguardian]); + const success = parseRelayReceipt(txReceipt); + assert.isNotOk(success, "locking from non-guardian should fail"); + }); + }); + + describe("Auto-unlock", () => { + it("should auto-unlock after lock period", async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + await lockManager.from(guardian1).lock(wallet.contractAddress); + let state = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(state, "should be locked by guardian"); + let releaseTime = await lockManager.getLock(wallet.contractAddress); + assert.isTrue(releaseTime > 0, "releaseTime should be positive"); + + await manager.increaseTime(24 * 5 + 5); + state = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(state, "should be unlocked by guardian"); + releaseTime = await lockManager.getLock(wallet.contractAddress); + assert.equal(releaseTime, 0, "releaseTime should be zero"); }); + }); - describe("(Un)Lock by Smart Contract guardians", () => { - beforeEach(async () => { - guardianWallet = await deployer.deploy(Wallet); - await guardianWallet.init(guardian1.address, [guardianManager.contractAddress, lockManager.contractAddress]); - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardianWallet.contractAddress, { gasLimit: 500000 }); - const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, 1, "1 guardian should be added"); - const isGuardian = await guardianManager.isGuardian(wallet.contractAddress, guardianWallet.contractAddress); - assert.isTrue(isGuardian, "guardian1 should be a guardian of the wallet"); - let isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(isLocked, "should be unlocked by default"); - }); - - it("should be locked/unlocked by Smart Contract guardians (relayed transaction)", async () => { - await manager.relay(lockManager, "lock", [wallet.contractAddress], wallet, [guardian1]); - let state = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(state, "should be locked by guardian"); - - await manager.relay(lockManager, "unlock", [wallet.contractAddress], wallet, [guardian1]); - state = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(state, "should be unlocked by locker"); - }); - - it("should fail to lock/unlock by Smart Contract guardians when signer is not authorized (relayed transaction)", async () => { - let txReceipt = await manager.relay(lockManager, "lock", [wallet.contractAddress], wallet, [nonguardian]); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "locking from non-guardian should fail"); - }); + describe("Unlocking wallets", () => { + beforeEach(async () => { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address); + }); + + it("should not be able to unlock, an already unlocked wallet", async () => { + // lock + await lockManager.from(guardian1).lock(wallet.contractAddress); + // unlock + await lockManager.from(guardian1).unlock(wallet.contractAddress); + // try to unlock again + await assert.revertWith(lockManager.from(guardian1).unlock(wallet.contractAddress), + "VM Exception while processing transaction: revert GD: wallet must be locked"); }); - describe("Auto-unlock", () => { - it("should auto-unlock after lock period", async () => { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, guardian1.address, { gasLimit: 500000 }); - await lockManager.from(guardian1).lock(wallet.contractAddress); - let state = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(state, "should be locked by guardian"); - let releaseTime = await lockManager.getLock(wallet.contractAddress); - assert.isTrue(releaseTime > 0, "releaseTime should be positive"); - - await manager.increaseTime(24 * 5 + 5); - state = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(state, "should be unlocked by guardian"); - releaseTime = await lockManager.getLock(wallet.contractAddress); - assert.equal(releaseTime, 0, "releaseTime should be zero"); - }); + it("should not be able to unlock a wallet, locked by another module", async () => { + // lock by putting the wallet in recovery mode + await manager.relay(recoveryManager, "executeRecovery", [wallet.contractAddress, accounts[5].signer.address], wallet, [guardian1]); + + // try to unlock + await assert.revertWith(lockManager.from(guardian1).unlock(wallet.contractAddress), + "LM: cannot unlock a wallet that was locked by another module"); }); -}); \ No newline at end of file + }); +}); diff --git a/test/makerManager_loan.js b/test/makerManager_loan.js index 67b80208a..d397ec9ac 100644 --- a/test/makerManager_loan.js +++ b/test/makerManager_loan.js @@ -1,321 +1,276 @@ -const etherlime = require('etherlime-lib'); +/* global accounts */ +const { parseEther, bigNumberify } = require("ethers").utils; +const { + deployMaker, deployUniswap, ETH_PER_DAI, ETH_PER_MKR, +} = require("../utils/defi-deployer"); +const { bigNumToBytes32, ETH_TOKEN } = require("../utils/utilities.js"); +const TestManager = require("../utils/test-manager"); const Wallet = require("../build/BaseWallet"); const Registry = require("../build/ModuleRegistry"); - const GuardianStorage = require("../build/GuardianStorage"); const MakerManager = require("../build/MakerManager"); -const UniswapFactory = require("../contracts/test/uniswap/UniswapFactory"); -const UniswapExchange = require("../contracts/test/uniswap/UniswapExchange"); - -const TestManager = require("../utils/test-manager"); - -const Vox = require("../build/SaiVox"); -const Tub = require("../build/SaiTub"); -const DSToken = require("../build/DSToken"); -const WETH = require("../build/WETH9"); -const DSValue = require("../build/DSValue"); -const { parseEther, formatBytes32String, bigNumberify } = require('ethers').utils; -const { bigNumToBytes32 } = require('../utils/utilities.js'); - -const RAY = bigNumberify('1000000000000000000000000000') // 10**27 -const WAD = bigNumberify('1000000000000000000') // 10**18 -const ETH_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; -const USD_PER_DAI = RAY; // 1 DAI = 1 USD -const USD_PER_ETH = WAD.mul(100); // 1 ETH = 100 USD -const USD_PER_MKR = WAD.mul(400); // 1 MKR = 400 USD -const ETH_PER_MKR = WAD.mul(USD_PER_MKR).div(USD_PER_ETH); // 1 MKR = 4 ETH -const ETH_PER_DAI = WAD.mul(USD_PER_DAI).div(RAY).mul(WAD).div(USD_PER_ETH); // 1 DAI = 0.01 ETH - -describe("Test CDP Module", function () { - this.timeout(10000); - - const manager = new TestManager(); - - const infrastructure = accounts[0].signer; - const owner = accounts[1].signer; - const pit = accounts[2].signer; - - let deployer, loanManager, wallet, sai, gov, tub, uniswapFactory, pip; - - before(async () => { - deployer = manager.newDeployer(); - - const registry = await deployer.deploy(Registry); - const guardianStorage = await deployer.deploy(GuardianStorage); - - // deploy MakerDAO infrastructure - const vox = await deployer.deploy(Vox, {}, USD_PER_DAI); - sai = await deployer.deploy(DSToken, {}, formatBytes32String("DAI")); - gov = await deployer.deploy(DSToken, {}, formatBytes32String("MKR")); - const sin = await deployer.deploy(DSToken, {}, formatBytes32String("SIN")); - const skr = await deployer.deploy(DSToken, {}, formatBytes32String("PETH")); - const gem = await deployer.deploy(WETH); - pip = await deployer.deploy(DSValue); - const pep = await deployer.deploy(DSValue); - tub = await deployer.deploy(Tub, {}, - sai.contractAddress, - sin.contractAddress, - skr.contractAddress, - gem.contractAddress, - gov.contractAddress, - pip.contractAddress, - pep.contractAddress, - vox.contractAddress, - pit.address); - - // let the Tub mint PETH and DAI - await skr.setOwner(tub.contractAddress); - await sai.setOwner(tub.contractAddress); - // setup USD/ETH oracle with a convertion rate of 100 USD/ETH - await pip.poke('0x' + USD_PER_ETH.toHexString().slice(2).padStart(64, '0')); - // setup USD/MKR oracle with a convertion rate of 400 USD/MKR - await pep.poke('0x' + USD_PER_MKR.toHexString().slice(2).padStart(64, '0')); - // set the total DAI debt ceiling to 50,000 DAI - await tub.mold(formatBytes32String('cap'), parseEther('50000')); - // set the liquidity ratio to 150% - await tub.mold(formatBytes32String('mat'), RAY.mul(3).div(2)); - // set the governance fee to 7.5% APR - await tub.mold(formatBytes32String('fee'), '1000000002293273137447730714'); - - // setup Uniswap for purchase of MKR and DAI - uniswapFactory = await deployer.deploy(UniswapFactory); - const uniswapTemplateExchange = await deployer.deploy(UniswapExchange); - await uniswapFactory.initializeFactory(uniswapTemplateExchange.contractAddress); - let ethLiquidity = parseEther('10'); - // MKR - await uniswapFactory.from(infrastructure).createExchange(gov.contractAddress); - const mkrExchange = await etherlime.ContractAt(UniswapExchange, await uniswapFactory.getExchange(gov.contractAddress)); - let mkrLiquidity = ethLiquidity.mul(WAD).div(ETH_PER_MKR); - await gov['mint(address,uint256)'](infrastructure.address, mkrLiquidity); - await gov.from(infrastructure).approve(mkrExchange.contractAddress, mkrLiquidity); - let currentBlock = await manager.getCurrentBlock(); - let timestamp = await manager.getTimestamp(currentBlock); - await mkrExchange.from(infrastructure).addLiquidity(1, mkrLiquidity, timestamp + 300, { value: ethLiquidity, gasLimit: 150000 }); - // DAI - await uniswapFactory.from(infrastructure).createExchange(sai.contractAddress); - const saiExchange = await etherlime.ContractAt(UniswapExchange, await uniswapFactory.getExchange(sai.contractAddress)); - let saiLiquidity = ethLiquidity.mul(WAD).div(ETH_PER_DAI); - await sai['mint(address,uint256)'](infrastructure.address, saiLiquidity); - await sai.from(infrastructure).approve(saiExchange.contractAddress, saiLiquidity); - currentBlock = await manager.getCurrentBlock(); - timestamp = await manager.getTimestamp(currentBlock); - await saiExchange.from(infrastructure).addLiquidity(1, saiLiquidity, timestamp + 300, { value: ethLiquidity, gasLimit: 150000 }); - - loanManager = await deployer.deploy( - MakerManager, - {}, - registry.contractAddress, - guardianStorage.contractAddress, - tub.contractAddress, - uniswapFactory.contractAddress - ); - }); - - beforeEach(async () => { - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [loanManager.contractAddress]); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther('5') }); +describe("CDP Module", function () { + this.timeout(100000); + + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + + let deployer; + let loanManager; + let wallet; + let sai; + let gov; + let tub; + let uniswapFactory; + let pip; + + before(async () => { + deployer = manager.newDeployer(); + + // Deploy Maker + const mk = await deployMaker(deployer, infrastructure); + [sai, gov, pip, tub] = [mk.sai, mk.gov, mk.pip, mk.tub]; + + const registry = await deployer.deploy(Registry); + const guardianStorage = await deployer.deploy(GuardianStorage); + + // Deploy & setup Uniswap for purchase of MKR and DAI + const uni = await deployUniswap(deployer, manager, infrastructure, [gov, sai], [ETH_PER_MKR, ETH_PER_DAI]); + uniswapFactory = uni.uniswapFactory; + + loanManager = await deployer.deploy( + MakerManager, + {}, + registry.contractAddress, + guardianStorage.contractAddress, + tub.contractAddress, + uniswapFactory.contractAddress, + ); + }); + + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [loanManager.contractAddress]); + await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther("5") }); + }); + + describe("Loan", () => { + async function testOpenLoan({ ethAmount, daiAmount, relayed }) { + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + const beforeDAI = await sai.balanceOf(wallet.contractAddress); + const beforeDAISupply = await sai.totalSupply(); + + const params = [wallet.contractAddress, ETH_TOKEN, ethAmount, sai.contractAddress, daiAmount]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(loanManager, "openLoan", params, wallet, [owner]); + } else { + const tx = await loanManager.from(owner).openLoan(...params, { gasLimit: 2000000 }); + txReceipt = await loanManager.verboseWaitForTransaction(tx); + } + const loanId = txReceipt.events.find((e) => e.event === "LoanOpened").args._loanId; + assert.isDefined(loanId, "Loan ID should be defined"); + + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + const afterDAI = await sai.balanceOf(wallet.contractAddress); + const afterDAISupply = await sai.totalSupply(); + + assert.equal(beforeETH.sub(afterETH).toString(), ethAmount.toString(), `wallet should have ${ethAmount} less ETH (relayed: ${relayed})`); + assert.equal(afterDAI.sub(beforeDAI).toString(), daiAmount.toString(), `wallet should have ${daiAmount} more DAI (relayed: ${relayed})`); + assert.equal(afterDAISupply.sub(beforeDAISupply).toString(), daiAmount.toString(), + `${daiAmount} DAI should have been minted (relayed: ${relayed})`); + + return loanId; + } + + describe("Open Loan", () => { + it("should open a Loan (blockchain tx)", async () => { + await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("6.6"), relayed: false }); + }); + it("should open a Loan (relayed tx)", async () => { + await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("6.6"), relayed: true }); + }); }); - describe("Loan", () => { - async function testOpenLoan({ ethAmount, daiAmount, relayed }) { - const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); - const beforeDAI = await sai.balanceOf(wallet.contractAddress); - const beforeDAISupply = await sai.totalSupply(); - - const params = [wallet.contractAddress, ETH_TOKEN, ethAmount, sai.contractAddress, daiAmount]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(loanManager, 'openLoan', params, wallet, [owner]); - } else { - const tx = await loanManager.from(owner).openLoan(...params, { gasLimit: 2000000 }); - txReceipt = await loanManager.verboseWaitForTransaction(tx); - } - const loanId = txReceipt.events.find(e => e.event === 'LoanOpened').args._loanId; - assert.isDefined(loanId, 'Loan ID should be defined') - - const afterETH = await deployer.provider.getBalance(wallet.contractAddress); - const afterDAI = await sai.balanceOf(wallet.contractAddress); - const afterDAISupply = await sai.totalSupply(); - - assert.equal(beforeETH.sub(afterETH).toString(), ethAmount.toString(), `wallet should have ${ethAmount} less ETH (relayed: ${relayed})`); - assert.equal(afterDAI.sub(beforeDAI).toString(), daiAmount.toString(), `wallet should have ${daiAmount} more DAI (relayed: ${relayed})`); - assert.equal(afterDAISupply.sub(beforeDAISupply).toString(), daiAmount.toString(), `${daiAmount} DAI should have been minted (relayed: ${relayed})`); - - return loanId; - } - - describe("Open Loan", () => { - it('should open a Loan (blockchain tx)', async () => { - await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('6.6'), relayed: false }) - }); - it('should open a Loan (relayed tx)', async () => { - await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('6.6'), relayed: true }) - }); + async function testChangeCollateral({ + loanId, ethAmount, add, relayed, + }) { + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + const method = add ? "addCollateral" : "removeCollateral"; + const params = [wallet.contractAddress, loanId, ETH_TOKEN, ethAmount]; + if (relayed) { + await manager.relay(loanManager, method, params, wallet, [owner]); + } else { + await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); + } + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + const expectedETHChange = ethAmount.mul(add ? -1 : 1).toString(); + assert.equal(afterETH.sub(beforeETH).toString(), expectedETHChange, + `wallet ETH should have changed by ${expectedETHChange} (relayed: ${relayed})`); + } + + describe("Add/Remove Collateral", () => { + it("should add collateral (blockchain tx)", async () => { + const loanId = await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("2"), relayed: false }); + await testChangeCollateral({ + loanId, ethAmount: parseEther("0.010"), add: true, relayed: false, }); - - async function testChangeCollateral({ loanId, ethAmount, add, relayed }) { - const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); - const method = add ? 'addCollateral' : 'removeCollateral'; - const params = [wallet.contractAddress, loanId, ETH_TOKEN, ethAmount]; - if (relayed) { - await manager.relay(loanManager, method, params, wallet, [owner]); - } else { - await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); - } - const afterETH = await deployer.provider.getBalance(wallet.contractAddress); - const expectedETHChange = ethAmount.mul(add ? -1 : 1).toString() - assert.equal(afterETH.sub(beforeETH).toString(), expectedETHChange, `wallet ETH should have changed by ${expectedETHChange} (relayed: ${relayed})`); - } - - describe("Add/Remove Collateral", () => { - it('should add collateral (blockchain tx)', async () => { - const loanId = await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('2'), relayed: false }) - await testChangeCollateral({ loanId: loanId, ethAmount: parseEther('0.010'), add: true, relayed: false }) - }); - it('should add collateral (relayed tx)', async () => { - const loanId = await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('2'), relayed: true }) - await testChangeCollateral({ loanId: loanId, ethAmount: parseEther('0.010'), add: true, relayed: true }) - }); - it('should remove collateral (blockchain tx)', async () => { - const loanId = await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('2'), relayed: false }) - await testChangeCollateral({ loanId: loanId, ethAmount: parseEther('0.010'), add: false, relayed: false }) - }); - it('should remove collateral (relayed tx)', async () => { - const loanId = await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('2'), relayed: true }) - await testChangeCollateral({ loanId: loanId, ethAmount: parseEther('0.010'), add: false, relayed: true }) - }); + }); + it("should add collateral (relayed tx)", async () => { + const loanId = await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("2"), relayed: true }); + await testChangeCollateral({ + loanId, ethAmount: parseEther("0.010"), add: true, relayed: true, }); - - async function testChangeDebt({ loanId, daiAmount, add, relayed }) { - const beforeDAI = await sai.balanceOf(wallet.contractAddress); - const beforeDAISupply = await sai.totalSupply(); - const method = add ? 'addDebt' : 'removeDebt'; - const params = [wallet.contractAddress, loanId, sai.contractAddress, daiAmount]; - if (relayed) { - await manager.relay(loanManager, method, params, wallet, [owner]); - } else { - await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); - } - const afterDAI = await sai.balanceOf(wallet.contractAddress); - const afterDAISupply = await sai.totalSupply(); - const expectedDAIChange = daiAmount.mul(add ? 1 : -1).toString() - assert.equal(afterDAI.sub(beforeDAI).toString(), expectedDAIChange, `wallet DAI should have changed by ${expectedDAIChange} (relayed: ${relayed})`); - assert.equal(afterDAISupply.sub(beforeDAISupply).toString(), expectedDAIChange, `total DAI supply should have changed by ${expectedDAIChange} (relayed: ${relayed})`); - } - - describe("Increase Debt", () => { - it('should increase debt (blockchain tx)', async () => { - const loanId = await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('1'), relayed: false }) - await testChangeDebt({ loanId: loanId, daiAmount: parseEther('0.5'), add: true, relayed: false }) - }); - it('should increase debt (relayed tx)', async () => { - const loanId = await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('1'), relayed: true }) - await testChangeDebt({ loanId: loanId, daiAmount: parseEther('0.5'), add: true, relayed: true }) - }); + }); + it("should remove collateral (blockchain tx)", async () => { + const loanId = await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("2"), relayed: false }); + await testChangeCollateral({ + loanId, ethAmount: parseEther("0.010"), add: false, relayed: false, }); - - async function testRepayDebt({ useOwnMKR, relayed }) { - if (useOwnMKR) { - await gov['mint(address,uint256)'](wallet.contractAddress, parseEther('0.1')); - } - const loanId = await testOpenLoan({ ethAmount: parseEther('0.0100'), daiAmount: parseEther('0.1'), relayed: relayed }) - await manager.increaseTime(3600 * 24 * 365); // wait one year - const beforeMKR = await gov.balanceOf(wallet.contractAddress); - const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); - await testChangeDebt({ loanId: loanId, daiAmount: parseEther('0.00000005'), add: false, relayed: relayed }) - const afterMKR = await gov.balanceOf(wallet.contractAddress); - const afterETH = await deployer.provider.getBalance(wallet.contractAddress); - - if (useOwnMKR) - assert.isTrue(afterMKR.lt(beforeMKR) && afterETH.eq(beforeETH), 'governance fee should have been paid in MKR') - else - assert.isTrue(afterMKR.eq(beforeMKR) && afterETH.lt(beforeETH), 'governance fee should have been paid in ETH') - } - - describe("Repay Debt", () => { - it('should repay debt when paying fee in MKR (blockchain tx)', async () => { - await testRepayDebt({ useOwnMKR: true, relayed: false }); - }); - it('should repay debt when paying fee in MKR (relayed tx)', async () => { - await testRepayDebt({ useOwnMKR: true, relayed: true }); - }); - it('should repay debt when paying fee in ETH (blockchain tx)', async () => { - await testRepayDebt({ useOwnMKR: false, relayed: false }); - }); - it('should repay debt when paying fee in ETH (relayed tx)', async () => { - await testRepayDebt({ useOwnMKR: false, relayed: true }); - }); + }); + it("should remove collateral (relayed tx)", async () => { + const loanId = await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("2"), relayed: true }); + await testChangeCollateral({ + loanId, ethAmount: parseEther("0.010"), add: false, relayed: true, }); + }); + }); - async function testCloseLoan({ useOwnMKR, relayed, biteBeforeClose = false }) { - if (useOwnMKR) { - await gov['mint(address,uint256)'](wallet.contractAddress, parseEther('0.1')); - } - - const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); - const beforeMKR = await gov.balanceOf(wallet.contractAddress); - const beforeDAI = await sai.balanceOf(wallet.contractAddress); - const beforeDAISupply = await sai.totalSupply(); - - const loanId = await testOpenLoan({ ethAmount: parseEther('0.100'), daiAmount: parseEther('1'), relayed: relayed }); - await manager.increaseTime(3600 * 24 * 365); // wait one year - - if (biteBeforeClose) { - const feed = bigNumberify(await pip.read()) - const newFeed = bigNumToBytes32(feed.div(10)) - await pip.poke(newFeed, { gasLimit: 500000 }); - await tub.bite(loanId); - await pip.poke(feed, { gasLimit: 500000 }); - } - const method = 'closeLoan' - const params = [wallet.contractAddress, loanId]; - if (relayed) { - await manager.relay(loanManager, method, params, wallet, [owner]); - } else { - await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); - } - - const afterETH = await deployer.provider.getBalance(wallet.contractAddress); - const afterMKR = await gov.balanceOf(wallet.contractAddress); - const afterDAI = await sai.balanceOf(wallet.contractAddress); - const afterDAISupply = await sai.totalSupply(); - - if (!biteBeforeClose) { // Note that the DAI will still be in the wallet if the wallet was bitten before the closing of the cdp - assert.isTrue(afterDAI.eq(beforeDAI), `wallet DAI should not have changed (relayed: ${relayed})`); - assert.isTrue(afterDAISupply.eq(beforeDAISupply), `total DAI supply should not have changed (relayed: ${relayed})`); - } - - if (useOwnMKR) - assert.isTrue(afterMKR.lt(beforeMKR) && afterETH.eq(beforeETH), 'governance fee should have been paid in MKR') - else - assert.isTrue(afterMKR.eq(beforeMKR) && afterETH.lt(beforeETH), 'governance fee should have been paid in ETH') - assert.equal(await tub.lad(loanId), '0x0000000000000000000000000000000000000000', 'CDP should have been wiped'); - } - - describe("Close CDP", () => { - it('should close CDP when paying fee in MKR (blockchain tx)', async () => { - await testCloseLoan({ useOwnMKR: true, relayed: false }); - }); - it('should close CDP when paying fee in MKR (relayed tx)', async () => { - await testCloseLoan({ useOwnMKR: true, relayed: true }); - }); - it('should close CDP when paying fee in ETH (blockchain tx)', async () => { - await testCloseLoan({ useOwnMKR: false, relayed: false }); - }); - it('should close CDP when paying fee in ETH (relayed tx)', async () => { - await testCloseLoan({ useOwnMKR: false, relayed: true }); - }); - it('should close CDP after it got liquidated (blockchain tx)', async () => { - await testCloseLoan({ useOwnMKR: false, relayed: false, biteBeforeClose: true }); - }) - it('should close CDP after it got liquidated (relayed tx)', async () => { - await testCloseLoan({ useOwnMKR: false, relayed: true, biteBeforeClose: true }); - }) + async function testChangeDebt({ + loanId, daiAmount, add, relayed, + }) { + const beforeDAI = await sai.balanceOf(wallet.contractAddress); + const beforeDAISupply = await sai.totalSupply(); + const method = add ? "addDebt" : "removeDebt"; + const params = [wallet.contractAddress, loanId, sai.contractAddress, daiAmount]; + if (relayed) { + await manager.relay(loanManager, method, params, wallet, [owner]); + } else { + await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); + } + const afterDAI = await sai.balanceOf(wallet.contractAddress); + const afterDAISupply = await sai.totalSupply(); + const expectedDAIChange = daiAmount.mul(add ? 1 : -1).toString(); + assert.equal(afterDAI.sub(beforeDAI).toString(), expectedDAIChange, + `wallet DAI should have changed by ${expectedDAIChange} (relayed: ${relayed})`); + assert.equal(afterDAISupply.sub(beforeDAISupply).toString(), expectedDAIChange, + `total DAI supply should have changed by ${expectedDAIChange} (relayed: ${relayed})`); + } + + describe("Increase Debt", () => { + it("should increase debt (blockchain tx)", async () => { + const loanId = await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("1"), relayed: false }); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.5"), add: true, relayed: false, }); + }); + it("should increase debt (relayed tx)", async () => { + const loanId = await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("1"), relayed: true }); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.5"), add: true, relayed: true, + }); + }); + }); + async function testRepayDebt({ useOwnMKR, relayed }) { + if (useOwnMKR) { + await gov["mint(address,uint256)"](wallet.contractAddress, parseEther("0.1")); + } + const loanId = await testOpenLoan({ ethAmount: parseEther("0.0100"), daiAmount: parseEther("0.1"), relayed }); + await manager.increaseTime(3600 * 24 * 365); // wait one year + const beforeMKR = await gov.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.00000005"), add: false, relayed, + }); + const afterMKR = await gov.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + + if (useOwnMKR) assert.isTrue(afterMKR.lt(beforeMKR) && afterETH.eq(beforeETH), "governance fee should have been paid in MKR"); + else assert.isTrue(afterMKR.eq(beforeMKR) && afterETH.lt(beforeETH), "governance fee should have been paid in ETH"); + } + + describe("Repay Debt", () => { + it("should repay debt when paying fee in MKR (blockchain tx)", async () => { + await testRepayDebt({ useOwnMKR: true, relayed: false }); + }); + it("should repay debt when paying fee in MKR (relayed tx)", async () => { + await testRepayDebt({ useOwnMKR: true, relayed: true }); + }); + it("should repay debt when paying fee in ETH (blockchain tx)", async () => { + await testRepayDebt({ useOwnMKR: false, relayed: false }); + }); + it("should repay debt when paying fee in ETH (relayed tx)", async () => { + await testRepayDebt({ useOwnMKR: false, relayed: true }); + }); }); -}); \ No newline at end of file + async function testCloseLoan({ useOwnMKR, relayed, biteBeforeClose = false }) { + if (useOwnMKR) { + await gov["mint(address,uint256)"](wallet.contractAddress, parseEther("0.1")); + } + + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + const beforeMKR = await gov.balanceOf(wallet.contractAddress); + const beforeDAI = await sai.balanceOf(wallet.contractAddress); + const beforeDAISupply = await sai.totalSupply(); + + const loanId = await testOpenLoan({ ethAmount: parseEther("0.100"), daiAmount: parseEther("1"), relayed }); + await manager.increaseTime(3600 * 24 * 365); // wait one year + + if (biteBeforeClose) { + const feed = bigNumberify(await pip.read()); + const newFeed = bigNumToBytes32(feed.div(10)); + await pip.poke(newFeed, { gasLimit: 500000 }); + await tub.bite(loanId); + await pip.poke(feed, { gasLimit: 500000 }); + } + const method = "closeLoan"; + const params = [wallet.contractAddress, loanId]; + if (relayed) { + await manager.relay(loanManager, method, params, wallet, [owner]); + } else { + await loanManager.from(owner)[method](...params, { gasLimit: 2000000 }); + } + + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + const afterMKR = await gov.balanceOf(wallet.contractAddress); + const afterDAI = await sai.balanceOf(wallet.contractAddress); + const afterDAISupply = await sai.totalSupply(); + + if (!biteBeforeClose) { // Note that the DAI will still be in the wallet if the wallet was bitten before the closing of the cdp + assert.isTrue(afterDAI.eq(beforeDAI), `wallet DAI should not have changed (relayed: ${relayed})`); + assert.isTrue(afterDAISupply.eq(beforeDAISupply), `total DAI supply should not have changed (relayed: ${relayed})`); + } + + if (useOwnMKR) assert.isTrue(afterMKR.lt(beforeMKR) && afterETH.eq(beforeETH), "governance fee should have been paid in MKR"); + else assert.isTrue(afterMKR.eq(beforeMKR) && afterETH.lt(beforeETH), "governance fee should have been paid in ETH"); + assert.equal(await tub.lad(loanId), "0x0000000000000000000000000000000000000000", "CDP should have been wiped"); + } + + describe("Close CDP", () => { + it("should close CDP when paying fee in MKR (blockchain tx)", async () => { + await testCloseLoan({ useOwnMKR: true, relayed: false }); + }); + it("should close CDP when paying fee in MKR (relayed tx)", async () => { + await testCloseLoan({ useOwnMKR: true, relayed: true }); + }); + it("should close CDP when paying fee in ETH (blockchain tx)", async () => { + await testCloseLoan({ useOwnMKR: false, relayed: false }); + }); + it("should close CDP when paying fee in ETH (relayed tx)", async () => { + await testCloseLoan({ useOwnMKR: false, relayed: true }); + }); + it("should close CDP after it got liquidated (blockchain tx)", async () => { + await testCloseLoan({ useOwnMKR: false, relayed: false, biteBeforeClose: true }); + }); + it("should close CDP after it got liquidated (relayed tx)", async () => { + await testCloseLoan({ useOwnMKR: false, relayed: true, biteBeforeClose: true }); + }); + }); + }); +}); diff --git a/test/makerV2Manager_invest.js b/test/makerV2Manager_invest.js new file mode 100644 index 000000000..43c2e489e --- /dev/null +++ b/test/makerV2Manager_invest.js @@ -0,0 +1,115 @@ +const { AddressZero } = require("ethers").constants; +const { deployMaker, WAD } = require("../utils/defi-deployer"); +const TestManager = require("../utils/test-manager"); +const MakerV2Invest = require("../build/TestMakerV2Invest"); +const Wallet = require("../build/BaseWallet"); +const GuardianStorage = require("../build/GuardianStorage"); + +const DAI_SENT = WAD.div(100000000); + +/* global accounts */ +describe("MakerV2 DSR", function () { + this.timeout(100000); + + const manager = new TestManager(); + const { deployer } = manager; + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + + let wallet; + let makerV2; + let sai; + let dai; + + before(async () => { + const m = await deployMaker(deployer, infrastructure); + [sai, dai] = [m.sai, m.dai]; + const { migration, pot } = m; + + const guardianStorage = await deployer.deploy(GuardianStorage); + + makerV2 = await deployer.deploy( + MakerV2Invest, + {}, + AddressZero, + guardianStorage.contractAddress, + migration.contractAddress, + pot.contractAddress, + { gasLimit: 8000000 }, + ); + }); + + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [makerV2.contractAddress]); + await sai["mint(address,uint256)"](wallet.contractAddress, DAI_SENT.mul(20)); + await dai["mint(address,uint256)"](wallet.contractAddress, DAI_SENT.mul(20)); + }); + + async function exchangeWithPot({ toPot, relayed, all = false }) { + const walletBefore = (await dai.balanceOf(wallet.contractAddress)).add(await sai.balanceOf(wallet.contractAddress)); + const investedBefore = await makerV2.dsrBalance(wallet.contractAddress); + let method; + if (toPot) { + method = "joinDsr"; + } else if (all) { + method = "exitAllDsr"; + } else { + method = "exitDsr"; + } + const params = [wallet.contractAddress].concat(all ? [] : [DAI_SENT]); + if (relayed) { + await manager.relay(makerV2, method, params, wallet, [owner]); + } else { + await (await makerV2.from(owner)[method](...params, { gasLimit: 2000000 })).wait(); + } + const walletAfter = (await dai.balanceOf(wallet.contractAddress)).add(await sai.balanceOf(wallet.contractAddress)); + const investedAfter = await makerV2.dsrBalance(wallet.contractAddress); + const deltaInvested = toPot ? investedAfter.sub(investedBefore) : investedBefore.sub(investedAfter); + const deltaWallet = toPot ? walletBefore.sub(walletAfter) : walletAfter.sub(walletBefore); + assert.isTrue(deltaInvested.gt(0), "DAI in DSR should have changed."); + assert.isTrue(deltaWallet.gt(0), "DAI in wallet should have changed."); + + if (all) { + assert.isTrue(investedAfter.eq(0), "Pot should be emptied"); + assert.isTrue(walletAfter.gt(walletBefore), "DAI in wallet should have increased"); + } + } + + describe("Deposit", () => { + it("sends DAI to the pot (blockchain tx)", async () => { + await exchangeWithPot({ toPot: true, relayed: false }); + // do it a second time, when Vat authorisations have already been granted + await exchangeWithPot({ toPot: true, relayed: false }); + }); + + it("sends DAI to the pot (relayed tx)", async () => { + await exchangeWithPot({ toPot: true, relayed: true }); + // do it a second time, when Vat authorisations have already been granted + await exchangeWithPot({ toPot: true, relayed: true }); + }); + }); + + describe("Withdraw", () => { + beforeEach(async () => { + await exchangeWithPot({ toPot: true, relayed: false }); + }); + + it("withdraw DAI from the pot (blockchain tx)", async () => { + await exchangeWithPot({ toPot: false, relayed: false }); + }); + + it("withdraw DAI from the pot (relayed tx)", async () => { + await exchangeWithPot({ toPot: false, relayed: true }); + }); + + it("withdraw ALL DAI from the pot (blockchain tx)", async () => { + await exchangeWithPot({ toPot: false, relayed: false, all: true }); + }); + + it("withdraw ALL DAI from the pot (relayed tx)", async () => { + await exchangeWithPot({ toPot: false, relayed: true, all: true }); + }); + }); +}); diff --git a/test/makerV2Manager_loan.js b/test/makerV2Manager_loan.js new file mode 100644 index 000000000..08d7c9a7f --- /dev/null +++ b/test/makerV2Manager_loan.js @@ -0,0 +1,768 @@ +const ethers = require("ethers"); +const { bigNumToBytes32, ETH_TOKEN } = require("../utils/utilities.js"); +const { + deployMaker, deployUniswap, RAY, ETH_PER_DAI, ETH_PER_MKR, +} = require("../utils/defi-deployer"); + +const { parseEther, formatBytes32String, bigNumberify } = ethers.utils; +const { HashZero, AddressZero } = ethers.constants; + +const TestManager = require("../utils/test-manager"); +const GemJoin = require("../build/GemJoin"); +const Registry = require("../build/ModuleRegistry"); +const MakerV1Manager = require("../build/MakerManager"); +const MakerV2Manager = require("../build/MakerV2Manager"); +const UpgradedMakerV2Manager = require("../build/TestUpgradedMakerV2Manager"); +const MakerRegistry = require("../build/MakerRegistry"); +const Wallet = require("../build/BaseWallet"); +const FakeWallet = require("../build/FakeWallet"); +const GuardianStorage = require("../build/GuardianStorage"); +const TransferStorage = require("../build/TransferStorage"); +const TransferManager = require("../build/TransferManager"); +const BadModule = require("../build/TestModule"); +const TokenPriceProvider = require("../build/TokenPriceProvider"); + +/* global accounts */ +describe("MakerV2 Vaults", function () { + this.timeout(100000); + + if (process.env.COVERAGE) { + // Can't yet deploy MakerV2Manager or MakerV2Loan with etherlime coverage as we need custom gasLimit + return; + } + + const manager = new TestManager(); + const { deployer } = manager; + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + const owner2 = accounts[2].signer; + + let sai; + let dai; + let gov; + let bat; + let weth; + let vat; + let batJoin; + let cdpManager; + let pot; + let jug; + let migration; + let registry; + let transferManager; + let guardianStorage; + let makerV1; + let makerV2; + let wallet; + let walletAddress; + let makerRegistry; + let uniswapFactory; + + before(async () => { + // Deploy Maker + const mk = await deployMaker(deployer, infrastructure); + [sai, dai, gov, bat, weth, vat, batJoin, cdpManager, pot, jug, migration] = [ + mk.sai, mk.dai, mk.gov, mk.bat, mk.weth, mk.vat, mk.batJoin, mk.cdpManager, mk.pot, mk.jug, mk.migration, + ]; + const { wethJoin, tub } = mk; + + // Deploy Uniswap + const uni = await deployUniswap(deployer, manager, infrastructure, [gov, dai], [ETH_PER_MKR, ETH_PER_DAI]); + uniswapFactory = uni.uniswapFactory; + + // Deploy MakerV2Manager + registry = await deployer.deploy(Registry); + guardianStorage = await deployer.deploy(GuardianStorage); + makerRegistry = await deployer.deploy(MakerRegistry, {}, vat.contractAddress); + await makerRegistry.addCollateral(wethJoin.contractAddress); + makerV2 = await deployer.deploy( + MakerV2Manager, + {}, + registry.contractAddress, + guardianStorage.contractAddress, + migration.contractAddress, + pot.contractAddress, + jug.contractAddress, + makerRegistry.contractAddress, + uniswapFactory.contractAddress, + { gasLimit: 8000000 }, + ); + + // Deploy MakerManager + makerV1 = await deployer.deploy( + MakerV1Manager, + {}, + registry.contractAddress, + guardianStorage.contractAddress, + tub.contractAddress, + uniswapFactory.contractAddress, + ); + + // Deploy TransferManager + const priceProvider = await deployer.deploy(TokenPriceProvider, {}, AddressZero); + const transferStorage = await deployer.deploy(TransferStorage); + transferManager = await deployer.deploy(TransferManager, {}, + AddressZero, + transferStorage.contractAddress, + guardianStorage.contractAddress, + priceProvider.contractAddress, + 3600, + 3600, + 10000, + AddressZero); + }); + + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [makerV1.contractAddress, makerV2.contractAddress, transferManager.contractAddress]); + walletAddress = wallet.contractAddress; + await infrastructure.sendTransaction({ to: walletAddress, value: parseEther("2.0") }); + }); + + async function getTestAmounts(tokenAddress) { + const tokenAddress_ = (tokenAddress === ETH_TOKEN) ? weth.contractAddress : tokenAddress; + const { ilk } = await makerRegistry.collaterals(tokenAddress_); + const { spot, dust } = await vat.ilks(ilk); + const daiAmount = dust.div(RAY); + const collateralAmount = dust.div(spot).mul(2); + return { daiAmount, collateralAmount }; + } + + async function testOpenLoan({ + collateralAmount, daiAmount, relayed, collateral = { contractAddress: ETH_TOKEN }, + }) { + const beforeCollateral = (collateral.contractAddress === ETH_TOKEN) + ? await deployer.provider.getBalance(walletAddress) + : await collateral.balanceOf(walletAddress); + + const beforeDAI = await dai.balanceOf(walletAddress); + const beforeDAISupply = await dai.totalSupply(); + + const method = "openLoan"; + const params = [walletAddress, collateral.contractAddress, collateralAmount, dai.contractAddress, daiAmount]; + let txR; + if (relayed) { + txR = await manager.relay(makerV2, method, params, wallet, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + txR = await (await makerV2.from(owner)[method](...params, { gasLimit: 2000000 })).wait(); + } + const loanId = txR.events.find((e) => e.event === "LoanOpened").args._loanId; + assert.isDefined(loanId, "Loan ID should be defined"); + + const afterCollateral = (collateral.contractAddress === ETH_TOKEN) + ? await deployer.provider.getBalance(walletAddress) + : await collateral.balanceOf(walletAddress); + const afterDAI = await dai.balanceOf(walletAddress); + const afterDAISupply = await dai.totalSupply(); + + assert.equal( + beforeCollateral.sub(afterCollateral).toString(), + collateralAmount.toString(), + `wallet should have ${collateralAmount} less collateral (relayed: ${relayed})`, + ); + assert.equal( + afterDAI.sub(beforeDAI).toString(), + daiAmount.toString(), + `wallet should have ${daiAmount} more DAI (relayed: ${relayed})`, + ); + assert.equal( + afterDAISupply.sub(beforeDAISupply).toString(), + daiAmount.toString(), + `${daiAmount} DAI should have been minted (relayed: ${relayed})`, + ); + + return loanId; + } + + describe("Open Loan", () => { + let daiAmount; + let collateralAmount; + before(async () => { + const testAmounts = await getTestAmounts(ETH_TOKEN); + daiAmount = testAmounts.daiAmount; + collateralAmount = testAmounts.collateralAmount; + }); + it("should open a Loan (blockchain tx)", async () => { + await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + }); + it("should open a Loan (relayed tx)", async () => { + await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + }); + it("should open>close>reopen a Loan (blockchain tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await makerV2.from(owner).closeLoan(walletAddress, loanId, { gasLimit: 4500000 }); + await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + }); + it("should open>close>reopen a Loan (relayed tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await (await makerV2.from(owner).closeLoan(walletAddress, loanId, { gasLimit: 4500000 })).wait(); + await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + }); + it("should not open a loan for the wrong debt token", async () => { + await assert.revertWith( + makerV2.from(owner).openLoan(walletAddress, ETH_TOKEN, collateralAmount, sai.contractAddress, daiAmount), + "MV2: debt token not DAI", + ); + }); + it("should not open a loan for an unsupported collateral token", async () => { + await assert.revertWith( + makerV2.from(owner).openLoan(walletAddress, sai.contractAddress, collateralAmount, dai.contractAddress, daiAmount), + "MV2: unsupported collateral", + ); + }); + }); + + async function testChangeCollateral({ + loanId, collateralAmount, add, relayed, collateral = { contractAddress: ETH_TOKEN }, makerV2Manager = makerV2, + }) { + const beforeCollateral = (collateral.contractAddress === ETH_TOKEN) + ? await deployer.provider.getBalance(walletAddress) + : await collateral.balanceOf(walletAddress); + + const method = add ? "addCollateral" : "removeCollateral"; + const params = [wallet.contractAddress, loanId, collateral.contractAddress, collateralAmount]; + if (relayed) { + const txR = await manager.relay(makerV2Manager, method, params, wallet, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await makerV2Manager.from(owner)[method](...params, { gasLimit: 2000000 }); + } + + const afterCollateral = (collateral.contractAddress === ETH_TOKEN) + ? await deployer.provider.getBalance(walletAddress) + : await collateral.balanceOf(walletAddress); + + const expectedCollateralChange = collateralAmount.mul(add ? -1 : 1).toString(); + assert.equal( + afterCollateral.sub(beforeCollateral).toString(), + expectedCollateralChange, + `wallet collateral should have changed by ${expectedCollateralChange} (relayed: ${relayed})`, + ); + } + + describe("Add/Remove Collateral", () => { + let daiAmount; let + collateralAmount; + before(async () => { + const testAmounts = await getTestAmounts(ETH_TOKEN); + daiAmount = testAmounts.daiAmount; + collateralAmount = testAmounts.collateralAmount; + }); + it("should add collateral (blockchain tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await testChangeCollateral({ + loanId, collateralAmount: parseEther("0.010"), add: true, relayed: false, + }); + }); + it("should add collateral (relayed tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await testChangeCollateral({ + loanId, collateralAmount: parseEther("0.010"), add: true, relayed: true, + }); + }); + it("should not add collateral for the wrong loan owner", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + const wallet2 = await deployer.deploy(Wallet); + await wallet2.init(owner2.address, [makerV2.contractAddress]); + await assert.revertWith( + makerV2.from(owner2).addCollateral(wallet2.contractAddress, loanId, ETH_TOKEN, parseEther("0.010")), + "MV2: unauthorized loanId", + ); + }); + it("should remove collateral (blockchain tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await testChangeCollateral({ + loanId, collateralAmount: parseEther("0.010"), add: false, relayed: false, + }); + }); + it("should remove collateral (relayed tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await testChangeCollateral({ + loanId, collateralAmount: parseEther("0.010"), add: false, relayed: true, + }); + }); + it("should not remove collateral with invalid collateral amount", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await assert.revertWith( + makerV2.from(owner).removeCollateral(walletAddress, loanId, ETH_TOKEN, bigNumberify(2).pow(255)), + "MV2: int overflow", + ); + }); + it("should not remove collateral for the wrong loan owner", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + const wallet2 = await deployer.deploy(Wallet); + await wallet2.init(owner2.address, [makerV2.contractAddress]); + await assert.revertWith( + makerV2.from(owner2).removeCollateral(wallet2.contractAddress, loanId, ETH_TOKEN, parseEther("0.010")), + "MV2: unauthorized loanId", + ); + }); + }); + + async function testChangeDebt({ + loanId, daiAmount, add, relayed, + }) { + const beforeDAI = await dai.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + const method = add ? "addDebt" : "removeDebt"; + const params = [wallet.contractAddress, loanId, dai.contractAddress, daiAmount]; + if (relayed) { + const txR = await manager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await makerV2.from(owner)[method](...params, { gasLimit: 2000000 }); + } + const afterDAI = await dai.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + if (add) { + assert.equal( + afterDAI.sub(beforeDAI).toString(), + daiAmount.toString(), + `wallet DAI should have increased by ${daiAmount.toString()} (relayed: ${relayed})`, + ); + } else { + assert.isTrue( + afterDAI.lt(beforeDAI) || afterETH.lt(beforeETH), + `wallet DAI or ETH should have decreased (relayed: ${relayed})`, + ); + } + } + + describe("Increase Debt", () => { + let daiAmount; let + collateralAmount; + before(async () => { + const testAmounts = await getTestAmounts(ETH_TOKEN); + daiAmount = testAmounts.daiAmount; + collateralAmount = testAmounts.collateralAmount; + }); + it("should increase debt (blockchain tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.5"), add: true, relayed: false, + }); + }); + it("should increase debt (relayed tx)", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.5"), add: true, relayed: true, + }); + }); + it("should not increase debt for the wrong loan owner", async () => { + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + const wallet2 = await deployer.deploy(Wallet); + await wallet2.init(owner2.address, [makerV2.contractAddress]); + await assert.revertWith( + makerV2.from(owner2).addDebt(wallet2.contractAddress, loanId, ETH_TOKEN, parseEther("0.010")), + "MV2: unauthorized loanId", + ); + }); + }); + + async function testRepayDebt({ useDai, relayed }) { + const { collateralAmount, daiAmount: daiAmount_ } = await getTestAmounts(ETH_TOKEN); + const daiAmount = daiAmount_.add(parseEther("0.3")); + + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed }); + if (!useDai) { + // move the borrowed DAI from the wallet to the owner + await transferManager.from(owner).transferToken(walletAddress, dai.contractAddress, owner.address, daiAmount, HashZero, { gasLimit: 3000000 }); + // give some ETH to the wallet to be used for repayment + await owner.sendTransaction({ to: walletAddress, value: collateralAmount }); + } + await manager.increaseTime(3); // wait 3 seconds + const beforeDAI = await dai.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + await testChangeDebt({ + loanId, daiAmount: parseEther("0.2"), add: false, relayed, + }); + + const afterDAI = await dai.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + + if (useDai) assert.isTrue(afterDAI.lt(beforeDAI) && afterETH.eq(beforeETH), "should have less DAI"); + else assert.isTrue(afterDAI.eq(beforeDAI) && afterETH.lt(beforeETH), "should have less ETH"); + } + + describe("Repay Debt", () => { + it("should repay debt when paying fee in DAI (blockchain tx)", async () => { + await testRepayDebt({ useDai: true, relayed: false }); + }); + it("should repay debt when paying fee in DAI (relayed tx)", async () => { + await testRepayDebt({ useDai: true, relayed: true }); + }); + it("should repay debt when paying fee in ETH (blockchain tx)", async () => { + await testRepayDebt({ useDai: false, relayed: false }); + }); + it("should repay debt when paying fee in ETH (relayed tx)", async () => { + await testRepayDebt({ useDai: false, relayed: true }); + }); + it("should not repay debt when only dust left", async () => { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await assert.revertWith( + makerV2.from(owner).removeDebt(walletAddress, loanId, dai.contractAddress, daiAmount.sub(1)), + "MV2: repay less or full", + ); + }); + it("should not repay debt for the wrong loan owner", async () => { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + const wallet2 = await deployer.deploy(Wallet); + await wallet2.init(owner2.address, [makerV2.contractAddress]); + await assert.revertWith( + makerV2.from(owner2).removeDebt(wallet2.contractAddress, loanId, ETH_TOKEN, parseEther("0.010")), + "MV2: unauthorized loanId", + ); + }); + }); + + async function testCloseLoan({ useDai, relayed }) { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed }); + // give some ETH to the wallet to be used for repayment + await owner.sendTransaction({ to: walletAddress, value: collateralAmount.mul(2) }); + if (!useDai) { + // move the borrowed DAI from the wallet to the owner + await transferManager.from(owner).transferToken(walletAddress, dai.contractAddress, owner.address, daiAmount, HashZero, { gasLimit: 3000000 }); + } + await manager.increaseTime(3); // wait 3 seconds + const beforeDAI = await dai.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + const method = "closeLoan"; + const params = [wallet.contractAddress, loanId]; + if (relayed) { + const txR = await manager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await makerV2.from(owner)[method](...params, { gasLimit: 3000000 }); + } + const afterDAI = await dai.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + + if (useDai) assert.isTrue(afterDAI.lt(beforeDAI) && afterETH.sub(collateralAmount).lt(beforeETH), "should have spent some DAI and some ETH"); + else assert.isTrue(afterDAI.eq(beforeDAI) && afterETH.sub(collateralAmount).lt(beforeETH), "should have spent some ETH"); + } + + describe("Close Vaults", () => { + it("should close a vault when paying fee in DAI + ETH (blockchain tx)", async () => { + await testCloseLoan({ useDai: true, relayed: false }); + }); + it("should close a vault when paying fee in DAI + ETH (relayed tx)", async () => { + await testCloseLoan({ useDai: true, relayed: true }); + }); + it("should close a vault when paying fee in ETH (blockchain tx)", async () => { + await testCloseLoan({ useDai: false, relayed: false }); + }); + it("should close a vault when paying fee in ETH (relayed tx)", async () => { + await testCloseLoan({ useDai: false, relayed: true }); + }); + it("should not close a vault for the wrong loan owner", async () => { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + const loanId = await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + const wallet2 = await deployer.deploy(Wallet); + await wallet2.init(owner2.address, [makerV2.contractAddress]); + await assert.revertWith( + makerV2.from(owner2).closeLoan(wallet2.contractAddress, loanId), + "MV2: unauthorized loanId", + ); + }); + }); + + describe("MakerRegistry", () => { + it("should add a new collateral token", async () => { + const numCollateralBefore = (await makerRegistry.getCollateralTokens()).length; + await makerRegistry.addCollateral(batJoin.contractAddress); + const numCollateralAfter = (await makerRegistry.getCollateralTokens()).length; + assert.equal(numCollateralAfter, numCollateralBefore + 1, "A new collateral should have been added"); + await makerRegistry.removeCollateral(bat.contractAddress); // cleanup + }); + it("should open a loan with a newly added collateral token", async () => { + await makerRegistry.addCollateral(batJoin.contractAddress); + const { daiAmount, collateralAmount } = await getTestAmounts(bat.contractAddress); + await bat["mint(address,uint256)"](walletAddress, collateralAmount); + await testOpenLoan({ + collateralAmount, daiAmount, collateral: bat, relayed: false, + }); + await makerRegistry.removeCollateral(bat.contractAddress); // cleanup + }); + it("should not add a collateral when Join is not in the Vat", async () => { + const badJoin = await deployer.deploy(GemJoin, {}, vat.contractAddress, formatBytes32String("BAD"), bat.contractAddress); + await assert.revertWith(makerRegistry.addCollateral(badJoin.contractAddress), "MR: _joinAdapter not authorised in vat"); + }); + it("should not add a duplicate collateral", async () => { + await makerRegistry.addCollateral(batJoin.contractAddress); + await assert.revertWith(makerRegistry.addCollateral(batJoin.contractAddress), "MR: collateral already added"); + await makerRegistry.removeCollateral(bat.contractAddress); // cleanup + }); + it("should remove a collateral", async () => { + const numCollateralBefore = (await makerRegistry.getCollateralTokens()).length; + await makerRegistry.addCollateral(batJoin.contractAddress); + await makerRegistry.removeCollateral(bat.contractAddress); + const numCollateralAfter = (await makerRegistry.getCollateralTokens()).length; + assert.equal(numCollateralAfter, numCollateralBefore, "The added collateral should have been removed"); + }); + it("should not remove a non-existing collateral", async () => { + await assert.revertWith(makerRegistry.removeCollateral(bat.contractAddress), "MR: collateral does not exist"); + }); + }); + + describe("Acquiring a wallet's vault", () => { + async function testAcquireVault({ relayed }) { + // Create the vault with `owner` as owner + const { ilk } = await makerRegistry.collaterals(weth.contractAddress); + let txR = await (await cdpManager.from(owner).open(ilk, owner.address)).wait(); + const vaultId = txR.events.find((e) => e.event === "NewCdp").args.cdp; + // Transfer the vault to the wallet + await cdpManager.from(owner).give(vaultId, walletAddress); + // Transfer the vault to the module + const loanId = bigNumToBytes32(vaultId); + const method = "acquireLoan"; + const params = [walletAddress, loanId]; + if (relayed) { + txR = await manager.relay(makerV2, method, params, { contractAddress: walletAddress }, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await makerV2.from(owner)[method](...params, { gasLimit: 1000000 }); + } + // The loanId held by the MakerV2Manager will be different from the transferred vault id, in case the latter was merged into an existing vault + const moduleLoanId = await makerV2.loanIds(walletAddress, ilk); + // Add some collateral and debt + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + await testChangeCollateral({ + loanId: moduleLoanId, collateralAmount, add: true, relayed, makerV2, + }); + await testChangeDebt({ + loanId: moduleLoanId, daiAmount, add: true, relayed, + }); + } + + it("should transfer a vault from a wallet to the module (blockchain tx)", async () => { + await testAcquireVault({ relayed: false }); + }); + it("should transfer a vault from a wallet to the module (relayed tx)", async () => { + await testAcquireVault({ relayed: true }); + }); + it("should not transfer a vault that is not owned by the wallet", async () => { + // Create the vault with `owner` as owner + const { ilk } = await makerRegistry.collaterals(weth.contractAddress); + const txR = await (await cdpManager.from(owner).open(ilk, owner.address)).wait(); + const vaultId = txR.events.find((e) => e.event === "NewCdp").args.cdp; + const loanId = bigNumToBytes32(vaultId); + // We are NOT transferring the vault from the owner to the wallet + await assert.revertWith( + makerV2.from(owner).acquireLoan(walletAddress, loanId), "MV2: wrong vault owner", + ); + }); + it("should not transfer a vault that is not given to the module", async () => { + // Deploy a fake wallet + const fakeWallet = await deployer.deploy(FakeWallet, {}, false, AddressZero, 0, "0x00"); + await fakeWallet.init(owner.address, [makerV2.contractAddress]); + // Create the vault with `owner` as owner + const { ilk } = await makerRegistry.collaterals(weth.contractAddress); + const txR = await (await cdpManager.from(owner).open(ilk, owner.address)).wait(); + const vaultId = txR.events.find((e) => e.event === "NewCdp").args.cdp; + const loanId = bigNumToBytes32(vaultId); + // Transfer the vault to the fake wallet + await cdpManager.from(owner).give(vaultId, fakeWallet.contractAddress); + await assert.revertWith( + makerV2.from(owner).acquireLoan(fakeWallet.contractAddress, loanId), "MV2: failed give", + ); + }); + it("should transfer (merge) a vault when already holding a vault in the module (blockchain tx)", async () => { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await testAcquireVault({ relayed: false }); + }); + it("should transfer (merge) a vault when already holding a vault in the module (relayed tx)", async () => { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await testAcquireVault({ relayed: true }); + }); + it("should not allow reentrancy in acquireLoan", async () => { + // Deploy a fake wallet capable of reentrancy + const acquireLoanCallData = makerV2.contract.interface.functions.acquireLoan.encode([AddressZero, bigNumToBytes32(bigNumberify(0))]); + const fakeWallet = await deployer.deploy(FakeWallet, {}, true, makerV2.contractAddress, 0, acquireLoanCallData); + await fakeWallet.init(owner.address, [makerV2.contractAddress]); + // Create the vault with `owner` as owner + const { ilk } = await makerRegistry.collaterals(weth.contractAddress); + const txR = await (await cdpManager.from(owner).open(ilk, owner.address)).wait(); + const vaultId = txR.events.find((e) => e.event === "NewCdp").args.cdp; + const loanId = bigNumToBytes32(vaultId); + // Transfer the vault to the fake wallet + await cdpManager.from(owner).give(vaultId, fakeWallet.contractAddress); + await assert.revertWith( + makerV2.from(owner).acquireLoan(fakeWallet.contractAddress, loanId), "MV2: reentrant call", + ); + }); + }); + + describe("Migrating an SCD CDP to an MCD vault", () => { + let oldCdpId; + beforeEach(async () => { + // Opening SCD CDP + const { daiAmount, collateralAmount } = await getTestAmounts(ETH_TOKEN); + const params = [walletAddress, ETH_TOKEN, collateralAmount, sai.contractAddress, daiAmount]; + const txReceipt = await (await makerV1.from(owner).openLoan(...params, { gasLimit: 2000000 })).wait(); + oldCdpId = txReceipt.events.find((e) => e.event === "LoanOpened").args._loanId; + assert.isDefined(oldCdpId, "The old CDP ID should be defined"); + }); + + async function testMigrateCdp({ relayed }) { + const method = "migrateCdp"; + const params = [walletAddress, oldCdpId]; + let txR; + if (relayed) { + txR = await manager.relay(makerV2, method, params, wallet, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + txR = await (await makerV2.from(owner)[method](...params, { gasLimit: 2000000 })).wait(); + } + const loanId = txR.events.find((e) => e.event === "CdpMigrated").args._newVaultId; + assert.isDefined(loanId, "The new vault ID should be defined"); + + // Add some collateral and debt + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + await testChangeCollateral({ + loanId, collateralAmount, add: true, relayed, makerV2, + }); + await testChangeDebt({ + loanId, daiAmount, add: true, relayed, + }); + } + + it("should migrate a CDP (blockchain tx)", async () => { + await testMigrateCdp({ relayed: false }); + }); + + it("should migrate a CDP (relayed tx)", async () => { + await testMigrateCdp({ relayed: true }); + }); + + it("should migrate a CDP when already holding a vault in the module (blockchain tx)", async () => { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + await testOpenLoan({ collateralAmount, daiAmount, relayed: false }); + await testMigrateCdp({ relayed: false }); + }); + + it("should migrate a CDP when already holding a vault in the module (relayed tx)", async () => { + const { collateralAmount, daiAmount } = await getTestAmounts(ETH_TOKEN); + await testOpenLoan({ collateralAmount, daiAmount, relayed: true }); + await testMigrateCdp({ relayed: true }); + }); + }); + + describe("Upgrade of MakerV2Manager", () => { + let upgradedMakerV2; + let daiAmount; + let collateralAmount; + beforeEach(async () => { + // Generate test amounts + const testAmounts = await getTestAmounts(ETH_TOKEN); + daiAmount = testAmounts.daiAmount; + collateralAmount = testAmounts.collateralAmount; + + // Deploy and register the upgraded MakerV2 module + upgradedMakerV2 = await deployer.deploy( + UpgradedMakerV2Manager, + {}, + registry.contractAddress, + guardianStorage.contractAddress, + migration.contractAddress, + pot.contractAddress, + jug.contractAddress, + makerRegistry.contractAddress, + uniswapFactory.contractAddress, + makerV2.contractAddress, + { gasLimit: 10700000 }, + ); + await registry.registerModule(upgradedMakerV2.contractAddress, formatBytes32String("UpgradedMakerV2Manager")); + + // Adding BAT to the registry of supported collateral tokens + if (!(await makerRegistry.collaterals(bat.contractAddress)).exists) { + await makerRegistry.addCollateral(batJoin.contractAddress); + } + }); + + async function testUpgradeModule({ relayed, withBatVault = false }) { + // Open a WETH vault with the old MakerV2 module + const loanId1 = await testOpenLoan({ collateralAmount, daiAmount, relayed }); + let loanId2; + if (withBatVault) { + // Open a BAT vault with the old MakerV2 module + const batTestAmounts = await getTestAmounts(bat.contractAddress); + await bat["mint(address,uint256)"](walletAddress, batTestAmounts.collateralAmount.add(parseEther("0.01"))); + loanId2 = await testOpenLoan({ + collateralAmount: batTestAmounts.collateralAmount, + daiAmount: batTestAmounts.daiAmount, + collateral: bat, + relayed, + }); + } + + // Add the upgraded module + const method = "addModule"; + const params = [walletAddress, upgradedMakerV2.contractAddress]; + if (relayed) { + const txR = await manager.relay(makerV2, method, params, wallet, [owner]); + assert.isTrue(txR.events.find((e) => e.event === "TransactionExecuted").args.success, "Relayed tx should succeed"); + } else { + await makerV2.from(owner)[method](...params, { gasLimit: 2000000 }); + } + + // Make sure that the vaults can be manipulated from the upgraded module + await testChangeCollateral({ + loanId: loanId1, + collateralAmount: parseEther("0.010"), + add: true, + relayed, + makerV2Manager: upgradedMakerV2, + }); + await upgradedMakerV2.from(owner).closeLoan(walletAddress, loanId1, { gasLimit: 4500000 }); + + if (withBatVault) { + await testChangeCollateral({ + loanId: loanId2, + collateralAmount: parseEther("0.010"), + add: true, + relayed, + collateral: bat, + makerV2Manager: upgradedMakerV2, + }); + await upgradedMakerV2.from(owner).closeLoan(walletAddress, loanId2, { gasLimit: 4500000 }); + } + } + + it("should move a vault after a module upgrade (blockchain tx)", async () => { + await testUpgradeModule({ relayed: false }); + }); + + it("should move a vault after a module upgrade (relayed tx)", async () => { + await testUpgradeModule({ relayed: true }); + }); + + it("should move 2 vaults after a module upgrade (blockchain tx)", async () => { + await testUpgradeModule({ withBatVault: true, relayed: false }); + }); + + it("should move 2 vaults after a module upgrade (relayed tx)", async () => { + await testUpgradeModule({ withBatVault: true, relayed: true }); + }); + + it("should not allow non-module to give vault", async () => { + await assert.revertWith(makerV2.from(owner).giveVault(walletAddress, formatBytes32String("")), "MV2: sender unauthorized"); + }); + it("should not allow (fake) module to give unowned vault", async () => { + // Deploy and register a (fake) bad module + const badModule = await deployer.deploy(BadModule, {}, registry.contractAddress, false, 0); + await registry.registerModule(badModule.contractAddress, formatBytes32String("BadModule")); + // Add the bad module to the wallet + await makerV2.from(owner).addModule(walletAddress, badModule.contractAddress, { gasLimit: 2000000 }); + // Use the bad module to attempt a bad giveVault call + const callData = makerV2.contract.interface.functions.giveVault.encode([walletAddress, bigNumToBytes32(bigNumberify(666))]); + await assert.revertWith(badModule.from(owner).callContract(makerV2.contractAddress, 0, callData), "MV2: unauthorized loanId"); + }); + }); +}); diff --git a/test/multisig.js b/test/multisig.js new file mode 100644 index 000000000..513971eda --- /dev/null +++ b/test/multisig.js @@ -0,0 +1,254 @@ +/* global accounts */ +const MultiSigWallet = require("../build/MultiSigWallet"); +const TestRegistry = require("../build/TestRegistry"); + +const TestManager = require("../utils/test-manager"); +const MultisigExecutor = require("../utils/multisigexecutor.js"); +const utils = require("../utils/utilities.js"); + +describe("MultiSigWallet", () => { + const manager = new TestManager(); + const owner = accounts[0].signer; + const owner1 = accounts[1].signer; + const owner2 = accounts[2].signer; + const owner3 = accounts[3].signer; + const newowner = accounts[4].signer; + + let deployer; + let multisig; + let reg; + let value; + let number; + let owners; + + before(async () => { + deployer = manager.newDeployer(); + number = 12345; + value = 10000000000; + owners = utils.sortWalletByAddress([owner1, owner2, owner3]).map((o) => o.address); + }); + + beforeEach(async () => { + multisig = await deployer.deploy(MultiSigWallet, {}, 2, owners); + + reg = await deployer.deploy(TestRegistry, {}); + + // Fund the multisig + await deployer.signer.sendTransaction({ + to: multisig.contractAddress, + value, + }); + + const bal = await deployer.provider.getBalance(multisig.contractAddress); + assert.equal(bal.toNumber(), value); + }); + + async function getSignatures(signedData, signers, sortSigners = true, returnBadSignatures = false) { + // Sort the signers + let sortedSigners = signers; + if (sortSigners) { + sortedSigners = utils.sortWalletByAddress(signers); + } + const signHashBuffer = Buffer.from(signedData.slice(2), "hex"); + let signatures = "0x"; + + for (const signer of sortedSigners) { + let sig = await signer.signMessage(signHashBuffer); + if (returnBadSignatures) { + sig += "a1"; + } + signatures += sig.slice(2); + } + return signatures; + } + + async function executeSendSuccess(signers) { + let nonce = await multisig.nonce(); + const data = reg.contract.interface.functions.register.encode([number]); + const signedData = MultisigExecutor.signHash(multisig.contractAddress, reg.contractAddress, value, data, nonce.toNumber()); + const signatures = await getSignatures(signedData, signers); + + await multisig.execute(reg.contractAddress, value, data, signatures); + + // Check that number has been set in registry + const numFromRegistry = await reg.registry(multisig.contractAddress); + assert.equal(numFromRegistry.toNumber(), number); + + // Check funds in registry + const bal = await deployer.provider.getBalance(reg.contractAddress); + assert.equal(bal.toString(), value.toString()); + + // Check nonce updated + nonce = await multisig.nonce(); + assert.equal(nonce.toNumber(), 1); + } + + async function executeSendFailure(signers, nonceOffset, sortSigners, returnBadSignatures, errorMessage) { + let nonce = await multisig.nonce(); + nonce = nonce.toNumber() + nonceOffset; + const data = reg.contract.interface.functions.register.encode([number]); + + const signedData = MultisigExecutor.signHash(multisig.contractAddress, reg.contractAddress, value, data, nonce); + const signatures = await getSignatures(signedData, signers, sortSigners, returnBadSignatures); + + await assert.revertWith(multisig.execute(reg.contractAddress, value, data, signatures), errorMessage); + } + + async function getMultiSigParams(functioName, params) { + const nonce = await multisig.nonce(); + const data = multisig.contract.interface.functions[functioName].encode([...params]); + const signedData = MultisigExecutor.signHash(multisig.contractAddress, multisig.contractAddress, 0, data, nonce.toNumber()); + const signatures = await getSignatures(signedData, [owner1, owner2]); + return { data, signatures }; + } + + describe("Creating and changing the multisig", () => { + it("should not be able to instantiate without owners", async () => { + await assert.revertWith(deployer.deploy(MultiSigWallet, {}, 2, []), "MSW: Not enough or too many owners"); + }); + + it("should not be able to instantiate with 0 threshold", async () => { + await assert.revertWith(deployer.deploy(MultiSigWallet, {}, 0, owners), "MSW: Invalid threshold"); + }); + + it("should store owners correctly", async () => { + for (let i = 0; i < 3; i += 1) { + const isOwner = await multisig.isOwner(owners[i]); + assert.isTrue(isOwner); + } + + const ownersCount = await multisig.ownersCount(); + assert.equal(ownersCount.toNumber(), 3); + }); + + it("should have initial nonce of zero", async () => { + const nonce = await multisig.nonce(); + assert.equal(nonce.toNumber(), 0); + }); + + it("should not be able to execute addOwner externally", async () => { + await assert.revertWith(multisig.addOwner(newowner.address), "MSW: Calling account is not wallet"); + }); + + it("should not be able to execute removeOwner externally", async () => { + await assert.revertWith(multisig.removeOwner(newowner.address), "MSW: Calling account is not wallet"); + }); + + it("should not be able to execute changeThreshold externally", async () => { + await assert.revertWith(multisig.changeThreshold(15), "MSW: Calling account is not wallet"); + }); + + it("should be able to add new owner", async () => { + const { data, signatures } = await getMultiSigParams("addOwner", [newowner.address]); + await multisig.execute(multisig.contractAddress, 0, data, signatures); + + const isOwner = await multisig.isOwner(newowner.address); + assert.isTrue(isOwner); + }); + + it("should not be able to add more than 10 owners", async () => { + // We already have 3 owners, which are accounts 1..3 + // Here we add accounts 4..10 to get 10 owners on the multisig + for (let i = 4; i <= 10; i += 1) { + const randomAddress = await utils.getRandomAddress(); + const { data, signatures } = await getMultiSigParams("addOwner", [randomAddress]); + await multisig.execute(multisig.contractAddress, 0, data, signatures); + } + + const ownersCount = await multisig.ownersCount(); + assert.equal(ownersCount.toNumber(), 10); + + const randomAddress = await utils.getRandomAddress(); + const { data, signatures } = await getMultiSigParams("addOwner", [randomAddress]); + await assert.revertWith(multisig.execute(multisig.contractAddress, 0, data, signatures), "MSW: External call failed"); + }); + + it("should not be able to add owner twice", async () => { + const { data, signatures } = await getMultiSigParams("addOwner", [owner1.address]); + await assert.revertWith(multisig.execute(multisig.contractAddress, 0, data, signatures), "MSW: External call failed"); + }); + + it("should be able to remove existing owner", async () => { + const { data, signatures } = await getMultiSigParams("removeOwner", [owner1.address]); + await multisig.execute(multisig.contractAddress, 0, data, signatures); + + const isOwner = await multisig.isOwner(owner1.address); + assert.isFalse(isOwner); + }); + + it("should not be able to remove owner if remaining owners are at the threshold count", async () => { + const values1 = await getMultiSigParams("removeOwner", [owner3.address]); + await multisig.execute(multisig.contractAddress, 0, values1.data, values1.signatures); + + const values2 = await getMultiSigParams("removeOwner", [owner2.address]); + await assert.revertWith(multisig.execute(multisig.contractAddress, 0, values2.data, values2.signatures), "MSW: External call failed"); + }); + + it("should not be able to remove a nonexisting owner", async () => { + const randomAddress = await utils.getRandomAddress(); + const { data, signatures } = await getMultiSigParams("removeOwner", [randomAddress]); + await assert.revertWith(multisig.execute(multisig.contractAddress, 0, data, signatures), "MSW: External call failed"); + }); + + it("should be able to change the threshold", async () => { + let threshold = await multisig.threshold(); + assert.equal(threshold.toNumber(), 2); + + const { data, signatures } = await getMultiSigParams("changeThreshold", [3]); + await multisig.execute(multisig.contractAddress, 0, data, signatures); + + threshold = await multisig.threshold(); + assert.equal(threshold.toNumber(), 3); + }); + + it("should not be able to change the threshold to be more than the current number of owners", async () => { + const { data, signatures } = await getMultiSigParams("changeThreshold", [4]); + await assert.revertWith(multisig.execute(multisig.contractAddress, 0, data, signatures), "MSW: External call failed"); + }); + }); + + describe("3 signers, threshold 2", () => { + it("should succeed with signers 1, 2", async () => { + await executeSendSuccess([owner1, owner2]); + }); + + it("should succeed with signers 1, 3", async () => { + await executeSendSuccess([owner1, owner3]); + }); + + it("should succeed with signers 2, 3", async () => { + await executeSendSuccess([owner2, owner3]); + }); + + it("should succeed with more signers than threshold", async () => { + await executeSendSuccess([owner1, owner2, owner3]); + }); + + it("should fail due to non-owner signer", async () => { + await executeSendFailure([owner, owner3], 0, "Not enough valid signatures"); + }); + + it("should fail with fewer signers than threshold", async () => { + await executeSendFailure([owner1], 0, "MSW: Not enough signatures"); + }); + + it("should fail with one signer signing twice", async () => { + await executeSendFailure([owner1, owner1], 0, true, "MSW: Badly ordered signatures"); + }); + + it("should fail with signers in wrong order", async () => { + let signers = utils.sortWalletByAddress([owner1, owner2]); + signers = signers.reverse(); // opposite order it should be + await executeSendFailure(signers, 0, false, "MSW: Badly ordered signatures"); + }); + + it("should fail with the wrong nonce", async () => { + const nonceOffset = 1; + await executeSendFailure([owner1, owner2], nonceOffset, true, "MSW: Not enough valid signatures"); + }); + + it("should fail with the wrong signature", async () => { + await executeSendFailure([owner1, owner2], 0, true, true, "MSW: Invalid v"); + }); + }); +}); diff --git a/test/nftTransfer.js b/test/nftTransfer.js index bf4130e53..1f6036d5b 100644 --- a/test/nftTransfer.js +++ b/test/nftTransfer.js @@ -1,3 +1,6 @@ +/* global accounts */ +const ethers = require("ethers"); + const Wallet = require("../build/BaseWallet"); const Registry = require("../build/ModuleRegistry"); @@ -14,144 +17,167 @@ const ZERO_BYTES32 = ethers.constants.HashZero; const TestManager = require("../utils/test-manager"); const { parseRelayReceipt } = require("../utils/utilities.js"); -describe("Test Token Transfer", function () { - this.timeout(10000); - - const manager = new TestManager(); - - const owner1 = accounts[1].signer; - const owner2 = accounts[2].signer; - const eoaRecipient = accounts[3].signer; - - let nftModule, wallet1, wallet2, erc721, ck, ckId, erc20, erc20Approver; - - const tokenId = 1; - - - before(async () => { - deployer = manager.newDeployer(); - const registry = await deployer.deploy(Registry); - - const guardianStorage = await deployer.deploy(GuardianStorage); - ck = await deployer.deploy(CK); - nftModule = await deployer.deploy(NftModule, {}, - registry.contractAddress, - guardianStorage.contractAddress, - ck.contractAddress - ); - erc20Approver = await deployer.deploy(ERC20Approver, {}, registry.contractAddress); +describe("Token Transfer", function () { + this.timeout(10000); + + const manager = new TestManager(); + + const owner1 = accounts[1].signer; + const owner2 = accounts[2].signer; + const eoaRecipient = accounts[3].signer; + const tokenId = 1; + + let deployer; + let nftModule; + let wallet1; + let wallet2; + let erc721; + let ck; + let ckId; + let erc20; + let erc20Approver; + + before(async () => { + deployer = manager.newDeployer(); + const registry = await deployer.deploy(Registry); + + const guardianStorage = await deployer.deploy(GuardianStorage); + ck = await deployer.deploy(CK); + nftModule = await deployer.deploy(NftModule, {}, + registry.contractAddress, + guardianStorage.contractAddress, + ck.contractAddress); + erc20Approver = await deployer.deploy(ERC20Approver, {}, registry.contractAddress); + }); + + beforeEach(async () => { + wallet1 = await deployer.deploy(Wallet); + wallet2 = await deployer.deploy(Wallet); + await wallet1.init(owner1.address, [nftModule.contractAddress, erc20Approver.contractAddress]); + await wallet2.init(owner2.address, [nftModule.contractAddress]); + erc721 = await deployer.deploy(ERC721); + await erc721.mint(wallet1.contractAddress, tokenId); + }); + + + describe("NFT transfers", () => { + async function testNftTransfer({ + safe = true, relayed, recipientAddress, nftContract = erc721, nftId = tokenId, shouldSucceed = true, + }) { + const beforeWallet1 = await nftContract.balanceOf(wallet1.contractAddress); + const beforeRecipient = await nftContract.balanceOf(recipientAddress); + if (relayed) { + const txReceipt = await manager.relay(nftModule, "transferNFT", + [wallet1.contractAddress, nftContract.contractAddress, recipientAddress, nftId, safe, ZERO_BYTES32], wallet1, [owner1]); + const success = parseRelayReceipt(txReceipt); + assert.equal(success, shouldSucceed); + } else { + const txPromise = nftModule.from(owner1) + .transferNFT(wallet1.contractAddress, nftContract.contractAddress, recipientAddress, nftId, safe, ZERO_BYTES32); + if (shouldSucceed) { + await txPromise; + } else { + assert.revert(txPromise); + } + } + if (shouldSucceed) { + const afterWallet1 = await nftContract.balanceOf(wallet1.contractAddress); + const afterRecipient = await nftContract.balanceOf(recipientAddress); + assert.equal(beforeWallet1.sub(afterWallet1).toNumber(), 1, `wallet1 should have one less NFT (safe: ${safe}, relayed: ${relayed})`); + assert.equal(afterRecipient.sub(beforeRecipient).toNumber(), 1, `recipient should have one more NFT (safe: ${safe}, relayed: ${relayed})`); + } + } + + describe("transfer to EOA account", () => { + it("should allow unsafe NFT transfer from wallet1 to an EOA account", async () => { + await testNftTransfer({ safe: false, relayed: false, recipientAddress: eoaRecipient.address }); + }); + + it("should allow safe NFT transfer from wallet1 to an EOA account", async () => { + await testNftTransfer({ safe: true, relayed: false, recipientAddress: eoaRecipient.address }); + }); + + + it("should allow unsafe NFT transfer from wallet1 to an EOA account (relayed)", async () => { + await testNftTransfer({ safe: false, relayed: true, recipientAddress: eoaRecipient.address }); + }); + + it("should allow safe NFT transfer from wallet1 to an EOA account (relayed)", async () => { + await testNftTransfer({ safe: true, relayed: true, recipientAddress: eoaRecipient.address }); + }); }); - beforeEach(async () => { - wallet1 = await deployer.deploy(Wallet); - wallet2 = await deployer.deploy(Wallet); - await wallet1.init(owner1.address, [nftModule.contractAddress, erc20Approver.contractAddress]); - await wallet2.init(owner2.address, [nftModule.contractAddress]); - erc721 = await deployer.deploy(ERC721); - await erc721.mint(wallet1.contractAddress, tokenId); - }); + describe("transfer to other wallet", () => { + it("should allow unsafe NFT transfer from wallet1 to wallet2", async () => { + await testNftTransfer({ safe: false, relayed: false, recipientAddress: wallet2.contractAddress }); + }); + it("should allow safe NFT transfer from wallet1 to wallet2", async () => { + await testNftTransfer({ safe: true, relayed: false, recipientAddress: wallet2.contractAddress }); + }); - describe("NFT transfers", () => { - async function testNftTransfer({ safe = true, relayed, recipientAddress, nftContract = erc721, nftId = tokenId, shouldSucceed = true }) { - let beforeWallet1 = await nftContract.balanceOf(wallet1.contractAddress); - let beforeRecipient = await nftContract.balanceOf(recipientAddress); - if (relayed) { - const txReceipt = await manager.relay(nftModule, 'transferNFT', [wallet1.contractAddress, nftContract.contractAddress, recipientAddress, nftId, safe, ZERO_BYTES32], wallet1, [owner1]); - const success = parseRelayReceipt(txReceipt); - assert.equal(success, shouldSucceed) - } else { - const txPromise = nftModule.from(owner1).transferNFT(wallet1.contractAddress, nftContract.contractAddress, recipientAddress, nftId, safe, ZERO_BYTES32); - shouldSucceed && await txPromise || assert.revert(txPromise); - } - if (shouldSucceed) { - let afterWallet1 = await nftContract.balanceOf(wallet1.contractAddress); - let afterRecipient = await nftContract.balanceOf(recipientAddress); - assert.equal(beforeWallet1.sub(afterWallet1).toNumber(), 1, `wallet1 should have one less NFT (safe: ${safe}, relayed: ${relayed})`); - assert.equal(afterRecipient.sub(beforeRecipient).toNumber(), 1, `recipient should have one more NFT (safe: ${safe}, relayed: ${relayed})`); - } - } - - describe("transfer to EOA account", () => { - it('should allow unsafe NFT transfer from wallet1 to an EOA account', async () => { - await testNftTransfer({ safe: false, relayed: false, recipientAddress: eoaRecipient.address }); - }); - - it('should allow safe NFT transfer from wallet1 to an EOA account', async () => { - await testNftTransfer({ safe: true, relayed: false, recipientAddress: eoaRecipient.address }); - }); + it("should allow unsafe NFT transfer from wallet1 to wallet2 (relayed)", async () => { + await testNftTransfer({ safe: false, relayed: true, recipientAddress: wallet2.contractAddress }); + }); + it("should allow safe NFT transfer from wallet1 to wallet2 (relayed)", async () => { + await testNftTransfer({ safe: true, relayed: true, recipientAddress: wallet2.contractAddress }); + }); + }); - it('should allow unsafe NFT transfer from wallet1 to an EOA account (relayed)', async () => { - await testNftTransfer({ safe: false, relayed: true, recipientAddress: eoaRecipient.address }); - }); + describe("CK transfer", () => { + beforeEach(async () => { + await ck.createDumbKitty(wallet1.contractAddress); + ckId = (ckId === undefined) ? 0 : ckId + 1; // update the id of the CryptoKitty that was just created + }); - it('should allow safe NFT transfer from wallet1 to an EOA account (relayed)', async () => { - await testNftTransfer({ safe: true, relayed: true, recipientAddress: eoaRecipient.address }); - }); + it("should allow CK transfer from wallet1 to wallet2", async () => { + await testNftTransfer({ + relayed: false, nftId: ckId, nftContract: ck, recipientAddress: wallet2.contractAddress, }); + }); - describe("transfer to other wallet", () => { - it('should allow unsafe NFT transfer from wallet1 to wallet2', async () => { - await testNftTransfer({ safe: false, relayed: false, recipientAddress: wallet2.contractAddress }); - }); - - it('should allow safe NFT transfer from wallet1 to wallet2', async () => { - await testNftTransfer({ safe: true, relayed: false, recipientAddress: wallet2.contractAddress }); - }); - - it('should allow unsafe NFT transfer from wallet1 to wallet2 (relayed)', async () => { - await testNftTransfer({ safe: false, relayed: true, recipientAddress: wallet2.contractAddress }); - }); - - it('should allow safe NFT transfer from wallet1 to wallet2 (relayed)', async () => { - await testNftTransfer({ safe: true, relayed: true, recipientAddress: wallet2.contractAddress }); - }); + it("should allow CK transfer from wallet1 to wallet2 (relayed)", async () => { + await testNftTransfer({ + relayed: true, nftId: ckId, nftContract: ck, recipientAddress: wallet2.contractAddress, }); + }); - describe("CK transfer", () => { - beforeEach(async () => { - await ck.createDumbKitty(wallet1.contractAddress); - ckId = (ckId === undefined) ? 0 : ckId + 1; // update the id of the CryptoKitty that was just created - }); - - it('should allow CK transfer from wallet1 to wallet2', async () => { - await testNftTransfer({ relayed: false, nftId: ckId, nftContract: ck, recipientAddress: wallet2.contractAddress }); - }); - - it('should allow CK transfer from wallet1 to wallet2 (relayed)', async () => { - await testNftTransfer({ relayed: true, nftId: ckId, nftContract: ck, recipientAddress: wallet2.contractAddress }); - }); - - it('should allow CK transfer from wallet1 to EOA account', async () => { - await testNftTransfer({ relayed: false, nftId: ckId, nftContract: ck, recipientAddress: eoaRecipient.address }); - }); - - it('should allow CK transfer from wallet1 to EOA account (relayed)', async () => { - await testNftTransfer({ relayed: true, nftId: ckId, nftContract: ck, recipientAddress: eoaRecipient.address }); - }); - + it("should allow CK transfer from wallet1 to EOA account", async () => { + await testNftTransfer({ + relayed: false, nftId: ckId, nftContract: ck, recipientAddress: eoaRecipient.address, }); + }); - describe("Protecting from transferFrom hijacking", () => { - beforeEach(async () => { - erc20 = await deployer.deploy(ERC20, {}, [wallet1.contractAddress], 1000, 18); - await erc20Approver.from(owner1).approveERC20( - wallet1.contractAddress, - erc20.contractAddress, - wallet1.contractAddress, // spender - 100, { gasLimit: 1000000 }); // amount - }); - - it('should NOT allow ERC20 transfer from wallet1 to wallet2', async () => { - await testNftTransfer({ shouldSucceed: false, safe: false, relayed: false, nftId: 100, nftContract: erc20, recipientAddress: wallet2.contractAddress }); - }); + it("should allow CK transfer from wallet1 to EOA account (relayed)", async () => { + await testNftTransfer({ + relayed: true, nftId: ckId, nftContract: ck, recipientAddress: eoaRecipient.address, + }); + }); + }); - it('should NOT allow ERC20 transfer from wallet1 to wallet2 (relayed)', async () => { - await testNftTransfer({ shouldSucceed: false, safe: false, relayed: true, nftId: 100, nftContract: erc20, recipientAddress: wallet2.contractAddress }); - }); + describe("Protecting from transferFrom hijacking", () => { + beforeEach(async () => { + erc20 = await deployer.deploy(ERC20, {}, [wallet1.contractAddress], 1000, 18); + await erc20Approver.from(owner1).approveERC20( + wallet1.contractAddress, + erc20.contractAddress, + wallet1.contractAddress, // spender + 100, { gasLimit: 1000000 }, + ); // amount + }); + + it("should NOT allow ERC20 transfer from wallet1 to wallet2", async () => { + await testNftTransfer({ + shouldSucceed: false, safe: false, relayed: false, nftId: 100, nftContract: erc20, recipientAddress: wallet2.contractAddress, + }); + }); + it("should NOT allow ERC20 transfer from wallet1 to wallet2 (relayed)", async () => { + await testNftTransfer({ + shouldSucceed: false, safe: false, relayed: true, nftId: 100, nftContract: erc20, recipientAddress: wallet2.contractAddress, }); + }); }); - -}); \ No newline at end of file + }); +}); diff --git a/test/proxy.js b/test/proxy.js index a06419c38..dde672286 100644 --- a/test/proxy.js +++ b/test/proxy.js @@ -1,53 +1,62 @@ -const etherlime = require('etherlime-lib'); -const Proxy = require('../build/Proxy'); -const Wallet = require('../build/BaseWallet'); -const Module = require('../build/BaseModule'); -const Registry = require('../build/ModuleRegistry'); - -describe("Test Proxy", function () { - this.timeout(10000); - - let owner = accounts[1].signer; - let nonowner = accounts[2].signer; - - let walletImplementation, wallet, proxy, module1, module2, module3; - - before(async () => { - deployer = new etherlime.EtherlimeGanacheDeployer(accounts[0].secretKey); - const registry = await deployer.deploy(Registry); - walletImplementation = await deployer.deploy(Wallet); - module1 = await deployer.deploy(Module, {}, registry.contractAddress, ethers.constants.AddressZero, ethers.constants.HashZero); - module2 = await deployer.deploy(Module, {}, registry.contractAddress, ethers.constants.AddressZero, ethers.constants.HashZero); - module3 = await deployer.deploy(Module, {}, registry.contractAddress, ethers.constants.AddressZero, ethers.constants.HashZero); - }); - - beforeEach(async () => { - proxy = await deployer.deploy(Proxy, {}, walletImplementation.contractAddress); - wallet = deployer.wrapDeployedContract(Wallet, proxy.contractAddress); - }); - - it("should init the wallet with the correct owner", async () => { - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, ethers.constants.AddressZero, "owner should be null before init"); - await wallet.init(owner.address, [module1.contractAddress], { gasLimit: 1000000 }); - walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, "owner should be the owner after init"); - }); - - it("should init a wallet with the correct modules", async () => { - await wallet.init(owner.address, [module1.contractAddress, module2.contractAddress], { gasLimit: 1000000 }); - let module1IsAuthorised = await wallet.authorised(module1.contractAddress); - let module2IsAuthorised = await wallet.authorised(module2.contractAddress); - let module3IsAuthorised = await wallet.authorised(module3.contractAddress); - assert.equal(module1IsAuthorised, true, "module1 should be authorised"); - assert.equal(module2IsAuthorised, true, "module2 should be authorised"); - assert.equal(module3IsAuthorised, false, "module3 should not be authorised"); - }); - - it("should accept ETH", async () => { - let before = await deployer.provider.getBalance(wallet.contractAddress); - await nonowner.sendTransaction({ to: wallet.contractAddress, value: 50000000 }); - let after = await deployer.provider.getBalance(wallet.contractAddress); - assert.equal(after.sub(before).toNumber(), 50000000, "should have received ETH"); - }); -}) \ No newline at end of file +/* global accounts */ +const etherlime = require("etherlime-lib"); +const ethers = require("ethers"); + +const Proxy = require("../build/Proxy"); +const Wallet = require("../build/BaseWallet"); +const Module = require("../build/BaseModule"); +const Registry = require("../build/ModuleRegistry"); + +describe("Proxy", function () { + this.timeout(10000); + + const owner = accounts[1].signer; + const nonowner = accounts[2].signer; + + let deployer; + let walletImplementation; + let wallet; + let proxy; + let module1; + let module2; + let module3; + + before(async () => { + deployer = new etherlime.EtherlimeGanacheDeployer(accounts[0].secretKey); + const registry = await deployer.deploy(Registry); + walletImplementation = await deployer.deploy(Wallet); + module1 = await deployer.deploy(Module, {}, registry.contractAddress, ethers.constants.AddressZero, ethers.constants.HashZero); + module2 = await deployer.deploy(Module, {}, registry.contractAddress, ethers.constants.AddressZero, ethers.constants.HashZero); + module3 = await deployer.deploy(Module, {}, registry.contractAddress, ethers.constants.AddressZero, ethers.constants.HashZero); + }); + + beforeEach(async () => { + proxy = await deployer.deploy(Proxy, {}, walletImplementation.contractAddress); + wallet = deployer.wrapDeployedContract(Wallet, proxy.contractAddress); + }); + + it("should init the wallet with the correct owner", async () => { + let walletOwner = await wallet.owner(); + assert.equal(walletOwner, ethers.constants.AddressZero, "owner should be null before init"); + await wallet.init(owner.address, [module1.contractAddress], { gasLimit: 1000000 }); + walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "owner should be the owner after init"); + }); + + it("should init a wallet with the correct modules", async () => { + await wallet.init(owner.address, [module1.contractAddress, module2.contractAddress], { gasLimit: 1000000 }); + const module1IsAuthorised = await wallet.authorised(module1.contractAddress); + const module2IsAuthorised = await wallet.authorised(module2.contractAddress); + const module3IsAuthorised = await wallet.authorised(module3.contractAddress); + assert.equal(module1IsAuthorised, true, "module1 should be authorised"); + assert.equal(module2IsAuthorised, true, "module2 should be authorised"); + assert.equal(module3IsAuthorised, false, "module3 should not be authorised"); + }); + + it("should accept ETH", async () => { + const before = await deployer.provider.getBalance(wallet.contractAddress); + await nonowner.sendTransaction({ to: wallet.contractAddress, value: 50000000 }); + const after = await deployer.provider.getBalance(wallet.contractAddress); + assert.equal(after.sub(before).toNumber(), 50000000, "should have received ETH"); + }); +}); diff --git a/test/recoveryManager.js b/test/recoveryManager.js index f6050a178..57c8480ef 100644 --- a/test/recoveryManager.js +++ b/test/recoveryManager.js @@ -1,3 +1,6 @@ +/* global accounts */ +const ethers = require("ethers"); + const GuardianManager = require("../build/GuardianManager"); const LockManager = require("../build/LockManager"); const RecoveryManager = require("../build/RecoveryManager"); @@ -6,279 +9,541 @@ const Wallet = require("../build/BaseWallet"); const Registry = require("../build/ModuleRegistry"); const TestManager = require("../utils/test-manager"); -const { sortWalletByAddress, parseRelayReceipt } = require("../utils/utilities.js"); +const { sortWalletByAddress, parseRelayReceipt, signOffchain } = require("../utils/utilities.js"); + +const WRONG_SIGNATURE_NUMBER_REVERT_MSG = "RM: Wrong number of signatures"; +const INVALID_SIGNATURES_REVERT_MSG = "RM: Invalid signatures"; describe("RecoveryManager", function () { - this.timeout(10000); + this.timeout(10000); + + const manager = new TestManager(accounts); + + const owner = accounts[1].signer; + const guardian1 = accounts[2].signer; + const guardian2 = accounts[3].signer; + const guardian3 = accounts[4].signer; + const newowner = accounts[5].signer; + const nonowner = accounts[6].signer; + const nonowner2 = accounts[9].signer; + + let deployer; + let registry; + let guardianManager; + let guardianStorage; + let lockManager; + let recoveryManager; + let recoveryPeriod; + let wallet; + + beforeEach(async () => { + deployer = manager.newDeployer(); + registry = await deployer.deploy(Registry); + guardianStorage = await deployer.deploy(GuardianStorage); + guardianManager = await deployer.deploy(GuardianManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24, 12); + lockManager = await deployer.deploy(LockManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24 * 5); + recoveryManager = await deployer.deploy(RecoveryManager, {}, registry.contractAddress, guardianStorage.contractAddress, 36, 24 * 5, 24, 12); + recoveryPeriod = await recoveryManager.recoveryPeriod(); + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [guardianManager.contractAddress, lockManager.contractAddress, recoveryManager.contractAddress]); + }); + + async function addGuardians(guardians) { + // guardians can be Wallet or ContractWrapper objects + const guardianAddresses = guardians.map((guardian) => { + if (guardian.address) return guardian.address; + return guardian.contractAddress; + }); - const manager = new TestManager(accounts); + for (const address of guardianAddresses) { + await guardianManager.from(owner).addGuardian(wallet.contractAddress, address); + } - let owner = accounts[1].signer; - let guardian1 = accounts[2].signer; - let guardian2 = accounts[3].signer; - let guardian3 = accounts[4].signer; - let newowner = accounts[5].signer; - let nonowner = accounts[6].signer; + await manager.increaseTime(30); + for (let i = 1; i < guardianAddresses.length; i += 1) { + await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardianAddresses[i]); + } + const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); + assert.equal(count, guardians.length, `${guardians.length} guardians should be added`); + } + + async function createSmartContractGuardians(guardians) { + const wallets = []; + let g; + for (g of guardians) { + const guardianWallet = await deployer.deploy(Wallet); + await guardianWallet.init(g.address, [guardianManager.contractAddress]); + wallets.push(guardianWallet); + } + return wallets; + } + + function testExecuteRecovery(guardians) { + it("should let a majority of guardians execute the recovery procedure", async () => { + const majority = guardians.slice(0, Math.ceil((guardians.length) / 2)); + await manager.relay(recoveryManager, "executeRecovery", [wallet.contractAddress, newowner.address], wallet, sortWalletByAddress(majority)); + const currentBlock = await manager.getCurrentBlock(); + const timestamp = await manager.getTimestamp(currentBlock); + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(isLocked, "should be locked by recovery"); + + const recoveryConfig = await recoveryManager.getRecovery(wallet.contractAddress); + assert.equal(recoveryConfig._address, newowner.address); + assert.closeTo(recoveryConfig._executeAfter.toNumber(), recoveryPeriod.add(timestamp).toNumber(), 1); + assert.equal(recoveryConfig._guardianCount, guardians.length); + }); - let guardianManager, lockManager, recoveryManager, wallet; + it("should not let owner execute the recovery procedure", async () => { + const expectedRevertMsg = guardians.length >= 3 ? WRONG_SIGNATURE_NUMBER_REVERT_MSG : INVALID_SIGNATURES_REVERT_MSG; + await assert.revertWith( + manager.relay( + recoveryManager, + "executeRecovery", + [wallet.contractAddress, newowner.address], + wallet, + [owner], + ), expectedRevertMsg, + ); + }); - beforeEach(async () => { - deployer = manager.newDeployer(); - const registry = await deployer.deploy(Registry); - const guardianStorage = await deployer.deploy(GuardianStorage); - guardianManager = await deployer.deploy(GuardianManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24, 12); - lockManager = await deployer.deploy(LockManager, {}, registry.contractAddress, guardianStorage.contractAddress, 24 * 5); - recoveryManager = await deployer.deploy(RecoveryManager, {}, registry.contractAddress, guardianStorage.contractAddress, 36, 24 * 5, 24, 12); - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [guardianManager.contractAddress, lockManager.contractAddress, recoveryManager.contractAddress]); - }); - - async function addGuardians(guardians) { - // guardians can be Wallet or ContractWrapper objects - let guardianAddresses = guardians.map(guardian => { - if (guardian.address) - return guardian.address; - return guardian.contractAddress; - }); - - for (const address of guardianAddresses) { - await guardianManager.from(owner).addGuardian(wallet.contractAddress, address); - } + it("should not let a majority of guardians and owner execute the recovery procedure", async () => { + const majority = guardians.slice(0, Math.ceil((guardians.length) / 2) - 1); + await assert.revertWith( + manager.relay( + recoveryManager, + "executeRecovery", + [wallet.contractAddress, newowner.address], + wallet, + [owner, ...sortWalletByAddress(majority)], + ), INVALID_SIGNATURES_REVERT_MSG, + ); + + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(isLocked, "should not be locked"); + }); - await manager.increaseTime(30); - for (let i = 1; i < guardianAddresses.length; i++) { - await guardianManager.confirmGuardianAddition(wallet.contractAddress, guardianAddresses[i]); - } - const count = (await guardianManager.guardianCount(wallet.contractAddress)).toNumber(); - assert.equal(count, guardians.length, `${guardians.length} guardians should be added`); - } + it("should not let a minority of guardians execute the recovery procedure", async () => { + const minority = guardians.slice(0, Math.ceil((guardians.length) / 2) - 1); + await assert.revertWith( + manager.relay( + recoveryManager, + "executeRecovery", + [wallet.contractAddress, newowner.address], + wallet, + sortWalletByAddress(minority), + ), WRONG_SIGNATURE_NUMBER_REVERT_MSG, + ); + + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(isLocked, "should not be locked"); + }); + } + + function testFinalizeRecovery() { + it("should let anyone finalize the recovery procedure after the recovery period", async () => { + await manager.increaseTime(40); // moving time to after the end of the recovery period + await manager.relay(recoveryManager, "finalizeRecovery", [wallet.contractAddress], wallet, []); + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(isLocked, "should no longer be locked after finalization of recovery"); + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, newowner.address, "wallet owner should have been changed"); + + const recoveryConfig = await recoveryManager.getRecovery(wallet.contractAddress); + assert.equal(recoveryConfig._address, ethers.constants.AddressZero); + assert.equal(recoveryConfig._executeAfter.toNumber(), 0); + assert.equal(recoveryConfig._guardianCount, 0); + }); + + it("should not let anyone finalize the recovery procedure before the end of the recovery period", async () => { + const txReceipt = await manager.relay(recoveryManager, "finalizeRecovery", [wallet.contractAddress], wallet, []); + const success = parseRelayReceipt(txReceipt); + assert.isNotOk(success, "finalization should have failed"); + + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(isLocked, "should still be locked"); + }); + } + + function testCancelRecovery() { + it("should let 2 guardians cancel the recovery procedure", async () => { + await manager.relay(recoveryManager, "cancelRecovery", [wallet.contractAddress], wallet, sortWalletByAddress([guardian1, guardian2])); + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(isLocked, "should no longer be locked by recovery"); + await manager.increaseTime(40); // moving time to after the end of the recovery period + const txReceipt = await manager.relay(recoveryManager, "finalizeRecovery", [wallet.contractAddress], wallet, []); + const success = parseRelayReceipt(txReceipt); + assert.isNotOk(success, "finalization should have failed"); + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "wallet owner should not have been changed"); + + const recoveryConfig = await recoveryManager.getRecovery(wallet.contractAddress); + assert.equal(recoveryConfig._address, ethers.constants.AddressZero); + assert.equal(recoveryConfig._executeAfter.toNumber(), 0); + assert.equal(recoveryConfig._guardianCount, 0); + }); + + it("should let 1 guardian + owner cancel the recovery procedure", async () => { + await manager.relay(recoveryManager, "cancelRecovery", [wallet.contractAddress], wallet, [owner, guardian1]); + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isFalse(isLocked, "should no longer be locked by recovery"); + await manager.increaseTime(40); // moving time to after the end of the recovery period + const txReceipt = await manager.relay(recoveryManager, "finalizeRecovery", [wallet.contractAddress], wallet, []); + const success = parseRelayReceipt(txReceipt); + assert.isNotOk(success, "finalization should have failed"); + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "wallet owner should not have been changed"); + }); + + it("should not let 1 guardian cancel the recovery procedure", async () => { + await assert.revertWith( + manager.relay( + recoveryManager, + "cancelRecovery", + [wallet.contractAddress], + wallet, + [guardian1], + ), WRONG_SIGNATURE_NUMBER_REVERT_MSG, + ); + + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(isLocked, "should still be locked"); + }); + + it("should not let the owner cancel the recovery procedure", async () => { + await assert.revertWith( + manager.relay( + recoveryManager, + "cancelRecovery", + [wallet.contractAddress], + wallet, + [owner], + ), WRONG_SIGNATURE_NUMBER_REVERT_MSG, + ); + + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(isLocked, "should still be locked"); + }); + + it("should not allow duplicate guardian signatures", async () => { + await assert.revertWith( + manager.relay( + recoveryManager, + "cancelRecovery", + [wallet.contractAddress], + wallet, + [guardian1, guardian1], + ), INVALID_SIGNATURES_REVERT_MSG, + ); + + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(isLocked, "should still be locked"); + }); + + it("should not allow non guardians signatures", async () => { + await assert.revertWith( + manager.relay( + recoveryManager, + "cancelRecovery", + [wallet.contractAddress], + wallet, + sortWalletByAddress([guardian1, nonowner]), + ), INVALID_SIGNATURES_REVERT_MSG, + ); + + const isLocked = await lockManager.isLocked(wallet.contractAddress); + assert.isTrue(isLocked, "should still be locked"); + }); + } + + function testOwnershipTransfer(guardians) { + it("should let owner + the majority of guardians execute an ownership transfer", async () => { + const majority = guardians.slice(0, Math.ceil((guardians.length) / 2)); + + await manager.relay(recoveryManager, "transferOwnership", + [wallet.contractAddress, newowner.address], wallet, [owner, ...sortWalletByAddress(majority)]); + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, newowner.address, "owner should have been changed"); + }); + + it("should not let owner + minority of guardians execute an ownership transfer", async () => { + const minority = guardians.slice(0, Math.ceil((guardians.length) / 2) - 1); + await assert.revertWith( + manager.relay( + recoveryManager, + "transferOwnership", + [wallet.contractAddress, newowner.address], + wallet, + [owner, ...sortWalletByAddress(minority)], + ), WRONG_SIGNATURE_NUMBER_REVERT_MSG, + ); + + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "owner should not have been changed"); + }); + + it("should not let majority of guardians execute an ownership transfer without owner", async () => { + const majority = guardians.slice(0, Math.ceil((guardians.length) / 2)); + await assert.revertWith( + manager.relay( + recoveryManager, + "transferOwnership", + [wallet.contractAddress, newowner.address], + wallet, + [...sortWalletByAddress(majority)], + ), WRONG_SIGNATURE_NUMBER_REVERT_MSG, + ); + + const walletOwner = await wallet.owner(); + assert.equal(walletOwner, owner.address, "owner should not have been changed"); + }); + } + + describe("RecoveryManager high level logic", () => { + it("should not be able to instantiate the RecoveryManager with lock period shorter than the recovery period", async () => { + await assert.revertWith(deployer.deploy(RecoveryManager, {}, registry.contractAddress, guardianStorage.contractAddress, 36, 35, 24, 12), + "RM: insecure security periods"); + }); + + it("should not be able to instantiate the RecoveryManager with recovery period shorter than security period + security window", async () => { + await assert.revertWith(deployer.deploy(RecoveryManager, {}, registry.contractAddress, guardianStorage.contractAddress, 36, 24 * 5, 24, 13), + "RM: insecure security periods"); + }); + }); + + describe("Execute Recovery", () => { + describe("EOA Guardians: G = 2", () => { + beforeEach(async () => { + await addGuardians([guardian1, guardian2]); + }); + + testExecuteRecovery([guardian1, guardian2]); + }); + + describe("EOA Guardians: G = 3", () => { + beforeEach(async () => { + await addGuardians([guardian1, guardian2, guardian3]); + }); + + testExecuteRecovery([guardian1, guardian2, guardian3]); + + it("should not allow duplicate guardian signatures", async () => { + const badMajority = [guardian1, guardian1]; + await assert.revertWith( + manager.relay( + recoveryManager, + "executeRecovery", + [wallet.contractAddress, newowner.address], + wallet, + [...sortWalletByAddress(badMajority)], + ), INVALID_SIGNATURES_REVERT_MSG, + ); + }); + }); + + describe("Smart Contract Guardians: G = 2", () => { + let guardians; + beforeEach(async () => { + guardians = await createSmartContractGuardians([guardian1, guardian2]); + await addGuardians(guardians); + }); + + testExecuteRecovery([guardian1, guardian2]); + }); + + describe("Smart Contract Guardians: G = 3", () => { + let guardians; + beforeEach(async () => { + guardians = await createSmartContractGuardians([guardian1, guardian2, guardian3]); + await addGuardians(guardians); + }); - async function createSmartContractGuardians(guardians) { - const wallets = [] - for (g of guardians) { - const wallet = await deployer.deploy(Wallet); - await wallet.init(g.address, [guardianManager.contractAddress]); - wallets.push(wallet) + testExecuteRecovery([guardian1, guardian2, guardian3]); + }); + + describe("Safety checks", () => { + beforeEach(async () => { + await addGuardians([guardian1]); + }); + + it("should not be able to call ExecuteRecovery with an empty recovery address", async () => { + const txReceipt = await manager.relay(recoveryManager, "executeRecovery", + [wallet.contractAddress, ethers.constants.AddressZero], wallet, [guardian1]); + const success = parseRelayReceipt(txReceipt); + assert.isNotOk(success, "executeRecovery should fail"); + }); + + it("should not be able to call ExecuteRecovery if already in the process of Recovery", async () => { + await manager.relay(recoveryManager, "executeRecovery", + [wallet.contractAddress, newowner.address], wallet, sortWalletByAddress([guardian1])); + + const txReceipt = await manager.relay(recoveryManager, "executeRecovery", + [wallet.contractAddress, ethers.constants.AddressZero], wallet, [guardian1]); + const success = parseRelayReceipt(txReceipt); + assert.isNotOk(success, "executeRecovery should fail"); + }); + + it("should revert if an unknown method is executed", async () => { + const nonce = await manager.getNonceForRelay(); + let methodData = recoveryManager.contract.interface.functions.executeRecovery.encode([wallet.contractAddress, ethers.constants.AddressZero]); + // Replace the `executeRecovery` method signature: b0ba4da0 with a non-existent one: e0b6fcfc + methodData = methodData.replace("b0ba4da0", "e0b6fcfc"); + + const signatures = await signOffchain([guardian1], recoveryManager.contractAddress, wallet.contractAddress, 0, methodData, nonce, 0, 700000); + let errorReason; + try { + await recoveryManager.from(nonowner2).execute(wallet.contractAddress, methodData, nonce, signatures, 0, 700000, { gasLimit: 700000 }); + } catch (err) { + errorReason = err.data[err.transactionHash].reason; } - return wallets - } + assert.equal(errorReason, "RM: unknown method"); + }); + }); + }); - function testExecuteRecovery(guardians) { - it("should let a majority of guardians execute the recovery procedure (relayed transaction)", async () => { - let majority = guardians.slice(0, Math.ceil((guardians.length + 1) / 2)); - await manager.relay(recoveryManager, 'executeRecovery', [wallet.contractAddress, newowner.address], wallet, sortWalletByAddress(majority)); - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(isLocked, "should be locked by recovery"); - }); - - it("should not let a minority of guardians execute the recovery procedure (relayed transaction)", async () => { - let minority = guardians.slice(0, Math.ceil((guardians.length + 1) / 2) - 1); - let txReceipt = await manager.relay(recoveryManager, 'executeRecovery', [wallet.contractAddress, newowner.address], wallet, sortWalletByAddress(minority)); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "executeRecovery should fail"); - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(isLocked, "should not be locked"); - }); - } + describe("Finalize Recovery", () => { + beforeEach(async () => { + await addGuardians([guardian1, guardian2, guardian3]); + await manager.relay( + recoveryManager, + "executeRecovery", + [wallet.contractAddress, newowner.address], + wallet, + sortWalletByAddress([guardian1, guardian2]), + ); + }); - function testFinalizeRecovery() { - it("should let anyone finalize the recovery procedure after the recovery period (relayed transaction)", async () => { - await manager.increaseTime(40); // moving time to after the end of the recovery period - await manager.relay(recoveryManager, 'finalizeRecovery', [wallet.contractAddress], wallet, []); - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(isLocked, "should no longer be locked after finalization of recovery"); - const walletOwner = await wallet.owner(); - assert.equal(walletOwner, newowner.address, "wallet owner should have been changed"); - }); - - it("should not let anyone finalize the recovery procedure before the end of the recovery period (relayed transaction)", async () => { - const txReceipt = await manager.relay(recoveryManager, 'finalizeRecovery', [wallet.contractAddress], wallet, []); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, 'finalization should have failed') - - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(isLocked, "should still be locked"); - }); - } + testFinalizeRecovery(); + }); + + describe("Cancel Recovery with 3 guardians", () => { + describe("EOA Guardians", () => { + beforeEach(async () => { + await addGuardians([guardian1, guardian2, guardian3]); + await manager.relay( + recoveryManager, + "executeRecovery", + [wallet.contractAddress, newowner.address], + wallet, + sortWalletByAddress([guardian1, guardian2]), + ); + }); + + testCancelRecovery(); + }); + describe("Smart Contract Guardians", () => { + beforeEach(async () => { + await addGuardians(await createSmartContractGuardians([guardian1, guardian2, guardian3])); + await manager.relay( + recoveryManager, + "executeRecovery", + [wallet.contractAddress, newowner.address], + wallet, + sortWalletByAddress([guardian1, guardian2]), + ); + }); + + testCancelRecovery(); + }); + }); + + describe("Ownership Transfer", () => { + it("should not allow transfer to an empty address", async () => { + await addGuardians([guardian1]); + const txReceipt = await manager.relay( + recoveryManager, + "transferOwnership", + [wallet.contractAddress, ethers.constants.AddressZero], wallet, [owner, guardian1], + ); + const success = parseRelayReceipt(txReceipt); + assert.isNotOk(success, "transferOwnership should fail"); + }); - function testCancelRecovery() { - it("should let 2 guardians cancel the recovery procedure (relayed transaction)", async () => { - await manager.relay(recoveryManager, 'cancelRecovery', [wallet.contractAddress], wallet, sortWalletByAddress([guardian1, guardian2])); - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(isLocked, "should no longer be locked by recovery"); - await manager.increaseTime(40); // moving time to after the end of the recovery period - const txReceipt = await manager.relay(recoveryManager, 'finalizeRecovery', [wallet.contractAddress], wallet, []); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, 'finalization should have failed'); - const walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, "wallet owner should not have been changed"); - }); - - it("should let 1 guardian + owner cancel the recovery procedure (relayed transaction)", async () => { - await manager.relay(recoveryManager, 'cancelRecovery', [wallet.contractAddress], wallet, [owner, guardian1]); - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isFalse(isLocked, "should no longer be locked by recovery"); - await manager.increaseTime(40); // moving time to after the end of the recovery period - const txReceipt = await manager.relay(recoveryManager, 'finalizeRecovery', [wallet.contractAddress], wallet, []); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, 'finalization should have failed'); - const walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, "wallet owner should not have been changed"); - }); - - it("should not let 1 guardian cancel the recovery procedure (relayed transaction)", async () => { - let txReceipt = await manager.relay(recoveryManager, 'cancelRecovery', [wallet.contractAddress], wallet, [guardian1]); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "cancelRecovery should fail"); - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(isLocked, "should still be locked"); - }); - - it("should not let the owner cancel the recovery procedure (relayed transaction)", async () => { - let txReceipt = await manager.relay(recoveryManager, 'cancelRecovery', [wallet.contractAddress], wallet, [owner]); - const success = parseRelayReceipt(txReceipt); - assert.isNotOk(success, "cancelRecovery should fail"); - const isLocked = await lockManager.isLocked(wallet.contractAddress); - assert.isTrue(isLocked, "should still be locked"); - }); - } + it("when no guardians, owner should be able to transfer alone", async () => { + const txReceipt = await manager.relay( + recoveryManager, + "transferOwnership", + [wallet.contractAddress, newowner.address], + wallet, + [owner], + ); + const success = parseRelayReceipt(txReceipt); + assert.isOk(success, "transferOwnership should succeed"); + }); + + it("should not allow owner not signing", async () => { + await addGuardians([guardian1]); + await assert.revertWith( + manager.relay( + recoveryManager, + "transferOwnership", + [wallet.contractAddress, newowner.address], + wallet, + [nonowner, guardian1], + ), INVALID_SIGNATURES_REVERT_MSG, + ); + }); - describe("Execute Recovery", () => { - describe("EOA Guardians: G = 2", () => { - beforeEach(async () => { - await addGuardians([guardian1, guardian2]) - }); - - testExecuteRecovery([guardian1, guardian2]); - }); - - describe("EOA Guardians: G = 3", () => { - beforeEach(async () => { - await addGuardians([guardian1, guardian2, guardian3]) - }); - - testExecuteRecovery([guardian1, guardian2, guardian3]); - }); - - describe("Smart Contract Guardians: G = 2", () => { - let guardians; - beforeEach(async () => { - guardians = await createSmartContractGuardians([guardian1, guardian2]); - await addGuardians(guardians); - }); - - testExecuteRecovery([guardian1, guardian2]); - }); - - describe("Smart Contract Guardians: G = 3", () => { - let guardians; - beforeEach(async () => { - guardians = await createSmartContractGuardians([guardian1, guardian2, guardian3]); - await addGuardians(guardians); - }); - - testExecuteRecovery([guardian1, guardian2]); - }); - }); - - describe("Finalize Recovery", () => { - beforeEach(async () => { - await addGuardians([guardian1, guardian2, guardian3]) - await manager.relay(recoveryManager, 'executeRecovery', [wallet.contractAddress, newowner.address], wallet, sortWalletByAddress([guardian1, guardian2])); - }); - - testFinalizeRecovery(); - }) - - describe("Cancel Recovery with 3 guardians", () => { - describe("EOA Guardians", () => { - beforeEach(async () => { - await addGuardians([guardian1, guardian2, guardian3]) - await manager.relay(recoveryManager, 'executeRecovery', [wallet.contractAddress, newowner.address], wallet, sortWalletByAddress([guardian1, guardian2])); - }); - - testCancelRecovery(); - }); - describe("Smart Contract Guardians", () => { - beforeEach(async () => { - await addGuardians(await createSmartContractGuardians([guardian1, guardian2, guardian3])); - await manager.relay(recoveryManager, 'executeRecovery', [wallet.contractAddress, newowner.address], wallet, sortWalletByAddress([guardian1, guardian2])); - }); - - testCancelRecovery(); - }); - }) - - describe("Ownership Transfers", () => { - it("should let the owner execute an ownership transfer (blockchain transaction)", async () => { - await recoveryManager.from(owner).executeOwnershipTransfer(wallet.contractAddress, newowner.address); - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'owner should not have been changed yet'); - - await manager.increaseTime(30); - await recoveryManager.from(nonowner).finalizeOwnershipTransfer(wallet.contractAddress); - walletOwner = await wallet.owner(); - assert.equal(walletOwner, newowner.address, 'owner should have been changed after the security period'); - }); - - it("should not let the owner execute an ownership transfer after two security periods (blockchain transaction)", async () => { - await recoveryManager.from(owner).executeOwnershipTransfer(wallet.contractAddress, newowner.address); - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'owner should not have been changed.'); - - await manager.increaseTime(48); // 42 == 2 * security_period - await assert.revert(recoveryManager.finalizeOwnershipTransfer(wallet.contractAddress), "confirming the ownership transfer should throw"); - - walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'owner should not have been changed.'); - }); - - it("should let the owner re-execute an ownership transfer after missing the confirmation window (blockchain transaction)", async () => { - await recoveryManager.from(owner).executeOwnershipTransfer(wallet.contractAddress, newowner.address); - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'owner should not have been changed.'); - - await manager.increaseTime(48); // 42 == 2 * security_period - await assert.revert(recoveryManager.finalizeOwnershipTransfer(wallet.contractAddress), "confirming the ownership transfer should throw"); - - // second time - await recoveryManager.from(owner).executeOwnershipTransfer(wallet.contractAddress, newowner.address); - walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'owner should not have been changed yet.'); - - await manager.increaseTime(30); - await recoveryManager.from(nonowner).finalizeOwnershipTransfer(wallet.contractAddress); - walletOwner = await wallet.owner(); - assert.equal(walletOwner, newowner.address, 'owner should have been changed after the security period'); - }); - - it("should only let the owner execute an ownership transfer (blockchain transaction)", async () => { - await assert.revert(recoveryManager.from(nonowner).executeOwnershipTransfer(wallet.contractAddress, newowner.address), "transferring ownership from nonowner should throw"); - }); - - it("should let the owner execute and finalize an ownership transfer (relayed transaction)", async () => { - await manager.relay(recoveryManager, 'executeOwnershipTransfer', [wallet.contractAddress, newowner.address], wallet, [owner]) - let walletOwner = await wallet.owner(); - assert.equal(walletOwner, owner.address, 'owner should not have been changed yet'); - await manager.increaseTime(30); - const rc = await manager.relay(recoveryManager, 'finalizeOwnershipTransfer', [wallet.contractAddress], wallet, []) - walletOwner = await wallet.owner(); - assert.equal(walletOwner, newowner.address, 'owner should have been changed after the security period'); - }); - - it("owner should be able to cancel pending ownership transfer (blockchain transaction)", async () => { - await recoveryManager.from(owner).executeOwnershipTransfer(wallet.contractAddress, newowner.address); - await recoveryManager.from(owner).cancelOwnershipTransfer(wallet.contractAddress); - await manager.increaseTime(30); - await assert.revert(recoveryManager.finalizeOwnershipTransfer(wallet.contractAddress), "finalizeOwnershipTransfer should throw"); - }); - - it("owner should be able to cancel pending ownership transfer (relayed transaction)", async () => { - await manager.relay(recoveryManager, 'executeOwnershipTransfer', [wallet.contractAddress, newowner.address], wallet, [owner]); - await manager.relay(recoveryManager, 'cancelOwnershipTransfer', [wallet.contractAddress], wallet, [owner]); - await manager.increaseTime(30); - await assert.revert(recoveryManager.finalizeOwnershipTransfer(wallet.contractAddress), "finalizeOwnershipTransfer should throw"); - }); - }); - -}); \ No newline at end of file + it("should not allow duplicate owner signatures", async () => { + await addGuardians([guardian1]); + await assert.revertWith( + manager.relay( + recoveryManager, + "transferOwnership", + [wallet.contractAddress, newowner.address], + wallet, + [owner, owner], + ), INVALID_SIGNATURES_REVERT_MSG, + ); + }); + + it("should not allow duplicate guardian signatures", async () => { + await addGuardians([guardian1, guardian2, guardian3]); + await assert.revertWith( + manager.relay( + recoveryManager, + "transferOwnership", + [wallet.contractAddress, newowner.address], + wallet, + [owner, guardian1, guardian1], + ), INVALID_SIGNATURES_REVERT_MSG, + ); + }); + + it("should not allow non guardian signatures", async () => { + await addGuardians([guardian1]); + await assert.revertWith( + manager.relay( + recoveryManager, + "transferOwnership", + [wallet.contractAddress, newowner.address], + wallet, + [owner, nonowner], + ), INVALID_SIGNATURES_REVERT_MSG, + ); + }); + + describe("Guardians: G = 1", () => { + beforeEach(async () => { + await addGuardians([guardian1]); + }); + + testOwnershipTransfer([guardian1]); + }); + + describe("Guardians: G = 2", () => { + beforeEach(async () => { + await addGuardians([guardian1, guardian2]); + }); + + testOwnershipTransfer([guardian1, guardian2]); + }); + + describe("Guardians: G = 3", () => { + beforeEach(async () => { + await addGuardians([guardian1, guardian2, guardian3]); + }); + + testOwnershipTransfer([guardian1, guardian2, guardian3]); + }); + }); +}); diff --git a/test/relayer.js b/test/relayer.js new file mode 100644 index 000000000..da2b8eeed --- /dev/null +++ b/test/relayer.js @@ -0,0 +1,152 @@ +const ethers = require("ethers"); +const { AddressZero } = require("ethers").constants; + +const Wallet = require("../build/BaseWallet"); +const TestModule = require("../build/TestModule"); +const TestModuleRelayerV2 = require("../build/TestModuleRelayerV2"); +const Registry = require("../build/ModuleRegistry"); +const GuardianStorage = require("../build/GuardianStorage"); +const ApprovedTransfer = require("../build/ApprovedTransfer"); +const RecoveryManager = require("../build/RecoveryManager"); + +const TestManager = require("../utils/test-manager"); +const { getRandomAddress } = require("../utils/utilities.js"); + +const TARGET_OF_DATA_NOT_WALLET_REVERT_MSG = "RM: the wallet authorized is different then the target of the relayed data"; +const TARGET_OF_DATA_NOT_WALLET_REVERT_MSG_V2 = "RM: Target of _data != _wallet"; +const INVALID_DATA_REVERT_MSG = "RM: Invalid dataWallet"; +const DUPLICATE_REQUEST_REVERT_MSG = "RM: Duplicate request"; + +describe("RelayerModule", function () { + this.timeout(10000); + + const manager = new TestManager(); + const { deployer } = manager; + let { getNonceForRelay } = manager; + getNonceForRelay = getNonceForRelay.bind(manager); + const owner = global.accounts[1].signer; + let wallet; + let relayerModule; + let relayerModuleV2; + + beforeEach(async () => { + relayerModule = await deployer.deploy(TestModule, {}, AddressZero, false, 0); + relayerModuleV2 = await deployer.deploy(TestModuleRelayerV2, {}, AddressZero, false, 0); + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [relayerModule.contractAddress, relayerModuleV2.contractAddress]); + }); + + describe("RelayerModule", () => { + it("should fail to relay when target of _data != _wallet", async () => { + const params = [await getRandomAddress(), 4]; // the first argument is not the wallet address, which should make the relaying revert + await assert.revertWith( + manager.relay(relayerModule, "setIntOwnerOnly", params, wallet, [owner]), TARGET_OF_DATA_NOT_WALLET_REVERT_MSG, + ); + }); + + it("should fail to relay when _data is less than 36 bytes", async () => { + const params = []; // the first argument is not the wallet address, which should make the relaying rever + await assert.revertWith( + manager.relay(relayerModule, "clearInt", params, wallet, [owner]), INVALID_DATA_REVERT_MSG, + ); + }); + + it("should fail to relay a duplicate transaction", async () => { + const params = [wallet.contractAddress, 2]; + const nonce = await getNonceForRelay(); + const relayParams = [relayerModule, "setIntOwnerOnly", params, wallet, [owner], + global.accounts[9].signer, false, 2000000, nonce]; + await manager.relay(...relayParams); + await assert.revertWith( + manager.relay(...relayParams), DUPLICATE_REQUEST_REVERT_MSG, + ); + }); + + it("should update the nonce after transaction", async () => { + const nonce = await getNonceForRelay(); + await manager.relay(relayerModule, "setIntOwnerOnly", [wallet.contractAddress, 2], wallet, [owner], + global.accounts[9].signer, false, 2000000, nonce); + + const updatedNonce = await relayerModule.getNonce(wallet.contractAddress); + const updatedNonceHex = await ethers.utils.hexZeroPad(updatedNonce.toHexString(), 32); + assert.equal(nonce, updatedNonceHex); + }); + + it("should not allow ApprovedTransfer and RecoveryManager module functions to be executed directly", async () => { + const registry = await deployer.deploy(Registry); + const guardianStorage = await deployer.deploy(GuardianStorage); + const approvedTransfer = await deployer.deploy(ApprovedTransfer, {}, registry.contractAddress, guardianStorage.contractAddress); + const recoveryManager = await deployer.deploy(RecoveryManager, {}, registry.contractAddress, guardianStorage.contractAddress, 36, 120, 24, 12); + + const randomAddress = await getRandomAddress(); + + await assert.revertWith( + approvedTransfer.transferToken(wallet.contractAddress, randomAddress, randomAddress, 1, ethers.constants.HashZero), + "RM: must be called via execute()", + ); + + await assert.revertWith( + approvedTransfer.callContract(wallet.contractAddress, randomAddress, 1, ethers.constants.HashZero), + "RM: must be called via execute()", + ); + + await assert.revertWith( + approvedTransfer.approveTokenAndCallContract( + wallet.contractAddress, + randomAddress, + randomAddress, + 1, + randomAddress, + ethers.constants.HashZero, + ), + "RM: must be called via execute()", + ); + + await assert.revertWith(recoveryManager.executeRecovery(wallet.contractAddress, randomAddress), "RM: must be called via execute()"); + await assert.revertWith(recoveryManager.cancelRecovery(wallet.contractAddress), "RM: must be called via execute()"); + await assert.revertWith(recoveryManager.transferOwnership(wallet.contractAddress, randomAddress), "RM: must be called via execute()"); + }); + }); + + describe("RelayerModuleV2", () => { + it("should fail to relay when target of _data != _wallet", async () => { + const params = [await getRandomAddress(), 4]; // the first argument is not the wallet address, which should make the relaying revert + await assert.revertWith( + manager.relay(relayerModuleV2, "setIntOwnerOnly", params, wallet, [owner]), TARGET_OF_DATA_NOT_WALLET_REVERT_MSG_V2, + ); + }); + + it("should fail to relay when _data is less than 36 bytes", async () => { + const params = []; // the first argument is not the wallet address, which should make the relaying rever + await assert.revertWith( + manager.relay(relayerModuleV2, "clearInt", params, wallet, [owner]), INVALID_DATA_REVERT_MSG, + ); + }); + + it("should fail to relay a duplicate transaction", async () => { + const params = [wallet.contractAddress, 2]; + const nonce = await getNonceForRelay(); + const relayParams = [relayerModule, "setIntOwnerOnly", params, wallet, [owner], + global.accounts[9].signer, false, 2000000, nonce]; + await manager.relay(...relayParams); + await assert.revertWith( + manager.relay(...relayParams), DUPLICATE_REQUEST_REVERT_MSG, + ); + }); + + it("should update the nonce after transaction", async () => { + const nonce = await getNonceForRelay(); + await manager.relay(relayerModuleV2, "setIntOwnerOnly", [wallet.contractAddress, 2], wallet, [owner], + global.accounts[9].signer, false, 2000000, nonce); + + const updatedNonce = await relayerModuleV2.getNonce(wallet.contractAddress); + const updatedNonceHex = await ethers.utils.hexZeroPad(updatedNonce.toHexString(), 32); + assert.equal(nonce, updatedNonceHex); + }); + + it("should be able to get required signatures number", async () => { + const requiredSignatures = await relayerModuleV2.getRequiredSignatures(wallet.contractAddress, ethers.constants.HashZero); + assert.equal(requiredSignatures, 1); + }); + }); +}); diff --git a/test/simpleUpgrader.js b/test/simpleUpgrader.js index 8585d14da..caaf1a0b9 100644 --- a/test/simpleUpgrader.js +++ b/test/simpleUpgrader.js @@ -1,4 +1,9 @@ -const etherlime = require('etherlime-lib'); +/* global accounts, utils */ +const etherlime = require("etherlime-lib"); +const { + keccak256, toUtf8Bytes, formatBytes32String, parseBytes32String, +} = require("ethers").utils; + const Wallet = require("../build/BaseWallet"); const OnlyOwnerModule = require("../build/TestOnlyOwnerModule"); const Module = require("../build/TestModule"); @@ -7,136 +12,174 @@ const Registry = require("../build/ModuleRegistry"); const TestManager = require("../utils/test-manager"); -const { keccak256, toUtf8Bytes } = require('ethers').utils -const IS_ONLY_OWNER_MODULE = keccak256(toUtf8Bytes("isOnlyOwnerModule()")).slice(0, 10) +const IS_ONLY_OWNER_MODULE = keccak256(toUtf8Bytes("isOnlyOwnerModule()")).slice(0, 10); + +describe("SimpleUpgrader", function () { + this.timeout(10000); + + const manager = new TestManager(); -describe("Test SimpleUpgrader", function () { - this.timeout(10000); + const owner = accounts[1].signer; + let deployer; + let registry; - const manager = new TestManager(); + beforeEach(async () => { + deployer = new etherlime.EtherlimeGanacheDeployer(accounts[0].secretKey); + registry = await deployer.deploy(Registry); + }); - let owner = accounts[1].signer; - let registry; + describe("Registering modules", () => { + it("should register modules in the registry", async () => { + const name = "test_1.1"; + const initialModule = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); + await registry.registerModule(initialModule.contractAddress, formatBytes32String(name)); + // Here we adjust how we call isRegisteredModule which has 2 overlaods, one accepting a single address + // and a second accepting an array of addresses. Behaviour as to which overload is selected to run + // differs between CI and Coverage environments, adjusted for this here + const isRegistered = await registry["isRegisteredModule(address)"](initialModule.contractAddress); - beforeEach(async () => { - deployer = new etherlime.EtherlimeGanacheDeployer(accounts[0].secretKey); - registry = await deployer.deploy(Registry); + assert.equal(isRegistered, true, "module1 should be registered"); + const info = await registry.moduleInfo(initialModule.contractAddress); + assert.equal(parseBytes32String(info), name, "module1 should be registered with the correct name"); }); - describe("Registering modules", () => { - - it("should register modules in the registry", async () => { - let name = "test_1.1"; - let module = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); - await registry.registerModule(module.contractAddress, ethers.utils.formatBytes32String(name)); - let isRegistered = await registry.isRegisteredModule(module.contractAddress); - assert.equal(isRegistered, true, "module1 should be registered"); - let info = await registry.moduleInfo(module.contractAddress); - assert.equal(ethers.utils.parseBytes32String(info), name, "module1 should be registered with the correct name"); - }); - - it("should add registered modules to a wallet", async () => { - // create modules - let initialModule = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); - let moduleToAdd = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); - // register module - await registry.registerModule(initialModule.contractAddress, ethers.utils.formatBytes32String("initial")); - await registry.registerModule(moduleToAdd.contractAddress, ethers.utils.formatBytes32String("added")); - // create wallet with initial module - let wallet = await deployer.deploy(Wallet); - - await wallet.init(owner.address, [initialModule.contractAddress]); - let isAuthorised = await wallet.authorised(initialModule.contractAddress); - assert.equal(isAuthorised, true, "initial module should be authorised"); - // add module to wallet - await initialModule.from(owner).addModule(wallet.contractAddress, moduleToAdd.contractAddress, { gasLimit: 1000000 }); - isAuthorised = await wallet.authorised(moduleToAdd.contractAddress); - assert.equal(isAuthorised, true, "added module should be authorised"); - }); - - it("should block addition of unregistered modules to a wallet", async () => { - // create modules - let initialModule = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); - let moduleToAdd = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); - // register initial module only - await registry.registerModule(initialModule.contractAddress, ethers.utils.formatBytes32String("initial")); - // create wallet with initial module - let wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [initialModule.contractAddress]); - let isAuthorised = await wallet.authorised(initialModule.contractAddress); - assert.equal(isAuthorised, true, "initial module should be authorised"); - // try (and fail) to add moduleToAdd to wallet - await assert.revert(initialModule.from(owner).addModule(wallet.contractAddress, moduleToAdd.contractAddress, { gasLimit: 1000000 })); - isAuthorised = await wallet.authorised(moduleToAdd.contractAddress); - assert.equal(isAuthorised, false, "unregistered module should not be authorised"); - }); + it("should add registered modules to a wallet", async () => { + // create modules + const initialModule = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); + const moduleToAdd = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); + // register module + await registry.registerModule(initialModule.contractAddress, formatBytes32String("initial")); + await registry.registerModule(moduleToAdd.contractAddress, formatBytes32String("added")); + // create wallet with initial module + const wallet = await deployer.deploy(Wallet); + + await wallet.init(owner.address, [initialModule.contractAddress]); + let isAuthorised = await wallet.authorised(initialModule.contractAddress); + assert.equal(isAuthorised, true, "initial module should be authorised"); + // add module to wallet + await initialModule.from(owner).addModule(wallet.contractAddress, moduleToAdd.contractAddress, { gasLimit: 1000000 }); + isAuthorised = await wallet.authorised(moduleToAdd.contractAddress); + assert.equal(isAuthorised, true, "added module should be authorised"); }); - describe("Upgrading modules", () => { - async function testUpgradeModule({ relayed, useOnlyOwnerModule }) { - // create module V1 - let moduleV1; - if (useOnlyOwnerModule) { - moduleV1 = await deployer.deploy(OnlyOwnerModule, {}, registry.contractAddress); - } else { - moduleV1 = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); - } - // register module V1 - await registry.registerModule(moduleV1.contractAddress, ethers.utils.formatBytes32String("V1")); - // create wallet with module V1 - let wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [moduleV1.contractAddress]); - // create module V2 - let moduleV2 = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); - // register module V2 - await registry.registerModule(moduleV2.contractAddress, ethers.utils.formatBytes32String("V2")); - // create upgrader - let upgrader = await deployer.deploy(SimpleUpgrader, {}, registry.contractAddress, [moduleV1.contractAddress], [moduleV2.contractAddress]); - await registry.registerModule(upgrader.contractAddress, ethers.utils.formatBytes32String("V1toV2")); - // check that module V1 can be used to add the upgrader module - useOnlyOwnerModule && assert.equal(await moduleV1.isOnlyOwnerModule(), IS_ONLY_OWNER_MODULE); - - // upgrade from V1 to V2 - let txReceipt; - const params = [wallet.contractAddress, upgrader.contractAddress] - if (relayed) { - txReceipt = await manager.relay(moduleV1, 'addModule', params, wallet, [owner]); - assert.equal(txReceipt.events.find(e => e.event === 'TransactionExecuted').args.success, useOnlyOwnerModule, "Relayed tx should only have succeeded if an OnlyOwnerModule was used"); - } else { - const tx = await moduleV1.from(owner).addModule(...params, { gasLimit: 1000000 }); - txReceipt = await moduleV1.verboseWaitForTransaction(tx); - } - - // test event ordering - const logs = utils.parseLogs(txReceipt, wallet, 'AuthorisedModule'); - const upgraderAuthorisedLogIndex = logs.findIndex(e => e.module === upgrader.contractAddress && e.value === true); - const upgraderUnauthorisedLogIndex = logs.findIndex(e => e.module === upgrader.contractAddress && e.value === false); - if (!relayed || useOnlyOwnerModule) { - assert.isBelow(upgraderAuthorisedLogIndex, upgraderUnauthorisedLogIndex, "AuthorisedModule(upgrader, false) should come after AuthorisedModule(upgrader, true)"); - } else { - assert.equal(upgraderUnauthorisedLogIndex, -1, "AuthorisedModule(upgrader, false) should not have been emitted"); - assert.equal(upgraderAuthorisedLogIndex, -1, "AuthorisedModule(upgrader, true) should not have been emitted"); - } - - // test if the upgrade worked - let isV1Authorised = await wallet.authorised(moduleV1.contractAddress); - let isV2Authorised = await wallet.authorised(moduleV2.contractAddress); - let isUpgraderAuthorised = await wallet.authorised(upgrader.contractAddress); - assert.equal(isV1Authorised, relayed && !useOnlyOwnerModule, "moduleV1 should only be unauthorised if the upgrade went through"); - assert.equal(isV2Authorised, !relayed || useOnlyOwnerModule, "module2 should only be authorised if the upgrade went through"); - assert.equal(isUpgraderAuthorised, false, "upgrader should not be authorised"); + it("should block addition of unregistered modules to a wallet", async () => { + // create modules + const initialModule = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); + const moduleToAdd = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); + // register initial module only + await registry.registerModule(initialModule.contractAddress, formatBytes32String("initial")); + // create wallet with initial module + const wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [initialModule.contractAddress]); + let isAuthorised = await wallet.authorised(initialModule.contractAddress); + assert.equal(isAuthorised, true, "initial module should be authorised"); + // try (and fail) to add moduleToAdd to wallet + await assert.revert(initialModule.from(owner).addModule(wallet.contractAddress, moduleToAdd.contractAddress, { gasLimit: 1000000 })); + isAuthorised = await wallet.authorised(moduleToAdd.contractAddress); + assert.equal(isAuthorised, false, "unregistered module should not be authorised"); + }); + }); + + describe("Upgrading modules", () => { + async function testUpgradeModule({ relayed, useOnlyOwnerModule, modulesToAdd = (moduleV2) => [moduleV2] }) { + // create module V1 + let moduleV1; + if (useOnlyOwnerModule) { + moduleV1 = await deployer.deploy(OnlyOwnerModule, {}, registry.contractAddress); + } else { + moduleV1 = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); + } + // register module V1 + await registry.registerModule(moduleV1.contractAddress, formatBytes32String("V1")); + // create wallet with module V1 + const wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [moduleV1.contractAddress]); + // create module V2 + const moduleV2 = await deployer.deploy(Module, {}, registry.contractAddress, false, 0); + // register module V2 + await registry.registerModule(moduleV2.contractAddress, formatBytes32String("V2")); + // create upgrader + const toAdd = modulesToAdd(moduleV2.contractAddress); + const upgrader = await deployer.deploy(SimpleUpgrader, {}, registry.contractAddress, [moduleV1.contractAddress], toAdd); + await registry.registerModule(upgrader.contractAddress, formatBytes32String("V1toV2")); + // check that module V1 can be used to add the upgrader module + if (useOnlyOwnerModule) { + assert.equal(await moduleV1.isOnlyOwnerModule(), IS_ONLY_OWNER_MODULE); + } + + // upgrade from V1 to V2 + let txReceipt; + const params = [wallet.contractAddress, upgrader.contractAddress]; + + // if no module is added, the upgrade should fail + if (toAdd.length === 0) { + if (relayed) { + txReceipt = await manager.relay(moduleV1, "addModule", params, wallet, [owner]); + assert.isTrue(!txReceipt.events.find((e) => e.event === "TransactionExecuted").args.success, + "Relayed upgrade to 0 module should have failed."); + } else { + assert.revert(moduleV1.from(owner).addModule(...params, { gasLimit: 1000000 })); } + return; + } + + if (relayed) { + txReceipt = await manager.relay(moduleV1, "addModule", params, wallet, [owner]); + assert.equal(txReceipt.events.find((e) => e.event === "TransactionExecuted").args.success, useOnlyOwnerModule, + "Relayed tx should only have succeeded if an OnlyOwnerModule was used"); + } else { + const tx = await moduleV1.from(owner).addModule(...params, { gasLimit: 1000000 }); + txReceipt = await moduleV1.verboseWaitForTransaction(tx); + } + + // test event ordering + const logs = utils.parseLogs(txReceipt, wallet, "AuthorisedModule"); + const upgraderAuthorisedLogIndex = logs.findIndex((e) => e.module === upgrader.contractAddress && e.value === true); + const upgraderUnauthorisedLogIndex = logs.findIndex((e) => e.module === upgrader.contractAddress && e.value === false); + if (!relayed || useOnlyOwnerModule) { + assert.isBelow(upgraderAuthorisedLogIndex, upgraderUnauthorisedLogIndex, + "AuthorisedModule(upgrader, false) should come after AuthorisedModule(upgrader, true)"); + } else { + assert.equal(upgraderUnauthorisedLogIndex, -1, "AuthorisedModule(upgrader, false) should not have been emitted"); + assert.equal(upgraderAuthorisedLogIndex, -1, "AuthorisedModule(upgrader, true) should not have been emitted"); + } + + // test if the upgrade worked + const isV1Authorised = await wallet.authorised(moduleV1.contractAddress); + const isV2Authorised = await wallet.authorised(moduleV2.contractAddress); + const isUpgraderAuthorised = await wallet.authorised(upgrader.contractAddress); + const numModules = await wallet.modules(); + assert.equal(isV1Authorised, relayed && !useOnlyOwnerModule, "moduleV1 should only be unauthorised if the upgrade went through"); + assert.equal(isV2Authorised, !relayed || useOnlyOwnerModule, "moduleV2 should only be authorised if the upgrade went through"); + assert.equal(isUpgraderAuthorised, false, "upgrader should not be authorised"); + assert.equal(numModules, 1, "only one module (moduleV2) should be authorised"); + } + + it("should upgrade modules (blockchain tx)", async () => { + await testUpgradeModule({ relayed: false, useOnlyOwnerModule: false }); + }); - it("should upgrade modules (blockchain tx)", async () => { - await testUpgradeModule({ relayed: false, useOnlyOwnerModule: false }) - }); + it("should upgrade modules (not using OnlyOwnerModule, relayed tx)", async () => { + await testUpgradeModule({ relayed: true, useOnlyOwnerModule: false }); + }); - it("should upgrade modules (not using OnlyOwnerModule, relayed tx)", async () => { - await testUpgradeModule({ relayed: true, useOnlyOwnerModule: false }) - }); + it("should upgrade modules (using OnlyOwnerModule, relayed tx)", async () => { + await testUpgradeModule({ relayed: true, useOnlyOwnerModule: true }); + }); + + it("should ignore duplicate modules in upgrader (blockchain tx)", async () => { + // we intentionally try to add moduleV2 twice to check that it will only be authorised once + await testUpgradeModule({ relayed: false, useOnlyOwnerModule: false, modulesToAdd: (v2) => [v2, v2] }); + }); + + it("should not upgrade to 0 module (blockchain tx)", async () => { + // we intentionally try to add 0 module, this should fail + await testUpgradeModule({ relayed: false, useOnlyOwnerModule: true, modulesToAdd: (v2) => [] }); // eslint-disable-line no-unused-vars + }); - it("should upgrade modules (using OnlyOwnerModule, relayed tx)", async () => { - await testUpgradeModule({ relayed: true, useOnlyOwnerModule: true }) - }); + it("should not upgrade to 0 module (relayed tx)", async () => { + // we intentionally try to add 0 module, this should fail + await testUpgradeModule({ relayed: true, useOnlyOwnerModule: true, modulesToAdd: (v2) => [] }); // eslint-disable-line no-unused-vars }); -}) \ No newline at end of file + }); +}); diff --git a/test/test_utils.js b/test/test_utils.js index 76514e7c7..dee6e3061 100644 --- a/test/test_utils.js +++ b/test/test_utils.js @@ -1,43 +1,43 @@ -const utils = require('../utils/utilities.js'); +const utils = require("../utils/utilities.js"); -let modules = [ - { - "address": "0xFFB9239F43673068E3c8D7664382Dd6Fdd6e40cb", - "name": "ApprovedTransfer" - }, - { - "address": "0x25BD64224b7534f7B9e3E16dd10b6dED1A412b90", - "name": "GuardianManager" - }, - { - "address": "0xe6d5631C6272C8e6190352EC35305e5c03C25Fe1", - "name": "LockManager" - }, - { - "address": "0xa7939338f2921230aD801b73bfD7758cB09Bccc5", - "name": "RecoveryManager" - }, - { - "address": "0xE0f4a78BbF24E9624989B9ef10A3B035cc46CE5B", - "name": "TokenExchanger" - }, , - { - "address": "0x624EbBd0f4169E2e11861618045491b6A4e29E77", - "name": "NftTransfer" - }, - { - "address": "0x6a87B61a54E35f46869c6AC9D636823F70733AeD", - "name": "LoanManager" - }, - { - "address": "0xD9c6b78bc89432FFe283Ab38fA95e1Edfc5FD46e", - "name": "InvestManager" - } +const modules = [ + { + address: "0xFFB9239F43673068E3c8D7664382Dd6Fdd6e40cb", + name: "ApprovedTransfer", + }, + { + address: "0x25BD64224b7534f7B9e3E16dd10b6dED1A412b90", + name: "GuardianManager", + }, + { + address: "0xe6d5631C6272C8e6190352EC35305e5c03C25Fe1", + name: "LockManager", + }, + { + address: "0xa7939338f2921230aD801b73bfD7758cB09Bccc5", + name: "RecoveryManager", + }, + { + address: "0xE0f4a78BbF24E9624989B9ef10A3B035cc46CE5B", + name: "TokenExchanger", + }, + { + address: "0x624EbBd0f4169E2e11861618045491b6A4e29E77", + name: "NftTransfer", + }, + { + address: "0x6a87B61a54E35f46869c6AC9D636823F70733AeD", + name: "LoanManager", + }, + { + address: "0xD9c6b78bc89432FFe283Ab38fA95e1Edfc5FD46e", + name: "InvestManager", + }, ]; -describe("Utils", function () { - describe("It should produce the version", () => { - let version = utils.versionFingerprint(modules); - console.log(version); - }); -}); \ No newline at end of file +describe("Utils", () => { + describe("It should produce the version", () => { + const version = utils.versionFingerprint(modules); + console.log(version); + }); +}); diff --git a/test/tokenExchanger.js b/test/tokenExchanger.js index 365792a40..e327786c1 100644 --- a/test/tokenExchanger.js +++ b/test/tokenExchanger.js @@ -1,3 +1,6 @@ +/* global accounts */ +const ethers = require("ethers"); + const Wallet = require("../build/BaseWallet"); const ModuleRegistry = require("../build/ModuleRegistry"); const KyberNetwork = require("../build/KyberNetworkTest"); @@ -5,139 +8,143 @@ const GuardianStorage = require("../build/GuardianStorage"); const TokenExchanger = require("../build/TokenExchanger"); const ERC20 = require("../build/TestERC20"); -const ETH_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; +const { ETH_TOKEN } = require("../utils/utilities.js"); + const DECIMALS = 12; // number of decimal for TOKN contract const KYBER_RATE = 51 * 10 ** 13; // 1 TOKN = 0.00051 ETH const FEE_RATIO = 30; const TestManager = require("../utils/test-manager"); -describe("Test Token Exchanger", function () { - this.timeout(10000); - - const manager = new TestManager(); - - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - let collector = accounts[2].signer; - - let wallet, kyber, exchanger; - - before(async () => { - deployer = manager.newDeployer(); - const registry = await deployer.deploy(ModuleRegistry); - kyber = await deployer.deploy(KyberNetwork); - const guardianStorage = await deployer.deploy(GuardianStorage); - exchanger = await deployer.deploy(TokenExchanger, {}, registry.contractAddress, guardianStorage.contractAddress, kyber.contractAddress, collector.address, FEE_RATIO); +describe("Token Exchanger", function () { + this.timeout(10000); + + const manager = new TestManager(); + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + const collector = accounts[2].signer; + + let deployer; + let wallet; + let kyber; + let exchanger; + let erc20; + + before(async () => { + deployer = manager.newDeployer(); + const registry = await deployer.deploy(ModuleRegistry); + kyber = await deployer.deploy(KyberNetwork); + const guardianStorage = await deployer.deploy(GuardianStorage); + exchanger = await deployer.deploy(TokenExchanger, {}, + registry.contractAddress, guardianStorage.contractAddress, kyber.contractAddress, collector.address, FEE_RATIO); + }); + + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [exchanger.contractAddress]); + erc20 = await deployer.deploy(ERC20, {}, [kyber.contractAddress, wallet.contractAddress], 10000000, DECIMALS); // TOKN contract with 10M tokens (5M TOKN for wallet and 5M TOKN for kyber) + await kyber.addToken(erc20.contractAddress, KYBER_RATE, DECIMALS); + await infrastructure.sendTransaction({ to: wallet.contractAddress, value: 50000000 }); + await infrastructure.sendTransaction({ to: kyber.contractAddress, value: 50000000 }); + }); + + describe("Expected Trade for token ", () => { + it("should get the correct fee", async () => { + const srcAmount = 10000; + const rate = await exchanger.getExpectedTrade(ETH_TOKEN, erc20.contractAddress, srcAmount); + const fee = ethers.utils.bigNumberify(rate[1]).toNumber(); + assert.equal(fee, (srcAmount * FEE_RATIO) / 10000, "rate should be correct"); }); - - beforeEach(async () => { - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [exchanger.contractAddress]); - erc20 = await deployer.deploy(ERC20, {}, [kyber.contractAddress, wallet.contractAddress], 10000000, DECIMALS); // TOKN contract with 10M tokens (5M TOKN for wallet and 5M TOKN for kyber) - await kyber.addToken(erc20.contractAddress, KYBER_RATE, DECIMALS); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: 50000000 }); - await infrastructure.sendTransaction({ to: kyber.contractAddress, value: 50000000 }); + }); + + describe("Trade token ", () => { + it("should receive the correct amount of destination tokens (blockchain tx)", async () => { + const srcAmount = 10000; + const beforeERC20 = await erc20.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + assert.isTrue(beforeETH.gte(srcAmount), "wallet should have enough ether"); + + const tx = await exchanger.from(owner).trade( + wallet.contractAddress, + ETH_TOKEN, + srcAmount, + erc20.contractAddress, + ethers.utils.bigNumberify("10000000000000000000000"), + 0, + { gasLimit: 200000 }, + ); + const txReceipt = await exchanger.verboseWaitForTransaction(tx); + const { destAmount } = txReceipt.events.find((log) => log.event === "TokenExchanged").args; + const afterERC20 = await erc20.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + + assert.isTrue(afterERC20.sub(beforeERC20).eq(destAmount), "should receive the tokens"); + assert.isTrue(beforeETH.sub(afterETH).eq(srcAmount), "should send the ether"); }); - describe("Expected Trade for token ", () => { - it('should get the correct fee', async () => { - let srcAmount = 10000; - let rate = await exchanger.getExpectedTrade(ETH_TOKEN, erc20.contractAddress, srcAmount); - let fee = ethers.utils.bigNumberify(rate[1]).toNumber(); - assert.equal(fee, srcAmount * FEE_RATIO / 10000, "rate should be correct"); - }); + it("should receive the correct amount of destination tokens (relayed tx)", async () => { + const srcAmount = 10000; + const beforeERC20 = await erc20.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + assert.isTrue(beforeETH.gte(srcAmount), "wallet should have enough ether"); + + const txReceipt = await manager.relay(exchanger, "trade", [ + wallet.contractAddress, + ETH_TOKEN, + srcAmount, + erc20.contractAddress, + "10000000000000000000000", + 0, + ], wallet, [owner]); + const { destAmount } = txReceipt.events.find((log) => log.event === "TokenExchanged").args; + const afterERC20 = await erc20.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + + assert.isTrue(afterERC20.sub(beforeERC20).eq(destAmount), "should receive the tokens"); + assert.isTrue(beforeETH.sub(afterETH).eq(srcAmount), "should send the ether"); }); - describe("Trade token ", () => { - it('should receive the correct amount of destination tokens (blockchain tx)', async () => { - const srcAmount = 10000; - const beforeERC20 = await erc20.balanceOf(wallet.contractAddress); - const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); - assert.isTrue(beforeETH.gte(srcAmount), "wallet should have enough ether"); - - const tx = await exchanger.from(owner).trade( - wallet.contractAddress, - ETH_TOKEN, - srcAmount, - erc20.contractAddress, - ethers.utils.bigNumberify('10000000000000000000000'), - 0, - { gasLimit: 200000 } - ); - const txReceipt = await exchanger.verboseWaitForTransaction(tx); - const destAmount = txReceipt.events.find(log => log.event === "TokenExchanged").args["destAmount"]; - const afterERC20 = await erc20.balanceOf(wallet.contractAddress) - const afterETH = await deployer.provider.getBalance(wallet.contractAddress); - - assert.isTrue(afterERC20.sub(beforeERC20).eq(destAmount), "should receive the tokens"); - assert.isTrue(beforeETH.sub(afterETH).eq(srcAmount), "should send the ether"); - }); - - it('should receive the correct amount of destination tokens (relayed tx)', async () => { - const srcAmount = 10000; - const beforeERC20 = await erc20.balanceOf(wallet.contractAddress); - const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); - assert.isTrue(beforeETH.gte(srcAmount), "wallet should have enough ether"); - - const txReceipt = await manager.relay(exchanger, 'trade', [ - wallet.contractAddress, - ETH_TOKEN, - srcAmount, - erc20.contractAddress, - '10000000000000000000000', - 0 - ], wallet, [owner]); - const destAmount = txReceipt.events.find(log => log.event === "TokenExchanged").args["destAmount"]; - const afterERC20 = await erc20.balanceOf(wallet.contractAddress) - const afterETH = await deployer.provider.getBalance(wallet.contractAddress); - - assert.isTrue(afterERC20.sub(beforeERC20).eq(destAmount), "should receive the tokens"); - assert.isTrue(beforeETH.sub(afterETH).eq(srcAmount), "should send the ether"); - }); - - it('should receive the correct amount of destination ether (blockchain tx)', async () => { - const srcAmount = 100; - const beforeERC20 = await erc20.balanceOf(wallet.contractAddress); - const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); - assert.isTrue(beforeERC20.gte(srcAmount), "wallet should have enough ERC20"); - - const tx = await exchanger.from(owner).trade( - wallet.contractAddress, - erc20.contractAddress, - srcAmount, - ETH_TOKEN, - '10000000000000000000000', - 0 - ); - const txReceipt = await exchanger.verboseWaitForTransaction(tx); - const destAmount = txReceipt.events.find(log => log.event === "TokenExchanged").args["destAmount"]; - const afterERC20 = await erc20.balanceOf(wallet.contractAddress) - const afterETH = await deployer.provider.getBalance(wallet.contractAddress); - assert.isTrue(beforeERC20.sub(afterERC20).eq(srcAmount), "should send the tokens"); - assert.isTrue(afterETH.sub(beforeETH).eq(destAmount), "should receive the ether"); - }); - - it('should receive the correct amount of destination ether (relayed tx)', async () => { - const srcAmount = 100; - const beforeERC20 = await erc20.balanceOf(wallet.contractAddress); - const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); - assert.isTrue(beforeERC20.gte(srcAmount), "wallet should have enough ERC20"); - - const txReceipt = await manager.relay(exchanger, 'trade', [ - wallet.contractAddress, - erc20.contractAddress, - srcAmount, - ETH_TOKEN, - '10000000000000000000000', - 0, - ], wallet, [owner]); - const destAmount = txReceipt.events.find(log => log.event === "TokenExchanged").args["destAmount"]; - const afterERC20 = await erc20.balanceOf(wallet.contractAddress) - const afterETH = await deployer.provider.getBalance(wallet.contractAddress); - assert.isTrue(beforeERC20.sub(afterERC20).eq(srcAmount), "should send the tokens"); - assert.isTrue(afterETH.sub(beforeETH).eq(destAmount), "should receive the ether"); - }); + it("should receive the correct amount of destination ether (blockchain tx)", async () => { + const srcAmount = 100; + const beforeERC20 = await erc20.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + assert.isTrue(beforeERC20.gte(srcAmount), "wallet should have enough ERC20"); + + const tx = await exchanger.from(owner).trade( + wallet.contractAddress, + erc20.contractAddress, + srcAmount, + ETH_TOKEN, + "10000000000000000000000", + 0, + ); + const txReceipt = await exchanger.verboseWaitForTransaction(tx); + const { destAmount } = txReceipt.events.find((log) => log.event === "TokenExchanged").args; + const afterERC20 = await erc20.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + assert.isTrue(beforeERC20.sub(afterERC20).eq(srcAmount), "should send the tokens"); + assert.isTrue(afterETH.sub(beforeETH).eq(destAmount), "should receive the ether"); }); -}); \ No newline at end of file + it("should receive the correct amount of destination ether (relayed tx)", async () => { + const srcAmount = 100; + const beforeERC20 = await erc20.balanceOf(wallet.contractAddress); + const beforeETH = await deployer.provider.getBalance(wallet.contractAddress); + assert.isTrue(beforeERC20.gte(srcAmount), "wallet should have enough ERC20"); + + const txReceipt = await manager.relay(exchanger, "trade", [ + wallet.contractAddress, + erc20.contractAddress, + srcAmount, + ETH_TOKEN, + "10000000000000000000000", + 0, + ], wallet, [owner]); + const { destAmount } = txReceipt.events.find((log) => log.event === "TokenExchanged").args; + const afterERC20 = await erc20.balanceOf(wallet.contractAddress); + const afterETH = await deployer.provider.getBalance(wallet.contractAddress); + assert.isTrue(beforeERC20.sub(afterERC20).eq(srcAmount), "should send the tokens"); + assert.isTrue(afterETH.sub(beforeETH).eq(destAmount), "should receive the ether"); + }); + }); +}); diff --git a/test/tokenPriceProvider.js b/test/tokenPriceProvider.js new file mode 100644 index 000000000..0835b55e1 --- /dev/null +++ b/test/tokenPriceProvider.js @@ -0,0 +1,61 @@ +/* global accounts */ + +const ERC20 = require("../build/TestERC20"); +const KyberNetwork = require("../build/KyberNetworkTest"); +const TokenPriceProvider = require("../build/TokenPriceProvider"); + +const TestManager = require("../utils/test-manager"); + +describe("Token Price Provider", () => { + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const priceProviderManager = accounts[1].signer; + + let deployer; + let kyber; + let priceProvider; + let erc20First; + let erc20Second; + + before(async () => { + deployer = manager.newDeployer(); + kyber = await deployer.deploy(KyberNetwork); + }); + + beforeEach(async () => { + priceProvider = await deployer.deploy(TokenPriceProvider, {}, kyber.contractAddress); + await priceProvider.addManager(priceProviderManager.address); + erc20First = await deployer.deploy(ERC20, {}, [infrastructure.address], 10000000, 18); + erc20Second = await deployer.deploy(ERC20, {}, [infrastructure.address], 10000000, 18); + }); + + it("should be able to set the Kyber network contract", async () => { + const kyberNew = await deployer.deploy(KyberNetwork); + await priceProvider.from(priceProviderManager).setKyberNetwork(kyberNew.contractAddress); + const kyberContract = await priceProvider.kyberNetwork(); + assert.equal(kyberNew.contractAddress, kyberContract); + }); + + describe("Reading and writing token prices", () => { + it("should set token price correctly", async () => { + await priceProvider.from(priceProviderManager).setPrice(erc20First.contractAddress, 1800); + const tokenPrice = await priceProvider.cachedPrices(erc20First.contractAddress); + assert.equal(tokenPrice.toNumber(), 1800); + }); + + it("should set multiple token prices correctly", async () => { + await priceProvider.from(priceProviderManager).setPriceForTokenList([erc20First.contractAddress, erc20Second.contractAddress], [1800, 1900]); + const tokenPrice1 = await priceProvider.cachedPrices(erc20First.contractAddress); + assert.equal(tokenPrice1.toNumber(), 1800); + const tokenPrice2 = await priceProvider.cachedPrices(erc20Second.contractAddress); + assert.equal(tokenPrice2.toNumber(), 1900); + }); + + it("should be able to get the ether value of a given amount of tokens", async () => { + await priceProvider.from(priceProviderManager).setPrice(erc20First.contractAddress, 1800); + const etherValue = await priceProvider.getEtherValue("15000000000000000000", erc20First.contractAddress); + assert.isTrue(etherValue.eq(1800 * 15)); + }); + }); +}); diff --git a/test/transferManager.js b/test/transferManager.js index 4a91350ab..acda540bb 100644 --- a/test/transferManager.js +++ b/test/transferManager.js @@ -1,15 +1,19 @@ +/* global accounts, utils */ +const ethers = require("ethers"); + const Wallet = require("../build/BaseWallet"); const Registry = require("../build/ModuleRegistry"); const TransferStorage = require("../build/TransferStorage"); const GuardianStorage = require("../build/GuardianStorage"); const TransferModule = require("../build/TransferManager"); -const OldTransferModule = require("../build/LegacyTokenTransfer"); +const LegacyTransferManager = require("../build/LegacyTransferManager"); const KyberNetwork = require("../build/KyberNetworkTest"); const TokenPriceProvider = require("../build/TokenPriceProvider"); const ERC20 = require("../build/TestERC20"); -const TestContract = require('../build/TestContract'); +const TestContract = require("../build/TestContract"); + +const { ETH_TOKEN } = require("../utils/utilities.js"); -const ETH_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; const ETH_LIMIT = 1000000; const SECURITY_PERIOD = 2; const SECURITY_WINDOW = 2; @@ -21,422 +25,596 @@ const ACTION_TRANSFER = 0; const TestManager = require("../utils/test-manager"); -describe("Test TransferManager", function () { - this.timeout(10000); - - const manager = new TestManager(); - - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - let nonowner = accounts[2].signer; - let recipient = accounts[3].signer; - let spender = accounts[4].signer; - - let kyber, registry, priceProvider, transferStorage, guardianStorage, transferModule, previousTransferModule, wallet; - - before(async () => { - deployer = manager.newDeployer(); - registry = await deployer.deploy(Registry); - kyber = await deployer.deploy(KyberNetwork); - priceProvider = await deployer.deploy(TokenPriceProvider, {}, kyber.contractAddress); - transferStorage = await deployer.deploy(TransferStorage); - guardianStorage = await deployer.deploy(GuardianStorage); - previousTransferModule = await deployer.deploy(OldTransferModule, {}, - registry.contractAddress, - transferStorage.contractAddress, - guardianStorage.contractAddress, - priceProvider.contractAddress, - SECURITY_PERIOD, - SECURITY_WINDOW, - ETH_LIMIT - ); - transferModule = await deployer.deploy(TransferModule, {}, - registry.contractAddress, - transferStorage.contractAddress, - guardianStorage.contractAddress, - priceProvider.contractAddress, - SECURITY_PERIOD, - SECURITY_WINDOW, - ETH_LIMIT, - previousTransferModule.contractAddress - ); - await registry.registerModule(transferModule.contractAddress, ethers.utils.formatBytes32String("TransferModule")); +describe("TransferManager", function () { + this.timeout(10000); + + const manager = new TestManager(); + + const infrastructure = accounts[0].signer; + const owner = accounts[1].signer; + const nonowner = accounts[2].signer; + const recipient = accounts[3].signer; + const spender = accounts[4].signer; + + let deployer; + let kyber; + let registry; + let priceProvider; + let transferStorage; + let guardianStorage; + let transferModule; + let previousTransferModule; + let wallet; + let erc20; + + before(async () => { + deployer = manager.newDeployer(); + registry = await deployer.deploy(Registry); + kyber = await deployer.deploy(KyberNetwork); + priceProvider = await deployer.deploy(TokenPriceProvider, {}, kyber.contractAddress); + transferStorage = await deployer.deploy(TransferStorage); + guardianStorage = await deployer.deploy(GuardianStorage); + + previousTransferModule = await deployer.deploy(LegacyTransferManager, {}, + registry.contractAddress, + transferStorage.contractAddress, + guardianStorage.contractAddress, + priceProvider.contractAddress, + SECURITY_PERIOD, + SECURITY_WINDOW, + ETH_LIMIT, + ethers.constants.AddressZero); + + transferModule = await deployer.deploy(TransferModule, {}, + registry.contractAddress, + transferStorage.contractAddress, + guardianStorage.contractAddress, + priceProvider.contractAddress, + SECURITY_PERIOD, + SECURITY_WINDOW, + ETH_LIMIT, + previousTransferModule.contractAddress); + + await registry.registerModule(transferModule.contractAddress, ethers.utils.formatBytes32String("TransferModule")); + }); + + beforeEach(async () => { + wallet = await deployer.deploy(Wallet); + await wallet.init(owner.address, [transferModule.contractAddress]); + erc20 = await deployer.deploy(ERC20, {}, [infrastructure.address, wallet.contractAddress], 10000000, DECIMALS); // TOKN contract with 10M tokens (5M TOKN for wallet and 5M TOKN for account[0]) + await kyber.addToken(erc20.contractAddress, KYBER_RATE, DECIMALS); + await priceProvider.syncPrice(erc20.contractAddress); + await infrastructure.sendTransaction({ to: wallet.contractAddress, value: ethers.utils.bigNumberify("1000000000000000000") }); + }); + + describe("Initialising the module", () => { + it("when no previous transfer manager is passed, should initialise with default limit", async () => { + const transferModule1 = await deployer.deploy(TransferModule, {}, + registry.contractAddress, + transferStorage.contractAddress, + guardianStorage.contractAddress, + priceProvider.contractAddress, + SECURITY_PERIOD, + SECURITY_WINDOW, + 10, + ethers.constants.AddressZero); + + const existingWallet = await deployer.deploy(Wallet); + await existingWallet.init(owner.address, [transferModule1.contractAddress]); + + const limit = await transferModule1.defaultLimit(); + assert.equal(limit, 10); + }); + }); + + describe("Managing limit and whitelist ", () => { + it("should migrate the limit for existing wallets", async () => { + // create wallet with previous module and funds + const existingWallet = await deployer.deploy(Wallet); + await existingWallet.init(owner.address, [previousTransferModule.contractAddress]); + await infrastructure.sendTransaction({ to: existingWallet.contractAddress, value: ethers.utils.bigNumberify("100000000") }); + // change the limit + await previousTransferModule.from(owner).changeLimit(existingWallet.contractAddress, 4000000); + await manager.increaseTime(3); + let limit = await previousTransferModule.getCurrentLimit(existingWallet.contractAddress); + assert.equal(limit.toNumber(), 4000000, "limit should be changed"); + // transfer some funds + await previousTransferModule.from(owner).transferToken(existingWallet.contractAddress, ETH_TOKEN, recipient.address, 1000000, ZERO_BYTES32); + // add new module + await previousTransferModule.from(owner).addModule(existingWallet.contractAddress, transferModule.contractAddress, { gasLimit: 500000 }); + // check result + limit = await transferModule.getCurrentLimit(existingWallet.contractAddress); + assert.equal(limit.toNumber(), 4000000, "limit should have been migrated"); + const unspent = await transferModule.getDailyUnspent(existingWallet.contractAddress); + assert.equal(unspent[0].toNumber(), 4000000 - 1000000, "unspent should have been migrated"); }); - beforeEach(async () => { - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [transferModule.contractAddress]); - erc20 = await deployer.deploy(ERC20, {}, [infrastructure.address, wallet.contractAddress], 10000000, DECIMALS); // TOKN contract with 10M tokens (5M TOKN for wallet and 5M TOKN for account[0]) - await kyber.addToken(erc20.contractAddress, KYBER_RATE, DECIMALS); - await priceProvider.syncPrice(erc20.contractAddress); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: ethers.utils.bigNumberify('1000000000000000000') }); - }); - - describe("Managing limit and whitelist ", () => { - - it('should migrate the limit for existing wallets', async () => { - // create wallet with previous module and funds - let existingWallet = await deployer.deploy(Wallet); - await existingWallet.init(owner.address, [previousTransferModule.contractAddress]); - await infrastructure.sendTransaction({ to: existingWallet.contractAddress, value: ethers.utils.bigNumberify('100000000') }); - // change the limit - await previousTransferModule.from(owner).changeLimit(existingWallet.contractAddress, 4000000); - await manager.increaseTime(3); - let limit = await previousTransferModule.getCurrentLimit(existingWallet.contractAddress); - assert.equal(limit.toNumber(), 4000000, "limit should be changed"); - // transfer some funds - await previousTransferModule.from(owner).transferToken(existingWallet.contractAddress, ETH_TOKEN, recipient.address, 1000000, ZERO_BYTES32); - // add new module - await previousTransferModule.from(owner).addModule(existingWallet.contractAddress, transferModule.contractAddress, { gasLimit: 500000 }); - // check result - limit = await transferModule.getCurrentLimit(existingWallet.contractAddress); - assert.equal(limit.toNumber(), 4000000, "limit should have been migrated"); - let unspent = await transferModule.getDailyUnspent(existingWallet.contractAddress); - assert.equal(unspent[0].toNumber(), 4000000 - 1000000, 'unspent should have been migrated'); - }); - it('should set the default limit for new wallets', async () => { - let limit = await transferModule.getCurrentLimit(wallet.contractAddress); - assert.equal(limit.toNumber(), ETH_LIMIT, "limit should be ETH_LIMIT"); - }); - it('should only change the limit after the security period', async () => { - await transferModule.from(owner).changeLimit(wallet.contractAddress, 4000000); - let limit = await transferModule.getCurrentLimit(wallet.contractAddress); - assert.equal(limit.toNumber(), ETH_LIMIT, "limit should be ETH_LIMIT"); - await manager.increaseTime(3); - limit = await transferModule.getCurrentLimit(wallet.contractAddress); - assert.equal(limit.toNumber(), 4000000, "limit should be changed"); - }); - it('should change the limit via relayed transaction', async () => { - await manager.relay(transferModule, 'changeLimit', [wallet.contractAddress, 4000000], wallet, [owner]); - await manager.increaseTime(3); - limit = await transferModule.getCurrentLimit(wallet.contractAddress); - assert.equal(limit.toNumber(), 4000000, "limit should be changed"); - }); - it('should add/remove an account to/from the whitelist', async () => { - await transferModule.from(owner).addToWhitelist(wallet.contractAddress, recipient.address); - let isTrusted = await transferModule.isWhitelisted(wallet.contractAddress, recipient.address); - assert.equal(isTrusted, false, "should not be trusted during the security period"); - await manager.increaseTime(3); - isTrusted = await transferModule.isWhitelisted(wallet.contractAddress, recipient.address); - assert.equal(isTrusted, true, "should be trusted after the security period"); - await transferModule.from(owner).removeFromWhitelist(wallet.contractAddress, recipient.address); - isTrusted = await transferModule.isWhitelisted(wallet.contractAddress, recipient.address); - assert.equal(isTrusted, false, "should no removed from whitemist immediately"); - }); + it("should set the default limit for new wallets", async () => { + const limit = await transferModule.getCurrentLimit(wallet.contractAddress); + assert.equal(limit.toNumber(), ETH_LIMIT, "limit should be ETH_LIMIT"); }); - describe("Token transfers", () => { - - async function doDirectTransfer({ token, signer = owner, to, amount, relayed = false }) { - let fundsBefore = (token == ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); - let unspentBefore = await transferModule.getDailyUnspent(wallet.contractAddress); - const params = [wallet.contractAddress, token == ETH_TOKEN ? ETH_TOKEN : token.contractAddress, to.address, amount, ZERO_BYTES32]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(transferModule, 'transferToken', params, wallet, [signer]); - } else { - const tx = await transferModule.from(signer).transferToken(...params); - txReceipt = await transferModule.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "Transfer"), "should have generated Transfer event"); - let fundsAfter = (token == ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); - let unspentAfter = await transferModule.getDailyUnspent(wallet.contractAddress); - assert.equal(fundsAfter.sub(fundsBefore).toNumber(), amount, 'should have transfered amount'); - let ethValue = (token == ETH_TOKEN ? amount : (await priceProvider.getEtherValue(amount, token.contractAddress)).toNumber()); - if (ethValue < ETH_LIMIT) { - assert.equal(unspentBefore[0].sub(unspentAfter[0]).toNumber(), ethValue, 'should have updated the daily spent in ETH'); - } - return txReceipt; - } + it("should only change the limit after the security period", async () => { + await transferModule.from(owner).changeLimit(wallet.contractAddress, 4000000); + let limit = await transferModule.getCurrentLimit(wallet.contractAddress); + assert.equal(limit.toNumber(), ETH_LIMIT, "limit should be ETH_LIMIT"); + await manager.increaseTime(3); + limit = await transferModule.getCurrentLimit(wallet.contractAddress); + assert.equal(limit.toNumber(), 4000000, "limit should be changed"); + }); - async function doPendingTransfer({ token, to, amount, delay, relayed = false }) { - let tokenAddress = token == ETH_TOKEN ? ETH_TOKEN : token.contractAddress; - let fundsBefore = (token == ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); - const params = [wallet.contractAddress, tokenAddress, to.address, amount, ZERO_BYTES32]; - let txReceipt, tx; - if (relayed) { - txReceipt = await manager.relay(transferModule, 'transferToken', params, wallet, [owner]); - } else { - tx = await transferModule.from(owner).transferToken(...params); - txReceipt = await transferModule.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "PendingTransferCreated"), "should have generated PendingTransferCreated event"); - let fundsAfter = (token == ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); - assert.equal(fundsAfter.sub(fundsBefore).toNumber(), 0, 'should not have transfered amount'); - if (delay == 0) { - let id = ethers.utils.solidityKeccak256(['uint8', 'address', 'address', 'uint256', 'bytes', 'uint256'], [ACTION_TRANSFER, tokenAddress, recipient.address, amount, ZERO_BYTES32, txReceipt.blockNumber]); - return id; - } - await manager.increaseTime(delay); - tx = await transferModule.executePendingTransfer(wallet.contractAddress, tokenAddress, recipient.address, amount, ZERO_BYTES32, txReceipt.blockNumber); - txReceipt = await transferModule.verboseWaitForTransaction(tx); - assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "PendingTransferExecuted"), "should have generated PendingTransferExecuted event"); - fundsAfter = (token == ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); - assert.equal(fundsAfter.sub(fundsBefore).toNumber(), amount, 'should have transfered amount'); - } + it("should change the limit via relayed transaction", async () => { + await manager.relay(transferModule, "changeLimit", [wallet.contractAddress, 4000000], wallet, [owner]); + await manager.increaseTime(3); + const limit = await transferModule.getCurrentLimit(wallet.contractAddress); + assert.equal(limit.toNumber(), 4000000, "limit should be changed"); + }); - describe("Small token transfers", () => { - - it('should let the owner send ETH', async () => { - await doDirectTransfer({ token: ETH_TOKEN, to: recipient, amount: 10000 }); - }); - it('should let the owner send ETH (relayed)', async () => { - await doDirectTransfer({ token: ETH_TOKEN, to: recipient, amount: 10000, relayed: true }); - }); - it('should let the owner send ERC20', async () => { - await doDirectTransfer({ token: erc20, to: recipient, amount: 10 }); - }); - it('should let the owner send ERC20 (relayed)', async () => { - await doDirectTransfer({ token: erc20, to: recipient, amount: 10, relayed: true }); - }); - it('should only let the owner send ETH', async () => { - try { - await doDirectTransfer({ token: ETH_TOKEN, signer: nonowner, to: recipient, amount: 10000 }); - } catch (error) { - assert.ok(await manager.isRevertReason(error, "must be an owner")); - } - }); - it('should calculate the daily unspent when the owner send ETH', async () => { - let unspent = await transferModule.getDailyUnspent(wallet.contractAddress); - assert.equal(unspent[0].toNumber(), ETH_LIMIT, 'unspent should be the limit at the beginning of a period'); - await doDirectTransfer({ token: ETH_TOKEN, to: recipient, amount: 10000 }); - unspent = await transferModule.getDailyUnspent(wallet.contractAddress); - assert.equal(unspent[0].toNumber(), ETH_LIMIT - 10000, 'should be the limit minuss the transfer'); - }); - it('should calculate the daily unspent in ETH when the owner send ERC20', async () => { - let unspent = await transferModule.getDailyUnspent(wallet.contractAddress); - assert.equal(unspent[0].toNumber(), ETH_LIMIT, 'unspent should be the limit at the beginning of a period'); - await doDirectTransfer({ token: erc20, to: recipient, amount: 10 }); - unspent = await transferModule.getDailyUnspent(wallet.contractAddress); - let ethValue = await priceProvider.getEtherValue(10, erc20.contractAddress); - assert.equal(unspent[0].toNumber(), ETH_LIMIT - ethValue.toNumber(), 'should be the limit minuss the transfer'); - }); - }); + it("should add/remove an account to/from the whitelist", async () => { + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, recipient.address); + let isTrusted = await transferModule.isWhitelisted(wallet.contractAddress, recipient.address); + assert.equal(isTrusted, false, "should not be trusted during the security period"); + await manager.increaseTime(3); + isTrusted = await transferModule.isWhitelisted(wallet.contractAddress, recipient.address); + assert.equal(isTrusted, true, "should be trusted after the security period"); + await transferModule.from(owner).removeFromWhitelist(wallet.contractAddress, recipient.address); + isTrusted = await transferModule.isWhitelisted(wallet.contractAddress, recipient.address); + assert.equal(isTrusted, false, "should no removed from whitelist immediately"); + }); - describe("Large token transfers ", () => { - - it('should create and execute a pending ETH transfer', async () => { - await doPendingTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 3, relayed: false }); - }); - it('should create and execute a pending ETH transfer (relayed)', async () => { - await doPendingTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 3, relayed: true }); - }); - it('should create and execute a pending ERC20 transfer', async () => { - await doPendingTransfer({ token: erc20, to: recipient, amount: ETH_LIMIT + 10000, delay: 3, relayed: false }); - }); - it('should create and execute a pending ERC20 transfer (relayed)', async () => { - await doPendingTransfer({ token: erc20, to: recipient, amount: ETH_LIMIT + 10000, delay: 3, relayed: true }); - }); - it('should not execute a pending ETH transfer before the confirmation window', async () => { - try { - await doPendingTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 1, relayed: false }); - } catch (error) { - assert.isTrue(await manager.isRevertReason(error, "outside of the execution window"), "should throw "); - } - }); - it('should not execute a pending ETH transfer before the confirmation window (relayed)', async () => { - try { - await doPendingTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 1, relayed: true }); - } catch (error) { - assert.isTrue(await manager.isRevertReason(error, "outside of the execution window"), "should throw "); - } - }); - it('should not execute a pending ETH transfer after the confirmation window', async () => { - try { - await doPendingTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 10, relayed: false }); - } catch (error) { - assert.isTrue(await manager.isRevertReason(error, "outside of the execution window"), "should throw "); - } - }); - it('should not execute a pending ETH transfer after the confirmation window (relayed)', async () => { - try { - await doPendingTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 10, relayed: true }); - } catch (error) { - assert.isTrue(await manager.isRevertReason(error, "outside of the execution window"), "should throw "); - } - }); - it('should cancel a pending ETH transfer', async () => { - let id = await doPendingTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 0 }); - await manager.increaseTime(1); - let tx = await transferModule.from(owner).cancelPendingTransfer(wallet.contractAddress, id); - let txReceipt = await transferModule.verboseWaitForTransaction(tx); - assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "PendingTransferCanceled"), "should have generated PendingTransferCanceled event"); - let executeAfter = await transferModule.getPendingTransfer(wallet.contractAddress, id); - assert.equal(executeAfter, 0, 'should have cancelled the pending transfer'); - }); - it('should cancel a pending ERC20 transfer', async () => { - let id = await doPendingTransfer({ token: erc20, to: recipient, amount: ETH_LIMIT + 10000, delay: 0 }); - await manager.increaseTime(1); - let tx = await transferModule.from(owner).cancelPendingTransfer(wallet.contractAddress, id); - let txReceipt = await transferModule.verboseWaitForTransaction(tx); - assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "PendingTransferCanceled"), "should have generated PendingTransferCanceled event"); - let executeAfter = await transferModule.getPendingTransfer(wallet.contractAddress, id); - assert.equal(executeAfter, 0, 'should have cancelled the pending transfer'); - }); - it('should send immediately ETH to a whitelisted address', async () => { - await transferModule.from(owner).addToWhitelist(wallet.contractAddress, recipient.address); - await manager.increaseTime(3); - await doDirectTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000 }); - }); - it('should send immediately ERC20 to a whitelisted address', async () => { - await transferModule.from(owner).addToWhitelist(wallet.contractAddress, recipient.address); - await manager.increaseTime(3); - await doDirectTransfer({ token: erc20, to: recipient, amount: ETH_LIMIT + 10000 }); - }); - }); + it("should not be able to whitelist a token twice", async () => { + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, recipient.address); + await manager.increaseTime(3); + await assert.revertWith(transferModule.from(owner).addToWhitelist(wallet.contractAddress, recipient.address), "TT: target already whitelisted"); }); - describe("Token Approvals", () => { - - async function doDirectApprove({ signer = owner, amount, relayed = false }) { - let unspentBefore = await transferModule.getDailyUnspent(wallet.contractAddress); - const params = [wallet.contractAddress, erc20.contractAddress, spender.address, amount]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(transferModule, 'approveToken', params, wallet, [signer]); - } else { - const tx = await transferModule.from(signer).approveToken(...params); - txReceipt = await transferModule.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "Approved"), "should have generated Approved event"); - let unspentAfter = await transferModule.getDailyUnspent(wallet.contractAddress); - let amountInEth = await priceProvider.getEtherValue(amount, erc20.contractAddress); - if (amountInEth < ETH_LIMIT) { - assert.equal(unspentBefore[0].sub(unspentAfter[0]).toNumber(), amountInEth, 'should have updated the daily limit'); - } - let approval = await erc20.allowance(wallet.contractAddress, spender.address); - assert.equal(approval.toNumber(), amount, "should have approved the amount"); - return txReceipt; + it("should not be able to remove a non-whitelisted token from the whitelist", async () => { + await assert.revertWith(transferModule.from(owner).removeFromWhitelist(wallet.contractAddress, recipient.address), + "TT: target not whitelisted"); + }); + }); + + describe("Token transfers", () => { + async function doDirectTransfer({ + token, signer = owner, to, amount, relayed = false, + }) { + const fundsBefore = (token === ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); + const unspentBefore = await transferModule.getDailyUnspent(wallet.contractAddress); + const params = [wallet.contractAddress, token === ETH_TOKEN ? ETH_TOKEN : token.contractAddress, to.address, amount, ZERO_BYTES32]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(transferModule, "transferToken", params, wallet, [signer]); + } else { + const tx = await transferModule.from(signer).transferToken(...params); + txReceipt = await transferModule.verboseWaitForTransaction(tx); + } + assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "Transfer"), "should have generated Transfer event"); + const fundsAfter = (token === ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); + const unspentAfter = await transferModule.getDailyUnspent(wallet.contractAddress); + assert.equal(fundsAfter.sub(fundsBefore).toNumber(), amount, "should have transfered amount"); + const ethValue = (token === ETH_TOKEN ? amount : (await priceProvider.getEtherValue(amount, token.contractAddress)).toNumber()); + if (ethValue < ETH_LIMIT) { + assert.equal(unspentBefore[0].sub(unspentAfter[0]).toNumber(), ethValue, "should have updated the daily spent in ETH"); + } + return txReceipt; + } + + async function doPendingTransfer({ + token, to, amount, delay, relayed = false, + }) { + const tokenAddress = token === ETH_TOKEN ? ETH_TOKEN : token.contractAddress; + const fundsBefore = (token === ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); + const params = [wallet.contractAddress, tokenAddress, to.address, amount, ZERO_BYTES32]; + let txReceipt; let + tx; + if (relayed) { + txReceipt = await manager.relay(transferModule, "transferToken", params, wallet, [owner]); + } else { + tx = await transferModule.from(owner).transferToken(...params); + txReceipt = await transferModule.verboseWaitForTransaction(tx); + } + assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "PendingTransferCreated"), "should have generated PendingTransferCreated event"); + let fundsAfter = (token === ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); + assert.equal(fundsAfter.sub(fundsBefore).toNumber(), 0, "should not have transfered amount"); + if (delay === 0) { + const id = ethers.utils.solidityKeccak256(["uint8", "address", "address", "uint256", "bytes", "uint256"], + [ACTION_TRANSFER, tokenAddress, recipient.address, amount, ZERO_BYTES32, txReceipt.blockNumber]); + return id; + } + await manager.increaseTime(delay); + tx = await transferModule.executePendingTransfer(wallet.contractAddress, + tokenAddress, recipient.address, amount, ZERO_BYTES32, txReceipt.blockNumber); + txReceipt = await transferModule.verboseWaitForTransaction(tx); + assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "PendingTransferExecuted"), + "should have generated PendingTransferExecuted event"); + fundsAfter = (token === ETH_TOKEN ? await deployer.provider.getBalance(to.address) : await token.balanceOf(to.address)); + return assert.equal(fundsAfter.sub(fundsBefore).toNumber(), amount, "should have transfered amount"); + } + + describe("Small token transfers", () => { + it("should let the owner send ETH", async () => { + await doDirectTransfer({ token: ETH_TOKEN, to: recipient, amount: 10000 }); + }); + it("should let the owner send ETH (relayed)", async () => { + await doDirectTransfer({ + token: ETH_TOKEN, to: recipient, amount: 10000, relayed: true, + }); + }); + it("should let the owner send ERC20", async () => { + await doDirectTransfer({ token: erc20, to: recipient, amount: 10 }); + }); + it("should let the owner send ERC20 (relayed)", async () => { + await doDirectTransfer({ + token: erc20, to: recipient, amount: 10, relayed: true, + }); + }); + it("should only let the owner send ETH", async () => { + try { + await doDirectTransfer({ + token: ETH_TOKEN, signer: nonowner, to: recipient, amount: 10000, + }); + assert.fail("transfer should have failed"); + } catch (error) { + assert.ok(await manager.isRevertReason(error, "BM: must be an owner for the wallet")); } + }); + it("should calculate the daily unspent when the owner send ETH", async () => { + let unspent = await transferModule.getDailyUnspent(wallet.contractAddress); + assert.equal(unspent[0].toNumber(), ETH_LIMIT, "unspent should be the limit at the beginning of a period"); + await doDirectTransfer({ token: ETH_TOKEN, to: recipient, amount: 10000 }); + unspent = await transferModule.getDailyUnspent(wallet.contractAddress); + assert.equal(unspent[0].toNumber(), ETH_LIMIT - 10000, "should be the limit minuss the transfer"); + }); + it("should calculate the daily unspent in ETH when the owner send ERC20", async () => { + let unspent = await transferModule.getDailyUnspent(wallet.contractAddress); + assert.equal(unspent[0].toNumber(), ETH_LIMIT, "unspent should be the limit at the beginning of a period"); + await doDirectTransfer({ token: erc20, to: recipient, amount: 10 }); + unspent = await transferModule.getDailyUnspent(wallet.contractAddress); + const ethValue = await priceProvider.getEtherValue(10, erc20.contractAddress); + assert.equal(unspent[0].toNumber(), ETH_LIMIT - ethValue.toNumber(), "should be the limit minuss the transfer"); + }); + }); - it('should appprove an ERC20 immediately when the amount is under the limit ', async () => { - await doDirectApprove({ amount: 10 }); + describe("Large token transfers ", () => { + it("should create and execute a pending ETH transfer", async () => { + await doPendingTransfer({ + token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 3, relayed: false, + }); + }); + it("should create and execute a pending ETH transfer (relayed)", async () => { + await doPendingTransfer({ + token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 3, relayed: true, }); - it('should appprove an ERC20 immediately when the amount is under the limit (relayed) ', async () => { - await doDirectApprove({ amount: 10, relayed: true }); + }); + it("should create and execute a pending ERC20 transfer", async () => { + await doPendingTransfer({ + token: erc20, to: recipient, amount: ETH_LIMIT + 10000, delay: 3, relayed: false, }); - it('should not appprove an ERC20 transfer when the signer is not the owner ', async () => { - try { - await doDirectApprove({ signer: nonowner, amount: 10 }); - } catch (error) { - assert.ok(await manager.isRevertReason(error, "must be an owner")); - } + }); + it("should create and execute a pending ERC20 transfer (relayed)", async () => { + await doPendingTransfer({ + token: erc20, to: recipient, amount: ETH_LIMIT + 10000, delay: 3, relayed: true, }); - it('should appprove an ERC20 immediately when the spender is whitelisted ', async () => { - await transferModule.from(owner).addToWhitelist(wallet.contractAddress, spender.address); - await manager.increaseTime(3); - await doDirectApprove({ amount: ETH_LIMIT + 10000 }); + }); + it("should not execute a pending ETH transfer before the confirmation window", async () => { + try { + await doPendingTransfer({ + token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 1, relayed: false, + }); + } catch (error) { + assert.isTrue(await manager.isRevertReason(error, "outside of the execution window"), "should throw "); + } + }); + it("should not execute a pending ETH transfer before the confirmation window (relayed)", async () => { + try { + await doPendingTransfer({ + token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 1, relayed: true, + }); + } catch (error) { + assert.isTrue(await manager.isRevertReason(error, "outside of the execution window"), "should throw "); + } + }); + it("should not execute a pending ETH transfer after the confirmation window", async () => { + try { + await doPendingTransfer({ + token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 10, relayed: false, + }); + } catch (error) { + assert.isTrue(await manager.isRevertReason(error, "outside of the execution window"), "should throw "); + } + }); + it("should not execute a pending ETH transfer after the confirmation window (relayed)", async () => { + try { + await doPendingTransfer({ + token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 10, relayed: true, + }); + } catch (error) { + assert.isTrue(await manager.isRevertReason(error, "outside of the execution window"), "should throw "); + } + }); + it("should cancel a pending ETH transfer", async () => { + const id = await doPendingTransfer({ + token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000, delay: 0, }); - it('should fail to appprove an ERC20 when the amount is above the daily limit ', async () => { - try { - await doDirectApprove({ amount: ETH_LIMIT + 10000 }); - } catch (error) { - assert.ok(await manager.isRevertReason(error, "above daily limit")); - } + await manager.increaseTime(1); + const tx = await transferModule.from(owner).cancelPendingTransfer(wallet.contractAddress, id); + const txReceipt = await transferModule.verboseWaitForTransaction(tx); + assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "PendingTransferCanceled"), + "should have generated PendingTransferCanceled event"); + const executeAfter = await transferModule.getPendingTransfer(wallet.contractAddress, id); + assert.equal(executeAfter, 0, "should have cancelled the pending transfer"); + }); + it("should cancel a pending ERC20 transfer", async () => { + const id = await doPendingTransfer({ + token: erc20, to: recipient, amount: ETH_LIMIT + 10000, delay: 0, }); + await manager.increaseTime(1); + const tx = await transferModule.from(owner).cancelPendingTransfer(wallet.contractAddress, id); + const txReceipt = await transferModule.verboseWaitForTransaction(tx); + assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "PendingTransferCanceled"), + "should have generated PendingTransferCanceled event"); + const executeAfter = await transferModule.getPendingTransfer(wallet.contractAddress, id); + assert.equal(executeAfter, 0, "should have cancelled the pending transfer"); + }); + it("should send immediately ETH to a whitelisted address", async () => { + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, recipient.address); + await manager.increaseTime(3); + await doDirectTransfer({ token: ETH_TOKEN, to: recipient, amount: ETH_LIMIT + 10000 }); + }); + it("should send immediately ERC20 to a whitelisted address", async () => { + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, recipient.address); + await manager.increaseTime(3); + await doDirectTransfer({ token: erc20, to: recipient, amount: ETH_LIMIT + 10000 }); + }); + }); + }); + + describe("Token Approvals", () => { + async function doDirectApprove({ signer = owner, amount, relayed = false }) { + const unspentBefore = await transferModule.getDailyUnspent(wallet.contractAddress); + const params = [wallet.contractAddress, erc20.contractAddress, spender.address, amount]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(transferModule, "approveToken", params, wallet, [signer]); + } else { + const tx = await transferModule.from(signer).approveToken(...params); + txReceipt = await transferModule.verboseWaitForTransaction(tx); + } + assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "Approved"), "should have generated Approved event"); + const unspentAfter = await transferModule.getDailyUnspent(wallet.contractAddress); + + const amountInEth = await priceProvider.getEtherValue(amount, erc20.contractAddress); + if (amountInEth < ETH_LIMIT) { + assert.equal(unspentBefore[0].sub(unspentAfter[0]).toNumber(), amountInEth, "should have updated the daily limit"); + } + const approval = await erc20.allowance(wallet.contractAddress, spender.address); + + assert.equal(approval.toNumber(), amount, "should have approved the amount"); + return txReceipt; + } + + it("should appprove an ERC20 immediately when the amount is under the limit", async () => { + await doDirectApprove({ amount: 10 }); }); - describe("Call contract", () => { + it("should appprove an ERC20 immediately when the amount is under the limit (relayed) ", async () => { + await doDirectApprove({ amount: 10, relayed: true }); + }); - let contract, dataToTransfer; + it("should appprove an ERC20 immediately when the amount is under the existing approved amount", async () => { + await doDirectApprove({ amount: 100 }); + await transferModule.from(owner).approveToken(wallet.contractAddress, erc20.contractAddress, spender.address, 10); + const approval = await erc20.allowance(wallet.contractAddress, spender.address); + assert.equal(approval.toNumber(), 10); + }); - beforeEach(async () => { - contract = await deployer.deploy(TestContract); - assert.equal(await contract.state(), 0, "initial contract state should be 0"); - }); + it("should not appprove an ERC20 transfer when the signer is not the owner ", async () => { + try { + await doDirectApprove({ signer: nonowner, amount: 10 }); + assert.fail("approve should have failed"); + } catch (error) { + assert.ok(await manager.isRevertReason(error, "BM: must be an owner for the wallet")); + } + }); + it("should appprove an ERC20 immediately when the spender is whitelisted ", async () => { + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, spender.address); + await manager.increaseTime(3); + await doDirectApprove({ amount: ETH_LIMIT + 10000 }); + }); + it("should fail to appprove an ERC20 when the amount is above the daily limit ", async () => { + try { + await doDirectApprove({ amount: ETH_LIMIT + 10000 }); + } catch (error) { + assert.ok(await manager.isRevertReason(error, "above daily limit")); + } + }); + }); - async function doCallContract({ signer = owner, value, state, relayed = false }) { - dataToTransfer = contract.contract.interface.functions['setState'].encode([state]); - let unspentBefore = await transferModule.getDailyUnspent(wallet.contractAddress); - const params = [wallet.contractAddress, contract.contractAddress, value, dataToTransfer]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(transferModule, 'callContract', params, wallet, [signer]); - } else { - const tx = await transferModule.from(signer).callContract(...params); - txReceipt = await transferModule.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "CalledContract"), "should have generated CalledContract event"); - let unspentAfter = await transferModule.getDailyUnspent(wallet.contractAddress); - if (value < ETH_LIMIT) { - assert.equal(unspentBefore[0].sub(unspentAfter[0]).toNumber(), value, 'should have updated the daily limit'); - } - assert.equal((await contract.state()).toNumber(), state, 'the state of the external contract should have been changed'); - return txReceipt; - } + describe("Call contract", () => { + let contract; let + dataToTransfer; - it('should call a contract and transfer ETH under the limit', async () => { - await doCallContract({ value: 10, state: 3 }); - }); - it('should call a contract and transfer ETH under the limit (relayed) ', async () => { - await doCallContract({ value: 10, state: 3, relayed: true }); - }); - it('should call a contract and transfer ETH above my limit value when the contract is whitelisted ', async () => { - await transferModule.from(owner).addToWhitelist(wallet.contractAddress, contract.contractAddress); - await manager.increaseTime(3); - await doCallContract({ value: ETH_LIMIT + 10000, state: 6 }); - }); - it('should fail to call a contract and transfer ETH when the amount is above the daily limit ', async () => { - try { - await doCallContract({ value: ETH_LIMIT + 10000, state: 6 }); - } catch (error) { - assert.ok(await manager.isRevertReason(error, "above daily limit")); - } - }); + beforeEach(async () => { + contract = await deployer.deploy(TestContract); + assert.equal(await contract.state(), 0, "initial contract state should be 0"); }); - describe("Approve token and Call contract", () => { + async function doCallContract({ + signer = owner, value, state, relayed = false, + }) { + dataToTransfer = contract.contract.interface.functions.setState.encode([state]); + const unspentBefore = await transferModule.getDailyUnspent(wallet.contractAddress); + const params = [wallet.contractAddress, contract.contractAddress, value, dataToTransfer]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(transferModule, "callContract", params, wallet, [signer]); + } else { + const tx = await transferModule.from(signer).callContract(...params); + txReceipt = await transferModule.verboseWaitForTransaction(tx); + } + assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "CalledContract"), "should have generated CalledContract event"); + const unspentAfter = await transferModule.getDailyUnspent(wallet.contractAddress); + if (value < ETH_LIMIT) { + assert.equal(unspentBefore[0].sub(unspentAfter[0]).toNumber(), value, "should have updated the daily limit"); + } + assert.equal((await contract.state()).toNumber(), state, "the state of the external contract should have been changed"); + return txReceipt; + } + + it("should call a contract and transfer ETH under the limit", async () => { + await doCallContract({ value: 10, state: 3 }); + }); + it("should call a contract and transfer ETH under the limit (relayed) ", async () => { + await doCallContract({ value: 10, state: 3, relayed: true }); + }); - let contract, dataToTransfer; + it("should call a contract and transfer ETH above my limit value when the contract is whitelisted ", async () => { + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, contract.contractAddress); + await manager.increaseTime(3); + await doCallContract({ value: ETH_LIMIT + 10000, state: 6 }); + }); + it("should fail to call a contract and transfer ETH when the amount is above the daily limit ", async () => { + try { + await doCallContract({ value: ETH_LIMIT + 10000, state: 6 }); + } catch (error) { + assert.ok(await manager.isRevertReason(error, "above daily limit")); + } + }); + }); - beforeEach(async () => { - contract = await deployer.deploy(TestContract); - assert.equal(await contract.state(), 0, "initial contract state should be 0"); - }); + describe("Approve token and Call contract", () => { + let contract; - async function doApproveTokenAndCallContract({ signer = owner, amount, state, relayed = false }) { - dataToTransfer = contract.contract.interface.functions['setStateAndPayToken'].encode([state, erc20.contractAddress, amount]); - let unspentBefore = await transferModule.getDailyUnspent(wallet.contractAddress); - const params = [wallet.contractAddress, erc20.contractAddress, contract.contractAddress, amount, dataToTransfer]; - let txReceipt; - if (relayed) { - txReceipt = await manager.relay(transferModule, 'approveTokenAndCallContract', params, wallet, [signer]); - } else { - const tx = await transferModule.from(signer).approveTokenAndCallContract(...params); - txReceipt = await transferModule.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "CalledContract"), "should have generated CalledContract event"); - let unspentAfter = await transferModule.getDailyUnspent(wallet.contractAddress); - let amountInEth = await priceProvider.getEtherValue(amount, erc20.contractAddress); - if (amountInEth < ETH_LIMIT) { - assert.equal(unspentBefore[0].sub(unspentAfter[0]).toNumber(), amountInEth, 'should have updated the daily limit'); - } - assert.equal((await contract.state()).toNumber(), state, 'the state of the external contract should have been changed'); - let erc20Balance = await erc20.balanceOf(contract.contractAddress); - assert.equal(erc20Balance.toNumber(), amount, 'the contract should have transfered the tokens'); - return txReceipt; - } + beforeEach(async () => { + contract = await deployer.deploy(TestContract); + assert.equal(await contract.state(), 0, "initial contract state should be 0"); + }); - it('should approve the token and call the contract when under the limit', async () => { - await doApproveTokenAndCallContract({ amount: 10, state: 3 }); - }); - it('should approve the token and call the contract when under the limit (relayed) ', async () => { - await doApproveTokenAndCallContract({ amount: 10, state: 3, relayed: true }); - }); - it('should approve the token and call the contract when the token is above the limit and the contract is whitelisted ', async () => { - await transferModule.from(owner).addToWhitelist(wallet.contractAddress, contract.contractAddress); - await manager.increaseTime(3); - await doApproveTokenAndCallContract({ amount: ETH_LIMIT + 10000, state: 6 }); - }); - it('should fail to approve the token and call the contract when the token is above the daily limit ', async () => { - try { - await doApproveTokenAndCallContract({ amount: ETH_LIMIT + 10000, state: 6 }); - } catch (error) { - assert.ok(await manager.isRevertReason(error, "above daily limit")); - } - }); + async function doApproveTokenAndCallContract({ + signer = owner, consumer = contract.contractAddress, amount, state, relayed = false, + }) { + const fun = consumer === contract.contractAddress ? "setStateAndPayToken" : "setStateAndPayTokenWithConsumer"; + const dataToTransfer = contract.contract.interface.functions[fun].encode([state, erc20.contractAddress, amount]); + const unspentBefore = await transferModule.getDailyUnspent(wallet.contractAddress); + const params = [wallet.contractAddress, erc20.contractAddress, consumer, amount, contract.contractAddress, dataToTransfer]; + let txReceipt; + if (relayed) { + txReceipt = await manager.relay(transferModule, "approveTokenAndCallContract", params, wallet, [signer]); + } else { + const tx = await transferModule.from(signer).approveTokenAndCallContract(...params); + txReceipt = await transferModule.verboseWaitForTransaction(tx); + } + assert.isTrue(await utils.hasEvent(txReceipt, transferModule, "ApprovedAndCalledContract"), "should have generated CalledContract event"); + const unspentAfter = await transferModule.getDailyUnspent(wallet.contractAddress); + const amountInEth = await priceProvider.getEtherValue(amount, erc20.contractAddress); + + if (amountInEth < ETH_LIMIT) { + assert.equal(unspentBefore[0].sub(unspentAfter[0]).toNumber(), amountInEth, "should have updated the daily limit"); + } + assert.equal((await contract.state()).toNumber(), state, "the state of the external contract should have been changed"); + const erc20Balance = await erc20.balanceOf(contract.contractAddress); + assert.equal(erc20Balance.toNumber(), amount, "the contract should have transfered the tokens"); + return txReceipt; + } + + it("should approve the token and call the contract when under the limit", async () => { + await doApproveTokenAndCallContract({ amount: 10, state: 3 }); + }); + + it("should approve the token and call the contract when under the limit (relayed) ", async () => { + await doApproveTokenAndCallContract({ amount: 10, state: 3, relayed: true }); + }); + + it("should restore existing approved amount after call", async () => { + await transferModule.from(owner).approveToken(wallet.contractAddress, erc20.contractAddress, contract.contractAddress, 10); + const dataToTransfer = contract.contract.interface.functions.setStateAndPayToken.encode([3, erc20.contractAddress, 5]); + await transferModule.from(owner).approveTokenAndCallContract( + wallet.contractAddress, + erc20.contractAddress, + contract.contractAddress, + 5, + contract.contractAddress, + dataToTransfer, + ); + const approval = await erc20.allowance(wallet.contractAddress, contract.contractAddress); + + // Initial approval of 10 is restored, after approving and spending 5 + assert.equal(approval.toNumber(), 10); + + const erc20Balance = await erc20.balanceOf(contract.contractAddress); + assert.equal(erc20Balance.toNumber(), 5, "the contract should have transfered the tokens"); + }); + + it("should be able to spend less than approved in call", async () => { + await transferModule.from(owner).approveToken(wallet.contractAddress, erc20.contractAddress, contract.contractAddress, 10); + const dataToTransfer = contract.contract.interface.functions.setStateAndPayToken.encode([3, erc20.contractAddress, 4]); + await transferModule.from(owner).approveTokenAndCallContract( + wallet.contractAddress, + erc20.contractAddress, + contract.contractAddress, + 5, + contract.contractAddress, + dataToTransfer, + ); + const approval = await erc20.allowance(wallet.contractAddress, contract.contractAddress); + // Initial approval of 10 is restored, after approving and spending 4 + assert.equal(approval.toNumber(), 10); + + const erc20Balance = await erc20.balanceOf(contract.contractAddress); + assert.equal(erc20Balance.toNumber(), 4, "the contract should have transfered the tokens"); + }); + + it("should not be able to spend more than approved in call", async () => { + await transferModule.from(owner).approveToken(wallet.contractAddress, erc20.contractAddress, contract.contractAddress, 10); + const dataToTransfer = contract.contract.interface.functions.setStateAndPayToken.encode([3, erc20.contractAddress, 6]); + await assert.revertWith(transferModule.from(owner).approveTokenAndCallContract( + wallet.contractAddress, + erc20.contractAddress, + contract.contractAddress, + 5, + contract.contractAddress, + dataToTransfer, + ), "BT: insufficient amount for call"); + }); + + it("should approve the token and call the contract when the token is above the limit and the contract is whitelisted ", async () => { + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, contract.contractAddress); + await manager.increaseTime(3); + await doApproveTokenAndCallContract({ amount: ETH_LIMIT + 10000, state: 6 }); + }); + + it("should approve the token and call the contract when contract to call is different to token spender", async () => { + const consumer = await contract.tokenConsumer(); + await doApproveTokenAndCallContract({ amount: 10, state: 3, consumer }); }); + it("should approve token and call contract when contract != spender, amount > limit and spender is whitelisted ", async () => { + const consumer = await contract.tokenConsumer(); + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, consumer); + await manager.increaseTime(3); + await doApproveTokenAndCallContract({ amount: ETH_LIMIT + 10000, state: 6, consumer }); + }); + it("should fail to approve token and call contract when contract != spender, amount > limit and contract is whitelisted ", async () => { + const amount = ETH_LIMIT + 10000; + const consumer = await contract.tokenConsumer(); + await transferModule.from(owner).addToWhitelist(wallet.contractAddress, contract.contractAddress); + await manager.increaseTime(3); + const dataToTransfer = contract.contract.interface.functions.setStateAndPayTokenWithConsumer.encode([6, erc20.contractAddress, amount]); + await assert.revertWith( + transferModule.from(owner).approveTokenAndCallContract( + wallet.contractAddress, erc20.contractAddress, consumer, amount, contract.contractAddress, dataToTransfer, + ), + "TM: Approve above daily limit", + ); + }); -}); \ No newline at end of file + it("should fail to approve the token and call the contract when the token is above the daily limit ", async () => { + try { + await doApproveTokenAndCallContract({ amount: ETH_LIMIT + 10000, state: 6 }); + } catch (error) { + assert.ok(await manager.isRevertReason(error, "above daily limit")); + } + }); + }); +}); diff --git a/test/uniswapManager_invest.js b/test/uniswapManager_invest.js deleted file mode 100644 index 594154f9c..000000000 --- a/test/uniswapManager_invest.js +++ /dev/null @@ -1,197 +0,0 @@ -const etherlime = require('etherlime-lib'); -const Wallet = require("../build/BaseWallet"); -const ModuleRegistry = require("../build/ModuleRegistry"); -const UniswapFactory = require("../contracts/test/uniswap/UniswapFactory"); -const UniswapExchange = require("../contracts/test/uniswap/UniswapExchange"); -const UniswapManager = require("../build/UniswapManager"); -const GuardianStorage = require("../build/GuardianStorage"); -const ERC20 = require("../build/TestERC20"); -const TestManager = require("../utils/test-manager"); -const { parseEther, bigNumberify } = require('ethers').utils; - -describe("Invest Manager with Uniswap", function () { - this.timeout(1000000); - - const manager = new TestManager(); - - let infrastructure = accounts[0].signer; - let owner = accounts[1].signer; - - let wallet, uniswapFactory, investManager, token; - - before(async () => { - deployer = manager.newDeployer(); - // deploy Uniswap contracts - uniswapFactory = await deployer.deploy(UniswapFactory); - const uniswapTemplateExchange = await deployer.deploy(UniswapExchange); - await uniswapFactory.initializeFactory(uniswapTemplateExchange.contractAddress); - // deploy Argent contracts - const registry = await deployer.deploy(ModuleRegistry); - const guardianStorage = await deployer.deploy(GuardianStorage); - investManager = await deployer.deploy( - UniswapManager, - {}, - registry.contractAddress, - guardianStorage.contractAddress, - uniswapFactory.contractAddress); - }); - - beforeEach(async () => { - wallet = await deployer.deploy(Wallet); - await wallet.init(owner.address, [investManager.contractAddress]); - token = await deployer.deploy(ERC20, {}, [infrastructure.address], 10000, 18); - }); - - async function testCreatePool(initialEthLiquidity, initialTokenPrice) { - let initialTokenAmount = initialEthLiquidity.mul(initialTokenPrice); - await uniswapFactory.from(infrastructure).createExchange(token.contractAddress); - const exchangeAddress = await uniswapFactory.getExchange(token.contractAddress); - const liquidityPool = await etherlime.ContractAt(UniswapExchange, exchangeAddress); - await token.from(infrastructure).approve(liquidityPool.contractAddress, initialTokenAmount); - const currentBlock = await manager.getCurrentBlock(); - const timestamp = await manager.getTimestamp(currentBlock); - await liquidityPool.from(infrastructure).addLiquidity(1, initialTokenAmount, timestamp + 300, { value: initialEthLiquidity, gasLimit: 150000 }); - const totalSupply = await liquidityPool.totalSupply(); - const shares = await liquidityPool.balanceOf(infrastructure.address); - assert.isTrue(totalSupply.eq(initialEthLiquidity)); - assert.isTrue(shares.eq(totalSupply)); - return liquidityPool; - }; - - async function addInvestment(ethLiquidity, tokenPrice, amount, relay = false) { - - let ethBefore = await deployer.provider.getBalance(wallet.contractAddress); - let tokenBefore = await token.balanceOf(wallet.contractAddress); - let pool = await testCreatePool(ethLiquidity, tokenPrice); - - let txReceipt; - const params = [wallet.contractAddress, token.contractAddress, amount, 0]; - if (relay) { - txReceipt = await manager.relay(investManager, 'addInvestment', params, wallet, [owner]); - } - else { - const tx = await investManager.from(owner).addInvestment(...params, { gasLimit: 300000 }); - txReceipt = await investManager.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, investManager, "InvestmentAdded"), "should have generated InvestmentAdded event"); - - let shares = await pool.balanceOf(wallet.contractAddress); - let ethAfter = await deployer.provider.getBalance(wallet.contractAddress); - let tokenAfter = await token.balanceOf(wallet.contractAddress); - - assert.isTrue(shares.gt(0), "should have received shares"); - assert.isTrue(tokenAfter - tokenBefore.sub(amount) <= tokenPrice, "Should have invested the correct amount of tokens"); - assert.isTrue(ethAfter - ethBefore.sub(amount.div(tokenPrice)) <= tokenPrice, "Should have taken the correct amount of ETH"); - - return [pool, shares]; - }; - - async function removeInvestment(investedAmount, fraction, relay = false) { - - let ethLiquidity = parseEther('0.1'); - let tokenPrice = 3; - - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: investedAmount }); - await token.from(infrastructure).transfer(wallet.contractAddress, investedAmount); - let result = await addInvestment(ethLiquidity, tokenPrice, investedAmount, 0); - let sharesBefore = result[1]; - - let txReceipt; - const params = [wallet.contractAddress, token.contractAddress, fraction]; - if (relay) { - txReceipt = await manager.relay(investManager, 'removeInvestment', params, wallet, [owner]); - } - else { - const tx = await investManager.from(owner).removeInvestment(...params, { gasLimit: 300000 }); - txReceipt = await investManager.verboseWaitForTransaction(tx); - } - assert.isTrue(await utils.hasEvent(txReceipt, investManager, "InvestmentRemoved"), "should have generated InvestmentRemoved event"); - - let sharesAfter = await result[0].balanceOf(wallet.contractAddress); - assert.isTrue(sharesAfter.sub(sharesBefore.mul(10000 - fraction).div(10000)) <= 1, "should have sold the correct amount of shares"); - } - - describe("Basic framework", () => { - it('should create a liquidity pool with the correct supply', async () => { - await testCreatePool(bigNumberify('10000000000000000'), 2); - }); - }); - - describe("Add investment", () => { - - function testInvestWithRandomParameters(ethLiquidity, tokenPrice, amount, relay) { - it(`should successfully invest ${amount} tokens with ETH liquidity ${ethLiquidity} and token/ETH price of ${tokenPrice} (${relay ? "relay" : "blockchain"} tx)`, async () => { - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther('1') }); - await token.from(infrastructure).transfer(wallet.contractAddress, amount); - await addInvestment(ethLiquidity, tokenPrice, amount, relay); - }) - } - - for (i = 0; i < 10; i++) { - let ethLiquidity = parseEther('0.1').add(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1); - let tokenPrice = Math.floor(Math.random() * 100) + 1; - let amount = parseEther('0.001').add(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1); - testInvestWithRandomParameters(ethLiquidity, tokenPrice, amount, false); - testInvestWithRandomParameters(ethLiquidity, tokenPrice, amount, true); - } - - it('should successfully invest when the user has not enough tokens but enough ETH (blockchain tx)', async () => { - let tokens = parseEther('0.001'); - await token.from(infrastructure).transfer(wallet.contractAddress, tokens); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther('1') }); - await addInvestment(parseEther('1'), 2, tokens.div(2), 0, false); - }); - - it('should successfully invest when the user has not enough tokens but enough ETH (relay tx)', async () => { - let tokens = parseEther('0.001'); - await token.from(infrastructure).transfer(wallet.contractAddress, tokens); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther('1') }); - await addInvestment(parseEther('1'), 2, tokens.div(2), 0, true); - }); - - it('should fail to invest when the user has enough tokens but not enough ETH (blockchain tx)', async () => { - let tokens = parseEther('0.001'); - await token.from(infrastructure).transfer(wallet.contractAddress, tokens); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther('0.0000001') }); - await assert.revert(addInvestment(parseEther('1'), 2, tokens, 0, false), "should revert"); - }); - - it('should fail to invest when the user has enough tokens but not enough ETH (relay tx)', async () => { - let tokens = parseEther('0.001'); - await token.from(infrastructure).transfer(wallet.contractAddress, tokens); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther('0.0000001') }); - await assert.revert(addInvestment(parseEther('1'), 2, tokens, 0, true), "should revert"); - }); - - it('should fail to invest when the user has not enough tokens and not enough ETH (blockchain tx)', async () => { - let tokens = parseEther('0.001'); - await token.from(infrastructure).transfer(wallet.contractAddress, tokens); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther('0.0000001') }); - await assert.revert(addInvestment(parseEther('1'), 2, tokens.div(2), 0, false), "should revert"); - }); - - it('should fail to invest when the user has not enough tokens and not enough ETH (relay tx)', async () => { - let tokens = parseEther('0.001'); - await token.from(infrastructure).transfer(wallet.contractAddress, tokens); - await infrastructure.sendTransaction({ to: wallet.contractAddress, value: parseEther('0.0000001') }); - await assert.revert(addInvestment(parseEther('1'), 2, tokens.div(2), 0, true), "should revert"); - }); - }); - - describe("Remove investment", () => { - - function testRemoveInvestment(investedAmount, fraction, relay) { - it(`should remove ${fraction / 100} % of an investment of ${investedAmount} tokens (${relay ? "relay" : "blockchain"} tx)`, async () => { - await removeInvestment(investedAmount, fraction); - }); - } - - for (i = 0; i < 10; i++) { - let investedAmount = parseEther('0.0001').mul(Math.floor(Math.random() * 1000) + 1); - let fraction = (i + 1) * 1000; - testRemoveInvestment(investedAmount, fraction, false); - testRemoveInvestment(investedAmount, fraction, true); - } - }); - -}); \ No newline at end of file diff --git a/utils/abi-uploader.js b/utils/abi-uploader.js index 59ba23d69..f87a29da4 100644 --- a/utils/abi-uploader.js +++ b/utils/abi-uploader.js @@ -1,54 +1,54 @@ -"use strict" +// eslint-disable-next-line max-classes-per-file +const AWS = require("aws-sdk"); -var AWS = require('aws-sdk'); - -var s3 = new AWS.S3(); +const s3 = new AWS.S3(); const S3_BUCKET_FOLDER_ABI = "ABI"; const S3_BUCKET_FOLDER_BUILD = "build"; class ABIUploaderS3 { - constructor(bucket) { - this._bucket = bucket; - } - - async upload(contractWrapper, folder) { - const contractName = contractWrapper._contract.contractName; - const filename = contractWrapper.contractAddress; - - console.log(`Uploading ${contractName} ABI to AWS...`) - - await s3.putObject({ - Body: JSON.stringify(contractWrapper._contract.abi), - Bucket: this._bucket, - Key: `${S3_BUCKET_FOLDER_ABI}/${folder}/${contractName}/${filename}.json` - }).promise(); - - await s3.putObject({ - Body: JSON.stringify(contractWrapper._contract.abi), - Bucket: this._bucket, - Key: `${S3_BUCKET_FOLDER_ABI}/ALL/${filename}.json` - }).promise(); - - await s3.putObject({ - Body: JSON.stringify(contractWrapper._contract), - Bucket: this._bucket, - Key: `${S3_BUCKET_FOLDER_BUILD}/${folder}/${contractName}/${filename}.json` - }).promise(); - - await s3.putObject({ - Body: JSON.stringify(contractWrapper._contract), - Bucket: this._bucket, - Key: `${S3_BUCKET_FOLDER_BUILD}/ALL/${filename}.json` - }).promise(); - } + constructor(bucket) { + this._bucket = bucket; + } + + async upload(contractWrapper, folder) { + const { contractName } = contractWrapper._contract; + const filename = contractWrapper.contractAddress; + + console.log(`Uploading ${contractName} ABI to AWS...`); + + await s3.putObject({ + Body: JSON.stringify(contractWrapper._contract.abi), + Bucket: this._bucket, + Key: `${S3_BUCKET_FOLDER_ABI}/${folder}/${contractName}/${filename}.json`, + }).promise(); + + await s3.putObject({ + Body: JSON.stringify(contractWrapper._contract.abi), + Bucket: this._bucket, + Key: `${S3_BUCKET_FOLDER_ABI}/ALL/${filename}.json`, + }).promise(); + + await s3.putObject({ + Body: JSON.stringify(contractWrapper._contract), + Bucket: this._bucket, + Key: `${S3_BUCKET_FOLDER_BUILD}/${folder}/${contractName}/${filename}.json`, + }).promise(); + + await s3.putObject({ + Body: JSON.stringify(contractWrapper._contract), + Bucket: this._bucket, + Key: `${S3_BUCKET_FOLDER_BUILD}/ALL/${filename}.json`, + }).promise(); + } } class ABIUploaderNone { - async upload(contract, folder) { } + // eslint-disable-next-line class-methods-use-this, no-unused-vars, no-empty-function + async upload(contract, folder) { } } module.exports = { - S3: ABIUploaderS3, - None: ABIUploaderNone -} + S3: ABIUploaderS3, + None: ABIUploaderNone, +}; diff --git a/utils/config-schema.json b/utils/config-schema.json index a15f43b40..7016e740f 100644 --- a/utils/config-schema.json +++ b/utils/config-schema.json @@ -126,6 +126,15 @@ }, "ModuleRegistry": { "$ref": "#/definitions/ethaddress" + }, + "BaseWallet": { + "$ref": "#/definitions/ethaddress" + }, + "CompoundRegistry": { + "$ref": "#/definitions/ethaddress" + }, + "MakerRegistry": { + "$ref": "#/definitions/ethaddress" } }, "required": [ @@ -134,9 +143,12 @@ "ENSResolver", "ENSManager", "TokenPriceProvider", - "ModuleRegistry" + "ModuleRegistry", + "BaseWallet", + "CompoundRegistry", + "MakerRegistry" ], - "additionalProperties": true + "additionalProperties": false }, "modules": { "type": "object", @@ -147,6 +159,9 @@ "GuardianManager": { "$ref": "#/definitions/ethaddress" }, + "GuardianStorage": { + "$ref": "#/definitions/ethaddress" + }, "LockManager": { "$ref": "#/definitions/ethaddress" }, @@ -156,21 +171,43 @@ "ApprovedTransfer": { "$ref": "#/definitions/ethaddress" }, - "TokenTransfer": { + "TransferManager": { "$ref": "#/definitions/ethaddress" }, - "DappManager": { + "TransferStorage": { "$ref": "#/definitions/ethaddress" }, - "TransferManager": { + "TokenExchanger": { "$ref": "#/definitions/ethaddress" }, - "TokenExchanger": { + "NftTransfer": { + "$ref": "#/definitions/ethaddress" + }, + "CompoundManager": { + "$ref": "#/definitions/ethaddress" + }, + "MakerManager": { + "$ref": "#/definitions/ethaddress" + }, + "MakerV2Manager": { "$ref": "#/definitions/ethaddress" } }, - "required": [], - "additionalProperties": true + "required": [ + "GuardianManager", + "GuardianStorage", + "LockManager", + "RecoveryManager", + "ApprovedTransfer", + "TransferManager", + "TransferStorage", + "TokenExchanger", + "NftTransfer", + "CompoundManager", + "MakerManager", + "MakerV2Manager" + ], + "additionalProperties": false }, "backend": { "type": "object", diff --git a/utils/config/ganache.json b/utils/config/ganache.json index 5be04866b..a88074079 100644 --- a/utils/config/ganache.json +++ b/utils/config/ganache.json @@ -1 +1 @@ -{"ENS":{"deployOwnRegistry":true,"ensRegistry":"0x9eD274314f0fB37837346C425D3cF28d89ca9599","domain":"argent.xyz"},"backend":{"accounts":["0xD9995BAE12FEe327256FFec1e3184d492bD94C31"]},"multisig":{"owners":["0xD9995BAE12FEe327256FFec1e3184d492bD94C31"],"threshold":1,"autosign":true},"settings":{"deployer":{"type":"ganache"},"lockPeriod":480,"recoveryPeriod":480,"securityPeriod":240,"securityWindow":240,"feeRatio":15,"defaultLimit":"1000000000000000000"},"Kyber":{"deployOwn":true,"contract":"0xa6DD34f3CeA10D1F78c0b1F8C13eFbAbE5DF9708"},"CryptoKitties":{"contract":"0x0000000000000000000000000000000000000000"},"defi":{"maker":{"deployOwn":true,"tub":"0x0000000000000000000000000000000000000000","migration":"0xa00f6A3a3D00979D7B7E23D7C7dF6CC7E255Ad88","pot":"0x0000000000000000000000000000000000000000"},"uniswap":{"factory":"0x0000000000000000000000000000000000000000"},"compound":{"comptroller":"0x0000000000000000000000000000000000000000","markets":{"0x0000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000"}}},"contracts":{"MultiSigWallet":"0x70362dc2A6fC72c695EAb15A0031951F770d1239","WalletFactory":"0x2CF059D2eA2e507cB38E8e676e3Ca37343631A57","ENSResolver":"0x67044E3c8D2E1658419e4E177B4D3F64d442D6B1","ENSManager":"0x5049DF4315ECb9CC30AbE5DAfe4929EA4D988f81","TokenPriceProvider":"0x933cF2Aecc1c17CA1b3bd51557B253bB4bd02A12","ModuleRegistry":"0x6E11978D2560027526f8E0545823E537c196370d","DappRegistry":"0xDbb27d0d4f633a9a0907B7e337D2e807D0eEf8C2","BaseWallet":"0x1bBcb45210F9b88912627B790fE6b617bC8f869A","CompoundRegistry":"0x7d6FAe26B090953A46098d7513b559B0a339Ee4d"},"modules":{"GuardianStorage":"0x79B960d71977082d1e273e9190a5EF9783fFa24d","TransferStorage":"0x776A4C0925C9F67ef4395238B22dc875fC88Dc0E","DappStorage":"0x3f906DDA5fa9DA5259d2d865157f5001Ce626e31","GuardianManager":"0x16DBb3F310960e13F2b80c3cc8166cF6D9FeDBf8","LockManager":"0x963D5B228d5Fa7DE3d69F636704Cf5070d41A760","RecoveryManager":"0x38376A367fc2Ec806155dbDFf6c0A53E3a410102","ApprovedTransfer":"0x994cB812bE47CEA32542954A4E134Ba2C3a1DC54","TokenTransfer":"0x101b60626A8073271fE2eFE59FB8fD74c108c2eC","DappManager":"0xeE20db41be0CB3D09C5557dDD99d95A4fFf15076","TokenExchanger":"0xa0A089070C2815BeF51C6c794CeeD837ea8F48D8","NftTransfer":"0x09628ee377BC0D20F1D7917bC22074fB9c7385E7","MakerManager":"0x2A45A5064ad6F9b358D043A464494042dBaA2C87","TransferManager":"0xA8Ea2087b79a3Df13506E705E5344676A9a005c7","CompoundManager":"0xE9d45870c6C3446A87Ac4091c110E5bbed2b3468","UniswapManager":"0xEb4152Aa9a9730B89Bd61CAE8f960FF99FD0f86f","MakerV2Manager":"0xE50a98Af12B493df3fD762d30889cbAbb01aB6B1"},"gitCommit":"61150566b93652ba70f65820846ddf50ea2ec4fb"} \ No newline at end of file +{"ENS":{"deployOwnRegistry":true,"ensRegistry":"0x274C3fB4B9A3f5836612C169ADEE957be8E1CA49","domain":"argent.xyz"},"backend":{"accounts":["0xD9995BAE12FEe327256FFec1e3184d492bD94C31"]},"multisig":{"owners":["0xD9995BAE12FEe327256FFec1e3184d492bD94C31"],"threshold":1,"autosign":true},"settings":{"deployer":{"type":"ganache"},"lockPeriod":480,"recoveryPeriod":480,"securityPeriod":240,"securityWindow":240,"feeRatio":15,"defaultLimit":"1000000000000000000"},"Kyber":{"deployOwn":true,"contract":"0xCE7A2788C4f14A3fe43c9d66eAe5C5b8ffd40240"},"CryptoKitties":{"contract":"0x0000000000000000000000000000000000000000"},"defi":{"maker":{"deployOwn":true,"tub":"0x0000000000000000000000000000000000000000","pot":"0x0000000000000000000000000000000000000000","jug":"0x0000000000000000000000000000000000000000","migration":"0xD2877b6409313680d2f7186f11CB584961135A62"},"uniswap":{"deployOwn":true,"factory":"0xB2533a6e92F0d638302aB6808FE3Ba6023cFEE08"},"compound":{"comptroller":"0x0000000000000000000000000000000000000000","markets":{"0x0000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000"}}},"contracts":{"MultiSigWallet":"0x118b5e4FD0aF29800CFeEC3B2E037fA7172a5A1C","WalletFactory":"0xe22c9dE7D0c258Fe64BcA9B19AF6ad9557C0a405","ENSResolver":"0xEf80C55AF72e8df28daed66B71137C7532B5c8Ea","ENSManager":"0x45a2Fe7F67a58fAEcc6109aB99304d7009B4D7F5","TokenPriceProvider":"0xdDD61b72d8019FEA5459ebD47d6bAc243e514fA2","ModuleRegistry":"0xf4DF8fe8c2b3882E9f5cC88008eE98e225c9753C","BaseWallet":"0x7A0E7cCae904066DD64968aE5fC857413D293e9d","CompoundRegistry":"0xeFf03c08398f4E744b365507D95355305B82ceab","MakerRegistry":"0x355d26E5f04255F60E910F1aA1251DE5D10996E8"},"modules":{"GuardianStorage":"0x5945751727ae5923AA39dC8Bd6a658925C53d300","TransferStorage":"0xebaf86d5dDdb586E19065e2D29dD5Ad9a31a8F31","GuardianManager":"0x2202723Bb717f362f64b6e41086A2cf52d9Ee28f","LockManager":"0xc1DA53758396f84198e78f6318904C2E666fC4Ea","RecoveryManager":"0xD6aC219C2b10a85D565ef8911e075464B5D53807","ApprovedTransfer":"0x11d3467345Ed6Ab494D131d42A45e469b2F7eB51","TokenExchanger":"0xA64fEeD186483380ad10496C4C9fADd89494633C","NftTransfer":"0x85D24B941A22D5DA687c607769173F01Abc61A56","MakerManager":"0x2718cAce241213B18F67C6d66B245EE77DB0Ce2a","TransferManager":"0xB58188A994fD291e2F97644b7FDb87372D27b2fD","CompoundManager":"0x1362D309a42165bC6dC00Be56D32625dF2C2c517","MakerV2Manager":"0x43f082E392cF13492a2660f932eFe22504Ab7517"},"gitCommit":"301c40ae9091b66f4faa30bbc5d20ae735febd3f"} \ No newline at end of file diff --git a/utils/config/kovan-fork.json b/utils/config/kovan-fork.json new file mode 100644 index 000000000..959b6a0f7 --- /dev/null +++ b/utils/config/kovan-fork.json @@ -0,0 +1,87 @@ +{ + "ENS": { + "deployOwnRegistry": true, + "ensRegistry": "0x63347C9F2863dcBb723cd8cF1b51b2E87dbD917c", + "domain": "argent.xyz" + }, + "backend": { + "accounts": [] + }, + "multisig": { + "owners": [], + "threshold": 1, + "autosign": true + }, + "settings": { + "deployer": { + "type": "ganache" + }, + "privateKey": { + "type": "plain", + "options": { + "envvar": "KOVAN_PRIV_KEY" + } + }, + "lockPeriod": 480, + "recoveryPeriod": 480, + "securityPeriod": 240, + "securityWindow": 240, + "feeRatio": 15, + "defaultLimit": "1000000000000000000" + }, + "Kyber": { + "deployOwn": true, + "contract": "0x7F6eB19B148058B71D8BC9D1723E55e4d2da40a6" + }, + "CryptoKitties": { + "contract": "0x0000000000000000000000000000000000000000" + }, + "defi": { + "maker": { + "tub": "0xa71937147b55deb8a530c7229c442fd3f31b7db2", + "migration": "0x411b2faa662c8e3e5cf8f01dfdae0aee482ca7b0", + "pot": "0xea190dbdc7adf265260ec4da6e9675fd4f5a78bb", + "jug": "0xcbb7718c9f39d05aeede1c472ca8bf804b2f1ead", + "batJoin": "0x2a4c485b1b8dfb46accfbecaf75b6188a59dbd0a", + "batFaucet": "0x57aAeAE905376a4B1899bA81364b4cE2519CBfB3", + "mkrFaucet": "0xCbd3e165cE589657feFd2D38Ad6B6596A1f734F6" + }, + "uniswap": { + "factory": "0x944365B2980cB75D5C540b44D9e3e63CF0fb2111" + }, + "compound": { + "comptroller": "0x142d11cb90a2b40f7d0c55ed1804988dfc316fae", + "markets": { + "0xc4375b7de8af5a38a93548eb8453a498222c4ff2": "0x0a1e4d0b5c71b955c0a5993023fc48ba6e380496", + "0xd0a1e359811322d97991e03f863a0c30c2cf029c": "0xd83f707f003a1f0b1535028ab356fce2667ab855" + } + } + }, + "contracts": { + "MultiSigWallet": "0xEC5F4731e40231ae57DfB0a4C644eD55F90aFeb3", + "WalletFactory": "0xe18806A33C74cBE5E14b90109e33Ad8512BB1A5a", + "ENSResolver": "0x17f8c87AabD5b9dEBDA5D942b852E6F7174232D0", + "ENSManager": "0x9812e6aa9Ac3500f8Dd4523058d9E48EE4B7A069", + "TokenPriceProvider": "0xb2760fB88EAC409A173ABCC6e9FB5ACc8a8D46e9", + "ModuleRegistry": "0xB9d7cB1d1b9440526777B39629c7035c33D8C64E", + "BaseWallet": "0x88ba95809C47bbA1cf9A657fcd3C81a78d608aA5", + "CompoundRegistry": "0xB3a945f078B44b98f93145f7a820e95a0a98e386", + "MakerRegistry": "0xe9B43D909a17cE24C7d43624E7553376Fa971041" + }, + "modules": { + "GuardianStorage": "0xD6E5cD0666A2607CfaBddB9aD0E30131e5359515", + "TransferStorage": "0x95B7d87586Fd218F56FDe21b93E3bc2eE4e9B406", + "GuardianManager": "0x96b8b73D55C713CEBfb1eee3D5F476766F679669", + "LockManager": "0x9b7fC8EF0a625451FA0F21422d2Dd4164f6cf82E", + "RecoveryManager": "0x479120703c51aE2a242F1D04815289f8BB2CdAED", + "ApprovedTransfer": "0xA825F25958F9C68573A3Ceb827345107CEdE0Aa8", + "TokenTransfer": "0xb81eC49d93Ed336771C1bC6448bFB262403fEef4", + "TokenExchanger": "0xd9CE60816ADF1E365f04Dea96AAF2775942C42C6", + "NftTransfer": "0xCAb6F3134894C10Bd357335D00412e0586fcE85E", + "MakerManager": "0x74BB0268ABf905C1Eb12f8300249070B56E76d77", + "MakerV2Manager": "0x69750794c8F3a6A584f850745aF3552158984b99", + "CompoundManager": "0xbf32494BedC3AcAccBb54F8560262A80609a1ABD", + "TransferManager": "0xcE7968f585fCe79AD1161A766F13aBd3375a0185" + }, + "gitCommit": "e93c93e71c50b186f1c73097425044343703cdff" +} diff --git a/utils/config/kovan.json b/utils/config/kovan.json index c96918efd..072d7750b 100644 --- a/utils/config/kovan.json +++ b/utils/config/kovan.json @@ -1,90 +1,91 @@ { - "ENS": { - "deployOwnRegistry": true, - "ensRegistry": "0xbD327810b75a808C9dE357368b5769b7b76edF84", - "domain": "argent.xyz" + "ENS": { + "deployOwnRegistry": true, + "ensRegistry": "0xe03e107077B97cDf32351eC254BBd0A1FEaB2AA2", + "domain": "argent.xyz" + }, + "backend": { + "accounts": [] + }, + "multisig": { + "owners": [], + "threshold": 1, + "autosign": true + }, + "settings": { + "deployer": { + "type": "infura", + "options": { + "network": "kovan", + "envvar": "INFURA_KEY" + } }, - "backend": { - "accounts": [ - "0x0000000000000000000000000000000000000000" - ] + "privateKey": { + "type": "plain", + "options": { + "envvar": "KOVAN_PRIV_KEY" + } }, - "multisig": { - "owners": [ - "0x0000000000000000000000000000000000000000" - ], - "threshold": 1, - "autosign": true + "lockPeriod": 480, + "recoveryPeriod": 480, + "securityPeriod": 240, + "securityWindow": 240, + "feeRatio": 15, + "defaultLimit": "1000000000000000000" + }, + "Kyber": { + "deployOwn": true, + "contract": "0xaC684E5464B91524E13351c2360290c21C7E5100" + }, + "CryptoKitties": { + "contract": "0x0000000000000000000000000000000000000000" + }, + "defi": { + "maker": { + "tub": "0xa71937147b55deb8a530c7229c442fd3f31b7db2", + "migration": "0x411b2faa662c8e3e5cf8f01dfdae0aee482ca7b0", + "pot": "0xea190dbdc7adf265260ec4da6e9675fd4f5a78bb", + "jug": "0xcbb7718c9f39d05aeede1c472ca8bf804b2f1ead", + "batJoin": "0x2a4c485b1b8dfb46accfbecaf75b6188a59dbd0a", + "batFaucet": "0x57aAeAE905376a4B1899bA81364b4cE2519CBfB3", + "mkrFaucet": "0xCbd3e165cE589657feFd2D38Ad6B6596A1f734F6" }, - "settings": { - "deployer": { - "type": "infura", - "options": { - "network": "kovan", - "key": "ENTER_YOUR_INFURA_KEY_HERE" - } - }, - "privateKey": { - "type": "plain", - "options": { - "value": "ENTER_YOUR_PRIV_KEY_HERE" - } - }, - "lockPeriod": 480, - "recoveryPeriod": 480, - "securityPeriod": 240, - "securityWindow": 240, - "feeRatio": 15, - "defaultLimit": "1000000000000000000" + "uniswap": { + "factory": "0x944365B2980cB75D5C540b44D9e3e63CF0fb2111" }, - "Kyber": { - "deployOwn": true, - "contract": "0x0C8011fD53E39A64adB1cBd8dE2257dDAA309586" - }, - "CryptoKitties": { - "contract": "0x0000000000000000000000000000000000000000" - }, - "defi": { - "maker": { - "tub": "0xa71937147b55deb8a530c7229c442fd3f31b7db2", - "migration": "0x411b2faa662c8e3e5cf8f01dfdae0aee482ca7b0", - "pot": "0xea190dbdc7adf265260ec4da6e9675fd4f5a78bb" - }, - "uniswap": { - "factory": "0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30" - }, - "compound": { - "comptroller": "0x142d11cb90a2b40f7d0c55ed1804988dfc316fae", - "markets": { - "0xc4375b7de8af5a38a93548eb8453a498222c4ff2": "0x0a1e4d0b5c71b955c0a5993023fc48ba6e380496", - "0xd0a1e359811322d97991e03f863a0c30c2cf029c": "0xd83f707f003a1f0b1535028ab356fce2667ab855" - } - } - }, - "contracts": { - "MultiSigWallet": "0x3a74dA99Ab9840783406a0CeBcDF089bf8843915", - "WalletFactory": "0xB2269e7243AC1a9a03Ffe0cceAc6dE590a586997", - "ENSResolver": "0x08eBa8B22d63d9B04456F1dBDf00BB5a3eb9CB85", - "ENSManager": "0xbE631f647D98b5833CEa88F13a312c3d56e13CE6", - "TokenPriceProvider": "0xb37E6772bC14fD301648c024FCF0B859DCb90562", - "ModuleRegistry": "0xC0b6EED9589380c3E3258e3a00A15c898541dA5c", - "DappRegistry": "0x4fB016D8628ca4be88B075B61D82D0a64807541e", - "BaseWallet": "0x1f64640Cc9bae8C4Dc3E22b2B3C1d648c2303c82" - }, - "modules": { - "GuardianStorage": "0x4F6084CF0E56eb79AdE34f192049970daC8b2544", - "TransferStorage": "0x6523F7975D76df86A498cB1A20cea946bC9AB1e0", - "DappStorage": "0x75131E355B43Dde961ee32af81F6a581C111298a", - "GuardianManager": "0xdca8F3833cE8f22F31C797515C02bDB91D9CC64c", - "LockManager": "0x5E198b65195BA1670A8676c37D6CdDA06FBfFbB1", - "RecoveryManager": "0xc1F4D3ac03C3052dDD91D1Dd6B293A7004247983", - "ApprovedTransfer": "0x040c604e6337cE17AcD3C124ad03594A94e50fdA", - "TokenTransfer": "0xb81eC49d93Ed336771C1bC6448bFB262403fEef4", - "DappManager": "0x0cA65A4a7338Db5E94Aa083B3a60eEB75074f831", - "TokenExchanger": "0xBE29E9569b4a40aaC421599F8F61394c03B1C918", - "NftTransfer": "0xEcE4e5209BEfF3B5E3b77985A84674f08B74B90B", - "MakerManager": "0x0E1499B090A8791Ec29a9656Fb85122fF8BCbD5e", - "MakerV2Manager": "0x0a78ECd7db74B00C010177E930EA429F0C7e0242" - }, - "gitCommit": "bdc11b5bfd49bf37dd5ba4f77288a25f2271e9d5" -} \ No newline at end of file + "compound": { + "comptroller": "0x142d11cb90a2b40f7d0c55ed1804988dfc316fae", + "markets": { + "0xc4375b7de8af5a38a93548eb8453a498222c4ff2": "0x0a1e4d0b5c71b955c0a5993023fc48ba6e380496", + "0xd0a1e359811322d97991e03f863a0c30c2cf029c": "0xd83f707f003a1f0b1535028ab356fce2667ab855" + } + } + }, + "contracts": { + "MultiSigWallet": "0xEC5F4731e40231ae57DfB0a4C644eD55F90aFeb3", + "WalletFactory": "0xe18806A33C74cBE5E14b90109e33Ad8512BB1A5a", + "ENSResolver": "0x17f8c87AabD5b9dEBDA5D942b852E6F7174232D0", + "ENSManager": "0x9812e6aa9Ac3500f8Dd4523058d9E48EE4B7A069", + "TokenPriceProvider": "0xb2760fB88EAC409A173ABCC6e9FB5ACc8a8D46e9", + "ModuleRegistry": "0xB9d7cB1d1b9440526777B39629c7035c33D8C64E", + "BaseWallet": "0x88ba95809C47bbA1cf9A657fcd3C81a78d608aA5", + "CompoundRegistry": "0xB3a945f078B44b98f93145f7a820e95a0a98e386", + "MakerRegistry": "0x5E102B9ADf82208fDcABDc9D24a4DF562cE7F896" + }, + "modules": { + "GuardianStorage": "0xD6E5cD0666A2607CfaBddB9aD0E30131e5359515", + "TransferStorage": "0x95B7d87586Fd218F56FDe21b93E3bc2eE4e9B406", + "GuardianManager": "0x96b8b73D55C713CEBfb1eee3D5F476766F679669", + "LockManager": "0x9b7fC8EF0a625451FA0F21422d2Dd4164f6cf82E", + "RecoveryManager": "0x479120703c51aE2a242F1D04815289f8BB2CdAED", + "ApprovedTransfer": "0xA825F25958F9C68573A3Ceb827345107CEdE0Aa8", + "TokenTransfer": "0xb81eC49d93Ed336771C1bC6448bFB262403fEef4", + "TokenExchanger": "0xd9CE60816ADF1E365f04Dea96AAF2775942C42C6", + "NftTransfer": "0xCAb6F3134894C10Bd357335D00412e0586fcE85E", + "MakerManager": "0x74BB0268ABf905C1Eb12f8300249070B56E76d77", + "MakerV2Manager": "0x7bb678505B6729f40bB1BE34572685766009492f", + "CompoundManager": "0xbf32494BedC3AcAccBb54F8560262A80609a1ABD", + "TransferManager": "0xcE7968f585fCe79AD1161A766F13aBd3375a0185" + }, + "gitCommit": "0afe14d8a6131725287700d51390b50c22a7f79a" +} diff --git a/utils/configurator-loader.js b/utils/configurator-loader.js index 9fcb98c4d..52cffe35d 100644 --- a/utils/configurator-loader.js +++ b/utils/configurator-loader.js @@ -1,50 +1,51 @@ -const AWS = require('aws-sdk'); -const fs = require('fs'); +// eslint-disable-next-line max-classes-per-file +const AWS = require("aws-sdk"); +const fs = require("fs"); const s3 = new AWS.S3(); class ConfiguratorLoaderS3 { - constructor(bucket, key) { - this.bucket = bucket; - this.key = key; - } - - async load() { - const params = { - Bucket: this.bucket, - Key: this.key - }; - const object = await s3.getObject(params).promise(); - const json = object.Body.toString('utf-8'); - return json; - } - - async save(json) { - const params = { - Body: json, - Bucket: this.bucket, - Key: this.key - }; - await s3.putObject(params).promise(); - } + constructor(bucket, key) { + this.bucket = bucket; + this.key = key; + } + + async load() { + const params = { + Bucket: this.bucket, + Key: this.key, + }; + const object = await s3.getObject(params).promise(); + const json = object.Body.toString("utf-8"); + return json; + } + + async save(json) { + const params = { + Body: json, + Bucket: this.bucket, + Key: this.key, + }; + await s3.putObject(params).promise(); + } } class ConfiguratorLoaderLocal { - constructor(path) { - this.path = path; - } - - async load() { - const json = fs.readFileSync(this.path, 'utf8'); - return json; - } - - async save(json) { - fs.writeFileSync(this.path, json); - } + constructor(path) { + this.path = path; + } + + async load() { + const json = fs.readFileSync(this.path, "utf8"); + return json; + } + + async save(json) { + fs.writeFileSync(this.path, json); + } } module.exports = { - S3: ConfiguratorLoaderS3, - Local: ConfiguratorLoaderLocal, + S3: ConfiguratorLoaderS3, + Local: ConfiguratorLoaderLocal, }; diff --git a/utils/configurator.js b/utils/configurator.js index 4d6a2a777..e5215bbb9 100644 --- a/utils/configurator.js +++ b/utils/configurator.js @@ -1,77 +1,81 @@ -const Ajv = require('ajv'); +const Ajv = require("ajv"); -const ajv = Ajv({allErrors: true}); +const ajv = Ajv({ allErrors: true }); -const schema = require('./config-schema.json'); +const schema = require("./config-schema.json"); class Configurator { - constructor(loader) { - this.loader = loader; - } + constructor(loader) { + this.loader = loader; + } - get config() { - return this._config; - } + get config() { + return this._config; + } - copyConfig() { - return JSON.parse(JSON.stringify(this._config)); - } + copyConfig() { + return JSON.parse(JSON.stringify(this._config)); + } - updateInfrastructureAddresses(contracts) { - if (!this._config.contracts) this._config.contracts = {}; - Object.assign(this._config.contracts, contracts); - } + updateInfrastructureAddresses(contracts) { + if (!this._config.contracts) this._config.contracts = {}; + Object.assign(this._config.contracts, contracts); + } - updateModuleAddresses(modules) { - if (!this._config.modules) this._config.modules = {}; - Object.assign(this._config.modules, modules); - } + updateModuleAddresses(modules) { + if (!this._config.modules) this._config.modules = {}; + Object.assign(this._config.modules, modules); + } - updateENSRegistry(address) { - this._config.ENS.ensRegistry = address; - } + updateENSRegistry(address) { + this._config.ENS.ensRegistry = address; + } - updateKyberContract(address) { - this._config.Kyber.contract = address; - } + updateKyberContract(address) { + this._config.Kyber.contract = address; + } - updateMakerMigration(address) { - this._config.defi.maker.migration = address; - } + updateMakerMigration(address) { + this._config.defi.maker.migration = address; + } - updateBackendAccounts(accounts) { - this._config.backend.accounts = accounts; - } + updateUniswapFactory(address) { + this._config.defi.uniswap.factory = address; + } - updateMultisigOwner(owners) { - if (this._config.multisig.autosign === false) return; - this._config.multisig.owners = owners; - } + updateBackendAccounts(accounts) { + this._config.backend.accounts = accounts; + } - updateGitHash(hash) { - this._config.gitCommit = hash; - } + updateMultisigOwner(owners) { + if (this._config.multisig.autosign === false) return; + this._config.multisig.owners = owners; + } - async load(validate = true) { - const json = await this.loader.load(); - this._config = JSON.parse(json); - if (validate) { this._validate(); } - return this._config; - } + updateGitHash(hash) { + this._config.gitCommit = hash; + } - async save() { - this._validate(); - let json = JSON.stringify(this._config); - await this.loader.save(json); - } + async load(validate = true) { + const json = await this.loader.load(); + this._config = JSON.parse(json); + if (validate) { this._validate(); } + return this._config; + } + + async save() { + this._validate(); + const json = JSON.stringify(this._config); + await this.loader.save(json); + } - _validate() { - var valid = ajv.validate(schema, this._config); - if (!valid) { - console.log(ajv.errors); - throw new Error("Configuration is not valid"); - } + _validate() { + const valid = ajv.validate(schema, this._config); + if (!valid) { + console.log(ajv.errors); + throw new Error("Configuration is not valid"); } } +} module.exports = Configurator; diff --git a/utils/defi-deployer.js b/utils/defi-deployer.js new file mode 100644 index 000000000..bd482d817 --- /dev/null +++ b/utils/defi-deployer.js @@ -0,0 +1,183 @@ + +const { parseEther, bigNumberify, formatBytes32String } = require("ethers").utils; +const etherlime = require("etherlime-lib"); + +const UniswapFactory = require("../lib/uniswap/UniswapFactory"); +const UniswapExchange = require("../lib/uniswap/UniswapExchange"); + +const ScdMcdMigration = require("../build/ScdMcdMigration"); +const DSValue = require("../build/DSValue"); +const DSToken = require("../build/DSToken"); +const Dai = require("../build/Dai"); +const Vox = require("../build/SaiVox"); +const Tub = require("../build/SaiTub"); +const WETH = require("../build/WETH9"); +const Vat = require("../build/Vat"); +const Pot = require("../build/Pot"); +const Jug = require("../build/Jug"); +const CdpManager = require("../build/DssCdpManager"); +const GemJoin = require("../build/GemJoin"); +const DaiJoin = require("../build/DaiJoin"); + +const RAY = bigNumberify("1000000000000000000000000000"); // 10**27 +const WAD = bigNumberify("1000000000000000000"); // 10**18 +const RAD = RAY.mul(WAD); +const USD_PER_DAI = RAY; // 1 DAI = 1 USD +const USD_PER_ETH = WAD.mul(100); // 1 ETH = 100 USD +const USD_PER_MKR = WAD.mul(400); // 1 MKR = 400 USD +const ETH_PER_MKR = WAD.mul(USD_PER_MKR).div(USD_PER_ETH); // 1 MKR = 4 ETH +const ETH_PER_DAI = WAD.mul(USD_PER_DAI).div(RAY).mul(WAD).div(USD_PER_ETH); // 1 DAI = 0.01 ETH +const MAT = RAY.mul(3).div(2); // collateralizsation ratio = 150% + +module.exports = { + RAY, + WAD, + ETH_PER_MKR, + ETH_PER_DAI, + + deployUniswap: async (deployer, manager, infrastructure, tokens = [], ethPerToken = [], ethLiquidity = parseEther("10")) => { + const uniswapFactory = await deployer.deploy(UniswapFactory); + const uniswapTemplateExchange = await deployer.deploy(UniswapExchange); + await uniswapFactory.initializeFactory(uniswapTemplateExchange.contractAddress); + for (let i = 0; i < tokens.length; i += 1) { + const token = tokens[i]; + await uniswapFactory.from(infrastructure).createExchange(token.contractAddress); + const tokenExchange = await etherlime.ContractAt(UniswapExchange, await uniswapFactory.getExchange(token.contractAddress)); + const tokenLiquidity = ethLiquidity.mul(WAD).div(ethPerToken[i]); + await token["mint(address,uint256)"](infrastructure.address, tokenLiquidity); + await token.from(infrastructure).approve(tokenExchange.contractAddress, tokenLiquidity); + const timestamp = await manager.getTimestamp(await manager.getCurrentBlock()); + await tokenExchange.from(infrastructure).addLiquidity(1, tokenLiquidity, timestamp + 300, { value: ethLiquidity, gasLimit: 150000 }); + } + return { uniswapFactory }; + }, + + deployMaker: async (deployer, infrastructure) => { + // + // Deploy and setup SCD + // + const sai = await deployer.deploy(DSToken, {}, formatBytes32String("SAI")); + const dai = await deployer.deploy(Dai, {}, 42); + const gov = await deployer.deploy(DSToken, {}, formatBytes32String("MKR")); + const weth = await deployer.deploy(WETH); + const vox = await deployer.deploy(Vox, {}, USD_PER_DAI); + const sin = await deployer.deploy(DSToken, {}, formatBytes32String("SIN")); + const skr = await deployer.deploy(DSToken, {}, formatBytes32String("PETH")); + const pip = await deployer.deploy(DSValue); + const pep = await deployer.deploy(DSValue); + const tub = await deployer.deploy(Tub, {}, + sai.contractAddress, + sin.contractAddress, + skr.contractAddress, + weth.contractAddress, + gov.contractAddress, + pip.contractAddress, + pep.contractAddress, + vox.contractAddress, + infrastructure.address); + // Let the Tub mint PETH and DAI + await skr.setOwner(tub.contractAddress); + await sai.setOwner(tub.contractAddress); + // Setup USD/ETH oracle with a convertion rate of 100 USD/ETH + await pip.poke(`0x${USD_PER_ETH.toHexString().slice(2).padStart(64, "0")}`); + // Setup USD/MKR oracle with a convertion rate of 400 USD/MKR + await pep.poke(`0x${USD_PER_MKR.toHexString().slice(2).padStart(64, "0")}`); + // Set the total DAI debt ceiling to 50,000 DAI + await tub.mold(formatBytes32String("cap"), parseEther("50000")); + // Set the collateralization ratio to 150% + await tub.mold(formatBytes32String("mat"), MAT); + // Set the governance fee to 7.5% APR + await tub.mold(formatBytes32String("fee"), "1000000002293273137447730714"); + + + // + // Deploy and setup MCD + // + + // Vat setup + const vat = await deployer.deploy(Vat); + // Setting the debt ceiling + await vat["file(bytes32,uint256)"](formatBytes32String("Line"), "138000000000000000000000000000000000000000000000000000"); + + const cdpManager = await deployer.deploy(CdpManager, {}, vat.contractAddress); + + // Pot setup + const pot = await deployer.deploy(Pot, {}, vat.contractAddress); + await vat.rely(pot.contractAddress); + + // Jug setup + const jug = await deployer.deploy(Jug, {}, vat.contractAddress); + await vat.rely(jug.contractAddress); + + // SAI collateral setup + const saiIlk = formatBytes32String("SAI"); + await jug.init(saiIlk); + await vat.init(saiIlk); + await vat.file(saiIlk, formatBytes32String("spot"), "100000000000000000000000000000000000000000000000000"); + await vat.file(saiIlk, formatBytes32String("line"), "100000000000000000000000000000000000000000000000000000"); + await vat.file(saiIlk, formatBytes32String("dust"), "0"); + const saiJoin = await deployer.deploy(GemJoin, {}, vat.contractAddress, saiIlk, sai.contractAddress); + await vat.rely(saiJoin.contractAddress); + + // WETH collateral setup + const wethIlk = formatBytes32String("ETH-A"); + await jug.init(wethIlk); + await vat.init(wethIlk); + await vat.file(wethIlk, formatBytes32String("spot"), "88050000000000000000000000000"); + await vat.file(wethIlk, formatBytes32String("line"), "50000000000000000000000000000000000000000000000000000"); + await vat.file(wethIlk, formatBytes32String("dust"), "20000000000000000000000000000000000000000000000"); + const wethJoin = await deployer.deploy(GemJoin, {}, vat.contractAddress, wethIlk, weth.contractAddress); + await vat.rely(wethJoin.contractAddress); + + // BAT collateral setup + const bat = await deployer.deploy(DSToken, {}, formatBytes32String("BAT")); + const batIlk = formatBytes32String("BAT-A"); + await jug.init(batIlk); + await vat.init(batIlk); + await vat.file(batIlk, formatBytes32String("spot"), "88050000000000000000000000000"); + await vat.file(batIlk, formatBytes32String("line"), "50000000000000000000000000000000000000000000000000000"); + await vat.file(batIlk, formatBytes32String("dust"), "20000000000000000000000000000000000000000000000"); + const batJoin = await deployer.deploy(GemJoin, {}, vat.contractAddress, batIlk, bat.contractAddress); + await vat.rely(batJoin.contractAddress); + + // DAI debt setup + const daiJoin = await deployer.deploy(DaiJoin, {}, vat.contractAddress, dai.contractAddress); + // Allow daiJoin to mint DAI + await dai.rely(daiJoin.contractAddress); + // Give daiJoin some internal DAI in the vat + await vat.suck(daiJoin.contractAddress, daiJoin.contractAddress, RAD.mul(1000000)); + + // Deploy and setup SCD to MCD Migration + const migration = await deployer.deploy( + ScdMcdMigration, + {}, + tub.contractAddress, + cdpManager.contractAddress, + saiJoin.contractAddress, + wethJoin.contractAddress, + daiJoin.contractAddress, + ); + // Setting up the common migration vault used by ScdMcdMigration + const initialSaiAmountInMigrationVault = parseEther("1000"); + await sai["mint(address,uint256)"](infrastructure.address, initialSaiAmountInMigrationVault); + await sai.from(infrastructure).approve(migration.contractAddress, initialSaiAmountInMigrationVault); + await migration.from(infrastructure).swapSaiToDai(initialSaiAmountInMigrationVault, { gasLimit: 2000000 }); + + return { + sai, + dai, + gov, + bat, + weth, + vat, + batJoin, + wethJoin, + tub, + pip, + pot, + jug, + cdpManager, + migration, + }; + }, +}; diff --git a/utils/deploy-manager.js b/utils/deploy-manager.js index 06b647e6d..59ab3b940 100644 --- a/utils/deploy-manager.js +++ b/utils/deploy-manager.js @@ -1,85 +1,89 @@ -require('dotenv').config(); -const etherlime = require('etherlime-lib'); +require("dotenv").config(); +const etherlime = require("etherlime-lib"); const path = require("path"); -const Configurator = require('./configurator.js'); -const ConfiguratorLoader = require('./configurator-loader.js'); -const PrivateKeyLoader = require('./private-key-loader.js'); -const ABIUploader = require('./abi-uploader.js'); -const VersionUploader = require('./version-uploader.js'); +const Configurator = require("./configurator.js"); +const ConfiguratorLoader = require("./configurator-loader.js"); +const PrivateKeyLoader = require("./private-key-loader.js"); +const ABIUploader = require("./abi-uploader.js"); +const VersionUploader = require("./version-uploader.js"); +const utils = require("./utilities.js"); const defaultConfigs = { - gasPrice: 20000000000, // 20 Gwei - gasLimit: 6000000 -} + gasPrice: utils.bigNumberify(process.env.DEPLOYER_GAS_PRICE || 20000000000), + gasLimit: 6000000, +}; class DeployManager { - constructor(network) { - this.network = network; - this.env = process.env.CONFIG_ENVIRONMENT - const suffixes = (process.env.S3_BUCKET_SUFFIXES || "").split(':'); + constructor(network) { + this.network = network; + this.env = process.env.CONFIG_ENVIRONMENT; + this.remotelyManagedNetworks = (process.env.S3_BUCKET_SUFFIXES || "").split(":"); - // config - let configLoader; - if (suffixes.includes(this.network)) { - const bucket = `${process.env.S3_BUCKET_PREFIX}-${this.network}`; - const key = process.env.S3_CONFIG_KEY; - configLoader = new ConfiguratorLoader.S3(bucket, key); - } else { - const fileName = this.env ? `${this.network}.${this.env}.json` : `${this.network}.json` - const filePath = path.join(__dirname, './config', fileName) - configLoader = new ConfiguratorLoader.Local(filePath) - } - this.configurator = new Configurator(configLoader); + // config + let configLoader; + if (this.remotelyManagedNetworks.includes(this.network)) { + const bucket = `${process.env.S3_BUCKET_PREFIX}-${this.network}`; + const key = process.env.S3_CONFIG_KEY; + configLoader = new ConfiguratorLoader.S3(bucket, key); + } else { + const fileName = this.env ? `${this.network}.${this.env}.json` : `${this.network}.json`; + const filePath = path.join(__dirname, "./config", fileName); + configLoader = new ConfiguratorLoader.Local(filePath); } + this.configurator = new Configurator(configLoader); + } - async setup() { - await this.configurator.load(); - const config = this.configurator.config; + async setup() { + await this.configurator.load(); + const { config } = this.configurator; - // deployer - if (config.settings.deployer.type === 'ganache') { - this.deployer = new etherlime.EtherlimeGanacheDeployer(); + // getting private key if any is available + let pkey; + if (config.settings.privateKey && config.settings.privateKey.type === "plain") { + const { value, envvar } = config.settings.privateKey.options; + pkey = value || process.env[envvar]; + } else if (config.settings.privateKey && config.settings.privateKey.type === "s3") { + const { options } = config.settings.privateKey; + const pkeyLoader = new PrivateKeyLoader(options.bucket, options.key); + pkey = await pkeyLoader.fetch(); + } - // this need to be tested - const account = await this.deployer.signer.getAddress(); - this.configurator.updateBackendAccounts([account]); - this.configurator.updateMultisigOwner([account]); - } else { - let pkey; - if (config.settings.privateKey.type === 'plain') { - const options = config.settings.privateKey.options; - pkey = options.value; - } else if (config.settings.privateKey.type === 's3') { - const options = config.settings.privateKey.options; - const pkeyLoader = new PrivateKeyLoader(options.bucket, options.key); - pkey = await pkeyLoader.fetch(); - } + // setting deployer + if (config.settings.deployer.type === "ganache") { + this.deployer = new etherlime.EtherlimeGanacheDeployer(pkey); // will use etherlime accounts if pkey is undefined + } else if (config.settings.deployer.type === "infura") { + const { network, key, envvar } = config.settings.deployer.options; + this.deployer = new etherlime.InfuraPrivateKeyDeployer(pkey, network, key || process.env[envvar]); + } else if (config.settings.deployer.type === "jsonrpc") { + const { url } = config.settings.deployer.options; + this.deployer = new etherlime.JSONRPCPrivateKeyDeployer(pkey, url); + } + // set default gasPrice and gasLimit + this.deployer.setDefaultOverrides(defaultConfigs); - if (config.settings.deployer.type === 'infura') { - const options = config.settings.deployer.options; - this.deployer = new etherlime.InfuraPrivateKeyDeployer(pkey, options.network, options.key, defaultConfigs); - } else if (config.settings.deployer.type === 'jsonrpc') { - const options = config.settings.deployer.options; - this.deployer = new etherlime.JSONRPCPrivateKeyDeployer(pkey, options.url, defaultConfigs); - } - } + // setting backend accounts and multi-sig owner for test environments not managed on S3 + if (!this.remotelyManagedNetworks.includes(this.network)) { + const account = await this.deployer.signer.getAddress(); + this.configurator.updateBackendAccounts([account]); + this.configurator.updateMultisigOwner([account]); + } - // abi upload - if (config.settings.abiUpload) { - this.abiUploader = new ABIUploader.S3(config.settings.abiUpload.bucket); - } else { - this.abiUploader = new ABIUploader.None(); - } + // abi upload + if (config.settings.abiUpload) { + this.abiUploader = new ABIUploader.S3(config.settings.abiUpload.bucket); + } else { + this.abiUploader = new ABIUploader.None(); + } - // version upload - if (config.settings.versionUpload) { - this.versionUploader = new VersionUploader.S3(config.settings.versionUpload.bucket, config.settings.versionUpload.url); - } else { - const dirPath = path.join(__dirname, './versions/', this.network); - this.versionUploader = new VersionUploader.Local(dirPath, this.env); - } + // version upload + if (config.settings.versionUpload) { + this.versionUploader = new VersionUploader.S3(config.settings.versionUpload.bucket, config.settings.versionUpload.url); + } else { + const dirPath = path.join(__dirname, "./versions/", this.network); + this.versionUploader = new VersionUploader.Local(dirPath, this.env); } + } } module.exports = DeployManager; diff --git a/utils/multisigexecutor.js b/utils/multisigexecutor.js index bb372e063..ef2f682b2 100644 --- a/utils/multisigexecutor.js +++ b/utils/multisigexecutor.js @@ -1,99 +1,94 @@ -const ethers = require('ethers'); +const ethers = require("ethers"); const inquirer = require("inquirer"); -const utils = require('./utilities.js'); +const utils = require("./utilities.js"); class MultisigExecutor { - constructor(multisigWrapper, ownerWallet, autoSign = true) { - this._multisigWrapper = multisigWrapper; - this._ownerWallet = ownerWallet; - this._autoSign = autoSign; - } + constructor(multisigWrapper, ownerWallet, autoSign = true, overrides = {}) { + this._multisigWrapper = multisigWrapper; + this._ownerWallet = ownerWallet; + this._autoSign = autoSign; + this._overrides = Object.assign(overrides, { gasLimit: 1000000 }); + } - async executeCall(contractWrapper, method, params) { - const contract_address = contractWrapper.contractAddress; - - // Encode the method call with its parameters - let data = contractWrapper.contract.interface.functions[method].encode(params); - - // Get the nonce - const nonce = (await this._multisigWrapper.contract.nonce()).toNumber(); - - // Get the sign Hash - let signHash = this.signHash(this._multisigWrapper.contractAddress, contract_address, 0, data, nonce); - - if (this._autoSign === true) { - // Get the off chain signature - const signHashBuffer = Buffer.from(signHash.slice(2), 'hex'); - let signature = await this._ownerWallet.signMessage(signHashBuffer); - - // to make sure signature ends with 27/28 - const split = ethers.utils.splitSignature(signature); - signature = ethers.utils.joinSignature(split); - - // Call "execute" on the Multisig wallet with data and signatures - const executeTransaction = await this._multisigWrapper.contract.execute(contract_address, 0, data, signature, { gasLimit: 2000000 }); - const result = await this._multisigWrapper.verboseWaitForTransaction(executeTransaction, 'Multisig Execute Transaction'); - - return result; - - } else { - // Get the threshold - const threshold = (await this._multisigWrapper.contract.threshold()).toNumber(); - - console.log(`******* MultisigExecutor *******`); - console.log(`Signing data for transaction to ${contractWrapper._contract.contractName} located at ${contract_address}:`); - console.log(`multisig: ${this._multisigWrapper.contractAddress}`); - console.log(`to: ${contract_address}`); - console.log(`value: 0`); - console.log(`data: ${data}`); - console.log(`nonce: ${nonce}`); - console.log(`SignHash: ${signHash}`); - console.log(`Required signatures: ${threshold}`) - console.log(`********************************`); - - const signatures_output = await inquirer.prompt(Array(threshold).fill(0).map((value, index) => { - return { - type: 'input', - name: `signature_${index}`, - message: `Please provide signature ${index+1}/${threshold}` - }; - })); - - const parsedSignatures = Object.values(signatures_output).map(signature => JSON.parse(signature)); - const sortedSignatures = parsedSignatures.sort((s1, s2) => { - const bn1 = ethers.utils.bigNumberify(s1.address); - const bn2 = ethers.utils.bigNumberify(s2.address); - if (bn1.lt(bn2)) return -1; - if (bn1.gt(bn2)) return 1; - return 0; - }); - - let signatures = '0x' + sortedSignatures.map(s => s.sig.slice(2)).join(''); - - // Call "execute" on the Multisig wallet with data and signatures - const executeTransaction = await this._multisigWrapper.contract.execute(contract_address, 0, data, signatures, { gasLimit: 300000 }); - const result = await this._multisigWrapper.verboseWaitForTransaction(executeTransaction, 'Multisig Execute Transaction'); - - return result; - } - } + async executeCall(contractWrapper, method, params) { + const { contractAddress } = contractWrapper; + + // Encode the method call with its parameters + const data = contractWrapper.contract.interface.functions[method].encode(params); + + // Get the nonce + const nonce = (await this._multisigWrapper.contract.nonce()).toNumber(); + + // Get the sign Hash + const signHash = MultisigExecutor.signHash(this._multisigWrapper.contractAddress, contractAddress, 0, data, nonce); + + if (this._autoSign === true) { + // Get the off chain signature + const signHashBuffer = Buffer.from(signHash.slice(2), "hex"); + let signature = await this._ownerWallet.signMessage(signHashBuffer); - signHash(walletAddr, destinationAddr, value, data, nonce) { - let input = '0x' + [ - '0x19', - '0x00', - walletAddr, - destinationAddr, - ethers.utils.hexZeroPad(ethers.utils.hexlify(value), 32), - data, - ethers.utils.hexZeroPad(ethers.utils.hexlify(nonce), 32) - ].map(hex => hex.slice(2)).join(""); + // to make sure signature ends with 27/28 + const split = ethers.utils.splitSignature(signature); + signature = ethers.utils.joinSignature(split); - let signHash = utils.sha3(input); + // Call "execute" on the Multisig wallet with data and signatures + const executeTransaction = await this._multisigWrapper.contract.execute(contractAddress, 0, data, signature, this._overrides); + const result = await this._multisigWrapper.verboseWaitForTransaction(executeTransaction, "Multisig Execute Transaction"); - return signHash; + return result; } + // Get the threshold + const threshold = (await this._multisigWrapper.contract.threshold()).toNumber(); + + console.log("******* MultisigExecutor *******"); + console.log(`Signing data for transaction to ${contractWrapper._contract.contractName} located at ${contractAddress}:`); + console.log(`multisig: ${this._multisigWrapper.contractAddress}`); + console.log(`to: ${contractAddress}`); + console.log("value: 0"); + console.log(`data: ${data}`); + console.log(`nonce: ${nonce}`); + console.log(`SignHash: ${signHash}`); + console.log(`Required signatures: ${threshold}`); + console.log("********************************"); + + const signaturesOutput = await inquirer.prompt(Array(threshold).fill(0).map((value, index) => ({ + type: "input", + name: `signature_${index}`, + message: `Please provide signature ${index + 1}/${threshold}`, + }))); + + const parsedSignatures = Object.values(signaturesOutput).map((signature) => JSON.parse(signature)); + const sortedSignatures = parsedSignatures.sort((s1, s2) => { + const bn1 = ethers.utils.bigNumberify(s1.address); + const bn2 = ethers.utils.bigNumberify(s2.address); + if (bn1.lt(bn2)) return -1; + if (bn1.gt(bn2)) return 1; + return 0; + }); + + const signatures = `0x${sortedSignatures.map((s) => s.sig.slice(2)).join("")}`; + + // Call "execute" on the Multisig wallet with data and signatures + const executeTransaction = await this._multisigWrapper.contract.execute(contractAddress, 0, data, signatures, this._overrides); + const result = await this._multisigWrapper.verboseWaitForTransaction(executeTransaction, "Multisig Execute Transaction"); + + return result; + } + + static signHash(walletAddr, destinationAddr, value, data, nonce) { + const input = `0x${[ + "0x19", + "0x00", + walletAddr, + destinationAddr, + ethers.utils.hexZeroPad(ethers.utils.hexlify(value), 32), + data, + ethers.utils.hexZeroPad(ethers.utils.hexlify(nonce), 32), + ].map((hex) => hex.slice(2)).join("")}`; + + return utils.sha3(input); + } } module.exports = MultisigExecutor; diff --git a/utils/private-key-loader.js b/utils/private-key-loader.js index e9b300741..5c30d7627 100644 --- a/utils/private-key-loader.js +++ b/utils/private-key-loader.js @@ -1,21 +1,21 @@ -const AWS = require('aws-sdk'); +const AWS = require("aws-sdk"); const kms = new AWS.KMS(); const s3 = new AWS.S3(); class PrivateKeyLoader { - constructor(s3_bucket, s3_key) { - this.s3_bucket = s3_bucket; - this.s3_key = s3_key; - } + constructor(s3Bucket, s3Key) { + this.s3Bucket = s3Bucket; + this.s3Key = s3Key; + } - async fetch() { - const object = await s3.getObject({ Bucket: this.s3_bucket, Key: this.s3_key }).promise(); - const data = await kms.decrypt({ CiphertextBlob: object.Body }).promise(); - const pkey = data.Plaintext.toString('utf8'); + async fetch() { + const object = await s3.getObject({ Bucket: this.s3Bucket, Key: this.s3Key }).promise(); + const data = await kms.decrypt({ CiphertextBlob: object.Body }).promise(); + const pkey = data.Plaintext.toString("utf8"); - return pkey; - } + return pkey; + } } module.exports = PrivateKeyLoader; diff --git a/utils/test-manager.js b/utils/test-manager.js index 0e2387af5..9e51f7711 100644 --- a/utils/test-manager.js +++ b/utils/test-manager.js @@ -1,12 +1,10 @@ -const etherlime = require('etherlime-lib'); -const ethers = require('ethers'); -const ps = require('ps-node'); -const hdkey = require('ethereumjs-wallet/hdkey') +const etherlime = require("etherlime-lib"); +const ethers = require("ethers"); +const ps = require("ps-node"); +const hdkey = require("ethereumjs-wallet/hdkey"); const bip39 = require("bip39"); const { signOffchain } = require("./utilities.js"); -const APIKEY = "41c41ec78ad0435982708754d5e8cc24"; - const USE_ETHERLIME_GANACHE_MNEMONIC = true; // this is the same mnemonic as that used by ganache-cli --deterministic @@ -14,101 +12,95 @@ const USE_ETHERLIME_GANACHE_MNEMONIC = true; const MNEMONIC = "myth like bonus scare over problem client lizard pioneer submit female collect"; class TestManager { - constructor(_accounts = null, network = 'ganache') { - this.network = network; - this.accounts = _accounts || this.loadAccounts(); - global.accounts = this.accounts; - this.deployer = this.newDeployer(); - this.provider = this.deployer.provider; - } + constructor(_accounts = null, network = "ganache", deployer) { + this.network = network; + this.accounts = _accounts || this.loadAccounts(); + global.accounts = this.accounts; + this.deployer = deployer || this.newDeployer(); + this.provider = this.deployer.provider; + } - loadAccounts() { - if (USE_ETHERLIME_GANACHE_MNEMONIC) return global.accounts; + loadAccounts() { // eslint-disable-line class-methods-use-this + if (USE_ETHERLIME_GANACHE_MNEMONIC) return global.accounts; - // ignore (global) accounts loaded from cli-commands/ganache/setup.json - // and instead generate accounts matching those used by ganache-cli in determistic mode - const hdWallet = hdkey.fromMasterSeed(bip39.mnemonicToSeedSync(MNEMONIC)); - const localNodeProvider = new ethers.providers.JsonRpcProvider(`http://localhost:8545`) - accounts = [] - for (let i = 0; i < 10; i++) { - const privKey = hdWallet.derivePath(`m/44'/60'/0'/0/${i}`).getWallet().getPrivateKeyString(); - accounts.push({ - secretKey: privKey, - signer: new ethers.Wallet(privKey, localNodeProvider) - }); - } - return accounts; + // ignore (global) accounts loaded from cli-commands/ganache/setup.json + // and instead generate accounts matching those used by ganache-cli in determistic mode + const hdWallet = hdkey.fromMasterSeed(bip39.mnemonicToSeedSync(MNEMONIC)); + const localNodeProvider = new ethers.providers.JsonRpcProvider("http://localhost:8545"); + const accounts = []; + for (let i = 0; i < 10; i += 1) { + const privKey = hdWallet.derivePath(`m/44'/60'/0'/0/${i}`).getWallet().getPrivateKeyString(); + accounts.push({ + secretKey: privKey, + signer: new ethers.Wallet(privKey, localNodeProvider), + }); } + return accounts; + } - newDeployer() { - if (this.network === 'ropsten') { - const defaultConfigs = { - gasPrice: 20000000000, - gasLimit: 4700000, - chainId: 3 - } - return new etherlime.InfuraPrivateKeyDeployer(this.accounts[0].signer.privateKey, 'ropsten', APIKEY, defaultConfigs); - } - return new etherlime.EtherlimeGanacheDeployer(this.accounts[0].secretKey, 8545, { gasLimit: 6700000 }); - } + newDeployer() { + return new etherlime.EtherlimeGanacheDeployer(this.accounts[0].secretKey); + } - async getCurrentBlock() { - let block = await this.provider.getBlockNumber(); - return block; - } + async getCurrentBlock() { + const block = await this.provider.getBlockNumber(); + return block; + } - async getTimestamp(blockNumber) { - let block = await this.provider.getBlock(blockNumber); - return block.timestamp; - } + async getTimestamp(blockNumber) { + const block = await this.provider.getBlock(blockNumber); + return block.timestamp; + } - async getNonceForRelay() { - let block = await this.provider.getBlockNumber(); - let timestamp = (new Date()).getTime(); - return '0x' + ethers.utils.hexZeroPad(ethers.utils.hexlify(block), 16).slice(2) + ethers.utils.hexZeroPad(ethers.utils.hexlify(timestamp), 16).slice(2); - } + async getNonceForRelay() { + const block = await this.provider.getBlockNumber(); + const timestamp = new Date().getTime(); + return `0x${ethers.utils.hexZeroPad(ethers.utils.hexlify(block), 16) + .slice(2)}${ethers.utils.hexZeroPad(ethers.utils.hexlify(timestamp), 16).slice(2)}`; + } - async relay(_target, _method, _params, _wallet, _signers, _relayer = this.accounts[9].signer, _estimate = false, _gasLimit = 700000) { - const nonce = await this.getNonceForRelay(); - const methodData = _target.contract.interface.functions[_method].encode(_params); - const signatures = await signOffchain(_signers, _target.contractAddress, _wallet.contractAddress, 0, methodData, nonce, 0, _gasLimit); - if (_estimate === true) { - const gasUsed = await _target.from(_relayer).estimate.execute(_wallet.contractAddress, methodData, nonce, signatures, 0, _gasLimit); - return gasUsed; - } - const tx = await _target.from(_relayer).execute(_wallet.contractAddress, methodData, nonce, signatures, 0, _gasLimit, { gasLimit: _gasLimit }); - const txReceipt = await _target.verboseWaitForTransaction(tx); - return txReceipt; + async relay(_target, _method, _params, _wallet, _signers, _relayer = this.accounts[9].signer, _estimate = false, _gasLimit = 2000000, _nonce) { + const nonce = _nonce || await this.getNonceForRelay(); + const methodData = _target.contract.interface.functions[_method].encode(_params); + const signatures = await signOffchain(_signers, _target.contractAddress, _wallet.contractAddress, 0, methodData, nonce, 0, _gasLimit); + const targetFrom = (_target.from && _target.from(_relayer)) || _target; + if (_estimate === true) { + const gasUsed = await targetFrom.estimate.execute(_wallet.contractAddress, methodData, nonce, signatures, 0, _gasLimit); + return gasUsed; } + const tx = await targetFrom.execute(_wallet.contractAddress, methodData, nonce, signatures, 0, _gasLimit, { gasLimit: _gasLimit }); + const txReceipt = await _target.verboseWaitForTransaction(tx); + return txReceipt; + } - async increaseTime(seconds) { - await this.provider.send('evm_increaseTime', seconds); - await this.provider.send('evm_mine'); + async increaseTime(seconds) { + if (this.network === "ganache") { + await this.provider.send("evm_increaseTime", seconds); + await this.provider.send("evm_mine"); + } else { + return new Promise((res) => { setTimeout(res, seconds * 1000); }); } + return null; + } - async runningEtherlimeGanache() { - return new Promise((res, _) => { - ps.lookup({ - command: 'node', - psargs: 'ux', - arguments: 'ganache' - }, (err, processes) => { - const runningEthGanache = !err && processes.reduce((etherlimeGanacheFound, p) => - etherlimeGanacheFound || (p.command + p.arguments.join('-')).includes('etherlime-ganache'), - false) - return res(runningEthGanache); - }); - }) - } + async runningEtherlimeGanache() { // eslint-disable-line class-methods-use-this + return new Promise((res) => { + ps.lookup({ arguments: ["etherlime", "ganache"] }, (err, processes) => { + const runningEthGanache = !err && processes.reduce((etherlimeGanacheFound, p) => etherlimeGanacheFound + || (p.command + p.arguments.join("-")).includes("etherlime-ganache"), false); + return res(runningEthGanache); + }); + }); + } - async isRevertReason(error, reason) { - const runningEthGanache = await this.runningEtherlimeGanache(); - // by default, we match the error with a generic "revert" keyword - // but if we are running etherlime ganache (and not e.g. ganache-cli), - // we can match the error with the exact reason message - const expectedReason = runningEthGanache ? reason : "revert"; - return (error.message || error.toString()).includes(expectedReason); - } + async isRevertReason(error, reason) { + const runningEthGanache = await this.runningEtherlimeGanache(); + // by default, we match the error with a generic "revert" keyword + // but if we are running etherlime ganache (and not e.g. ganache-cli), + // we can match the error with the exact reason message + const expectedReason = runningEthGanache ? reason : "revert"; + return (error.message || error.toString()).includes(expectedReason); + } } -module.exports = TestManager; \ No newline at end of file +module.exports = TestManager; diff --git a/utils/utilities.js b/utils/utilities.js index 5b04bcbc4..846b3bc54 100644 --- a/utils/utilities.js +++ b/utils/utilities.js @@ -1,102 +1,102 @@ -const ethers = require('ethers'); -const readline = require('readline'); -const ethereumUtil = require('ethereumjs-util'); +const readline = require("readline"); +const ethers = require("ethers"); + +const ETH_TOKEN = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; module.exports = { - namehash: function (_name) { - return ethers.utils.namehash(_name); - }, - - sha3: (input) => { - if (ethers.utils.isHexString(input)) { - return ethers.utils.keccak256(input); - } - return ethers.utils.keccak256(ethers.utils.toUtf8Bytes(input)); - }, - - asciiToBytes32: (input) => { - return ethers.utils.formatBytes32String(input); - //return ethers.utils.hexlify(ethers.utils.toUtf8Bytes(input)); - }, - - bigNumToBytes32: (input) => { - return ethers.utils.hexZeroPad(input.toHexString(), 32) - }, - - waitForUserInput: (text) => { - return new Promise((resolve) => { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout - }); - rl.question(text, (answer) => { - resolve(answer); - rl.close(); - }); - }); - }, - - signOffchain: async (signers, from, to, value, data, nonce, gasPrice, gasLimit) => { - let input = '0x' + [ - '0x19', - '0x00', - from, - to, - ethers.utils.hexZeroPad(ethers.utils.hexlify(value), 32), - data, - nonce, - ethers.utils.hexZeroPad(ethers.utils.hexlify(gasPrice), 32), - ethers.utils.hexZeroPad(ethers.utils.hexlify(gasLimit), 32) - ].map(hex => hex.slice(2)).join(""); - - let signedData = ethers.utils.keccak256(input); - - const tasks = signers.map(signer => signer.signMessage(ethers.utils.arrayify(signedData))); - const signatures = await Promise.all(tasks); - const sigs = "0x" + signatures.map(signature => { - const split = ethers.utils.splitSignature(signature); - return ethers.utils.joinSignature(split).slice(2); - }).join(""); - - return sigs; - }, - - sortWalletByAddress(wallets) { - return wallets.sort((s1, s2) => { - const bn1 = ethers.utils.bigNumberify(s1.address); - const bn2 = ethers.utils.bigNumberify(s2.address); - if (bn1.lt(bn2)) return -1; - if (bn1.gt(bn2)) return 1; - return 0; - }); - }, - - parseRelayReceipt(txReceipt) { - return txReceipt.events.find(l => l.event === 'TransactionExecuted').args.success; - }, - - versionFingerprint(modules) { - let concat = modules.map((module) => { - return module.address; - }).sort((m1, m2) => { - const bn1 = ethers.utils.bigNumberify(m1); - const bn2 = ethers.utils.bigNumberify(m2); - if (bn1.lt(bn2)) { - return 1; - } - if (bn1.gt(bn2)) { - return -1; - } - return 0; - }).reduce((prevValue, currentValue) => { - return prevValue + currentValue.slice(2); - }, "0x"); - return ethers.utils.keccak256(concat).slice(0, 10); - }, - getRandomAddress() { - const addressBuffer = ethereumUtil.generateAddress(Math.floor(Math.random() * (100 - 0))); - const addressHex = ethereumUtil.bufferToHex(addressBuffer); - return ethereumUtil.toChecksumAddress(addressHex); + ETH_TOKEN, + + namehash(_name) { + return ethers.utils.namehash(_name); + }, + + sha3: (input) => { + if (ethers.utils.isHexString(input)) { + return ethers.utils.keccak256(input); } -} + return ethers.utils.keccak256(ethers.utils.toUtf8Bytes(input)); + }, + + asciiToBytes32: (input) => ethers.utils.formatBytes32String(input), // return ethers.utils.hexlify(ethers.utils.toUtf8Bytes(input)); + + bigNumberify: (input) => ethers.utils.bigNumberify(input), + + bigNumToBytes32: (input) => ethers.utils.hexZeroPad(input.toHexString(), 32), + + waitForUserInput: (text) => new Promise((resolve) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + rl.question(text, (answer) => { + resolve(answer); + rl.close(); + }); + }), + + signOffchain: async (signers, from, to, value, data, nonce, gasPrice, gasLimit) => { + const input = `0x${[ + "0x19", + "0x00", + from, + to, + ethers.utils.hexZeroPad(ethers.utils.hexlify(value), 32), + data, + nonce, + ethers.utils.hexZeroPad(ethers.utils.hexlify(gasPrice), 32), + ethers.utils.hexZeroPad(ethers.utils.hexlify(gasLimit), 32), + ].map((hex) => hex.slice(2)).join("")}`; + + const signedData = ethers.utils.keccak256(input); + + const tasks = signers.map((signer) => signer.signMessage(ethers.utils.arrayify(signedData))); + const signatures = await Promise.all(tasks); + const sigs = `0x${signatures.map((signature) => { + const split = ethers.utils.splitSignature(signature); + return ethers.utils.joinSignature(split).slice(2); + }).join("")}`; + + return sigs; + }, + + sortWalletByAddress(wallets, addressKey = "address") { + return wallets.sort((s1, s2) => { + const bn1 = ethers.utils.bigNumberify(s1[addressKey]); + const bn2 = ethers.utils.bigNumberify(s2[addressKey]); + if (bn1.lt(bn2)) return -1; + if (bn1.gt(bn2)) return 1; + return 0; + }); + }, + + parseRelayReceipt(txReceipt) { + return txReceipt.events.find((l) => l.event === "TransactionExecuted").args.success; + }, + + versionFingerprint(modules) { + const concat = modules.map((module) => module.address).sort((m1, m2) => { + const bn1 = ethers.utils.bigNumberify(m1); + const bn2 = ethers.utils.bigNumberify(m2); + if (bn1.lt(bn2)) { + return 1; + } + if (bn1.gt(bn2)) { + return -1; + } + return 0; + }).reduce((prevValue, currentValue) => prevValue + currentValue.slice(2), "0x"); + return ethers.utils.keccak256(concat).slice(0, 10); + }, + + getRandomAddress() { + return ethers.Wallet.createRandom().address; + }, + + generateSaltValue() { + return ethers.utils.hexZeroPad( + ethers.utils.bigNumberify(ethers.utils.randomBytes(32)).toHexString(), + 32, + ); + }, +}; diff --git a/utils/version-uploader.js b/utils/version-uploader.js index 35b937403..910fa35e2 100644 --- a/utils/version-uploader.js +++ b/utils/version-uploader.js @@ -1,66 +1,64 @@ -"use strict" - -const AWS = require('aws-sdk'); -const fs = require('fs'); -const path = require('path'); -const fetch = require('node-fetch'); +// eslint-disable-next-line max-classes-per-file +const AWS = require("aws-sdk"); +const fs = require("fs"); +const path = require("path"); +const fetch = require("node-fetch"); const s3 = new AWS.S3(); const S3_BUCKET_FOLDER_VERSION = "version"; class VersionUploaderS3 { - constructor(bucket, baseUrl) { - this._bucket = bucket; - this._baseUrl = baseUrl; - } + constructor(bucket, baseUrl) { + this._bucket = bucket; + this._baseUrl = baseUrl; + } - async upload(version) { - let params = { - Body: JSON.stringify(version), - Bucket: this._bucket, - Key: `${S3_BUCKET_FOLDER_VERSION}/${version.fingerprint}.json` - }; - await s3.putObject(params).promise(); + async upload(version) { + let params = { + Body: JSON.stringify(version), + Bucket: this._bucket, + Key: `${S3_BUCKET_FOLDER_VERSION}/${version.fingerprint}.json`, + }; + await s3.putObject(params).promise(); - params = { - Body: JSON.stringify(version), - Bucket: this._bucket, - Key: `${S3_BUCKET_FOLDER_VERSION}/latest.json` - }; - await s3.putObject(params).promise(); - } + params = { + Body: JSON.stringify(version), + Bucket: this._bucket, + Key: `${S3_BUCKET_FOLDER_VERSION}/latest.json`, + }; + await s3.putObject(params).promise(); + } - async load(count) { - const response = await fetch(`${this._baseUrl}/versions?count=${count}`); - const json = await response.json(); - return json.versions; - } + async load(count) { + const response = await fetch(`${this._baseUrl}/versions?count=${count}`); + const json = await response.json(); + return json.versions; + } } -class VersionUploaderLocal{ - - constructor(dir, env) { - this._dir = dir; - this._env = env; - } +class VersionUploaderLocal { + constructor(dir, env) { + this._dir = dir; + this._env = env; + } - async upload(version) { - fs.writeFileSync(this._path(), JSON.stringify(version)); - } + async upload(version) { + fs.writeFileSync(this._path(), JSON.stringify(version)); + } - async load(count) { - const string = fs.readFileSync(this._path(), 'utf8'); - const json = JSON.parse(string); - return [ json ]; - } + async load(count) { // eslint-disable-line no-unused-vars + const string = fs.readFileSync(this._path(), "utf8"); + const json = JSON.parse(string); + return [json]; + } - _path() { - return path.join(this._dir, this._env ? `${this._env}.latest.json` : `latest.json`); - } + _path() { + return path.join(this._dir, this._env ? `${this._env}.latest.json` : "latest.json"); + } } module.exports = { - S3: VersionUploaderS3, - Local: VersionUploaderLocal -} + S3: VersionUploaderS3, + Local: VersionUploaderLocal, +}; diff --git a/utils/versions/ganache/latest.json b/utils/versions/ganache/latest.json index 1720f8279..1f5edfce3 100644 --- a/utils/versions/ganache/latest.json +++ b/utils/versions/ganache/latest.json @@ -1 +1 @@ -{"modules":[{"address":"0x16DBb3F310960e13F2b80c3cc8166cF6D9FeDBf8","name":"GuardianManager"},{"address":"0x963D5B228d5Fa7DE3d69F636704Cf5070d41A760","name":"LockManager"},{"address":"0x38376A367fc2Ec806155dbDFf6c0A53E3a410102","name":"RecoveryManager"},{"address":"0x994cB812bE47CEA32542954A4E134Ba2C3a1DC54","name":"ApprovedTransfer"},{"address":"0xA8Ea2087b79a3Df13506E705E5344676A9a005c7","name":"TransferManager"},{"address":"0xa0A089070C2815BeF51C6c794CeeD837ea8F48D8","name":"TokenExchanger"},{"address":"0x09628ee377BC0D20F1D7917bC22074fB9c7385E7","name":"NftTransfer"},{"address":"0x2A45A5064ad6F9b358D043A464494042dBaA2C87","name":"MakerManager"},{"address":"0xE9d45870c6C3446A87Ac4091c110E5bbed2b3468","name":"CompoundManager"},{"address":"0xEb4152Aa9a9730B89Bd61CAE8f960FF99FD0f86f","name":"UniswapManager"},{"address":"0xE50a98Af12B493df3fD762d30889cbAbb01aB6B1","name":"MakerV2Manager"}],"fingerprint":"0x891ab8dc","version":"1.0.0","createdAt":1582015161} \ No newline at end of file +{"modules":[{"address":"0x2202723Bb717f362f64b6e41086A2cf52d9Ee28f","name":"GuardianManager"},{"address":"0xc1DA53758396f84198e78f6318904C2E666fC4Ea","name":"LockManager"},{"address":"0x8ABf5fF1A1914A9B2016744363269921E47Cc844","name":"RecoveryManager"},{"address":"0x390082EDD5589a4f0a9E0F54f12d30C34b2f4B96","name":"ApprovedTransfer"},{"address":"0xa743067A965CBE5c2D3d9fa6DEf30100103e0728","name":"TransferManager"},{"address":"0xA64fEeD186483380ad10496C4C9fADd89494633C","name":"TokenExchanger"},{"address":"0x85D24B941A22D5DA687c607769173F01Abc61A56","name":"NftTransfer"},{"address":"0x2718cAce241213B18F67C6d66B245EE77DB0Ce2a","name":"MakerManager"},{"address":"0x1362D309a42165bC6dC00Be56D32625dF2C2c517","name":"CompoundManager"},{"address":"0xe0856C93172F8980424258c2e1cCaa958249dE9F","name":"MakerV2Manager"}],"fingerprint":"0x2392b3f9","version":"1.0.0","createdAt":1588756681} \ No newline at end of file diff --git a/utils/versions/kovan-fork/latest.json b/utils/versions/kovan-fork/latest.json new file mode 100644 index 000000000..c34d05afc --- /dev/null +++ b/utils/versions/kovan-fork/latest.json @@ -0,0 +1 @@ +{"version":"1.5.2","createdAt":1574338831,"modules":[{"address":"0x6ECCdA0FecB562194d88634D27BBa71923Aea147","name":"GuardianManager"},{"address":"0xF550f98977e9c0428AD6C80718B8673f376982E6","name":"LockManager"},{"address":"0xaf37A95CAfc7C099b0456558a044599FDe479F0E","name":"RecoveryManager"},{"address":"0x8F10C308a7bC1BA961146b0F9F055184edfB62B8","name":"TokenExchanger"},{"address":"0x73c891Ea8dF8FDF7B11D6cb1293C5f027BBd98EC","name":"NftTransfer"},{"address":"0x9CC109e69AA1CB3716DB4354673E3d72A7887CF1","name":"MakerManager"},{"address":"0x4E411a5CCBdd3029a9e14251D6d1A0bC311734A3","name":"CompoundManager"},{"address":"0x263FF313cBE78CDbF6FAB9aC8Dd47727f58Bc65D","name":"UniswapManager"},{"address":"0x247E448D0b1B374eE1BaE4eC6032B45DD55e98F9","name":"TransferManager"},{"address":"0xB21D47fFc3f90314Faab6df5772A58694890e668","name":"ApprovedTransfer"},{"address":"0x69750794c8F3a6A584f850745aF3552158984b99","name":"MakerV2Manager"}],"fingerprint":"0xfbedb8f7"} \ No newline at end of file diff --git a/utils/versions/kovan/latest.json b/utils/versions/kovan/latest.json index 597969587..438fbccff 100644 --- a/utils/versions/kovan/latest.json +++ b/utils/versions/kovan/latest.json @@ -1,47 +1 @@ -{ - "version": "1.4.3", - "createdAt": 1569921953, - "modules": [ - { - "address": "0xdca8F3833cE8f22F31C797515C02bDB91D9CC64c", - "name": "GuardianManager" - }, - { - "address": "0x5E198b65195BA1670A8676c37D6CdDA06FBfFbB1", - "name": "LockManager" - }, - { - "address": "0xc1F4D3ac03C3052dDD91D1Dd6B293A7004247983", - "name": "RecoveryManager" - }, - { - "address": "0x040c604e6337cE17AcD3C124ad03594A94e50fdA", - "name": "ApprovedTransfer" - }, - { - "address": "0xb81eC49d93Ed336771C1bC6448bFB262403fEef4", - "name": "TokenTransfer" - }, - { - "address": "0x0cA65A4a7338Db5E94Aa083B3a60eEB75074f831", - "name": "DappManager" - }, - { - "address": "0xBE29E9569b4a40aaC421599F8F61394c03B1C918", - "name": "TokenExchanger" - }, - { - "address": "0xEcE4e5209BEfF3B5E3b77985A84674f08B74B90B", - "name": "NftTransfer" - }, - { - "address": "0x0E1499B090A8791Ec29a9656Fb85122fF8BCbD5e", - "name": "MakerManager" - }, - { - "address": "0x0a78ECd7db74B00C010177E930EA429F0C7e0242", - "name": "MakerV2Manager" - } - ], - "fingerprint": "0x86a9153a" -} \ No newline at end of file +{"version":"1.5.1","createdAt":1573760786,"modules":[{"address":"0x96b8b73D55C713CEBfb1eee3D5F476766F679669","name":"GuardianManager"},{"address":"0x9b7fC8EF0a625451FA0F21422d2Dd4164f6cf82E","name":"LockManager"},{"address":"0x479120703c51aE2a242F1D04815289f8BB2CdAED","name":"RecoveryManager"},{"address":"0xd9CE60816ADF1E365f04Dea96AAF2775942C42C6","name":"TokenExchanger"},{"address":"0xCAb6F3134894C10Bd357335D00412e0586fcE85E","name":"NftTransfer"},{"address":"0x74BB0268ABf905C1Eb12f8300249070B56E76d77","name":"MakerManager"},{"address":"0xbf32494BedC3AcAccBb54F8560262A80609a1ABD","name":"CompoundManager"},{"address":"0x0960772cAf2Ff08764cF15F86c09fA4F20B0Bc9c","name":"UniswapManager"},{"address":"0xcE7968f585fCe79AD1161A766F13aBd3375a0185","name":"TransferManager"},{"address":"0xA825F25958F9C68573A3Ceb827345107CEdE0Aa8","name":"ApprovedTransfer"},{"address":"0x7bb678505B6729f40bB1BE34572685766009492f","name":"MakerV2Manager"}],"fingerprint":"0x56356b4e"} \ No newline at end of file