From 78be404a703a6131a992189964f3ec6d90980db0 Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Tue, 7 Jul 2020 23:06:29 +1000 Subject: [PATCH 01/22] Adding synthetix staking rewards protocol; --- contracts/connectors/synthetix.sol | 85 ++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 contracts/connectors/synthetix.sol diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol new file mode 100644 index 0000000..d877a5a --- /dev/null +++ b/contracts/connectors/synthetix.sol @@ -0,0 +1,85 @@ +pragma solidity ^0.6.0; + +// import files from common directory +import { Stores } from "../common/stores.sol"; +// import { DSMath } from "../common/math.sol"; +import { TokenInterface } from "../common/interfaces.sol"; + +interface IStakingRewards { + function stake(uint256 amount) public; + function exit() external; +} + +contract Helper is Stores { + function getSynthetixStakingAddr(address token) internal view returns(address){ + if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ + return 0x13c1542a468319688b89e323fe9a3be3a90ebb27; + }else if (token == address(0xC25a3A3b969415c80451098fa907EC722572917F)){ + return 0xdcb6a51ea3ca5d3fd898fd6564757c7aaec3ca92; + }else{ + revert("token-not-found"); + } + } +} + +contract SynthetixStakingRewardsProtocol is Helper { + + // Events + event LogStake( + address stakeAddr, + uint256 stakeAmt + ); + event LogExit( + address stakeAddr + ); + + /** + * @dev Stake Token. + * @param stakeAddr staking token address. + * @param stakeAmt staking token amount. + */ + function stake( + address stakeAddr, + uint stakeAmt, + uint getId, + ) external { + uint _stakeAmt = getUint(getId, stakeAmt); + IStakingRewards rewardPool = IStakingRewards(getSynthetixStakingAddr(stakeAddr)); + TokenInterface _stakeToken = TokenInterface(stakeAddr); + _stakeAmt = _stakeAmt == uint(-1) ? _stakeToken.balanceOf(address(this)) : _stakeAmt; + _stakeToken.approve(address(rewardPool), _stakeAmt); + + rewardPool.stake(_stakeAmt); + + emit LogStake(address(this), _stakeAmt); + bytes32 _eventCode = keccak256("LogStake(address,uint256)"); + bytes memory _eventParam = abi.encode(stakeAddr, _stakeAmt); + emitEvent(_eventCode, _eventParam); + } + + /** + * @dev Exit Token. + * @param token token address. + * @param amt token amount. + * @param unitAmt unit amount of curve_amt/token_amt with slippage. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ + function exit( + address stakeAddr + ) external { + IStakingRewards rewardPool = IStakingRewards(getSynthetixStakingAddr(stakeAddr)); + + rewardPool.exit(); + + emit LogExit(stakeAddr); + bytes32 _eventCode = keccak256("LogExit(address)"); + bytes memory _eventParam = abi.encode(stakeAddr); + emitEvent(_eventCode, _eventParam); + } + +} + +contract ConnectSynthetixStakingRewardsProtocol is SynthetixStakingRewardsProtocol { + string public name = "synthetix-staking-v1"; +} From 1fde0d19d5ba6e94a5fb87defd6b8287f51217bf Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Tue, 7 Jul 2020 23:12:25 +1000 Subject: [PATCH 02/22] adding comment for stakeToken --- contracts/connectors/synthetix.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index d877a5a..9b5a387 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -12,8 +12,10 @@ interface IStakingRewards { contract Helper is Stores { function getSynthetixStakingAddr(address token) internal view returns(address){ + // SBTC if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ return 0x13c1542a468319688b89e323fe9a3be3a90ebb27; + // SUSD }else if (token == address(0xC25a3A3b969415c80451098fa907EC722572917F)){ return 0xdcb6a51ea3ca5d3fd898fd6564757c7aaec3ca92; }else{ From c22ffbf20d1322f23af5971904fdbdeb9eda7392 Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Tue, 7 Jul 2020 23:41:52 +1000 Subject: [PATCH 03/22] fixing interface to use external; fixing address format and document params; --- contracts/connectors/synthetix.sol | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index 9b5a387..adc3854 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -6,7 +6,7 @@ import { Stores } from "../common/stores.sol"; import { TokenInterface } from "../common/interfaces.sol"; interface IStakingRewards { - function stake(uint256 amount) public; + function stake(uint256 amount) external; function exit() external; } @@ -14,10 +14,10 @@ contract Helper is Stores { function getSynthetixStakingAddr(address token) internal view returns(address){ // SBTC if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ - return 0x13c1542a468319688b89e323fe9a3be3a90ebb27; + return 0x13C1542A468319688B89E323fe9A3Be3A90EBb27; // SUSD }else if (token == address(0xC25a3A3b969415c80451098fa907EC722572917F)){ - return 0xdcb6a51ea3ca5d3fd898fd6564757c7aaec3ca92; + return 0xDCB6A51eA3CA5d3Fd898Fd6564757c7aAeC3ca92; }else{ revert("token-not-found"); } @@ -39,11 +39,12 @@ contract SynthetixStakingRewardsProtocol is Helper { * @dev Stake Token. * @param stakeAddr staking token address. * @param stakeAmt staking token amount. + * @param getId Get token amount at this ID from `InstaMemory` Contract. */ function stake( address stakeAddr, uint stakeAmt, - uint getId, + uint getId ) external { uint _stakeAmt = getUint(getId, stakeAmt); IStakingRewards rewardPool = IStakingRewards(getSynthetixStakingAddr(stakeAddr)); @@ -61,11 +62,6 @@ contract SynthetixStakingRewardsProtocol is Helper { /** * @dev Exit Token. - * @param token token address. - * @param amt token amount. - * @param unitAmt unit amount of curve_amt/token_amt with slippage. - * @param getId Get token amount at this ID from `InstaMemory` Contract. - * @param setId Set token amount at this ID in `InstaMemory` Contract. */ function exit( address stakeAddr From 785a91b7587458824639a0d5b534f4ba20e240f3 Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Wed, 8 Jul 2020 00:43:14 +1000 Subject: [PATCH 04/22] adding withdraw and getReward; --- contracts/connectors/synthetix.sol | 37 ++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index adc3854..4dbdd2f 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -8,6 +8,8 @@ import { TokenInterface } from "../common/interfaces.sol"; interface IStakingRewards { function stake(uint256 amount) external; function exit() external; + function withdraw(uint256 amount) external; + function getReward() external; } contract Helper is Stores { @@ -29,10 +31,13 @@ contract SynthetixStakingRewardsProtocol is Helper { // Events event LogStake( address stakeAddr, - uint256 stakeAmt + uint256 stakeAmt, + uint getId ); event LogExit( - address stakeAddr + address stakeAddr, + uint256 stakeAmt, + uint getId ); /** @@ -54,25 +59,37 @@ contract SynthetixStakingRewardsProtocol is Helper { rewardPool.stake(_stakeAmt); - emit LogStake(address(this), _stakeAmt); - bytes32 _eventCode = keccak256("LogStake(address,uint256)"); - bytes memory _eventParam = abi.encode(stakeAddr, _stakeAmt); + emit LogStake(stakeAddr, _stakeAmt, getId); + bytes32 _eventCode = keccak256("LogStake(address,uint256, uint256)"); + bytes memory _eventParam = abi.encode(stakeAddr, _stakeAmt, getId); emitEvent(_eventCode, _eventParam); } /** * @dev Exit Token. + * @param stakeAddr staking token address. + * @param stakeAmt staking token amount. + * @param getId Get token amount at this ID from `InstaMemory` Contract. */ function exit( - address stakeAddr + address stakeAddr, + uint stakeAmt, + uint getId ) external { + uint _stakeAmt = getUint(getId, stakeAmt); IStakingRewards rewardPool = IStakingRewards(getSynthetixStakingAddr(stakeAddr)); - rewardPool.exit(); + if(_stakeAmt == uint(-1)){ + rewardPool.exit(); + } + else{ + rewardPool.withdraw(_stakeAmt); + rewardPool.getReward(); + } - emit LogExit(stakeAddr); - bytes32 _eventCode = keccak256("LogExit(address)"); - bytes memory _eventParam = abi.encode(stakeAddr); + emit LogExit(stakeAddr, _stakeAmt, getId); + bytes32 _eventCode = keccak256("LogExit(address, uint256, uint256)"); + bytes memory _eventParam = abi.encode(stakeAddr, _stakeAmt, getId); emitEvent(_eventCode, _eventParam); } From 7f5c9b50713416d347826b661a6e90d3c82a3d64 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Tue, 7 Jul 2020 20:35:19 +0530 Subject: [PATCH 05/22] Code refactoring --- contracts/connectors/synthetix.sol | 118 ++++++++++++++++------------- 1 file changed, 67 insertions(+), 51 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index 4dbdd2f..61ce638 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -2,7 +2,7 @@ pragma solidity ^0.6.0; // import files from common directory import { Stores } from "../common/stores.sol"; -// import { DSMath } from "../common/math.sol"; +import { DSMath } from "../common/math.sol"; import { TokenInterface } from "../common/interfaces.sol"; interface IStakingRewards { @@ -12,89 +12,105 @@ interface IStakingRewards { function getReward() external; } -contract Helper is Stores { - function getSynthetixStakingAddr(address token) internal view returns(address){ - // SBTC +contract SynthetixStakingHelper is DSMath, Stores { + function getSynthetixStakingAddr(address token) internal pure returns(address){ if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ + // SBTC return 0x13C1542A468319688B89E323fe9A3Be3A90EBb27; - // SUSD - }else if (token == address(0xC25a3A3b969415c80451098fa907EC722572917F)){ + } else if (token == address(0xC25a3A3b969415c80451098fa907EC722572917F)){ + // SUSD return 0xDCB6A51eA3CA5d3Fd898Fd6564757c7aAeC3ca92; - }else{ + } else { revert("token-not-found"); } } + + function getSnxAddr() internal pure returns (address) { + return 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; + } } -contract SynthetixStakingRewardsProtocol is Helper { +contract SynthetixStaking is SynthetixStakingHelper { // Events - event LogStake( - address stakeAddr, - uint256 stakeAmt, - uint getId + event LogDeposit( + address token, + uint256 amount, + uint getId, + uint setId ); - event LogExit( - address stakeAddr, - uint256 stakeAmt, - uint getId + event LogWithdraw( + address token, + uint256 amount, + uint256 rewardAmt, + uint getId, + uint setId ); /** - * @dev Stake Token. - * @param stakeAddr staking token address. - * @param stakeAmt staking token amount. + * @dev Deposit Token. + * @param token staking token address. + * @param amt staking token amount. * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. */ - function stake( - address stakeAddr, - uint stakeAmt, - uint getId + function deposit( + address token, + uint amt, + uint getId, + uint setId ) external { - uint _stakeAmt = getUint(getId, stakeAmt); - IStakingRewards rewardPool = IStakingRewards(getSynthetixStakingAddr(stakeAddr)); - TokenInterface _stakeToken = TokenInterface(stakeAddr); - _stakeAmt = _stakeAmt == uint(-1) ? _stakeToken.balanceOf(address(this)) : _stakeAmt; - _stakeToken.approve(address(rewardPool), _stakeAmt); + uint _amt = getUint(getId, amt); + IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); + TokenInterface _stakeToken = TokenInterface(token); + _amt = _amt == uint(-1) ? _stakeToken.balanceOf(address(this)) : _amt; - rewardPool.stake(_stakeAmt); + _stakeToken.approve(address(stakingContract), _amt); + stakingContract.stake(_amt); - emit LogStake(stakeAddr, _stakeAmt, getId); - bytes32 _eventCode = keccak256("LogStake(address,uint256, uint256)"); - bytes memory _eventParam = abi.encode(stakeAddr, _stakeAmt, getId); + emit LogDeposit(token, _amt, getId, setId); + bytes32 _eventCode = keccak256("LogDeposit(address,uint256,uint256,uint256)"); + bytes memory _eventParam = abi.encode(token, _amt, getId, setId); emitEvent(_eventCode, _eventParam); } /** - * @dev Exit Token. - * @param stakeAddr staking token address. - * @param stakeAmt staking token amount. + * @dev Withdraw Token. + * @param token staking token address. + * @param amt staking token amount. * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. */ - function exit( - address stakeAddr, - uint stakeAmt, - uint getId + function withdraw( + address token, + uint amt, + uint getId, + uint setId ) external { - uint _stakeAmt = getUint(getId, stakeAmt); - IStakingRewards rewardPool = IStakingRewards(getSynthetixStakingAddr(stakeAddr)); + uint _amt = getUint(getId, amt); + IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); + TokenInterface snxToken = TokenInterface(getSnxAddr()); - if(_stakeAmt == uint(-1)){ - rewardPool.exit(); - } - else{ - rewardPool.withdraw(_stakeAmt); - rewardPool.getReward(); + uint intialBal = snxToken.balanceOf(address(this)); + if (_amt == uint(-1)) { + stakingContract.exit(); + } else{ + stakingContract.withdraw(_amt); + stakingContract.getReward(); } + uint finalBal = snxToken.balanceOf(address(this)); - emit LogExit(stakeAddr, _stakeAmt, getId); - bytes32 _eventCode = keccak256("LogExit(address, uint256, uint256)"); - bytes memory _eventParam = abi.encode(stakeAddr, _stakeAmt, getId); + uint rewardAmt = sub(finalBal, intialBal); + + setUint(setId, _amt); + emit LogWithdraw(token, _amt, rewardAmt, getId, setId); + bytes32 _eventCode = keccak256("LogWithdraw(address,uint256,uint256,uint256,uint256)"); + bytes memory _eventParam = abi.encode(token, _amt, rewardAmt, getId, setId); emitEvent(_eventCode, _eventParam); } } -contract ConnectSynthetixStakingRewardsProtocol is SynthetixStakingRewardsProtocol { +contract ConnectSynthetixStaking is SynthetixStaking { string public name = "synthetix-staking-v1"; } From abeb50aedbf5cb9664c0b7b6849042e853dfc2c1 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Tue, 7 Jul 2020 20:37:31 +0530 Subject: [PATCH 06/22] made every public function as payable function --- contracts/connectors/synthetix.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index 61ce638..c54715a 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -13,7 +13,7 @@ interface IStakingRewards { } contract SynthetixStakingHelper is DSMath, Stores { - function getSynthetixStakingAddr(address token) internal pure returns(address){ + function getSynthetixStakingAddr(address token) internal pure returns (address){ if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ // SBTC return 0x13C1542A468319688B89E323fe9A3Be3A90EBb27; @@ -59,7 +59,7 @@ contract SynthetixStaking is SynthetixStakingHelper { uint amt, uint getId, uint setId - ) external { + ) external payable { uint _amt = getUint(getId, amt); IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); TokenInterface _stakeToken = TokenInterface(token); @@ -86,7 +86,7 @@ contract SynthetixStaking is SynthetixStakingHelper { uint amt, uint getId, uint setId - ) external { + ) external payable { uint _amt = getUint(getId, amt); IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); TokenInterface snxToken = TokenInterface(getSnxAddr()); From 54c74291063dfccd92c4b5bad43752348aef1541 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Tue, 7 Jul 2020 20:40:27 +0530 Subject: [PATCH 07/22] Added comments --- contracts/connectors/synthetix.sol | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index c54715a..3b44552 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -1,9 +1,9 @@ pragma solidity ^0.6.0; // import files from common directory +import { TokenInterface } from "../common/interfaces.sol"; import { Stores } from "../common/stores.sol"; import { DSMath } from "../common/math.sol"; -import { TokenInterface } from "../common/interfaces.sol"; interface IStakingRewards { function stake(uint256 amount) external; @@ -13,6 +13,9 @@ interface IStakingRewards { } contract SynthetixStakingHelper is DSMath, Stores { + /** + * @dev Return Synthetix staking pool address. + */ function getSynthetixStakingAddr(address token) internal pure returns (address){ if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ // SBTC @@ -25,6 +28,9 @@ contract SynthetixStakingHelper is DSMath, Stores { } } + /** + * @dev Return Synthetix Token address. + */ function getSnxAddr() internal pure returns (address) { return 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; } @@ -108,7 +114,6 @@ contract SynthetixStaking is SynthetixStakingHelper { bytes memory _eventParam = abi.encode(token, _amt, rewardAmt, getId, setId); emitEvent(_eventCode, _eventParam); } - } contract ConnectSynthetixStaking is SynthetixStaking { From acf0654525c8c274ce02a38f521b0208103032b7 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Tue, 7 Jul 2020 21:14:33 +0530 Subject: [PATCH 08/22] Added setId in deposit function --- contracts/connectors/synthetix.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index 3b44552..e6ff8d0 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -73,7 +73,8 @@ contract SynthetixStaking is SynthetixStakingHelper { _stakeToken.approve(address(stakingContract), _amt); stakingContract.stake(_amt); - + + setUint(setId, _amt); emit LogDeposit(token, _amt, getId, setId); bytes32 _eventCode = keccak256("LogDeposit(address,uint256,uint256,uint256)"); bytes memory _eventParam = abi.encode(token, _amt, getId, setId); From 3bb6ab8a521e2bff752bd4607c4efeaf34360f4a Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Wed, 8 Jul 2020 23:55:25 +1000 Subject: [PATCH 09/22] remove trailing spaces; added mocks contract; adding tests; --- contracts/Mocks.sol | 373 +++++++++++++++++++++++++++++ contracts/connectors/synthetix.sol | 2 +- test/SynthetixProtocol.js | 28 +++ 3 files changed, 402 insertions(+), 1 deletion(-) create mode 100644 contracts/Mocks.sol create mode 100644 test/SynthetixProtocol.js diff --git a/contracts/Mocks.sol b/contracts/Mocks.sol new file mode 100644 index 0000000..7062cf1 --- /dev/null +++ b/contracts/Mocks.sol @@ -0,0 +1,373 @@ +pragma solidity ^0.6.0; + +interface MockInterface { + /** + * @dev After calling this method, the mock will return `response` when it is called + * with any calldata that is not mocked more specifically below + * (e.g. using givenMethodReturn). + * @param response ABI encoded response that will be returned if method is invoked + */ + function givenAnyReturn(bytes calldata response) external; + function givenAnyReturnBool(bool response) external; + function givenAnyReturnUint(uint response) external; + function givenAnyReturnAddress(address response) external; + + function givenAnyRevert() external; + function givenAnyRevertWithMessage(string calldata message) external; + function givenAnyRunOutOfGas() external; + + /** + * @dev After calling this method, the mock will return `response` when the given + * methodId is called regardless of arguments. If the methodId and arguments + * are mocked more specifically (using `givenMethodAndArguments`) the latter + * will take precedence. + * @param method ABI encoded methodId. It is valid to pass full calldata (including arguments). The mock will extract the methodId from it + * @param response ABI encoded response that will be returned if method is invoked + */ + function givenMethodReturn(bytes calldata method, bytes calldata response) external; + function givenMethodReturnBool(bytes calldata method, bool response) external; + function givenMethodReturnUint(bytes calldata method, uint response) external; + function givenMethodReturnAddress(bytes calldata method, address response) external; + + function givenMethodRevert(bytes calldata method) external; + function givenMethodRevertWithMessage(bytes calldata method, string calldata message) external; + function givenMethodRunOutOfGas(bytes calldata method) external; + + /** + * @dev After calling this method, the mock will return `response` when the given + * methodId is called with matching arguments. These exact calldataMocks will take + * precedence over all other calldataMocks. + * @param call ABI encoded calldata (methodId and arguments) + * @param response ABI encoded response that will be returned if contract is invoked with calldata + */ + function givenCalldataReturn(bytes calldata call, bytes calldata response) external; + function givenCalldataReturnBool(bytes calldata call, bool response) external; + function givenCalldataReturnUint(bytes calldata call, uint response) external; + function givenCalldataReturnAddress(bytes calldata call, address response) external; + + function givenCalldataRevert(bytes calldata call) external; + function givenCalldataRevertWithMessage(bytes calldata call, string calldata message) external; + function givenCalldataRunOutOfGas(bytes calldata call) external; + + /** + * @dev Returns the number of times anything has been called on this mock since last reset + */ + function invocationCount() external returns (uint); + + /** + * @dev Returns the number of times the given method has been called on this mock since last reset + * @param method ABI encoded methodId. It is valid to pass full calldata (including arguments). The mock will extract the methodId from it + */ + function invocationCountForMethod(bytes calldata method) external returns (uint); + + /** + * @dev Returns the number of times this mock has been called with the exact calldata since last reset. + * @param call ABI encoded calldata (methodId and arguments) + */ + function invocationCountForCalldata(bytes calldata call) external returns (uint); + + /** + * @dev Resets all mocked methods and invocation counts. + */ + function reset() external; +} + +/** + * Implementation of the MockInterface. + */ +contract MockContract is MockInterface { + enum MockType { Return, Revert, OutOfGas } + + bytes32 public constant MOCKS_LIST_START = hex"01"; + bytes public constant MOCKS_LIST_END = "0xff"; + bytes32 public constant MOCKS_LIST_END_HASH = keccak256(MOCKS_LIST_END); + bytes4 public constant SENTINEL_ANY_MOCKS = hex"01"; + bytes public constant DEFAULT_FALLBACK_VALUE = abi.encode(false); + + // A linked list allows easy iteration and inclusion checks + mapping(bytes32 => bytes) calldataMocks; + mapping(bytes => MockType) calldataMockTypes; + mapping(bytes => bytes) calldataExpectations; + mapping(bytes => string) calldataRevertMessage; + mapping(bytes32 => uint) calldataInvocations; + + mapping(bytes4 => bytes4) methodIdMocks; + mapping(bytes4 => MockType) methodIdMockTypes; + mapping(bytes4 => bytes) methodIdExpectations; + mapping(bytes4 => string) methodIdRevertMessages; + mapping(bytes32 => uint) methodIdInvocations; + + MockType fallbackMockType; + bytes fallbackExpectation = DEFAULT_FALLBACK_VALUE; + string fallbackRevertMessage; + uint invocations; + uint resetCount; + + constructor() public { + calldataMocks[MOCKS_LIST_START] = MOCKS_LIST_END; + methodIdMocks[SENTINEL_ANY_MOCKS] = SENTINEL_ANY_MOCKS; + } + + function trackCalldataMock(bytes memory call) private { + bytes32 callHash = keccak256(call); + if (calldataMocks[callHash].length == 0) { + calldataMocks[callHash] = calldataMocks[MOCKS_LIST_START]; + calldataMocks[MOCKS_LIST_START] = call; + } + } + + function trackMethodIdMock(bytes4 methodId) private { + if (methodIdMocks[methodId] == 0x0) { + methodIdMocks[methodId] = methodIdMocks[SENTINEL_ANY_MOCKS]; + methodIdMocks[SENTINEL_ANY_MOCKS] = methodId; + } + } + + function _givenAnyReturn(bytes memory response) internal { + fallbackMockType = MockType.Return; + fallbackExpectation = response; + } + + function givenAnyReturn(bytes calldata response) override external { + _givenAnyReturn(response); + } + + function givenAnyReturnBool(bool response) override external { + uint flag = response ? 1 : 0; + _givenAnyReturn(uintToBytes(flag)); + } + + function givenAnyReturnUint(uint response) override external { + _givenAnyReturn(uintToBytes(response)); + } + + function givenAnyReturnAddress(address response) override external { + _givenAnyReturn(uintToBytes(uint(response))); + } + + function givenAnyRevert() override external { + fallbackMockType = MockType.Revert; + fallbackRevertMessage = ""; + } + + function givenAnyRevertWithMessage(string calldata message) override external { + fallbackMockType = MockType.Revert; + fallbackRevertMessage = message; + } + + function givenAnyRunOutOfGas() override external { + fallbackMockType = MockType.OutOfGas; + } + + function _givenCalldataReturn(bytes memory call, bytes memory response) private { + calldataMockTypes[call] = MockType.Return; + calldataExpectations[call] = response; + trackCalldataMock(call); + } + + function givenCalldataReturn(bytes calldata call, bytes calldata response) override external { + _givenCalldataReturn(call, response); + } + + function givenCalldataReturnBool(bytes calldata call, bool response) override external { + uint flag = response ? 1 : 0; + _givenCalldataReturn(call, uintToBytes(flag)); + } + + function givenCalldataReturnUint(bytes calldata call, uint response) override external { + _givenCalldataReturn(call, uintToBytes(response)); + } + + function givenCalldataReturnAddress(bytes calldata call, address response) override external { + _givenCalldataReturn(call, uintToBytes(uint(response))); + } + + function _givenMethodReturn(bytes memory call, bytes memory response) private { + bytes4 method = bytesToBytes4(call); + methodIdMockTypes[method] = MockType.Return; + methodIdExpectations[method] = response; + trackMethodIdMock(method); + } + + function givenMethodReturn(bytes calldata call, bytes calldata response) override external { + _givenMethodReturn(call, response); + } + + function givenMethodReturnBool(bytes calldata call, bool response) override external { + uint flag = response ? 1 : 0; + _givenMethodReturn(call, uintToBytes(flag)); + } + + function givenMethodReturnUint(bytes calldata call, uint response) override external { + _givenMethodReturn(call, uintToBytes(response)); + } + + function givenMethodReturnAddress(bytes calldata call, address response) override external { + _givenMethodReturn(call, uintToBytes(uint(response))); + } + + function givenCalldataRevert(bytes calldata call) override external { + calldataMockTypes[call] = MockType.Revert; + calldataRevertMessage[call] = ""; + trackCalldataMock(call); + } + + function givenMethodRevert(bytes calldata call) override external { + bytes4 method = bytesToBytes4(call); + methodIdMockTypes[method] = MockType.Revert; + trackMethodIdMock(method); + } + + function givenCalldataRevertWithMessage(bytes calldata call, string calldata message) override external { + calldataMockTypes[call] = MockType.Revert; + calldataRevertMessage[call] = message; + trackCalldataMock(call); + } + + function givenMethodRevertWithMessage(bytes calldata call, string calldata message) override external { + bytes4 method = bytesToBytes4(call); + methodIdMockTypes[method] = MockType.Revert; + methodIdRevertMessages[method] = message; + trackMethodIdMock(method); + } + + function givenCalldataRunOutOfGas(bytes calldata call) override external { + calldataMockTypes[call] = MockType.OutOfGas; + trackCalldataMock(call); + } + + function givenMethodRunOutOfGas(bytes calldata call) override external { + bytes4 method = bytesToBytes4(call); + methodIdMockTypes[method] = MockType.OutOfGas; + trackMethodIdMock(method); + } + + function invocationCount() override external returns (uint) { + return invocations; + } + + function invocationCountForMethod(bytes calldata call) override external returns (uint) { + bytes4 method = bytesToBytes4(call); + return methodIdInvocations[keccak256(abi.encodePacked(resetCount, method))]; + } + + function invocationCountForCalldata(bytes calldata call) override external returns (uint) { + return calldataInvocations[keccak256(abi.encodePacked(resetCount, call))]; + } + + function reset() override external { + // Reset all exact calldataMocks + bytes memory nextMock = calldataMocks[MOCKS_LIST_START]; + bytes32 mockHash = keccak256(nextMock); + // We cannot compary bytes + while(mockHash != MOCKS_LIST_END_HASH) { + // Reset all mock maps + calldataMockTypes[nextMock] = MockType.Return; + calldataExpectations[nextMock] = hex""; + calldataRevertMessage[nextMock] = ""; + // Set next mock to remove + nextMock = calldataMocks[mockHash]; + // Remove from linked list + calldataMocks[mockHash] = ""; + // Update mock hash + mockHash = keccak256(nextMock); + } + // Clear list + calldataMocks[MOCKS_LIST_START] = MOCKS_LIST_END; + + // Reset all any calldataMocks + bytes4 nextAnyMock = methodIdMocks[SENTINEL_ANY_MOCKS]; + while(nextAnyMock != SENTINEL_ANY_MOCKS) { + bytes4 currentAnyMock = nextAnyMock; + methodIdMockTypes[currentAnyMock] = MockType.Return; + methodIdExpectations[currentAnyMock] = hex""; + methodIdRevertMessages[currentAnyMock] = ""; + nextAnyMock = methodIdMocks[currentAnyMock]; + // Remove from linked list + methodIdMocks[currentAnyMock] = 0x0; + } + // Clear list + methodIdMocks[SENTINEL_ANY_MOCKS] = SENTINEL_ANY_MOCKS; + + fallbackExpectation = DEFAULT_FALLBACK_VALUE; + fallbackMockType = MockType.Return; + invocations = 0; + resetCount += 1; + } + + function useAllGas() private { + while(true) { + bool s; + assembly { + //expensive call to EC multiply contract + s := call(sub(gas(), 2000), 6, 0, 0x0, 0xc0, 0x0, 0x60) + } + } + } + + function bytesToBytes4(bytes memory b) private pure returns (bytes4) { + bytes4 out; + for (uint i = 0; i < 4; i++) { + out |= bytes4(b[i] & 0xFF) >> (i * 8); + } + return out; + } + + function uintToBytes(uint256 x) private pure returns (bytes memory b) { + b = new bytes(32); + assembly { mstore(add(b, 32), x) } + } + + function updateInvocationCount(bytes4 methodId, bytes memory originalMsgData) public { + require(msg.sender == address(this), "Can only be called from the contract itself"); + invocations += 1; + methodIdInvocations[keccak256(abi.encodePacked(resetCount, methodId))] += 1; + calldataInvocations[keccak256(abi.encodePacked(resetCount, originalMsgData))] += 1; + } + + fallback () payable external { + bytes4 methodId; + assembly { + methodId := calldataload(0) + } + + // First, check exact matching overrides + if (calldataMockTypes[msg.data] == MockType.Revert) { + revert(calldataRevertMessage[msg.data]); + } + if (calldataMockTypes[msg.data] == MockType.OutOfGas) { + useAllGas(); + } + bytes memory result = calldataExpectations[msg.data]; + + // Then check method Id overrides + if (result.length == 0) { + if (methodIdMockTypes[methodId] == MockType.Revert) { + revert(methodIdRevertMessages[methodId]); + } + if (methodIdMockTypes[methodId] == MockType.OutOfGas) { + useAllGas(); + } + result = methodIdExpectations[methodId]; + } + + // Last, use the fallback override + if (result.length == 0) { + if (fallbackMockType == MockType.Revert) { + revert(fallbackRevertMessage); + } + if (fallbackMockType == MockType.OutOfGas) { + useAllGas(); + } + result = fallbackExpectation; + } + + // Record invocation as separate call so we don't rollback in case we are called with STATICCALL + (, bytes memory r) = address(this).call.gas(100000)(abi.encodeWithSignature("updateInvocationCount(bytes4,bytes)", methodId, msg.data)); + assert(r.length == 0); + + assembly { + return(add(0x20, result), mload(result)) + } + } +} diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index e6ff8d0..3d03402 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -73,7 +73,7 @@ contract SynthetixStaking is SynthetixStakingHelper { _stakeToken.approve(address(stakingContract), _amt); stakingContract.stake(_amt); - + setUint(setId, _amt); emit LogDeposit(token, _amt, getId, setId); bytes32 _eventCode = keccak256("LogDeposit(address,uint256,uint256,uint256)"); diff --git a/test/SynthetixProtocol.js b/test/SynthetixProtocol.js new file mode 100644 index 0000000..c24a8ec --- /dev/null +++ b/test/SynthetixProtocol.js @@ -0,0 +1,28 @@ +const { + BN, // Big Number support + expectEvent, // Assertions for emitted events + expectRevert, // Assertions for transactions that should fail + balance, + ether +} = require('@openzeppelin/test-helpers'); + +const MockContract = artifacts.require("MockContract.sol") + +const ConnectSynthetixStaking = artifacts.require('ConnectSynthetixStaking'); +const erc20ABI = require("./abi/erc20.js"); +contract('ConnectSynthetixStaking', async accounts => { + const [sender, receiver] = accounts; + before(async function () { + const mock = await MockContract.new() + const crvRenWSBTCContract = new web3.eth.Contract(erc20ABI, mock.address); + let methodId = await crvRenWSBTCContract.methods.banlanceOf.getData(0,0); + console.log("methodId: ", methodId); + await mock.givenMethodReturn(methodId, abi.rawEncode(['uint'], [10000000]).toString()); + + let crvRenWSBTC = await crvRenWSBTCContract.methods.balanceOf(sender).call(); + console.log("Sender crvRenWSBTC Before: ", crvRenWSBTC.toString()); + + expect(crvRenWSBTC).to.be(10000000); + // expect(wbtcAfter - wbtcBefore).to.be.at.least(10000000); + }) +}) From 3d4c23a99801292adb41524f796a9af6b1f7df19 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Thu, 9 Jul 2020 16:51:39 +0530 Subject: [PATCH 10/22] Added claimReward function --- contracts/connectors/synthetix.sol | 54 +++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index e6ff8d0..e46c494 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -48,10 +48,14 @@ contract SynthetixStaking is SynthetixStakingHelper { event LogWithdraw( address token, uint256 amount, - uint256 rewardAmt, uint getId, uint setId ); + event LogClaimedReward( + address token, + uint256 rewardAmt, + uint setId + ); /** * @dev Deposit Token. @@ -73,7 +77,7 @@ contract SynthetixStaking is SynthetixStakingHelper { _stakeToken.approve(address(stakingContract), _amt); stakingContract.stake(_amt); - + setUint(setId, _amt); emit LogDeposit(token, _amt, getId, setId); bytes32 _eventCode = keccak256("LogDeposit(address,uint256,uint256,uint256)"); @@ -86,13 +90,15 @@ contract SynthetixStaking is SynthetixStakingHelper { * @param token staking token address. * @param amt staking token amount. * @param getId Get token amount at this ID from `InstaMemory` Contract. - * @param setId Set token amount at this ID in `InstaMemory` Contract. + * @param setIdAmount Set token amount at this ID in `InstaMemory` Contract. + * @param setIdReward Set reward amount at this ID in `InstaMemory` Contract. */ function withdraw( address token, uint amt, uint getId, - uint setId + uint setIdAmount, + uint setIdReward ) external payable { uint _amt = getUint(getId, amt); IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); @@ -109,10 +115,42 @@ contract SynthetixStaking is SynthetixStakingHelper { uint rewardAmt = sub(finalBal, intialBal); - setUint(setId, _amt); - emit LogWithdraw(token, _amt, rewardAmt, getId, setId); - bytes32 _eventCode = keccak256("LogWithdraw(address,uint256,uint256,uint256,uint256)"); - bytes memory _eventParam = abi.encode(token, _amt, rewardAmt, getId, setId); + setUint(setIdAmount, _amt); + setUint(setIdReward, rewardAmt); + + emit LogWithdraw(token, _amt, getId, setIdAmount); + bytes32 _eventCodeWithdraw = keccak256("LogWithdraw(address,uint256,uint256,uint256)"); + bytes memory _eventParamWithdraw = abi.encode(token, _amt, getId, setIdAmount); + emitEvent(_eventCodeWithdraw, _eventParamWithdraw); + + emit LogClaimedReward(token, rewardAmt, setIdReward); + bytes32 _eventCodeReward = keccak256("LogClaimedReward(address,uint256,uint256)"); + bytes memory _eventParamReward = abi.encode(token, rewardAmt, setIdReward); + emitEvent(_eventCodeReward, _eventParamReward); + } + + /** + * @dev Claim Reward. + * @param token staking token address. + * @param setId Set reward amount at this ID in `InstaMemory` Contract. + */ + function claimReward( + address token, + uint setId + ) external payable { + IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); + TokenInterface snxToken = TokenInterface(getSnxAddr()); + + uint intialBal = snxToken.balanceOf(address(this)); + stakingContract.getReward(); + uint finalBal = snxToken.balanceOf(address(this)); + + uint rewardAmt = sub(finalBal, intialBal); + + setUint(setId, rewardAmt); + emit LogClaimedReward(token, rewardAmt, setId); + bytes32 _eventCode = keccak256("LogClaimedReward(address,uint256,uint256)"); + bytes memory _eventParam = abi.encode(token, rewardAmt, setId); emitEvent(_eventCode, _eventParam); } } From e76db4029428cc227a28e2cb16abf0d50d2e126a Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Thu, 9 Jul 2020 21:33:21 +1000 Subject: [PATCH 11/22] clean up truffle-config and enable optimiser; update test to mock token --- migrations/2_deploy_connector.js | 16 +++--- test/SynthetixProtocol.js | 21 ++++---- test/abi/crvRenWSBTC.json | 1 + truffle-config.js | 85 ++++++-------------------------- 4 files changed, 34 insertions(+), 89 deletions(-) create mode 100644 test/abi/crvRenWSBTC.json diff --git a/migrations/2_deploy_connector.js b/migrations/2_deploy_connector.js index 18f5843..d046267 100644 --- a/migrations/2_deploy_connector.js +++ b/migrations/2_deploy_connector.js @@ -1,12 +1,10 @@ -const CurveProtocol = artifacts.require("CurveProtocol"); -const ConnectSBTCCurve = artifacts.require("ConnectSBTCCurve"); - -const connectorsABI = require("../test/abi/connectors.json"); -let connectorsAddr = "0xD6A602C01a023B98Ecfb29Df02FBA380d3B21E0c"; -let connectorInstance = new web3.eth.Contract(connectorsABI, connectorsAddr); +// const CurveProtocol = artifacts.require("CurveProtocol"); +// const ConnectSBTCCurve = artifacts.require("ConnectSBTCCurve"); +const MockContract = artifacts.require("MockContract"); module.exports = async function(deployer) { - deployer.deploy(CurveProtocol); - let connectorLength = await connectorInstance.methods.connectorLength().call(); - deployer.deploy(ConnectSBTCCurve, 1, +connectorLength + 1); + // deployer.deploy(CurveProtocol); + deployer.deploy(MockContract); + // let connectorLength = await connectorInstance.methods.connectorLength().call(); + // deployer.deploy(ConnectSBTCCurve, 1, +connectorLength + 1); }; diff --git a/test/SynthetixProtocol.js b/test/SynthetixProtocol.js index c24a8ec..676b7f7 100644 --- a/test/SynthetixProtocol.js +++ b/test/SynthetixProtocol.js @@ -6,23 +6,26 @@ const { ether } = require('@openzeppelin/test-helpers'); -const MockContract = artifacts.require("MockContract.sol") +const MockContract = artifacts.require("MockContract"); const ConnectSynthetixStaking = artifacts.require('ConnectSynthetixStaking'); const erc20ABI = require("./abi/erc20.js"); + contract('ConnectSynthetixStaking', async accounts => { const [sender, receiver] = accounts; + const mock = await MockContract.new(); + const crvRenWSBTCContract = new web3.eth.Contract(erc20ABI, mock.address); + before(async function () { - const mock = await MockContract.new() - const crvRenWSBTCContract = new web3.eth.Contract(erc20ABI, mock.address); - let methodId = await crvRenWSBTCContract.methods.banlanceOf.getData(0,0); - console.log("methodId: ", methodId); - await mock.givenMethodReturn(methodId, abi.rawEncode(['uint'], [10000000]).toString()); + let methodId = await crvRenWSBTCContract.methods.balanceOf(sender).encodeABI(); + await mock.givenMethodReturnUint(methodId, 10000000); let crvRenWSBTC = await crvRenWSBTCContract.methods.balanceOf(sender).call(); - console.log("Sender crvRenWSBTC Before: ", crvRenWSBTC.toString()); - expect(crvRenWSBTC).to.be(10000000); - // expect(wbtcAfter - wbtcBefore).to.be.at.least(10000000); + expect(crvRenWSBTC).to.equal("10000000"); }) + + it('can mock token', async function() { + // expect(wbtcAfter - wbtcBefore).to.be.at.least(10000000); + }); }) diff --git a/test/abi/crvRenWSBTC.json b/test/abi/crvRenWSBTC.json new file mode 100644 index 0000000..6c22102 --- /dev/null +++ b/test/abi/crvRenWSBTC.json @@ -0,0 +1 @@ +[{"name":"Transfer","inputs":[{"type":"address","name":"_from","indexed":true},{"type":"address","name":"_to","indexed":true},{"type":"uint256","name":"_value","indexed":false}],"anonymous":false,"type":"event"},{"name":"Approval","inputs":[{"type":"address","name":"_owner","indexed":true},{"type":"address","name":"_spender","indexed":true},{"type":"uint256","name":"_value","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"string","name":"_name"},{"type":"string","name":"_symbol"},{"type":"uint256","name":"_decimals"},{"type":"uint256","name":"_supply"}],"constant":false,"payable":false,"type":"constructor"},{"name":"set_minter","outputs":[],"inputs":[{"type":"address","name":"_minter"}],"constant":false,"payable":false,"type":"function","gas":36247},{"name":"totalSupply","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1181},{"name":"allowance","outputs":[{"type":"uint256","name":"out"}],"inputs":[{"type":"address","name":"_owner"},{"type":"address","name":"_spender"}],"constant":true,"payable":false,"type":"function","gas":1519},{"name":"transfer","outputs":[{"type":"bool","name":"out"}],"inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"constant":false,"payable":false,"type":"function","gas":74802},{"name":"transferFrom","outputs":[{"type":"bool","name":"out"}],"inputs":[{"type":"address","name":"_from"},{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"constant":false,"payable":false,"type":"function","gas":111953},{"name":"approve","outputs":[{"type":"bool","name":"out"}],"inputs":[{"type":"address","name":"_spender"},{"type":"uint256","name":"_value"}],"constant":false,"payable":false,"type":"function","gas":39012},{"name":"mint","outputs":[],"inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"constant":false,"payable":false,"type":"function","gas":75733},{"name":"burn","outputs":[],"inputs":[{"type":"uint256","name":"_value"}],"constant":false,"payable":false,"type":"function","gas":76623},{"name":"burnFrom","outputs":[],"inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"constant":false,"payable":false,"type":"function","gas":76696},{"name":"name","outputs":[{"type":"string","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":7853},{"name":"symbol","outputs":[{"type":"string","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":6906},{"name":"decimals","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1511},{"name":"balanceOf","outputs":[{"type":"uint256","name":"out"}],"inputs":[{"type":"address","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":1695}] diff --git a/truffle-config.js b/truffle-config.js index c1652ad..bf05086 100644 --- a/truffle-config.js +++ b/truffle-config.js @@ -1,40 +1,10 @@ -/** - * Use this file to configure your truffle project. It's seeded with some - * common settings for different networks and features like migrations, - * compilation and testing. Uncomment the ones you need or modify - * them to suit your project as necessary. - * - * More information about configuration can be found at: - * - * truffleframework.com/docs/advanced/configuration - * - * To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider) - * to sign your transactions before they're sent to a remote public node. Infura accounts - * are available for free at: infura.io/register. - * - * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate - * public/private key pairs. If you're publishing your code to GitHub make sure you load this - * phrase from a file you've .gitignored so it doesn't accidentally become public. - * - */ - const HDWalletProvider = require('truffle-hdwallet-provider'); const dotenv = require('dotenv'); dotenv.config(); const infuraKey = process.env.infura_key; -// const mnemonic = process.env.mnemonic_key; module.exports = { - /** - * Networks define how you connect to your ethereum client and let you set the - * defaults web3 uses to send transactions. If you don't specify one truffle - * will spin up a development blockchain for you on port 9545 when you - * run `develop` or `test`. You can ask a truffle command to use a specific - * network from the command line, e.g - * - * $ truffle test --network - */ plugins: [ 'truffle-plugin-verify', ], @@ -43,36 +13,18 @@ module.exports = { }, networks: { - // Useful for testing. The `development` name is special - truffle uses it by default - // if it's defined here and no other network is specified at the command line. - // You should run a client (like ganache-cli, geth or parity) in a separate terminal - // tab if you use this network and you must also set the `host`, `port` and `network_id` - // options below to some value. - // development: { - host: "127.0.0.1", // Localhost (default: none) - port: 8545, // Standard Ethereum port (default: none) - network_id: "*", // Any network (default: none) + host: "127.0.0.1", + port: 8545, + network_id: "*", }, - // Tenderly Proxy + proxy: { - host: "127.0.0.1", // Localhost (default: none) - port: 9545, // Standard Ethereum port (default: none) - network_id: "*", // Any network (default: none) + host: "127.0.0.1", + port: 9545, + network_id: "*", }, - // Another network with more advanced options... - // advanced: { - // port: 8777, // Custom port - // network_id: 1342, // Custom network - // gas: 8500000, // Gas sent with each transaction (default: ~6700000) - // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) - // from:
, // Account to send txs from (default: accounts[0]) - // websockets: true // Enable EventEmitter interface for web3 (default: false) - // }, - - // Useful for deploying to a public network. - // NB: It's important to wrap the provider as a function. live: { provider: () => new HDWalletProvider(mnemonic, `https://mainnet.infura.io/v3/${infuraKey}`), network_id: 1, @@ -97,13 +49,6 @@ module.exports = { timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) }, - - // Useful for private networks - // private: { - // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), - // network_id: 2111, // This network is yours, in the cloud. - // production: true // Treats this network as if it was a public net. (default: false) - // } }, // Set default mocha options here, use special reporters etc. @@ -114,15 +59,13 @@ module.exports = { // Configure your compilers compilers: { solc: { - version: "v0.6.2", // Fetch exact version from solc-bin (default: truffle's version) - // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) - // settings: { // See the solidity docs for advice about optimization and evmVersion - // optimizer: { - enabled: false, - // runs: 200 - // }, - // evmVersion: "istanbul" - // } + version: "v0.6.2", + settings: { + optimizer: { + enabled: true, + }, + // evmVersion: "istanbul" + } } } } From cdb8bf01eb408a42653ae897e53fc0d886a8d4cb Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Fri, 10 Jul 2020 01:08:08 +1000 Subject: [PATCH 12/22] created Mocks and MockSynthetix; adding constructor for MockSynthetix and passing mock for synthetix address; --- contracts/connectors/synthetix.sol | 6 +++--- contracts/tests/MockSynthetix.sol | 19 +++++++++++++++++++ contracts/{ => tests}/Mocks.sol | 0 migrations/2_deploy_connector.js | 12 ++++++++++-- test/SynthetixProtocol.js | 6 +++--- 5 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 contracts/tests/MockSynthetix.sol rename contracts/{ => tests}/Mocks.sol (100%) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index e46c494..c354dbf 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -12,11 +12,11 @@ interface IStakingRewards { function getReward() external; } -contract SynthetixStakingHelper is DSMath, Stores { +contract SynthetixStakingHelper is DSMath, Stores { /** * @dev Return Synthetix staking pool address. */ - function getSynthetixStakingAddr(address token) internal pure returns (address){ + function getSynthetixStakingAddr(address token) virtual internal view returns (address){ if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ // SBTC return 0x13C1542A468319688B89E323fe9A3Be3A90EBb27; @@ -117,7 +117,7 @@ contract SynthetixStaking is SynthetixStakingHelper { setUint(setIdAmount, _amt); setUint(setIdReward, rewardAmt); - + emit LogWithdraw(token, _amt, getId, setIdAmount); bytes32 _eventCodeWithdraw = keccak256("LogWithdraw(address,uint256,uint256,uint256)"); bytes memory _eventParamWithdraw = abi.encode(token, _amt, getId, setIdAmount); diff --git a/contracts/tests/MockSynthetix.sol b/contracts/tests/MockSynthetix.sol new file mode 100644 index 0000000..4fdafc3 --- /dev/null +++ b/contracts/tests/MockSynthetix.sol @@ -0,0 +1,19 @@ +pragma solidity ^0.6.0; + +import { ConnectSynthetixStaking } from "../connectors/synthetix.sol"; + +contract MockSynthetixStaking is ConnectSynthetixStaking{ + // uint public _model; + // uint public _id; + address public synthetixStakingAddr; + + constructor(address _synthetixStakingAddr) public { + // _model = model; + // _id = id; + synthetixStakingAddr = _synthetixStakingAddr; + } + + function getSynthetixStakingAddr(address token) override internal view returns (address){ + return synthetixStakingAddr; + } +} diff --git a/contracts/Mocks.sol b/contracts/tests/Mocks.sol similarity index 100% rename from contracts/Mocks.sol rename to contracts/tests/Mocks.sol diff --git a/migrations/2_deploy_connector.js b/migrations/2_deploy_connector.js index d046267..8744d17 100644 --- a/migrations/2_deploy_connector.js +++ b/migrations/2_deploy_connector.js @@ -1,10 +1,18 @@ // const CurveProtocol = artifacts.require("CurveProtocol"); // const ConnectSBTCCurve = artifacts.require("ConnectSBTCCurve"); const MockContract = artifacts.require("MockContract"); +const MockSynthetixStaking = artifacts.require("MockSynthetixStaking"); + +// const connectorsABI = require("../test/abi/connectors.json"); +// let connectorsAddr = "0xD6A602C01a023B98Ecfb29Df02FBA380d3B21E0c"; +// let connectorInstance = new web3.eth.Contract(connectorsABI, connectorsAddr); module.exports = async function(deployer) { // deployer.deploy(CurveProtocol); - deployer.deploy(MockContract); // let connectorLength = await connectorInstance.methods.connectorLength().call(); - // deployer.deploy(ConnectSBTCCurve, 1, +connectorLength + 1); + deployer.deploy(MockContract).then(function () { + // return deployer.deploy(MockSynthetixStaking, MockContract.address, 1, +connectorLength + 1); + return deployer.deploy(MockSynthetixStaking, MockContract.address); + }); + }; diff --git a/test/SynthetixProtocol.js b/test/SynthetixProtocol.js index 676b7f7..6d968a6 100644 --- a/test/SynthetixProtocol.js +++ b/test/SynthetixProtocol.js @@ -7,13 +7,13 @@ const { } = require('@openzeppelin/test-helpers'); const MockContract = artifacts.require("MockContract"); - -const ConnectSynthetixStaking = artifacts.require('ConnectSynthetixStaking'); +const MockSynthetixStaking = artifacts.require('MockSynthetixStaking'); const erc20ABI = require("./abi/erc20.js"); contract('ConnectSynthetixStaking', async accounts => { const [sender, receiver] = accounts; - const mock = await MockContract.new(); + const mock = await MockContract.deployed(); + const mockSynthetixStaking = await MockSynthetixStaking.deployed(); const crvRenWSBTCContract = new web3.eth.Contract(erc20ABI, mock.address); before(async function () { From 0f33852c24d838decffb3a4e9640c51dc807167c Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Fri, 10 Jul 2020 16:30:14 +0530 Subject: [PATCH 13/22] Minor changes --- contracts/connectors/synthetix.sol | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index e46c494..460b683 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -10,6 +10,7 @@ interface IStakingRewards { function exit() external; function withdraw(uint256 amount) external; function getReward() external; + function balanceOf(address) external returns (uint256); } contract SynthetixStakingHelper is DSMath, Stores { @@ -103,14 +104,11 @@ contract SynthetixStaking is SynthetixStakingHelper { uint _amt = getUint(getId, amt); IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); TokenInterface snxToken = TokenInterface(getSnxAddr()); + _amt = _amt == uint(-1) ? stakingContract.balanceOf(address(this)) : _amt; uint intialBal = snxToken.balanceOf(address(this)); - if (_amt == uint(-1)) { - stakingContract.exit(); - } else{ - stakingContract.withdraw(_amt); - stakingContract.getReward(); - } + stakingContract.withdraw(_amt); + stakingContract.getReward(); uint finalBal = snxToken.balanceOf(address(this)); uint rewardAmt = sub(finalBal, intialBal); From c8d45fbfe47f5870e143c9c477229f17c1239817 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Fri, 10 Jul 2020 16:36:29 +0530 Subject: [PATCH 14/22] Fixed minor bug --- contracts/connectors/synthetix.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index a19afcb..7464283 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -10,14 +10,14 @@ interface IStakingRewards { function exit() external; function withdraw(uint256 amount) external; function getReward() external; - function balanceOf(address) external returns (uint256); + function balanceOf(address) external view returns (uint256); } contract SynthetixStakingHelper is DSMath, Stores { /** * @dev Return Synthetix staking pool address. */ - function getSynthetixStakingAddr(address token) virtual internal view returns (address){ + function getSynthetixStakingAddr(address token) internal pure returns (address){ if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ // SBTC return 0x13C1542A468319688B89E323fe9A3Be3A90EBb27; From becd0135aa7609444591ed7b95a867f026e82a63 Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Sun, 12 Jul 2020 02:04:48 +1000 Subject: [PATCH 15/22] formating stores.sol; fixing import for SafeERC20 and IERC20; set up constructor for synthetix connector to set address for staking contract; created MockSynthetix.sol for test; added nomiclabs/buidler; fixed test for SynthetixProtocol.js; adding .gitatributes to highlight solidity on GitHub; adding buidler artefacts and cache to git ignore; adding buidler.config.js; --- .gitattributes | 1 + .gitignore | 5 +- buidler.config.js | 11 + contracts/common/stores.sol | 86 +- contracts/connectors/basic.sol | 5 +- contracts/connectors/instapool.sol | 5 +- contracts/connectors/synthetix.sol | 25 +- contracts/tests/MockSynthetix.sol | 14 +- migrations/2_deploy_connector.js | 2 + package-lock.json | 3584 +++++++++++++++++++++++++++- package.json | 6 +- test/CurveSBTCProtocol.js | 2 - test/SynthetixProtocol.js | 66 +- test/abi/synthetixStaking.json | 1 + 14 files changed, 3727 insertions(+), 86 deletions(-) create mode 100644 .gitattributes create mode 100644 buidler.config.js create mode 100644 test/abi/synthetixStaking.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7cc88f0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sol linguist-language=Solidity \ No newline at end of file diff --git a/.gitignore b/.gitignore index a44c94e..2698881 100644 --- a/.gitignore +++ b/.gitignore @@ -58,5 +58,8 @@ Thumbs.db .com.apple.timemachine.donotpresent # truffle - build/contracts + +# buidler +artifacts +cache diff --git a/buidler.config.js b/buidler.config.js new file mode 100644 index 0000000..28777df --- /dev/null +++ b/buidler.config.js @@ -0,0 +1,11 @@ +usePlugin("@nomiclabs/buidler-truffle5"); +// You have to export an object to set up your config +// This object can have the following optional entries: +// defaultNetwork, networks, solc, and paths. +// Go to https://buidler.dev/config/ to learn more +module.exports = { + // This is a sample solc configuration that specifies which version of solc to use + solc: { + version: "0.6.2", + }, +}; diff --git a/contracts/common/stores.sol b/contracts/common/stores.sol index ac53fe6..99f1375 100644 --- a/contracts/common/stores.sol +++ b/contracts/common/stores.sol @@ -5,54 +5,54 @@ import { MemoryInterface, EventInterface} from "./interfaces.sol"; contract Stores { - /** - * @dev Return ethereum address - */ - function getEthAddr() internal pure returns (address) { - return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // ETH Address - } + /** + * @dev Return ethereum address + */ + function getEthAddr() internal pure returns (address) { + return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // ETH Address + } - /** - * @dev Return memory variable address - */ - function getMemoryAddr() internal pure returns (address) { - return 0x8a5419CfC711B2343c17a6ABf4B2bAFaBb06957F; // InstaMemory Address - } + /** + * @dev Return memory variable address + */ + function getMemoryAddr() internal pure returns (address) { + return 0x8a5419CfC711B2343c17a6ABf4B2bAFaBb06957F; // InstaMemory Address + } - /** - * @dev Return InstaEvent Address. - */ - function getEventAddr() internal pure returns (address) { - return 0x2af7ea6Cb911035f3eb1ED895Cb6692C39ecbA97; // InstaEvent Address - } + /** + * @dev Return InstaEvent Address. + */ + function getEventAddr() internal pure returns (address) { + return 0x2af7ea6Cb911035f3eb1ED895Cb6692C39ecbA97; // InstaEvent Address + } - /** - * @dev Get Uint value from InstaMemory Contract. - */ - function getUint(uint getId, uint val) internal returns (uint returnVal) { - returnVal = getId == 0 ? val : MemoryInterface(getMemoryAddr()).getUint(getId); - } + /** + * @dev Get Uint value from InstaMemory Contract. + */ + function getUint(uint getId, uint val) internal returns (uint returnVal) { + returnVal = getId == 0 ? val : MemoryInterface(getMemoryAddr()).getUint(getId); + } - /** - * @dev Set Uint value in InstaMemory Contract. - */ - function setUint(uint setId, uint val) internal { - if (setId != 0) MemoryInterface(getMemoryAddr()).setUint(setId, val); - } + /** + * @dev Set Uint value in InstaMemory Contract. + */ + function setUint(uint setId, uint val) virtual internal { + if (setId != 0) MemoryInterface(getMemoryAddr()).setUint(setId, val); + } - /** - * @dev emit event on event contract - */ - function emitEvent(bytes32 eventCode, bytes memory eventData) internal { - (uint model, uint id) = connectorID(); - EventInterface(getEventAddr()).emitEvent(model, id, eventCode, eventData); - } + /** + * @dev emit event on event contract + */ + function emitEvent(bytes32 eventCode, bytes memory eventData) virtual internal { + (uint model, uint id) = connectorID(); + EventInterface(getEventAddr()).emitEvent(model, id, eventCode, eventData); + } - /** - * @dev Connector Details - needs to be changed before deployment - */ - function connectorID() public view returns(uint model, uint id) { - (model, id) = (0, 0); - } + /** + * @dev Connector Details - needs to be changed before deployment + */ + function connectorID() public view returns(uint model, uint id) { + (model, id) = (0, 0); + } } diff --git a/contracts/connectors/basic.sol b/contracts/connectors/basic.sol index 23a5c82..0ca4672 100644 --- a/contracts/connectors/basic.sol +++ b/contracts/connectors/basic.sol @@ -1,6 +1,7 @@ pragma solidity ^0.6.0; -import "../../node_modules/@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import files from common directory import { TokenInterface , MemoryInterface, EventInterface} from "../common/interfaces.sol"; @@ -85,4 +86,4 @@ contract BasicResolver is Stores { contract ConnectBasic is BasicResolver { string public constant name = "Basic-v1.1"; -} \ No newline at end of file +} diff --git a/contracts/connectors/instapool.sol b/contracts/connectors/instapool.sol index c15039b..e90919e 100644 --- a/contracts/connectors/instapool.sol +++ b/contracts/connectors/instapool.sol @@ -1,7 +1,8 @@ pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; -import "../../node_modules/@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface LiqudityInterface { function deposit(address, uint) external payable; @@ -308,4 +309,4 @@ contract LiquidityAccess is LiquidityManage { contract ConnectInstaPool is LiquidityAccess { string public name = "InstaPool-v2"; -} \ No newline at end of file +} diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index c354dbf..66ffd2b 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -13,16 +13,22 @@ interface IStakingRewards { } contract SynthetixStakingHelper is DSMath, Stores { + IStakingRewards stakingContract; + + constructor(address _synthetixStakingAddr) public { + stakingContract = IStakingRewards(_synthetixStakingAddr); + } + /** * @dev Return Synthetix staking pool address. */ - function getSynthetixStakingAddr(address token) virtual internal view returns (address){ + function getSynthetixStakingAddr(address token) virtual internal { if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ // SBTC - return 0x13C1542A468319688B89E323fe9A3Be3A90EBb27; + stakingContract = IStakingRewards(0x13C1542A468319688B89E323fe9A3Be3A90EBb27); } else if (token == address(0xC25a3A3b969415c80451098fa907EC722572917F)){ // SUSD - return 0xDCB6A51eA3CA5d3Fd898Fd6564757c7aAeC3ca92; + stakingContract = IStakingRewards(0xDCB6A51eA3CA5d3Fd898Fd6564757c7aAeC3ca92); } else { revert("token-not-found"); } @@ -31,13 +37,15 @@ contract SynthetixStakingHelper is DSMath, Stores { /** * @dev Return Synthetix Token address. */ - function getSnxAddr() internal pure returns (address) { + function getSnxAddr() virtual internal view returns (address) { return 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; } } contract SynthetixStaking is SynthetixStakingHelper { + constructor(address _synthetixStakingAddr) SynthetixStakingHelper(_synthetixStakingAddr) public {} + // Events event LogDeposit( address token, @@ -71,7 +79,7 @@ contract SynthetixStaking is SynthetixStakingHelper { uint setId ) external payable { uint _amt = getUint(getId, amt); - IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); + getSynthetixStakingAddr(token); TokenInterface _stakeToken = TokenInterface(token); _amt = _amt == uint(-1) ? _stakeToken.balanceOf(address(this)) : _amt; @@ -101,7 +109,7 @@ contract SynthetixStaking is SynthetixStakingHelper { uint setIdReward ) external payable { uint _amt = getUint(getId, amt); - IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); + getSynthetixStakingAddr(token); TokenInterface snxToken = TokenInterface(getSnxAddr()); uint intialBal = snxToken.balanceOf(address(this)); @@ -138,7 +146,7 @@ contract SynthetixStaking is SynthetixStakingHelper { address token, uint setId ) external payable { - IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); + getSynthetixStakingAddr(token); TokenInterface snxToken = TokenInterface(getSnxAddr()); uint intialBal = snxToken.balanceOf(address(this)); @@ -157,4 +165,7 @@ contract SynthetixStaking is SynthetixStakingHelper { contract ConnectSynthetixStaking is SynthetixStaking { string public name = "synthetix-staking-v1"; + + constructor(address _synthetixStakingAddr) SynthetixStaking(_synthetixStakingAddr) public {} + } diff --git a/contracts/tests/MockSynthetix.sol b/contracts/tests/MockSynthetix.sol index 4fdafc3..9afed3a 100644 --- a/contracts/tests/MockSynthetix.sol +++ b/contracts/tests/MockSynthetix.sol @@ -3,17 +3,19 @@ pragma solidity ^0.6.0; import { ConnectSynthetixStaking } from "../connectors/synthetix.sol"; contract MockSynthetixStaking is ConnectSynthetixStaking{ - // uint public _model; - // uint public _id; address public synthetixStakingAddr; - constructor(address _synthetixStakingAddr) public { - // _model = model; - // _id = id; + constructor(address _synthetixStakingAddr) ConnectSynthetixStaking(_synthetixStakingAddr) public { synthetixStakingAddr = _synthetixStakingAddr; } - function getSynthetixStakingAddr(address token) override internal view returns (address){ + function getSynthetixStakingAddr(address token) override internal{} + + function emitEvent(bytes32 eventCode, bytes memory eventData) override internal {} + + function getSnxAddr() override internal view returns (address) { return synthetixStakingAddr; } + + function setUint(uint setId, uint val) override internal {} } diff --git a/migrations/2_deploy_connector.js b/migrations/2_deploy_connector.js index 8744d17..c096106 100644 --- a/migrations/2_deploy_connector.js +++ b/migrations/2_deploy_connector.js @@ -2,6 +2,7 @@ // const ConnectSBTCCurve = artifacts.require("ConnectSBTCCurve"); const MockContract = artifacts.require("MockContract"); const MockSynthetixStaking = artifacts.require("MockSynthetixStaking"); +// const ConnectSynthetixStaking = artifacts.require("ConnectSynthetixStaking"); // const connectorsABI = require("../test/abi/connectors.json"); // let connectorsAddr = "0xD6A602C01a023B98Ecfb29Df02FBA380d3B21E0c"; @@ -12,6 +13,7 @@ module.exports = async function(deployer) { // let connectorLength = await connectorInstance.methods.connectorLength().call(); deployer.deploy(MockContract).then(function () { // return deployer.deploy(MockSynthetixStaking, MockContract.address, 1, +connectorLength + 1); + // return deployer.deploy(ConnectSynthetixStaking, MockContract.address); return deployer.deploy(MockSynthetixStaking, MockContract.address); }); diff --git a/package-lock.json b/package-lock.json index 9991825..8f7ac23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,1007 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ethersproject/abi": { + "version": "5.0.0-beta.153", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", + "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", + "dev": true, + "requires": { + "@ethersproject/address": ">=5.0.0-beta.128", + "@ethersproject/bignumber": ">=5.0.0-beta.130", + "@ethersproject/bytes": ">=5.0.0-beta.129", + "@ethersproject/constants": ">=5.0.0-beta.128", + "@ethersproject/hash": ">=5.0.0-beta.128", + "@ethersproject/keccak256": ">=5.0.0-beta.127", + "@ethersproject/logger": ">=5.0.0-beta.129", + "@ethersproject/properties": ">=5.0.0-beta.131", + "@ethersproject/strings": ">=5.0.0-beta.130" + } + }, + "@ethersproject/address": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.1.tgz", + "integrity": "sha512-kfQtXpBP2pI2TfoRRAYv8grHGiYw8U0c1KbMsC58/W33TIBy7gFSf/oAzOd94lNzdIUenKU0OuSzrHQfVcDDDA==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/keccak256": "^5.0.0", + "@ethersproject/logger": "^5.0.0", + "@ethersproject/rlp": "^5.0.0", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/bignumber": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.4.tgz", + "integrity": "sha512-fgfwehdxS4BPRvq2B+joKqchW2E2cV3DE+O/DhG7jH3m2blM1VIzjtIOtJNjNI/YCgkygGjT1DaZS1j29RAwHw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/logger": "^5.0.0", + "@ethersproject/properties": "^5.0.0", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/bytes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.2.tgz", + "integrity": "sha512-QLE5zCreNv7KGh0AsXdvmdOYcWSJbnR654M+dLyY90g3D0ehVDSf+wxzG/GmWa79ESsqo/cWC1kJA1Vrcq7GFw==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.0.0" + } + }, + "@ethersproject/constants": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.1.tgz", + "integrity": "sha512-Xec07hFCPN4wfC3WDiRay7KipkApl2msiKTrBHCuAwNMOM8M92+mlQp8tgfEL51DPwCZkmdk1f02kArc6caVSw==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.0.0" + } + }, + "@ethersproject/hash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.1.tgz", + "integrity": "sha512-1ByUXYvkszrSSks07xctBtZfpFnIVmftxWlAAnguxh6Q65vKECd/EPi5uI5xVOvnrYMH9Vb8MK1SofPX/6fArQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/keccak256": "^5.0.0", + "@ethersproject/logger": "^5.0.0", + "@ethersproject/strings": "^5.0.0" + } + }, + "@ethersproject/keccak256": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.1.tgz", + "integrity": "sha512-AtFm/4qHRQUvZcG3WYmaT7zV79dz72+N01w0XphcIBaD/7UZXyW85Uf08sirVlckHmh9fvc4UDWyHiroKsBT6Q==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.0", + "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=", + "dev": true + } + } + }, + "@ethersproject/logger": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.2.tgz", + "integrity": "sha512-NQe3O1/Nwkcp6bto6hsTvrcCeR/cOGK+RhOMn0Zi2FND6gdWsf1g+5ie8gQ1REqDX4MTGP/Y131dZas985ls/g==", + "dev": true + }, + "@ethersproject/properties": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.1.tgz", + "integrity": "sha512-b3VZ/NpYIf64/hFXeWNxVCbY1xoMPIYM3n6Qnu6Ayr3bLt1olFPQfAaaRB0aOsLz7tMtmkT3DrA1KG/IrOgBRw==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.0.0" + } + }, + "@ethersproject/rlp": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.1.tgz", + "integrity": "sha512-3F8XE1zS4w8w4xiK1hMtFuVs6UnhQlmrEHLT85GanqK8vG5wGi81IQmkukL9tQIu2a5jykoO46ibja+6N1fpFg==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/logger": "^5.0.0" + } + }, + "@ethersproject/signing-key": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.2.tgz", + "integrity": "sha512-kgpCdtgoLoKXJTwJPw3ggRW7EO93YCQ98zY8hBpIb4OK3FxFCR3UUjlrGEwjMnLHDjFrxpKCeJagGWf477RyMQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/logger": "^5.0.0", + "@ethersproject/properties": "^5.0.0", + "elliptic": "6.5.3" + }, + "dependencies": { + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": 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" + } + } + } + }, + "@ethersproject/strings": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.1.tgz", + "integrity": "sha512-N8LxdHGBT7GZdogkEOV5xKXYTz5PNHuNzcxLNPYfH3kpvWSyXshZBgAz8YE1a8sMZagGj+Ic6d3mHijdCTSkGA==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/constants": "^5.0.0", + "@ethersproject/logger": "^5.0.0" + } + }, + "@ethersproject/transactions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.1.tgz", + "integrity": "sha512-IGc6/5hri3PrqR/ZCj89osDiq3Lt0CSrycn6vlRl8SjpBKYDdcT+Ru5xkeC7YcsnqcdBmTL+jyR3SLudU+x2Kw==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.0.0", + "@ethersproject/bignumber": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/constants": "^5.0.0", + "@ethersproject/keccak256": "^5.0.0", + "@ethersproject/logger": "^5.0.0", + "@ethersproject/properties": "^5.0.0", + "@ethersproject/rlp": "^5.0.0", + "@ethersproject/signing-key": "^5.0.0" + } + }, + "@nomiclabs/buidler": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@nomiclabs/buidler/-/buidler-1.3.8.tgz", + "integrity": "sha512-SmSsNteks20Vl4WBELRV8Vnokh1CxbPHFF5aBqhe/4tR2QVR51dNy8dwDkmj153UyAW+f6ZtxF9QT+TxNomZBg==", + "dev": true, + "requires": { + "@nomiclabs/ethereumjs-vm": "^4.1.1", + "@solidity-parser/parser": "^0.5.2", + "@types/bn.js": "^4.11.5", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "deepmerge": "^2.1.0", + "download": "^7.1.0", + "enquirer": "^2.3.0", + "eth-sig-util": "^2.5.2", + "ethereum-cryptography": "^0.1.2", + "ethereumjs-abi": "^0.6.8", + "ethereumjs-account": "^3.0.0", + "ethereumjs-block": "^2.2.0", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^6.1.0", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "^7.1.3", + "io-ts": "1.10.4", + "is-installed-globally": "^0.2.0", + "lodash": "^4.17.11", + "merkle-patricia-tree": "^3.0.0", + "mocha": "^7.1.2", + "node-fetch": "^2.6.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "semver": "^6.3.0", + "slash": "^3.0.0", + "solc": "0.6.8", + "source-map-support": "^0.5.13", + "ts-essentials": "^2.0.7", + "tsort": "0.0.1", + "uuid": "^3.3.2", + "ws": "^7.2.1" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.5.2.tgz", + "integrity": "sha512-uRyvnvVYmgNmTBpWDbBsH/0kPESQhQpEc4KsvMRLVzFJ1o1s0uIv0Y6Y9IB5vI1Dwz2CbS4X/y4Wyw/75cTFnQ==", + "dev": true + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "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" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "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==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "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==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "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": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "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.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.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==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": 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" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "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==", + "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 + }, + "solc": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.8.tgz", + "integrity": "sha512-7URBAisWVjO7dwWNpEkQ5dpRSpSF4Wm0aD5EB82D5BQKh+q7jhOxhgkG4K5gax/geM0kPZUAxnaLcgl2ZXBgMQ==", + "dev": true, + "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=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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==", + "dev": 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", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "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=", + "dev": true + }, + "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": { + "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==", + "dev": true, + "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=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true + }, + "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==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "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.2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@nomiclabs/buidler-truffle5": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@nomiclabs/buidler-truffle5/-/buidler-truffle5-1.3.4.tgz", + "integrity": "sha512-aPbkdbNUF4R/hbb2B8BULlsQ5AUB5l4baIHFmLQ/fdRmFrkWBx+53tjpf+XOv8g8RZTJstpkxFSBRWD/U1EahA==", + "dev": true, + "requires": { + "@nomiclabs/truffle-contract": "^4.1.2", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^6.1.0", + "fs-extra": "^7.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "@nomiclabs/buidler-web3": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@nomiclabs/buidler-web3/-/buidler-web3-1.3.4.tgz", + "integrity": "sha512-fVJczSfZBp1xDJA2Bdh49P6mhaAO8vGY7kbi6uoMLO8J288O6s/Ldw36kb7iRebifNbKP69MJsUu2nXLaklqdg==", + "dev": true, + "requires": { + "@types/bignumber.js": "^5.0.0" + } + }, + "@nomiclabs/ethereumjs-vm": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.1.1.tgz", + "integrity": "sha512-zQJBssmK7PyHonzng3VuFUvXQ6uugQeGAA7XvFVoMmEcY9KdWCqEQYh+XQ1jLZ8H9EISYB1BHF9HY6aFnflgcw==", + "dev": true, + "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.1", + "ethereumjs-blockchain": "^4.0.2", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "~6.1.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": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "ethereumjs-util": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", + "dev": 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" + } + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "dev": true, + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "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==", + "dev": true, + "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=", + "dev": true + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, + "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" + } + } + } + }, + "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==", + "dev": 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" + }, + "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==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.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==", + "dev": true + } + } + } + } + }, + "@nomiclabs/truffle-contract": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.1.15.tgz", + "integrity": "sha512-+3lP8gyiOsnFXx8ueEBsLkk8H2VSj0T++nim2AbBsgYZfkoT8v7hcfh+MdCo5EY0t9fvQgmt2n7Szqku0cmttQ==", + "dev": true, + "requires": { + "@truffle/blockchain-utils": "^0.0.18", + "@truffle/contract-schema": "^3.0.23", + "@truffle/error": "^0.0.8", + "@truffle/interface-adapter": "^0.4.6", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "exorcist": "^1.0.1", + "source-map-support": "^0.5.16" + }, + "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==", + "dev": true + } + } + }, "@openzeppelin/contract-loader": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.4.0.tgz", @@ -733,6 +1734,21 @@ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", "dev": true + }, + "web3": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz", + "integrity": "sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==", + "dev": true, + "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" + } } } }, @@ -814,9 +1830,33 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", "dev": true + }, + "web3": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz", + "integrity": "sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==", + "dev": true, + "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" + } } } }, + "@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==", + "dev": true, + "requires": { + "bignumber.js": "*" + } + }, "@types/bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", @@ -833,22 +1873,70 @@ "@types/node": "*" } }, + "@types/chai": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", + "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", + "dev": true + }, "@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/lru-cache": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.0.tgz", + "integrity": "sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==", + "dev": true + }, "@types/node": { "version": "13.13.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" }, + "@types/pbkdf2": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.0.0.tgz", + "integrity": "sha512-6J6MHaAlBJC/eVMy9jOwj9oHaprfutukfW/Dyt0NEnpQ/6HN6YQrpvLwzWdWDeWZIdenjGHlbYDzyEODO5Z+2Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/secp256k1": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", + "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -887,6 +1975,15 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, + "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==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -916,6 +2013,23 @@ "normalize-path": "^2.0.0" } }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "dev": true, + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1003,6 +2117,26 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dev": true, + "requires": { + "async": "^2.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -1109,6 +2243,15 @@ } } }, + "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==", + "dev": true, + "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", @@ -1123,8 +2266,8 @@ } }, "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "version": "2.0.7", + "resolved": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", "dev": true }, "binary-extensions": { @@ -1196,6 +2339,12 @@ } } }, + "blakejs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", + "dev": true + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1344,6 +2493,26 @@ "parse-asn1": "^5.0.0" } }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dev": true, + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, "buffer": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", @@ -1462,6 +2631,18 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "requires": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + } + }, "cbor": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-4.3.0.tgz", @@ -1515,6 +2696,15 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "checkpoint-store": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", + "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", + "dev": true, + "requires": { + "functional-red-black-tree": "^1.0.1" + } + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1537,6 +2727,37 @@ "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==", + "dev": true + }, + "cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "dependencies": { + "multicodec": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.3.tgz", + "integrity": "sha512-8G4JKbHWSe/39Xx2uiI+/b/S6mGgimzwEN4TOCokFUIfofg1T8eHny88ht9eWImD2dng+EEQRsApXxA5ubhU4g==", + "dev": true, + "requires": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + } + } + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1551,6 +2772,12 @@ "resolved": "https://registry.npmjs.org/circular/-/circular-1.0.5.tgz", "integrity": "sha1-fad6+Yu96c5LWzWM1Va13e0tMUk=" }, + "class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1712,6 +2939,16 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -1727,6 +2964,17 @@ } } }, + "content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dev": true, + "requires": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -1770,6 +3018,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1998,11 +3252,43 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "dev": true + }, "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==" }, + "deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dev": true, + "requires": { + "abstract-leveldown": "~2.6.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==", + "dev": true, + "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==", + "dev": true + } + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -2116,6 +3402,150 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==" }, + "download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dev": true, + "requires": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, + "file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", @@ -2159,11 +3589,59 @@ "minimalistic-crypto-utils": "^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==", + "dev": true + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "dev": true, + "requires": { + "buffer": "^5.6.0" + } + }, + "level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + } + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2172,12 +3650,38 @@ "once": "^1.4.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + } + } + }, "eol": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", "dev": true }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2187,6 +3691,44 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.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==", + "dev": true + } + } + }, + "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": { + "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", @@ -2314,6 +3856,132 @@ "xhr-request-promise": "^0.1.2" } }, + "eth-sig-util": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.5.3.tgz", + "integrity": "sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + } + } + }, + "ethashjs": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ethashjs/-/ethashjs-0.0.8.tgz", + "integrity": "sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==", + "dev": true, + "requires": { + "async": "^2.1.2", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.0.2", + "miller-rabin": "^4.0.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true + }, + "buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-util": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.3.tgz", + "integrity": "sha512-uLQsGPOwsRxe50WV1Dybh5N8zXDz4ev7wP49LKX9kr28I5TmcDILPgpKK/BFe5zYSfRGEeo+hPT7W3tjghYLuA==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, "ethereum-bloom-filters": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz", @@ -2322,6 +3990,58 @@ "js-sha3": "^0.8.0" } }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "keccak": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.0.tgz", + "integrity": "sha512-/4h4FIfFEpTEuySXi/nVFM5rqSKPnnhI7cL4K3MFSwoI3VyM7AhPSq3SsysARtnEBEeIKMBUWD8cTh9nHE8AkA==", + "dev": true, + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + }, + "secp256k1": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.1.tgz", + "integrity": "sha512-iGRjbGAKfXMqhtdkkuNxsgJQfJO8Oo78Rm7DAvsG3XKngq+nJIOGqrCSXcQqIVsmCj0wFanE5uTKFxV3T9j2wg==", + "dev": true, + "requires": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + } + } + }, "ethereum-ens": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", @@ -2353,6 +4073,197 @@ "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==", + "dev": true, + "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==", + "dev": true, + "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": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, + "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==", + "dev": true, + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "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==", + "dev": true, + "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=", + "dev": true + } + } + }, + "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==", + "dev": 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" + }, + "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==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.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==", + "dev": true + } + } + } + } + }, + "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==", + "dev": true, + "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": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "ethereumjs-util": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", + "dev": 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" + } + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "dev": true, + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.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==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } + } + }, "ethereumjs-common": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.1.tgz", @@ -2508,6 +4419,12 @@ "es5-ext": "~0.10.14" } }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, "eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", @@ -2672,6 +4589,25 @@ } } }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2712,6 +4648,15 @@ "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=", + "dev": true, + "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", @@ -2752,6 +4697,23 @@ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", @@ -2804,6 +4766,29 @@ "pinkie-promise": "^2.0.0" } }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "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==", + "dev": true + } + } + }, + "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=", + "dev": true + }, "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -2862,6 +4847,12 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, + "fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -2876,6 +4867,48 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "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==", + "dev": 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" + } + }, + "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==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -3455,6 +5488,18 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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=", + "dev": true + }, "ganache-cli": { "version": "6.10.0-beta.2", "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.10.0-beta.2.tgz", @@ -4141,6 +6186,15 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "requires": { + "npm-conf": "^1.1.0" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4204,6 +6258,15 @@ "process": "~0.5.1" } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -4265,6 +6328,15 @@ "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-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4275,6 +6347,12 @@ "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", @@ -4450,6 +6528,12 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4464,18 +6548,43 @@ "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==", + "dev": true + }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "requires": { + "fp-ts": "^1.0.0" + } + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -4519,6 +6628,12 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4528,6 +6643,12 @@ "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==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -4602,6 +6723,16 @@ "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" }, + "is-installed-globally": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.2.0.tgz", + "integrity": "sha512-g3TzWCnR/eO4Q3abCwgFjOFw7uVOfxG4m8hMr/39Jcf2YvE5mHrFKqpyuraWV4zwx9XhjnVO4nY0ZI4llzl0Pg==", + "dev": true, + "requires": { + "global-dirs": "^0.1.1", + "is-path-inside": "^2.1.0" + } + }, "is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -4621,6 +6752,15 @@ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -4660,6 +6800,15 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", @@ -4670,6 +6819,15 @@ "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==", + "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", @@ -4918,6 +7076,267 @@ "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==", + "dev": true + }, + "level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "dev": true, + "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=", + "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=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "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=", + "dev": true + } + } + }, + "level-mem": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-3.0.1.tgz", + "integrity": "sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==", + "dev": true, + "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==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", + "dev": true + }, + "memdown": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz", + "integrity": "sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==", + "dev": true, + "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==", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "encoding-down": "~5.0.0", + "levelup": "^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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "abstract-leveldown": "~5.0.0", + "inherits": "^2.0.3" + } + }, + "level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "xtend": "^4.0.0" + } + }, + "levelup": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz", + "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", + "dev": true, + "requires": { + "deferred-leveldown": "~4.0.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~3.0.0", + "xtend": "~4.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==", + "dev": 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" + } + }, + "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==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "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=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "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=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "dev": true, + "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" + }, + "dependencies": { + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4983,6 +7402,67 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -5014,6 +7494,12 @@ "es5-ext": "~0.10.2" } }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -5074,6 +7560,37 @@ "mimic-fn": "^1.0.0" } }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + } + } + }, "memoizee": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", @@ -5099,6 +7616,110 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merkle-patricia-tree": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz", + "integrity": "sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==", + "dev": true, + "requires": { + "async": "^2.6.1", + "ethereumjs-util": "^5.2.0", + "level-mem": "^3.0.1", + "level-ws": "^1.0.0", + "readable-stream": "^3.0.6", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, + "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==", + "dev": true, + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "level-ws": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-1.0.0.tgz", + "integrity": "sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.8", + "xtend": "^4.0.1" + }, + "dependencies": { + "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==", + "dev": 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" + } + }, + "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==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.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==", + "dev": true + } + } + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -5358,6 +7979,48 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "dev": true, + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "dev": true, + "requires": { + "varint": "^5.0.0" + } + }, + "multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + }, + "dependencies": { + "multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "dev": true, + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + } + } + }, "nan": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", @@ -5423,6 +8086,34 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.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==", + "dev": true + }, + "node-gyp-build": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.2.tgz", + "integrity": "sha512-Lqh7mrByWCM8Cf9UPqpeoVBBo5Ugx+RKu885GAzmLBVYjeywScxHXPGLa4JfYNZmcNGwzR0Glu5/9GaQZMFqyA==", + "dev": true + }, "nofilter": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.3.tgz", @@ -5474,6 +8165,24 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -5537,6 +8246,18 @@ } } }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -5554,6 +8275,36 @@ } } }, + "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": { + "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==", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -5653,11 +8404,37 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "requires": { + "p-timeout": "^2.0.1" + }, + "dependencies": { + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + } + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -5757,6 +8534,12 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "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=", + "dev": true + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -5819,6 +8602,12 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -5870,6 +8659,12 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -5879,6 +8674,12 @@ "ipaddr.js": "1.9.1" } }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -6544,6 +9345,12 @@ "bn.js": "^4.11.1" } }, + "rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", + "dev": true + }, "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", @@ -6631,6 +9438,12 @@ } } }, + "semaphore": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -6812,6 +9625,12 @@ "simple-concat": "^1.0.0" } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -7251,6 +10070,24 @@ "integrity": "sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ==", "dev": true }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dev": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7458,6 +10295,26 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7511,6 +10368,15 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==" }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -7766,6 +10632,15 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "truffle-assertions": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/truffle-assertions/-/truffle-assertions-0.9.2.tgz", @@ -7806,6 +10681,22 @@ "bindings": "^1.3.1", "web3": "1.2.1", "websocket": "^1.0.28" + }, + "dependencies": { + "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" + } + } } }, "truffle-plugin-verify": { @@ -7838,6 +10729,12 @@ "integrity": "sha1-NEiaLKwMCcHMEO2RugEVlNQzO+I=", "dev": true }, + "ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==", + "dev": true + }, "tsort": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", @@ -7856,6 +10753,12 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -7876,6 +10779,12 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -8047,6 +10956,18 @@ "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==", + "dev": true, + "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", @@ -8067,6 +10988,12 @@ "spdx-expression-parse": "^3.0.0" } }, + "varint": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", + "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -8083,17 +11010,441 @@ } }, "web3": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz", - "integrity": "sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.9.tgz", + "integrity": "sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA==", + "dev": true, "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": "1.2.9", + "web3-core": "1.2.9", + "web3-eth": "1.2.9", + "web3-eth-personal": "1.2.9", + "web3-net": "1.2.9", + "web3-shh": "1.2.9", + "web3-utils": "1.2.9" + }, + "dependencies": { + "@types/node": { + "version": "10.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", + "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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=", + "dev": true + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + }, + "swarm-js": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", + "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "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": "^1.0.1" + }, + "dependencies": { + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "^3.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" + } + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "web3-bzz": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.9.tgz", + "integrity": "sha512-ogVQr9jHodu9HobARtvUSmWG22cv2EUQzlPeejGWZ7j5h20HX40EDuWyomGY5VclIj5DdLY76Tmq88RTf/6nxA==", + "dev": true, + "requires": { + "@types/node": "^10.12.18", + "got": "9.6.0", + "swarm-js": "^0.1.40", + "underscore": "1.9.1" + } + }, + "web3-core": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.9.tgz", + "integrity": "sha512-fSYv21IP658Ty2wAuU9iqmW7V+75DOYMVZsDH/c14jcF/1VXnedOcxzxSj3vArsCvXZNe6XC5/wAuGZyQwR9RA==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.4", + "@types/node": "^12.6.1", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.2.9", + "web3-core-method": "1.2.9", + "web3-core-requestmanager": "1.2.9", + "web3-utils": "1.2.9" + }, + "dependencies": { + "@types/node": { + "version": "12.12.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.50.tgz", + "integrity": "sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w==", + "dev": true + } + } + }, + "web3-core-helpers": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.9.tgz", + "integrity": "sha512-t0WAG3orLCE3lqi77ZoSRNFok3VQWZXTniZigDQjyOJYMAX7BU3F3js8HKbjVnAxlX3tiKoDxI0KBk9F3AxYuw==", + "dev": true, + "requires": { + "underscore": "1.9.1", + "web3-eth-iban": "1.2.9", + "web3-utils": "1.2.9" + } + }, + "web3-core-method": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.9.tgz", + "integrity": "sha512-bjsIoqP3gs7A/gP8+QeLUCyOKJ8bopteCSNbCX36Pxk6TYfYWNuC6hP+2GzUuqdP3xaZNe+XEElQFUNpR3oyAg==", + "dev": true, + "requires": { + "@ethersproject/transactions": "^5.0.0-beta.135", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.9", + "web3-core-promievent": "1.2.9", + "web3-core-subscriptions": "1.2.9", + "web3-utils": "1.2.9" + } + }, + "web3-core-promievent": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz", + "integrity": "sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw==", + "dev": true, + "requires": { + "eventemitter3": "3.1.2" + } + }, + "web3-core-requestmanager": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz", + "integrity": "sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA==", + "dev": true, + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.9", + "web3-providers-http": "1.2.9", + "web3-providers-ipc": "1.2.9", + "web3-providers-ws": "1.2.9" + } + }, + "web3-core-subscriptions": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz", + "integrity": "sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg==", + "dev": true, + "requires": { + "eventemitter3": "3.1.2", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.9" + } + }, + "web3-eth": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.9.tgz", + "integrity": "sha512-sIKO4iE9FEBa/CYUd6GdPd7GXt/wISqxUd8PlIld6+hvMJj02lgO7Z7p5T9mZIJcIZJGvZX81ogx8oJ9yif+Ag==", + "dev": true, + "requires": { + "underscore": "1.9.1", + "web3-core": "1.2.9", + "web3-core-helpers": "1.2.9", + "web3-core-method": "1.2.9", + "web3-core-subscriptions": "1.2.9", + "web3-eth-abi": "1.2.9", + "web3-eth-accounts": "1.2.9", + "web3-eth-contract": "1.2.9", + "web3-eth-ens": "1.2.9", + "web3-eth-iban": "1.2.9", + "web3-eth-personal": "1.2.9", + "web3-net": "1.2.9", + "web3-utils": "1.2.9" + } + }, + "web3-eth-abi": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.9.tgz", + "integrity": "sha512-3YwUYbh/DMfDbhMWEebAdjSd5bj3ZQieOjLzWFHU23CaLEqT34sUix1lba+hgUH/EN6A7bKAuKOhR3p0OvTn7Q==", + "dev": true, + "requires": { + "@ethersproject/abi": "5.0.0-beta.153", + "underscore": "1.9.1", + "web3-utils": "1.2.9" + } + }, + "web3-eth-accounts": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.9.tgz", + "integrity": "sha512-jkbDCZoA1qv53mFcRHCinoCsgg8WH+M0YUO1awxmqWXRmCRws1wW0TsuSQ14UThih5Dxolgl+e+aGWxG58LMwg==", + "dev": true, + "requires": { + "crypto-browserify": "3.12.0", + "eth-lib": "^0.2.8", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "scrypt-js": "^3.0.1", + "underscore": "1.9.1", + "uuid": "3.3.2", + "web3-core": "1.2.9", + "web3-core-helpers": "1.2.9", + "web3-core-method": "1.2.9", + "web3-utils": "1.2.9" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + } + } + }, + "web3-eth-contract": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.9.tgz", + "integrity": "sha512-PYMvJf7EG/HyssUZa+pXrc8IB06K/YFfWYyW4R7ed3sab+9wWUys1TlWxBCBuiBXOokSAyM6H6P6/cKEx8FT8Q==", + "dev": true, + "requires": { + "@types/bn.js": "^4.11.4", + "underscore": "1.9.1", + "web3-core": "1.2.9", + "web3-core-helpers": "1.2.9", + "web3-core-method": "1.2.9", + "web3-core-promievent": "1.2.9", + "web3-core-subscriptions": "1.2.9", + "web3-eth-abi": "1.2.9", + "web3-utils": "1.2.9" + } + }, + "web3-eth-ens": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.9.tgz", + "integrity": "sha512-kG4+ZRgZ8I1WYyOBGI8QVRHfUSbbJjvJAGA1AF/NOW7JXQ+x7gBGeJw6taDWJhSshMoEKWcsgvsiuoG4870YxQ==", + "dev": true, + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "underscore": "1.9.1", + "web3-core": "1.2.9", + "web3-core-helpers": "1.2.9", + "web3-core-promievent": "1.2.9", + "web3-eth-abi": "1.2.9", + "web3-eth-contract": "1.2.9", + "web3-utils": "1.2.9" + } + }, + "web3-eth-iban": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.9.tgz", + "integrity": "sha512-RtdVvJE0pyg9dHLy0GzDiqgnLnssSzfz/JYguhC1wsj9+Gnq1M6Diy3NixACWUAp6ty/zafyOaZnNQ+JuH9TjQ==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "web3-utils": "1.2.9" + } + }, + "web3-eth-personal": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.9.tgz", + "integrity": "sha512-cFiNrktxZ1C/rIdJFzQTvFn3/0zcsR3a+Jf8Y3KxeQDHszQtosjLWptP7bsUmDwEh4hzh0Cy3KpOxlYBWB8bJQ==", + "dev": true, + "requires": { + "@types/node": "^12.6.1", + "web3-core": "1.2.9", + "web3-core-helpers": "1.2.9", + "web3-core-method": "1.2.9", + "web3-net": "1.2.9", + "web3-utils": "1.2.9" + }, + "dependencies": { + "@types/node": { + "version": "12.12.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.50.tgz", + "integrity": "sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w==", + "dev": true + } + } + }, + "web3-net": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.9.tgz", + "integrity": "sha512-d2mTn8jPlg+SI2hTj2b32Qan6DmtU9ap/IUlJTeQbZQSkTLf0u9suW8Vjwyr4poJYXTurdSshE7OZsPNn30/ZA==", + "dev": true, + "requires": { + "web3-core": "1.2.9", + "web3-core-method": "1.2.9", + "web3-utils": "1.2.9" + } + }, + "web3-providers-http": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.9.tgz", + "integrity": "sha512-F956tCIj60Ttr0UvEHWFIhx+be3He8msoPzyA44/kfzzYoMAsCFRn5cf0zQG6al0znE75g6HlWVSN6s3yAh51A==", + "dev": true, + "requires": { + "web3-core-helpers": "1.2.9", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.9.tgz", + "integrity": "sha512-NQ8QnBleoHA2qTJlqoWu7EJAD/FR5uimf7Ielzk4Z2z+m+6UAuJdJMSuQNj+Umhz9L/Ys6vpS1vHx9NizFl+aQ==", + "dev": true, + "requires": { + "oboe": "2.1.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.9" + } + }, + "web3-providers-ws": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.9.tgz", + "integrity": "sha512-6+UpvINeI//dglZoAKStUXqxDOXJy6Iitv2z3dbgInG4zb8tkYl/VBDL80UjUg3ZvzWG0g7EKY2nRPEpON2TFA==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.9", + "websocket": "^1.0.31" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true + } + } + }, + "web3-shh": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.9.tgz", + "integrity": "sha512-PWa8b/EaxaMinFaxy6cV0i0EOi2M7a/ST+9k9nhyhCjVa2vzXuNoBNo2IUOmeZ0WP2UQB8ByJ2+p4htlJaDOjA==", + "dev": true, + "requires": { + "web3-core": "1.2.9", + "web3-core-method": "1.2.9", + "web3-core-subscriptions": "1.2.9", + "web3-net": "1.2.9" + } + }, + "web3-utils": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.9.tgz", + "integrity": "sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w==", + "dev": true, + "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=", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + } + } + } } }, "web3-bzz": { @@ -8344,7 +11695,7 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "websocket": { - "version": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", + "version": "github:web3-js/WebSocket-Node#ef5ea2f41daf4a2113b80c9223df884b4d56c400", "from": "github:web3-js/WebSocket-Node#polyfill/globalThis", "requires": { "debug": "^2.2.0", @@ -8435,6 +11786,15 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -8590,6 +11950,204 @@ "lodash.assign": "^4.0.6" } }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "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==", + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "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==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": 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", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "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=", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "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", diff --git a/package.json b/package.json index a354223..51e1cae 100644 --- a/package.json +++ b/package.json @@ -36,11 +36,15 @@ "truffle-verify": "^1.0.8" }, "devDependencies": { + "@nomiclabs/buidler": "^1.3.8", + "@nomiclabs/buidler-truffle5": "^1.3.4", + "@nomiclabs/buidler-web3": "^1.3.4", "@openzeppelin/test-helpers": "^0.5.6", "@studydefi/money-legos": "^2.3.5", "ganache-cli": "^6.10.0-beta.2", "sol-merger": "^2.0.1", "solidity-coverage": "0.5.11", - "solium": "1.2.3" + "solium": "1.2.3", + "web3": "^1.2.9" } } diff --git a/test/CurveSBTCProtocol.js b/test/CurveSBTCProtocol.js index c4bcbe7..f743036 100644 --- a/test/CurveSBTCProtocol.js +++ b/test/CurveSBTCProtocol.js @@ -78,8 +78,6 @@ contract('ConnectSBTCCurve', async accounts => { // Send ETH to master await web3.eth.sendTransaction({from: sender, to: masterAddress, value: ether("5")}); - let connectorID = await connectSBTCCurve.connectorID(); - // Enable the the given connector address await connectorInstance.methods.enable(connectSBTCCurve.address).send({from: masterAddress}); // check if the give connector address is enabled. diff --git a/test/SynthetixProtocol.js b/test/SynthetixProtocol.js index 6d968a6..cb6520b 100644 --- a/test/SynthetixProtocol.js +++ b/test/SynthetixProtocol.js @@ -8,24 +8,72 @@ const { const MockContract = artifacts.require("MockContract"); const MockSynthetixStaking = artifacts.require('MockSynthetixStaking'); +// const ConnectSynthetixStaking = artifacts.require('ConnectSynthetixStaking'); const erc20ABI = require("./abi/erc20.js"); +const synthetixStaking = require("./abi/synthetixStaking.json"); contract('ConnectSynthetixStaking', async accounts => { const [sender, receiver] = accounts; - const mock = await MockContract.deployed(); - const mockSynthetixStaking = await MockSynthetixStaking.deployed(); - const crvRenWSBTCContract = new web3.eth.Contract(erc20ABI, mock.address); + let mock, mockSynthetixStaking, stakingContract, token; before(async function () { - let methodId = await crvRenWSBTCContract.methods.balanceOf(sender).encodeABI(); - await mock.givenMethodReturnUint(methodId, 10000000); + // const connectSynthetixStaking = await ConnectSynthetixStaking.deployed(); + mock = await MockContract.new(); + mockSynthetixStaking = await MockSynthetixStaking.new(mock.address); + stakingContract = new web3.eth.Contract(synthetixStaking, mock.address); + token = new web3.eth.Contract(erc20ABI, mock.address); - let crvRenWSBTC = await crvRenWSBTCContract.methods.balanceOf(sender).call(); + // mocking balanceOf + let balanceOf = await token.methods.balanceOf(mockSynthetixStaking.address).encodeABI(); + await mock.givenMethodReturnUint(balanceOf, 10000000); + + // mocking approve + let approve = await token.methods.approve(mockSynthetixStaking.address, 10000000).encodeABI(); + await mock.givenMethodReturnBool(approve, "true"); - expect(crvRenWSBTC).to.equal("10000000"); }) - it('can mock token', async function() { - // expect(wbtcAfter - wbtcBefore).to.be.at.least(10000000); + it('can deposit', async function() { + // mocking stake + let stake = await stakingContract.methods.stake(10000000).encodeABI(); + await mock.givenMethodReturnBool(stake, "true"); + + const tx = await mockSynthetixStaking.deposit( + mock.address, + 10000000, + 0, + 0 + ) + expectEvent(tx, "LogDeposit"); + }); + + it('can withdraw', async function() { + // mocking withdraw + let withdraw = await stakingContract.methods.withdraw(10000000).encodeABI(); + await mock.givenMethodReturnBool(withdraw, "true"); + // mocking getReward + let reward = await stakingContract.methods.getReward().encodeABI(); + await mock.givenMethodReturnBool(reward, "true"); + + const tx = await mockSynthetixStaking.withdraw( + mock.address, + 10000000, + 0, + 111, + 112 + ) + expectEvent(tx, "LogWithdraw"); + expectEvent(tx, "LogClaimedReward"); + }); + + it('can claim reward', async function() { + // mocking getReward + let reward = await stakingContract.methods.getReward().encodeABI(); + await mock.givenMethodReturnBool(reward, "true"); + const tx = await mockSynthetixStaking.claimReward( + mock.address, + 112 + ) + expectEvent(tx, "LogClaimedReward"); }); }) diff --git a/test/abi/synthetixStaking.json b/test/abi/synthetixStaking.json new file mode 100644 index 0000000..2702680 --- /dev/null +++ b/test/abi/synthetixStaking.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_rewardsDistribution","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDistribution","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsDistribution","type":"address"}],"name":"setRewardsDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}] From ce11ae6b87ab021d69da9c2dbb00e579e827c331 Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Sun, 12 Jul 2020 03:42:59 +1000 Subject: [PATCH 16/22] removed constructor from synthetix connector; overwriting getSynthetixStakingAddr in mock; comment out everything in migration; --- contracts/connectors/synthetix.sol | 23 ++++++----------------- contracts/tests/MockSynthetix.sol | 6 ++++-- migrations/2_deploy_connector.js | 14 +++++++------- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index 66ffd2b..ce91ebb 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -13,22 +13,16 @@ interface IStakingRewards { } contract SynthetixStakingHelper is DSMath, Stores { - IStakingRewards stakingContract; - - constructor(address _synthetixStakingAddr) public { - stakingContract = IStakingRewards(_synthetixStakingAddr); - } - /** * @dev Return Synthetix staking pool address. */ - function getSynthetixStakingAddr(address token) virtual internal { + function getSynthetixStakingAddr(address token) virtual internal returns (address) { if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ // SBTC - stakingContract = IStakingRewards(0x13C1542A468319688B89E323fe9A3Be3A90EBb27); + return 0x13C1542A468319688B89E323fe9A3Be3A90EBb27; } else if (token == address(0xC25a3A3b969415c80451098fa907EC722572917F)){ // SUSD - stakingContract = IStakingRewards(0xDCB6A51eA3CA5d3Fd898Fd6564757c7aAeC3ca92); + return 0xDCB6A51eA3CA5d3Fd898Fd6564757c7aAeC3ca92; } else { revert("token-not-found"); } @@ -44,8 +38,6 @@ contract SynthetixStakingHelper is DSMath, Stores { contract SynthetixStaking is SynthetixStakingHelper { - constructor(address _synthetixStakingAddr) SynthetixStakingHelper(_synthetixStakingAddr) public {} - // Events event LogDeposit( address token, @@ -79,7 +71,7 @@ contract SynthetixStaking is SynthetixStakingHelper { uint setId ) external payable { uint _amt = getUint(getId, amt); - getSynthetixStakingAddr(token); + IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); TokenInterface _stakeToken = TokenInterface(token); _amt = _amt == uint(-1) ? _stakeToken.balanceOf(address(this)) : _amt; @@ -109,7 +101,7 @@ contract SynthetixStaking is SynthetixStakingHelper { uint setIdReward ) external payable { uint _amt = getUint(getId, amt); - getSynthetixStakingAddr(token); + IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); TokenInterface snxToken = TokenInterface(getSnxAddr()); uint intialBal = snxToken.balanceOf(address(this)); @@ -146,7 +138,7 @@ contract SynthetixStaking is SynthetixStakingHelper { address token, uint setId ) external payable { - getSynthetixStakingAddr(token); + IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); TokenInterface snxToken = TokenInterface(getSnxAddr()); uint intialBal = snxToken.balanceOf(address(this)); @@ -165,7 +157,4 @@ contract SynthetixStaking is SynthetixStakingHelper { contract ConnectSynthetixStaking is SynthetixStaking { string public name = "synthetix-staking-v1"; - - constructor(address _synthetixStakingAddr) SynthetixStaking(_synthetixStakingAddr) public {} - } diff --git a/contracts/tests/MockSynthetix.sol b/contracts/tests/MockSynthetix.sol index 9afed3a..80fe315 100644 --- a/contracts/tests/MockSynthetix.sol +++ b/contracts/tests/MockSynthetix.sol @@ -5,11 +5,13 @@ import { ConnectSynthetixStaking } from "../connectors/synthetix.sol"; contract MockSynthetixStaking is ConnectSynthetixStaking{ address public synthetixStakingAddr; - constructor(address _synthetixStakingAddr) ConnectSynthetixStaking(_synthetixStakingAddr) public { + constructor(address _synthetixStakingAddr) public { synthetixStakingAddr = _synthetixStakingAddr; } - function getSynthetixStakingAddr(address token) override internal{} + function getSynthetixStakingAddr(address token) override internal returns (address) { + return synthetixStakingAddr; + } function emitEvent(bytes32 eventCode, bytes memory eventData) override internal {} diff --git a/migrations/2_deploy_connector.js b/migrations/2_deploy_connector.js index c096106..63dbb27 100644 --- a/migrations/2_deploy_connector.js +++ b/migrations/2_deploy_connector.js @@ -1,7 +1,7 @@ // const CurveProtocol = artifacts.require("CurveProtocol"); // const ConnectSBTCCurve = artifacts.require("ConnectSBTCCurve"); -const MockContract = artifacts.require("MockContract"); -const MockSynthetixStaking = artifacts.require("MockSynthetixStaking"); +// const MockContract = artifacts.require("MockContract"); +// const MockSynthetixStaking = artifacts.require("MockSynthetixStaking"); // const ConnectSynthetixStaking = artifacts.require("ConnectSynthetixStaking"); // const connectorsABI = require("../test/abi/connectors.json"); @@ -11,10 +11,10 @@ const MockSynthetixStaking = artifacts.require("MockSynthetixStaking"); module.exports = async function(deployer) { // deployer.deploy(CurveProtocol); // let connectorLength = await connectorInstance.methods.connectorLength().call(); - deployer.deploy(MockContract).then(function () { - // return deployer.deploy(MockSynthetixStaking, MockContract.address, 1, +connectorLength + 1); - // return deployer.deploy(ConnectSynthetixStaking, MockContract.address); - return deployer.deploy(MockSynthetixStaking, MockContract.address); - }); + // deployer.deploy(MockContract).then(function () { + // // return deployer.deploy(MockSynthetixStaking, MockContract.address, 1, +connectorLength + 1); + // // return deployer.deploy(ConnectSynthetixStaking, MockContract.address); + // return deployer.deploy(MockSynthetixStaking, MockContract.address); + // }); }; From 7f5e85df93e17bebedb9ff37c7d097b2598a33ed Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Mon, 13 Jul 2020 21:01:59 +0530 Subject: [PATCH 17/22] Update synthetix.sol --- contracts/connectors/synthetix.sol | 135 ++++++++++++++++++----------- 1 file changed, 84 insertions(+), 51 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index ce91ebb..a658652 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -1,4 +1,5 @@ pragma solidity ^0.6.0; +pragma experimental ABIEncoderV2; // import files from common directory import { TokenInterface } from "../common/interfaces.sol"; @@ -10,107 +11,138 @@ interface IStakingRewards { function exit() external; function withdraw(uint256 amount) external; function getReward() external; + function balanceOf(address) external view returns(uint); +} + +interface SynthetixMapping { + struct StakingData { + address stakingPool; + address stakingToken; + } + + function stakingMapping(bytes32) external view returns(StakingData memory); } contract SynthetixStakingHelper is DSMath, Stores { - /** - * @dev Return Synthetix staking pool address. - */ - function getSynthetixStakingAddr(address token) virtual internal returns (address) { - if (token == address(0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3)){ - // SBTC - return 0x13C1542A468319688B89E323fe9A3Be3A90EBb27; - } else if (token == address(0xC25a3A3b969415c80451098fa907EC722572917F)){ - // SUSD - return 0xDCB6A51eA3CA5d3Fd898Fd6564757c7aAeC3ca92; - } else { - revert("token-not-found"); + /** + * @dev Return InstaDApp Synthetix Mapping Addresses + */ + function getMappingAddr() internal pure returns (address) { + return 0xe81F70Cc7C0D46e12d70efc60607F16bbD617E88; // InstaMapping Address } - } - /** - * @dev Return Synthetix Token address. - */ - function getSnxAddr() virtual internal view returns (address) { - return 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; - } + /** + * @dev Return Synthetix Token address. + */ + function getSnxAddr() internal pure returns (address) { + return 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; + } + + /** + * @dev Convert String to bytes32. + */ + function stringToBytes32(string memory str) internal pure returns (bytes32 result) { + require(bytes(str).length != 0, "string-empty"); + // solium-disable-next-line security/no-inline-assembly + assembly { + result := mload(add(str, 32)) + } + } + + /** + * @dev Get staking data + */ + function getStakingData(string memory stakingName) + internal + view + returns ( + IStakingRewards stakingContract, + TokenInterface stakingToken, + bytes32 stakingType + ) + { + stakingType = stringToBytes32(stakingName); + SynthetixMapping.StakingData memory stakingData = SynthetixMapping(getMappingAddr()).stakingMapping(stakingType); + require(stakingData.stakingPool != address(0), "Wrong Staking Name"); + require(stakingData.stakingToken != address(0), "Wrong Staking Name"); + stakingContract = IStakingRewards(stakingData.stakingPool); + stakingToken = TokenInterface(stakingData.stakingToken); + } } contract SynthetixStaking is SynthetixStakingHelper { - - // Events event LogDeposit( address token, + bytes32 stakingType, uint256 amount, uint getId, uint setId ); event LogWithdraw( address token, + bytes32 stakingType, uint256 amount, uint getId, uint setId ); event LogClaimedReward( address token, + bytes32 stakingType, uint256 rewardAmt, uint setId ); /** * @dev Deposit Token. - * @param token staking token address. + * @param stakingPoolName staking token address. * @param amt staking token amount. * @param getId Get token amount at this ID from `InstaMemory` Contract. * @param setId Set token amount at this ID in `InstaMemory` Contract. */ function deposit( - address token, + string calldata stakingPoolName, uint amt, uint getId, uint setId ) external payable { uint _amt = getUint(getId, amt); - IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); - TokenInterface _stakeToken = TokenInterface(token); - _amt = _amt == uint(-1) ? _stakeToken.balanceOf(address(this)) : _amt; + (IStakingRewards stakingContract, TokenInterface stakingToken, bytes32 stakingType) = getStakingData(stakingPoolName); + _amt = _amt == uint(-1) ? stakingToken.balanceOf(address(this)) : _amt; - _stakeToken.approve(address(stakingContract), _amt); + stakingToken.approve(address(stakingContract), _amt); stakingContract.stake(_amt); setUint(setId, _amt); - emit LogDeposit(token, _amt, getId, setId); - bytes32 _eventCode = keccak256("LogDeposit(address,uint256,uint256,uint256)"); - bytes memory _eventParam = abi.encode(token, _amt, getId, setId); + emit LogDeposit(address(stakingToken), stakingType, _amt, getId, setId); + bytes32 _eventCode = keccak256("LogDeposit(address,bytes32,uint256,uint256,uint256)"); + bytes memory _eventParam = abi.encode(address(stakingToken), stakingType, _amt, getId, setId); emitEvent(_eventCode, _eventParam); } /** * @dev Withdraw Token. - * @param token staking token address. + * @param stakingPoolName staking token address. * @param amt staking token amount. * @param getId Get token amount at this ID from `InstaMemory` Contract. * @param setIdAmount Set token amount at this ID in `InstaMemory` Contract. * @param setIdReward Set reward amount at this ID in `InstaMemory` Contract. */ function withdraw( - address token, + string calldata stakingPoolName, uint amt, uint getId, uint setIdAmount, uint setIdReward ) external payable { uint _amt = getUint(getId, amt); - IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); + (IStakingRewards stakingContract, TokenInterface stakingToken, bytes32 stakingType) = getStakingData(stakingPoolName); + TokenInterface snxToken = TokenInterface(getSnxAddr()); + _amt = _amt == uint(-1) ? stakingContract.balanceOf(address(this)) : _amt; uint intialBal = snxToken.balanceOf(address(this)); - if (_amt == uint(-1)) { - stakingContract.exit(); - } else{ - stakingContract.withdraw(_amt); - stakingContract.getReward(); - } + stakingContract.withdraw(_amt); + stakingContract.getReward(); uint finalBal = snxToken.balanceOf(address(this)); uint rewardAmt = sub(finalBal, intialBal); @@ -118,27 +150,28 @@ contract SynthetixStaking is SynthetixStakingHelper { setUint(setIdAmount, _amt); setUint(setIdReward, rewardAmt); - emit LogWithdraw(token, _amt, getId, setIdAmount); - bytes32 _eventCodeWithdraw = keccak256("LogWithdraw(address,uint256,uint256,uint256)"); - bytes memory _eventParamWithdraw = abi.encode(token, _amt, getId, setIdAmount); + emit LogWithdraw(address(stakingToken), stakingType, _amt, getId, setIdAmount); + bytes32 _eventCodeWithdraw = keccak256("LogWithdraw(address,bytes32,uint256,uint256,uint256)"); + bytes memory _eventParamWithdraw = abi.encode(address(stakingToken), _amt, getId, setIdAmount); emitEvent(_eventCodeWithdraw, _eventParamWithdraw); - emit LogClaimedReward(token, rewardAmt, setIdReward); - bytes32 _eventCodeReward = keccak256("LogClaimedReward(address,uint256,uint256)"); - bytes memory _eventParamReward = abi.encode(token, rewardAmt, setIdReward); + emit LogClaimedReward(address(stakingToken), stakingType, rewardAmt, setIdReward); + bytes32 _eventCodeReward = keccak256("LogClaimedReward(address,bytes32,uint256,uint256)"); + bytes memory _eventParamReward = abi.encode(address(stakingToken), rewardAmt, setIdReward); emitEvent(_eventCodeReward, _eventParamReward); } /** * @dev Claim Reward. - * @param token staking token address. + * @param stakingPoolName staking token address. * @param setId Set reward amount at this ID in `InstaMemory` Contract. */ function claimReward( - address token, + string calldata stakingPoolName, uint setId ) external payable { - IStakingRewards stakingContract = IStakingRewards(getSynthetixStakingAddr(token)); + (IStakingRewards stakingContract, TokenInterface stakingToken, bytes32 stakingType) = getStakingData(stakingPoolName); + TokenInterface snxToken = TokenInterface(getSnxAddr()); uint intialBal = snxToken.balanceOf(address(this)); @@ -148,9 +181,9 @@ contract SynthetixStaking is SynthetixStakingHelper { uint rewardAmt = sub(finalBal, intialBal); setUint(setId, rewardAmt); - emit LogClaimedReward(token, rewardAmt, setId); - bytes32 _eventCode = keccak256("LogClaimedReward(address,uint256,uint256)"); - bytes memory _eventParam = abi.encode(token, rewardAmt, setId); + emit LogClaimedReward(address(stakingToken), stakingType, rewardAmt, setId); + bytes32 _eventCode = keccak256("LogClaimedReward(address,bytes32,uint256,uint256)"); + bytes memory _eventParam = abi.encode(address(stakingToken), stakingType, rewardAmt, setId); emitEvent(_eventCode, _eventParam); } } From 819fead05835038870f2db040239db2c2daff21b Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Mon, 13 Jul 2020 21:02:50 +0530 Subject: [PATCH 18/22] Created staking mapping contract --- contracts/mapping/staking.sol | 94 +++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 contracts/mapping/staking.sol diff --git a/contracts/mapping/staking.sol b/contracts/mapping/staking.sol new file mode 100644 index 0000000..88cad11 --- /dev/null +++ b/contracts/mapping/staking.sol @@ -0,0 +1,94 @@ +pragma solidity ^0.6.0; +pragma experimental ABIEncoderV2; + +interface ConnectorsInterface { + function chief(address) external view returns (bool); +} + +interface IndexInterface { + function master() external view returns (address); +} + +contract BytesHelper { + /** + * @dev Convert String to bytes32. + */ + function stringToBytes32(string memory str) internal pure returns (bytes32 result) { + require(bytes(str).length != 0, "String-Empty"); + // solium-disable-next-line security/no-inline-assembly + assembly { + result := mload(add(str, 32)) + } + } + + /** + * @dev Convert bytes32 to String. + */ + function bytes32ToString(bytes32 _bytes32) internal pure returns (string memory) { + bytes32 _temp; + uint count; + for (uint256 i; i < 32; i++) { + _temp = _bytes32[i]; + if( _temp != bytes32(0)) { + count += 1; + } + } + bytes memory bytesArray = new bytes(count); + for (uint256 i; i < count; i++) { + bytesArray[i] = (_bytes32[i]); + } + return (string(bytesArray)); + } +} +contract Helpers is BytesHelper { + address public constant connectors = 0xD6A602C01a023B98Ecfb29Df02FBA380d3B21E0c; + address public constant instaIndex = 0x2971AdFa57b20E5a416aE5a708A8655A9c74f723; + uint public version = 1; + + struct StakingData { + address stakingPool; + address stakingToken; + } + mapping (bytes32 => StakingData) public stakingMapping; + + event LogAddStakingMapping(string stakingName, bytes32 stakingType, address stakingAddress, address stakingToken); + event LogRemoveStakingMapping(string stakingName, bytes32 stakingType, address stakingAddress, address stakingToken); + + modifier isChief { + require( + ConnectorsInterface(connectors).chief(msg.sender) || + IndexInterface(instaIndex).master() == msg.sender, "not-Chief"); + _; + } + function addStakingMapping(string memory stakingName, address stakingAddress, address stakingToken) public isChief { + require(stakingAddress != address(0), "StakingPool-not-vaild"); + require(stakingToken != address(0), "StakingToken-not-vaild"); + require(bytes(stakingName).length < 32, "Lenght-exceeds"); // TODO - test this. + bytes32 stakeType = stringToBytes32(stakingName); + require(stakingMapping[stakeType].stakingPool == address(0), "StakingPool-Already-Added"); + require(stakingMapping[stakeType].stakingToken == address(0), "StakingPool-Already-Added"); + + stakingMapping[stakeType] = StakingData( + stakingAddress, + stakingToken + ); + emit LogAddStakingMapping(stakingName, stakeType, stakingAddress, stakingToken); + } + + function removeStakingMapping(string memory stakingName, address stakingAddress) public isChief { + require(stakingAddress != address(0), "StakingPool-not-vaild"); + require(bytes(stakingName).length < 32, "Lenght-exceeds"); // TODO - test this. + bytes32 stakeType = stringToBytes32(stakingName); + require(stakingMapping[stakeType].stakingPool != address(0), "StakingPool-Already-Added"); + require(stakingMapping[stakeType].stakingToken != address(0), "StakingPool-Already-Added"); + require(stakingMapping[stakeType].stakingPool == stakingAddress, "Not-same-staking-pool"); + + emit LogRemoveStakingMapping(stakingName, stakeType, stakingAddress, stakingMapping[stakeType].stakingToken); + delete stakingMapping[stakeType]; + } +} + + +contract InstaMapping is Helpers { + string constant public name = "Synthetix-Mapping-v1"; +} From df61aebc582b31732dc0592caf0f67a9731564b9 Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Tue, 14 Jul 2020 16:37:08 +1000 Subject: [PATCH 19/22] WIP having InternalCompilerError; formating synthetic.sol and staking.sol; Adding MockInstaMapping; update test; --- contracts/connectors/synthetix.sol | 111 +++++++++++----------- contracts/mapping/staking.sol | 136 +++++++++++++-------------- contracts/tests/MockInstaMapping.sol | 7 ++ contracts/tests/MockSynthetix.sol | 6 +- test/SynthetixProtocol.js | 6 +- 5 files changed, 138 insertions(+), 128 deletions(-) create mode 100644 contracts/tests/MockInstaMapping.sol diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index a658652..6ee08c0 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -15,59 +15,60 @@ interface IStakingRewards { } interface SynthetixMapping { - struct StakingData { - address stakingPool; - address stakingToken; - } + struct StakingData { + address stakingPool; + address stakingToken; + } function stakingMapping(bytes32) external view returns(StakingData memory); } contract SynthetixStakingHelper is DSMath, Stores { - /** - * @dev Return InstaDApp Synthetix Mapping Addresses - */ - function getMappingAddr() internal pure returns (address) { - return 0xe81F70Cc7C0D46e12d70efc60607F16bbD617E88; // InstaMapping Address - } + /** + * @dev Return InstaDApp Synthetix Mapping Addresses + */ + function getMappingAddr() internal pure returns (address) { + return 0xe81F70Cc7C0D46e12d70efc60607F16bbD617E88; // InstaMapping Address + } - /** - * @dev Return Synthetix Token address. - */ - function getSnxAddr() internal pure returns (address) { - return 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; - } + /** + * @dev Return Synthetix Token address. + */ + function getSnxAddr() virtual internal view returns (address) { + return 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; + } - /** - * @dev Convert String to bytes32. - */ - function stringToBytes32(string memory str) internal pure returns (bytes32 result) { - require(bytes(str).length != 0, "string-empty"); - // solium-disable-next-line security/no-inline-assembly - assembly { - result := mload(add(str, 32)) - } + /** + * @dev Convert String to bytes32. + */ + function stringToBytes32(string memory str) internal pure returns (bytes32 result) { + require(bytes(str).length != 0, "string-empty"); + // solium-disable-next-line security/no-inline-assembly + assembly { +result := mload(add(str, 32)) } + } - /** - * @dev Get staking data - */ - function getStakingData(string memory stakingName) - internal - view - returns ( - IStakingRewards stakingContract, - TokenInterface stakingToken, - bytes32 stakingType - ) - { - stakingType = stringToBytes32(stakingName); - SynthetixMapping.StakingData memory stakingData = SynthetixMapping(getMappingAddr()).stakingMapping(stakingType); - require(stakingData.stakingPool != address(0), "Wrong Staking Name"); - require(stakingData.stakingToken != address(0), "Wrong Staking Name"); - stakingContract = IStakingRewards(stakingData.stakingPool); - stakingToken = TokenInterface(stakingData.stakingToken); - } + /** + * @dev Get staking data + */ + function getStakingData(string memory stakingName) + virtual + internal + view + returns ( + IStakingRewards stakingContract, + TokenInterface stakingToken, + bytes32 stakingType + ) + { + stakingType = stringToBytes32(stakingName); + SynthetixMapping.StakingData memory stakingData = SynthetixMapping(getMappingAddr()).stakingMapping(stakingType); + require(stakingData.stakingPool != address(0), "Wrong Staking Name"); + require(stakingData.stakingToken != address(0), "Wrong Staking Name"); + stakingContract = IStakingRewards(stakingData.stakingPool); + stakingToken = TokenInterface(stakingData.stakingToken); + } } contract SynthetixStaking is SynthetixStakingHelper { @@ -95,10 +96,10 @@ contract SynthetixStaking is SynthetixStakingHelper { /** * @dev Deposit Token. * @param stakingPoolName staking token address. - * @param amt staking token amount. - * @param getId Get token amount at this ID from `InstaMemory` Contract. - * @param setId Set token amount at this ID in `InstaMemory` Contract. - */ + * @param amt staking token amount. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ function deposit( string calldata stakingPoolName, uint amt, @@ -122,11 +123,11 @@ contract SynthetixStaking is SynthetixStakingHelper { /** * @dev Withdraw Token. * @param stakingPoolName staking token address. - * @param amt staking token amount. - * @param getId Get token amount at this ID from `InstaMemory` Contract. - * @param setIdAmount Set token amount at this ID in `InstaMemory` Contract. - * @param setIdReward Set reward amount at this ID in `InstaMemory` Contract. - */ + * @param amt staking token amount. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setIdAmount Set token amount at this ID in `InstaMemory` Contract. + * @param setIdReward Set reward amount at this ID in `InstaMemory` Contract. + */ function withdraw( string calldata stakingPoolName, uint amt, @@ -164,8 +165,8 @@ contract SynthetixStaking is SynthetixStakingHelper { /** * @dev Claim Reward. * @param stakingPoolName staking token address. - * @param setId Set reward amount at this ID in `InstaMemory` Contract. - */ + * @param setId Set reward amount at this ID in `InstaMemory` Contract. + */ function claimReward( string calldata stakingPoolName, uint setId diff --git a/contracts/mapping/staking.sol b/contracts/mapping/staking.sol index 88cad11..4893810 100644 --- a/contracts/mapping/staking.sol +++ b/contracts/mapping/staking.sol @@ -2,93 +2,93 @@ pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface ConnectorsInterface { - function chief(address) external view returns (bool); + function chief(address) external view returns (bool); } interface IndexInterface { - function master() external view returns (address); + function master() external view returns (address); } contract BytesHelper { - /** - * @dev Convert String to bytes32. - */ - function stringToBytes32(string memory str) internal pure returns (bytes32 result) { - require(bytes(str).length != 0, "String-Empty"); - // solium-disable-next-line security/no-inline-assembly - assembly { - result := mload(add(str, 32)) - } + /** + * @dev Convert String to bytes32. + */ + function stringToBytes32(string memory str) internal pure returns (bytes32 result) { + require(bytes(str).length != 0, "String-Empty"); + // solium-disable-next-line security/no-inline-assembly + assembly { + result := mload(add(str, 32)) } + } - /** - * @dev Convert bytes32 to String. - */ - function bytes32ToString(bytes32 _bytes32) internal pure returns (string memory) { - bytes32 _temp; - uint count; - for (uint256 i; i < 32; i++) { - _temp = _bytes32[i]; - if( _temp != bytes32(0)) { - count += 1; - } - } - bytes memory bytesArray = new bytes(count); - for (uint256 i; i < count; i++) { - bytesArray[i] = (_bytes32[i]); - } - return (string(bytesArray)); + /** + * @dev Convert bytes32 to String. + */ + function bytes32ToString(bytes32 _bytes32) internal pure returns (string memory) { + bytes32 _temp; + uint count; + for (uint256 i; i < 32; i++) { + _temp = _bytes32[i]; + if( _temp != bytes32(0)) { + count += 1; + } } + bytes memory bytesArray = new bytes(count); + for (uint256 i; i < count; i++) { + bytesArray[i] = (_bytes32[i]); + } + return (string(bytesArray)); + } } contract Helpers is BytesHelper { - address public constant connectors = 0xD6A602C01a023B98Ecfb29Df02FBA380d3B21E0c; - address public constant instaIndex = 0x2971AdFa57b20E5a416aE5a708A8655A9c74f723; - uint public version = 1; + address public constant connectors = 0xD6A602C01a023B98Ecfb29Df02FBA380d3B21E0c; + address public constant instaIndex = 0x2971AdFa57b20E5a416aE5a708A8655A9c74f723; + uint public version = 1; - struct StakingData { - address stakingPool; - address stakingToken; - } - mapping (bytes32 => StakingData) public stakingMapping; + struct StakingData { + address stakingPool; + address stakingToken; + } + mapping (bytes32 => StakingData) public stakingMapping; - event LogAddStakingMapping(string stakingName, bytes32 stakingType, address stakingAddress, address stakingToken); - event LogRemoveStakingMapping(string stakingName, bytes32 stakingType, address stakingAddress, address stakingToken); + event LogAddStakingMapping(string stakingName, bytes32 stakingType, address stakingAddress, address stakingToken); + event LogRemoveStakingMapping(string stakingName, bytes32 stakingType, address stakingAddress, address stakingToken); - modifier isChief { - require( - ConnectorsInterface(connectors).chief(msg.sender) || - IndexInterface(instaIndex).master() == msg.sender, "not-Chief"); - _; - } - function addStakingMapping(string memory stakingName, address stakingAddress, address stakingToken) public isChief { - require(stakingAddress != address(0), "StakingPool-not-vaild"); - require(stakingToken != address(0), "StakingToken-not-vaild"); - require(bytes(stakingName).length < 32, "Lenght-exceeds"); // TODO - test this. - bytes32 stakeType = stringToBytes32(stakingName); - require(stakingMapping[stakeType].stakingPool == address(0), "StakingPool-Already-Added"); - require(stakingMapping[stakeType].stakingToken == address(0), "StakingPool-Already-Added"); + modifier isChief virtual { + require( + ConnectorsInterface(connectors).chief(msg.sender) || + IndexInterface(instaIndex).master() == msg.sender, "not-Chief"); + _; + } + function addStakingMapping(string memory stakingName, address stakingAddress, address stakingToken) public isChief { + require(stakingAddress != address(0), "StakingPool-not-vaild"); + require(stakingToken != address(0), "StakingToken-not-vaild"); + require(bytes(stakingName).length < 32, "Lenght-exceeds"); // TODO - test this. + bytes32 stakeType = stringToBytes32(stakingName); + require(stakingMapping[stakeType].stakingPool == address(0), "StakingPool-Already-Added"); + require(stakingMapping[stakeType].stakingToken == address(0), "StakingPool-Already-Added"); - stakingMapping[stakeType] = StakingData( - stakingAddress, - stakingToken - ); - emit LogAddStakingMapping(stakingName, stakeType, stakingAddress, stakingToken); - } + stakingMapping[stakeType] = StakingData( + stakingAddress, + stakingToken + ); + emit LogAddStakingMapping(stakingName, stakeType, stakingAddress, stakingToken); + } - function removeStakingMapping(string memory stakingName, address stakingAddress) public isChief { - require(stakingAddress != address(0), "StakingPool-not-vaild"); - require(bytes(stakingName).length < 32, "Lenght-exceeds"); // TODO - test this. - bytes32 stakeType = stringToBytes32(stakingName); - require(stakingMapping[stakeType].stakingPool != address(0), "StakingPool-Already-Added"); - require(stakingMapping[stakeType].stakingToken != address(0), "StakingPool-Already-Added"); - require(stakingMapping[stakeType].stakingPool == stakingAddress, "Not-same-staking-pool"); + function removeStakingMapping(string memory stakingName, address stakingAddress) public isChief { + require(stakingAddress != address(0), "StakingPool-not-vaild"); + require(bytes(stakingName).length < 32, "Lenght-exceeds"); // TODO - test this. + bytes32 stakeType = stringToBytes32(stakingName); + require(stakingMapping[stakeType].stakingPool != address(0), "StakingPool-Already-Added"); + require(stakingMapping[stakeType].stakingToken != address(0), "StakingPool-Already-Added"); + require(stakingMapping[stakeType].stakingPool == stakingAddress, "Not-same-staking-pool"); - emit LogRemoveStakingMapping(stakingName, stakeType, stakingAddress, stakingMapping[stakeType].stakingToken); - delete stakingMapping[stakeType]; - } + emit LogRemoveStakingMapping(stakingName, stakeType, stakingAddress, stakingMapping[stakeType].stakingToken); + delete stakingMapping[stakeType]; + } } contract InstaMapping is Helpers { - string constant public name = "Synthetix-Mapping-v1"; + string constant public name = "Synthetix-Mapping-v1"; } diff --git a/contracts/tests/MockInstaMapping.sol b/contracts/tests/MockInstaMapping.sol new file mode 100644 index 0000000..9f508aa --- /dev/null +++ b/contracts/tests/MockInstaMapping.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.6.0; + +import { InstaMapping } from "../mapping/staking.sol"; + +contract MockInstaMapping is InstaMapping { + modifier isChief override {_;} +} diff --git a/contracts/tests/MockSynthetix.sol b/contracts/tests/MockSynthetix.sol index 80fe315..33a393e 100644 --- a/contracts/tests/MockSynthetix.sol +++ b/contracts/tests/MockSynthetix.sol @@ -9,9 +9,9 @@ contract MockSynthetixStaking is ConnectSynthetixStaking{ synthetixStakingAddr = _synthetixStakingAddr; } - function getSynthetixStakingAddr(address token) override internal returns (address) { - return synthetixStakingAddr; - } + // function getSynthetixStakingAddr(address token) override internal returns (address) { + // return synthetixStakingAddr; + // } function emitEvent(bytes32 eventCode, bytes memory eventData) override internal {} diff --git a/test/SynthetixProtocol.js b/test/SynthetixProtocol.js index cb6520b..978e6fd 100644 --- a/test/SynthetixProtocol.js +++ b/test/SynthetixProtocol.js @@ -8,20 +8,22 @@ const { const MockContract = artifacts.require("MockContract"); const MockSynthetixStaking = artifacts.require('MockSynthetixStaking'); -// const ConnectSynthetixStaking = artifacts.require('ConnectSynthetixStaking'); +const MockInstaMapping = artifacts.require('MockInstaMapping'); const erc20ABI = require("./abi/erc20.js"); const synthetixStaking = require("./abi/synthetixStaking.json"); contract('ConnectSynthetixStaking', async accounts => { const [sender, receiver] = accounts; let mock, mockSynthetixStaking, stakingContract, token; + let instaMapping; before(async function () { - // const connectSynthetixStaking = await ConnectSynthetixStaking.deployed(); mock = await MockContract.new(); + mockInstaMapping = await MockInstaMapping.new(); mockSynthetixStaking = await MockSynthetixStaking.new(mock.address); stakingContract = new web3.eth.Contract(synthetixStaking, mock.address); token = new web3.eth.Contract(erc20ABI, mock.address); + mockInstaMapping.addStakingMapping('snx', mock.address, mock.address); // mocking balanceOf let balanceOf = await token.methods.balanceOf(mockSynthetixStaking.address).encodeABI(); From 9ce77c1336291b390337c713ec4d3743ccb8088f Mon Sep 17 00:00:00 2001 From: Lecky Lao Date: Wed, 15 Jul 2020 00:53:21 +1000 Subject: [PATCH 20/22] update getMappingAddr with virtual; Update MockSynthetix to override getMappingAddr; Update test case for adding and removing pool on mapping; --- contracts/connectors/synthetix.sol | 2 +- contracts/tests/MockSynthetix.sol | 13 ++++++++----- test/SynthetixProtocol.js | 24 ++++++++++++++++++++---- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index 6ee08c0..15d5416 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -27,7 +27,7 @@ contract SynthetixStakingHelper is DSMath, Stores { /** * @dev Return InstaDApp Synthetix Mapping Addresses */ - function getMappingAddr() internal pure returns (address) { + function getMappingAddr() virtual internal view returns (address) { return 0xe81F70Cc7C0D46e12d70efc60607F16bbD617E88; // InstaMapping Address } diff --git a/contracts/tests/MockSynthetix.sol b/contracts/tests/MockSynthetix.sol index 33a393e..b2a1dcd 100644 --- a/contracts/tests/MockSynthetix.sol +++ b/contracts/tests/MockSynthetix.sol @@ -1,23 +1,26 @@ pragma solidity ^0.6.0; +pragma experimental ABIEncoderV2; import { ConnectSynthetixStaking } from "../connectors/synthetix.sol"; contract MockSynthetixStaking is ConnectSynthetixStaking{ address public synthetixStakingAddr; + address public instaMappingAddr; - constructor(address _synthetixStakingAddr) public { + constructor(address _synthetixStakingAddr, address _instaMappingAddr) public { synthetixStakingAddr = _synthetixStakingAddr; + instaMappingAddr = _instaMappingAddr; } - // function getSynthetixStakingAddr(address token) override internal returns (address) { - // return synthetixStakingAddr; - // } - function emitEvent(bytes32 eventCode, bytes memory eventData) override internal {} function getSnxAddr() override internal view returns (address) { return synthetixStakingAddr; } + function getMappingAddr() override internal view returns (address) { + return instaMappingAddr; + } + function setUint(uint setId, uint val) override internal {} } diff --git a/test/SynthetixProtocol.js b/test/SynthetixProtocol.js index 978e6fd..378bf7f 100644 --- a/test/SynthetixProtocol.js +++ b/test/SynthetixProtocol.js @@ -20,7 +20,7 @@ contract('ConnectSynthetixStaking', async accounts => { before(async function () { mock = await MockContract.new(); mockInstaMapping = await MockInstaMapping.new(); - mockSynthetixStaking = await MockSynthetixStaking.new(mock.address); + mockSynthetixStaking = await MockSynthetixStaking.new(mock.address, mockInstaMapping.address); stakingContract = new web3.eth.Contract(synthetixStaking, mock.address); token = new web3.eth.Contract(erc20ABI, mock.address); mockInstaMapping.addStakingMapping('snx', mock.address, mock.address); @@ -41,7 +41,7 @@ contract('ConnectSynthetixStaking', async accounts => { await mock.givenMethodReturnBool(stake, "true"); const tx = await mockSynthetixStaking.deposit( - mock.address, + "snx", 10000000, 0, 0 @@ -58,7 +58,7 @@ contract('ConnectSynthetixStaking', async accounts => { await mock.givenMethodReturnBool(reward, "true"); const tx = await mockSynthetixStaking.withdraw( - mock.address, + "snx", 10000000, 0, 111, @@ -73,9 +73,25 @@ contract('ConnectSynthetixStaking', async accounts => { let reward = await stakingContract.methods.getReward().encodeABI(); await mock.givenMethodReturnBool(reward, "true"); const tx = await mockSynthetixStaking.claimReward( - mock.address, + "snx", 112 ) expectEvent(tx, "LogClaimedReward"); }); + + it('cannot deposit if pool removed', async function() { + mockInstaMapping.removeStakingMapping('snx', mock.address); + // mocking stake + let stake = await stakingContract.methods.stake(10000000).encodeABI(); + await mock.givenMethodReturnBool(stake, "true"); + + const tx = mockSynthetixStaking.deposit( + "snx", + 10000000, + 0, + 0 + ) + expectRevert(tx, "Wrong Staking Name"); + }); + }) From 18eedb8833e7e0d180199a56a2f6e8da12affbe5 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Tue, 14 Jul 2020 22:55:45 +0530 Subject: [PATCH 21/22] Minor changes in mapping contract --- contracts/mapping/staking.sol | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/contracts/mapping/staking.sol b/contracts/mapping/staking.sol index 4893810..fc0d22e 100644 --- a/contracts/mapping/staking.sol +++ b/contracts/mapping/staking.sol @@ -45,11 +45,12 @@ contract Helpers is BytesHelper { address public constant instaIndex = 0x2971AdFa57b20E5a416aE5a708A8655A9c74f723; uint public version = 1; + mapping (bytes32 => StakingData) public stakingMapping; + struct StakingData { address stakingPool; address stakingToken; } - mapping (bytes32 => StakingData) public stakingMapping; event LogAddStakingMapping(string stakingName, bytes32 stakingType, address stakingAddress, address stakingToken); event LogRemoveStakingMapping(string stakingName, bytes32 stakingType, address stakingAddress, address stakingToken); @@ -60,13 +61,14 @@ contract Helpers is BytesHelper { IndexInterface(instaIndex).master() == msg.sender, "not-Chief"); _; } + function addStakingMapping(string memory stakingName, address stakingAddress, address stakingToken) public isChief { - require(stakingAddress != address(0), "StakingPool-not-vaild"); - require(stakingToken != address(0), "StakingToken-not-vaild"); - require(bytes(stakingName).length < 32, "Lenght-exceeds"); // TODO - test this. + require(stakingAddress != address(0), "stakingAddress-not-vaild"); + require(stakingToken != address(0), "stakingToken-not-vaild"); + require(bytes(stakingName).length <= 32, "Length-exceeds"); bytes32 stakeType = stringToBytes32(stakingName); - require(stakingMapping[stakeType].stakingPool == address(0), "StakingPool-Already-Added"); - require(stakingMapping[stakeType].stakingToken == address(0), "StakingPool-Already-Added"); + require(stakingMapping[stakeType].stakingPool == address(0), "StakingPool-already-added"); + require(stakingMapping[stakeType].stakingToken == address(0), "StakingToken-already-added"); stakingMapping[stakeType] = StakingData( stakingAddress, @@ -76,12 +78,11 @@ contract Helpers is BytesHelper { } function removeStakingMapping(string memory stakingName, address stakingAddress) public isChief { - require(stakingAddress != address(0), "StakingPool-not-vaild"); - require(bytes(stakingName).length < 32, "Lenght-exceeds"); // TODO - test this. + require(stakingAddress != address(0), "stakingAddress-not-vaild"); bytes32 stakeType = stringToBytes32(stakingName); - require(stakingMapping[stakeType].stakingPool != address(0), "StakingPool-Already-Added"); - require(stakingMapping[stakeType].stakingToken != address(0), "StakingPool-Already-Added"); - require(stakingMapping[stakeType].stakingPool == stakingAddress, "Not-same-staking-pool"); + require(stakingMapping[stakeType].stakingPool != address(0), "StakingPool-not-added-yet"); + require(stakingMapping[stakeType].stakingToken != address(0), "StakingToken-not-added-yet"); + require(stakingMapping[stakeType].stakingPool == stakingAddress, "different-staking-pool"); emit LogRemoveStakingMapping(stakingName, stakeType, stakingAddress, stakingMapping[stakeType].stakingToken); delete stakingMapping[stakeType]; From c05d2b1ada498aa1c70c7945e2a96d3145fedced Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Tue, 14 Jul 2020 23:04:52 +0530 Subject: [PATCH 22/22] snx code refactoring --- contracts/connectors/synthetix.sol | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/contracts/connectors/synthetix.sol b/contracts/connectors/synthetix.sol index 15d5416..f1520d7 100644 --- a/contracts/connectors/synthetix.sol +++ b/contracts/connectors/synthetix.sol @@ -8,7 +8,6 @@ import { DSMath } from "../common/math.sol"; interface IStakingRewards { function stake(uint256 amount) external; - function exit() external; function withdraw(uint256 amount) external; function getReward() external; function balanceOf(address) external view returns(uint); @@ -27,14 +26,14 @@ contract SynthetixStakingHelper is DSMath, Stores { /** * @dev Return InstaDApp Synthetix Mapping Addresses */ - function getMappingAddr() virtual internal view returns (address) { + function getMappingAddr() internal virtual view returns (address) { return 0xe81F70Cc7C0D46e12d70efc60607F16bbD617E88; // InstaMapping Address } /** * @dev Return Synthetix Token address. */ - function getSnxAddr() virtual internal view returns (address) { + function getSnxAddr() internal virtual view returns (address) { return 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; } @@ -45,7 +44,7 @@ contract SynthetixStakingHelper is DSMath, Stores { require(bytes(str).length != 0, "string-empty"); // solium-disable-next-line security/no-inline-assembly assembly { -result := mload(add(str, 32)) + result := mload(add(str, 32)) } } @@ -53,8 +52,8 @@ result := mload(add(str, 32)) * @dev Get staking data */ function getStakingData(string memory stakingName) - virtual internal + virtual view returns ( IStakingRewards stakingContract, @@ -64,8 +63,7 @@ result := mload(add(str, 32)) { stakingType = stringToBytes32(stakingName); SynthetixMapping.StakingData memory stakingData = SynthetixMapping(getMappingAddr()).stakingMapping(stakingType); - require(stakingData.stakingPool != address(0), "Wrong Staking Name"); - require(stakingData.stakingToken != address(0), "Wrong Staking Name"); + require(stakingData.stakingPool != address(0) && stakingData.stakingToken != address(0), "Wrong Staking Name"); stakingContract = IStakingRewards(stakingData.stakingPool); stakingToken = TokenInterface(stakingData.stakingToken); } @@ -79,6 +77,7 @@ contract SynthetixStaking is SynthetixStakingHelper { uint getId, uint setId ); + event LogWithdraw( address token, bytes32 stakingType, @@ -86,6 +85,7 @@ contract SynthetixStaking is SynthetixStakingHelper { uint getId, uint setId ); + event LogClaimedReward( address token, bytes32 stakingType, @@ -95,11 +95,11 @@ contract SynthetixStaking is SynthetixStakingHelper { /** * @dev Deposit Token. - * @param stakingPoolName staking token address. + * @param stakingPoolName staking token address. * @param amt staking token amount. * @param getId Get token amount at this ID from `InstaMemory` Contract. * @param setId Set token amount at this ID in `InstaMemory` Contract. - */ + */ function deposit( string calldata stakingPoolName, uint amt, @@ -122,12 +122,12 @@ contract SynthetixStaking is SynthetixStakingHelper { /** * @dev Withdraw Token. - * @param stakingPoolName staking token address. + * @param stakingPoolName staking token address. * @param amt staking token amount. * @param getId Get token amount at this ID from `InstaMemory` Contract. * @param setIdAmount Set token amount at this ID in `InstaMemory` Contract. * @param setIdReward Set reward amount at this ID in `InstaMemory` Contract. - */ + */ function withdraw( string calldata stakingPoolName, uint amt, @@ -164,9 +164,9 @@ contract SynthetixStaking is SynthetixStakingHelper { /** * @dev Claim Reward. - * @param stakingPoolName staking token address. + * @param stakingPoolName staking token address. * @param setId Set reward amount at this ID in `InstaMemory` Contract. - */ + */ function claimReward( string calldata stakingPoolName, uint setId