Feat/bancor v2 (#2650)
* Bancor Bridge contract * refactor Quote and FillData types * BancorService (wrapper for the Bancor SDK) * disable bancor while waiting for bancor SDK update * add bancor to test
This commit is contained in:
		@@ -10,6 +10,10 @@
 | 
				
			|||||||
                "note": "Export DexForwarderBridgeContract",
 | 
					                "note": "Export DexForwarderBridgeContract",
 | 
				
			||||||
                "pr": 2656
 | 
					                "pr": 2656
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "note": "Add BancorBridge and IBancorNetwork, ",
 | 
				
			||||||
 | 
					                "pr": 2650
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                "note": "Added `MStableBridge`",
 | 
					                "note": "Added `MStableBridge`",
 | 
				
			||||||
                "pr": 2662
 | 
					                "pr": 2662
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										122
									
								
								contracts/asset-proxy/contracts/src/bridges/BancorBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								contracts/asset-proxy/contracts/src/bridges/BancorBridge.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,122 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright 2020 ZeroEx Intl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					  you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					  distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					  See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					  limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pragma solidity ^0.5.9;
 | 
				
			||||||
 | 
					pragma experimental ABIEncoderV2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol";
 | 
				
			||||||
 | 
					import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol";
 | 
				
			||||||
 | 
					import "@0x/contracts-exchange-libs/contracts/src/IWallet.sol";
 | 
				
			||||||
 | 
					import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol";
 | 
				
			||||||
 | 
					import "../interfaces/IERC20Bridge.sol";
 | 
				
			||||||
 | 
					import "../interfaces/IBancorNetwork.sol";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					contract BancorBridge is
 | 
				
			||||||
 | 
					    IERC20Bridge,
 | 
				
			||||||
 | 
					    IWallet,
 | 
				
			||||||
 | 
					    DeploymentConstants
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct TransferState {
 | 
				
			||||||
 | 
					        address bancorNetworkAddress;
 | 
				
			||||||
 | 
					        address[] path;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of
 | 
				
			||||||
 | 
					    ///      `toTokenAddress` tokens by selling the entirety of the `fromTokenAddress`
 | 
				
			||||||
 | 
					    ///      token encoded in the bridge data, then transfers the bought
 | 
				
			||||||
 | 
					    ///      tokens to `to`.
 | 
				
			||||||
 | 
					    /// @param toTokenAddress The token to buy and transfer to `to`.
 | 
				
			||||||
 | 
					    /// @param from The maker (this contract).
 | 
				
			||||||
 | 
					    /// @param to The recipient of the bought tokens.
 | 
				
			||||||
 | 
					    /// @param amount Minimum amount of `toTokenAddress` tokens to buy.
 | 
				
			||||||
 | 
					    /// @param bridgeData The abi-encoded conversion path addresses and Bancor network address
 | 
				
			||||||
 | 
					    /// @return success The magic bytes if successful.
 | 
				
			||||||
 | 
					    function bridgeTransferFrom(
 | 
				
			||||||
 | 
					        address toTokenAddress,
 | 
				
			||||||
 | 
					        address from,
 | 
				
			||||||
 | 
					        address to,
 | 
				
			||||||
 | 
					        uint256 amount,
 | 
				
			||||||
 | 
					        bytes calldata bridgeData
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					        returns (bytes4 success)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // hold variables to get around stack depth limitations
 | 
				
			||||||
 | 
					        TransferState memory state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Decode the bridge data.
 | 
				
			||||||
 | 
					        (
 | 
				
			||||||
 | 
					            state.path,
 | 
				
			||||||
 | 
					            state.bancorNetworkAddress
 | 
				
			||||||
 | 
					        // solhint-disable indent
 | 
				
			||||||
 | 
					        ) = abi.decode(bridgeData, (address[], address));
 | 
				
			||||||
 | 
					        // solhint-enable indent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        require(state.path.length > 0, "BancorBridge/PATH_MUST_EXIST");
 | 
				
			||||||
 | 
					        // Just transfer the tokens if they're the same.
 | 
				
			||||||
 | 
					        if (state.path[0] == toTokenAddress) {
 | 
				
			||||||
 | 
					            LibERC20Token.transfer(state.path[0], to, amount);
 | 
				
			||||||
 | 
					            return BRIDGE_SUCCESS;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Otherwise use Bancor to convert
 | 
				
			||||||
 | 
					        require(state.path.length > 2, "BancorBridge/PATH_LENGTH_MUST_BE_GREATER_THAN_TWO");
 | 
				
			||||||
 | 
					        require(state.path[state.path.length - 1] == toTokenAddress, "BancorBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN");
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        // // Grant an allowance to the Bancor Network to spend `fromTokenAddress` token.
 | 
				
			||||||
 | 
					        uint256 fromTokenBalance = IERC20Token(state.path[0]).balanceOf(address(this));
 | 
				
			||||||
 | 
					        LibERC20Token.approveIfBelow(state.path[0], state.bancorNetworkAddress, fromTokenBalance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Convert the tokens
 | 
				
			||||||
 | 
					        uint256 boughtAmount = IBancorNetwork(state.bancorNetworkAddress).convertByPath(
 | 
				
			||||||
 | 
					            state.path, // path originating with source token and terminating in destination token
 | 
				
			||||||
 | 
					            fromTokenBalance, // amount of source token to trade
 | 
				
			||||||
 | 
					            amount, // minimum amount of destination token expected to receive
 | 
				
			||||||
 | 
					            to, // beneficiary
 | 
				
			||||||
 | 
					            address(0), // affiliateAccount; no fee paid
 | 
				
			||||||
 | 
					            0 // affiliateFee; no fee paid
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        emit ERC20BridgeTransfer(
 | 
				
			||||||
 | 
					            state.path[0], // fromTokenAddress
 | 
				
			||||||
 | 
					            toTokenAddress,
 | 
				
			||||||
 | 
					            fromTokenBalance,
 | 
				
			||||||
 | 
					            boughtAmount,
 | 
				
			||||||
 | 
					            from,
 | 
				
			||||||
 | 
					            to
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        return BRIDGE_SUCCESS;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker
 | 
				
			||||||
 | 
					    ///      and sign for itself in orders. Always succeeds.
 | 
				
			||||||
 | 
					    /// @return magicValue Magic success bytes, always.
 | 
				
			||||||
 | 
					    function isValidSignature(
 | 
				
			||||||
 | 
					        bytes32,
 | 
				
			||||||
 | 
					        bytes calldata
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					        view
 | 
				
			||||||
 | 
					        returns (bytes4 magicValue)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return LEGACY_WALLET_MAGIC_VALUE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright 2020 ZeroEx Intl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					  you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					  distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					  See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					  limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pragma solidity ^0.5.9;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					contract IContractRegistry {
 | 
				
			||||||
 | 
					    function addressOf(
 | 
				
			||||||
 | 
					        bytes32 contractName
 | 
				
			||||||
 | 
					    ) external returns(address);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					contract IBancorNetwork {
 | 
				
			||||||
 | 
					    function convertByPath(
 | 
				
			||||||
 | 
					        address[] calldata _path,
 | 
				
			||||||
 | 
					        uint256 _amount,
 | 
				
			||||||
 | 
					        uint256 _minReturn,
 | 
				
			||||||
 | 
					        address _beneficiary,
 | 
				
			||||||
 | 
					        address _affiliateAccount,
 | 
				
			||||||
 | 
					        uint256 _affiliateFee
 | 
				
			||||||
 | 
					    ) external payable returns (uint256);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										247
									
								
								contracts/asset-proxy/contracts/test/TestBancorBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								contracts/asset-proxy/contracts/test/TestBancorBridge.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,247 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright 2019 ZeroEx Intl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					  you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					  You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					  distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					  See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					  limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pragma solidity ^0.5.9;
 | 
				
			||||||
 | 
					pragma experimental ABIEncoderV2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol";
 | 
				
			||||||
 | 
					import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
 | 
				
			||||||
 | 
					import "@0x/contracts-utils/contracts/src/LibAddressArray.sol";
 | 
				
			||||||
 | 
					import "../src/bridges/BancorBridge.sol";
 | 
				
			||||||
 | 
					import "../src/interfaces/IBancorNetwork.sol";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					contract TestEventsRaiser {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    event TokenTransfer(
 | 
				
			||||||
 | 
					        address token,
 | 
				
			||||||
 | 
					        address from,
 | 
				
			||||||
 | 
					        address to,
 | 
				
			||||||
 | 
					        uint256 amount
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    event TokenApprove(
 | 
				
			||||||
 | 
					        address spender,
 | 
				
			||||||
 | 
					        uint256 allowance
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    event ConvertByPathInput(
 | 
				
			||||||
 | 
					        uint amountIn,
 | 
				
			||||||
 | 
					        uint amountOutMin,
 | 
				
			||||||
 | 
					        address toTokenAddress,
 | 
				
			||||||
 | 
					        address to,
 | 
				
			||||||
 | 
					        address feeRecipient,
 | 
				
			||||||
 | 
					        uint256 feeAmount
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function raiseTokenTransfer(
 | 
				
			||||||
 | 
					        address from,
 | 
				
			||||||
 | 
					        address to,
 | 
				
			||||||
 | 
					        uint256 amount
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        emit TokenTransfer(
 | 
				
			||||||
 | 
					            msg.sender,
 | 
				
			||||||
 | 
					            from,
 | 
				
			||||||
 | 
					            to,
 | 
				
			||||||
 | 
					            amount
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function raiseTokenApprove(address spender, uint256 allowance) external {
 | 
				
			||||||
 | 
					        emit TokenApprove(spender, allowance);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function raiseConvertByPathInput(
 | 
				
			||||||
 | 
					        uint amountIn,
 | 
				
			||||||
 | 
					        uint amountOutMin,
 | 
				
			||||||
 | 
					        address toTokenAddress,
 | 
				
			||||||
 | 
					        address to,
 | 
				
			||||||
 | 
					        address feeRecipient,
 | 
				
			||||||
 | 
					        uint256 feeAmount
 | 
				
			||||||
 | 
					    ) external
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        emit ConvertByPathInput(
 | 
				
			||||||
 | 
					            amountIn,
 | 
				
			||||||
 | 
					            amountOutMin,
 | 
				
			||||||
 | 
					            toTokenAddress,
 | 
				
			||||||
 | 
					            to,
 | 
				
			||||||
 | 
					            feeRecipient,
 | 
				
			||||||
 | 
					            feeAmount
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @dev A minimalist ERC20 token.
 | 
				
			||||||
 | 
					contract TestToken {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    using LibSafeMath for uint256;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mapping (address => uint256) public balances;
 | 
				
			||||||
 | 
					    string private _nextRevertReason;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Set the balance for `owner`.
 | 
				
			||||||
 | 
					    function setBalance(address owner, uint256 balance)
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					        payable
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        balances[owner] = balance;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Just emits a TokenTransfer event on the caller
 | 
				
			||||||
 | 
					    function transfer(address to, uint256 amount)
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					        returns (bool)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        TestEventsRaiser(msg.sender).raiseTokenTransfer(msg.sender, to, amount);
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Just emits a TokenApprove event on the caller
 | 
				
			||||||
 | 
					    function approve(address spender, uint256 allowance)
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					        returns (bool)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        TestEventsRaiser(msg.sender).raiseTokenApprove(spender, allowance);
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function allowance(address, address) external view returns (uint256) {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Retrieve the balance for `owner`.
 | 
				
			||||||
 | 
					    function balanceOf(address owner)
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					        view
 | 
				
			||||||
 | 
					        returns (uint256)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return balances[owner];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @dev Mock the BancorNetwork contract
 | 
				
			||||||
 | 
					contract TestBancorNetwork is
 | 
				
			||||||
 | 
					    IBancorNetwork
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    string private _nextRevertReason;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Set the revert reason for `swapExactTokensForTokens`.
 | 
				
			||||||
 | 
					    function setRevertReason(string calldata reason)
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _nextRevertReason = reason;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function convertByPath(
 | 
				
			||||||
 | 
					        address[] calldata _path,
 | 
				
			||||||
 | 
					        uint256 _amount,
 | 
				
			||||||
 | 
					        uint256 _minReturn,
 | 
				
			||||||
 | 
					        address _beneficiary,
 | 
				
			||||||
 | 
					        address _affiliateAccount,
 | 
				
			||||||
 | 
					        uint256 _affiliateFee
 | 
				
			||||||
 | 
					    ) external payable returns (uint256)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _revertIfReasonExists();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TestEventsRaiser(msg.sender).raiseConvertByPathInput(
 | 
				
			||||||
 | 
					            // tokens sold
 | 
				
			||||||
 | 
					            _amount,
 | 
				
			||||||
 | 
					            // tokens bought
 | 
				
			||||||
 | 
					            _minReturn,
 | 
				
			||||||
 | 
					            // output token
 | 
				
			||||||
 | 
					            _path[_path.length - 1],
 | 
				
			||||||
 | 
					            // recipient
 | 
				
			||||||
 | 
					            _beneficiary,
 | 
				
			||||||
 | 
					            // fee recipient
 | 
				
			||||||
 | 
					            _affiliateAccount,
 | 
				
			||||||
 | 
					            // fee amount
 | 
				
			||||||
 | 
					            _affiliateFee
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _revertIfReasonExists()
 | 
				
			||||||
 | 
					        private
 | 
				
			||||||
 | 
					        view
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (bytes(_nextRevertReason).length != 0) {
 | 
				
			||||||
 | 
					            revert(_nextRevertReason);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @dev BancorBridge overridden to mock tokens and BancorNetwork
 | 
				
			||||||
 | 
					contract TestBancorBridge is
 | 
				
			||||||
 | 
					    BancorBridge,
 | 
				
			||||||
 | 
					    TestEventsRaiser
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Token address to TestToken instance.
 | 
				
			||||||
 | 
					    mapping (address => TestToken) private _testTokens;
 | 
				
			||||||
 | 
					    // TestRouter instance.
 | 
				
			||||||
 | 
					    TestBancorNetwork private _testNetwork;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor() public {
 | 
				
			||||||
 | 
					        _testNetwork = new TestBancorNetwork();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function setNetworkRevertReason(string calldata revertReason)
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _testNetwork.setRevertReason(revertReason);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Sets the balance of this contract for an existing token.
 | 
				
			||||||
 | 
					    function setTokenBalance(address tokenAddress, uint256 balance)
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        TestToken token = _testTokens[tokenAddress];
 | 
				
			||||||
 | 
					        token.setBalance(address(this), balance);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Create a new token
 | 
				
			||||||
 | 
					    /// @param tokenAddress The token address. If zero, one will be created.
 | 
				
			||||||
 | 
					    function createToken(
 | 
				
			||||||
 | 
					        address tokenAddress
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					        returns (TestToken token)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        token = TestToken(tokenAddress);
 | 
				
			||||||
 | 
					        if (tokenAddress == address(0)) {
 | 
				
			||||||
 | 
					            token = new TestToken();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        _testTokens[address(token)] = token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return token;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function getNetworkAddress()
 | 
				
			||||||
 | 
					        external
 | 
				
			||||||
 | 
					        view
 | 
				
			||||||
 | 
					        returns (address)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return address(_testNetwork);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -38,7 +38,7 @@
 | 
				
			|||||||
        "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES"
 | 
					        "docs:json": "typedoc --excludePrivate --excludeExternals --excludeProtected --ignoreCompilerErrors --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "config": {
 | 
					    "config": {
 | 
				
			||||||
        "abis": "./test/generated-artifacts/@(BalancerBridge|ChaiBridge|CurveBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MultiAssetProxy|Ownable|StaticCallProxy|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json",
 | 
					        "abis": "./test/generated-artifacts/@(BalancerBridge|BancorBridge|ChaiBridge|CurveBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MultiAssetProxy|Ownable|StaticCallProxy|TestBancorBridge|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json",
 | 
				
			||||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually."
 | 
					        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually."
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "repository": {
 | 
					    "repository": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@
 | 
				
			|||||||
import { ContractArtifact } from 'ethereum-types';
 | 
					import { ContractArtifact } from 'ethereum-types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as BalancerBridge from '../generated-artifacts/BalancerBridge.json';
 | 
					import * as BalancerBridge from '../generated-artifacts/BalancerBridge.json';
 | 
				
			||||||
 | 
					import * as BancorBridge from '../generated-artifacts/BancorBridge.json';
 | 
				
			||||||
import * as ChaiBridge from '../generated-artifacts/ChaiBridge.json';
 | 
					import * as ChaiBridge from '../generated-artifacts/ChaiBridge.json';
 | 
				
			||||||
import * as CurveBridge from '../generated-artifacts/CurveBridge.json';
 | 
					import * as CurveBridge from '../generated-artifacts/CurveBridge.json';
 | 
				
			||||||
import * as DexForwarderBridge from '../generated-artifacts/DexForwarderBridge.json';
 | 
					import * as DexForwarderBridge from '../generated-artifacts/DexForwarderBridge.json';
 | 
				
			||||||
@@ -20,6 +21,7 @@ import * as IAssetProxy from '../generated-artifacts/IAssetProxy.json';
 | 
				
			|||||||
import * as IAssetProxyDispatcher from '../generated-artifacts/IAssetProxyDispatcher.json';
 | 
					import * as IAssetProxyDispatcher from '../generated-artifacts/IAssetProxyDispatcher.json';
 | 
				
			||||||
import * as IAuthorizable from '../generated-artifacts/IAuthorizable.json';
 | 
					import * as IAuthorizable from '../generated-artifacts/IAuthorizable.json';
 | 
				
			||||||
import * as IBalancerPool from '../generated-artifacts/IBalancerPool.json';
 | 
					import * as IBalancerPool from '../generated-artifacts/IBalancerPool.json';
 | 
				
			||||||
 | 
					import * as IBancorNetwork from '../generated-artifacts/IBancorNetwork.json';
 | 
				
			||||||
import * as IChai from '../generated-artifacts/IChai.json';
 | 
					import * as IChai from '../generated-artifacts/IChai.json';
 | 
				
			||||||
import * as ICurve from '../generated-artifacts/ICurve.json';
 | 
					import * as ICurve from '../generated-artifacts/ICurve.json';
 | 
				
			||||||
import * as IDydx from '../generated-artifacts/IDydx.json';
 | 
					import * as IDydx from '../generated-artifacts/IDydx.json';
 | 
				
			||||||
@@ -40,6 +42,7 @@ import * as MStableBridge from '../generated-artifacts/MStableBridge.json';
 | 
				
			|||||||
import * as MultiAssetProxy from '../generated-artifacts/MultiAssetProxy.json';
 | 
					import * as MultiAssetProxy from '../generated-artifacts/MultiAssetProxy.json';
 | 
				
			||||||
import * as Ownable from '../generated-artifacts/Ownable.json';
 | 
					import * as Ownable from '../generated-artifacts/Ownable.json';
 | 
				
			||||||
import * as StaticCallProxy from '../generated-artifacts/StaticCallProxy.json';
 | 
					import * as StaticCallProxy from '../generated-artifacts/StaticCallProxy.json';
 | 
				
			||||||
 | 
					import * as TestBancorBridge from '../generated-artifacts/TestBancorBridge.json';
 | 
				
			||||||
import * as TestChaiBridge from '../generated-artifacts/TestChaiBridge.json';
 | 
					import * as TestChaiBridge from '../generated-artifacts/TestChaiBridge.json';
 | 
				
			||||||
import * as TestDexForwarderBridge from '../generated-artifacts/TestDexForwarderBridge.json';
 | 
					import * as TestDexForwarderBridge from '../generated-artifacts/TestDexForwarderBridge.json';
 | 
				
			||||||
import * as TestDydxBridge from '../generated-artifacts/TestDydxBridge.json';
 | 
					import * as TestDydxBridge from '../generated-artifacts/TestDydxBridge.json';
 | 
				
			||||||
@@ -62,6 +65,7 @@ export const artifacts = {
 | 
				
			|||||||
    MultiAssetProxy: MultiAssetProxy as ContractArtifact,
 | 
					    MultiAssetProxy: MultiAssetProxy as ContractArtifact,
 | 
				
			||||||
    StaticCallProxy: StaticCallProxy as ContractArtifact,
 | 
					    StaticCallProxy: StaticCallProxy as ContractArtifact,
 | 
				
			||||||
    BalancerBridge: BalancerBridge as ContractArtifact,
 | 
					    BalancerBridge: BalancerBridge as ContractArtifact,
 | 
				
			||||||
 | 
					    BancorBridge: BancorBridge as ContractArtifact,
 | 
				
			||||||
    ChaiBridge: ChaiBridge as ContractArtifact,
 | 
					    ChaiBridge: ChaiBridge as ContractArtifact,
 | 
				
			||||||
    CurveBridge: CurveBridge as ContractArtifact,
 | 
					    CurveBridge: CurveBridge as ContractArtifact,
 | 
				
			||||||
    DexForwarderBridge: DexForwarderBridge as ContractArtifact,
 | 
					    DexForwarderBridge: DexForwarderBridge as ContractArtifact,
 | 
				
			||||||
@@ -77,6 +81,7 @@ export const artifacts = {
 | 
				
			|||||||
    IAssetProxyDispatcher: IAssetProxyDispatcher as ContractArtifact,
 | 
					    IAssetProxyDispatcher: IAssetProxyDispatcher as ContractArtifact,
 | 
				
			||||||
    IAuthorizable: IAuthorizable as ContractArtifact,
 | 
					    IAuthorizable: IAuthorizable as ContractArtifact,
 | 
				
			||||||
    IBalancerPool: IBalancerPool as ContractArtifact,
 | 
					    IBalancerPool: IBalancerPool as ContractArtifact,
 | 
				
			||||||
 | 
					    IBancorNetwork: IBancorNetwork as ContractArtifact,
 | 
				
			||||||
    IChai: IChai as ContractArtifact,
 | 
					    IChai: IChai as ContractArtifact,
 | 
				
			||||||
    ICurve: ICurve as ContractArtifact,
 | 
					    ICurve: ICurve as ContractArtifact,
 | 
				
			||||||
    IDydx: IDydx as ContractArtifact,
 | 
					    IDydx: IDydx as ContractArtifact,
 | 
				
			||||||
@@ -89,6 +94,7 @@ export const artifacts = {
 | 
				
			|||||||
    IUniswapExchange: IUniswapExchange as ContractArtifact,
 | 
					    IUniswapExchange: IUniswapExchange as ContractArtifact,
 | 
				
			||||||
    IUniswapExchangeFactory: IUniswapExchangeFactory as ContractArtifact,
 | 
					    IUniswapExchangeFactory: IUniswapExchangeFactory as ContractArtifact,
 | 
				
			||||||
    IUniswapV2Router01: IUniswapV2Router01 as ContractArtifact,
 | 
					    IUniswapV2Router01: IUniswapV2Router01 as ContractArtifact,
 | 
				
			||||||
 | 
					    TestBancorBridge: TestBancorBridge as ContractArtifact,
 | 
				
			||||||
    TestChaiBridge: TestChaiBridge as ContractArtifact,
 | 
					    TestChaiBridge: TestChaiBridge as ContractArtifact,
 | 
				
			||||||
    TestDexForwarderBridge: TestDexForwarderBridge as ContractArtifact,
 | 
					    TestDexForwarderBridge: TestDexForwarderBridge as ContractArtifact,
 | 
				
			||||||
    TestDydxBridge: TestDydxBridge as ContractArtifact,
 | 
					    TestDydxBridge: TestDydxBridge as ContractArtifact,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 * -----------------------------------------------------------------------------
 | 
					 * -----------------------------------------------------------------------------
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export * from '../generated-wrappers/balancer_bridge';
 | 
					export * from '../generated-wrappers/balancer_bridge';
 | 
				
			||||||
 | 
					export * from '../generated-wrappers/bancor_bridge';
 | 
				
			||||||
export * from '../generated-wrappers/chai_bridge';
 | 
					export * from '../generated-wrappers/chai_bridge';
 | 
				
			||||||
export * from '../generated-wrappers/curve_bridge';
 | 
					export * from '../generated-wrappers/curve_bridge';
 | 
				
			||||||
export * from '../generated-wrappers/dex_forwarder_bridge';
 | 
					export * from '../generated-wrappers/dex_forwarder_bridge';
 | 
				
			||||||
@@ -18,6 +19,7 @@ export * from '../generated-wrappers/i_asset_proxy';
 | 
				
			|||||||
export * from '../generated-wrappers/i_asset_proxy_dispatcher';
 | 
					export * from '../generated-wrappers/i_asset_proxy_dispatcher';
 | 
				
			||||||
export * from '../generated-wrappers/i_authorizable';
 | 
					export * from '../generated-wrappers/i_authorizable';
 | 
				
			||||||
export * from '../generated-wrappers/i_balancer_pool';
 | 
					export * from '../generated-wrappers/i_balancer_pool';
 | 
				
			||||||
 | 
					export * from '../generated-wrappers/i_bancor_network';
 | 
				
			||||||
export * from '../generated-wrappers/i_chai';
 | 
					export * from '../generated-wrappers/i_chai';
 | 
				
			||||||
export * from '../generated-wrappers/i_curve';
 | 
					export * from '../generated-wrappers/i_curve';
 | 
				
			||||||
export * from '../generated-wrappers/i_dydx';
 | 
					export * from '../generated-wrappers/i_dydx';
 | 
				
			||||||
@@ -38,6 +40,7 @@ export * from '../generated-wrappers/mixin_gas_token';
 | 
				
			|||||||
export * from '../generated-wrappers/multi_asset_proxy';
 | 
					export * from '../generated-wrappers/multi_asset_proxy';
 | 
				
			||||||
export * from '../generated-wrappers/ownable';
 | 
					export * from '../generated-wrappers/ownable';
 | 
				
			||||||
export * from '../generated-wrappers/static_call_proxy';
 | 
					export * from '../generated-wrappers/static_call_proxy';
 | 
				
			||||||
 | 
					export * from '../generated-wrappers/test_bancor_bridge';
 | 
				
			||||||
export * from '../generated-wrappers/test_chai_bridge';
 | 
					export * from '../generated-wrappers/test_chai_bridge';
 | 
				
			||||||
export * from '../generated-wrappers/test_dex_forwarder_bridge';
 | 
					export * from '../generated-wrappers/test_dex_forwarder_bridge';
 | 
				
			||||||
export * from '../generated-wrappers/test_dydx_bridge';
 | 
					export * from '../generated-wrappers/test_dydx_bridge';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@
 | 
				
			|||||||
import { ContractArtifact } from 'ethereum-types';
 | 
					import { ContractArtifact } from 'ethereum-types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as BalancerBridge from '../test/generated-artifacts/BalancerBridge.json';
 | 
					import * as BalancerBridge from '../test/generated-artifacts/BalancerBridge.json';
 | 
				
			||||||
 | 
					import * as BancorBridge from '../test/generated-artifacts/BancorBridge.json';
 | 
				
			||||||
import * as ChaiBridge from '../test/generated-artifacts/ChaiBridge.json';
 | 
					import * as ChaiBridge from '../test/generated-artifacts/ChaiBridge.json';
 | 
				
			||||||
import * as CurveBridge from '../test/generated-artifacts/CurveBridge.json';
 | 
					import * as CurveBridge from '../test/generated-artifacts/CurveBridge.json';
 | 
				
			||||||
import * as DexForwarderBridge from '../test/generated-artifacts/DexForwarderBridge.json';
 | 
					import * as DexForwarderBridge from '../test/generated-artifacts/DexForwarderBridge.json';
 | 
				
			||||||
@@ -20,6 +21,7 @@ import * as IAssetProxy from '../test/generated-artifacts/IAssetProxy.json';
 | 
				
			|||||||
import * as IAssetProxyDispatcher from '../test/generated-artifacts/IAssetProxyDispatcher.json';
 | 
					import * as IAssetProxyDispatcher from '../test/generated-artifacts/IAssetProxyDispatcher.json';
 | 
				
			||||||
import * as IAuthorizable from '../test/generated-artifacts/IAuthorizable.json';
 | 
					import * as IAuthorizable from '../test/generated-artifacts/IAuthorizable.json';
 | 
				
			||||||
import * as IBalancerPool from '../test/generated-artifacts/IBalancerPool.json';
 | 
					import * as IBalancerPool from '../test/generated-artifacts/IBalancerPool.json';
 | 
				
			||||||
 | 
					import * as IBancorNetwork from '../test/generated-artifacts/IBancorNetwork.json';
 | 
				
			||||||
import * as IChai from '../test/generated-artifacts/IChai.json';
 | 
					import * as IChai from '../test/generated-artifacts/IChai.json';
 | 
				
			||||||
import * as ICurve from '../test/generated-artifacts/ICurve.json';
 | 
					import * as ICurve from '../test/generated-artifacts/ICurve.json';
 | 
				
			||||||
import * as IDydx from '../test/generated-artifacts/IDydx.json';
 | 
					import * as IDydx from '../test/generated-artifacts/IDydx.json';
 | 
				
			||||||
@@ -40,6 +42,7 @@ import * as MStableBridge from '../test/generated-artifacts/MStableBridge.json';
 | 
				
			|||||||
import * as MultiAssetProxy from '../test/generated-artifacts/MultiAssetProxy.json';
 | 
					import * as MultiAssetProxy from '../test/generated-artifacts/MultiAssetProxy.json';
 | 
				
			||||||
import * as Ownable from '../test/generated-artifacts/Ownable.json';
 | 
					import * as Ownable from '../test/generated-artifacts/Ownable.json';
 | 
				
			||||||
import * as StaticCallProxy from '../test/generated-artifacts/StaticCallProxy.json';
 | 
					import * as StaticCallProxy from '../test/generated-artifacts/StaticCallProxy.json';
 | 
				
			||||||
 | 
					import * as TestBancorBridge from '../test/generated-artifacts/TestBancorBridge.json';
 | 
				
			||||||
import * as TestChaiBridge from '../test/generated-artifacts/TestChaiBridge.json';
 | 
					import * as TestChaiBridge from '../test/generated-artifacts/TestChaiBridge.json';
 | 
				
			||||||
import * as TestDexForwarderBridge from '../test/generated-artifacts/TestDexForwarderBridge.json';
 | 
					import * as TestDexForwarderBridge from '../test/generated-artifacts/TestDexForwarderBridge.json';
 | 
				
			||||||
import * as TestDydxBridge from '../test/generated-artifacts/TestDydxBridge.json';
 | 
					import * as TestDydxBridge from '../test/generated-artifacts/TestDydxBridge.json';
 | 
				
			||||||
@@ -62,6 +65,7 @@ export const artifacts = {
 | 
				
			|||||||
    MultiAssetProxy: MultiAssetProxy as ContractArtifact,
 | 
					    MultiAssetProxy: MultiAssetProxy as ContractArtifact,
 | 
				
			||||||
    StaticCallProxy: StaticCallProxy as ContractArtifact,
 | 
					    StaticCallProxy: StaticCallProxy as ContractArtifact,
 | 
				
			||||||
    BalancerBridge: BalancerBridge as ContractArtifact,
 | 
					    BalancerBridge: BalancerBridge as ContractArtifact,
 | 
				
			||||||
 | 
					    BancorBridge: BancorBridge as ContractArtifact,
 | 
				
			||||||
    ChaiBridge: ChaiBridge as ContractArtifact,
 | 
					    ChaiBridge: ChaiBridge as ContractArtifact,
 | 
				
			||||||
    CurveBridge: CurveBridge as ContractArtifact,
 | 
					    CurveBridge: CurveBridge as ContractArtifact,
 | 
				
			||||||
    DexForwarderBridge: DexForwarderBridge as ContractArtifact,
 | 
					    DexForwarderBridge: DexForwarderBridge as ContractArtifact,
 | 
				
			||||||
@@ -77,6 +81,7 @@ export const artifacts = {
 | 
				
			|||||||
    IAssetProxyDispatcher: IAssetProxyDispatcher as ContractArtifact,
 | 
					    IAssetProxyDispatcher: IAssetProxyDispatcher as ContractArtifact,
 | 
				
			||||||
    IAuthorizable: IAuthorizable as ContractArtifact,
 | 
					    IAuthorizable: IAuthorizable as ContractArtifact,
 | 
				
			||||||
    IBalancerPool: IBalancerPool as ContractArtifact,
 | 
					    IBalancerPool: IBalancerPool as ContractArtifact,
 | 
				
			||||||
 | 
					    IBancorNetwork: IBancorNetwork as ContractArtifact,
 | 
				
			||||||
    IChai: IChai as ContractArtifact,
 | 
					    IChai: IChai as ContractArtifact,
 | 
				
			||||||
    ICurve: ICurve as ContractArtifact,
 | 
					    ICurve: ICurve as ContractArtifact,
 | 
				
			||||||
    IDydx: IDydx as ContractArtifact,
 | 
					    IDydx: IDydx as ContractArtifact,
 | 
				
			||||||
@@ -89,6 +94,7 @@ export const artifacts = {
 | 
				
			|||||||
    IUniswapExchange: IUniswapExchange as ContractArtifact,
 | 
					    IUniswapExchange: IUniswapExchange as ContractArtifact,
 | 
				
			||||||
    IUniswapExchangeFactory: IUniswapExchangeFactory as ContractArtifact,
 | 
					    IUniswapExchangeFactory: IUniswapExchangeFactory as ContractArtifact,
 | 
				
			||||||
    IUniswapV2Router01: IUniswapV2Router01 as ContractArtifact,
 | 
					    IUniswapV2Router01: IUniswapV2Router01 as ContractArtifact,
 | 
				
			||||||
 | 
					    TestBancorBridge: TestBancorBridge as ContractArtifact,
 | 
				
			||||||
    TestChaiBridge: TestChaiBridge as ContractArtifact,
 | 
					    TestChaiBridge: TestChaiBridge as ContractArtifact,
 | 
				
			||||||
    TestDexForwarderBridge: TestDexForwarderBridge as ContractArtifact,
 | 
					    TestDexForwarderBridge: TestDexForwarderBridge as ContractArtifact,
 | 
				
			||||||
    TestDydxBridge: TestDydxBridge as ContractArtifact,
 | 
					    TestDydxBridge: TestDydxBridge as ContractArtifact,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										205
									
								
								contracts/asset-proxy/test/bancor_bridge.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								contracts/asset-proxy/test/bancor_bridge.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,205 @@
 | 
				
			|||||||
 | 
					import {
 | 
				
			||||||
 | 
					    blockchainTests,
 | 
				
			||||||
 | 
					    constants,
 | 
				
			||||||
 | 
					    expect,
 | 
				
			||||||
 | 
					    filterLogsToArguments,
 | 
				
			||||||
 | 
					    getRandomInteger,
 | 
				
			||||||
 | 
					    randomAddress,
 | 
				
			||||||
 | 
					} from '@0x/contracts-test-utils';
 | 
				
			||||||
 | 
					import { AssetProxyId } from '@0x/types';
 | 
				
			||||||
 | 
					import { AbiEncoder, BigNumber, hexUtils } from '@0x/utils';
 | 
				
			||||||
 | 
					import { DecodedLogs } from 'ethereum-types';
 | 
				
			||||||
 | 
					import * as _ from 'lodash';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { artifacts } from './artifacts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { TestBancorBridgeContract } from './generated-wrappers/test_bancor_bridge';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					    TestBancorBridgeConvertByPathInputEventArgs as ConvertByPathArgs,
 | 
				
			||||||
 | 
					    TestBancorBridgeEvents as ContractEvents,
 | 
				
			||||||
 | 
					    TestBancorBridgeTokenApproveEventArgs as TokenApproveArgs,
 | 
				
			||||||
 | 
					    TestBancorBridgeTokenTransferEventArgs as TokenTransferArgs,
 | 
				
			||||||
 | 
					} from './wrappers';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					blockchainTests.resets('Bancor unit tests', env => {
 | 
				
			||||||
 | 
					    const FROM_TOKEN_DECIMALS = 6;
 | 
				
			||||||
 | 
					    const TO_TOKEN_DECIMALS = 18;
 | 
				
			||||||
 | 
					    const FROM_TOKEN_BASE = new BigNumber(10).pow(FROM_TOKEN_DECIMALS);
 | 
				
			||||||
 | 
					    const TO_TOKEN_BASE = new BigNumber(10).pow(TO_TOKEN_DECIMALS);
 | 
				
			||||||
 | 
					    let testContract: TestBancorBridgeContract;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    before(async () => {
 | 
				
			||||||
 | 
					        testContract = await TestBancorBridgeContract.deployFrom0xArtifactAsync(
 | 
				
			||||||
 | 
					            artifacts.TestBancorBridge,
 | 
				
			||||||
 | 
					            env.provider,
 | 
				
			||||||
 | 
					            env.txDefaults,
 | 
				
			||||||
 | 
					            artifacts,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    describe('isValidSignature()', () => {
 | 
				
			||||||
 | 
					        it('returns success bytes', async () => {
 | 
				
			||||||
 | 
					            const LEGACY_WALLET_MAGIC_VALUE = '0xb0671381';
 | 
				
			||||||
 | 
					            const result = await testContract
 | 
				
			||||||
 | 
					                .isValidSignature(hexUtils.random(), hexUtils.random(_.random(0, 32)))
 | 
				
			||||||
 | 
					                .callAsync();
 | 
				
			||||||
 | 
					            expect(result).to.eq(LEGACY_WALLET_MAGIC_VALUE);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    describe('bridgeTransferFrom()', () => {
 | 
				
			||||||
 | 
					        interface TransferFromOpts {
 | 
				
			||||||
 | 
					            tokenAddressesPath: string[];
 | 
				
			||||||
 | 
					            toAddress: string;
 | 
				
			||||||
 | 
					            // Amount to pass into `bridgeTransferFrom()`
 | 
				
			||||||
 | 
					            amount: BigNumber;
 | 
				
			||||||
 | 
					            // Token balance of the bridge.
 | 
				
			||||||
 | 
					            fromTokenBalance: BigNumber;
 | 
				
			||||||
 | 
					            // Router reverts with this reason
 | 
				
			||||||
 | 
					            routerRevertReason: string;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        interface TransferFromResult {
 | 
				
			||||||
 | 
					            opts: TransferFromOpts;
 | 
				
			||||||
 | 
					            result: string;
 | 
				
			||||||
 | 
					            logs: DecodedLogs;
 | 
				
			||||||
 | 
					            blocktime: number;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function createTransferFromOpts(opts?: Partial<TransferFromOpts>): TransferFromOpts {
 | 
				
			||||||
 | 
					            const amount = getRandomInteger(1, TO_TOKEN_BASE.times(100));
 | 
				
			||||||
 | 
					            return {
 | 
				
			||||||
 | 
					                tokenAddressesPath: Array(3).fill(constants.NULL_ADDRESS),
 | 
				
			||||||
 | 
					                amount,
 | 
				
			||||||
 | 
					                toAddress: randomAddress(),
 | 
				
			||||||
 | 
					                fromTokenBalance: getRandomInteger(1, FROM_TOKEN_BASE.times(100)),
 | 
				
			||||||
 | 
					                routerRevertReason: '',
 | 
				
			||||||
 | 
					                ...opts,
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const bridgeDataEncoder = AbiEncoder.create('(address[], address)');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        async function transferFromAsync(opts?: Partial<TransferFromOpts>): Promise<TransferFromResult> {
 | 
				
			||||||
 | 
					            const _opts = createTransferFromOpts(opts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (let i = 0; i < _opts.tokenAddressesPath.length; i++) {
 | 
				
			||||||
 | 
					                const createFromTokenFn = testContract.createToken(_opts.tokenAddressesPath[i]);
 | 
				
			||||||
 | 
					                _opts.tokenAddressesPath[i] = await createFromTokenFn.callAsync();
 | 
				
			||||||
 | 
					                await createFromTokenFn.awaitTransactionSuccessAsync();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Set the token balance for the token we're converting from.
 | 
				
			||||||
 | 
					            await testContract
 | 
				
			||||||
 | 
					                .setTokenBalance(_opts.tokenAddressesPath[0], _opts.fromTokenBalance)
 | 
				
			||||||
 | 
					                .awaitTransactionSuccessAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Set revert reason for the router.
 | 
				
			||||||
 | 
					            await testContract.setNetworkRevertReason(_opts.routerRevertReason).awaitTransactionSuccessAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Call bridgeTransferFrom().
 | 
				
			||||||
 | 
					            const bridgeTransferFromFn = testContract.bridgeTransferFrom(
 | 
				
			||||||
 | 
					                // Output token
 | 
				
			||||||
 | 
					                _opts.tokenAddressesPath[_opts.tokenAddressesPath.length - 1],
 | 
				
			||||||
 | 
					                // Random maker address.
 | 
				
			||||||
 | 
					                randomAddress(),
 | 
				
			||||||
 | 
					                // Recipient address.
 | 
				
			||||||
 | 
					                _opts.toAddress,
 | 
				
			||||||
 | 
					                // Transfer amount.
 | 
				
			||||||
 | 
					                _opts.amount,
 | 
				
			||||||
 | 
					                // ABI-encode the input token address as the bridge data.
 | 
				
			||||||
 | 
					                bridgeDataEncoder.encode([
 | 
				
			||||||
 | 
					                    _opts.tokenAddressesPath,
 | 
				
			||||||
 | 
					                    await testContract.getNetworkAddress().callAsync(),
 | 
				
			||||||
 | 
					                ]),
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            const result = await bridgeTransferFromFn.callAsync();
 | 
				
			||||||
 | 
					            const receipt = await bridgeTransferFromFn.awaitTransactionSuccessAsync();
 | 
				
			||||||
 | 
					            return {
 | 
				
			||||||
 | 
					                opts: _opts,
 | 
				
			||||||
 | 
					                result,
 | 
				
			||||||
 | 
					                logs: (receipt.logs as any) as DecodedLogs,
 | 
				
			||||||
 | 
					                blocktime: await env.web3Wrapper.getBlockTimestampAsync(receipt.blockNumber),
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it('returns magic bytes on success', async () => {
 | 
				
			||||||
 | 
					            const { result } = await transferFromAsync();
 | 
				
			||||||
 | 
					            expect(result).to.eq(AssetProxyId.ERC20Bridge);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it('performs transfer when both tokens are the same', async () => {
 | 
				
			||||||
 | 
					            const createTokenFn = testContract.createToken(constants.NULL_ADDRESS);
 | 
				
			||||||
 | 
					            const tokenAddress = await createTokenFn.callAsync();
 | 
				
			||||||
 | 
					            await createTokenFn.awaitTransactionSuccessAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const { opts, result, logs } = await transferFromAsync({
 | 
				
			||||||
 | 
					                tokenAddressesPath: [tokenAddress, tokenAddress],
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            expect(result).to.eq(AssetProxyId.ERC20Bridge, 'asset proxy id');
 | 
				
			||||||
 | 
					            const transfers = filterLogsToArguments<TokenTransferArgs>(logs, ContractEvents.TokenTransfer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            expect(transfers.length).to.eq(1);
 | 
				
			||||||
 | 
					            expect(transfers[0].token).to.eq(tokenAddress, 'input token address');
 | 
				
			||||||
 | 
					            expect(transfers[0].from).to.eq(testContract.address);
 | 
				
			||||||
 | 
					            expect(transfers[0].to).to.eq(opts.toAddress, 'recipient address');
 | 
				
			||||||
 | 
					            expect(transfers[0].amount).to.bignumber.eq(opts.amount, 'amount');
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        describe('token -> token', async () => {
 | 
				
			||||||
 | 
					            it('calls BancorNetwork.convertByPath()', async () => {
 | 
				
			||||||
 | 
					                const { opts, result, logs } = await transferFromAsync();
 | 
				
			||||||
 | 
					                expect(result).to.eq(AssetProxyId.ERC20Bridge, 'asset proxy id');
 | 
				
			||||||
 | 
					                const transfers = filterLogsToArguments<ConvertByPathArgs>(logs, ContractEvents.ConvertByPathInput);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                expect(transfers.length).to.eq(1);
 | 
				
			||||||
 | 
					                expect(transfers[0].toTokenAddress).to.eq(
 | 
				
			||||||
 | 
					                    opts.tokenAddressesPath[opts.tokenAddressesPath.length - 1],
 | 
				
			||||||
 | 
					                    'output token address',
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					                expect(transfers[0].to).to.eq(opts.toAddress, 'recipient address');
 | 
				
			||||||
 | 
					                expect(transfers[0].amountIn).to.bignumber.eq(opts.fromTokenBalance, 'input token amount');
 | 
				
			||||||
 | 
					                expect(transfers[0].amountOutMin).to.bignumber.eq(opts.amount, 'output token amount');
 | 
				
			||||||
 | 
					                expect(transfers[0].feeRecipient).to.eq(constants.NULL_ADDRESS);
 | 
				
			||||||
 | 
					                expect(transfers[0].feeAmount).to.bignumber.eq(new BigNumber(0));
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            it('sets allowance for "from" token', async () => {
 | 
				
			||||||
 | 
					                const { logs } = await transferFromAsync();
 | 
				
			||||||
 | 
					                const approvals = filterLogsToArguments<TokenApproveArgs>(logs, ContractEvents.TokenApprove);
 | 
				
			||||||
 | 
					                const networkAddress = await testContract.getNetworkAddress().callAsync();
 | 
				
			||||||
 | 
					                expect(approvals.length).to.eq(1);
 | 
				
			||||||
 | 
					                expect(approvals[0].spender).to.eq(networkAddress);
 | 
				
			||||||
 | 
					                expect(approvals[0].allowance).to.bignumber.eq(constants.MAX_UINT256);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            it('fails if the router fails', async () => {
 | 
				
			||||||
 | 
					                const revertReason = 'FOOBAR';
 | 
				
			||||||
 | 
					                const tx = transferFromAsync({
 | 
				
			||||||
 | 
					                    routerRevertReason: revertReason,
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                return expect(tx).to.eventually.be.rejectedWith(revertReason);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        describe('token -> token -> token', async () => {
 | 
				
			||||||
 | 
					            it('calls BancorNetwork.convertByPath()', async () => {
 | 
				
			||||||
 | 
					                const { opts, result, logs } = await transferFromAsync({
 | 
				
			||||||
 | 
					                    tokenAddressesPath: Array(5).fill(constants.NULL_ADDRESS),
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                expect(result).to.eq(AssetProxyId.ERC20Bridge, 'asset proxy id');
 | 
				
			||||||
 | 
					                const transfers = filterLogsToArguments<ConvertByPathArgs>(logs, ContractEvents.ConvertByPathInput);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                expect(transfers.length).to.eq(1);
 | 
				
			||||||
 | 
					                expect(transfers[0].toTokenAddress).to.eq(
 | 
				
			||||||
 | 
					                    opts.tokenAddressesPath[opts.tokenAddressesPath.length - 1],
 | 
				
			||||||
 | 
					                    'output token address',
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					                expect(transfers[0].to).to.eq(opts.toAddress, 'recipient address');
 | 
				
			||||||
 | 
					                expect(transfers[0].amountIn).to.bignumber.eq(opts.fromTokenBalance, 'input token amount');
 | 
				
			||||||
 | 
					                expect(transfers[0].amountOutMin).to.bignumber.eq(opts.amount, 'output token amount');
 | 
				
			||||||
 | 
					                expect(transfers[0].feeRecipient).to.eq(constants.NULL_ADDRESS);
 | 
				
			||||||
 | 
					                expect(transfers[0].feeAmount).to.bignumber.eq(new BigNumber(0));
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 * -----------------------------------------------------------------------------
 | 
					 * -----------------------------------------------------------------------------
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export * from '../test/generated-wrappers/balancer_bridge';
 | 
					export * from '../test/generated-wrappers/balancer_bridge';
 | 
				
			||||||
 | 
					export * from '../test/generated-wrappers/bancor_bridge';
 | 
				
			||||||
export * from '../test/generated-wrappers/chai_bridge';
 | 
					export * from '../test/generated-wrappers/chai_bridge';
 | 
				
			||||||
export * from '../test/generated-wrappers/curve_bridge';
 | 
					export * from '../test/generated-wrappers/curve_bridge';
 | 
				
			||||||
export * from '../test/generated-wrappers/dex_forwarder_bridge';
 | 
					export * from '../test/generated-wrappers/dex_forwarder_bridge';
 | 
				
			||||||
@@ -18,6 +19,7 @@ export * from '../test/generated-wrappers/i_asset_proxy';
 | 
				
			|||||||
export * from '../test/generated-wrappers/i_asset_proxy_dispatcher';
 | 
					export * from '../test/generated-wrappers/i_asset_proxy_dispatcher';
 | 
				
			||||||
export * from '../test/generated-wrappers/i_authorizable';
 | 
					export * from '../test/generated-wrappers/i_authorizable';
 | 
				
			||||||
export * from '../test/generated-wrappers/i_balancer_pool';
 | 
					export * from '../test/generated-wrappers/i_balancer_pool';
 | 
				
			||||||
 | 
					export * from '../test/generated-wrappers/i_bancor_network';
 | 
				
			||||||
export * from '../test/generated-wrappers/i_chai';
 | 
					export * from '../test/generated-wrappers/i_chai';
 | 
				
			||||||
export * from '../test/generated-wrappers/i_curve';
 | 
					export * from '../test/generated-wrappers/i_curve';
 | 
				
			||||||
export * from '../test/generated-wrappers/i_dydx';
 | 
					export * from '../test/generated-wrappers/i_dydx';
 | 
				
			||||||
@@ -38,6 +40,7 @@ export * from '../test/generated-wrappers/mixin_gas_token';
 | 
				
			|||||||
export * from '../test/generated-wrappers/multi_asset_proxy';
 | 
					export * from '../test/generated-wrappers/multi_asset_proxy';
 | 
				
			||||||
export * from '../test/generated-wrappers/ownable';
 | 
					export * from '../test/generated-wrappers/ownable';
 | 
				
			||||||
export * from '../test/generated-wrappers/static_call_proxy';
 | 
					export * from '../test/generated-wrappers/static_call_proxy';
 | 
				
			||||||
 | 
					export * from '../test/generated-wrappers/test_bancor_bridge';
 | 
				
			||||||
export * from '../test/generated-wrappers/test_chai_bridge';
 | 
					export * from '../test/generated-wrappers/test_chai_bridge';
 | 
				
			||||||
export * from '../test/generated-wrappers/test_dex_forwarder_bridge';
 | 
					export * from '../test/generated-wrappers/test_dex_forwarder_bridge';
 | 
				
			||||||
export * from '../test/generated-wrappers/test_dydx_bridge';
 | 
					export * from '../test/generated-wrappers/test_dydx_bridge';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
    "include": ["./src/**/*", "./test/**/*", "./generated-wrappers/**/*"],
 | 
					    "include": ["./src/**/*", "./test/**/*", "./generated-wrappers/**/*"],
 | 
				
			||||||
    "files": [
 | 
					    "files": [
 | 
				
			||||||
        "generated-artifacts/BalancerBridge.json",
 | 
					        "generated-artifacts/BalancerBridge.json",
 | 
				
			||||||
 | 
					        "generated-artifacts/BancorBridge.json",
 | 
				
			||||||
        "generated-artifacts/ChaiBridge.json",
 | 
					        "generated-artifacts/ChaiBridge.json",
 | 
				
			||||||
        "generated-artifacts/CurveBridge.json",
 | 
					        "generated-artifacts/CurveBridge.json",
 | 
				
			||||||
        "generated-artifacts/DexForwarderBridge.json",
 | 
					        "generated-artifacts/DexForwarderBridge.json",
 | 
				
			||||||
@@ -18,6 +19,7 @@
 | 
				
			|||||||
        "generated-artifacts/IAssetProxyDispatcher.json",
 | 
					        "generated-artifacts/IAssetProxyDispatcher.json",
 | 
				
			||||||
        "generated-artifacts/IAuthorizable.json",
 | 
					        "generated-artifacts/IAuthorizable.json",
 | 
				
			||||||
        "generated-artifacts/IBalancerPool.json",
 | 
					        "generated-artifacts/IBalancerPool.json",
 | 
				
			||||||
 | 
					        "generated-artifacts/IBancorNetwork.json",
 | 
				
			||||||
        "generated-artifacts/IChai.json",
 | 
					        "generated-artifacts/IChai.json",
 | 
				
			||||||
        "generated-artifacts/ICurve.json",
 | 
					        "generated-artifacts/ICurve.json",
 | 
				
			||||||
        "generated-artifacts/IDydx.json",
 | 
					        "generated-artifacts/IDydx.json",
 | 
				
			||||||
@@ -38,6 +40,7 @@
 | 
				
			|||||||
        "generated-artifacts/MultiAssetProxy.json",
 | 
					        "generated-artifacts/MultiAssetProxy.json",
 | 
				
			||||||
        "generated-artifacts/Ownable.json",
 | 
					        "generated-artifacts/Ownable.json",
 | 
				
			||||||
        "generated-artifacts/StaticCallProxy.json",
 | 
					        "generated-artifacts/StaticCallProxy.json",
 | 
				
			||||||
 | 
					        "generated-artifacts/TestBancorBridge.json",
 | 
				
			||||||
        "generated-artifacts/TestChaiBridge.json",
 | 
					        "generated-artifacts/TestChaiBridge.json",
 | 
				
			||||||
        "generated-artifacts/TestDexForwarderBridge.json",
 | 
					        "generated-artifacts/TestDexForwarderBridge.json",
 | 
				
			||||||
        "generated-artifacts/TestDydxBridge.json",
 | 
					        "generated-artifacts/TestDydxBridge.json",
 | 
				
			||||||
@@ -50,6 +53,7 @@
 | 
				
			|||||||
        "generated-artifacts/UniswapBridge.json",
 | 
					        "generated-artifacts/UniswapBridge.json",
 | 
				
			||||||
        "generated-artifacts/UniswapV2Bridge.json",
 | 
					        "generated-artifacts/UniswapV2Bridge.json",
 | 
				
			||||||
        "test/generated-artifacts/BalancerBridge.json",
 | 
					        "test/generated-artifacts/BalancerBridge.json",
 | 
				
			||||||
 | 
					        "test/generated-artifacts/BancorBridge.json",
 | 
				
			||||||
        "test/generated-artifacts/ChaiBridge.json",
 | 
					        "test/generated-artifacts/ChaiBridge.json",
 | 
				
			||||||
        "test/generated-artifacts/CurveBridge.json",
 | 
					        "test/generated-artifacts/CurveBridge.json",
 | 
				
			||||||
        "test/generated-artifacts/DexForwarderBridge.json",
 | 
					        "test/generated-artifacts/DexForwarderBridge.json",
 | 
				
			||||||
@@ -64,6 +68,7 @@
 | 
				
			|||||||
        "test/generated-artifacts/IAssetProxyDispatcher.json",
 | 
					        "test/generated-artifacts/IAssetProxyDispatcher.json",
 | 
				
			||||||
        "test/generated-artifacts/IAuthorizable.json",
 | 
					        "test/generated-artifacts/IAuthorizable.json",
 | 
				
			||||||
        "test/generated-artifacts/IBalancerPool.json",
 | 
					        "test/generated-artifacts/IBalancerPool.json",
 | 
				
			||||||
 | 
					        "test/generated-artifacts/IBancorNetwork.json",
 | 
				
			||||||
        "test/generated-artifacts/IChai.json",
 | 
					        "test/generated-artifacts/IChai.json",
 | 
				
			||||||
        "test/generated-artifacts/ICurve.json",
 | 
					        "test/generated-artifacts/ICurve.json",
 | 
				
			||||||
        "test/generated-artifacts/IDydx.json",
 | 
					        "test/generated-artifacts/IDydx.json",
 | 
				
			||||||
@@ -84,6 +89,7 @@
 | 
				
			|||||||
        "test/generated-artifacts/MultiAssetProxy.json",
 | 
					        "test/generated-artifacts/MultiAssetProxy.json",
 | 
				
			||||||
        "test/generated-artifacts/Ownable.json",
 | 
					        "test/generated-artifacts/Ownable.json",
 | 
				
			||||||
        "test/generated-artifacts/StaticCallProxy.json",
 | 
					        "test/generated-artifacts/StaticCallProxy.json",
 | 
				
			||||||
 | 
					        "test/generated-artifacts/TestBancorBridge.json",
 | 
				
			||||||
        "test/generated-artifacts/TestChaiBridge.json",
 | 
					        "test/generated-artifacts/TestChaiBridge.json",
 | 
				
			||||||
        "test/generated-artifacts/TestDexForwarderBridge.json",
 | 
					        "test/generated-artifacts/TestDexForwarderBridge.json",
 | 
				
			||||||
        "test/generated-artifacts/TestDydxBridge.json",
 | 
					        "test/generated-artifacts/TestDydxBridge.json",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@
 | 
				
			|||||||
        "wsrun": "wsrun",
 | 
					        "wsrun": "wsrun",
 | 
				
			||||||
        "lerna": "lerna",
 | 
					        "lerna": "lerna",
 | 
				
			||||||
        "build": "lerna link && wsrun build $PKG -r --stages --fast-exit --exclude-missing",
 | 
					        "build": "lerna link && wsrun build $PKG -r --stages --fast-exit --exclude-missing",
 | 
				
			||||||
        "build:ci": "lerna link && wsrun build:ci $PKG --fast-exit -r --stages --exclude-missing",
 | 
					        "build:ci": "lerna link && wsrun build:ci $PKG --fast-exit -r --stages --exclude-missing --exclude @0x/instant",
 | 
				
			||||||
        "build:contracts": "lerna link && wsrun build -p ${npm_package_config_contractsPackages} -c --fast-exit -r --stages --exclude-missing",
 | 
					        "build:contracts": "lerna link && wsrun build -p ${npm_package_config_contractsPackages} -c --fast-exit -r --stages --exclude-missing",
 | 
				
			||||||
        "build:monorepo_scripts": "PKG=@0x/monorepo-scripts yarn build",
 | 
					        "build:monorepo_scripts": "PKG=@0x/monorepo-scripts yarn build",
 | 
				
			||||||
        "build:ts": "tsc -b",
 | 
					        "build:ts": "tsc -b",
 | 
				
			||||||
@@ -39,7 +39,7 @@
 | 
				
			|||||||
        "contracts:watch": "wsrun watch $PKG --parallel --exclude-missing",
 | 
					        "contracts:watch": "wsrun watch $PKG --parallel --exclude-missing",
 | 
				
			||||||
        "remove_node_modules": "lerna clean --yes; rm -rf node_modules",
 | 
					        "remove_node_modules": "lerna clean --yes; rm -rf node_modules",
 | 
				
			||||||
        "rebuild": "run-s clean build",
 | 
					        "rebuild": "run-s clean build",
 | 
				
			||||||
        "test": "wsrun test $PKG --fast-exit --serial --exclude-missing --exclude @0x/asset-swapper --exclude @0x/orderbook",
 | 
					        "test": "wsrun test $PKG --fast-exit --serial --exclude-missing --exclude @0x/orderbook",
 | 
				
			||||||
        "test:contracts": "wsrun test -p ${npm_package_config_contractsPackages} -c --fast-exit --exclude-missing",
 | 
					        "test:contracts": "wsrun test -p ${npm_package_config_contractsPackages} -c --fast-exit --exclude-missing",
 | 
				
			||||||
        "generate_doc": "node ./packages/monorepo-scripts/lib/doc_generate.js",
 | 
					        "generate_doc": "node ./packages/monorepo-scripts/lib/doc_generate.js",
 | 
				
			||||||
        "upload_md_docs": "aws s3 rm --recursive s3://docs-markdown; wsrun s3:sync_md_docs --exclude-missing",
 | 
					        "upload_md_docs": "aws s3 rm --recursive s3://docs-markdown; wsrun s3:sync_md_docs --exclude-missing",
 | 
				
			||||||
@@ -62,10 +62,6 @@
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                "path": "packages/0x.js/_bundles/index.min.js",
 | 
					                "path": "packages/0x.js/_bundles/index.min.js",
 | 
				
			||||||
                "maxSize": "1300kB"
 | 
					                "maxSize": "1300kB"
 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                "path": "packages/instant/umd/v3/instant.js",
 | 
					 | 
				
			||||||
                "maxSize": "2100kB"
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        "ci": {
 | 
					        "ci": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,6 +46,10 @@
 | 
				
			|||||||
                "note": "Adjust fill by ethToInputRate when ethToOutputRate is 0",
 | 
					                "note": "Adjust fill by ethToInputRate when ethToOutputRate is 0",
 | 
				
			||||||
                "pr": 2660
 | 
					                "pr": 2660
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "note": "Add Bancor as liquidity source",
 | 
				
			||||||
 | 
					                "pr": 2650
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                "note": "Added `mStable`",
 | 
					                "note": "Added `mStable`",
 | 
				
			||||||
                "pr": 2662
 | 
					                "pr": 2662
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,6 +68,7 @@
 | 
				
			|||||||
        "@0x/utils": "^5.5.1",
 | 
					        "@0x/utils": "^5.5.1",
 | 
				
			||||||
        "@0x/web3-wrapper": "^7.2.0",
 | 
					        "@0x/web3-wrapper": "^7.2.0",
 | 
				
			||||||
        "@balancer-labs/sor": "0.3.2",
 | 
					        "@balancer-labs/sor": "0.3.2",
 | 
				
			||||||
 | 
					        "@bancor/sdk": "^0.2.5",
 | 
				
			||||||
        "axios": "^0.19.2",
 | 
					        "axios": "^0.19.2",
 | 
				
			||||||
        "axios-mock-adapter": "^1.18.1",
 | 
					        "axios-mock-adapter": "^1.18.1",
 | 
				
			||||||
        "decimal.js": "^10.2.0",
 | 
					        "decimal.js": "^10.2.0",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -108,6 +108,7 @@ export {
 | 
				
			|||||||
} from './types';
 | 
					} from './types';
 | 
				
			||||||
export { affiliateFeeUtils } from './utils/affiliate_fee_utils';
 | 
					export { affiliateFeeUtils } from './utils/affiliate_fee_utils';
 | 
				
			||||||
export {
 | 
					export {
 | 
				
			||||||
 | 
					    BancorFillData,
 | 
				
			||||||
    BalancerFillData,
 | 
					    BalancerFillData,
 | 
				
			||||||
    CollapsedFill,
 | 
					    CollapsedFill,
 | 
				
			||||||
    CurveFillData,
 | 
					    CurveFillData,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,7 @@ import {
 | 
				
			|||||||
import { assert } from './utils/assert';
 | 
					import { assert } from './utils/assert';
 | 
				
			||||||
import { calculateLiquidity } from './utils/calculate_liquidity';
 | 
					import { calculateLiquidity } from './utils/calculate_liquidity';
 | 
				
			||||||
import { MarketOperationUtils } from './utils/market_operation_utils';
 | 
					import { MarketOperationUtils } from './utils/market_operation_utils';
 | 
				
			||||||
 | 
					import { BancorService } from './utils/market_operation_utils/bancor_service';
 | 
				
			||||||
import { createDummyOrderForSampler } from './utils/market_operation_utils/orders';
 | 
					import { createDummyOrderForSampler } from './utils/market_operation_utils/orders';
 | 
				
			||||||
import { DexOrderSampler } from './utils/market_operation_utils/sampler';
 | 
					import { DexOrderSampler } from './utils/market_operation_utils/sampler';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
@@ -202,7 +203,7 @@ export class SwapQuoter {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        this._marketOperationUtils = new MarketOperationUtils(
 | 
					        this._marketOperationUtils = new MarketOperationUtils(
 | 
				
			||||||
            new DexOrderSampler(samplerContract, samplerOverrides),
 | 
					            new DexOrderSampler(samplerContract, samplerOverrides, new BancorService(provider)),
 | 
				
			||||||
            this._contractAddresses,
 | 
					            this._contractAddresses,
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                chainId,
 | 
					                chainId,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -264,6 +264,7 @@ export interface SwapQuoterOpts extends OrderPrunerOpts {
 | 
				
			|||||||
    chainId: number;
 | 
					    chainId: number;
 | 
				
			||||||
    orderRefreshIntervalMs: number;
 | 
					    orderRefreshIntervalMs: number;
 | 
				
			||||||
    expiryBufferMs: number;
 | 
					    expiryBufferMs: number;
 | 
				
			||||||
 | 
					    ethereumRpcUrl?: string;
 | 
				
			||||||
    contractAddresses?: ContractAddresses;
 | 
					    contractAddresses?: ContractAddresses;
 | 
				
			||||||
    samplerGasLimit?: number;
 | 
					    samplerGasLimit?: number;
 | 
				
			||||||
    liquidityProviderRegistryAddress?: string;
 | 
					    liquidityProviderRegistryAddress?: string;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					import { SupportedProvider } from '@0x/dev-utils';
 | 
				
			||||||
 | 
					import { BigNumber } from '@0x/utils';
 | 
				
			||||||
 | 
					import { SDK } from '@bancor/sdk';
 | 
				
			||||||
 | 
					import { Ethereum, getDecimals } from '@bancor/sdk/dist/blockchains/ethereum';
 | 
				
			||||||
 | 
					import { fromWei, toWei } from '@bancor/sdk/dist/helpers';
 | 
				
			||||||
 | 
					import { BlockchainType, Token } from '@bancor/sdk/dist/types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { BancorFillData, Quote } from './types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Converts an address to a Bancor Token type
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function token(address: string, blockchainType: BlockchainType = BlockchainType.Ethereum): Token {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					        blockchainType,
 | 
				
			||||||
 | 
					        blockchainId: address,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class BancorService {
 | 
				
			||||||
 | 
					    // Bancor recommends setting this value to 2% under the expected return amount
 | 
				
			||||||
 | 
					    public minReturnAmountBufferPercentage = 0.99;
 | 
				
			||||||
 | 
					    private _sdk?: SDK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(public provider: SupportedProvider) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async getSDKAsync(): Promise<SDK> {
 | 
				
			||||||
 | 
					        if (!this._sdk) {
 | 
				
			||||||
 | 
					            this._sdk = await SDK.create({ ethereumNodeEndpoint: this.provider });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return this._sdk;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async getQuoteAsync(
 | 
				
			||||||
 | 
					        fromToken: string,
 | 
				
			||||||
 | 
					        toToken: string,
 | 
				
			||||||
 | 
					        amount: BigNumber = new BigNumber(1),
 | 
				
			||||||
 | 
					    ): Promise<Quote<BancorFillData>> {
 | 
				
			||||||
 | 
					        const sdk = await this.getSDKAsync();
 | 
				
			||||||
 | 
					        const blockchain = sdk._core.blockchains[BlockchainType.Ethereum] as Ethereum;
 | 
				
			||||||
 | 
					        const sourceDecimals = await getDecimals(blockchain, fromToken);
 | 
				
			||||||
 | 
					        const { path, rate } = await sdk.pricing.getPathAndRate(
 | 
				
			||||||
 | 
					            token(fromToken),
 | 
				
			||||||
 | 
					            token(toToken),
 | 
				
			||||||
 | 
					            fromWei(amount.toString(), sourceDecimals),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        const targetDecimals = await getDecimals(blockchain, toToken);
 | 
				
			||||||
 | 
					        const output = toWei(rate, targetDecimals);
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            amount: new BigNumber(output).multipliedBy(this.minReturnAmountBufferPercentage).dp(0),
 | 
				
			||||||
 | 
					            fillData: {
 | 
				
			||||||
 | 
					                path: path.map(p => p.blockchainId),
 | 
				
			||||||
 | 
					                networkAddress: await this.getBancorNetworkAddressAsync(),
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async getBancorNetworkAddressAsync(): Promise<string> {
 | 
				
			||||||
 | 
					        const sdk = await this.getSDKAsync();
 | 
				
			||||||
 | 
					        const blockchain = sdk._core.blockchains[BlockchainType.Ethereum] as Ethereum;
 | 
				
			||||||
 | 
					        return blockchain.bancorNetwork._address;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -14,6 +14,7 @@ export const SELL_SOURCES = [
 | 
				
			|||||||
    ERC20BridgeSource.Kyber,
 | 
					    ERC20BridgeSource.Kyber,
 | 
				
			||||||
    ERC20BridgeSource.Curve,
 | 
					    ERC20BridgeSource.Curve,
 | 
				
			||||||
    ERC20BridgeSource.Balancer,
 | 
					    ERC20BridgeSource.Balancer,
 | 
				
			||||||
 | 
					    // ERC20BridgeSource.Bancor, // FIXME: Disabled until Bancor SDK supports batch requests
 | 
				
			||||||
    ERC20BridgeSource.MStable,
 | 
					    ERC20BridgeSource.MStable,
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -27,6 +28,7 @@ export const BUY_SOURCES = [
 | 
				
			|||||||
    ERC20BridgeSource.Kyber,
 | 
					    ERC20BridgeSource.Kyber,
 | 
				
			||||||
    ERC20BridgeSource.Curve,
 | 
					    ERC20BridgeSource.Curve,
 | 
				
			||||||
    ERC20BridgeSource.Balancer,
 | 
					    ERC20BridgeSource.Balancer,
 | 
				
			||||||
 | 
					    // ERC20BridgeSource.Bancor, // FIXME: Disabled until Bancor SDK supports buy quotes
 | 
				
			||||||
    ERC20BridgeSource.MStable,
 | 
					    ERC20BridgeSource.MStable,
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -256,6 +256,7 @@ export function collapsePath(path: Fill[]): CollapsedFill[] {
 | 
				
			|||||||
            if (prevFill.sourcePathId === fill.sourcePathId) {
 | 
					            if (prevFill.sourcePathId === fill.sourcePathId) {
 | 
				
			||||||
                prevFill.input = prevFill.input.plus(fill.input);
 | 
					                prevFill.input = prevFill.input.plus(fill.input);
 | 
				
			||||||
                prevFill.output = prevFill.output.plus(fill.output);
 | 
					                prevFill.output = prevFill.output.plus(fill.output);
 | 
				
			||||||
 | 
					                prevFill.fillData = fill.fillData;
 | 
				
			||||||
                prevFill.subFills.push(fill);
 | 
					                prevFill.subFills.push(fill);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -114,6 +114,7 @@ export class MarketOperationUtils {
 | 
				
			|||||||
                this._sampler.balancerPoolsCache,
 | 
					                this._sampler.balancerPoolsCache,
 | 
				
			||||||
                this._liquidityProviderRegistry,
 | 
					                this._liquidityProviderRegistry,
 | 
				
			||||||
                this._multiBridge,
 | 
					                this._multiBridge,
 | 
				
			||||||
 | 
					                this._sampler.bancorService,
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            // Get ETH -> taker token price.
 | 
					            // Get ETH -> taker token price.
 | 
				
			||||||
            await DexOrderSampler.ops.getMedianSellRateAsync(
 | 
					            await DexOrderSampler.ops.getMedianSellRateAsync(
 | 
				
			||||||
@@ -139,6 +140,7 @@ export class MarketOperationUtils {
 | 
				
			|||||||
                this._sampler.balancerPoolsCache,
 | 
					                this._sampler.balancerPoolsCache,
 | 
				
			||||||
                this._liquidityProviderRegistry,
 | 
					                this._liquidityProviderRegistry,
 | 
				
			||||||
                this._multiBridge,
 | 
					                this._multiBridge,
 | 
				
			||||||
 | 
					                this._sampler.bancorService,
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -160,6 +162,7 @@ export class MarketOperationUtils {
 | 
				
			|||||||
                this._sampler.balancerPoolsCache,
 | 
					                this._sampler.balancerPoolsCache,
 | 
				
			||||||
                this._liquidityProviderRegistry,
 | 
					                this._liquidityProviderRegistry,
 | 
				
			||||||
                this._multiBridge,
 | 
					                this._multiBridge,
 | 
				
			||||||
 | 
					                this._sampler.bancorService,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .then(async r => this._sampler.executeAsync(r));
 | 
					            .then(async r => this._sampler.executeAsync(r));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -241,6 +244,7 @@ export class MarketOperationUtils {
 | 
				
			|||||||
                this._sampler.balancerPoolsCache,
 | 
					                this._sampler.balancerPoolsCache,
 | 
				
			||||||
                this._liquidityProviderRegistry,
 | 
					                this._liquidityProviderRegistry,
 | 
				
			||||||
                this._multiBridge,
 | 
					                this._multiBridge,
 | 
				
			||||||
 | 
					                this._sampler.bancorService,
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            // Get buy quotes for taker -> maker.
 | 
					            // Get buy quotes for taker -> maker.
 | 
				
			||||||
            await DexOrderSampler.ops.getBuyQuotesAsync(
 | 
					            await DexOrderSampler.ops.getBuyQuotesAsync(
 | 
				
			||||||
@@ -248,7 +252,7 @@ export class MarketOperationUtils {
 | 
				
			|||||||
                    BUY_SOURCES.concat(
 | 
					                    BUY_SOURCES.concat(
 | 
				
			||||||
                        this._liquidityProviderRegistry !== NULL_ADDRESS ? [ERC20BridgeSource.LiquidityProvider] : [],
 | 
					                        this._liquidityProviderRegistry !== NULL_ADDRESS ? [ERC20BridgeSource.LiquidityProvider] : [],
 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
                    _opts.excludedSources.concat(ERC20BridgeSource.Balancer),
 | 
					                    _opts.excludedSources.concat([ERC20BridgeSource.Balancer]),
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
                makerToken,
 | 
					                makerToken,
 | 
				
			||||||
                takerToken,
 | 
					                takerToken,
 | 
				
			||||||
@@ -256,6 +260,7 @@ export class MarketOperationUtils {
 | 
				
			|||||||
                this._wethAddress,
 | 
					                this._wethAddress,
 | 
				
			||||||
                this._sampler.balancerPoolsCache,
 | 
					                this._sampler.balancerPoolsCache,
 | 
				
			||||||
                this._liquidityProviderRegistry,
 | 
					                this._liquidityProviderRegistry,
 | 
				
			||||||
 | 
					                this._sampler.bancorService,
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -268,6 +273,7 @@ export class MarketOperationUtils {
 | 
				
			|||||||
                this._wethAddress,
 | 
					                this._wethAddress,
 | 
				
			||||||
                this._sampler.balancerPoolsCache,
 | 
					                this._sampler.balancerPoolsCache,
 | 
				
			||||||
                this._liquidityProviderRegistry,
 | 
					                this._liquidityProviderRegistry,
 | 
				
			||||||
 | 
					                this._sampler.bancorService,
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,7 @@ import { getMultiBridgeIntermediateToken } from './multibridge_utils';
 | 
				
			|||||||
import {
 | 
					import {
 | 
				
			||||||
    AggregationError,
 | 
					    AggregationError,
 | 
				
			||||||
    BalancerFillData,
 | 
					    BalancerFillData,
 | 
				
			||||||
 | 
					    BancorFillData,
 | 
				
			||||||
    CollapsedFill,
 | 
					    CollapsedFill,
 | 
				
			||||||
    CurveFillData,
 | 
					    CurveFillData,
 | 
				
			||||||
    ERC20BridgeSource,
 | 
					    ERC20BridgeSource,
 | 
				
			||||||
@@ -190,6 +191,8 @@ function getBridgeAddressFromFill(fill: CollapsedFill, opts: CreateOrderFromPath
 | 
				
			|||||||
            return opts.contractAddresses.uniswapV2Bridge;
 | 
					            return opts.contractAddresses.uniswapV2Bridge;
 | 
				
			||||||
        case ERC20BridgeSource.Curve:
 | 
					        case ERC20BridgeSource.Curve:
 | 
				
			||||||
            return opts.contractAddresses.curveBridge;
 | 
					            return opts.contractAddresses.curveBridge;
 | 
				
			||||||
 | 
					        case ERC20BridgeSource.Bancor:
 | 
				
			||||||
 | 
					            return opts.contractAddresses.bancorBridge;
 | 
				
			||||||
        case ERC20BridgeSource.Balancer:
 | 
					        case ERC20BridgeSource.Balancer:
 | 
				
			||||||
            return opts.contractAddresses.balancerBridge;
 | 
					            return opts.contractAddresses.balancerBridge;
 | 
				
			||||||
        case ERC20BridgeSource.LiquidityProvider:
 | 
					        case ERC20BridgeSource.LiquidityProvider:
 | 
				
			||||||
@@ -232,6 +235,14 @@ function createBridgeOrder(fill: CollapsedFill, opts: CreateOrderFromPathOpts):
 | 
				
			|||||||
                createBalancerBridgeData(takerToken, balancerFillData.poolAddress),
 | 
					                createBalancerBridgeData(takerToken, balancerFillData.poolAddress),
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					        case ERC20BridgeSource.Bancor:
 | 
				
			||||||
 | 
					            const bancorFillData = (fill as CollapsedFill<BancorFillData>).fillData!; // tslint:disable-line:no-non-null-assertion
 | 
				
			||||||
 | 
					            makerAssetData = assetDataUtils.encodeERC20BridgeAssetData(
 | 
				
			||||||
 | 
					                makerToken,
 | 
				
			||||||
 | 
					                bridgeAddress,
 | 
				
			||||||
 | 
					                createBancorBridgeData(bancorFillData.path, bancorFillData.networkAddress),
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
        case ERC20BridgeSource.UniswapV2:
 | 
					        case ERC20BridgeSource.UniswapV2:
 | 
				
			||||||
            const uniswapV2FillData = (fill as CollapsedFill<UniswapV2FillData>).fillData!; // tslint:disable-line:no-non-null-assertion
 | 
					            const uniswapV2FillData = (fill as CollapsedFill<UniswapV2FillData>).fillData!; // tslint:disable-line:no-non-null-assertion
 | 
				
			||||||
            makerAssetData = assetDataUtils.encodeERC20BridgeAssetData(
 | 
					            makerAssetData = assetDataUtils.encodeERC20BridgeAssetData(
 | 
				
			||||||
@@ -337,6 +348,14 @@ function createBalancerBridgeData(takerToken: string, poolAddress: string): stri
 | 
				
			|||||||
    return encoder.encode({ takerToken, poolAddress });
 | 
					    return encoder.encode({ takerToken, poolAddress });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function createBancorBridgeData(path: string[], networkAddress: string): string {
 | 
				
			||||||
 | 
					    const encoder = AbiEncoder.create([
 | 
				
			||||||
 | 
					        { name: 'path', type: 'address[]' },
 | 
				
			||||||
 | 
					        { name: 'networkAddress', type: 'address' },
 | 
				
			||||||
 | 
					    ]);
 | 
				
			||||||
 | 
					    return encoder.encode({ path, networkAddress });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function createCurveBridgeData(
 | 
					function createCurveBridgeData(
 | 
				
			||||||
    curveAddress: string,
 | 
					    curveAddress: string,
 | 
				
			||||||
    exchangeFunctionSelector: string,
 | 
					    exchangeFunctionSelector: string,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import { SamplerOverrides } from '../../types';
 | 
				
			|||||||
import { ERC20BridgeSamplerContract } from '../../wrappers';
 | 
					import { ERC20BridgeSamplerContract } from '../../wrappers';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { BalancerPoolsCache } from './balancer_utils';
 | 
					import { BalancerPoolsCache } from './balancer_utils';
 | 
				
			||||||
 | 
					import { BancorService } from './bancor_service';
 | 
				
			||||||
import { samplerOperations } from './sampler_operations';
 | 
					import { samplerOperations } from './sampler_operations';
 | 
				
			||||||
import { BatchedOperation } from './types';
 | 
					import { BatchedOperation } from './types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,6 +40,7 @@ export class DexOrderSampler {
 | 
				
			|||||||
    constructor(
 | 
					    constructor(
 | 
				
			||||||
        private readonly _samplerContract: ERC20BridgeSamplerContract,
 | 
					        private readonly _samplerContract: ERC20BridgeSamplerContract,
 | 
				
			||||||
        private readonly _samplerOverrides?: SamplerOverrides,
 | 
					        private readonly _samplerOverrides?: SamplerOverrides,
 | 
				
			||||||
 | 
					        public bancorService?: BancorService,
 | 
				
			||||||
        public balancerPoolsCache: BalancerPoolsCache = new BalancerPoolsCache(),
 | 
					        public balancerPoolsCache: BalancerPoolsCache = new BalancerPoolsCache(),
 | 
				
			||||||
    ) {}
 | 
					    ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,15 +3,19 @@ import * as _ from 'lodash';
 | 
				
			|||||||
import { BigNumber, ERC20BridgeSource, SignedOrder } from '../..';
 | 
					import { BigNumber, ERC20BridgeSource, SignedOrder } from '../..';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { BalancerPool, BalancerPoolsCache, computeBalancerBuyQuote, computeBalancerSellQuote } from './balancer_utils';
 | 
					import { BalancerPool, BalancerPoolsCache, computeBalancerBuyQuote, computeBalancerSellQuote } from './balancer_utils';
 | 
				
			||||||
 | 
					import { BancorService } from './bancor_service';
 | 
				
			||||||
import { NULL_BYTES, ZERO_AMOUNT } from './constants';
 | 
					import { NULL_BYTES, ZERO_AMOUNT } from './constants';
 | 
				
			||||||
import { getCurveInfosForPair } from './curve_utils';
 | 
					import { getCurveInfosForPair } from './curve_utils';
 | 
				
			||||||
import { getMultiBridgeIntermediateToken } from './multibridge_utils';
 | 
					import { getMultiBridgeIntermediateToken } from './multibridge_utils';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    BalancerFillData,
 | 
					    BalancerFillData,
 | 
				
			||||||
 | 
					    BancorFillData,
 | 
				
			||||||
    BatchedOperation,
 | 
					    BatchedOperation,
 | 
				
			||||||
    CurveFillData,
 | 
					    CurveFillData,
 | 
				
			||||||
    CurveInfo,
 | 
					    CurveInfo,
 | 
				
			||||||
    DexSample,
 | 
					    DexSample,
 | 
				
			||||||
 | 
					    FillData,
 | 
				
			||||||
 | 
					    Quote,
 | 
				
			||||||
    SourceQuoteOperation,
 | 
					    SourceQuoteOperation,
 | 
				
			||||||
    UniswapV2FillData,
 | 
					    UniswapV2FillData,
 | 
				
			||||||
} from './types';
 | 
					} from './types';
 | 
				
			||||||
@@ -54,7 +58,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleSellsFromKyberNetwork', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleSellsFromKyberNetwork', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -67,7 +73,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleBuysFromKyberNetwork', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleBuysFromKyberNetwork', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -80,7 +88,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleSellsFromUniswap', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleSellsFromUniswap', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -93,7 +103,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleBuysFromUniswap', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleBuysFromUniswap', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -103,14 +115,18 @@ export const samplerOperations = {
 | 
				
			|||||||
    ): SourceQuoteOperation<UniswapV2FillData> {
 | 
					    ): SourceQuoteOperation<UniswapV2FillData> {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            source: ERC20BridgeSource.UniswapV2,
 | 
					            source: ERC20BridgeSource.UniswapV2,
 | 
				
			||||||
            fillData: { tokenAddressPath },
 | 
					 | 
				
			||||||
            encodeCall: contract => {
 | 
					            encodeCall: contract => {
 | 
				
			||||||
                return contract
 | 
					                return contract
 | 
				
			||||||
                    .sampleSellsFromUniswapV2(tokenAddressPath, takerFillAmounts)
 | 
					                    .sampleSellsFromUniswapV2(tokenAddressPath, takerFillAmounts)
 | 
				
			||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleSellsFromUniswapV2', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleSellsFromUniswapV2', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({
 | 
				
			||||||
 | 
					                        amount,
 | 
				
			||||||
 | 
					                        fillData: { tokenAddressPath },
 | 
				
			||||||
 | 
					                    }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -120,14 +136,18 @@ export const samplerOperations = {
 | 
				
			|||||||
    ): SourceQuoteOperation<UniswapV2FillData> {
 | 
					    ): SourceQuoteOperation<UniswapV2FillData> {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            source: ERC20BridgeSource.UniswapV2,
 | 
					            source: ERC20BridgeSource.UniswapV2,
 | 
				
			||||||
            fillData: { tokenAddressPath },
 | 
					 | 
				
			||||||
            encodeCall: contract => {
 | 
					            encodeCall: contract => {
 | 
				
			||||||
                return contract
 | 
					                return contract
 | 
				
			||||||
                    .sampleBuysFromUniswapV2(tokenAddressPath, makerFillAmounts)
 | 
					                    .sampleBuysFromUniswapV2(tokenAddressPath, makerFillAmounts)
 | 
				
			||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleBuysFromUniswapV2', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleBuysFromUniswapV2', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({
 | 
				
			||||||
 | 
					                        amount,
 | 
				
			||||||
 | 
					                        fillData: { tokenAddressPath },
 | 
				
			||||||
 | 
					                    }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -145,10 +165,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>(
 | 
					                return contract
 | 
				
			||||||
                    'sampleSellsFromLiquidityProviderRegistry',
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleSellsFromLiquidityProviderRegistry', callResults)
 | 
				
			||||||
                    callResults,
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -166,10 +185,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>(
 | 
					                return contract
 | 
				
			||||||
                    'sampleBuysFromLiquidityProviderRegistry',
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleBuysFromLiquidityProviderRegistry', callResults)
 | 
				
			||||||
                    callResults,
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -194,7 +212,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleSellsFromMultiBridge', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleSellsFromMultiBridge', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -207,7 +227,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleSellsFromEth2Dai', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleSellsFromEth2Dai', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -220,7 +242,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleBuysFromEth2Dai', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleBuysFromEth2Dai', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -232,11 +256,6 @@ export const samplerOperations = {
 | 
				
			|||||||
    ): SourceQuoteOperation<CurveFillData> {
 | 
					    ): SourceQuoteOperation<CurveFillData> {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            source: ERC20BridgeSource.Curve,
 | 
					            source: ERC20BridgeSource.Curve,
 | 
				
			||||||
            fillData: {
 | 
					 | 
				
			||||||
                curve,
 | 
					 | 
				
			||||||
                fromTokenIdx,
 | 
					 | 
				
			||||||
                toTokenIdx,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            encodeCall: contract => {
 | 
					            encodeCall: contract => {
 | 
				
			||||||
                return contract
 | 
					                return contract
 | 
				
			||||||
                    .sampleSellsFromCurve(
 | 
					                    .sampleSellsFromCurve(
 | 
				
			||||||
@@ -252,7 +271,16 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleSellsFromCurve', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleSellsFromCurve', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({
 | 
				
			||||||
 | 
					                        amount,
 | 
				
			||||||
 | 
					                        fillData: {
 | 
				
			||||||
 | 
					                            curve,
 | 
				
			||||||
 | 
					                            fromTokenIdx,
 | 
				
			||||||
 | 
					                            toTokenIdx,
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                    }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -264,11 +292,6 @@ export const samplerOperations = {
 | 
				
			|||||||
    ): SourceQuoteOperation<CurveFillData> {
 | 
					    ): SourceQuoteOperation<CurveFillData> {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            source: ERC20BridgeSource.Curve,
 | 
					            source: ERC20BridgeSource.Curve,
 | 
				
			||||||
            fillData: {
 | 
					 | 
				
			||||||
                curve,
 | 
					 | 
				
			||||||
                fromTokenIdx,
 | 
					 | 
				
			||||||
                toTokenIdx,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            encodeCall: contract => {
 | 
					            encodeCall: contract => {
 | 
				
			||||||
                return contract
 | 
					                return contract
 | 
				
			||||||
                    .sampleBuysFromCurve(
 | 
					                    .sampleBuysFromCurve(
 | 
				
			||||||
@@ -284,22 +307,57 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleBuysFromCurve', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleBuysFromCurve', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({
 | 
				
			||||||
 | 
					                        amount,
 | 
				
			||||||
 | 
					                        fillData: {
 | 
				
			||||||
 | 
					                            curve,
 | 
				
			||||||
 | 
					                            fromTokenIdx,
 | 
				
			||||||
 | 
					                            toTokenIdx,
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                    }));
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    getBancorSellQuotes(
 | 
				
			||||||
 | 
					        makerToken: string,
 | 
				
			||||||
 | 
					        takerToken: string,
 | 
				
			||||||
 | 
					        takerFillAmounts: BigNumber[],
 | 
				
			||||||
 | 
					        bancorService: BancorService,
 | 
				
			||||||
 | 
					    ): SourceQuoteOperation<BancorFillData> {
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            source: ERC20BridgeSource.Bancor,
 | 
				
			||||||
 | 
					            encodeCall: _contract => {
 | 
				
			||||||
 | 
					                return '0x';
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            handleCallResultsAsync: async (_contract, _callResults) => {
 | 
				
			||||||
 | 
					                return Promise.all(
 | 
				
			||||||
 | 
					                    takerFillAmounts.map(async amt => bancorService.getQuoteAsync(takerToken, makerToken, amt)),
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    getBalancerSellQuotes(pool: BalancerPool, takerFillAmounts: BigNumber[]): SourceQuoteOperation<BalancerFillData> {
 | 
					    getBalancerSellQuotes(pool: BalancerPool, takerFillAmounts: BigNumber[]): SourceQuoteOperation<BalancerFillData> {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            source: ERC20BridgeSource.Balancer,
 | 
					            source: ERC20BridgeSource.Balancer,
 | 
				
			||||||
 | 
					            ...samplerOperations.constant(
 | 
				
			||||||
 | 
					                takerFillAmounts.map(amount => ({
 | 
				
			||||||
 | 
					                    amount: computeBalancerSellQuote(pool, amount),
 | 
				
			||||||
                    fillData: { poolAddress: pool.id },
 | 
					                    fillData: { poolAddress: pool.id },
 | 
				
			||||||
            ...samplerOperations.constant(takerFillAmounts.map(amount => computeBalancerSellQuote(pool, amount))),
 | 
					                })),
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    getBalancerBuyQuotes(pool: BalancerPool, makerFillAmounts: BigNumber[]): SourceQuoteOperation<BalancerFillData> {
 | 
					    getBalancerBuyQuotes(pool: BalancerPool, makerFillAmounts: BigNumber[]): SourceQuoteOperation<BalancerFillData> {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            source: ERC20BridgeSource.Balancer,
 | 
					            source: ERC20BridgeSource.Balancer,
 | 
				
			||||||
 | 
					            ...samplerOperations.constant(
 | 
				
			||||||
 | 
					                makerFillAmounts.map(amount => ({
 | 
				
			||||||
 | 
					                    amount: computeBalancerBuyQuote(pool, amount),
 | 
				
			||||||
                    fillData: { poolAddress: pool.id },
 | 
					                    fillData: { poolAddress: pool.id },
 | 
				
			||||||
            ...samplerOperations.constant(makerFillAmounts.map(amount => computeBalancerBuyQuote(pool, amount))),
 | 
					                })),
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    getMStableSellQuotes(makerToken: string, takerToken: string, takerFillAmounts: BigNumber[]): SourceQuoteOperation {
 | 
					    getMStableSellQuotes(makerToken: string, takerToken: string, takerFillAmounts: BigNumber[]): SourceQuoteOperation {
 | 
				
			||||||
@@ -311,7 +369,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleSellsFromMStable', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleSellsFromMStable', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -324,7 +384,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                    .getABIEncodedTransactionData();
 | 
					                    .getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                return contract.getABIDecodedReturnData<BigNumber[]>('sampleBuysFromMStable', callResults);
 | 
					                return contract
 | 
				
			||||||
 | 
					                    .getABIDecodedReturnData<BigNumber[]>('sampleBuysFromMStable', callResults)
 | 
				
			||||||
 | 
					                    .map(amount => ({ amount }));
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -337,6 +399,7 @@ export const samplerOperations = {
 | 
				
			|||||||
        balancerPoolsCache?: BalancerPoolsCache,
 | 
					        balancerPoolsCache?: BalancerPoolsCache,
 | 
				
			||||||
        liquidityProviderRegistryAddress?: string,
 | 
					        liquidityProviderRegistryAddress?: string,
 | 
				
			||||||
        multiBridgeAddress?: string,
 | 
					        multiBridgeAddress?: string,
 | 
				
			||||||
 | 
					        bancorService?: BancorService,
 | 
				
			||||||
    ): Promise<BatchedOperation<BigNumber>> => {
 | 
					    ): Promise<BatchedOperation<BigNumber>> => {
 | 
				
			||||||
        if (makerToken.toLowerCase() === takerToken.toLowerCase()) {
 | 
					        if (makerToken.toLowerCase() === takerToken.toLowerCase()) {
 | 
				
			||||||
            return samplerOperations.constant(new BigNumber(1));
 | 
					            return samplerOperations.constant(new BigNumber(1));
 | 
				
			||||||
@@ -350,6 +413,7 @@ export const samplerOperations = {
 | 
				
			|||||||
            balancerPoolsCache,
 | 
					            balancerPoolsCache,
 | 
				
			||||||
            liquidityProviderRegistryAddress,
 | 
					            liquidityProviderRegistryAddress,
 | 
				
			||||||
            multiBridgeAddress,
 | 
					            multiBridgeAddress,
 | 
				
			||||||
 | 
					            bancorService,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            encodeCall: contract => {
 | 
					            encodeCall: contract => {
 | 
				
			||||||
@@ -417,11 +481,12 @@ export const samplerOperations = {
 | 
				
			|||||||
        balancerPoolsCache?: BalancerPoolsCache,
 | 
					        balancerPoolsCache?: BalancerPoolsCache,
 | 
				
			||||||
        liquidityProviderRegistryAddress?: string,
 | 
					        liquidityProviderRegistryAddress?: string,
 | 
				
			||||||
        multiBridgeAddress?: string,
 | 
					        multiBridgeAddress?: string,
 | 
				
			||||||
 | 
					        bancorService?: BancorService,
 | 
				
			||||||
    ): Promise<BatchedOperation<DexSample[][]>> => {
 | 
					    ): Promise<BatchedOperation<DexSample[][]>> => {
 | 
				
			||||||
        const subOps = _.flatten(
 | 
					        const subOps = _.flatten(
 | 
				
			||||||
            await Promise.all(
 | 
					            await Promise.all(
 | 
				
			||||||
                sources.map(
 | 
					                sources.map(
 | 
				
			||||||
                    async (source): Promise<SourceQuoteOperation | SourceQuoteOperation[]> => {
 | 
					                    async (source): Promise<SourceQuoteOperation<FillData> | Array<SourceQuoteOperation<FillData>>> => {
 | 
				
			||||||
                        switch (source) {
 | 
					                        switch (source) {
 | 
				
			||||||
                            case ERC20BridgeSource.Eth2Dai:
 | 
					                            case ERC20BridgeSource.Eth2Dai:
 | 
				
			||||||
                                return samplerOperations.getEth2DaiSellQuotes(makerToken, takerToken, takerFillAmounts);
 | 
					                                return samplerOperations.getEth2DaiSellQuotes(makerToken, takerToken, takerFillAmounts);
 | 
				
			||||||
@@ -491,6 +556,18 @@ export const samplerOperations = {
 | 
				
			|||||||
                                return pools.map(pool =>
 | 
					                                return pools.map(pool =>
 | 
				
			||||||
                                    samplerOperations.getBalancerSellQuotes(pool, takerFillAmounts),
 | 
					                                    samplerOperations.getBalancerSellQuotes(pool, takerFillAmounts),
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
 | 
					                            case ERC20BridgeSource.Bancor:
 | 
				
			||||||
 | 
					                                if (bancorService === undefined) {
 | 
				
			||||||
 | 
					                                    throw new Error(
 | 
				
			||||||
 | 
					                                        'Cannot sample liquidity from Bancor; no Bancor service instantiated.',
 | 
				
			||||||
 | 
					                                    );
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                return samplerOperations.getBancorSellQuotes(
 | 
				
			||||||
 | 
					                                    makerToken,
 | 
				
			||||||
 | 
					                                    takerToken,
 | 
				
			||||||
 | 
					                                    takerFillAmounts,
 | 
				
			||||||
 | 
					                                    bancorService,
 | 
				
			||||||
 | 
					                                );
 | 
				
			||||||
                            case ERC20BridgeSource.MStable:
 | 
					                            case ERC20BridgeSource.MStable:
 | 
				
			||||||
                                return samplerOperations.getMStableSellQuotes(makerToken, takerToken, takerFillAmounts);
 | 
					                                return samplerOperations.getMStableSellQuotes(makerToken, takerToken, takerFillAmounts);
 | 
				
			||||||
                            default:
 | 
					                            default:
 | 
				
			||||||
@@ -500,8 +577,16 @@ export const samplerOperations = {
 | 
				
			|||||||
                ),
 | 
					                ),
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        const samplerOps = subOps.filter(op => op.source !== ERC20BridgeSource.Balancer);
 | 
					        const nonSamplerSources = [ERC20BridgeSource.Balancer, ERC20BridgeSource.Bancor];
 | 
				
			||||||
        const nonSamplerOps = subOps.filter(op => op.source === ERC20BridgeSource.Balancer);
 | 
					        const samplerOps: Array<SourceQuoteOperation<FillData>> = [];
 | 
				
			||||||
 | 
					        const nonSamplerOps: Array<SourceQuoteOperation<FillData>> = [];
 | 
				
			||||||
 | 
					        subOps.forEach(op => {
 | 
				
			||||||
 | 
					            if (nonSamplerSources.includes(op.source)) {
 | 
				
			||||||
 | 
					                nonSamplerOps.push(op);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                samplerOps.push(op);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            encodeCall: contract => {
 | 
					            encodeCall: contract => {
 | 
				
			||||||
                // All operations are NOOPs
 | 
					                // All operations are NOOPs
 | 
				
			||||||
@@ -512,7 +597,7 @@ export const samplerOperations = {
 | 
				
			|||||||
                return contract.batchCall(subCalls).getABIEncodedTransactionData();
 | 
					                return contract.batchCall(subCalls).getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                let samples: BigNumber[][];
 | 
					                let samples: Array<Array<Quote<FillData>>>;
 | 
				
			||||||
                // If all operations were NOOPs then just call the handle result callback
 | 
					                // If all operations were NOOPs then just call the handle result callback
 | 
				
			||||||
                if (callResults === NULL_BYTES && samplerOps.length === 0) {
 | 
					                if (callResults === NULL_BYTES && samplerOps.length === 0) {
 | 
				
			||||||
                    samples = await Promise.all(nonSamplerOps.map(async op => op.handleCallResultsAsync(contract, '')));
 | 
					                    samples = await Promise.all(nonSamplerOps.map(async op => op.handleCallResultsAsync(contract, '')));
 | 
				
			||||||
@@ -528,9 +613,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                return [...samplerOps, ...nonSamplerOps].map((op, i) => {
 | 
					                return [...samplerOps, ...nonSamplerOps].map((op, i) => {
 | 
				
			||||||
                    return samples[i].map((output, j) => ({
 | 
					                    return samples[i].map((output, j) => ({
 | 
				
			||||||
                        source: op.source,
 | 
					                        source: op.source,
 | 
				
			||||||
                        output,
 | 
					                        output: output.amount,
 | 
				
			||||||
                        input: takerFillAmounts[j],
 | 
					                        input: takerFillAmounts[j],
 | 
				
			||||||
                        fillData: op.fillData,
 | 
					                        fillData: output.fillData,
 | 
				
			||||||
                    }));
 | 
					                    }));
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
@@ -544,11 +629,12 @@ export const samplerOperations = {
 | 
				
			|||||||
        wethAddress: string,
 | 
					        wethAddress: string,
 | 
				
			||||||
        balancerPoolsCache?: BalancerPoolsCache,
 | 
					        balancerPoolsCache?: BalancerPoolsCache,
 | 
				
			||||||
        liquidityProviderRegistryAddress?: string,
 | 
					        liquidityProviderRegistryAddress?: string,
 | 
				
			||||||
 | 
					        bancorService?: BancorService,
 | 
				
			||||||
    ): Promise<BatchedOperation<DexSample[][]>> => {
 | 
					    ): Promise<BatchedOperation<DexSample[][]>> => {
 | 
				
			||||||
        const subOps = _.flatten(
 | 
					        const subOps = _.flatten(
 | 
				
			||||||
            await Promise.all(
 | 
					            await Promise.all(
 | 
				
			||||||
                sources.map(
 | 
					                sources.map(
 | 
				
			||||||
                    async (source): Promise<SourceQuoteOperation | SourceQuoteOperation[]> => {
 | 
					                    async (source): Promise<SourceQuoteOperation<FillData> | Array<SourceQuoteOperation<FillData>>> => {
 | 
				
			||||||
                        switch (source) {
 | 
					                        switch (source) {
 | 
				
			||||||
                            case ERC20BridgeSource.Eth2Dai:
 | 
					                            case ERC20BridgeSource.Eth2Dai:
 | 
				
			||||||
                                return samplerOperations.getEth2DaiBuyQuotes(makerToken, takerToken, makerFillAmounts);
 | 
					                                return samplerOperations.getEth2DaiBuyQuotes(makerToken, takerToken, makerFillAmounts);
 | 
				
			||||||
@@ -600,6 +686,8 @@ export const samplerOperations = {
 | 
				
			|||||||
                                return pools.map(pool =>
 | 
					                                return pools.map(pool =>
 | 
				
			||||||
                                    samplerOperations.getBalancerBuyQuotes(pool, makerFillAmounts),
 | 
					                                    samplerOperations.getBalancerBuyQuotes(pool, makerFillAmounts),
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
 | 
					                            case ERC20BridgeSource.Bancor:
 | 
				
			||||||
 | 
					                                return []; //  FIXME: Waiting for Bancor SDK to support buy quotes, but don't throw an error here
 | 
				
			||||||
                            case ERC20BridgeSource.MStable:
 | 
					                            case ERC20BridgeSource.MStable:
 | 
				
			||||||
                                return samplerOperations.getMStableBuyQuotes(makerToken, takerToken, makerFillAmounts);
 | 
					                                return samplerOperations.getMStableBuyQuotes(makerToken, takerToken, makerFillAmounts);
 | 
				
			||||||
                            default:
 | 
					                            default:
 | 
				
			||||||
@@ -609,8 +697,16 @@ export const samplerOperations = {
 | 
				
			|||||||
                ),
 | 
					                ),
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        const samplerOps = subOps.filter(op => op.source !== ERC20BridgeSource.Balancer);
 | 
					        const nonSamplerSources = [ERC20BridgeSource.Balancer, ERC20BridgeSource.Bancor];
 | 
				
			||||||
        const nonSamplerOps = subOps.filter(op => op.source === ERC20BridgeSource.Balancer);
 | 
					        const samplerOps: Array<SourceQuoteOperation<FillData>> = [];
 | 
				
			||||||
 | 
					        const nonSamplerOps: Array<SourceQuoteOperation<FillData>> = [];
 | 
				
			||||||
 | 
					        subOps.forEach(op => {
 | 
				
			||||||
 | 
					            if (nonSamplerSources.find(s => s === op.source) !== undefined) {
 | 
				
			||||||
 | 
					                nonSamplerOps.push(op);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                samplerOps.push(op);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            encodeCall: contract => {
 | 
					            encodeCall: contract => {
 | 
				
			||||||
                // All operations are NOOPs
 | 
					                // All operations are NOOPs
 | 
				
			||||||
@@ -621,7 +717,7 @@ export const samplerOperations = {
 | 
				
			|||||||
                return contract.batchCall(subCalls).getABIEncodedTransactionData();
 | 
					                return contract.batchCall(subCalls).getABIEncodedTransactionData();
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            handleCallResultsAsync: async (contract, callResults) => {
 | 
					            handleCallResultsAsync: async (contract, callResults) => {
 | 
				
			||||||
                let samples: BigNumber[][];
 | 
					                let samples: Array<Array<Quote<FillData>>>;
 | 
				
			||||||
                if (callResults === NULL_BYTES && samplerOps.length === 0) {
 | 
					                if (callResults === NULL_BYTES && samplerOps.length === 0) {
 | 
				
			||||||
                    samples = await Promise.all(nonSamplerOps.map(async op => op.handleCallResultsAsync(contract, '')));
 | 
					                    samples = await Promise.all(nonSamplerOps.map(async op => op.handleCallResultsAsync(contract, '')));
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
@@ -636,9 +732,9 @@ export const samplerOperations = {
 | 
				
			|||||||
                return [...samplerOps, ...nonSamplerOps].map((op, i) => {
 | 
					                return [...samplerOps, ...nonSamplerOps].map((op, i) => {
 | 
				
			||||||
                    return samples[i].map((output, j) => ({
 | 
					                    return samples[i].map((output, j) => ({
 | 
				
			||||||
                        source: op.source,
 | 
					                        source: op.source,
 | 
				
			||||||
                        output,
 | 
					                        output: output.amount,
 | 
				
			||||||
                        input: makerFillAmounts[j],
 | 
					                        input: makerFillAmounts[j],
 | 
				
			||||||
                        fillData: op.fillData,
 | 
					                        fillData: output.fillData,
 | 
				
			||||||
                    }));
 | 
					                    }));
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,6 +38,7 @@ export enum ERC20BridgeSource {
 | 
				
			|||||||
    LiquidityProvider = 'LiquidityProvider',
 | 
					    LiquidityProvider = 'LiquidityProvider',
 | 
				
			||||||
    MultiBridge = 'MultiBridge',
 | 
					    MultiBridge = 'MultiBridge',
 | 
				
			||||||
    Balancer = 'Balancer',
 | 
					    Balancer = 'Balancer',
 | 
				
			||||||
 | 
					    Bancor = 'Bancor',
 | 
				
			||||||
    MStable = 'mStable',
 | 
					    MStable = 'mStable',
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -96,6 +97,15 @@ export interface LiquidityProviderFillData extends FillData {
 | 
				
			|||||||
export interface MultiBridgeFillData extends FillData {
 | 
					export interface MultiBridgeFillData extends FillData {
 | 
				
			||||||
    poolAddress: string;
 | 
					    poolAddress: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					export interface BancorFillData extends FillData {
 | 
				
			||||||
 | 
					    path: string[];
 | 
				
			||||||
 | 
					    networkAddress: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface Quote<TFillData = FillData> {
 | 
				
			||||||
 | 
					    amount: BigNumber;
 | 
				
			||||||
 | 
					    fillData?: TFillData;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Represents an individual DEX sample from the sampler contract.
 | 
					 * Represents an individual DEX sample from the sampler contract.
 | 
				
			||||||
@@ -266,9 +276,9 @@ export interface BatchedOperation<TResult> {
 | 
				
			|||||||
    handleCallResultsAsync(contract: ERC20BridgeSamplerContract, callResults: string): Promise<TResult>;
 | 
					    handleCallResultsAsync(contract: ERC20BridgeSamplerContract, callResults: string): Promise<TResult>;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface SourceQuoteOperation<TFillData extends FillData = FillData> extends BatchedOperation<BigNumber[]> {
 | 
					export interface SourceQuoteOperation<TFillData extends FillData = FillData>
 | 
				
			||||||
 | 
					    extends BatchedOperation<Array<Quote<TFillData>>> {
 | 
				
			||||||
    source: ERC20BridgeSource;
 | 
					    source: ERC20BridgeSource;
 | 
				
			||||||
    fillData?: TFillData;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface OptimizedOrdersAndQuoteReport {
 | 
					export interface OptimizedOrdersAndQuoteReport {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										61
									
								
								packages/asset-swapper/test/bancor_service_test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								packages/asset-swapper/test/bancor_service_test.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					import { web3Factory, Web3ProviderEngine } from '@0x/dev-utils';
 | 
				
			||||||
 | 
					import * as chai from 'chai';
 | 
				
			||||||
 | 
					import * as _ from 'lodash';
 | 
				
			||||||
 | 
					import 'mocha';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { BancorFillData, BigNumber } from '../src';
 | 
				
			||||||
 | 
					import { BancorService, token } from '../src/utils/market_operation_utils/bancor_service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { chaiSetup } from './utils/chai_setup';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					chaiSetup.configure();
 | 
				
			||||||
 | 
					const expect = chai.expect;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ADDRESS_REGEX = /^(0x)?[0-9a-f]{40}$/i;
 | 
				
			||||||
 | 
					const RPC_URL = `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const provider: Web3ProviderEngine = web3Factory.getRpcProvider({ rpcUrl: RPC_URL });
 | 
				
			||||||
 | 
					// tslint:disable:custom-no-magic-numbers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// These tests test the bancor SDK against mainnet
 | 
				
			||||||
 | 
					// TODO (xianny): After we move asset-swapper out of the monorepo, we should add an env variable to circle CI to run this test
 | 
				
			||||||
 | 
					describe.skip('Bancor Service', () => {
 | 
				
			||||||
 | 
					    const bancorService = new BancorService(provider);
 | 
				
			||||||
 | 
					    const eth = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
 | 
				
			||||||
 | 
					    const bnt = '0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c';
 | 
				
			||||||
 | 
					    it('should retrieve the bancor network address', async () => {
 | 
				
			||||||
 | 
					        const networkAddress = await bancorService.getBancorNetworkAddressAsync();
 | 
				
			||||||
 | 
					        expect(networkAddress).to.match(ADDRESS_REGEX);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('should retrieve a quote', async () => {
 | 
				
			||||||
 | 
					        const amt = new BigNumber(2);
 | 
				
			||||||
 | 
					        const quote = await bancorService.getQuoteAsync(eth, bnt, amt);
 | 
				
			||||||
 | 
					        const fillData = quote.fillData as BancorFillData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // get rate from the bancor sdk
 | 
				
			||||||
 | 
					        const sdk = await bancorService.getSDKAsync();
 | 
				
			||||||
 | 
					        const expectedAmt = await sdk.pricing.getRateByPath(fillData.path.map(s => token(s)), amt.toString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        expect(fillData.networkAddress).to.match(ADDRESS_REGEX);
 | 
				
			||||||
 | 
					        expect(fillData.path).to.be.an.instanceOf(Array);
 | 
				
			||||||
 | 
					        expect(fillData.path).to.have.lengthOf(3);
 | 
				
			||||||
 | 
					        expect(quote.amount.dp(0)).to.bignumber.eq(
 | 
				
			||||||
 | 
					            new BigNumber(expectedAmt).multipliedBy(bancorService.minReturnAmountBufferPercentage).dp(0),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    // HACK (xianny): for exploring SDK results
 | 
				
			||||||
 | 
					    it('should retrieve multiple quotes', async () => {
 | 
				
			||||||
 | 
					        const amts = [1, 10, 100, 1000].map(a => new BigNumber(a).multipliedBy(10e18));
 | 
				
			||||||
 | 
					        const quotes = await Promise.all(amts.map(async amount => bancorService.getQuoteAsync(eth, bnt, amount)));
 | 
				
			||||||
 | 
					        quotes.map((q, i) => {
 | 
				
			||||||
 | 
					            // tslint:disable:no-console
 | 
				
			||||||
 | 
					            const fillData = q.fillData as BancorFillData;
 | 
				
			||||||
 | 
					            console.log(
 | 
				
			||||||
 | 
					                `Input ${amts[i].toExponential()}; Output: ${q.amount}; Path: ${
 | 
				
			||||||
 | 
					                    fillData.path.length
 | 
				
			||||||
 | 
					                }\nPath: ${JSON.stringify(fillData.path)}`,
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            // tslint:enable:no-console
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@@ -21,7 +21,9 @@ import { DexOrderSampler, getSampleAmounts } from '../src/utils/market_operation
 | 
				
			|||||||
import { ERC20BridgeSource, FillData } from '../src/utils/market_operation_utils/types';
 | 
					import { ERC20BridgeSource, FillData } from '../src/utils/market_operation_utils/types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { MockBalancerPoolsCache } from './utils/mock_balancer_pools_cache';
 | 
					import { MockBalancerPoolsCache } from './utils/mock_balancer_pools_cache';
 | 
				
			||||||
 | 
					import { MockBancorService } from './utils/mock_bancor_service';
 | 
				
			||||||
import { MockSamplerContract } from './utils/mock_sampler_contract';
 | 
					import { MockSamplerContract } from './utils/mock_sampler_contract';
 | 
				
			||||||
 | 
					import { provider } from './utils/web3_wrapper';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const CHAIN_ID = 1;
 | 
					const CHAIN_ID = 1;
 | 
				
			||||||
// tslint:disable: custom-no-magic-numbers
 | 
					// tslint:disable: custom-no-magic-numbers
 | 
				
			||||||
@@ -148,7 +150,7 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
                    expectedTakerFillAmounts,
 | 
					                    expectedTakerFillAmounts,
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            expect(fillableAmounts).to.deep.eq(expectedMakerFillAmounts);
 | 
					            expect(fillableAmounts.map(q => q.amount)).to.deep.eq(expectedMakerFillAmounts);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        it('getLiquidityProviderSellQuotes()', async () => {
 | 
					        it('getLiquidityProviderSellQuotes()', async () => {
 | 
				
			||||||
@@ -288,7 +290,7 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
                    expectedTakerFillAmounts,
 | 
					                    expectedTakerFillAmounts,
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            expect(fillableAmounts).to.deep.eq(expectedMakerFillAmounts);
 | 
					            expect(fillableAmounts.map(q => q.amount)).to.deep.eq(expectedMakerFillAmounts);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        it('getUniswapSellQuotes()', async () => {
 | 
					        it('getUniswapSellQuotes()', async () => {
 | 
				
			||||||
@@ -312,7 +314,7 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
                    expectedTakerFillAmounts,
 | 
					                    expectedTakerFillAmounts,
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            expect(fillableAmounts).to.deep.eq(expectedMakerFillAmounts);
 | 
					            expect(fillableAmounts.map(q => q.amount)).to.deep.eq(expectedMakerFillAmounts);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        it('getUniswapV2SellQuotes()', async () => {
 | 
					        it('getUniswapV2SellQuotes()', async () => {
 | 
				
			||||||
@@ -334,7 +336,7 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
                    expectedTakerFillAmounts,
 | 
					                    expectedTakerFillAmounts,
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            expect(fillableAmounts).to.deep.eq(expectedMakerFillAmounts);
 | 
					            expect(fillableAmounts.map(q => q.amount)).to.deep.eq(expectedMakerFillAmounts);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        it('getEth2DaiBuyQuotes()', async () => {
 | 
					        it('getEth2DaiBuyQuotes()', async () => {
 | 
				
			||||||
@@ -358,7 +360,7 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
                    expectedMakerFillAmounts,
 | 
					                    expectedMakerFillAmounts,
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            expect(fillableAmounts).to.deep.eq(expectedTakerFillAmounts);
 | 
					            expect(fillableAmounts.map(q => q.amount)).to.deep.eq(expectedTakerFillAmounts);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        it('getUniswapBuyQuotes()', async () => {
 | 
					        it('getUniswapBuyQuotes()', async () => {
 | 
				
			||||||
@@ -382,7 +384,7 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
                    expectedMakerFillAmounts,
 | 
					                    expectedMakerFillAmounts,
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            expect(fillableAmounts).to.deep.eq(expectedTakerFillAmounts);
 | 
					            expect(fillableAmounts.map(q => q.amount)).to.deep.eq(expectedTakerFillAmounts);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        interface RatesBySource {
 | 
					        interface RatesBySource {
 | 
				
			||||||
@@ -484,7 +486,12 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
                    return Promise.resolve(pools);
 | 
					                    return Promise.resolve(pools);
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            const dexOrderSampler = new DexOrderSampler(new MockSamplerContract({}), undefined, balancerPoolsCache);
 | 
					            const dexOrderSampler = new DexOrderSampler(
 | 
				
			||||||
 | 
					                new MockSamplerContract({}),
 | 
				
			||||||
 | 
					                undefined, // sampler overrides
 | 
				
			||||||
 | 
					                undefined, // bancor service
 | 
				
			||||||
 | 
					                balancerPoolsCache,
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
            const [quotes] = await dexOrderSampler.executeAsync(
 | 
					            const [quotes] = await dexOrderSampler.executeAsync(
 | 
				
			||||||
                await DexOrderSampler.ops.getSellQuotesAsync(
 | 
					                await DexOrderSampler.ops.getSellQuotesAsync(
 | 
				
			||||||
                    [ERC20BridgeSource.Balancer],
 | 
					                    [ERC20BridgeSource.Balancer],
 | 
				
			||||||
@@ -506,7 +513,52 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
            expect(quotes).to.have.lengthOf(2); // one array per pool
 | 
					            expect(quotes).to.have.lengthOf(2); // one array per pool
 | 
				
			||||||
            expect(quotes).to.deep.eq(expectedQuotes);
 | 
					            expect(quotes).to.deep.eq(expectedQuotes);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					        it('getSellQuotes() uses samples from Bancor', async () => {
 | 
				
			||||||
 | 
					            const expectedTakerToken = randomAddress();
 | 
				
			||||||
 | 
					            const expectedMakerToken = randomAddress();
 | 
				
			||||||
 | 
					            const networkAddress = randomAddress();
 | 
				
			||||||
 | 
					            const expectedTakerFillAmounts = getSampleAmounts(new BigNumber(100e18), 3);
 | 
				
			||||||
 | 
					            const rate = getRandomFloat(0, 100);
 | 
				
			||||||
 | 
					            const bancorService = new MockBancorService(provider, {
 | 
				
			||||||
 | 
					                getQuoteAsync: async (fromToken: string, toToken: string, amount: BigNumber) => {
 | 
				
			||||||
 | 
					                    expect(fromToken).equal(expectedTakerToken);
 | 
				
			||||||
 | 
					                    expect(toToken).equal(expectedMakerToken);
 | 
				
			||||||
 | 
					                    return Promise.resolve({
 | 
				
			||||||
 | 
					                        fillData: { path: [fromToken, toToken], networkAddress },
 | 
				
			||||||
 | 
					                        amount: amount.multipliedBy(rate),
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            const dexOrderSampler = new DexOrderSampler(
 | 
				
			||||||
 | 
					                new MockSamplerContract({}),
 | 
				
			||||||
 | 
					                undefined, // sampler overrides
 | 
				
			||||||
 | 
					                bancorService,
 | 
				
			||||||
 | 
					                undefined, // balancer cache
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            const [quotes] = await dexOrderSampler.executeAsync(
 | 
				
			||||||
 | 
					                await DexOrderSampler.ops.getSellQuotesAsync(
 | 
				
			||||||
 | 
					                    [ERC20BridgeSource.Bancor],
 | 
				
			||||||
 | 
					                    expectedMakerToken,
 | 
				
			||||||
 | 
					                    expectedTakerToken,
 | 
				
			||||||
 | 
					                    expectedTakerFillAmounts,
 | 
				
			||||||
 | 
					                    wethAddress,
 | 
				
			||||||
 | 
					                    undefined, // balancer pools cache
 | 
				
			||||||
 | 
					                    undefined, // liquidity provider registry address
 | 
				
			||||||
 | 
					                    undefined, // multibridge address
 | 
				
			||||||
 | 
					                    bancorService,
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            const expectedQuotes = [
 | 
				
			||||||
 | 
					                expectedTakerFillAmounts.map(a => ({
 | 
				
			||||||
 | 
					                    source: ERC20BridgeSource.Bancor,
 | 
				
			||||||
 | 
					                    input: a,
 | 
				
			||||||
 | 
					                    output: a.multipliedBy(rate),
 | 
				
			||||||
 | 
					                    fillData: { path: [expectedTakerToken, expectedMakerToken], networkAddress },
 | 
				
			||||||
 | 
					                })),
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
 | 
					            expect(quotes).to.have.lengthOf(1); //  one set per pool
 | 
				
			||||||
 | 
					            expect(quotes).to.deep.eq(expectedQuotes);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
        it('getBuyQuotes()', async () => {
 | 
					        it('getBuyQuotes()', async () => {
 | 
				
			||||||
            const expectedTakerToken = randomAddress();
 | 
					            const expectedTakerToken = randomAddress();
 | 
				
			||||||
            const expectedMakerToken = randomAddress();
 | 
					            const expectedMakerToken = randomAddress();
 | 
				
			||||||
@@ -590,7 +642,12 @@ describe('DexSampler tests', () => {
 | 
				
			|||||||
                    return Promise.resolve(pools);
 | 
					                    return Promise.resolve(pools);
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            const dexOrderSampler = new DexOrderSampler(new MockSamplerContract({}), undefined, balancerPoolsCache);
 | 
					            const dexOrderSampler = new DexOrderSampler(
 | 
				
			||||||
 | 
					                new MockSamplerContract({}),
 | 
				
			||||||
 | 
					                undefined, // sampler overrides
 | 
				
			||||||
 | 
					                undefined, // bancor service
 | 
				
			||||||
 | 
					                balancerPoolsCache,
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
            const [quotes] = await dexOrderSampler.executeAsync(
 | 
					            const [quotes] = await dexOrderSampler.executeAsync(
 | 
				
			||||||
                await DexOrderSampler.ops.getBuyQuotesAsync(
 | 
					                await DexOrderSampler.ops.getBuyQuotesAsync(
 | 
				
			||||||
                    [ERC20BridgeSource.Balancer],
 | 
					                    [ERC20BridgeSource.Balancer],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -288,6 +288,7 @@ describe('MarketOperationUtils tests', () => {
 | 
				
			|||||||
        [ERC20BridgeSource.Uniswap]: createDecreasingRates(NUM_SAMPLES),
 | 
					        [ERC20BridgeSource.Uniswap]: createDecreasingRates(NUM_SAMPLES),
 | 
				
			||||||
        [ERC20BridgeSource.UniswapV2]: _.times(NUM_SAMPLES, () => 0),
 | 
					        [ERC20BridgeSource.UniswapV2]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
        [ERC20BridgeSource.Balancer]: _.times(NUM_SAMPLES, () => 0),
 | 
					        [ERC20BridgeSource.Balancer]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
 | 
					        [ERC20BridgeSource.Bancor]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
        [ERC20BridgeSource.Curve]: _.times(NUM_SAMPLES, () => 0),
 | 
					        [ERC20BridgeSource.Curve]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
        [ERC20BridgeSource.LiquidityProvider]: _.times(NUM_SAMPLES, () => 0),
 | 
					        [ERC20BridgeSource.LiquidityProvider]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
        [ERC20BridgeSource.MultiBridge]: _.times(NUM_SAMPLES, () => 0),
 | 
					        [ERC20BridgeSource.MultiBridge]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
@@ -301,6 +302,7 @@ describe('MarketOperationUtils tests', () => {
 | 
				
			|||||||
    const DEFAULT_FILL_DATA: FillDataBySource = {
 | 
					    const DEFAULT_FILL_DATA: FillDataBySource = {
 | 
				
			||||||
        [ERC20BridgeSource.UniswapV2]: { tokenAddressPath: [] },
 | 
					        [ERC20BridgeSource.UniswapV2]: { tokenAddressPath: [] },
 | 
				
			||||||
        [ERC20BridgeSource.Balancer]: { poolAddress: randomAddress() },
 | 
					        [ERC20BridgeSource.Balancer]: { poolAddress: randomAddress() },
 | 
				
			||||||
 | 
					        [ERC20BridgeSource.Bancor]: { path: [], networkAddress: randomAddress() },
 | 
				
			||||||
        [ERC20BridgeSource.Curve]: {
 | 
					        [ERC20BridgeSource.Curve]: {
 | 
				
			||||||
            curve: {
 | 
					            curve: {
 | 
				
			||||||
                poolAddress: randomAddress(),
 | 
					                poolAddress: randomAddress(),
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								packages/asset-swapper/test/utils/mock_bancor_service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								packages/asset-swapper/test/utils/mock_bancor_service.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					import { BigNumber } from '@0x/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { SupportedProvider } from '../../src';
 | 
				
			||||||
 | 
					import { BancorService } from '../../src/utils/market_operation_utils/bancor_service';
 | 
				
			||||||
 | 
					import { BancorFillData, Quote } from '../../src/utils/market_operation_utils/types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface Handlers {
 | 
				
			||||||
 | 
					    getQuoteAsync: (fromToken: string, toToken: string, amount: BigNumber) => Promise<Quote<BancorFillData>>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class MockBancorService extends BancorService {
 | 
				
			||||||
 | 
					    // Bancor recommends setting this value to 2% under the expected return amount
 | 
				
			||||||
 | 
					    public minReturnAmountBufferPercentage = 0.98;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(provider: SupportedProvider, public handlers: Partial<Handlers>) {
 | 
				
			||||||
 | 
					        super(provider);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async getQuoteAsync(fromToken: string, toToken: string, amount: BigNumber): Promise<Quote<BancorFillData>> {
 | 
				
			||||||
 | 
					        return this.handlers.getQuoteAsync
 | 
				
			||||||
 | 
					            ? this.handlers.getQuoteAsync(fromToken, toToken, amount)
 | 
				
			||||||
 | 
					            : super.getQuoteAsync(fromToken, toToken, amount);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -18,6 +18,10 @@
 | 
				
			|||||||
                "note": "Redeploy previously unverified contracts on testnets",
 | 
					                "note": "Redeploy previously unverified contracts on testnets",
 | 
				
			||||||
                "pr": 2656
 | 
					                "pr": 2656
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "note": "Deploy `BancorBridge` on Mainnet",
 | 
				
			||||||
 | 
					                "pr": 2650
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                "note": "Deploy FQT",
 | 
					                "note": "Deploy FQT",
 | 
				
			||||||
                "pr": 2667
 | 
					                "pr": 2667
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@
 | 
				
			|||||||
        "dexForwarderBridge": "0xc47b7094f378e54347e281aab170e8cca69d880a",
 | 
					        "dexForwarderBridge": "0xc47b7094f378e54347e281aab170e8cca69d880a",
 | 
				
			||||||
        "multiBridge": "0xc03117a8c9bde203f70aa911cb64a7a0df5ba1e1",
 | 
					        "multiBridge": "0xc03117a8c9bde203f70aa911cb64a7a0df5ba1e1",
 | 
				
			||||||
        "balancerBridge": "0xfe01821ca163844203220cd08e4f2b2fb43ae4e4",
 | 
					        "balancerBridge": "0xfe01821ca163844203220cd08e4f2b2fb43ae4e4",
 | 
				
			||||||
 | 
					        "bancorBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e",
 | 
					        "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e",
 | 
				
			||||||
        "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
 | 
					        "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
 | 
				
			||||||
        "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb",
 | 
					        "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb",
 | 
				
			||||||
@@ -82,6 +83,7 @@
 | 
				
			|||||||
        "dexForwarderBridge": "0x3261ea1411a1a840aed708896f779e1b837c917e",
 | 
					        "dexForwarderBridge": "0x3261ea1411a1a840aed708896f779e1b837c917e",
 | 
				
			||||||
        "multiBridge": "0x0000000000000000000000000000000000000000",
 | 
					        "multiBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "balancerBridge": "0x47697b44bd89051e93b4d5857ba8e024800a74ac",
 | 
					        "balancerBridge": "0x47697b44bd89051e93b4d5857ba8e024800a74ac",
 | 
				
			||||||
 | 
					        "bancorBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e",
 | 
					        "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e",
 | 
				
			||||||
        "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
 | 
					        "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
 | 
				
			||||||
        "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb",
 | 
					        "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb",
 | 
				
			||||||
@@ -130,6 +132,7 @@
 | 
				
			|||||||
        "dexForwarderBridge": "0x0000000000000000000000000000000000000000",
 | 
					        "dexForwarderBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "multiBridge": "0x0000000000000000000000000000000000000000",
 | 
					        "multiBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "balancerBridge": "0x5d8c9ba74607d2cbc4176882a42d4ace891c1c00",
 | 
					        "balancerBridge": "0x5d8c9ba74607d2cbc4176882a42d4ace891c1c00",
 | 
				
			||||||
 | 
					        "bancorBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e",
 | 
					        "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e",
 | 
				
			||||||
        "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
 | 
					        "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
 | 
				
			||||||
        "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb",
 | 
					        "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb",
 | 
				
			||||||
@@ -178,6 +181,7 @@
 | 
				
			|||||||
        "dexForwarderBridge": "0x985d1a95c6a86a3bf85c4d425af984abceaf01de",
 | 
					        "dexForwarderBridge": "0x985d1a95c6a86a3bf85c4d425af984abceaf01de",
 | 
				
			||||||
        "multiBridge": "0x0000000000000000000000000000000000000000",
 | 
					        "multiBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "balancerBridge": "0x407b4128e9ecad8769b2332312a9f655cb9f5f3a",
 | 
					        "balancerBridge": "0x407b4128e9ecad8769b2332312a9f655cb9f5f3a",
 | 
				
			||||||
 | 
					        "bancorBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e",
 | 
					        "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e",
 | 
				
			||||||
        "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
 | 
					        "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
 | 
				
			||||||
        "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb",
 | 
					        "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb",
 | 
				
			||||||
@@ -226,6 +230,7 @@
 | 
				
			|||||||
        "dexForwarderBridge": "0x0000000000000000000000000000000000000000",
 | 
					        "dexForwarderBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "multiBridge": "0x0000000000000000000000000000000000000000",
 | 
					        "multiBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "balancerBridge": "0x0000000000000000000000000000000000000000",
 | 
					        "balancerBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
 | 
					        "bancorBridge": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "exchangeProxyGovernor": "0x0000000000000000000000000000000000000000",
 | 
					        "exchangeProxyGovernor": "0x0000000000000000000000000000000000000000",
 | 
				
			||||||
        "exchangeProxy": "0x5315e44798395d4a952530d131249fe00f554565",
 | 
					        "exchangeProxy": "0x5315e44798395d4a952530d131249fe00f554565",
 | 
				
			||||||
        "exchangeProxyAllowanceTarget": "0x8362c3ebd90041b30ec45908332e592721642637",
 | 
					        "exchangeProxyAllowanceTarget": "0x8362c3ebd90041b30ec45908332e592721642637",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,7 @@ export interface ContractAddresses {
 | 
				
			|||||||
    dexForwarderBridge: string;
 | 
					    dexForwarderBridge: string;
 | 
				
			||||||
    multiBridge: string;
 | 
					    multiBridge: string;
 | 
				
			||||||
    balancerBridge: string;
 | 
					    balancerBridge: string;
 | 
				
			||||||
 | 
					    bancorBridge: string;
 | 
				
			||||||
    exchangeProxyGovernor: string;
 | 
					    exchangeProxyGovernor: string;
 | 
				
			||||||
    exchangeProxy: string;
 | 
					    exchangeProxy: string;
 | 
				
			||||||
    exchangeProxyAllowanceTarget: string;
 | 
					    exchangeProxyAllowanceTarget: string;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,10 @@
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                "note": "Refactor `migration.ts` a little",
 | 
					                "note": "Refactor `migration.ts` a little",
 | 
				
			||||||
                "pr": 2656
 | 
					                "pr": 2656
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "note": "Add bancorBridge to addresses",
 | 
				
			||||||
 | 
					                "pr": 2650
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -405,6 +405,7 @@ export async function runMigrationsAsync(
 | 
				
			|||||||
        dexForwarderBridge: NULL_ADDRESS,
 | 
					        dexForwarderBridge: NULL_ADDRESS,
 | 
				
			||||||
        multiBridge: NULL_ADDRESS,
 | 
					        multiBridge: NULL_ADDRESS,
 | 
				
			||||||
        balancerBridge: NULL_ADDRESS,
 | 
					        balancerBridge: NULL_ADDRESS,
 | 
				
			||||||
 | 
					        bancorBridge: NULL_ADDRESS,
 | 
				
			||||||
        exchangeProxyGovernor: NULL_ADDRESS,
 | 
					        exchangeProxyGovernor: NULL_ADDRESS,
 | 
				
			||||||
        mStableBridge: NULL_ADDRESS,
 | 
					        mStableBridge: NULL_ADDRESS,
 | 
				
			||||||
        exchangeProxy: exchangeProxy.address,
 | 
					        exchangeProxy: exchangeProxy.address,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										415
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										415
									
								
								yarn.lock
									
									
									
									
									
								
							@@ -751,7 +751,6 @@
 | 
				
			|||||||
"@0x/quote-server@^2.0.2":
 | 
					"@0x/quote-server@^2.0.2":
 | 
				
			||||||
  version "2.0.2"
 | 
					  version "2.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/quote-server/-/quote-server-2.0.2.tgz#60d0665c1cad378c9abb89b5491bdc55b4c8412c"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/quote-server/-/quote-server-2.0.2.tgz#60d0665c1cad378c9abb89b5491bdc55b4c8412c"
 | 
				
			||||||
  integrity sha512-ScK8lHj2AN0RaEjSYplnxsABGy30j6bATG3GjmGMWOx5Bmj2X6UGHpD2ZJ0UH+oJqyDHyZ31vgpMbCSlBLFlzQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/json-schemas" "^5.0.7"
 | 
					    "@0x/json-schemas" "^5.0.7"
 | 
				
			||||||
    "@0x/order-utils" "^10.2.4"
 | 
					    "@0x/order-utils" "^10.2.4"
 | 
				
			||||||
@@ -1003,6 +1002,12 @@
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    regenerator-runtime "^0.12.0"
 | 
					    regenerator-runtime "^0.12.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@babel/runtime@7.6.0":
 | 
				
			||||||
 | 
					  version "7.6.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    regenerator-runtime "^0.13.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@babel/runtime@^7.1.5", "@babel/runtime@^7.3.1":
 | 
					"@babel/runtime@^7.1.5", "@babel/runtime@^7.3.1":
 | 
				
			||||||
  version "7.5.5"
 | 
					  version "7.5.5"
 | 
				
			||||||
  resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
 | 
					  resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
 | 
				
			||||||
@@ -1050,13 +1055,23 @@
 | 
				
			|||||||
"@balancer-labs/sor@0.3.2":
 | 
					"@balancer-labs/sor@0.3.2":
 | 
				
			||||||
  version "0.3.2"
 | 
					  version "0.3.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@balancer-labs/sor/-/sor-0.3.2.tgz#b05c63a07031c2ea13ed0d2670f5105cfaa40523"
 | 
					  resolved "https://registry.yarnpkg.com/@balancer-labs/sor/-/sor-0.3.2.tgz#b05c63a07031c2ea13ed0d2670f5105cfaa40523"
 | 
				
			||||||
  integrity sha512-wmYmTm/zhnRPd/OaqzJJGo9mRIp4PvNNS/AG0EVWJmLmZvYkm2sl6/dBL3KC88rub9duVQr2M8BHCosseFuGLw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    bignumber.js "^9.0.0"
 | 
					    bignumber.js "^9.0.0"
 | 
				
			||||||
    ethers "^4.0.39"
 | 
					    ethers "^4.0.39"
 | 
				
			||||||
    isomorphic-fetch "^2.2.1"
 | 
					    isomorphic-fetch "^2.2.1"
 | 
				
			||||||
    typescript "^3.8.3"
 | 
					    typescript "^3.8.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@bancor/sdk@^0.2.5":
 | 
				
			||||||
 | 
					  version "0.2.5"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@bancor/sdk/-/sdk-0.2.5.tgz#dda2d6a91bc130684d83e5d395c00677cd0fdd71"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@types/text-encoding" "0.0.35"
 | 
				
			||||||
 | 
					    decimal.js "^10.2.0"
 | 
				
			||||||
 | 
					    eosjs "^20.0.3"
 | 
				
			||||||
 | 
					    node-fetch "^2.6.0"
 | 
				
			||||||
 | 
					    web3 "1.2.1"
 | 
				
			||||||
 | 
					    web3-typescript-typings "^0.10.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@cnakazawa/watch@^1.0.3":
 | 
					"@cnakazawa/watch@^1.0.3":
 | 
				
			||||||
  version "1.0.3"
 | 
					  version "1.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
 | 
					  resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
 | 
				
			||||||
@@ -1997,7 +2012,6 @@
 | 
				
			|||||||
"@types/bignumber.js@^5.0.0":
 | 
					"@types/bignumber.js@^5.0.0":
 | 
				
			||||||
  version "5.0.0"
 | 
					  version "5.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/bignumber.js/-/bignumber.js-5.0.0.tgz#d9f1a378509f3010a3255e9cc822ad0eeb4ab969"
 | 
					  resolved "https://registry.yarnpkg.com/@types/bignumber.js/-/bignumber.js-5.0.0.tgz#d9f1a378509f3010a3255e9cc822ad0eeb4ab969"
 | 
				
			||||||
  integrity sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    bignumber.js "*"
 | 
					    bignumber.js "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2022,7 +2036,6 @@
 | 
				
			|||||||
"@types/body-parser@*":
 | 
					"@types/body-parser@*":
 | 
				
			||||||
  version "1.19.0"
 | 
					  version "1.19.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
 | 
					  resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
 | 
				
			||||||
  integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/connect" "*"
 | 
					    "@types/connect" "*"
 | 
				
			||||||
    "@types/node" "*"
 | 
					    "@types/node" "*"
 | 
				
			||||||
@@ -2034,7 +2047,6 @@
 | 
				
			|||||||
"@types/connect@*":
 | 
					"@types/connect@*":
 | 
				
			||||||
  version "3.4.33"
 | 
					  version "3.4.33"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546"
 | 
					  resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546"
 | 
				
			||||||
  integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/node" "*"
 | 
					    "@types/node" "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2079,7 +2091,6 @@
 | 
				
			|||||||
"@types/express-serve-static-core@*":
 | 
					"@types/express-serve-static-core@*":
 | 
				
			||||||
  version "4.17.7"
 | 
					  version "4.17.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz#dfe61f870eb549dc6d7e12050901847c7d7e915b"
 | 
					  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz#dfe61f870eb549dc6d7e12050901847c7d7e915b"
 | 
				
			||||||
  integrity sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/node" "*"
 | 
					    "@types/node" "*"
 | 
				
			||||||
    "@types/qs" "*"
 | 
					    "@types/qs" "*"
 | 
				
			||||||
@@ -2088,7 +2099,6 @@
 | 
				
			|||||||
"@types/express@^4.17.3":
 | 
					"@types/express@^4.17.3":
 | 
				
			||||||
  version "4.17.6"
 | 
					  version "4.17.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e"
 | 
					  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e"
 | 
				
			||||||
  integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/body-parser" "*"
 | 
					    "@types/body-parser" "*"
 | 
				
			||||||
    "@types/express-serve-static-core" "*"
 | 
					    "@types/express-serve-static-core" "*"
 | 
				
			||||||
@@ -2187,7 +2197,6 @@
 | 
				
			|||||||
"@types/mime@*":
 | 
					"@types/mime@*":
 | 
				
			||||||
  version "2.0.2"
 | 
					  version "2.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.2.tgz#857a118d8634c84bba7ae14088e4508490cd5da5"
 | 
					  resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.2.tgz#857a118d8634c84bba7ae14088e4508490cd5da5"
 | 
				
			||||||
  integrity sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@types/minimatch@*", "@types/minimatch@3.0.3", "@types/minimatch@^3.0.3":
 | 
					"@types/minimatch@*", "@types/minimatch@3.0.3", "@types/minimatch@^3.0.3":
 | 
				
			||||||
  version "3.0.3"
 | 
					  version "3.0.3"
 | 
				
			||||||
@@ -2238,7 +2247,6 @@
 | 
				
			|||||||
"@types/qs@*":
 | 
					"@types/qs@*":
 | 
				
			||||||
  version "6.9.3"
 | 
					  version "6.9.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03"
 | 
					  resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03"
 | 
				
			||||||
  integrity sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@types/query-string@^5.1.0":
 | 
					"@types/query-string@^5.1.0":
 | 
				
			||||||
  version "5.1.0"
 | 
					  version "5.1.0"
 | 
				
			||||||
@@ -2247,7 +2255,6 @@
 | 
				
			|||||||
"@types/range-parser@*":
 | 
					"@types/range-parser@*":
 | 
				
			||||||
  version "1.2.3"
 | 
					  version "1.2.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
 | 
					  resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
 | 
				
			||||||
  integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@types/react-dom@16.0.6":
 | 
					"@types/react-dom@16.0.6":
 | 
				
			||||||
  version "16.0.6"
 | 
					  version "16.0.6"
 | 
				
			||||||
@@ -2298,7 +2305,6 @@
 | 
				
			|||||||
"@types/serve-static@*":
 | 
					"@types/serve-static@*":
 | 
				
			||||||
  version "1.13.4"
 | 
					  version "1.13.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.4.tgz#6662a93583e5a6cabca1b23592eb91e12fa80e7c"
 | 
					  resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.4.tgz#6662a93583e5a6cabca1b23592eb91e12fa80e7c"
 | 
				
			||||||
  integrity sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/express-serve-static-core" "*"
 | 
					    "@types/express-serve-static-core" "*"
 | 
				
			||||||
    "@types/mime" "*"
 | 
					    "@types/mime" "*"
 | 
				
			||||||
@@ -2323,6 +2329,10 @@
 | 
				
			|||||||
    "@types/react" "*"
 | 
					    "@types/react" "*"
 | 
				
			||||||
    csstype "^2.2.0"
 | 
					    csstype "^2.2.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/text-encoding@0.0.35":
 | 
				
			||||||
 | 
					  version "0.0.35"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@types/text-encoding/-/text-encoding-0.0.35.tgz#6f14474e0b232bc70c59677aadc65dcc5a99c3a9"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@types/tmp@^0.0.33":
 | 
					"@types/tmp@^0.0.33":
 | 
				
			||||||
  version "0.0.33"
 | 
					  version "0.0.33"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d"
 | 
					  resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d"
 | 
				
			||||||
@@ -2375,7 +2385,6 @@
 | 
				
			|||||||
"@web3-js/scrypt-shim@^0.1.0":
 | 
					"@web3-js/scrypt-shim@^0.1.0":
 | 
				
			||||||
  version "0.1.0"
 | 
					  version "0.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz#0bf7529ab6788311d3e07586f7d89107c3bea2cc"
 | 
					  resolved "https://registry.yarnpkg.com/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz#0bf7529ab6788311d3e07586f7d89107c3bea2cc"
 | 
				
			||||||
  integrity sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    scryptsy "^2.1.0"
 | 
					    scryptsy "^2.1.0"
 | 
				
			||||||
    semver "^6.3.0"
 | 
					    semver "^6.3.0"
 | 
				
			||||||
@@ -2383,7 +2392,6 @@
 | 
				
			|||||||
"@web3-js/websocket@^1.0.29":
 | 
					"@web3-js/websocket@^1.0.29":
 | 
				
			||||||
  version "1.0.30"
 | 
					  version "1.0.30"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@web3-js/websocket/-/websocket-1.0.30.tgz#9ea15b7b582cf3bf3e8bc1f4d3d54c0731a87f87"
 | 
					  resolved "https://registry.yarnpkg.com/@web3-js/websocket/-/websocket-1.0.30.tgz#9ea15b7b582cf3bf3e8bc1f4d3d54c0731a87f87"
 | 
				
			||||||
  integrity sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    debug "^2.2.0"
 | 
					    debug "^2.2.0"
 | 
				
			||||||
    es5-ext "^0.10.50"
 | 
					    es5-ext "^0.10.50"
 | 
				
			||||||
@@ -2588,7 +2596,6 @@ accepts@~1.3.4, accepts@~1.3.5:
 | 
				
			|||||||
accepts@~1.3.7:
 | 
					accepts@~1.3.7:
 | 
				
			||||||
  version "1.3.7"
 | 
					  version "1.3.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
 | 
					  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
 | 
				
			||||||
  integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    mime-types "~2.1.24"
 | 
					    mime-types "~2.1.24"
 | 
				
			||||||
    negotiator "0.6.2"
 | 
					    negotiator "0.6.2"
 | 
				
			||||||
@@ -3787,7 +3794,7 @@ babel-register@^6.26.0:
 | 
				
			|||||||
    mkdirp "^0.5.1"
 | 
					    mkdirp "^0.5.1"
 | 
				
			||||||
    source-map-support "^0.4.15"
 | 
					    source-map-support "^0.4.15"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
 | 
					babel-runtime@6.26.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
 | 
				
			||||||
  version "6.26.0"
 | 
					  version "6.26.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
 | 
					  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
@@ -3916,6 +3923,10 @@ big.js@^5.2.2:
 | 
				
			|||||||
  version "5.2.2"
 | 
					  version "5.2.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
 | 
					  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bigi@1.4.2, bigi@^1.1.0:
 | 
				
			||||||
 | 
					  version "1.4.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bignumber.js@*, bignumber.js@^9.0.0, bignumber.js@~9.0.0:
 | 
					bignumber.js@*, bignumber.js@^9.0.0, bignumber.js@~9.0.0:
 | 
				
			||||||
  version "9.0.0"
 | 
					  version "9.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075"
 | 
					  resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075"
 | 
				
			||||||
@@ -4171,6 +4182,16 @@ browser-stdout@1.3.1:
 | 
				
			|||||||
  version "1.3.1"
 | 
					  version "1.3.1"
 | 
				
			||||||
  resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
 | 
					  resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					browserify-aes@1.0.6:
 | 
				
			||||||
 | 
					  version "1.0.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    buffer-xor "^1.0.2"
 | 
				
			||||||
 | 
					    cipher-base "^1.0.0"
 | 
				
			||||||
 | 
					    create-hash "^1.1.0"
 | 
				
			||||||
 | 
					    evp_bytestokey "^1.0.0"
 | 
				
			||||||
 | 
					    inherits "^2.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
 | 
					browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
 | 
				
			||||||
  version "1.2.0"
 | 
					  version "1.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
 | 
					  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
 | 
				
			||||||
@@ -4249,16 +4270,16 @@ bs-logger@0.x:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    fast-json-stable-stringify "^2.0.0"
 | 
					    fast-json-stable-stringify "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bs58@^2.0.1:
 | 
					bs58@4.0.1, bs58@^4.0.0:
 | 
				
			||||||
  version "2.0.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bs58@^4.0.0:
 | 
					 | 
				
			||||||
  version "4.0.1"
 | 
					  version "4.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
 | 
					  resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    base-x "^3.0.2"
 | 
					    base-x "^3.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bs58@^2.0.1:
 | 
				
			||||||
 | 
					  version "2.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bs58check@^2.1.2:
 | 
					bs58check@^2.1.2:
 | 
				
			||||||
  version "2.1.2"
 | 
					  version "2.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
 | 
					  resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
 | 
				
			||||||
@@ -4301,7 +4322,7 @@ buffer-to-arraybuffer@^0.0.5:
 | 
				
			|||||||
  version "0.0.5"
 | 
					  version "0.0.5"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
 | 
					  resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
buffer-xor@^1.0.3:
 | 
					buffer-xor@^1.0.2, buffer-xor@^1.0.3:
 | 
				
			||||||
  version "1.0.3"
 | 
					  version "1.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
 | 
					  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4373,6 +4394,12 @@ byte-size@^5.0.1:
 | 
				
			|||||||
  version "5.0.1"
 | 
					  version "5.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191"
 | 
					  resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bytebuffer@5.0.1:
 | 
				
			||||||
 | 
					  version "5.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    long "~3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bytes@3.0.0, bytes@^3.0.0:
 | 
					bytes@3.0.0, bytes@^3.0.0:
 | 
				
			||||||
  version "3.0.0"
 | 
					  version "3.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
 | 
					  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
 | 
				
			||||||
@@ -5198,7 +5225,6 @@ content-disposition@0.5.2:
 | 
				
			|||||||
content-disposition@0.5.3:
 | 
					content-disposition@0.5.3:
 | 
				
			||||||
  version "0.5.3"
 | 
					  version "0.5.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
 | 
					  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
 | 
				
			||||||
  integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    safe-buffer "5.1.2"
 | 
					    safe-buffer "5.1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -5379,7 +5405,6 @@ cookie@0.3.1:
 | 
				
			|||||||
cookie@0.4.0:
 | 
					cookie@0.4.0:
 | 
				
			||||||
  version "0.4.0"
 | 
					  version "0.4.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
 | 
					  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
 | 
				
			||||||
  integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
cookiejar@^2.1.1:
 | 
					cookiejar@^2.1.1:
 | 
				
			||||||
  version "2.1.2"
 | 
					  version "2.1.2"
 | 
				
			||||||
@@ -5498,6 +5523,15 @@ create-error-class@^3.0.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    capture-stack-trace "^1.0.0"
 | 
					    capture-stack-trace "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					create-hash@1.1.3:
 | 
				
			||||||
 | 
					  version "1.1.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    cipher-base "^1.0.1"
 | 
				
			||||||
 | 
					    inherits "^2.0.1"
 | 
				
			||||||
 | 
					    ripemd160 "^2.0.0"
 | 
				
			||||||
 | 
					    sha.js "^2.4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
 | 
					create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
 | 
				
			||||||
  version "1.2.0"
 | 
					  version "1.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
 | 
					  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
 | 
				
			||||||
@@ -5508,6 +5542,17 @@ create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
 | 
				
			|||||||
    ripemd160 "^2.0.1"
 | 
					    ripemd160 "^2.0.1"
 | 
				
			||||||
    sha.js "^2.4.0"
 | 
					    sha.js "^2.4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					create-hmac@1.1.6:
 | 
				
			||||||
 | 
					  version "1.1.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    cipher-base "^1.0.3"
 | 
				
			||||||
 | 
					    create-hash "^1.1.0"
 | 
				
			||||||
 | 
					    inherits "^2.0.1"
 | 
				
			||||||
 | 
					    ripemd160 "^2.0.0"
 | 
				
			||||||
 | 
					    safe-buffer "^5.0.1"
 | 
				
			||||||
 | 
					    sha.js "^2.4.8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
 | 
					create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
 | 
				
			||||||
  version "1.1.7"
 | 
					  version "1.1.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
 | 
					  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
 | 
				
			||||||
@@ -6264,6 +6309,12 @@ ecc-jsbn@~0.1.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    jsbn "~0.1.0"
 | 
					    jsbn "~0.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ecurve@1.0.5:
 | 
				
			||||||
 | 
					  version "1.0.5"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.5.tgz#d148e8fe50a674f983bb5bae09da0ea23e10535e"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    bigi "^1.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
editor@^1.0.0:
 | 
					editor@^1.0.0:
 | 
				
			||||||
  version "1.0.0"
 | 
					  version "1.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
 | 
					  resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
 | 
				
			||||||
@@ -6296,7 +6347,6 @@ elliptic@6.3.3:
 | 
				
			|||||||
elliptic@6.5.2:
 | 
					elliptic@6.5.2:
 | 
				
			||||||
  version "6.5.2"
 | 
					  version "6.5.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
 | 
					  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
 | 
				
			||||||
  integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    bn.js "^4.4.0"
 | 
					    bn.js "^4.4.0"
 | 
				
			||||||
    brorand "^1.0.1"
 | 
					    brorand "^1.0.1"
 | 
				
			||||||
@@ -6426,6 +6476,28 @@ enzyme@^3.6.0:
 | 
				
			|||||||
    rst-selector-parser "^2.2.3"
 | 
					    rst-selector-parser "^2.2.3"
 | 
				
			||||||
    string.prototype.trim "^1.1.2"
 | 
					    string.prototype.trim "^1.1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					eosjs-ecc@4.0.7:
 | 
				
			||||||
 | 
					  version "4.0.7"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/eosjs-ecc/-/eosjs-ecc-4.0.7.tgz#f5246da3b84839fcc237204768ef6e5ea56cc814"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@babel/runtime" "7.6.0"
 | 
				
			||||||
 | 
					    bigi "1.4.2"
 | 
				
			||||||
 | 
					    browserify-aes "1.0.6"
 | 
				
			||||||
 | 
					    bs58 "4.0.1"
 | 
				
			||||||
 | 
					    bytebuffer "5.0.1"
 | 
				
			||||||
 | 
					    create-hash "1.1.3"
 | 
				
			||||||
 | 
					    create-hmac "1.1.6"
 | 
				
			||||||
 | 
					    ecurve "1.0.5"
 | 
				
			||||||
 | 
					    randombytes "2.0.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					eosjs@^20.0.3:
 | 
				
			||||||
 | 
					  version "20.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/eosjs/-/eosjs-20.0.3.tgz#f3ac1fa119b76dd07bf2825ad27342f6502a533b"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    babel-runtime "6.26.0"
 | 
				
			||||||
 | 
					    eosjs-ecc "4.0.7"
 | 
				
			||||||
 | 
					    text-encoding "0.7.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err-code@^1.0.0:
 | 
					err-code@^1.0.0:
 | 
				
			||||||
  version "1.1.2"
 | 
					  version "1.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
 | 
					  resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
 | 
				
			||||||
@@ -6833,7 +6905,6 @@ ethashjs@~0.0.7:
 | 
				
			|||||||
ethereum-bloom-filters@^1.0.6:
 | 
					ethereum-bloom-filters@^1.0.6:
 | 
				
			||||||
  version "1.0.7"
 | 
					  version "1.0.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz#b7b80735e385dbb7f944ce6b4533e24511306060"
 | 
					  resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz#b7b80735e385dbb7f944ce6b4533e24511306060"
 | 
				
			||||||
  integrity sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    js-sha3 "^0.8.0"
 | 
					    js-sha3 "^0.8.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -6898,7 +6969,6 @@ ethereumjs-account@^2.0.3:
 | 
				
			|||||||
ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.2:
 | 
					ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.2:
 | 
				
			||||||
  version "2.2.2"
 | 
					  version "2.2.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
 | 
					  resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
 | 
				
			||||||
  integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    async "^2.0.1"
 | 
					    async "^2.0.1"
 | 
				
			||||||
    ethereumjs-common "^1.5.0"
 | 
					    ethereumjs-common "^1.5.0"
 | 
				
			||||||
@@ -6944,7 +7014,6 @@ ethereumjs-blockchain@^4.0.1:
 | 
				
			|||||||
ethereumjs-blockchain@^4.0.3:
 | 
					ethereumjs-blockchain@^4.0.3:
 | 
				
			||||||
  version "4.0.3"
 | 
					  version "4.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.3.tgz#e013034633a30ad2006728e8e2b21956b267b773"
 | 
					  resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.3.tgz#e013034633a30ad2006728e8e2b21956b267b773"
 | 
				
			||||||
  integrity sha512-0nJWbyA+Gu0ZKZr/cywMtB/77aS/4lOVsIKbgUN2sFQYscXO5rPbUfrEe7G2Zhjp86/a0VqLllemDSTHvx3vZA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    async "^2.6.1"
 | 
					    async "^2.6.1"
 | 
				
			||||||
    ethashjs "~0.0.7"
 | 
					    ethashjs "~0.0.7"
 | 
				
			||||||
@@ -6980,7 +7049,6 @@ ethereumjs-common@^1.3.0:
 | 
				
			|||||||
ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.2:
 | 
					ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.2:
 | 
				
			||||||
  version "2.1.2"
 | 
					  version "2.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
 | 
					  resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
 | 
				
			||||||
  integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    ethereumjs-common "^1.5.0"
 | 
					    ethereumjs-common "^1.5.0"
 | 
				
			||||||
    ethereumjs-util "^6.0.0"
 | 
					    ethereumjs-util "^6.0.0"
 | 
				
			||||||
@@ -7055,7 +7123,6 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum
 | 
				
			|||||||
ethereumjs-vm@4.1.3:
 | 
					ethereumjs-vm@4.1.3:
 | 
				
			||||||
  version "4.1.3"
 | 
					  version "4.1.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.1.3.tgz#dc8eb45f47d775da9f0b2437d5e20896fdf66f37"
 | 
					  resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.1.3.tgz#dc8eb45f47d775da9f0b2437d5e20896fdf66f37"
 | 
				
			||||||
  integrity sha512-RTrD0y7My4O6Qr1P2ZIsMfD6RzL6kU/RhBZ0a5XrPzAeR61crBS7or66ohDrvxDI/rDBxMi+6SnsELih6fzalw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    async "^2.1.2"
 | 
					    async "^2.1.2"
 | 
				
			||||||
    async-eventemitter "^0.2.2"
 | 
					    async-eventemitter "^0.2.2"
 | 
				
			||||||
@@ -7141,7 +7208,6 @@ ethers@4.0.0-beta.3:
 | 
				
			|||||||
ethers@^4.0.39:
 | 
					ethers@^4.0.39:
 | 
				
			||||||
  version "4.0.47"
 | 
					  version "4.0.47"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.47.tgz#91b9cd80473b1136dd547095ff9171bd1fc68c85"
 | 
					  resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.47.tgz#91b9cd80473b1136dd547095ff9171bd1fc68c85"
 | 
				
			||||||
  integrity sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    aes-js "3.0.0"
 | 
					    aes-js "3.0.0"
 | 
				
			||||||
    bn.js "^4.4.0"
 | 
					    bn.js "^4.4.0"
 | 
				
			||||||
@@ -7455,7 +7521,6 @@ express@^4.16.3:
 | 
				
			|||||||
express@^4.17.1:
 | 
					express@^4.17.1:
 | 
				
			||||||
  version "4.17.1"
 | 
					  version "4.17.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
 | 
					  resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
 | 
				
			||||||
  integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    accepts "~1.3.7"
 | 
					    accepts "~1.3.7"
 | 
				
			||||||
    array-flatten "1.1.1"
 | 
					    array-flatten "1.1.1"
 | 
				
			||||||
@@ -7774,7 +7839,6 @@ finalhandler@1.1.1:
 | 
				
			|||||||
finalhandler@~1.1.2:
 | 
					finalhandler@~1.1.2:
 | 
				
			||||||
  version "1.1.2"
 | 
					  version "1.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
 | 
					  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
 | 
				
			||||||
  integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    debug "2.6.9"
 | 
					    debug "2.6.9"
 | 
				
			||||||
    encodeurl "~1.0.2"
 | 
					    encodeurl "~1.0.2"
 | 
				
			||||||
@@ -8159,7 +8223,6 @@ ganache-cli@6.8.0-istanbul.0:
 | 
				
			|||||||
ganache-core@^2.10.2:
 | 
					ganache-core@^2.10.2:
 | 
				
			||||||
  version "2.10.2"
 | 
					  version "2.10.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.10.2.tgz#17c171c6c0195b6734a0dd741a9d2afd4f74e292"
 | 
					  resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.10.2.tgz#17c171c6c0195b6734a0dd741a9d2afd4f74e292"
 | 
				
			||||||
  integrity sha512-4XEO0VsqQ1+OW7Za5fQs9/Kk7o8M0T1sRfFSF8h9NeJ2ABaqMO5waqxf567ZMcSkRKaTjUucBSz83xNfZv1HDg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    abstract-leveldown "3.0.0"
 | 
					    abstract-leveldown "3.0.0"
 | 
				
			||||||
    async "2.6.2"
 | 
					    async "2.6.2"
 | 
				
			||||||
@@ -9026,7 +9089,6 @@ http-errors@1.7.2:
 | 
				
			|||||||
http-errors@~1.7.2:
 | 
					http-errors@~1.7.2:
 | 
				
			||||||
  version "1.7.3"
 | 
					  version "1.7.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
 | 
					  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
 | 
				
			||||||
  integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    depd "~1.1.2"
 | 
					    depd "~1.1.2"
 | 
				
			||||||
    inherits "2.0.4"
 | 
					    inherits "2.0.4"
 | 
				
			||||||
@@ -9088,7 +9150,6 @@ http-status-codes@^1.3.0, http-status-codes@^1.3.2:
 | 
				
			|||||||
http-status-codes@^1.4.0:
 | 
					http-status-codes@^1.4.0:
 | 
				
			||||||
  version "1.4.0"
 | 
					  version "1.4.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-1.4.0.tgz#6e4c15d16ff3a9e2df03b89f3a55e1aae05fb477"
 | 
					  resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-1.4.0.tgz#6e4c15d16ff3a9e2df03b89f3a55e1aae05fb477"
 | 
				
			||||||
  integrity sha512-JrT3ua+WgH8zBD3HEJYbeEgnuQaAnUeRRko/YojPAJjGmIfGD3KPU/asLdsLwKjfxOmQe5nXMQ0pt/7MyapVbQ==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
https-browserify@^1.0.0:
 | 
					https-browserify@^1.0.0:
 | 
				
			||||||
  version "1.0.0"
 | 
					  version "1.0.0"
 | 
				
			||||||
@@ -9369,7 +9430,6 @@ ipaddr.js@1.8.0:
 | 
				
			|||||||
ipaddr.js@1.9.1:
 | 
					ipaddr.js@1.9.1:
 | 
				
			||||||
  version "1.9.1"
 | 
					  version "1.9.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
 | 
					  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
 | 
				
			||||||
  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ipaddr.js@^1.5.2:
 | 
					ipaddr.js@^1.5.2:
 | 
				
			||||||
  version "1.8.1"
 | 
					  version "1.8.1"
 | 
				
			||||||
@@ -10648,7 +10708,6 @@ js-sha3@^0.7.0:
 | 
				
			|||||||
js-sha3@^0.8.0:
 | 
					js-sha3@^0.8.0:
 | 
				
			||||||
  version "0.8.0"
 | 
					  version "0.8.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
 | 
					  resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
 | 
				
			||||||
  integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
js-tokens@^3.0.0, js-tokens@^3.0.2:
 | 
					js-tokens@^3.0.0, js-tokens@^3.0.2:
 | 
				
			||||||
  version "3.0.2"
 | 
					  version "3.0.2"
 | 
				
			||||||
@@ -11467,6 +11526,10 @@ lolex@^2.2.0, lolex@^2.3.2:
 | 
				
			|||||||
  version "2.3.2"
 | 
					  version "2.3.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.2.tgz#85f9450425103bf9e7a60668ea25dc43274ca807"
 | 
					  resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.2.tgz#85f9450425103bf9e7a60668ea25dc43274ca807"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					long@~3:
 | 
				
			||||||
 | 
					  version "3.2.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
looper@^2.0.0:
 | 
					looper@^2.0.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
 | 
					  resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
 | 
				
			||||||
@@ -12267,7 +12330,6 @@ negotiator@0.6.1:
 | 
				
			|||||||
negotiator@0.6.2:
 | 
					negotiator@0.6.2:
 | 
				
			||||||
  version "0.6.2"
 | 
					  version "0.6.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
 | 
					  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
 | 
				
			||||||
  integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
neo-async@^2.5.0:
 | 
					neo-async@^2.5.0:
 | 
				
			||||||
  version "2.5.1"
 | 
					  version "2.5.1"
 | 
				
			||||||
@@ -12347,7 +12409,7 @@ node-fetch@^1.0.1, node-fetch@^1.3.3, node-fetch@~1.7.1:
 | 
				
			|||||||
    encoding "^0.1.11"
 | 
					    encoding "^0.1.11"
 | 
				
			||||||
    is-stream "^1.0.1"
 | 
					    is-stream "^1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
node-fetch@^2.3.0, node-fetch@^2.5.0:
 | 
					node-fetch@^2.3.0, node-fetch@^2.5.0, node-fetch@^2.6.0:
 | 
				
			||||||
  version "2.6.0"
 | 
					  version "2.6.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
 | 
					  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -13365,7 +13427,6 @@ parseurl@~1.3.2:
 | 
				
			|||||||
parseurl@~1.3.3:
 | 
					parseurl@~1.3.3:
 | 
				
			||||||
  version "1.3.3"
 | 
					  version "1.3.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
 | 
					  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
 | 
				
			||||||
  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pascal-case@^2.0.0:
 | 
					pascal-case@^2.0.0:
 | 
				
			||||||
  version "2.0.1"
 | 
					  version "2.0.1"
 | 
				
			||||||
@@ -13859,7 +13920,6 @@ proxy-addr@~2.0.4:
 | 
				
			|||||||
proxy-addr@~2.0.5:
 | 
					proxy-addr@~2.0.5:
 | 
				
			||||||
  version "2.0.6"
 | 
					  version "2.0.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
 | 
					  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
 | 
				
			||||||
  integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    forwarded "~0.1.2"
 | 
					    forwarded "~0.1.2"
 | 
				
			||||||
    ipaddr.js "1.9.1"
 | 
					    ipaddr.js "1.9.1"
 | 
				
			||||||
@@ -14097,6 +14157,12 @@ randomatic@^1.1.3:
 | 
				
			|||||||
    is-number "^3.0.0"
 | 
					    is-number "^3.0.0"
 | 
				
			||||||
    kind-of "^4.0.0"
 | 
					    kind-of "^4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					randombytes@2.0.5:
 | 
				
			||||||
 | 
					  version "2.0.5"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    safe-buffer "^5.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
 | 
					randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
 | 
				
			||||||
  version "2.0.6"
 | 
					  version "2.0.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
 | 
					  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
 | 
				
			||||||
@@ -14127,7 +14193,6 @@ range-parser@^1.0.3, range-parser@~1.2.0:
 | 
				
			|||||||
range-parser@~1.2.1:
 | 
					range-parser@~1.2.1:
 | 
				
			||||||
  version "1.2.1"
 | 
					  version "1.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
 | 
					  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
 | 
				
			||||||
  integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
raw-body@2.3.2:
 | 
					raw-body@2.3.2:
 | 
				
			||||||
  version "2.3.2"
 | 
					  version "2.3.2"
 | 
				
			||||||
@@ -15047,17 +15112,16 @@ scrypt@^6.0.2:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    nan "^2.0.8"
 | 
					    nan "^2.0.8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					scryptsy@2.1.0, scryptsy@^2.1.0:
 | 
				
			||||||
 | 
					  version "2.1.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
scryptsy@^1.2.1:
 | 
					scryptsy@^1.2.1:
 | 
				
			||||||
  version "1.2.1"
 | 
					  version "1.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
 | 
					  resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    pbkdf2 "^3.0.3"
 | 
					    pbkdf2 "^3.0.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
scryptsy@^2.1.0:
 | 
					 | 
				
			||||||
  version "2.1.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790"
 | 
					 | 
				
			||||||
  integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
secp256k1@^3.0.1:
 | 
					secp256k1@^3.0.1:
 | 
				
			||||||
  version "3.5.0"
 | 
					  version "3.5.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.5.0.tgz#677d3b8a8e04e1a5fa381a1ae437c54207b738d0"
 | 
					  resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.5.0.tgz#677d3b8a8e04e1a5fa381a1ae437c54207b738d0"
 | 
				
			||||||
@@ -15138,6 +15202,10 @@ semver-sort@0.0.4:
 | 
				
			|||||||
  version "5.5.0"
 | 
					  version "5.5.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
 | 
					  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					semver@6.2.0:
 | 
				
			||||||
 | 
					  version "6.2.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
semver@^5.5.1:
 | 
					semver@^5.5.1:
 | 
				
			||||||
  version "5.6.0"
 | 
					  version "5.6.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
 | 
					  resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
 | 
				
			||||||
@@ -15175,7 +15243,6 @@ send@0.16.2:
 | 
				
			|||||||
send@0.17.1:
 | 
					send@0.17.1:
 | 
				
			||||||
  version "0.17.1"
 | 
					  version "0.17.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
 | 
					  resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
 | 
				
			||||||
  integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    debug "2.6.9"
 | 
					    debug "2.6.9"
 | 
				
			||||||
    depd "~1.1.2"
 | 
					    depd "~1.1.2"
 | 
				
			||||||
@@ -15230,7 +15297,6 @@ serve-static@1.13.2:
 | 
				
			|||||||
serve-static@1.14.1:
 | 
					serve-static@1.14.1:
 | 
				
			||||||
  version "1.14.1"
 | 
					  version "1.14.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
 | 
					  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
 | 
				
			||||||
  integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    encodeurl "~1.0.2"
 | 
					    encodeurl "~1.0.2"
 | 
				
			||||||
    escape-html "~1.0.3"
 | 
					    escape-html "~1.0.3"
 | 
				
			||||||
@@ -16349,6 +16415,10 @@ test-exclude@^5.2.3:
 | 
				
			|||||||
    read-pkg-up "^4.0.0"
 | 
					    read-pkg-up "^4.0.0"
 | 
				
			||||||
    require-main-filename "^2.0.0"
 | 
					    require-main-filename "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					text-encoding@0.7.0:
 | 
				
			||||||
 | 
					  version "0.7.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
text-encoding@^0.6.4:
 | 
					text-encoding@^0.6.4:
 | 
				
			||||||
  version "0.6.4"
 | 
					  version "0.6.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19"
 | 
					  resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19"
 | 
				
			||||||
@@ -16843,7 +16913,6 @@ typescript@3.5.x:
 | 
				
			|||||||
typescript@^3.8.3:
 | 
					typescript@^3.8.3:
 | 
				
			||||||
  version "3.9.6"
 | 
					  version "3.9.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"
 | 
					  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"
 | 
				
			||||||
  integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typewise-core@^1.2, typewise-core@^1.2.0:
 | 
					typewise-core@^1.2, typewise-core@^1.2.0:
 | 
				
			||||||
  version "1.2.0"
 | 
					  version "1.2.0"
 | 
				
			||||||
@@ -17362,10 +17431,17 @@ wcwidth@^1.0.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    defaults "^1.0.3"
 | 
					    defaults "^1.0.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-bzz@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.1.tgz#c3bd1e8f0c02a13cd6d4e3c3e9e1713f144f6f0d"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    got "9.6.0"
 | 
				
			||||||
 | 
					    swarm-js "0.1.39"
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-bzz@1.2.4:
 | 
					web3-bzz@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.4.tgz#a4adb7a8cba3d260de649bdb1f14ed359bfb3821"
 | 
					  resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.4.tgz#a4adb7a8cba3d260de649bdb1f14ed359bfb3821"
 | 
				
			||||||
  integrity sha512-MqhAo/+0iQSMBtt3/QI1rU83uvF08sYq8r25+OUZ+4VtihnYsmkkca+rdU0QbRyrXY2/yGIpI46PFdh0khD53A==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/node" "^10.12.18"
 | 
					    "@types/node" "^10.12.18"
 | 
				
			||||||
    got "9.6.0"
 | 
					    got "9.6.0"
 | 
				
			||||||
@@ -17380,10 +17456,17 @@ web3-core-helpers@1.0.0-beta.34:
 | 
				
			|||||||
    web3-eth-iban "1.0.0-beta.34"
 | 
					    web3-eth-iban "1.0.0-beta.34"
 | 
				
			||||||
    web3-utils "1.0.0-beta.34"
 | 
					    web3-utils "1.0.0-beta.34"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-core-helpers@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-eth-iban "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-core-helpers@1.2.4:
 | 
					web3-core-helpers@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz#ffd425861f4d66b3f38df032afdb39ea0971fc0f"
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz#ffd425861f4d66b3f38df032afdb39ea0971fc0f"
 | 
				
			||||||
  integrity sha512-U7wbsK8IbZvF3B7S+QMSNP0tni/6VipnJkB0tZVEpHEIV2WWeBHYmZDnULWcsS/x/jn9yKhJlXIxWGsEAMkjiw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
    web3-eth-iban "1.2.4"
 | 
					    web3-eth-iban "1.2.4"
 | 
				
			||||||
@@ -17399,10 +17482,19 @@ web3-core-helpers@2.0.0-alpha:
 | 
				
			|||||||
    web3-eth-iban "2.0.0-alpha"
 | 
					    web3-eth-iban "2.0.0-alpha"
 | 
				
			||||||
    web3-utils "2.0.0-alpha"
 | 
					    web3-utils "2.0.0-alpha"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-core-method@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-promievent "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-subscriptions "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-core-method@1.2.4:
 | 
					web3-core-method@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.4.tgz#a0fbc50b8ff5fd214021435cc2c6d1e115807aed"
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.4.tgz#a0fbc50b8ff5fd214021435cc2c6d1e115807aed"
 | 
				
			||||||
  integrity sha512-8p9kpL7di2qOVPWgcM08kb+yKom0rxRCMv6m/K+H+yLSxev9TgMbCgMSbPWAHlyiF3SJHw7APFKahK5Z+8XT5A==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
    web3-core-helpers "1.2.4"
 | 
					    web3-core-helpers "1.2.4"
 | 
				
			||||||
@@ -17423,18 +17515,33 @@ web3-core-method@2.0.0-alpha:
 | 
				
			|||||||
    web3-core-subscriptions "2.0.0-alpha"
 | 
					    web3-core-subscriptions "2.0.0-alpha"
 | 
				
			||||||
    web3-utils "2.0.0-alpha"
 | 
					    web3-utils "2.0.0-alpha"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-core-promievent@1.2.4:
 | 
					web3-core-promievent@1.2.1:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz#75e5c0f2940028722cdd21ba503ebd65272df6cb"
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838"
 | 
				
			||||||
  integrity sha512-gEUlm27DewUsfUgC3T8AxkKi8Ecx+e+ZCaunB7X4Qk3i9F4C+5PSMGguolrShZ7Zb6717k79Y86f3A00O0VAZw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    any-promise "1.3.0"
 | 
					    any-promise "1.3.0"
 | 
				
			||||||
    eventemitter3 "3.1.2"
 | 
					    eventemitter3 "3.1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-core-promievent@1.2.4:
 | 
				
			||||||
 | 
					  version "1.2.4"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz#75e5c0f2940028722cdd21ba503ebd65272df6cb"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    any-promise "1.3.0"
 | 
				
			||||||
 | 
					    eventemitter3 "3.1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-core-requestmanager@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    web3-providers-http "1.2.1"
 | 
				
			||||||
 | 
					    web3-providers-ipc "1.2.1"
 | 
				
			||||||
 | 
					    web3-providers-ws "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-core-requestmanager@1.2.4:
 | 
					web3-core-requestmanager@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz#0a7020a23fb91c6913c611dfd3d8c398d1e4b4a8"
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz#0a7020a23fb91c6913c611dfd3d8c398d1e4b4a8"
 | 
				
			||||||
  integrity sha512-eZJDjyNTDtmSmzd3S488nR/SMJtNnn/GuwxnMh3AzYCqG3ZMfOylqTad2eYJPvc2PM5/Gj1wAMQcRpwOjjLuPg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
    web3-core-helpers "1.2.4"
 | 
					    web3-core-helpers "1.2.4"
 | 
				
			||||||
@@ -17442,10 +17549,17 @@ web3-core-requestmanager@1.2.4:
 | 
				
			|||||||
    web3-providers-ipc "1.2.4"
 | 
					    web3-providers-ipc "1.2.4"
 | 
				
			||||||
    web3-providers-ws "1.2.4"
 | 
					    web3-providers-ws "1.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-core-subscriptions@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    eventemitter3 "3.1.2"
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-core-subscriptions@1.2.4:
 | 
					web3-core-subscriptions@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz#0dc095b5cfd82baa527a39796e3515a846b21b99"
 | 
					  resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz#0dc095b5cfd82baa527a39796e3515a846b21b99"
 | 
				
			||||||
  integrity sha512-3D607J2M8ymY9V+/WZq4MLlBulwCkwEjjC2U+cXqgVO1rCyVqbxZNCmHyNYHjDDCxSEbks9Ju5xqJxDSxnyXEw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    eventemitter3 "3.1.2"
 | 
					    eventemitter3 "3.1.2"
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
@@ -17459,10 +17573,18 @@ web3-core-subscriptions@2.0.0-alpha:
 | 
				
			|||||||
    eventemitter3 "^3.1.0"
 | 
					    eventemitter3 "^3.1.0"
 | 
				
			||||||
    lodash "^4.17.11"
 | 
					    lodash "^4.17.11"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-core@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-method "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-requestmanager "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-core@1.2.4:
 | 
					web3-core@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.4.tgz#2df13b978dcfc59c2abaa887d27f88f21ad9a9d6"
 | 
					  resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.4.tgz#2df13b978dcfc59c2abaa887d27f88f21ad9a9d6"
 | 
				
			||||||
  integrity sha512-CHc27sMuET2cs1IKrkz7xzmTdMfZpYswe7f0HcuyneTwS1yTlTnHyqjAaTy0ZygAb/x4iaVox+Gvr4oSAqSI+A==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/bignumber.js" "^5.0.0"
 | 
					    "@types/bignumber.js" "^5.0.0"
 | 
				
			||||||
    "@types/bn.js" "^4.11.4"
 | 
					    "@types/bn.js" "^4.11.4"
 | 
				
			||||||
@@ -17484,10 +17606,17 @@ web3-core@2.0.0-alpha:
 | 
				
			|||||||
    web3-providers "2.0.0-alpha"
 | 
					    web3-providers "2.0.0-alpha"
 | 
				
			||||||
    web3-utils "2.0.0-alpha"
 | 
					    web3-utils "2.0.0-alpha"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-eth-abi@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    ethers "4.0.0-beta.3"
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-eth-abi@1.2.4:
 | 
					web3-eth-abi@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz#5b73e5ef70b03999227066d5d1310b168845e2b8"
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz#5b73e5ef70b03999227066d5d1310b168845e2b8"
 | 
				
			||||||
  integrity sha512-8eLIY4xZKoU3DSVu1pORluAw9Ru0/v4CGdw5so31nn+7fR8zgHMgwbFe0aOqWQ5VU42PzMMXeIJwt4AEi2buFg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    ethers "4.0.0-beta.3"
 | 
					    ethers "4.0.0-beta.3"
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
@@ -17502,10 +17631,25 @@ web3-eth-abi@^1.0.0-beta.24:
 | 
				
			|||||||
    web3-core-helpers "1.0.0-beta.34"
 | 
					    web3-core-helpers "1.0.0-beta.34"
 | 
				
			||||||
    web3-utils "1.0.0-beta.34"
 | 
					    web3-utils "1.0.0-beta.34"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-eth-accounts@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    any-promise "1.3.0"
 | 
				
			||||||
 | 
					    crypto-browserify "3.12.0"
 | 
				
			||||||
 | 
					    eth-lib "0.2.7"
 | 
				
			||||||
 | 
					    scryptsy "2.1.0"
 | 
				
			||||||
 | 
					    semver "6.2.0"
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    uuid "3.3.2"
 | 
				
			||||||
 | 
					    web3-core "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-method "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-eth-accounts@1.2.4:
 | 
					web3-eth-accounts@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz#ada6edc49542354328a85cafab067acd7f88c288"
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz#ada6edc49542354328a85cafab067acd7f88c288"
 | 
				
			||||||
  integrity sha512-04LzT/UtWmRFmi4hHRewP5Zz43fWhuHiK5XimP86sUQodk/ByOkXQ3RoXyGXFMNoRxdcAeRNxSfA2DpIBc9xUw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@web3-js/scrypt-shim" "^0.1.0"
 | 
					    "@web3-js/scrypt-shim" "^0.1.0"
 | 
				
			||||||
    any-promise "1.3.0"
 | 
					    any-promise "1.3.0"
 | 
				
			||||||
@@ -17520,10 +17664,22 @@ web3-eth-accounts@1.2.4:
 | 
				
			|||||||
    web3-core-method "1.2.4"
 | 
					    web3-core-method "1.2.4"
 | 
				
			||||||
    web3-utils "1.2.4"
 | 
					    web3-utils "1.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-eth-contract@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-core "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-method "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-promievent "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-subscriptions "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-abi "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-eth-contract@1.2.4:
 | 
					web3-eth-contract@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz#68ef7cc633232779b0a2c506a810fbe903575886"
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz#68ef7cc633232779b0a2c506a810fbe903575886"
 | 
				
			||||||
  integrity sha512-b/9zC0qjVetEYnzRA1oZ8gF1OSSUkwSYi5LGr4GeckLkzXP7osEnp9lkO/AQcE4GpG+l+STnKPnASXJGZPgBRQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/bn.js" "^4.11.4"
 | 
					    "@types/bn.js" "^4.11.4"
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
@@ -17535,10 +17691,22 @@ web3-eth-contract@1.2.4:
 | 
				
			|||||||
    web3-eth-abi "1.2.4"
 | 
					    web3-eth-abi "1.2.4"
 | 
				
			||||||
    web3-utils "1.2.4"
 | 
					    web3-utils "1.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-eth-ens@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    eth-ens-namehash "2.0.8"
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-core "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-promievent "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-abi "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-contract "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-eth-ens@1.2.4:
 | 
					web3-eth-ens@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz#b95b3aa99fb1e35c802b9e02a44c3046a3fa065e"
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz#b95b3aa99fb1e35c802b9e02a44c3046a3fa065e"
 | 
				
			||||||
  integrity sha512-g8+JxnZlhdsCzCS38Zm6R/ngXhXzvc3h7bXlxgKU4coTzLLoMpgOAEz71GxyIJinWTFbLXk/WjNY0dazi9NwVw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    eth-ens-namehash "2.0.8"
 | 
					    eth-ens-namehash "2.0.8"
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
@@ -17556,10 +17724,16 @@ web3-eth-iban@1.0.0-beta.34:
 | 
				
			|||||||
    bn.js "4.11.6"
 | 
					    bn.js "4.11.6"
 | 
				
			||||||
    web3-utils "1.0.0-beta.34"
 | 
					    web3-utils "1.0.0-beta.34"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-eth-iban@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    bn.js "4.11.8"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-eth-iban@1.2.4:
 | 
					web3-eth-iban@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz#8e0550fd3fd8e47a39357d87fe27dee9483ee476"
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz#8e0550fd3fd8e47a39357d87fe27dee9483ee476"
 | 
				
			||||||
  integrity sha512-D9HIyctru/FLRpXakRwmwdjb5bWU2O6UE/3AXvRm6DCOf2e+7Ve11qQrPtaubHfpdW3KWjDKvlxV9iaFv/oTMQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    bn.js "4.11.8"
 | 
					    bn.js "4.11.8"
 | 
				
			||||||
    web3-utils "1.2.4"
 | 
					    web3-utils "1.2.4"
 | 
				
			||||||
@@ -17572,10 +17746,19 @@ web3-eth-iban@2.0.0-alpha:
 | 
				
			|||||||
    bn.js "4.11.8"
 | 
					    bn.js "4.11.8"
 | 
				
			||||||
    web3-utils "2.0.0-alpha"
 | 
					    web3-utils "2.0.0-alpha"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-eth-personal@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    web3-core "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-method "1.2.1"
 | 
				
			||||||
 | 
					    web3-net "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-eth-personal@1.2.4:
 | 
					web3-eth-personal@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz#3224cca6851c96347d9799b12c1b67b2a6eb232b"
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz#3224cca6851c96347d9799b12c1b67b2a6eb232b"
 | 
				
			||||||
  integrity sha512-5Russ7ZECwHaZXcN3DLuLS7390Vzgrzepl4D87SD6Sn1DHsCZtvfdPIYwoTmKNp69LG3mORl7U23Ga5YxqkICw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/node" "^12.6.1"
 | 
					    "@types/node" "^12.6.1"
 | 
				
			||||||
    web3-core "1.2.4"
 | 
					    web3-core "1.2.4"
 | 
				
			||||||
@@ -17584,10 +17767,27 @@ web3-eth-personal@1.2.4:
 | 
				
			|||||||
    web3-net "1.2.4"
 | 
					    web3-net "1.2.4"
 | 
				
			||||||
    web3-utils "1.2.4"
 | 
					    web3-utils "1.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-eth@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-core "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-method "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-subscriptions "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-abi "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-accounts "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-contract "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-ens "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-iban "1.2.1"
 | 
				
			||||||
 | 
					    web3-eth-personal "1.2.1"
 | 
				
			||||||
 | 
					    web3-net "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-eth@1.2.4:
 | 
					web3-eth@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.4.tgz#24c3b1f1ac79351bbfb808b2ab5c585fa57cdd00"
 | 
					  resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.4.tgz#24c3b1f1ac79351bbfb808b2ab5c585fa57cdd00"
 | 
				
			||||||
  integrity sha512-+j+kbfmZsbc3+KJpvHM16j1xRFHe2jBAniMo1BHKc3lho6A8Sn9Buyut6odubguX2AxoRArCdIDCkT9hjUERpA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
    web3-core "1.2.4"
 | 
					    web3-core "1.2.4"
 | 
				
			||||||
@@ -17603,10 +17803,17 @@ web3-eth@1.2.4:
 | 
				
			|||||||
    web3-net "1.2.4"
 | 
					    web3-net "1.2.4"
 | 
				
			||||||
    web3-utils "1.2.4"
 | 
					    web3-utils "1.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-net@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    web3-core "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-method "1.2.1"
 | 
				
			||||||
 | 
					    web3-utils "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-net@1.2.4:
 | 
					web3-net@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.4.tgz#1d246406d3aaffbf39c030e4e98bce0ca5f25458"
 | 
					  resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.4.tgz#1d246406d3aaffbf39c030e4e98bce0ca5f25458"
 | 
				
			||||||
  integrity sha512-wKOsqhyXWPSYTGbp7ofVvni17yfRptpqoUdp3SC8RAhDmGkX6irsiT9pON79m6b3HUHfLoBilFQyt/fTUZOf7A==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    web3-core "1.2.4"
 | 
					    web3-core "1.2.4"
 | 
				
			||||||
    web3-core-method "1.2.4"
 | 
					    web3-core-method "1.2.4"
 | 
				
			||||||
@@ -17687,27 +17894,47 @@ web3-provider-engine@^13.3.2:
 | 
				
			|||||||
    xhr "^2.2.0"
 | 
					    xhr "^2.2.0"
 | 
				
			||||||
    xtend "^4.0.1"
 | 
					    xtend "^4.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-providers-http@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.1.tgz#c93ea003a42e7b894556f7e19dd3540f947f5013"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    xhr2-cookies "1.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-providers-http@1.2.4:
 | 
					web3-providers-http@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.4.tgz#514fcad71ae77832c2c15574296282fbbc5f4a67"
 | 
					  resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.4.tgz#514fcad71ae77832c2c15574296282fbbc5f4a67"
 | 
				
			||||||
  integrity sha512-dzVCkRrR/cqlIrcrWNiPt9gyt0AZTE0J+MfAu9rR6CyIgtnm1wFUVVGaxYRxuTGQRO4Dlo49gtoGwaGcyxqiTw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    web3-core-helpers "1.2.4"
 | 
					    web3-core-helpers "1.2.4"
 | 
				
			||||||
    xhr2-cookies "1.1.0"
 | 
					    xhr2-cookies "1.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-providers-ipc@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    oboe "2.1.4"
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-providers-ipc@1.2.4:
 | 
					web3-providers-ipc@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz#9d6659f8d44943fb369b739f48df09092be459bd"
 | 
					  resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz#9d6659f8d44943fb369b739f48df09092be459bd"
 | 
				
			||||||
  integrity sha512-8J3Dguffin51gckTaNrO3oMBo7g+j0UNk6hXmdmQMMNEtrYqw4ctT6t06YOf9GgtOMjSAc1YEh3LPrvgIsR7og==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    oboe "2.1.4"
 | 
					    oboe "2.1.4"
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
    web3-core-helpers "1.2.4"
 | 
					    web3-core-helpers "1.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-providers-ws@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    web3-core-helpers "1.2.1"
 | 
				
			||||||
 | 
					    websocket "github:web3-js/WebSocket-Node#polyfill/globalThis"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-providers-ws@1.2.4:
 | 
					web3-providers-ws@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz#099ee271ee03f6ea4f5df9cfe969e83f4ce0e36f"
 | 
					  resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz#099ee271ee03f6ea4f5df9cfe969e83f4ce0e36f"
 | 
				
			||||||
  integrity sha512-F/vQpDzeK+++oeeNROl1IVTufFCwCR2hpWe5yRXN0ApLwHqXrMI7UwQNdJ9iyibcWjJf/ECbauEEQ8CHgE+MYQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@web3-js/websocket" "^1.0.29"
 | 
					    "@web3-js/websocket" "^1.0.29"
 | 
				
			||||||
    underscore "1.9.1"
 | 
					    underscore "1.9.1"
 | 
				
			||||||
@@ -17729,10 +17956,18 @@ web3-providers@2.0.0-alpha:
 | 
				
			|||||||
    websocket "^1.0.28"
 | 
					    websocket "^1.0.28"
 | 
				
			||||||
    xhr2-cookies "1.1.0"
 | 
					    xhr2-cookies "1.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-shh@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    web3-core "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-method "1.2.1"
 | 
				
			||||||
 | 
					    web3-core-subscriptions "1.2.1"
 | 
				
			||||||
 | 
					    web3-net "1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-shh@1.2.4:
 | 
					web3-shh@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.4.tgz#5c8ff5ab624a3b14f08af0d24d2b16c10e9f70dd"
 | 
					  resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.4.tgz#5c8ff5ab624a3b14f08af0d24d2b16c10e9f70dd"
 | 
				
			||||||
  integrity sha512-z+9SCw0dE+69Z/Hv8809XDbLj7lTfEv9Sgu8eKEIdGntZf4v7ewj5rzN5bZZSz8aCvfK7Y6ovz1PBAu4QzS4IQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    web3-core "1.2.4"
 | 
					    web3-core "1.2.4"
 | 
				
			||||||
    web3-core-method "1.2.4"
 | 
					    web3-core-method "1.2.4"
 | 
				
			||||||
@@ -17757,10 +17992,21 @@ web3-utils@1.0.0-beta.34:
 | 
				
			|||||||
    underscore "1.8.3"
 | 
					    underscore "1.8.3"
 | 
				
			||||||
    utf8 "2.1.1"
 | 
					    utf8 "2.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3-utils@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    bn.js "4.11.8"
 | 
				
			||||||
 | 
					    eth-lib "0.2.7"
 | 
				
			||||||
 | 
					    ethjs-unit "0.1.6"
 | 
				
			||||||
 | 
					    number-to-bn "1.7.0"
 | 
				
			||||||
 | 
					    randomhex "0.1.5"
 | 
				
			||||||
 | 
					    underscore "1.9.1"
 | 
				
			||||||
 | 
					    utf8 "3.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
web3-utils@1.2.4:
 | 
					web3-utils@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.4.tgz#96832a39a66b05bf8862a5b0bdad2799d709d951"
 | 
					  resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.4.tgz#96832a39a66b05bf8862a5b0bdad2799d709d951"
 | 
				
			||||||
  integrity sha512-+S86Ip+jqfIPQWvw2N/xBQq5JNqCO0dyvukGdJm8fEWHZbckT4WxSpHbx+9KLEWY4H4x9pUwnoRkK87pYyHfgQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    bn.js "4.11.8"
 | 
					    bn.js "4.11.8"
 | 
				
			||||||
    eth-lib "0.2.7"
 | 
					    eth-lib "0.2.7"
 | 
				
			||||||
@@ -17786,10 +18032,21 @@ web3-utils@2.0.0-alpha:
 | 
				
			|||||||
    randombytes "^2.1.0"
 | 
					    randombytes "^2.1.0"
 | 
				
			||||||
    utf8 "2.1.1"
 | 
					    utf8 "2.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					web3@1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    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@1.2.4:
 | 
					web3@1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.4.tgz#6e7ab799eefc9b4648c2dab63003f704a1d5e7d9"
 | 
					  resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.4.tgz#6e7ab799eefc9b4648c2dab63003f704a1d5e7d9"
 | 
				
			||||||
  integrity sha512-xPXGe+w0x0t88Wj+s/dmAdASr3O9wmA9mpZRtixGZxmBexAF0MjfqYM+MS4tVl5s11hMTN3AZb8cDD4VLfC57A==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/node" "^12.6.1"
 | 
					    "@types/node" "^12.6.1"
 | 
				
			||||||
    web3-bzz "1.2.4"
 | 
					    web3-bzz "1.2.4"
 | 
				
			||||||
@@ -17957,6 +18214,16 @@ websocket@^1.0.26:
 | 
				
			|||||||
    typedarray-to-buffer "^3.1.5"
 | 
					    typedarray-to-buffer "^3.1.5"
 | 
				
			||||||
    yaeti "^0.0.6"
 | 
					    yaeti "^0.0.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"websocket@github:web3-js/WebSocket-Node#polyfill/globalThis":
 | 
				
			||||||
 | 
					  version "1.0.29"
 | 
				
			||||||
 | 
					  resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/ef5ea2f41daf4a2113b80c9223df884b4d56c400"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    debug "^2.2.0"
 | 
				
			||||||
 | 
					    es5-ext "^0.10.50"
 | 
				
			||||||
 | 
					    nan "^2.14.0"
 | 
				
			||||||
 | 
					    typedarray-to-buffer "^3.1.5"
 | 
				
			||||||
 | 
					    yaeti "^0.0.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
 | 
					whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
 | 
				
			||||||
  version "1.0.5"
 | 
					  version "1.0.5"
 | 
				
			||||||
  resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
 | 
					  resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user