chore: [asset swapper] sampler Solidity 0.6 + Bridge addresses in AS (#4)
* Refactor excess interfaces * Compiles on 0.6 * Refactored into try/catch * Rebase and Refactored to v06 * Handle invalid registry in LP * Update packages/asset-swapper/contracts/src/LiquidityProviderSampler.sol Co-authored-by: Lawrence Forman <lawrence@0xproject.com> * chore: [asset-swapper] Move Bridge Addresses and Gas schedule * curve->pool * lint * Refactor to fix module load order * Move FEE Schedule * rollup: Swerve/Sushi/SnowSwap/DODO (#7) * rollup: Swerve/Sushi * DODO Rollup + Snowswap Swerve * hardcode addresses temporarily * rebase * rename to SUSHISWAP_ROUTER * CHANGELOGs * CHANGELOGs Co-authored-by: Lawrence Forman <lawrence@0xproject.com>
This commit is contained in:
		| @@ -1,4 +1,13 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "version": "3.6.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Add `SwerveBridge` and `SnowSwapBridge` (duplicate of `CurveBridge`)", | ||||||
|  |                 "pr": 2707 | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "version": "3.5.0", |         "version": "3.5.0", | ||||||
|         "changes": [ |         "changes": [ | ||||||
|   | |||||||
							
								
								
									
										119
									
								
								contracts/asset-proxy/contracts/src/bridges/SnowSwapBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								contracts/asset-proxy/contracts/src/bridges/SnowSwapBridge.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  |  | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   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-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/ICurve.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // solhint-disable not-rely-on-time | ||||||
|  | // solhint-disable space-after-comma | ||||||
|  | contract SnowSwapBridge is | ||||||
|  |     IERC20Bridge, | ||||||
|  |     IWallet, | ||||||
|  |     DeploymentConstants | ||||||
|  | { | ||||||
|  |     struct SnowSwapBridgeData { | ||||||
|  |         address curveAddress; | ||||||
|  |         bytes4 exchangeFunctionSelector; | ||||||
|  |         address fromTokenAddress; | ||||||
|  |         int128 fromCoinIdx; | ||||||
|  |         int128 toCoinIdx; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Callback for `ICurve`. Tries to buy `amount` of | ||||||
|  |     ///      `toTokenAddress` tokens by selling the entirety of the opposing asset | ||||||
|  |     ///      (DAI, USDC) to the Curve contract, then transfers the bought | ||||||
|  |     ///      tokens to `to`. | ||||||
|  |     /// @param toTokenAddress The token to give to `to` (i.e DAI, USDC, USDT). | ||||||
|  |     /// @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-encoeded "from" token 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) | ||||||
|  |     { | ||||||
|  |         // Decode the bridge data to get the SnowSwap metadata. | ||||||
|  |         SnowSwapBridgeData memory data = abi.decode(bridgeData, (SnowSwapBridgeData)); | ||||||
|  |  | ||||||
|  |         require(toTokenAddress != data.fromTokenAddress, "SnowSwapBridge/INVALID_PAIR"); | ||||||
|  |         uint256 fromTokenBalance = IERC20Token(data.fromTokenAddress).balanceOf(address(this)); | ||||||
|  |         // Grant an allowance to the exchange to spend `fromTokenAddress` token. | ||||||
|  |         LibERC20Token.approveIfBelow(data.fromTokenAddress, data.curveAddress, fromTokenBalance); | ||||||
|  |  | ||||||
|  |         // Try to sell all of this contract's `fromTokenAddress` token balance. | ||||||
|  |         { | ||||||
|  |             (bool didSucceed, bytes memory resultData) = | ||||||
|  |                 data.curveAddress.call(abi.encodeWithSelector( | ||||||
|  |                     data.exchangeFunctionSelector, | ||||||
|  |                     data.fromCoinIdx, | ||||||
|  |                     data.toCoinIdx, | ||||||
|  |                     // dx | ||||||
|  |                     fromTokenBalance, | ||||||
|  |                     // min dy | ||||||
|  |                     amount | ||||||
|  |                 )); | ||||||
|  |             if (!didSucceed) { | ||||||
|  |                 assembly { revert(add(resultData, 32), mload(resultData)) } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         uint256 toTokenBalance = IERC20Token(toTokenAddress).balanceOf(address(this)); | ||||||
|  |         // Transfer the converted `toToken`s to `to`. | ||||||
|  |         LibERC20Token.transfer(toTokenAddress, to, toTokenBalance); | ||||||
|  |  | ||||||
|  |         emit ERC20BridgeTransfer( | ||||||
|  |             data.fromTokenAddress, | ||||||
|  |             toTokenAddress, | ||||||
|  |             fromTokenBalance, | ||||||
|  |             toTokenBalance, | ||||||
|  |             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; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										119
									
								
								contracts/asset-proxy/contracts/src/bridges/SwerveBridge.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								contracts/asset-proxy/contracts/src/bridges/SwerveBridge.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  |  | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   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-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/ICurve.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // solhint-disable not-rely-on-time | ||||||
|  | // solhint-disable space-after-comma | ||||||
|  | contract SwerveBridge is | ||||||
|  |     IERC20Bridge, | ||||||
|  |     IWallet, | ||||||
|  |     DeploymentConstants | ||||||
|  | { | ||||||
|  |     struct SwerveBridgeData { | ||||||
|  |         address curveAddress; | ||||||
|  |         bytes4 exchangeFunctionSelector; | ||||||
|  |         address fromTokenAddress; | ||||||
|  |         int128 fromCoinIdx; | ||||||
|  |         int128 toCoinIdx; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Callback for `ICurve`. Tries to buy `amount` of | ||||||
|  |     ///      `toTokenAddress` tokens by selling the entirety of the opposing asset | ||||||
|  |     ///      (DAI, USDC) to the Curve contract, then transfers the bought | ||||||
|  |     ///      tokens to `to`. | ||||||
|  |     /// @param toTokenAddress The token to give to `to` (i.e DAI, USDC, USDT). | ||||||
|  |     /// @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-encoeded "from" token 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) | ||||||
|  |     { | ||||||
|  |         // Decode the bridge data to get the SwerveBridgeData metadata. | ||||||
|  |         SwerveBridgeData memory data = abi.decode(bridgeData, (SwerveBridgeData)); | ||||||
|  |  | ||||||
|  |         require(toTokenAddress != data.fromTokenAddress, "SwerveBridge/INVALID_PAIR"); | ||||||
|  |         uint256 fromTokenBalance = IERC20Token(data.fromTokenAddress).balanceOf(address(this)); | ||||||
|  |         // Grant an allowance to the exchange to spend `fromTokenAddress` token. | ||||||
|  |         LibERC20Token.approveIfBelow(data.fromTokenAddress, data.curveAddress, fromTokenBalance); | ||||||
|  |  | ||||||
|  |         // Try to sell all of this contract's `fromTokenAddress` token balance. | ||||||
|  |         { | ||||||
|  |             (bool didSucceed, bytes memory resultData) = | ||||||
|  |                 data.curveAddress.call(abi.encodeWithSelector( | ||||||
|  |                     data.exchangeFunctionSelector, | ||||||
|  |                     data.fromCoinIdx, | ||||||
|  |                     data.toCoinIdx, | ||||||
|  |                     // dx | ||||||
|  |                     fromTokenBalance, | ||||||
|  |                     // min dy | ||||||
|  |                     amount | ||||||
|  |                 )); | ||||||
|  |             if (!didSucceed) { | ||||||
|  |                 assembly { revert(add(resultData, 32), mload(resultData)) } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         uint256 toTokenBalance = IERC20Token(toTokenAddress).balanceOf(address(this)); | ||||||
|  |         // Transfer the converted `toToken`s to `to`. | ||||||
|  |         LibERC20Token.transfer(toTokenAddress, to, toTokenBalance); | ||||||
|  |  | ||||||
|  |         emit ERC20BridgeTransfer( | ||||||
|  |             data.fromTokenAddress, | ||||||
|  |             toTokenAddress, | ||||||
|  |             fromTokenBalance, | ||||||
|  |             toTokenBalance, | ||||||
|  |             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; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -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|BancorBridge|ChaiBridge|CreamBridge|CurveBridge|DODOBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IMooniswap|IShell|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MooniswapBridge|MultiAssetProxy|Ownable|ShellBridge|StaticCallProxy|SushiSwapBridge|TestBancorBridge|TestChaiBridge|TestDexForwarderBridge|TestDydxBridge|TestERC20Bridge|TestEth2DaiBridge|TestKyberBridge|TestStaticCallTarget|TestUniswapBridge|TestUniswapV2Bridge|UniswapBridge|UniswapV2Bridge).json", |         "abis": "./test/generated-artifacts/@(BalancerBridge|BancorBridge|ChaiBridge|CreamBridge|CurveBridge|DODOBridge|DexForwarderBridge|DydxBridge|ERC1155Proxy|ERC20BridgeProxy|ERC20Proxy|ERC721Proxy|Eth2DaiBridge|IAssetData|IAssetProxy|IAssetProxyDispatcher|IAuthorizable|IBalancerPool|IBancorNetwork|IChai|ICurve|IDydx|IDydxBridge|IERC20Bridge|IEth2Dai|IGasToken|IKyberNetworkProxy|IMStable|IMooniswap|IShell|IUniswapExchange|IUniswapExchangeFactory|IUniswapV2Router01|KyberBridge|MStableBridge|MixinAssetProxyDispatcher|MixinAuthorizable|MixinGasToken|MooniswapBridge|MultiAssetProxy|Ownable|ShellBridge|SnowSwapBridge|StaticCallProxy|SushiSwapBridge|SwerveBridge|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": { | ||||||
|   | |||||||
| @@ -47,8 +47,10 @@ 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 ShellBridge from '../generated-artifacts/ShellBridge.json'; | import * as ShellBridge from '../generated-artifacts/ShellBridge.json'; | ||||||
|  | import * as SnowSwapBridge from '../generated-artifacts/SnowSwapBridge.json'; | ||||||
| import * as StaticCallProxy from '../generated-artifacts/StaticCallProxy.json'; | import * as StaticCallProxy from '../generated-artifacts/StaticCallProxy.json'; | ||||||
| import * as SushiSwapBridge from '../generated-artifacts/SushiSwapBridge.json'; | import * as SushiSwapBridge from '../generated-artifacts/SushiSwapBridge.json'; | ||||||
|  | import * as SwerveBridge from '../generated-artifacts/SwerveBridge.json'; | ||||||
| import * as TestBancorBridge from '../generated-artifacts/TestBancorBridge.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'; | ||||||
| @@ -85,7 +87,9 @@ export const artifacts = { | |||||||
|     MixinGasToken: MixinGasToken as ContractArtifact, |     MixinGasToken: MixinGasToken as ContractArtifact, | ||||||
|     MooniswapBridge: MooniswapBridge as ContractArtifact, |     MooniswapBridge: MooniswapBridge as ContractArtifact, | ||||||
|     ShellBridge: ShellBridge as ContractArtifact, |     ShellBridge: ShellBridge as ContractArtifact, | ||||||
|  |     SnowSwapBridge: SnowSwapBridge as ContractArtifact, | ||||||
|     SushiSwapBridge: SushiSwapBridge as ContractArtifact, |     SushiSwapBridge: SushiSwapBridge as ContractArtifact, | ||||||
|  |     SwerveBridge: SwerveBridge as ContractArtifact, | ||||||
|     UniswapBridge: UniswapBridge as ContractArtifact, |     UniswapBridge: UniswapBridge as ContractArtifact, | ||||||
|     UniswapV2Bridge: UniswapV2Bridge as ContractArtifact, |     UniswapV2Bridge: UniswapV2Bridge as ContractArtifact, | ||||||
|     IAssetData: IAssetData as ContractArtifact, |     IAssetData: IAssetData as ContractArtifact, | ||||||
|   | |||||||
| @@ -45,8 +45,10 @@ export * from '../generated-wrappers/mooniswap_bridge'; | |||||||
| 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/shell_bridge'; | export * from '../generated-wrappers/shell_bridge'; | ||||||
|  | export * from '../generated-wrappers/snow_swap_bridge'; | ||||||
| export * from '../generated-wrappers/static_call_proxy'; | export * from '../generated-wrappers/static_call_proxy'; | ||||||
| export * from '../generated-wrappers/sushi_swap_bridge'; | export * from '../generated-wrappers/sushi_swap_bridge'; | ||||||
|  | export * from '../generated-wrappers/swerve_bridge'; | ||||||
| export * from '../generated-wrappers/test_bancor_bridge'; | 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'; | ||||||
|   | |||||||
| @@ -47,8 +47,10 @@ 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 ShellBridge from '../test/generated-artifacts/ShellBridge.json'; | import * as ShellBridge from '../test/generated-artifacts/ShellBridge.json'; | ||||||
|  | import * as SnowSwapBridge from '../test/generated-artifacts/SnowSwapBridge.json'; | ||||||
| import * as StaticCallProxy from '../test/generated-artifacts/StaticCallProxy.json'; | import * as StaticCallProxy from '../test/generated-artifacts/StaticCallProxy.json'; | ||||||
| import * as SushiSwapBridge from '../test/generated-artifacts/SushiSwapBridge.json'; | import * as SushiSwapBridge from '../test/generated-artifacts/SushiSwapBridge.json'; | ||||||
|  | import * as SwerveBridge from '../test/generated-artifacts/SwerveBridge.json'; | ||||||
| import * as TestBancorBridge from '../test/generated-artifacts/TestBancorBridge.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'; | ||||||
| @@ -85,7 +87,9 @@ export const artifacts = { | |||||||
|     MixinGasToken: MixinGasToken as ContractArtifact, |     MixinGasToken: MixinGasToken as ContractArtifact, | ||||||
|     MooniswapBridge: MooniswapBridge as ContractArtifact, |     MooniswapBridge: MooniswapBridge as ContractArtifact, | ||||||
|     ShellBridge: ShellBridge as ContractArtifact, |     ShellBridge: ShellBridge as ContractArtifact, | ||||||
|  |     SnowSwapBridge: SnowSwapBridge as ContractArtifact, | ||||||
|     SushiSwapBridge: SushiSwapBridge as ContractArtifact, |     SushiSwapBridge: SushiSwapBridge as ContractArtifact, | ||||||
|  |     SwerveBridge: SwerveBridge as ContractArtifact, | ||||||
|     UniswapBridge: UniswapBridge as ContractArtifact, |     UniswapBridge: UniswapBridge as ContractArtifact, | ||||||
|     UniswapV2Bridge: UniswapV2Bridge as ContractArtifact, |     UniswapV2Bridge: UniswapV2Bridge as ContractArtifact, | ||||||
|     IAssetData: IAssetData as ContractArtifact, |     IAssetData: IAssetData as ContractArtifact, | ||||||
|   | |||||||
| @@ -45,8 +45,10 @@ export * from '../test/generated-wrappers/mooniswap_bridge'; | |||||||
| 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/shell_bridge'; | export * from '../test/generated-wrappers/shell_bridge'; | ||||||
|  | export * from '../test/generated-wrappers/snow_swap_bridge'; | ||||||
| export * from '../test/generated-wrappers/static_call_proxy'; | export * from '../test/generated-wrappers/static_call_proxy'; | ||||||
| export * from '../test/generated-wrappers/sushi_swap_bridge'; | export * from '../test/generated-wrappers/sushi_swap_bridge'; | ||||||
|  | export * from '../test/generated-wrappers/swerve_bridge'; | ||||||
| export * from '../test/generated-wrappers/test_bancor_bridge'; | 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'; | ||||||
|   | |||||||
| @@ -45,8 +45,10 @@ | |||||||
|         "generated-artifacts/MultiAssetProxy.json", |         "generated-artifacts/MultiAssetProxy.json", | ||||||
|         "generated-artifacts/Ownable.json", |         "generated-artifacts/Ownable.json", | ||||||
|         "generated-artifacts/ShellBridge.json", |         "generated-artifacts/ShellBridge.json", | ||||||
|  |         "generated-artifacts/SnowSwapBridge.json", | ||||||
|         "generated-artifacts/StaticCallProxy.json", |         "generated-artifacts/StaticCallProxy.json", | ||||||
|         "generated-artifacts/SushiSwapBridge.json", |         "generated-artifacts/SushiSwapBridge.json", | ||||||
|  |         "generated-artifacts/SwerveBridge.json", | ||||||
|         "generated-artifacts/TestBancorBridge.json", |         "generated-artifacts/TestBancorBridge.json", | ||||||
|         "generated-artifacts/TestChaiBridge.json", |         "generated-artifacts/TestChaiBridge.json", | ||||||
|         "generated-artifacts/TestDexForwarderBridge.json", |         "generated-artifacts/TestDexForwarderBridge.json", | ||||||
| @@ -101,8 +103,10 @@ | |||||||
|         "test/generated-artifacts/MultiAssetProxy.json", |         "test/generated-artifacts/MultiAssetProxy.json", | ||||||
|         "test/generated-artifacts/Ownable.json", |         "test/generated-artifacts/Ownable.json", | ||||||
|         "test/generated-artifacts/ShellBridge.json", |         "test/generated-artifacts/ShellBridge.json", | ||||||
|  |         "test/generated-artifacts/SnowSwapBridge.json", | ||||||
|         "test/generated-artifacts/StaticCallProxy.json", |         "test/generated-artifacts/StaticCallProxy.json", | ||||||
|         "test/generated-artifacts/SushiSwapBridge.json", |         "test/generated-artifacts/SushiSwapBridge.json", | ||||||
|  |         "test/generated-artifacts/SwerveBridge.json", | ||||||
|         "test/generated-artifacts/TestBancorBridge.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", | ||||||
|   | |||||||
| @@ -1,4 +1,13 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "version": "0.5.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Add `Swerve`, `SnowSwap`, `DODO` and `SushiSwap` into FQT", | ||||||
|  |                 "pr": 7 | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "version": "0.4.0", |         "version": "0.4.0", | ||||||
|         "changes": [ |         "changes": [ | ||||||
|   | |||||||
| @@ -22,11 +22,13 @@ pragma experimental ABIEncoderV2; | |||||||
| import "./mixins/MixinAdapterAddresses.sol"; | import "./mixins/MixinAdapterAddresses.sol"; | ||||||
| import "./mixins/MixinBalancer.sol"; | import "./mixins/MixinBalancer.sol"; | ||||||
| import "./mixins/MixinCurve.sol"; | import "./mixins/MixinCurve.sol"; | ||||||
|  | import "./mixins/MixinDodo.sol"; | ||||||
| import "./mixins/MixinKyber.sol"; | import "./mixins/MixinKyber.sol"; | ||||||
| import "./mixins/MixinMooniswap.sol"; | import "./mixins/MixinMooniswap.sol"; | ||||||
| import "./mixins/MixinMStable.sol"; | import "./mixins/MixinMStable.sol"; | ||||||
| import "./mixins/MixinOasis.sol"; | import "./mixins/MixinOasis.sol"; | ||||||
| import "./mixins/MixinShell.sol"; | import "./mixins/MixinShell.sol"; | ||||||
|  | import "./mixins/MixinSushiswap.sol"; | ||||||
| import "./mixins/MixinUniswap.sol"; | import "./mixins/MixinUniswap.sol"; | ||||||
| import "./mixins/MixinUniswapV2.sol"; | import "./mixins/MixinUniswapV2.sol"; | ||||||
| import "./mixins/MixinZeroExBridge.sol"; | import "./mixins/MixinZeroExBridge.sol"; | ||||||
| @@ -35,11 +37,13 @@ contract BridgeAdapter is | |||||||
|     MixinAdapterAddresses, |     MixinAdapterAddresses, | ||||||
|     MixinBalancer, |     MixinBalancer, | ||||||
|     MixinCurve, |     MixinCurve, | ||||||
|  |     MixinDodo, | ||||||
|     MixinKyber, |     MixinKyber, | ||||||
|     MixinMooniswap, |     MixinMooniswap, | ||||||
|     MixinMStable, |     MixinMStable, | ||||||
|     MixinOasis, |     MixinOasis, | ||||||
|     MixinShell, |     MixinShell, | ||||||
|  |     MixinSushiswap, | ||||||
|     MixinUniswap, |     MixinUniswap, | ||||||
|     MixinUniswapV2, |     MixinUniswapV2, | ||||||
|     MixinZeroExBridge |     MixinZeroExBridge | ||||||
| @@ -48,11 +52,15 @@ contract BridgeAdapter is | |||||||
|     address private immutable BALANCER_BRIDGE_ADDRESS; |     address private immutable BALANCER_BRIDGE_ADDRESS; | ||||||
|     address private immutable CREAM_BRIDGE_ADDRESS; |     address private immutable CREAM_BRIDGE_ADDRESS; | ||||||
|     address private immutable CURVE_BRIDGE_ADDRESS; |     address private immutable CURVE_BRIDGE_ADDRESS; | ||||||
|  |     address private immutable DODO_BRIDGE_ADDRESS; | ||||||
|     address private immutable KYBER_BRIDGE_ADDRESS; |     address private immutable KYBER_BRIDGE_ADDRESS; | ||||||
|     address private immutable MOONISWAP_BRIDGE_ADDRESS; |     address private immutable MOONISWAP_BRIDGE_ADDRESS; | ||||||
|     address private immutable MSTABLE_BRIDGE_ADDRESS; |     address private immutable MSTABLE_BRIDGE_ADDRESS; | ||||||
|     address private immutable OASIS_BRIDGE_ADDRESS; |     address private immutable OASIS_BRIDGE_ADDRESS; | ||||||
|     address private immutable SHELL_BRIDGE_ADDRESS; |     address private immutable SHELL_BRIDGE_ADDRESS; | ||||||
|  |     address private immutable SNOW_SWAP_BRIDGE_ADDRESS; | ||||||
|  |     address private immutable SUSHISWAP_BRIDGE_ADDRESS; | ||||||
|  |     address private immutable SWERVE_BRIDGE_ADDRESS; | ||||||
|     address private immutable UNISWAP_BRIDGE_ADDRESS; |     address private immutable UNISWAP_BRIDGE_ADDRESS; | ||||||
|     address private immutable UNISWAP_V2_BRIDGE_ADDRESS; |     address private immutable UNISWAP_V2_BRIDGE_ADDRESS; | ||||||
|  |  | ||||||
| @@ -76,11 +84,13 @@ contract BridgeAdapter is | |||||||
|         public |         public | ||||||
|         MixinBalancer() |         MixinBalancer() | ||||||
|         MixinCurve() |         MixinCurve() | ||||||
|  |         MixinDodo(addresses) | ||||||
|         MixinKyber(addresses) |         MixinKyber(addresses) | ||||||
|         MixinMooniswap(addresses) |         MixinMooniswap(addresses) | ||||||
|         MixinMStable(addresses) |         MixinMStable(addresses) | ||||||
|         MixinOasis(addresses) |         MixinOasis(addresses) | ||||||
|         MixinShell(addresses) |         MixinShell(addresses) | ||||||
|  |         MixinSushiswap(addresses) | ||||||
|         MixinUniswap(addresses) |         MixinUniswap(addresses) | ||||||
|         MixinUniswapV2(addresses) |         MixinUniswapV2(addresses) | ||||||
|         MixinZeroExBridge() |         MixinZeroExBridge() | ||||||
| @@ -92,9 +102,13 @@ contract BridgeAdapter is | |||||||
|         MSTABLE_BRIDGE_ADDRESS = addresses.mStableBridge; |         MSTABLE_BRIDGE_ADDRESS = addresses.mStableBridge; | ||||||
|         OASIS_BRIDGE_ADDRESS = addresses.oasisBridge; |         OASIS_BRIDGE_ADDRESS = addresses.oasisBridge; | ||||||
|         SHELL_BRIDGE_ADDRESS = addresses.shellBridge; |         SHELL_BRIDGE_ADDRESS = addresses.shellBridge; | ||||||
|  |         SUSHISWAP_BRIDGE_ADDRESS = addresses.sushiswapBridge; | ||||||
|  |         SWERVE_BRIDGE_ADDRESS = addresses.swerveBridge; | ||||||
|         UNISWAP_BRIDGE_ADDRESS = addresses.uniswapBridge; |         UNISWAP_BRIDGE_ADDRESS = addresses.uniswapBridge; | ||||||
|         UNISWAP_V2_BRIDGE_ADDRESS = addresses.uniswapV2Bridge; |         UNISWAP_V2_BRIDGE_ADDRESS = addresses.uniswapV2Bridge; | ||||||
|         CREAM_BRIDGE_ADDRESS = addresses.creamBridge; |         CREAM_BRIDGE_ADDRESS = addresses.creamBridge; | ||||||
|  |         SNOW_SWAP_BRIDGE_ADDRESS = addresses.snowSwapBridge; | ||||||
|  |         DODO_BRIDGE_ADDRESS = addresses.dodoBridge; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function trade( |     function trade( | ||||||
| @@ -118,12 +132,20 @@ contract BridgeAdapter is | |||||||
|             "BridgeAdapter/INVALID_BRIDGE_ADDRESS" |             "BridgeAdapter/INVALID_BRIDGE_ADDRESS" | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         if (bridgeAddress == CURVE_BRIDGE_ADDRESS) { |         if (bridgeAddress == CURVE_BRIDGE_ADDRESS || | ||||||
|  |             bridgeAddress == SWERVE_BRIDGE_ADDRESS || | ||||||
|  |             bridgeAddress == SNOW_SWAP_BRIDGE_ADDRESS) { | ||||||
|             boughtAmount = _tradeCurve( |             boughtAmount = _tradeCurve( | ||||||
|                 buyToken, |                 buyToken, | ||||||
|                 sellAmount, |                 sellAmount, | ||||||
|                 bridgeData |                 bridgeData | ||||||
|             ); |             ); | ||||||
|  |         } else if (bridgeAddress == SUSHISWAP_BRIDGE_ADDRESS) { | ||||||
|  |             boughtAmount = _tradeSushiswap( | ||||||
|  |                 buyToken, | ||||||
|  |                 sellAmount, | ||||||
|  |                 bridgeData | ||||||
|  |             ); | ||||||
|         } else if (bridgeAddress == UNISWAP_V2_BRIDGE_ADDRESS) { |         } else if (bridgeAddress == UNISWAP_V2_BRIDGE_ADDRESS) { | ||||||
|             boughtAmount = _tradeUniswapV2( |             boughtAmount = _tradeUniswapV2( | ||||||
|                 buyToken, |                 buyToken, | ||||||
| @@ -136,7 +158,8 @@ contract BridgeAdapter is | |||||||
|                 sellAmount, |                 sellAmount, | ||||||
|                 bridgeData |                 bridgeData | ||||||
|             ); |             ); | ||||||
|         } else if (bridgeAddress == BALANCER_BRIDGE_ADDRESS  || bridgeAddress == CREAM_BRIDGE_ADDRESS) { |         } else if (bridgeAddress == BALANCER_BRIDGE_ADDRESS || | ||||||
|  |                    bridgeAddress == CREAM_BRIDGE_ADDRESS) { | ||||||
|             boughtAmount = _tradeBalancer( |             boughtAmount = _tradeBalancer( | ||||||
|                 buyToken, |                 buyToken, | ||||||
|                 sellAmount, |                 sellAmount, | ||||||
| @@ -172,6 +195,12 @@ contract BridgeAdapter is | |||||||
|                 sellAmount, |                 sellAmount, | ||||||
|                 bridgeData |                 bridgeData | ||||||
|             ); |             ); | ||||||
|  |         } else if (bridgeAddress == DODO_BRIDGE_ADDRESS) { | ||||||
|  |             boughtAmount = _tradeDodo( | ||||||
|  |                 buyToken, | ||||||
|  |                 sellAmount, | ||||||
|  |                 bridgeData | ||||||
|  |             ); | ||||||
|         } else { |         } else { | ||||||
|             boughtAmount = _tradeZeroExBridge( |             boughtAmount = _tradeZeroExBridge( | ||||||
|                 bridgeAddress, |                 bridgeAddress, | ||||||
|   | |||||||
| @@ -26,20 +26,26 @@ contract MixinAdapterAddresses | |||||||
|         address balancerBridge; |         address balancerBridge; | ||||||
|         address creamBridge; |         address creamBridge; | ||||||
|         address curveBridge; |         address curveBridge; | ||||||
|  |         address dodoBridge; | ||||||
|         address kyberBridge; |         address kyberBridge; | ||||||
|         address mooniswapBridge; |         address mooniswapBridge; | ||||||
|         address mStableBridge; |         address mStableBridge; | ||||||
|         address oasisBridge; |         address oasisBridge; | ||||||
|         address shellBridge; |         address shellBridge; | ||||||
|  |         address snowSwapBridge; | ||||||
|  |         address swerveBridge; | ||||||
|  |         address sushiswapBridge; | ||||||
|         address uniswapBridge; |         address uniswapBridge; | ||||||
|         address uniswapV2Bridge; |         address uniswapV2Bridge; | ||||||
|         // Exchanges |         // Exchanges | ||||||
|         address kyberNetworkProxy; |         address kyberNetworkProxy; | ||||||
|         address oasis; |         address oasis; | ||||||
|  |         address sushiswapRouter; | ||||||
|         address uniswapV2Router; |         address uniswapV2Router; | ||||||
|         address uniswapExchangeFactory; |         address uniswapExchangeFactory; | ||||||
|         address mStable; |         address mStable; | ||||||
|         address shell; |         address shell; | ||||||
|  |         address dodoHelper; | ||||||
|         // Other |         // Other | ||||||
|         address weth; |         address weth; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -0,0 +1,97 @@ | |||||||
|  |  | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   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.6.5; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||||
|  | import "./MixinAdapterAddresses.sol"; | ||||||
|  |  | ||||||
|  | interface IDODOHelper { | ||||||
|  |  | ||||||
|  |     function querySellQuoteToken(address dodo, uint256 amount) external view returns (uint256); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | interface IDODO { | ||||||
|  |  | ||||||
|  |     function sellBaseToken(uint256 amount, uint256 minReceiveQuote, bytes calldata data) external returns (uint256); | ||||||
|  |  | ||||||
|  |     function buyBaseToken(uint256 amount, uint256 maxPayQuote, bytes calldata data) external returns (uint256); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | contract MixinDodo is | ||||||
|  |     MixinAdapterAddresses | ||||||
|  | { | ||||||
|  |     using LibERC20TokenV06 for IERC20TokenV06; | ||||||
|  |  | ||||||
|  |     /// @dev Mainnet address of the `DOODO Helper` contract. | ||||||
|  |     IDODOHelper private immutable DODO_HELPER; | ||||||
|  |  | ||||||
|  |     constructor(AdapterAddresses memory addresses) | ||||||
|  |         public | ||||||
|  |     { | ||||||
|  |         DODO_HELPER = IDODOHelper(addresses.dodoHelper); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function _tradeDodo( | ||||||
|  |         IERC20TokenV06 /* buyToken */, | ||||||
|  |         uint256 sellAmount, | ||||||
|  |         bytes memory bridgeData | ||||||
|  |     ) | ||||||
|  |         internal | ||||||
|  |         returns (uint256 boughtAmount) | ||||||
|  |     { | ||||||
|  |         (address fromTokenAddress, | ||||||
|  |          address pool, | ||||||
|  |          bool isSellBase) = abi.decode(bridgeData, (address, address, bool)); | ||||||
|  |  | ||||||
|  |         // Grant the Dodo pool contract an allowance to sell the first token. | ||||||
|  |         IERC20TokenV06(fromTokenAddress).approveIfBelow(pool, sellAmount); | ||||||
|  |  | ||||||
|  |         if (isSellBase) { | ||||||
|  |             // Sell the Base token directly against the contract | ||||||
|  |             boughtAmount = IDODO(pool).sellBaseToken( | ||||||
|  |                 // amount to sell | ||||||
|  |                 sellAmount, | ||||||
|  |                 // min receive amount | ||||||
|  |                 1, | ||||||
|  |                 new bytes(0) | ||||||
|  |             ); | ||||||
|  |         } else { | ||||||
|  |             // Need to re-calculate the sell quote amount into buyBase | ||||||
|  |             boughtAmount = DODO_HELPER.querySellQuoteToken( | ||||||
|  |                 pool, | ||||||
|  |                 sellAmount | ||||||
|  |             ); | ||||||
|  |             IDODO(pool).buyBaseToken( | ||||||
|  |                 // amount to buy | ||||||
|  |                 boughtAmount, | ||||||
|  |                 // max pay amount | ||||||
|  |                 sellAmount, | ||||||
|  |                 new bytes(0) | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return boughtAmount; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -69,7 +69,7 @@ contract MixinShell is | |||||||
|             sellAmount |             sellAmount | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         uint256 buyAmount = SHELL.originSwap( |         boughtAmount = SHELL.originSwap( | ||||||
|             fromTokenAddress, |             fromTokenAddress, | ||||||
|             address(buyToken), |             address(buyToken), | ||||||
|              // Sell all tokens we hold. |              // Sell all tokens we hold. | ||||||
| @@ -79,6 +79,6 @@ contract MixinShell is | |||||||
|             // deadline |             // deadline | ||||||
|             block.timestamp + 1 |             block.timestamp + 1 | ||||||
|         ); |         ); | ||||||
|         return buyAmount; |         return boughtAmount; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,79 @@ | |||||||
|  |  | ||||||
|  | /* | ||||||
|  |  | ||||||
|  |   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.6.5; | ||||||
|  | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  | import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||||
|  | import "@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol"; | ||||||
|  | import "./MixinAdapterAddresses.sol"; | ||||||
|  | import "./MixinUniswapV2.sol"; | ||||||
|  |  | ||||||
|  | contract MixinSushiswap is | ||||||
|  |     MixinAdapterAddresses | ||||||
|  | { | ||||||
|  |     using LibERC20TokenV06 for IERC20TokenV06; | ||||||
|  |  | ||||||
|  |     /// @dev Mainnet address of the `SushiswapRouter` contract. | ||||||
|  |     IUniswapV2Router02 private immutable SUSHISWAP_ROUTER; | ||||||
|  |  | ||||||
|  |     constructor(AdapterAddresses memory addresses) | ||||||
|  |         public | ||||||
|  |     { | ||||||
|  |         SUSHISWAP_ROUTER = IUniswapV2Router02(addresses.sushiswapRouter); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function _tradeSushiswap( | ||||||
|  |         IERC20TokenV06 buyToken, | ||||||
|  |         uint256 sellAmount, | ||||||
|  |         bytes memory bridgeData | ||||||
|  |     ) | ||||||
|  |         internal | ||||||
|  |         returns (uint256 boughtAmount) | ||||||
|  |     { | ||||||
|  |         // solhint-disable indent | ||||||
|  |         address[] memory path = abi.decode(bridgeData, (address[])); | ||||||
|  |         // solhint-enable indent | ||||||
|  |  | ||||||
|  |         require(path.length >= 2, "SushiswapBridge/PATH_LENGTH_MUST_BE_AT_LEAST_TWO"); | ||||||
|  |         require( | ||||||
|  |             path[path.length - 1] == address(buyToken), | ||||||
|  |             "SushiswapBridge/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN" | ||||||
|  |         ); | ||||||
|  |         // Grant the Uniswap router an allowance to sell the first token. | ||||||
|  |         IERC20TokenV06(path[0]).approveIfBelow( | ||||||
|  |             address(SUSHISWAP_ROUTER), | ||||||
|  |             sellAmount | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         uint[] memory amounts = SUSHISWAP_ROUTER.swapExactTokensForTokens( | ||||||
|  |              // Sell all tokens we hold. | ||||||
|  |             sellAmount, | ||||||
|  |              // Minimum buy amount. | ||||||
|  |             1, | ||||||
|  |             // Convert to `buyToken` along this path. | ||||||
|  |             path, | ||||||
|  |             // Recipient is `this`. | ||||||
|  |             address(this), | ||||||
|  |             // Expires after this block. | ||||||
|  |             block.timestamp | ||||||
|  |         ); | ||||||
|  |         return amounts[amounts.length-1]; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -65,11 +65,13 @@ import * as MetaTransactionsFeature from '../test/generated-artifacts/MetaTransa | |||||||
| import * as MixinAdapterAddresses from '../test/generated-artifacts/MixinAdapterAddresses.json'; | import * as MixinAdapterAddresses from '../test/generated-artifacts/MixinAdapterAddresses.json'; | ||||||
| import * as MixinBalancer from '../test/generated-artifacts/MixinBalancer.json'; | import * as MixinBalancer from '../test/generated-artifacts/MixinBalancer.json'; | ||||||
| import * as MixinCurve from '../test/generated-artifacts/MixinCurve.json'; | import * as MixinCurve from '../test/generated-artifacts/MixinCurve.json'; | ||||||
|  | import * as MixinDodo from '../test/generated-artifacts/MixinDodo.json'; | ||||||
| import * as MixinKyber from '../test/generated-artifacts/MixinKyber.json'; | import * as MixinKyber from '../test/generated-artifacts/MixinKyber.json'; | ||||||
| import * as MixinMooniswap from '../test/generated-artifacts/MixinMooniswap.json'; | import * as MixinMooniswap from '../test/generated-artifacts/MixinMooniswap.json'; | ||||||
| import * as MixinMStable from '../test/generated-artifacts/MixinMStable.json'; | import * as MixinMStable from '../test/generated-artifacts/MixinMStable.json'; | ||||||
| import * as MixinOasis from '../test/generated-artifacts/MixinOasis.json'; | import * as MixinOasis from '../test/generated-artifacts/MixinOasis.json'; | ||||||
| import * as MixinShell from '../test/generated-artifacts/MixinShell.json'; | import * as MixinShell from '../test/generated-artifacts/MixinShell.json'; | ||||||
|  | import * as MixinSushiswap from '../test/generated-artifacts/MixinSushiswap.json'; | ||||||
| import * as MixinUniswap from '../test/generated-artifacts/MixinUniswap.json'; | import * as MixinUniswap from '../test/generated-artifacts/MixinUniswap.json'; | ||||||
| import * as MixinUniswapV2 from '../test/generated-artifacts/MixinUniswapV2.json'; | import * as MixinUniswapV2 from '../test/generated-artifacts/MixinUniswapV2.json'; | ||||||
| import * as MixinZeroExBridge from '../test/generated-artifacts/MixinZeroExBridge.json'; | import * as MixinZeroExBridge from '../test/generated-artifacts/MixinZeroExBridge.json'; | ||||||
| @@ -176,11 +178,13 @@ export const artifacts = { | |||||||
|     MixinAdapterAddresses: MixinAdapterAddresses as ContractArtifact, |     MixinAdapterAddresses: MixinAdapterAddresses as ContractArtifact, | ||||||
|     MixinBalancer: MixinBalancer as ContractArtifact, |     MixinBalancer: MixinBalancer as ContractArtifact, | ||||||
|     MixinCurve: MixinCurve as ContractArtifact, |     MixinCurve: MixinCurve as ContractArtifact, | ||||||
|  |     MixinDodo: MixinDodo as ContractArtifact, | ||||||
|     MixinKyber: MixinKyber as ContractArtifact, |     MixinKyber: MixinKyber as ContractArtifact, | ||||||
|     MixinMStable: MixinMStable as ContractArtifact, |     MixinMStable: MixinMStable as ContractArtifact, | ||||||
|     MixinMooniswap: MixinMooniswap as ContractArtifact, |     MixinMooniswap: MixinMooniswap as ContractArtifact, | ||||||
|     MixinOasis: MixinOasis as ContractArtifact, |     MixinOasis: MixinOasis as ContractArtifact, | ||||||
|     MixinShell: MixinShell as ContractArtifact, |     MixinShell: MixinShell as ContractArtifact, | ||||||
|  |     MixinSushiswap: MixinSushiswap as ContractArtifact, | ||||||
|     MixinUniswap: MixinUniswap as ContractArtifact, |     MixinUniswap: MixinUniswap as ContractArtifact, | ||||||
|     MixinUniswapV2: MixinUniswapV2 as ContractArtifact, |     MixinUniswapV2: MixinUniswapV2 as ContractArtifact, | ||||||
|     MixinZeroExBridge: MixinZeroExBridge as ContractArtifact, |     MixinZeroExBridge: MixinZeroExBridge as ContractArtifact, | ||||||
|   | |||||||
| @@ -65,10 +65,13 @@ blockchainTests.resets('FillQuoteTransformer', env => { | |||||||
|                 mooniswapBridge: NULL_ADDRESS, |                 mooniswapBridge: NULL_ADDRESS, | ||||||
|                 mStableBridge: NULL_ADDRESS, |                 mStableBridge: NULL_ADDRESS, | ||||||
|                 oasisBridge: NULL_ADDRESS, |                 oasisBridge: NULL_ADDRESS, | ||||||
|  |                 sushiswapBridge: NULL_ADDRESS, | ||||||
|  |                 swerveBridge: NULL_ADDRESS, | ||||||
|                 uniswapBridge: NULL_ADDRESS, |                 uniswapBridge: NULL_ADDRESS, | ||||||
|                 uniswapV2Bridge: NULL_ADDRESS, |                 uniswapV2Bridge: NULL_ADDRESS, | ||||||
|                 kyberNetworkProxy: NULL_ADDRESS, |                 kyberNetworkProxy: NULL_ADDRESS, | ||||||
|                 oasis: NULL_ADDRESS, |                 oasis: NULL_ADDRESS, | ||||||
|  |                 sushiswapRouter: NULL_ADDRESS, | ||||||
|                 uniswapV2Router: NULL_ADDRESS, |                 uniswapV2Router: NULL_ADDRESS, | ||||||
|                 uniswapExchangeFactory: NULL_ADDRESS, |                 uniswapExchangeFactory: NULL_ADDRESS, | ||||||
|                 mStable: NULL_ADDRESS, |                 mStable: NULL_ADDRESS, | ||||||
| @@ -76,6 +79,9 @@ blockchainTests.resets('FillQuoteTransformer', env => { | |||||||
|                 shellBridge: NULL_ADDRESS, |                 shellBridge: NULL_ADDRESS, | ||||||
|                 shell: NULL_ADDRESS, |                 shell: NULL_ADDRESS, | ||||||
|                 creamBridge: NULL_ADDRESS, |                 creamBridge: NULL_ADDRESS, | ||||||
|  |                 dodoBridge: NULL_ADDRESS, | ||||||
|  |                 dodoHelper: NULL_ADDRESS, | ||||||
|  |                 snowSwapBridge: NULL_ADDRESS, | ||||||
|             }, |             }, | ||||||
|         ); |         ); | ||||||
|         transformer = await FillQuoteTransformerContract.deployFrom0xArtifactAsync( |         transformer = await FillQuoteTransformerContract.deployFrom0xArtifactAsync( | ||||||
|   | |||||||
| @@ -63,11 +63,13 @@ export * from '../test/generated-wrappers/meta_transactions_feature'; | |||||||
| export * from '../test/generated-wrappers/mixin_adapter_addresses'; | export * from '../test/generated-wrappers/mixin_adapter_addresses'; | ||||||
| export * from '../test/generated-wrappers/mixin_balancer'; | export * from '../test/generated-wrappers/mixin_balancer'; | ||||||
| export * from '../test/generated-wrappers/mixin_curve'; | export * from '../test/generated-wrappers/mixin_curve'; | ||||||
|  | export * from '../test/generated-wrappers/mixin_dodo'; | ||||||
| export * from '../test/generated-wrappers/mixin_kyber'; | export * from '../test/generated-wrappers/mixin_kyber'; | ||||||
| export * from '../test/generated-wrappers/mixin_m_stable'; | export * from '../test/generated-wrappers/mixin_m_stable'; | ||||||
| export * from '../test/generated-wrappers/mixin_mooniswap'; | export * from '../test/generated-wrappers/mixin_mooniswap'; | ||||||
| export * from '../test/generated-wrappers/mixin_oasis'; | export * from '../test/generated-wrappers/mixin_oasis'; | ||||||
| export * from '../test/generated-wrappers/mixin_shell'; | export * from '../test/generated-wrappers/mixin_shell'; | ||||||
|  | export * from '../test/generated-wrappers/mixin_sushiswap'; | ||||||
| export * from '../test/generated-wrappers/mixin_uniswap'; | export * from '../test/generated-wrappers/mixin_uniswap'; | ||||||
| export * from '../test/generated-wrappers/mixin_uniswap_v2'; | export * from '../test/generated-wrappers/mixin_uniswap_v2'; | ||||||
| export * from '../test/generated-wrappers/mixin_zero_ex_bridge'; | export * from '../test/generated-wrappers/mixin_zero_ex_bridge'; | ||||||
|   | |||||||
| @@ -87,11 +87,13 @@ | |||||||
|         "test/generated-artifacts/MixinAdapterAddresses.json", |         "test/generated-artifacts/MixinAdapterAddresses.json", | ||||||
|         "test/generated-artifacts/MixinBalancer.json", |         "test/generated-artifacts/MixinBalancer.json", | ||||||
|         "test/generated-artifacts/MixinCurve.json", |         "test/generated-artifacts/MixinCurve.json", | ||||||
|  |         "test/generated-artifacts/MixinDodo.json", | ||||||
|         "test/generated-artifacts/MixinKyber.json", |         "test/generated-artifacts/MixinKyber.json", | ||||||
|         "test/generated-artifacts/MixinMStable.json", |         "test/generated-artifacts/MixinMStable.json", | ||||||
|         "test/generated-artifacts/MixinMooniswap.json", |         "test/generated-artifacts/MixinMooniswap.json", | ||||||
|         "test/generated-artifacts/MixinOasis.json", |         "test/generated-artifacts/MixinOasis.json", | ||||||
|         "test/generated-artifacts/MixinShell.json", |         "test/generated-artifacts/MixinShell.json", | ||||||
|  |         "test/generated-artifacts/MixinSushiswap.json", | ||||||
|         "test/generated-artifacts/MixinUniswap.json", |         "test/generated-artifacts/MixinUniswap.json", | ||||||
|         "test/generated-artifacts/MixinUniswapV2.json", |         "test/generated-artifacts/MixinUniswapV2.json", | ||||||
|         "test/generated-artifacts/MixinZeroExBridge.json", |         "test/generated-artifacts/MixinZeroExBridge.json", | ||||||
|   | |||||||
| @@ -1,4 +1,17 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "version": "4.8.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Moved Bridge addresses into Asset-swapper", | ||||||
|  |                 "pr": 4 | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "note": "Updated Sampler to Solidity 0.6", | ||||||
|  |                 "pr": 4 | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "timestamp": 1603487270, |         "timestamp": 1603487270, | ||||||
|         "version": "4.7.1", |         "version": "4.7.1", | ||||||
| @@ -172,8 +185,12 @@ | |||||||
|                 "pr": 2731 |                 "pr": 2731 | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|                 "note": "Support DODO Trade Allowed parameter to automatically disable the pool", |                 "note": "Support `DODO` Trade Allowed parameter to automatically disable the pool", | ||||||
|                 "pr": 2732 |                 "pr": 2732 | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "note": "Added `SwerveBridge` and `SnowSwapBridge` deployed addresses", | ||||||
|  |                 "pr": 7 | ||||||
|             } |             } | ||||||
|         ], |         ], | ||||||
|         "timestamp": 1603265572 |         "timestamp": 1603265572 | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-exchange-libs/contracts/src/LibMath.sol"; | import "@0x/contracts-utils/contracts/src/v06/LibMathV06.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
| contract ApproximateBuys { | contract ApproximateBuys { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "./interfaces/IBalancer.sol"; | import "./interfaces/IBalancer.sol"; | ||||||
| @@ -78,24 +78,24 @@ contract BalancerSampler { | |||||||
|             if (takerTokenAmounts[i] > _bmul(poolState.takerTokenBalance, MAX_IN_RATIO)) { |             if (takerTokenAmounts[i] > _bmul(poolState.takerTokenBalance, MAX_IN_RATIO)) { | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 poolAddress.staticcall.gas(BALANCER_CALL_GAS)( |                 pool.calcOutGivenIn | ||||||
|                     abi.encodeWithSelector( |                     {gas: BALANCER_CALL_GAS} | ||||||
|                         pool.calcOutGivenIn.selector, |                     ( | ||||||
|                         poolState.takerTokenBalance, |                         poolState.takerTokenBalance, | ||||||
|                         poolState.takerTokenWeight, |                         poolState.takerTokenWeight, | ||||||
|                         poolState.makerTokenBalance, |                         poolState.makerTokenBalance, | ||||||
|                         poolState.makerTokenWeight, |                         poolState.makerTokenWeight, | ||||||
|                         takerTokenAmounts[i], |                         takerTokenAmounts[i], | ||||||
|                         poolState.swapFee |                         poolState.swapFee | ||||||
|                     )); |                     ) | ||||||
|             uint256 buyAmount = 0; |                 returns (uint256 amount) | ||||||
|             if (didSucceed) { |             { | ||||||
|                 buyAmount = abi.decode(resultData, (uint256)); |                 makerTokenAmounts[i] = amount; | ||||||
|             } else { |             } catch (bytes memory) { | ||||||
|  |                 // Swallow failures, leaving all results as zero. | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             makerTokenAmounts[i] = buyAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -136,24 +136,24 @@ contract BalancerSampler { | |||||||
|             if (makerTokenAmounts[i] > _bmul(poolState.makerTokenBalance, MAX_OUT_RATIO)) { |             if (makerTokenAmounts[i] > _bmul(poolState.makerTokenBalance, MAX_OUT_RATIO)) { | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 poolAddress.staticcall.gas(BALANCER_CALL_GAS)( |                 pool.calcInGivenOut | ||||||
|                     abi.encodeWithSelector( |                     {gas: BALANCER_CALL_GAS} | ||||||
|                         pool.calcInGivenOut.selector, |                     ( | ||||||
|                         poolState.takerTokenBalance, |                         poolState.takerTokenBalance, | ||||||
|                         poolState.takerTokenWeight, |                         poolState.takerTokenWeight, | ||||||
|                         poolState.makerTokenBalance, |                         poolState.makerTokenBalance, | ||||||
|                         poolState.makerTokenWeight, |                         poolState.makerTokenWeight, | ||||||
|                         makerTokenAmounts[i], |                         makerTokenAmounts[i], | ||||||
|                         poolState.swapFee |                         poolState.swapFee | ||||||
|                     )); |                     ) | ||||||
|             uint256 sellAmount = 0; |                 returns (uint256 amount) | ||||||
|             if (didSucceed) { |             { | ||||||
|                 sellAmount = abi.decode(resultData, (uint256)); |                 takerTokenAmounts[i] = amount; | ||||||
|             } else { |             } catch (bytes memory) { | ||||||
|  |                 // Swallow failures, leaving all results as zero. | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             takerTokenAmounts[i] = sellAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "./interfaces/ICurve.sol"; | import "./interfaces/ICurve.sol"; | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "./ApproximateBuys.sol"; | import "./ApproximateBuys.sol"; | ||||||
| import "./SamplerUtils.sol"; | import "./SamplerUtils.sol"; | ||||||
|  |  | ||||||
| @@ -50,6 +50,8 @@ contract DODOSampler is | |||||||
|     /// @param takerToken Address of the taker token (what to sell). |     /// @param takerToken Address of the taker token (what to sell). | ||||||
|     /// @param makerToken Address of the maker token (what to buy). |     /// @param makerToken Address of the maker token (what to buy). | ||||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample. |     /// @param takerTokenAmounts Taker token sell amount for each sample. | ||||||
|  |     /// @return sellBase whether the bridge needs to sell the base token | ||||||
|  |     /// @return pool the DODO pool address | ||||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token |     /// @return makerTokenAmounts Maker amounts bought at each taker token | ||||||
|     ///         amount. |     ///         amount. | ||||||
|     function sampleSellsFromDODO( |     function sampleSellsFromDODO( | ||||||
| @@ -104,6 +106,8 @@ contract DODOSampler is | |||||||
|     /// @param takerToken Address of the taker token (what to sell). |     /// @param takerToken Address of the taker token (what to sell). | ||||||
|     /// @param makerToken Address of the maker token (what to buy). |     /// @param makerToken Address of the maker token (what to buy). | ||||||
|     /// @param makerTokenAmounts Maker token sell amount for each sample. |     /// @param makerTokenAmounts Maker token sell amount for each sample. | ||||||
|  |     /// @return sellBase whether the bridge needs to sell the base token | ||||||
|  |     /// @return pool the DODO pool address | ||||||
|     /// @return takerTokenAmounts Taker amounts sold at each maker token |     /// @return takerTokenAmounts Taker amounts sold at each maker token | ||||||
|     ///         amount. |     ///         amount. | ||||||
|     function sampleBuysFromDODO( |     function sampleBuysFromDODO( | ||||||
| @@ -167,32 +171,34 @@ contract DODOSampler is | |||||||
|             (address, address, address) |             (address, address, address) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         bool didSucceed; |  | ||||||
|         bytes memory resultData; |  | ||||||
|         // We will get called to sell both the taker token and also to sell the maker token |         // We will get called to sell both the taker token and also to sell the maker token | ||||||
|         if (takerToken == baseToken) { |         if (takerToken == baseToken) { | ||||||
|             // If base token then use the original query on the pool |             // If base token then use the original query on the pool | ||||||
|             (didSucceed, resultData) = |             try | ||||||
|                 pool.staticcall.gas(DODO_CALL_GAS)( |                 IDODO(pool).querySellBaseToken | ||||||
|                     abi.encodeWithSelector( |                     {gas: DODO_CALL_GAS} | ||||||
|                         IDODO(0).querySellBaseToken.selector, |                     (sellAmount) | ||||||
|                         sellAmount |                 returns (uint256 amount) | ||||||
|                     )); |             { | ||||||
|  |                 return amount; | ||||||
|  |             } catch (bytes memory) { | ||||||
|  |                 // Swallow failures, leaving all results as zero. | ||||||
|  |                 return 0; | ||||||
|  |             } | ||||||
|         } else { |         } else { | ||||||
|             // If quote token then use helper, this is less accurate |             // If quote token then use helper, this is less accurate | ||||||
|             (didSucceed, resultData) = |             try | ||||||
|                 _getDODOHelperAddress().staticcall.gas(DODO_CALL_GAS)( |                 IDODOHelper(_getDODOHelperAddress()).querySellQuoteToken | ||||||
|                     abi.encodeWithSelector( |                     {gas: DODO_CALL_GAS} | ||||||
|                         IDODOHelper(0).querySellQuoteToken.selector, |                     (pool, sellAmount) | ||||||
|                         pool, |                 returns (uint256 amount) | ||||||
|                         sellAmount |             { | ||||||
|                     )); |                 return amount; | ||||||
|  |             } catch (bytes memory) { | ||||||
|  |                 // Swallow failures, leaving all results as zero. | ||||||
|  |                 return 0; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         if (!didSucceed) { |  | ||||||
|             return 0; |  | ||||||
|         } |  | ||||||
|         // solhint-disable-next-line indent |  | ||||||
|         return abi.decode(resultData, (uint256)); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										340
									
								
								packages/asset-swapper/contracts/src/DeploymentConstants.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								packages/asset-swapper/contracts/src/DeploymentConstants.sol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,340 @@ | |||||||
|  | /* | ||||||
|  |  | ||||||
|  |   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.6; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | contract DeploymentConstants { | ||||||
|  |  | ||||||
|  |     // solhint-disable separate-by-one-line-in-contract | ||||||
|  |  | ||||||
|  |     // Mainnet addresses /////////////////////////////////////////////////////// | ||||||
|  |     /// @dev Mainnet address of the WETH contract. | ||||||
|  |     address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; | ||||||
|  |     /// @dev Mainnet address of the KyberNetworkProxy contract. | ||||||
|  |     address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e; | ||||||
|  |     /// @dev Mainnet address of the KyberHintHandler contract. | ||||||
|  |     address constant private KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C; | ||||||
|  |     /// @dev Mainnet address of the `UniswapExchangeFactory` contract. | ||||||
|  |     address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95; | ||||||
|  |     /// @dev Mainnet address of the `UniswapV2Router01` contract. | ||||||
|  |     address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a; | ||||||
|  |     /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract. | ||||||
|  |     address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D; | ||||||
|  |     /// @dev Mainnet address of the `ERC20BridgeProxy` contract | ||||||
|  |     address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0; | ||||||
|  |     ///@dev Mainnet address of the `Dai` (multi-collateral) contract | ||||||
|  |     address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F; | ||||||
|  |     /// @dev Mainnet address of the `Chai` contract | ||||||
|  |     address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215; | ||||||
|  |     /// @dev Mainnet address of the 0x DevUtils contract. | ||||||
|  |     address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547; | ||||||
|  |     /// @dev Kyber ETH pseudo-address. | ||||||
|  |     address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||||
|  |     /// @dev Mainnet address of the dYdX contract. | ||||||
|  |     address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e; | ||||||
|  |     /// @dev Mainnet address of the GST2 contract | ||||||
|  |     address constant private GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04; | ||||||
|  |     /// @dev Mainnet address of the GST Collector | ||||||
|  |     address constant private GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96; | ||||||
|  |     /// @dev Mainnet address of the mStable mUSD contract. | ||||||
|  |     address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5; | ||||||
|  |     /// @dev Mainnet address of the Mooniswap Registry contract | ||||||
|  |     address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303; | ||||||
|  |     /// @dev Mainnet address of the Shell contract | ||||||
|  |     address constant private SHELL_CONTRACT = 0x2E703D658f8dd21709a7B458967aB4081F8D3d05; | ||||||
|  |     /// @dev Mainnet address of the DODO Registry (ZOO) contract | ||||||
|  |     address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950; | ||||||
|  |     /// @dev Mainnet address of the DODO Helper contract | ||||||
|  |     address constant private DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb; | ||||||
|  |  | ||||||
|  |     // // Ropsten addresses /////////////////////////////////////////////////////// | ||||||
|  |     // /// @dev Mainnet address of the WETH contract. | ||||||
|  |     // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab; | ||||||
|  |     // /// @dev Mainnet address of the KyberNetworkProxy contract. | ||||||
|  |     // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4; | ||||||
|  |     // /// @dev Mainnet address of the `UniswapExchangeFactory` contract. | ||||||
|  |     // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351; | ||||||
|  |     // /// @dev Mainnet address of the `UniswapV2Router01` contract. | ||||||
|  |     // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a; | ||||||
|  |     // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract. | ||||||
|  |     // address constant private ETH2DAI_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the `ERC20BridgeProxy` contract | ||||||
|  |     // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339; | ||||||
|  |     // ///@dev Mainnet address of the `Dai` (multi-collateral) contract | ||||||
|  |     // address constant private DAI_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the `Chai` contract | ||||||
|  |     // address constant private CHAI_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the 0x DevUtils contract. | ||||||
|  |     // address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c; | ||||||
|  |     // /// @dev Kyber ETH pseudo-address. | ||||||
|  |     // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||||
|  |     // /// @dev Mainnet address of the dYdX contract. | ||||||
|  |     // address constant private DYDX_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the GST2 contract | ||||||
|  |     // address constant private GST_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the GST Collector | ||||||
|  |     // address constant private GST_COLLECTOR_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the mStable mUSD contract. | ||||||
|  |     // address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459; | ||||||
|  |  | ||||||
|  |     // // Rinkeby addresses /////////////////////////////////////////////////////// | ||||||
|  |     // /// @dev Mainnet address of the WETH contract. | ||||||
|  |     // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab; | ||||||
|  |     // /// @dev Mainnet address of the KyberNetworkProxy contract. | ||||||
|  |     // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5; | ||||||
|  |     // /// @dev Mainnet address of the `UniswapExchangeFactory` contract. | ||||||
|  |     // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36; | ||||||
|  |     // /// @dev Mainnet address of the `UniswapV2Router01` contract. | ||||||
|  |     // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a; | ||||||
|  |     // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract. | ||||||
|  |     // address constant private ETH2DAI_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the `ERC20BridgeProxy` contract | ||||||
|  |     // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B; | ||||||
|  |     // ///@dev Mainnet address of the `Dai` (multi-collateral) contract | ||||||
|  |     // address constant private DAI_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the `Chai` contract | ||||||
|  |     // address constant private CHAI_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the 0x DevUtils contract. | ||||||
|  |     // address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9; | ||||||
|  |     // /// @dev Kyber ETH pseudo-address. | ||||||
|  |     // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||||
|  |     // /// @dev Mainnet address of the dYdX contract. | ||||||
|  |     // address constant private DYDX_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the GST2 contract | ||||||
|  |     // address constant private GST_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the GST Collector | ||||||
|  |     // address constant private GST_COLLECTOR_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the mStable mUSD contract. | ||||||
|  |     // address constant private MUSD_ADDRESS = address(0); | ||||||
|  |  | ||||||
|  |     // // Kovan addresses ///////////////////////////////////////////////////////// | ||||||
|  |     // /// @dev Kovan address of the WETH contract. | ||||||
|  |     // address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C; | ||||||
|  |     // /// @dev Kovan address of the KyberNetworkProxy contract. | ||||||
|  |     // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D; | ||||||
|  |     // /// @dev Kovan address of the `UniswapExchangeFactory` contract. | ||||||
|  |     // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30; | ||||||
|  |     // /// @dev Kovan address of the `UniswapV2Router01` contract. | ||||||
|  |     // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a; | ||||||
|  |     // /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract. | ||||||
|  |     // address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4; | ||||||
|  |     // /// @dev Kovan address of the `ERC20BridgeProxy` contract | ||||||
|  |     // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D; | ||||||
|  |     // /// @dev Kovan address of the `Chai` contract | ||||||
|  |     // address constant private CHAI_ADDRESS = address(0); | ||||||
|  |     // /// @dev Kovan address of the `Dai` (multi-collateral) contract | ||||||
|  |     // address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa; | ||||||
|  |     // /// @dev Kovan address of the 0x DevUtils contract. | ||||||
|  |     // address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59; | ||||||
|  |     // /// @dev Kyber ETH pseudo-address. | ||||||
|  |     // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||||
|  |     // /// @dev Kovan address of the dYdX contract. | ||||||
|  |     // address constant private DYDX_ADDRESS = address(0); | ||||||
|  |     // /// @dev Kovan address of the GST2 contract | ||||||
|  |     // address constant private GST_ADDRESS = address(0); | ||||||
|  |     // /// @dev Kovan address of the GST Collector | ||||||
|  |     // address constant private GST_COLLECTOR_ADDRESS = address(0); | ||||||
|  |     // /// @dev Mainnet address of the mStable mUSD contract. | ||||||
|  |     // address constant private MUSD_ADDRESS = address(0); | ||||||
|  |  | ||||||
|  |     /// @dev Overridable way to get the `KyberNetworkProxy` address. | ||||||
|  |     /// @return kyberAddress The `IKyberNetworkProxy` address. | ||||||
|  |     function _getKyberNetworkProxyAddress() | ||||||
|  |         virtual | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address kyberAddress) | ||||||
|  |     { | ||||||
|  |         return KYBER_NETWORK_PROXY_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Overridable way to get the `KyberHintHandler` address. | ||||||
|  |     /// @return hintHandlerAddress The `IKyberHintHandler` address. | ||||||
|  |     function _getKyberHintHandlerAddress() | ||||||
|  |         virtual | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address hintHandlerAddress) | ||||||
|  |     { | ||||||
|  |         return KYBER_HINT_HANDLER_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Overridable way to get the WETH address. | ||||||
|  |     /// @return wethAddress The WETH address. | ||||||
|  |     function _getWethAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address wethAddress) | ||||||
|  |     { | ||||||
|  |         return WETH_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Overridable way to get the `UniswapExchangeFactory` address. | ||||||
|  |     /// @return uniswapAddress The `UniswapExchangeFactory` address. | ||||||
|  |     function _getUniswapExchangeFactoryAddress() | ||||||
|  |         virtual | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address uniswapAddress) | ||||||
|  |     { | ||||||
|  |         return UNISWAP_EXCHANGE_FACTORY_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Overridable way to get the `UniswapV2Router01` address. | ||||||
|  |     /// @return uniswapRouterAddress The `UniswapV2Router01` address. | ||||||
|  |     function _getUniswapV2Router01Address() | ||||||
|  |         virtual | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address uniswapRouterAddress) | ||||||
|  |     { | ||||||
|  |         return UNISWAP_V2_ROUTER_01_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract. | ||||||
|  |     /// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract. | ||||||
|  |     function _getEth2DaiAddress() | ||||||
|  |         virtual | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address eth2daiAddress) | ||||||
|  |     { | ||||||
|  |         return ETH2DAI_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract. | ||||||
|  |     /// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract. | ||||||
|  |     function _getERC20BridgeProxyAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address erc20BridgeProxyAddress) | ||||||
|  |     { | ||||||
|  |         return ERC20_BRIDGE_PROXY_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the `Dai` contract. | ||||||
|  |     /// @return daiAddress The `Dai` contract. | ||||||
|  |     function _getDaiAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address daiAddress) | ||||||
|  |     { | ||||||
|  |         return DAI_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the `Chai` contract. | ||||||
|  |     /// @return chaiAddress The `Chai` contract. | ||||||
|  |     function _getChaiAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address chaiAddress) | ||||||
|  |     { | ||||||
|  |         return CHAI_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the 0x `DevUtils` contract address. | ||||||
|  |     /// @return devUtils The 0x `DevUtils` contract address. | ||||||
|  |     function _getDevUtilsAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address devUtils) | ||||||
|  |     { | ||||||
|  |         return DEV_UTILS_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Overridable way to get the DyDx contract. | ||||||
|  |     /// @return dydxAddress exchange The DyDx exchange contract. | ||||||
|  |     function _getDydxAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address dydxAddress) | ||||||
|  |     { | ||||||
|  |         return DYDX_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the GST2 contract address. | ||||||
|  |     /// @return gst The GST contract. | ||||||
|  |     function _getGstAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address gst) | ||||||
|  |     { | ||||||
|  |         return GST_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the GST Collector address. | ||||||
|  |     /// @return collector The GST collector address. | ||||||
|  |     function _getGstCollectorAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address collector) | ||||||
|  |     { | ||||||
|  |         return GST_COLLECTOR_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the mStable mUSD address. | ||||||
|  |     /// @return musd The mStable mUSD address. | ||||||
|  |     function _getMUsdAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address musd) | ||||||
|  |     { | ||||||
|  |         return MUSD_ADDRESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the Mooniswap registry address. | ||||||
|  |     /// @return registry The Mooniswap registry address. | ||||||
|  |     function _getMooniswapAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address) | ||||||
|  |     { | ||||||
|  |         return MOONISWAP_REGISTRY; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the Shell contract address. | ||||||
|  |     /// @return registry The Shell contract address. | ||||||
|  |     function _getShellAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address registry) | ||||||
|  |     { | ||||||
|  |         return SHELL_CONTRACT; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the DODO Registry contract address. | ||||||
|  |     /// @return registry The DODO Registry contract address. | ||||||
|  |     function _getDODORegistryAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address registry) | ||||||
|  |     { | ||||||
|  |         return DODO_REGISTRY; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev An overridable way to retrieve the DODO Helper contract address. | ||||||
|  |     /// @return registry The DODO Helper contract address. | ||||||
|  |     function _getDODOHelperAddress() | ||||||
|  |         internal | ||||||
|  |         view | ||||||
|  |         returns (address registry) | ||||||
|  |     { | ||||||
|  |         return DODO_HELPER; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "./BalancerSampler.sol"; | import "./BalancerSampler.sol"; | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "./interfaces/IEth2Dai.sol"; | import "./interfaces/IEth2Dai.sol"; | ||||||
| import "./SamplerUtils.sol"; | import "./SamplerUtils.sol"; | ||||||
|  |  | ||||||
| @@ -50,23 +50,17 @@ contract Eth2DaiSampler is | |||||||
|         uint256 numSamples = takerTokenAmounts.length; |         uint256 numSamples = takerTokenAmounts.length; | ||||||
|         makerTokenAmounts = new uint256[](numSamples); |         makerTokenAmounts = new uint256[](numSamples); | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 _getEth2DaiAddress().staticcall.gas(ETH2DAI_CALL_GAS)( |                 IEth2Dai(_getEth2DaiAddress()).getBuyAmount | ||||||
|                     abi.encodeWithSelector( |                     {gas: ETH2DAI_CALL_GAS} | ||||||
|                         IEth2Dai(0).getBuyAmount.selector, |                     (makerToken, takerToken, takerTokenAmounts[i]) | ||||||
|                         makerToken, |                 returns (uint256 amount) | ||||||
|                         takerToken, |             { | ||||||
|                         takerTokenAmounts[i] |                 makerTokenAmounts[i] = amount; | ||||||
|                     )); |             } catch (bytes memory) { | ||||||
|             uint256 buyAmount = 0; |                 // Swallow failures, leaving all results as zero. | ||||||
|             if (didSucceed) { |  | ||||||
|                 buyAmount = abi.decode(resultData, (uint256)); |  | ||||||
|             } |  | ||||||
|             // Exit early if the amount is too high for the source to serve |  | ||||||
|             if (buyAmount == 0) { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             makerTokenAmounts[i] = buyAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -89,23 +83,17 @@ contract Eth2DaiSampler is | |||||||
|         uint256 numSamples = makerTokenAmounts.length; |         uint256 numSamples = makerTokenAmounts.length; | ||||||
|         takerTokenAmounts = new uint256[](numSamples); |         takerTokenAmounts = new uint256[](numSamples); | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 _getEth2DaiAddress().staticcall.gas(ETH2DAI_CALL_GAS)( |                 IEth2Dai(_getEth2DaiAddress()).getPayAmount | ||||||
|                     abi.encodeWithSelector( |                     {gas: ETH2DAI_CALL_GAS} | ||||||
|                         IEth2Dai(0).getPayAmount.selector, |                     (takerToken, makerToken, makerTokenAmounts[i]) | ||||||
|                         takerToken, |                 returns (uint256 amount) | ||||||
|                         makerToken, |             { | ||||||
|                         makerTokenAmounts[i] |                 takerTokenAmounts[i] = amount; | ||||||
|                     )); |             } catch (bytes memory) { | ||||||
|             uint256 sellAmount = 0; |                 // Swallow failures, leaving all results as zero. | ||||||
|             if (didSucceed) { |  | ||||||
|                 sellAmount = abi.decode(resultData, (uint256)); |  | ||||||
|             } |  | ||||||
|             // Exit early if the amount is too high for the source to serve |  | ||||||
|             if (sellAmount == 0) { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             takerTokenAmounts[i] = sellAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "./interfaces/IKyberNetwork.sol"; | import "./interfaces/IKyberNetwork.sol"; | ||||||
| import "./ApproximateBuys.sol"; | import "./ApproximateBuys.sol"; | ||||||
| import "./SamplerUtils.sol"; | import "./SamplerUtils.sol"; | ||||||
| @@ -109,52 +109,66 @@ contract KyberSampler is | |||||||
|         // All other reserves should be ignored with this hint |         // All other reserves should be ignored with this hint | ||||||
|         bytes32[] memory selectedReserves = new bytes32[](1); |         bytes32[] memory selectedReserves = new bytes32[](1); | ||||||
|         selectedReserves[0] = reserveId; |         selectedReserves[0] = reserveId; | ||||||
|  |         uint256[] memory emptySplits = new uint256[](0); | ||||||
|  |  | ||||||
|         bool didSucceed; |  | ||||||
|         bytes memory resultData; |  | ||||||
|         if (takerToken == _getWethAddress()) { |         if (takerToken == _getWethAddress()) { | ||||||
|             // ETH to Token |             // ETH to Token | ||||||
|             (didSucceed, resultData) = |             try | ||||||
|                 address(kyberHint).staticcall.gas(KYBER_CALL_GAS)( |                 kyberHint.buildEthToTokenHint | ||||||
|                     abi.encodeWithSelector( |                     {gas: KYBER_CALL_GAS} | ||||||
|                         IKyberHintHandler(0).buildEthToTokenHint.selector, |                     ( | ||||||
|                         makerToken, |                         makerToken, | ||||||
|                         IKyberHintHandler.TradeType.MaskIn, |                         IKyberHintHandler.TradeType.MaskIn, | ||||||
|                         selectedReserves, |                         selectedReserves, | ||||||
|                         new uint256[](0))); |                         emptySplits | ||||||
|  |                     ) | ||||||
|  |                 returns (bytes memory result) | ||||||
|  |             { | ||||||
|  |                 return result; | ||||||
|  |             } catch (bytes memory) { | ||||||
|  |                 // Swallow failures, leaving all results as zero. | ||||||
|  |             } | ||||||
|         } else if (makerToken == _getWethAddress()) { |         } else if (makerToken == _getWethAddress()) { | ||||||
|             // Token to ETH |             // Token to ETH | ||||||
|             (didSucceed, resultData) = |             try | ||||||
|                 address(kyberHint).staticcall.gas(KYBER_CALL_GAS)( |                 kyberHint.buildTokenToEthHint | ||||||
|                     abi.encodeWithSelector( |                     {gas: KYBER_CALL_GAS} | ||||||
|                         IKyberHintHandler(0).buildTokenToEthHint.selector, |                     ( | ||||||
|                         takerToken, |                         takerToken, | ||||||
|                         IKyberHintHandler.TradeType.MaskIn, |                         IKyberHintHandler.TradeType.MaskIn, | ||||||
|                         selectedReserves, |                         selectedReserves, | ||||||
|                         new uint256[](0))); |                         emptySplits | ||||||
|  |                     ) | ||||||
|  |                 returns (bytes memory result) | ||||||
|  |             { | ||||||
|  |                 return result; | ||||||
|  |             } catch (bytes memory) { | ||||||
|  |                 // Swallow failures, leaving all results as zero. | ||||||
|  |             } | ||||||
|  |  | ||||||
|         } else { |         } else { | ||||||
|             // Token to Token |             // Token to Token | ||||||
|             // We use the same reserve both ways |             // We use the same reserve both ways | ||||||
|             (didSucceed, resultData) = |             try | ||||||
|                 address(kyberHint).staticcall.gas(KYBER_CALL_GAS)( |                 kyberHint.buildTokenToTokenHint | ||||||
|                     abi.encodeWithSelector( |                     {gas: KYBER_CALL_GAS} | ||||||
|                         IKyberHintHandler(0).buildTokenToTokenHint.selector, |                     ( | ||||||
|                         takerToken, |                         takerToken, | ||||||
|                         IKyberHintHandler.TradeType.MaskIn, |                         IKyberHintHandler.TradeType.MaskIn, | ||||||
|                         selectedReserves, |                         selectedReserves, | ||||||
|                         new uint256[](0), |                         emptySplits, | ||||||
|                         makerToken, |                         makerToken, | ||||||
|                         IKyberHintHandler.TradeType.MaskIn, |                         IKyberHintHandler.TradeType.MaskIn, | ||||||
|                         selectedReserves, |                         selectedReserves, | ||||||
|                         new uint256[](0) |                         emptySplits | ||||||
|                     ) |                     ) | ||||||
|             ); |                 returns (bytes memory result) | ||||||
|  |             { | ||||||
|  |                 return result; | ||||||
|  |             } catch (bytes memory) { | ||||||
|  |                 // Swallow failures, leaving all results as zero. | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         // If successful decode the hint |  | ||||||
|         if (didSucceed) { |  | ||||||
|             hint = abi.decode(resultData, (bytes)); |  | ||||||
|         } |  | ||||||
|         return hint; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function _sampleSellForApproximateBuyFromKyber( |     function _sampleSellForApproximateBuyFromKyber( | ||||||
| @@ -164,25 +178,22 @@ contract KyberSampler is | |||||||
|     ) |     ) | ||||||
|         private |         private | ||||||
|         view |         view | ||||||
|         returns (uint256 buyAmount) |         returns (uint256) | ||||||
|     { |     { | ||||||
|         (address makerToken, bytes memory hint) = |         (address makerToken, bytes memory hint) = | ||||||
|             abi.decode(makerTokenData, (address, bytes)); |             abi.decode(makerTokenData, (address, bytes)); | ||||||
|         (address takerToken, ) = |         (address takerToken, ) = | ||||||
|             abi.decode(takerTokenData, (address, bytes)); |             abi.decode(takerTokenData, (address, bytes)); | ||||||
|         (bool success, bytes memory resultData) = |         try | ||||||
|             address(this).staticcall(abi.encodeWithSelector( |             this.sampleSellFromKyberNetwork | ||||||
|                 this.sampleSellFromKyberNetwork.selector, |                 (hint, takerToken, makerToken, sellAmount) | ||||||
|                 hint, |             returns (uint256 amount) | ||||||
|                 takerToken, |         { | ||||||
|                 makerToken, |             return amount; | ||||||
|                 sellAmount |         } catch (bytes memory) { | ||||||
|             )); |             // Swallow failures, leaving all results as zero. | ||||||
|         if (!success) { |  | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|         // solhint-disable-next-line indent |  | ||||||
|         return abi.decode(resultData, (uint256)); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function sampleSellFromKyberNetwork( |     function sampleSellFromKyberNetwork( | ||||||
| @@ -200,31 +211,30 @@ contract KyberSampler is | |||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         (bool didSucceed, bytes memory resultData) = |         try | ||||||
|             _getKyberNetworkProxyAddress().staticcall.gas(KYBER_CALL_GAS)( |             IKyberNetworkProxy(_getKyberNetworkProxyAddress()).getExpectedRateAfterFee | ||||||
|                 abi.encodeWithSelector( |                 {gas: KYBER_CALL_GAS} | ||||||
|                     IKyberNetworkProxy(0).getExpectedRateAfterFee.selector, |                 ( | ||||||
|                     takerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : takerToken, |                     takerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : takerToken, | ||||||
|                     makerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : makerToken, |                     makerToken == _getWethAddress() ? KYBER_ETH_ADDRESS : makerToken, | ||||||
|                     takerTokenAmount, |                     takerTokenAmount, | ||||||
|                     0, // fee |                     0, // fee | ||||||
|                     hint |                     hint | ||||||
|                 )); |                 ) | ||||||
|         uint256 rate = 0; |             returns (uint256 rate) | ||||||
|         if (didSucceed) { |         { | ||||||
|             (rate) = abi.decode(resultData, (uint256)); |             uint256 makerTokenDecimals = _getTokenDecimals(makerToken); | ||||||
|         } else { |             uint256 takerTokenDecimals = _getTokenDecimals(takerToken); | ||||||
|  |             makerTokenAmount = | ||||||
|  |                 rate * | ||||||
|  |                 takerTokenAmount * | ||||||
|  |                 10 ** makerTokenDecimals / | ||||||
|  |                 10 ** takerTokenDecimals / | ||||||
|  |                 10 ** 18; | ||||||
|  |             return makerTokenAmount; | ||||||
|  |         } catch (bytes memory) { | ||||||
|  |             // Swallow failures, leaving all results as zero. | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         uint256 makerTokenDecimals = _getTokenDecimals(makerToken); |  | ||||||
|         uint256 takerTokenDecimals = _getTokenDecimals(takerToken); |  | ||||||
|         makerTokenAmount = |  | ||||||
|             rate * |  | ||||||
|             takerTokenAmount * |  | ||||||
|             10 ** makerTokenDecimals / |  | ||||||
|             10 ** takerTokenDecimals / |  | ||||||
|             10 ** 18; |  | ||||||
|         return makerTokenAmount; |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/LibBytes.sol"; | import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol"; | ||||||
| import "./interfaces/ILiquidityProvider.sol"; | import "./interfaces/ILiquidityProvider.sol"; | ||||||
| import "./interfaces/ILiquidityProviderRegistry.sol"; | import "./interfaces/ILiquidityProviderRegistry.sol"; | ||||||
| import "./ApproximateBuys.sol"; | import "./ApproximateBuys.sol"; | ||||||
| @@ -66,23 +66,17 @@ contract LiquidityProviderSampler is | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 providerAddress.staticcall.gas(DEFAULT_CALL_GAS)( |                 ILiquidityProvider(providerAddress).getSellQuote | ||||||
|                     abi.encodeWithSelector( |                     {gas: DEFAULT_CALL_GAS} | ||||||
|                         ILiquidityProvider(0).getSellQuote.selector, |                     (takerToken, makerToken, takerTokenAmounts[i]) | ||||||
|                         takerToken, |                 returns (uint256 amount) | ||||||
|                         makerToken, |             { | ||||||
|                         takerTokenAmounts[i] |                 makerTokenAmounts[i] = amount; | ||||||
|                     )); |             } catch (bytes memory) { | ||||||
|             uint256 buyAmount = 0; |                 // Swallow failures, leaving all results as zero. | ||||||
|             if (didSucceed) { |  | ||||||
|                 buyAmount = abi.decode(resultData, (uint256)); |  | ||||||
|             } |  | ||||||
|             // Exit early if the amount is too high for the source to serve |  | ||||||
|             if (buyAmount == 0) { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             makerTokenAmounts[i] = buyAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -136,14 +130,15 @@ contract LiquidityProviderSampler is | |||||||
|         if (registryAddress == address(0)) { |         if (registryAddress == address(0)) { | ||||||
|             return address(0); |             return address(0); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         bytes memory callData = abi.encodeWithSelector( |         bytes memory callData = abi.encodeWithSelector( | ||||||
|             ILiquidityProviderRegistry(0).getLiquidityProviderForMarket.selector, |         ILiquidityProviderRegistry.getLiquidityProviderForMarket.selector, | ||||||
|             takerToken, |             takerToken, | ||||||
|             makerToken |             makerToken | ||||||
|         ); |         ); | ||||||
|         (bool didSucceed, bytes memory returnData) = registryAddress.staticcall(callData); |         (bool didSucceed, bytes memory returnData) = registryAddress.staticcall(callData); | ||||||
|         if (didSucceed && returnData.length == 32) { |         if (didSucceed && returnData.length == 32) { | ||||||
|             return LibBytes.readAddress(returnData, 12); |             return LibBytesV06.readAddress(returnData, 12); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -160,19 +155,16 @@ contract LiquidityProviderSampler is | |||||||
|             abi.decode(takerTokenData, (address, address)); |             abi.decode(takerTokenData, (address, address)); | ||||||
|         (address makerToken) = |         (address makerToken) = | ||||||
|             abi.decode(makerTokenData, (address)); |             abi.decode(makerTokenData, (address)); | ||||||
|         (bool success, bytes memory resultData) = |         try | ||||||
|             address(this).staticcall(abi.encodeWithSelector( |             this.sampleSellsFromLiquidityProviderRegistry | ||||||
|                 this.sampleSellsFromLiquidityProviderRegistry.selector, |                 {gas: DEFAULT_CALL_GAS} | ||||||
|                 plpRegistryAddress, |                 (plpRegistryAddress, takerToken, makerToken, _toSingleValueArray(sellAmount)) | ||||||
|                 takerToken, |             returns (uint256[] memory amounts, address) | ||||||
|                 makerToken, |         { | ||||||
|                 _toSingleValueArray(sellAmount) |             return amounts[0]; | ||||||
|             )); |         } catch (bytes memory) { | ||||||
|         if (!success) { |             // Swallow failures, leaving all results as zero. | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|         // solhint-disable-next-line indent |  | ||||||
|         (uint256[] memory amounts, ) = abi.decode(resultData, (uint256[], address)); |  | ||||||
|         return amounts[0]; |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,11 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "@0x/contracts-utils/contracts/src/LibBytes.sol"; |  | ||||||
| import "./interfaces/IMStable.sol"; | import "./interfaces/IMStable.sol"; | ||||||
| import "./ApproximateBuys.sol"; | import "./ApproximateBuys.sol"; | ||||||
| import "./SamplerUtils.sol"; | import "./SamplerUtils.sol"; | ||||||
| @@ -54,23 +53,17 @@ contract MStableSampler is | |||||||
|         makerTokenAmounts = new uint256[](numSamples); |         makerTokenAmounts = new uint256[](numSamples); | ||||||
|  |  | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 address(_getMUsdAddress()).staticcall.gas(DEFAULT_CALL_GAS)( |                 IMStable(_getMUsdAddress()).getSwapOutput | ||||||
|                     abi.encodeWithSelector( |                     {gas: DEFAULT_CALL_GAS} | ||||||
|                         IMStable(0).getSwapOutput.selector, |                     (takerToken, makerToken, takerTokenAmounts[i]) | ||||||
|                         takerToken, |                 returns (bool, string memory, uint256 amount) | ||||||
|                         makerToken, |             { | ||||||
|                         takerTokenAmounts[i] |                 makerTokenAmounts[i] = amount; | ||||||
|                     )); |             } catch (bytes memory) { | ||||||
|             uint256 buyAmount = 0; |                 // Swallow failures, leaving all results as zero. | ||||||
|             if (didSucceed) { |  | ||||||
|                 (, , buyAmount) = abi.decode(resultData, (bool, string, uint256)); |  | ||||||
|             } |  | ||||||
|             // Exit early if the amount is too high for the source to serve |  | ||||||
|             if (buyAmount == 0) { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             makerTokenAmounts[i] = buyAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -112,17 +105,15 @@ contract MStableSampler is | |||||||
|             abi.decode(takerTokenData, (address)); |             abi.decode(takerTokenData, (address)); | ||||||
|         (address makerToken) = |         (address makerToken) = | ||||||
|             abi.decode(makerTokenData, (address)); |             abi.decode(makerTokenData, (address)); | ||||||
|         (bool success, bytes memory resultData) = |         try | ||||||
|             address(this).staticcall(abi.encodeWithSelector( |             this.sampleSellsFromMStable | ||||||
|                 this.sampleSellsFromMStable.selector, |                 (takerToken, makerToken, _toSingleValueArray(sellAmount)) | ||||||
|                 takerToken, |             returns (uint256[] memory amounts) | ||||||
|                 makerToken, |         { | ||||||
|                 _toSingleValueArray(sellAmount) |             return amounts[0]; | ||||||
|             )); |         } catch (bytes memory) { | ||||||
|         if (!success) { |             // Swallow failures, leaving all results as zero. | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|         // solhint-disable-next-line indent |  | ||||||
|         return abi.decode(resultData, (uint256[]))[0]; |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,11 +16,11 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "./IMooniswap.sol"; | import "./interfaces/IMooniswap.sol"; | ||||||
| import "./ApproximateBuys.sol"; | import "./ApproximateBuys.sol"; | ||||||
| import "./SamplerUtils.sol"; | import "./SamplerUtils.sol"; | ||||||
|  |  | ||||||
| @@ -37,6 +37,7 @@ contract MooniswapSampler is | |||||||
|     /// @param takerToken Address of the taker token (what to sell). |     /// @param takerToken Address of the taker token (what to sell). | ||||||
|     /// @param makerToken Address of the maker token (what to buy). |     /// @param makerToken Address of the maker token (what to buy). | ||||||
|     /// @param takerTokenAmounts Taker token sell amount for each sample. |     /// @param takerTokenAmounts Taker token sell amount for each sample. | ||||||
|  |     /// @return pool The contract address for the pool | ||||||
|     /// @return makerTokenAmounts Maker amounts bought at each taker token |     /// @return makerTokenAmounts Maker amounts bought at each taker token | ||||||
|     ///         amount. |     ///         amount. | ||||||
|     function sampleSellsFromMooniswap( |     function sampleSellsFromMooniswap( | ||||||
| @@ -80,7 +81,7 @@ contract MooniswapSampler is | |||||||
|     ) |     ) | ||||||
|         public |         public | ||||||
|         view |         view | ||||||
|         returns (uint256 makerTokenAmount) |         returns (uint256) | ||||||
|     { |     { | ||||||
|         // Find the pool for the pair. |         // Find the pool for the pair. | ||||||
|         IMooniswap pool = IMooniswap( |         IMooniswap pool = IMooniswap( | ||||||
| @@ -88,26 +89,26 @@ contract MooniswapSampler is | |||||||
|         ); |         ); | ||||||
|         // If there is no pool then return early |         // If there is no pool then return early | ||||||
|         if (address(pool) == address(0)) { |         if (address(pool) == address(0)) { | ||||||
|             return makerTokenAmount; |             return 0; | ||||||
|         } |         } | ||||||
|         uint256 poolBalance = mooniswapTakerToken == address(0) |         uint256 poolBalance = mooniswapTakerToken == address(0) | ||||||
|             ? address(pool).balance |             ? address(pool).balance | ||||||
|             : IERC20Token(mooniswapTakerToken).balanceOf(address(pool)); |             : IERC20TokenV06(mooniswapTakerToken).balanceOf(address(pool)); | ||||||
|         // If the pool balance is smaller than the sell amount |         // If the pool balance is smaller than the sell amount | ||||||
|         // don't sample to avoid multiplication overflow in buys |         // don't sample to avoid multiplication overflow in buys | ||||||
|         if (poolBalance < takerTokenAmount) { |         if (poolBalance < takerTokenAmount) { | ||||||
|             return makerTokenAmount; |             return 0; | ||||||
|         } |         } | ||||||
|         (bool didSucceed, bytes memory resultData) = |         try | ||||||
|             address(pool).staticcall.gas(MOONISWAP_CALL_GAS)( |             pool.getReturn | ||||||
|                 abi.encodeWithSelector( |                 {gas: MOONISWAP_CALL_GAS} | ||||||
|                     pool.getReturn.selector, |                 (mooniswapTakerToken, mooniswapMakerToken, takerTokenAmount) | ||||||
|                     mooniswapTakerToken, |             returns (uint256 amount) | ||||||
|                     mooniswapMakerToken, |         { | ||||||
|                     takerTokenAmount |             return amount; | ||||||
|                 )); |         } catch (bytes memory) { | ||||||
|         if (didSucceed) { |             // Swallow failures, leaving all results as zero. | ||||||
|             makerTokenAmount = abi.decode(resultData, (uint256)); |             return 0; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -115,6 +116,7 @@ contract MooniswapSampler is | |||||||
|     /// @param takerToken Address of the taker token (what to sell). |     /// @param takerToken Address of the taker token (what to sell). | ||||||
|     /// @param makerToken Address of the maker token (what to buy). |     /// @param makerToken Address of the maker token (what to buy). | ||||||
|     /// @param makerTokenAmounts Maker token sell amount for each sample. |     /// @param makerTokenAmounts Maker token sell amount for each sample. | ||||||
|  |     /// @return pool The contract address for the pool | ||||||
|     /// @return takerTokenAmounts Taker amounts sold at each maker token |     /// @return takerTokenAmounts Taker amounts sold at each maker token | ||||||
|     ///         amount. |     ///         amount. | ||||||
|     function sampleBuysFromMooniswap( |     function sampleBuysFromMooniswap( | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "./interfaces/IMultiBridge.sol"; | import "./interfaces/IMultiBridge.sol"; | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,21 +16,107 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol"; | import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||||
| import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; | import "@0x/contracts-utils/contracts/src/v06/LibMathV06.sol"; | ||||||
| import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; | import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol"; | ||||||
| import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol"; | import "@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol"; | ||||||
| import "@0x/contracts-exchange-libs/contracts/src/LibMath.sol"; |  | ||||||
| import "@0x/contracts-utils/contracts/src/LibBytes.sol"; |  | ||||||
| import "@0x/contracts-utils/contracts/src/LibSafeMath.sol"; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | interface IExchange { | ||||||
|  |  | ||||||
|  |     /// @dev V3 Order structure. | ||||||
|  |     struct Order { | ||||||
|  |         // Address that created the order. | ||||||
|  |         address makerAddress; | ||||||
|  |         // Address that is allowed to fill the order. | ||||||
|  |         // If set to 0, any address is allowed to fill the order. | ||||||
|  |         address takerAddress; | ||||||
|  |         // Address that will recieve fees when order is filled. | ||||||
|  |         address feeRecipientAddress; | ||||||
|  |         // Address that is allowed to call Exchange contract methods that affect this order. | ||||||
|  |         // If set to 0, any address is allowed to call these methods. | ||||||
|  |         address senderAddress; | ||||||
|  |         // Amount of makerAsset being offered by maker. Must be greater than 0. | ||||||
|  |         uint256 makerAssetAmount; | ||||||
|  |         // Amount of takerAsset being bid on by maker. Must be greater than 0. | ||||||
|  |         uint256 takerAssetAmount; | ||||||
|  |         // Fee paid to feeRecipient by maker when order is filled. | ||||||
|  |         uint256 makerFee; | ||||||
|  |         // Fee paid to feeRecipient by taker when order is filled. | ||||||
|  |         uint256 takerFee; | ||||||
|  |         // Timestamp in seconds at which order expires. | ||||||
|  |         uint256 expirationTimeSeconds; | ||||||
|  |         // Arbitrary number to facilitate uniqueness of the order's hash. | ||||||
|  |         uint256 salt; | ||||||
|  |         // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. | ||||||
|  |         // The leading bytes4 references the id of the asset proxy. | ||||||
|  |         bytes makerAssetData; | ||||||
|  |         // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. | ||||||
|  |         // The leading bytes4 references the id of the asset proxy. | ||||||
|  |         bytes takerAssetData; | ||||||
|  |         // Encoded data that can be decoded by a specified proxy contract when transferring makerFeeAsset. | ||||||
|  |         // The leading bytes4 references the id of the asset proxy. | ||||||
|  |         bytes makerFeeAssetData; | ||||||
|  |         // Encoded data that can be decoded by a specified proxy contract when transferring takerFeeAsset. | ||||||
|  |         // The leading bytes4 references the id of the asset proxy. | ||||||
|  |         bytes takerFeeAssetData; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // A valid order remains fillable until it is expired, fully filled, or cancelled. | ||||||
|  |     // An order's status is unaffected by external factors, like account balances. | ||||||
|  |     enum OrderStatus { | ||||||
|  |         INVALID,                     // Default value | ||||||
|  |         INVALID_MAKER_ASSET_AMOUNT,  // Order does not have a valid maker asset amount | ||||||
|  |         INVALID_TAKER_ASSET_AMOUNT,  // Order does not have a valid taker asset amount | ||||||
|  |         FILLABLE,                    // Order is fillable | ||||||
|  |         EXPIRED,                     // Order has already expired | ||||||
|  |         FULLY_FILLED,                // Order is fully filled | ||||||
|  |         CANCELLED                    // Order has been cancelled | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Order information returned by `getOrderInfo()`. | ||||||
|  |     struct OrderInfo { | ||||||
|  |         OrderStatus orderStatus;              // Status that describes order's validity and fillability. | ||||||
|  |         bytes32 orderHash;                    // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash). | ||||||
|  |         uint256 orderTakerAssetFilledAmount;  // Amount of order that has already been filled. | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// @dev Gets information about an order: status, hash, and amount filled. | ||||||
|  |     /// @param order Order to gather information on. | ||||||
|  |     /// @return orderInfo Information about the order and its state. | ||||||
|  |     function getOrderInfo(IExchange.Order calldata order) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (IExchange.OrderInfo memory orderInfo); | ||||||
|  |  | ||||||
|  |     /// @dev Verifies that a hash has been signed by the given signer. | ||||||
|  |     /// @param hash Any 32-byte hash. | ||||||
|  |     /// @param signature Proof that the hash has been signed by signer. | ||||||
|  |     /// @return isValid `true` if the signature is valid for the given hash and signer. | ||||||
|  |     function isValidHashSignature( | ||||||
|  |         bytes32 hash, | ||||||
|  |         address signerAddress, | ||||||
|  |         bytes calldata signature | ||||||
|  |     ) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (bool isValid); | ||||||
|  |  | ||||||
|  |     /// @dev Gets an asset proxy. | ||||||
|  |     /// @param assetProxyId Id of the asset proxy. | ||||||
|  |     /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered. | ||||||
|  |     function getAssetProxy(bytes4 assetProxyId) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (address); | ||||||
|  | } | ||||||
|  |  | ||||||
| contract NativeOrderSampler { | contract NativeOrderSampler { | ||||||
|     using LibSafeMath for uint256; |     using LibSafeMathV06 for uint256; | ||||||
|     using LibBytes for bytes; |     using LibBytesV06 for bytes; | ||||||
|  |  | ||||||
|     /// @dev The Exchange ERC20Proxy ID. |     /// @dev The Exchange ERC20Proxy ID. | ||||||
|     bytes4 private constant ERC20_ASSET_PROXY_ID = 0xf47261b0; |     bytes4 private constant ERC20_ASSET_PROXY_ID = 0xf47261b0; | ||||||
| @@ -45,8 +131,8 @@ contract NativeOrderSampler { | |||||||
|         view |         view | ||||||
|         returns (uint256, uint256) |         returns (uint256, uint256) | ||||||
|     { |     { | ||||||
|         uint256 fromTokenDecimals = LibERC20Token.decimals(makerTokenAddress); |         uint256 fromTokenDecimals = LibERC20TokenV06.compatDecimals(IERC20TokenV06(makerTokenAddress)); | ||||||
|         uint256 toTokenDecimals = LibERC20Token.decimals(takerTokenAddress); |         uint256 toTokenDecimals = LibERC20TokenV06.compatDecimals(IERC20TokenV06(takerTokenAddress)); | ||||||
|         return (fromTokenDecimals, toTokenDecimals); |         return (fromTokenDecimals, toTokenDecimals); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -59,7 +145,7 @@ contract NativeOrderSampler { | |||||||
|     /// @return orderFillableTakerAssetAmounts How much taker asset can be filled |     /// @return orderFillableTakerAssetAmounts How much taker asset can be filled | ||||||
|     ///         by each order in `orders`. |     ///         by each order in `orders`. | ||||||
|     function getOrderFillableTakerAssetAmounts( |     function getOrderFillableTakerAssetAmounts( | ||||||
|         LibOrder.Order[] memory orders, |         IExchange.Order[] memory orders, | ||||||
|         bytes[] memory orderSignatures, |         bytes[] memory orderSignatures, | ||||||
|         IExchange exchange |         IExchange exchange | ||||||
|     ) |     ) | ||||||
| @@ -69,21 +155,21 @@ contract NativeOrderSampler { | |||||||
|     { |     { | ||||||
|         orderFillableTakerAssetAmounts = new uint256[](orders.length); |         orderFillableTakerAssetAmounts = new uint256[](orders.length); | ||||||
|         for (uint256 i = 0; i != orders.length; i++) { |         for (uint256 i = 0; i != orders.length; i++) { | ||||||
|             // solhint-disable indent |             try | ||||||
|             (bool didSucceed, bytes memory resultData) = |                 this.getOrderFillableTakerAmount | ||||||
|                 address(this) |                     {gas: DEFAULT_CALL_GAS} | ||||||
|                     .staticcall |                     ( | ||||||
|                     .gas(DEFAULT_CALL_GAS) |  | ||||||
|                     (abi.encodeWithSelector( |  | ||||||
|                        this.getOrderFillableTakerAmount.selector, |  | ||||||
|                        orders[i], |                        orders[i], | ||||||
|                        orderSignatures[i], |                        orderSignatures[i], | ||||||
|                        exchange |                        exchange | ||||||
|                     )); |                     ) | ||||||
|             // solhint-enable indent |                 returns (uint256 amount) | ||||||
|             orderFillableTakerAssetAmounts[i] = didSucceed |             { | ||||||
|                 ? abi.decode(resultData, (uint256)) |                 orderFillableTakerAssetAmounts[i] = amount; | ||||||
|                 : 0; |             } catch (bytes memory) { | ||||||
|  |                 // Swallow failures, leaving all results as zero. | ||||||
|  |                 orderFillableTakerAssetAmounts[i] = 0; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -95,7 +181,7 @@ contract NativeOrderSampler { | |||||||
|     /// @return orderFillableMakerAssetAmounts How much maker asset can be filled |     /// @return orderFillableMakerAssetAmounts How much maker asset can be filled | ||||||
|     ///         by each order in `orders`. |     ///         by each order in `orders`. | ||||||
|     function getOrderFillableMakerAssetAmounts( |     function getOrderFillableMakerAssetAmounts( | ||||||
|         LibOrder.Order[] memory orders, |         IExchange.Order[] memory orders, | ||||||
|         bytes[] memory orderSignatures, |         bytes[] memory orderSignatures, | ||||||
|         IExchange exchange |         IExchange exchange | ||||||
|     ) |     ) | ||||||
| @@ -112,7 +198,7 @@ contract NativeOrderSampler { | |||||||
|         // convert them to maker asset amounts. |         // convert them to maker asset amounts. | ||||||
|         for (uint256 i = 0; i < orders.length; ++i) { |         for (uint256 i = 0; i < orders.length; ++i) { | ||||||
|             if (orderFillableMakerAssetAmounts[i] != 0) { |             if (orderFillableMakerAssetAmounts[i] != 0) { | ||||||
|                 orderFillableMakerAssetAmounts[i] = LibMath.getPartialAmountCeil( |                 orderFillableMakerAssetAmounts[i] = LibMathV06.getPartialAmountCeil( | ||||||
|                     orderFillableMakerAssetAmounts[i], |                     orderFillableMakerAssetAmounts[i], | ||||||
|                     orders[i].takerAssetAmount, |                     orders[i].takerAssetAmount, | ||||||
|                     orders[i].makerAssetAmount |                     orders[i].makerAssetAmount | ||||||
| @@ -124,10 +210,11 @@ contract NativeOrderSampler { | |||||||
|     /// @dev Get the fillable taker amount of an order, taking into account |     /// @dev Get the fillable taker amount of an order, taking into account | ||||||
|     ///      order state, maker fees, and maker balances. |     ///      order state, maker fees, and maker balances. | ||||||
|     function getOrderFillableTakerAmount( |     function getOrderFillableTakerAmount( | ||||||
|         LibOrder.Order memory order, |         IExchange.Order memory order, | ||||||
|         bytes memory signature, |         bytes memory signature, | ||||||
|         IExchange exchange |         IExchange exchange | ||||||
|     ) |     ) | ||||||
|  |         virtual | ||||||
|         public |         public | ||||||
|         view |         view | ||||||
|         returns (uint256 fillableTakerAmount) |         returns (uint256 fillableTakerAmount) | ||||||
| @@ -139,27 +226,27 @@ contract NativeOrderSampler { | |||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         LibOrder.OrderInfo memory orderInfo = exchange.getOrderInfo(order); |         IExchange.OrderInfo memory orderInfo = exchange.getOrderInfo(order); | ||||||
|         if (orderInfo.orderStatus != LibOrder.OrderStatus.FILLABLE) { |         if (orderInfo.orderStatus != IExchange.OrderStatus.FILLABLE) { | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|         if (!exchange.isValidHashSignature(orderInfo.orderHash, order.makerAddress, signature)) { |         if (!exchange.isValidHashSignature(orderInfo.orderHash, order.makerAddress, signature)) { | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|         address spender = exchange.getAssetProxy(ERC20_ASSET_PROXY_ID); |         address spender = exchange.getAssetProxy(ERC20_ASSET_PROXY_ID); | ||||||
|         IERC20Token makerToken = _getTokenFromERC20AssetData(order.makerAssetData); |         IERC20TokenV06 makerToken = _getTokenFromERC20AssetData(order.makerAssetData); | ||||||
|         if (makerToken == IERC20Token(0)) { |         if (makerToken == IERC20TokenV06(0)) { | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|         IERC20Token makerFeeToken = order.makerFee > 0 |         IERC20TokenV06 makerFeeToken = order.makerFee > 0 | ||||||
|             ? _getTokenFromERC20AssetData(order.makerFeeAssetData) |             ? _getTokenFromERC20AssetData(order.makerFeeAssetData) | ||||||
|             : IERC20Token(0); |             : IERC20TokenV06(0); | ||||||
|         uint256 remainingTakerAmount = order.takerAssetAmount |         uint256 remainingTakerAmount = order.takerAssetAmount | ||||||
|             .safeSub(orderInfo.orderTakerAssetFilledAmount); |             .safeSub(orderInfo.orderTakerAssetFilledAmount); | ||||||
|         fillableTakerAmount = remainingTakerAmount; |         fillableTakerAmount = remainingTakerAmount; | ||||||
|         // The total fillable maker amount is the remaining fillable maker amount |         // The total fillable maker amount is the remaining fillable maker amount | ||||||
|         // PLUS maker fees, if maker fees are denominated in the maker token. |         // PLUS maker fees, if maker fees are denominated in the maker token. | ||||||
|         uint256 totalFillableMakerAmount = LibMath.safeGetPartialAmountFloor( |         uint256 totalFillableMakerAmount = LibMathV06.safeGetPartialAmountFloor( | ||||||
|             remainingTakerAmount, |             remainingTakerAmount, | ||||||
|             order.takerAssetAmount, |             order.takerAssetAmount, | ||||||
|             makerFeeToken == makerToken |             makerFeeToken == makerToken | ||||||
| @@ -168,14 +255,14 @@ contract NativeOrderSampler { | |||||||
|         ); |         ); | ||||||
|         // The spendable amount of maker tokens (by the maker) is the lesser of |         // The spendable amount of maker tokens (by the maker) is the lesser of | ||||||
|         // the maker's balance and the allowance they've granted to the ERC20Proxy. |         // the maker's balance and the allowance they've granted to the ERC20Proxy. | ||||||
|         uint256 spendableMakerAmount = LibSafeMath.min256( |         uint256 spendableMakerAmount = LibSafeMathV06.min256( | ||||||
|             makerToken.balanceOf(order.makerAddress), |             makerToken.balanceOf(order.makerAddress), | ||||||
|             makerToken.allowance(order.makerAddress, spender) |             makerToken.allowance(order.makerAddress, spender) | ||||||
|         ); |         ); | ||||||
|         // Scale the fillable taker amount by the ratio of the maker's |         // Scale the fillable taker amount by the ratio of the maker's | ||||||
|         // spendable maker amount over the total fillable maker amount. |         // spendable maker amount over the total fillable maker amount. | ||||||
|         if (spendableMakerAmount < totalFillableMakerAmount) { |         if (spendableMakerAmount < totalFillableMakerAmount) { | ||||||
|             fillableTakerAmount = LibMath.getPartialAmountCeil( |             fillableTakerAmount = LibMathV06.getPartialAmountCeil( | ||||||
|                 spendableMakerAmount, |                 spendableMakerAmount, | ||||||
|                 totalFillableMakerAmount, |                 totalFillableMakerAmount, | ||||||
|                 remainingTakerAmount |                 remainingTakerAmount | ||||||
| @@ -183,15 +270,15 @@ contract NativeOrderSampler { | |||||||
|         } |         } | ||||||
|         // If the maker fee is denominated in another token, constrain |         // If the maker fee is denominated in another token, constrain | ||||||
|         // the fillable taker amount by how much the maker can pay of that token. |         // the fillable taker amount by how much the maker can pay of that token. | ||||||
|         if (makerFeeToken != makerToken && makerFeeToken != IERC20Token(0)) { |         if (makerFeeToken != makerToken && makerFeeToken != IERC20TokenV06(0)) { | ||||||
|             uint256 spendableExtraMakerFeeAmount = LibSafeMath.min256( |             uint256 spendableExtraMakerFeeAmount = LibSafeMathV06.min256( | ||||||
|                 makerFeeToken.balanceOf(order.makerAddress), |                 makerFeeToken.balanceOf(order.makerAddress), | ||||||
|                 makerFeeToken.allowance(order.makerAddress, spender) |                 makerFeeToken.allowance(order.makerAddress, spender) | ||||||
|             ); |             ); | ||||||
|             if (spendableExtraMakerFeeAmount < order.makerFee) { |             if (spendableExtraMakerFeeAmount < order.makerFee) { | ||||||
|                 fillableTakerAmount = LibSafeMath.min256( |                 fillableTakerAmount = LibSafeMathV06.min256( | ||||||
|                     fillableTakerAmount, |                     fillableTakerAmount, | ||||||
|                     LibMath.getPartialAmountCeil( |                     LibMathV06.getPartialAmountCeil( | ||||||
|                         spendableExtraMakerFeeAmount, |                         spendableExtraMakerFeeAmount, | ||||||
|                         order.makerFee, |                         order.makerFee, | ||||||
|                         remainingTakerAmount |                         remainingTakerAmount | ||||||
| @@ -204,16 +291,16 @@ contract NativeOrderSampler { | |||||||
|     function _getTokenFromERC20AssetData(bytes memory assetData) |     function _getTokenFromERC20AssetData(bytes memory assetData) | ||||||
|         private |         private | ||||||
|         pure |         pure | ||||||
|         returns (IERC20Token token) |         returns (IERC20TokenV06 token) | ||||||
|     { |     { | ||||||
|         if (assetData.length == 0) { |         if (assetData.length == 0) { | ||||||
|             return IERC20Token(address(0)); |             return IERC20TokenV06(address(0)); | ||||||
|         } |         } | ||||||
|         if (assetData.length != 36 || |         if (assetData.length != 36 || | ||||||
|             assetData.readBytes4(0) != ERC20_ASSET_PROXY_ID) |             assetData.readBytes4(0) != ERC20_ASSET_PROXY_ID) | ||||||
|         { |         { | ||||||
|             return IERC20Token(address(0)); |             return IERC20TokenV06(address(0)); | ||||||
|         } |         } | ||||||
|         return IERC20Token(assetData.readAddress(16)); |         return IERC20TokenV06(assetData.readAddress(16)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; | import "@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
| contract SamplerUtils { | contract SamplerUtils { | ||||||
| @@ -28,11 +28,12 @@ contract SamplerUtils { | |||||||
|     /// @param tokenAddress Address of the token. |     /// @param tokenAddress Address of the token. | ||||||
|     /// @return decimals The decimal places for the token. |     /// @return decimals The decimal places for the token. | ||||||
|     function _getTokenDecimals(address tokenAddress) |     function _getTokenDecimals(address tokenAddress) | ||||||
|  |         virtual | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (uint8 decimals) |         returns (uint8 decimals) | ||||||
|     { |     { | ||||||
|         return LibERC20Token.decimals(tokenAddress); |         return LibERC20TokenV06.compatDecimals(IERC20TokenV06(tokenAddress)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function _toSingleValueArray(uint256 v) |     function _toSingleValueArray(uint256 v) | ||||||
|   | |||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "./interfaces/IShell.sol"; | import "./interfaces/IShell.sol"; | ||||||
|  |  | ||||||
| contract ShellSampler is | contract ShellSampler is | ||||||
| @@ -48,23 +48,17 @@ contract ShellSampler is | |||||||
|         makerTokenAmounts = new uint256[](numSamples); |         makerTokenAmounts = new uint256[](numSamples); | ||||||
|  |  | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 address(_getShellAddress()).staticcall.gas(DEFAULT_CALL_GAS)( |                 IShell(_getShellAddress()).viewOriginSwap | ||||||
|                     abi.encodeWithSelector( |                     {gas: DEFAULT_CALL_GAS} | ||||||
|                         IShell(0).viewOriginSwap.selector, |                     (takerToken, makerToken, takerTokenAmounts[i]) | ||||||
|                         takerToken, |                 returns (uint256 amount) | ||||||
|                         makerToken, |             { | ||||||
|                         takerTokenAmounts[i] |                 makerTokenAmounts[i] = amount; | ||||||
|                     )); |             } catch (bytes memory) { | ||||||
|             uint256 buyAmount = 0; |                 // Swallow failures, leaving all results as zero. | ||||||
|             if (didSucceed) { |  | ||||||
|                 buyAmount = abi.decode(resultData, (uint256)); |  | ||||||
|             } |  | ||||||
|             // Exit early if the amount is too high for the source to serve |  | ||||||
|             if (buyAmount == 0) { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             makerTokenAmounts[i] = buyAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -88,23 +82,17 @@ contract ShellSampler is | |||||||
|         takerTokenAmounts = new uint256[](numSamples); |         takerTokenAmounts = new uint256[](numSamples); | ||||||
|  |  | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 address(_getShellAddress()).staticcall.gas(DEFAULT_CALL_GAS)( |                 IShell(_getShellAddress()).viewTargetSwap | ||||||
|                     abi.encodeWithSelector( |                     {gas: DEFAULT_CALL_GAS} | ||||||
|                         IShell(0).viewTargetSwap.selector, |                     (takerToken, makerToken, makerTokenAmounts[i]) | ||||||
|                         takerToken, |                 returns (uint256 amount) | ||||||
|                         makerToken, |             { | ||||||
|                         makerTokenAmounts[i] |                 takerTokenAmounts[i] = amount; | ||||||
|                     )); |             } catch (bytes memory) { | ||||||
|             uint256 sellAmount = 0; |                 // Swallow failures, leaving all results as zero. | ||||||
|             if (didSucceed) { |  | ||||||
|                 sellAmount = abi.decode(resultData, (uint256)); |  | ||||||
|             } |  | ||||||
|             // Exit early if the amount is too high for the source to serve |  | ||||||
|             if (sellAmount == 0) { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             takerTokenAmounts[i] = sellAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "./interfaces/IUniswapV2Router01.sol"; | import "./interfaces/IUniswapV2Router01.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -47,21 +47,17 @@ contract SushiSwapSampler is | |||||||
|         uint256 numSamples = takerTokenAmounts.length; |         uint256 numSamples = takerTokenAmounts.length; | ||||||
|         makerTokenAmounts = new uint256[](numSamples); |         makerTokenAmounts = new uint256[](numSamples); | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 router.staticcall.gas(SUSHISWAP_CALL_GAS)( |                 IUniswapV2Router01(router).getAmountsOut | ||||||
|                     abi.encodeWithSelector( |                     {gas: SUSHISWAP_CALL_GAS} | ||||||
|                         IUniswapV2Router01(0).getAmountsOut.selector, |                     (takerTokenAmounts[i], path) | ||||||
|                         takerTokenAmounts[i], |                 returns (uint256[] memory amounts) | ||||||
|                         path |             { | ||||||
|                     )); |                 makerTokenAmounts[i] = amounts[path.length - 1]; | ||||||
|             uint256 buyAmount = 0; |             } catch (bytes memory) { | ||||||
|             if (didSucceed) { |                 // Swallow failures, leaving all results as zero. | ||||||
|                 // solhint-disable-next-line indent |  | ||||||
|                 buyAmount = abi.decode(resultData, (uint256[]))[path.length - 1]; |  | ||||||
|             } else { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             makerTokenAmounts[i] = buyAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -83,21 +79,17 @@ contract SushiSwapSampler is | |||||||
|         uint256 numSamples = makerTokenAmounts.length; |         uint256 numSamples = makerTokenAmounts.length; | ||||||
|         takerTokenAmounts = new uint256[](numSamples); |         takerTokenAmounts = new uint256[](numSamples); | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 router.staticcall.gas(SUSHISWAP_CALL_GAS)( |                 IUniswapV2Router01(router).getAmountsIn | ||||||
|                     abi.encodeWithSelector( |                     {gas: SUSHISWAP_CALL_GAS} | ||||||
|                         IUniswapV2Router01(0).getAmountsIn.selector, |                     (makerTokenAmounts[i], path) | ||||||
|                         makerTokenAmounts[i], |                 returns (uint256[] memory amounts) | ||||||
|                         path |             { | ||||||
|                     )); |                 takerTokenAmounts[i] = amounts[0]; | ||||||
|             uint256 sellAmount = 0; |             } catch (bytes memory) { | ||||||
|             if (didSucceed) { |                 // Swallow failures, leaving all results as zero. | ||||||
|                 // solhint-disable-next-line indent |  | ||||||
|                 sellAmount = abi.decode(resultData, (uint256[]))[0]; |  | ||||||
|             } else { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             takerTokenAmounts[i] = sellAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,14 +16,14 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/LibBytes.sol"; | import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
| contract TwoHopSampler { | contract TwoHopSampler { | ||||||
|     using LibBytes for bytes; |     using LibBytesV06 for bytes; | ||||||
|  |  | ||||||
|     struct HopInfo { |     struct HopInfo { | ||||||
|         uint256 sourceIndex; |         uint256 sourceIndex; | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,19 +16,25 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-asset-proxy/contracts/src/interfaces/IUniswapExchangeFactory.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "@0x/contracts-erc20/contracts/src/LibERC20Token.sol"; |  | ||||||
| import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol"; |  | ||||||
| import "@0x/contracts-exchange-libs/contracts/src/LibMath.sol"; |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; |  | ||||||
| import "@0x/contracts-utils/contracts/src/LibBytes.sol"; |  | ||||||
| import "./interfaces/IUniswapExchangeQuotes.sol"; | import "./interfaces/IUniswapExchangeQuotes.sol"; | ||||||
| import "./SamplerUtils.sol"; | import "./SamplerUtils.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | interface IUniswapExchangeFactory { | ||||||
|  |  | ||||||
|  |     /// @dev Get the exchange for a token. | ||||||
|  |     /// @param tokenAddress The address of the token contract. | ||||||
|  |     function getExchange(address tokenAddress) | ||||||
|  |         external | ||||||
|  |         view | ||||||
|  |         returns (address); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| contract UniswapSampler is | contract UniswapSampler is | ||||||
|     DeploymentConstants, |     DeploymentConstants, | ||||||
|     SamplerUtils |     SamplerUtils | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-utils/contracts/src/DeploymentConstants.sol"; | import "./DeploymentConstants.sol"; | ||||||
| import "./interfaces/IUniswapV2Router01.sol"; | import "./interfaces/IUniswapV2Router01.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -45,21 +45,17 @@ contract UniswapV2Sampler is | |||||||
|         uint256 numSamples = takerTokenAmounts.length; |         uint256 numSamples = takerTokenAmounts.length; | ||||||
|         makerTokenAmounts = new uint256[](numSamples); |         makerTokenAmounts = new uint256[](numSamples); | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 _getUniswapV2Router01Address().staticcall.gas(UNISWAPV2_CALL_GAS)( |                 IUniswapV2Router01(_getUniswapV2Router01Address()).getAmountsOut | ||||||
|                     abi.encodeWithSelector( |                     {gas: UNISWAPV2_CALL_GAS} | ||||||
|                         IUniswapV2Router01(0).getAmountsOut.selector, |                     (takerTokenAmounts[i], path) | ||||||
|                         takerTokenAmounts[i], |                 returns (uint256[] memory amounts) | ||||||
|                         path |             { | ||||||
|                     )); |                 makerTokenAmounts[i] = amounts[path.length - 1]; | ||||||
|             uint256 buyAmount = 0; |             } catch (bytes memory) { | ||||||
|             if (didSucceed) { |                 // Swallow failures, leaving all results as zero. | ||||||
|                 // solhint-disable-next-line indent |  | ||||||
|                 buyAmount = abi.decode(resultData, (uint256[]))[path.length - 1]; |  | ||||||
|             } else { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             makerTokenAmounts[i] = buyAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -79,21 +75,17 @@ contract UniswapV2Sampler is | |||||||
|         uint256 numSamples = makerTokenAmounts.length; |         uint256 numSamples = makerTokenAmounts.length; | ||||||
|         takerTokenAmounts = new uint256[](numSamples); |         takerTokenAmounts = new uint256[](numSamples); | ||||||
|         for (uint256 i = 0; i < numSamples; i++) { |         for (uint256 i = 0; i < numSamples; i++) { | ||||||
|             (bool didSucceed, bytes memory resultData) = |             try | ||||||
|                 _getUniswapV2Router01Address().staticcall.gas(UNISWAPV2_CALL_GAS)( |                 IUniswapV2Router01(_getUniswapV2Router01Address()).getAmountsIn | ||||||
|                     abi.encodeWithSelector( |                     {gas: UNISWAPV2_CALL_GAS} | ||||||
|                         IUniswapV2Router01(0).getAmountsIn.selector, |                     (makerTokenAmounts[i], path) | ||||||
|                         makerTokenAmounts[i], |                 returns (uint256[] memory amounts) | ||||||
|                         path |             { | ||||||
|                     )); |                 takerTokenAmounts[i] = amounts[0]; | ||||||
|             uint256 sellAmount = 0; |             } catch (bytes memory) { | ||||||
|             if (didSucceed) { |                 // Swallow failures, leaving all results as zero. | ||||||
|                 // solhint-disable-next-line indent |  | ||||||
|                 sellAmount = abi.decode(resultData, (uint256[]))[0]; |  | ||||||
|             } else { |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             takerTokenAmounts[i] = sellAmount; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface IBalancer { | interface IBalancer { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| // solhint-disable func-name-mixedcase | // solhint-disable func-name-mixedcase | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface IEth2Dai { | interface IEth2Dai { | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
| // Keepin everything together | // Keepin everything together | ||||||
| interface IKyberNetwork { | interface IKyberNetwork { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface ILiquidityProvider { | interface ILiquidityProvider { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface ILiquidityProviderRegistry { | interface ILiquidityProviderRegistry { | ||||||
| @@ -25,7 +25,7 @@ interface ILiquidityProviderRegistry { | |||||||
|     ///      (takerToken, makerToken), reverting if the pool does not exist. |     ///      (takerToken, makerToken), reverting if the pool does not exist. | ||||||
|     /// @param takerToken Taker asset managed by liquidity provider. |     /// @param takerToken Taker asset managed by liquidity provider. | ||||||
|     /// @param makerToken Maker asset managed by liquidity provider. |     /// @param makerToken Maker asset managed by liquidity provider. | ||||||
|     /// @return Address of the liquidity provider. |     /// @return providerAddress Address of the liquidity provider. | ||||||
|     function getLiquidityProviderForMarket( |     function getLiquidityProviderForMarket( | ||||||
|         address takerToken, |         address takerToken, | ||||||
|         address makerToken |         address makerToken | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface IMStable { | interface IMStable { | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
| 
 | 
 | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| interface IMooniswapRegistry { | interface IMooniswapRegistry { | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface IMultiBridge { | interface IMultiBridge { | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface IShell { | interface IShell { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface IUniswapExchangeQuotes { | interface IUniswapExchangeQuotes { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| */ | */ | ||||||
|  |  | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
|  |  | ||||||
|  |  | ||||||
| interface IUniswapV2Router01 { | interface IUniswapV2Router01 { | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -35,4 +35,4 @@ contract DummyLiquidityProvider | |||||||
|     { |     { | ||||||
|         takerTokenAmount = buyAmount + 1; |         takerTokenAmount = buyAmount + 1; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -26,7 +26,7 @@ contract DummyLiquidityProviderRegistry | |||||||
|     /// @dev Returns the address of pool for a market given market (xAsset, yAsset), or reverts if pool does not exist. |     /// @dev Returns the address of pool for a market given market (xAsset, yAsset), or reverts if pool does not exist. | ||||||
|     /// @param xToken First asset managed by pool. |     /// @param xToken First asset managed by pool. | ||||||
|     /// @param yToken Second asset managed by pool. |     /// @param yToken Second asset managed by pool. | ||||||
|     /// @return Address of pool. |     /// @return poolAddress Address of pool. | ||||||
|     function getLiquidityProviderForMarket( |     function getLiquidityProviderForMarket( | ||||||
|         address xToken, |         address xToken, | ||||||
|         address yToken |         address yToken | ||||||
| @@ -41,4 +41,4 @@ contract DummyLiquidityProviderRegistry | |||||||
|             "Registry/MARKET_PAIR_NOT_SET" |             "Registry/MARKET_PAIR_NOT_SET" | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  |  | ||||||
|   Copyright 2019 ZeroEx Intl. |   Copyright 2020 ZeroEx Intl. | ||||||
|  |  | ||||||
|   Licensed under the Apache License, Version 2.0 (the "License"); |   Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|   you may not use this file except in compliance with the License. |   you may not use this file except in compliance with the License. | ||||||
| @@ -15,12 +15,9 @@ | |||||||
|   limitations under the License. |   limitations under the License. | ||||||
|  |  | ||||||
| */ | */ | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-asset-proxy/contracts/src/interfaces/IUniswapExchangeFactory.sol"; |  | ||||||
| import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; |  | ||||||
| import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol"; |  | ||||||
| import "../src/ERC20BridgeSampler.sol"; | import "../src/ERC20BridgeSampler.sol"; | ||||||
| import "../src/interfaces/IEth2Dai.sol"; | import "../src/interfaces/IEth2Dai.sol"; | ||||||
| import "../src/interfaces/IKyberNetwork.sol"; | import "../src/interfaces/IKyberNetwork.sol"; | ||||||
| @@ -128,6 +125,7 @@ contract TestERC20BridgeSamplerUniswapExchange is | |||||||
|     function getEthToTokenInputPrice( |     function getEthToTokenInputPrice( | ||||||
|         uint256 ethSold |         uint256 ethSold | ||||||
|     ) |     ) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (uint256 tokensBought) |         returns (uint256 tokensBought) | ||||||
| @@ -145,6 +143,7 @@ contract TestERC20BridgeSamplerUniswapExchange is | |||||||
|     function getEthToTokenOutputPrice( |     function getEthToTokenOutputPrice( | ||||||
|         uint256 tokensBought |         uint256 tokensBought | ||||||
|     ) |     ) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (uint256 ethSold) |         returns (uint256 ethSold) | ||||||
| @@ -162,6 +161,7 @@ contract TestERC20BridgeSamplerUniswapExchange is | |||||||
|     function getTokenToEthInputPrice( |     function getTokenToEthInputPrice( | ||||||
|         uint256 tokensSold |         uint256 tokensSold | ||||||
|     ) |     ) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (uint256 ethBought) |         returns (uint256 ethBought) | ||||||
| @@ -179,6 +179,7 @@ contract TestERC20BridgeSamplerUniswapExchange is | |||||||
|     function getTokenToEthOutputPrice( |     function getTokenToEthOutputPrice( | ||||||
|         uint256 ethBought |         uint256 ethBought | ||||||
|     ) |     ) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (uint256 tokensSold) |         returns (uint256 tokensSold) | ||||||
| @@ -203,6 +204,7 @@ contract TestERC20BridgeSamplerUniswapV2Router01 is | |||||||
|  |  | ||||||
|     // Deterministic `IUniswapV2Router01.getAmountsOut()`. |     // Deterministic `IUniswapV2Router01.getAmountsOut()`. | ||||||
|     function getAmountsOut(uint256 amountIn, address[] calldata path) |     function getAmountsOut(uint256 amountIn, address[] calldata path) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (uint256[] memory amounts) |         returns (uint256[] memory amounts) | ||||||
| @@ -223,6 +225,7 @@ contract TestERC20BridgeSamplerUniswapV2Router01 is | |||||||
|  |  | ||||||
|     // Deterministic `IUniswapV2Router01.getAmountsInt()`. |     // Deterministic `IUniswapV2Router01.getAmountsInt()`. | ||||||
|     function getAmountsIn(uint256 amountOut, address[] calldata path) |     function getAmountsIn(uint256 amountOut, address[] calldata path) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (uint256[] memory amounts) |         returns (uint256[] memory amounts) | ||||||
| @@ -333,6 +336,7 @@ contract TestERC20BridgeSamplerKyberNetwork is | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     function _getKyberNetworkProxyAddress() |     function _getKyberNetworkProxyAddress() | ||||||
|  |         override | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (address) |         returns (address) | ||||||
| @@ -341,6 +345,7 @@ contract TestERC20BridgeSamplerKyberNetwork is | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     function _getKyberHintHandlerAddress() |     function _getKyberHintHandlerAddress() | ||||||
|  |         override | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (address) |         returns (address) | ||||||
| @@ -362,6 +367,7 @@ contract TestERC20BridgeSamplerEth2Dai is | |||||||
|         address payToken, |         address payToken, | ||||||
|         uint256 payAmount |         uint256 payAmount | ||||||
|     ) |     ) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (uint256 buyAmount) |         returns (uint256 buyAmount) | ||||||
| @@ -381,6 +387,7 @@ contract TestERC20BridgeSamplerEth2Dai is | |||||||
|         address buyToken, |         address buyToken, | ||||||
|         uint256 buyAmount |         uint256 buyAmount | ||||||
|     ) |     ) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (uint256 payAmount) |         returns (uint256 payAmount) | ||||||
| @@ -414,6 +421,7 @@ contract TestERC20BridgeSamplerUniswapExchangeFactory is | |||||||
|  |  | ||||||
|     // `IUniswapExchangeFactory.getExchange()`. |     // `IUniswapExchangeFactory.getExchange()`. | ||||||
|     function getExchange(address tokenAddress) |     function getExchange(address tokenAddress) | ||||||
|  |         override | ||||||
|         external |         external | ||||||
|         view |         view | ||||||
|         returns (address) |         returns (address) | ||||||
| @@ -432,7 +440,7 @@ contract TestERC20BridgeSampler is | |||||||
|     TestERC20BridgeSamplerEth2Dai public eth2Dai; |     TestERC20BridgeSamplerEth2Dai public eth2Dai; | ||||||
|     TestERC20BridgeSamplerKyberNetwork public kyber; |     TestERC20BridgeSamplerKyberNetwork public kyber; | ||||||
|  |  | ||||||
|     uint8 private constant MAX_ORDER_STATUS = uint8(LibOrder.OrderStatus.CANCELLED) + 1; |     uint8 private constant MAX_ORDER_STATUS = uint8(IExchange.OrderStatus.CANCELLED) + 1; | ||||||
|  |  | ||||||
|     constructor() public ERC20BridgeSampler() { |     constructor() public ERC20BridgeSampler() { | ||||||
|         uniswap = new TestERC20BridgeSamplerUniswapExchangeFactory(); |         uniswap = new TestERC20BridgeSamplerUniswapExchangeFactory(); | ||||||
| @@ -450,10 +458,11 @@ contract TestERC20BridgeSampler is | |||||||
|  |  | ||||||
|     // Overridden to return deterministic states. |     // Overridden to return deterministic states. | ||||||
|     function getOrderFillableTakerAmount( |     function getOrderFillableTakerAmount( | ||||||
|         LibOrder.Order memory order, |         IExchange.Order memory order, | ||||||
|         bytes memory, |         bytes memory, | ||||||
|         IExchange |         IExchange | ||||||
|     ) |     ) | ||||||
|  |         override | ||||||
|         public |         public | ||||||
|         view |         view | ||||||
|         returns (uint256 fillableTakerAmount) |         returns (uint256 fillableTakerAmount) | ||||||
| @@ -463,6 +472,7 @@ contract TestERC20BridgeSampler is | |||||||
|  |  | ||||||
|     // Overriden to return deterministic decimals. |     // Overriden to return deterministic decimals. | ||||||
|     function _getTokenDecimals(address tokenAddress) |     function _getTokenDecimals(address tokenAddress) | ||||||
|  |         override | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (uint8 decimals) |         returns (uint8 decimals) | ||||||
| @@ -472,6 +482,7 @@ contract TestERC20BridgeSampler is | |||||||
|  |  | ||||||
|     // Overriden to point to a custom contract. |     // Overriden to point to a custom contract. | ||||||
|     function _getEth2DaiAddress() |     function _getEth2DaiAddress() | ||||||
|  |         override | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (address eth2daiAddress) |         returns (address eth2daiAddress) | ||||||
| @@ -481,6 +492,7 @@ contract TestERC20BridgeSampler is | |||||||
|  |  | ||||||
|     // Overriden to point to a custom contract. |     // Overriden to point to a custom contract. | ||||||
|     function _getUniswapExchangeFactoryAddress() |     function _getUniswapExchangeFactoryAddress() | ||||||
|  |         override | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (address uniswapAddress) |         returns (address uniswapAddress) | ||||||
| @@ -490,6 +502,7 @@ contract TestERC20BridgeSampler is | |||||||
|  |  | ||||||
|     // Overriden to point to a custom contract. |     // Overriden to point to a custom contract. | ||||||
|     function _getUniswapV2Router01Address() |     function _getUniswapV2Router01Address() | ||||||
|  |         override | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (address uniswapV2RouterAddress) |         returns (address uniswapV2RouterAddress) | ||||||
| @@ -499,6 +512,7 @@ contract TestERC20BridgeSampler is | |||||||
|  |  | ||||||
|     // Overriden to point to a custom contract. |     // Overriden to point to a custom contract. | ||||||
|     function _getKyberNetworkProxyAddress() |     function _getKyberNetworkProxyAddress() | ||||||
|  |         override | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (address kyberAddress) |         returns (address kyberAddress) | ||||||
| @@ -508,6 +522,7 @@ contract TestERC20BridgeSampler is | |||||||
|  |  | ||||||
|     // Overriden to point to a custom contract. |     // Overriden to point to a custom contract. | ||||||
|     function _getKyberHintHandlerAddress() |     function _getKyberHintHandlerAddress() | ||||||
|  |         override | ||||||
|         internal |         internal | ||||||
|         view |         view | ||||||
|         returns (address kyberAddress) |         returns (address kyberAddress) | ||||||
|   | |||||||
| @@ -15,11 +15,9 @@ | |||||||
|   limitations under the License. |   limitations under the License. | ||||||
|  |  | ||||||
| */ | */ | ||||||
| pragma solidity ^0.5.9; | pragma solidity ^0.6; | ||||||
| pragma experimental ABIEncoderV2; | pragma experimental ABIEncoderV2; | ||||||
|  |  | ||||||
| import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol"; |  | ||||||
| import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol"; |  | ||||||
| import "../src/NativeOrderSampler.sol"; | import "../src/NativeOrderSampler.sol"; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -43,7 +41,7 @@ contract TestNativeOrderSamplerToken { | |||||||
| contract TestNativeOrderSampler is | contract TestNativeOrderSampler is | ||||||
|     NativeOrderSampler |     NativeOrderSampler | ||||||
| { | { | ||||||
|     uint8 private constant MAX_ORDER_STATUS = uint8(LibOrder.OrderStatus.CANCELLED) + 1; |     uint8 private constant MAX_ORDER_STATUS = uint8(IExchange.OrderStatus.CANCELLED) + 1; | ||||||
|     bytes32 private constant VALID_SIGNATURE_HASH = keccak256(hex"01"); |     bytes32 private constant VALID_SIGNATURE_HASH = keccak256(hex"01"); | ||||||
|  |  | ||||||
|     function createTokens(uint256 count) |     function createTokens(uint256 count) | ||||||
| @@ -78,17 +76,17 @@ contract TestNativeOrderSampler is | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // IExchange.getOrderInfo() |     // IExchange.getOrderInfo() | ||||||
|     function getOrderInfo(LibOrder.Order calldata order) |     function getOrderInfo(IExchange.Order calldata order) | ||||||
|         external |         external | ||||||
|         pure |         pure | ||||||
|         returns (LibOrder.OrderInfo memory orderInfo) |         returns (IExchange.OrderInfo memory orderInfo) | ||||||
|     { |     { | ||||||
|         // The order salt determines everything. |         // The order salt determines everything. | ||||||
|         orderInfo.orderHash = keccak256(abi.encode(order.salt)); |         orderInfo.orderHash = keccak256(abi.encode(order.salt)); | ||||||
|         if (uint8(order.salt) == 0xFF) { |         if (uint8(order.salt) == 0xFF) { | ||||||
|             orderInfo.orderStatus = LibOrder.OrderStatus.FULLY_FILLED; |             orderInfo.orderStatus = IExchange.OrderStatus.FULLY_FILLED; | ||||||
|         } else { |         } else { | ||||||
|             orderInfo.orderStatus = LibOrder.OrderStatus.FILLABLE; |             orderInfo.orderStatus = IExchange.OrderStatus.FILLABLE; | ||||||
|         } |         } | ||||||
|         // The expiration time is the filled taker asset amount. |         // The expiration time is the filled taker asset amount. | ||||||
|         orderInfo.orderTakerAssetFilledAmount = order.expirationTimeSeconds; |         orderInfo.orderTakerAssetFilledAmount = order.expirationTimeSeconds; | ||||||
|   | |||||||
| @@ -38,7 +38,7 @@ | |||||||
|     "config": { |     "config": { | ||||||
|         "publicInterfaceContracts": "ERC20BridgeSampler,ILiquidityProvider,ILiquidityProviderRegistry,DummyLiquidityProviderRegistry,DummyLiquidityProvider", |         "publicInterfaceContracts": "ERC20BridgeSampler,ILiquidityProvider,ILiquidityProviderRegistry,DummyLiquidityProviderRegistry,DummyLiquidityProvider", | ||||||
|         "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.", | ||||||
|         "abis": "./test/generated-artifacts/@(ApproximateBuys|BalancerSampler|CurveSampler|DODOSampler|DummyLiquidityProvider|DummyLiquidityProviderRegistry|ERC20BridgeSampler|Eth2DaiSampler|IBalancer|ICurve|IEth2Dai|IKyberNetwork|ILiquidityProvider|ILiquidityProviderRegistry|IMStable|IMooniswap|IMultiBridge|IShell|IUniswapExchangeQuotes|IUniswapV2Router01|KyberSampler|LiquidityProviderSampler|MStableSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|SamplerUtils|ShellSampler|SushiSwapSampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler).json", |         "abis": "./test/generated-artifacts/@(ApproximateBuys|BalancerSampler|CurveSampler|DODOSampler|DeploymentConstants|DummyLiquidityProvider|DummyLiquidityProviderRegistry|ERC20BridgeSampler|Eth2DaiSampler|IBalancer|ICurve|IEth2Dai|IKyberNetwork|ILiquidityProvider|ILiquidityProviderRegistry|IMStable|IMooniswap|IMultiBridge|IShell|IUniswapExchangeQuotes|IUniswapV2Router01|KyberSampler|LiquidityProviderSampler|MStableSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|SamplerUtils|ShellSampler|SushiSwapSampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler).json", | ||||||
|         "postpublish": { |         "postpublish": { | ||||||
|             "assets": [] |             "assets": [] | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | import { ChainId } from '@0x/contract-addresses'; | ||||||
| import { BigNumber, logUtils } from '@0x/utils'; | import { BigNumber, logUtils } from '@0x/utils'; | ||||||
|  |  | ||||||
| import { | import { | ||||||
| @@ -42,7 +43,7 @@ const PROTOCOL_FEE_MULTIPLIER = new BigNumber(70000); | |||||||
| const MARKET_UTILS_AMOUNT_BUFFER_PERCENTAGE = 0.5; | const MARKET_UTILS_AMOUNT_BUFFER_PERCENTAGE = 0.5; | ||||||
|  |  | ||||||
| const DEFAULT_SWAP_QUOTER_OPTS: SwapQuoterOpts = { | const DEFAULT_SWAP_QUOTER_OPTS: SwapQuoterOpts = { | ||||||
|     chainId: MAINNET_CHAIN_ID, |     chainId: ChainId.Mainnet, | ||||||
|     orderRefreshIntervalMs: 10000, // 10 seconds |     orderRefreshIntervalMs: 10000, // 10 seconds | ||||||
|     ...DEFAULT_ORDER_PRUNER_OPTS, |     ...DEFAULT_ORDER_PRUNER_OPTS, | ||||||
|     samplerGasLimit: 250e6, |     samplerGasLimit: 250e6, | ||||||
| @@ -95,6 +96,21 @@ export const DEFAULT_INFO_LOGGER: LogFunction = (obj, msg) => | |||||||
| export const DEFAULT_WARNING_LOGGER: LogFunction = (obj, msg) => | export const DEFAULT_WARNING_LOGGER: LogFunction = (obj, msg) => | ||||||
|     logUtils.warn(`${msg ? `${msg}: ` : ''}${JSON.stringify(obj)}`); |     logUtils.warn(`${msg ? `${msg}: ` : ''}${JSON.stringify(obj)}`); | ||||||
|  |  | ||||||
|  | // This feature flag allows us to merge the price-aware RFQ pricing | ||||||
|  | // project while still controlling when to activate the feature. We plan to do some | ||||||
|  | // data analysis work and address some of the issues with maker fillable amounts | ||||||
|  | // in later milestones. Once the feature is fully rolled out and is providing value | ||||||
|  | // and we have assessed that there is no user impact, we will proceed in cleaning up | ||||||
|  | // the feature flag.  When that time comes, follow this PR to "undo" the feature flag: | ||||||
|  | // https://github.com/0xProject/0x-monorepo/pull/2735 | ||||||
|  | export const IS_PRICE_AWARE_RFQ_ENABLED: boolean = false; | ||||||
|  |  | ||||||
|  | export { | ||||||
|  |     BRIDGE_ADDRESSES_BY_CHAIN, | ||||||
|  |     DEFAULT_FEE_SCHEDULE, | ||||||
|  |     DEFAULT_GAS_SCHEDULE, | ||||||
|  | } from './utils/market_operation_utils/constants'; | ||||||
|  |  | ||||||
| export const constants = { | export const constants = { | ||||||
|     ETH_GAS_STATION_API_URL, |     ETH_GAS_STATION_API_URL, | ||||||
|     PROTOCOL_FEE_MULTIPLIER, |     PROTOCOL_FEE_MULTIPLIER, | ||||||
| @@ -122,12 +138,3 @@ export const constants = { | |||||||
|     DEFAULT_INFO_LOGGER, |     DEFAULT_INFO_LOGGER, | ||||||
|     DEFAULT_WARNING_LOGGER, |     DEFAULT_WARNING_LOGGER, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // This feature flag allows us to merge the price-aware RFQ pricing |  | ||||||
| // project while still controlling when to activate the feature. We plan to do some |  | ||||||
| // data analysis work and address some of the issues with maker fillable amounts |  | ||||||
| // in later milestones. Once the feature is fully rolled out and is providing value |  | ||||||
| // and we have assessed that there is no user impact, we will proceed in cleaning up |  | ||||||
| // the feature flag.  When that time comes, follow this PR to "undo" the feature flag: |  | ||||||
| // https://github.com/0xProject/0x-monorepo/pull/2735 |  | ||||||
| export const IS_PRICE_AWARE_RFQ_ENABLED: boolean = false; |  | ||||||
|   | |||||||
| @@ -88,6 +88,7 @@ export { getSwapMinBuyAmount } from './quote_consumers/utils'; | |||||||
| export { SwapQuoter } from './swap_quoter'; | export { SwapQuoter } from './swap_quoter'; | ||||||
| export { | export { | ||||||
|     AffiliateFee, |     AffiliateFee, | ||||||
|  |     AssetSwapperContractAddresses, | ||||||
|     CalldataInfo, |     CalldataInfo, | ||||||
|     ExchangeProxyContractOpts, |     ExchangeProxyContractOpts, | ||||||
|     ExchangeProxyRefundReceiver, |     ExchangeProxyRefundReceiver, | ||||||
| @@ -119,7 +120,11 @@ export { | |||||||
|     SwapQuoterRfqtOpts, |     SwapQuoterRfqtOpts, | ||||||
| } from './types'; | } from './types'; | ||||||
| export { affiliateFeeUtils } from './utils/affiliate_fee_utils'; | export { affiliateFeeUtils } from './utils/affiliate_fee_utils'; | ||||||
| export { SOURCE_FLAGS } from './utils/market_operation_utils/constants'; | export { | ||||||
|  |     BRIDGE_ADDRESSES_BY_CHAIN, | ||||||
|  |     DEFAULT_GAS_SCHEDULE, | ||||||
|  |     SOURCE_FLAGS, | ||||||
|  | } from './utils/market_operation_utils/constants'; | ||||||
| export { | export { | ||||||
|     Parameters, |     Parameters, | ||||||
|     SamplerContractCall, |     SamplerContractCall, | ||||||
| @@ -150,13 +155,13 @@ export { | |||||||
|     NativeCollapsedFill, |     NativeCollapsedFill, | ||||||
|     NativeFillData, |     NativeFillData, | ||||||
|     OptimizedMarketOrder, |     OptimizedMarketOrder, | ||||||
|  |     SnowSwapFillData, | ||||||
|  |     SnowSwapInfo, | ||||||
|     SourceInfo, |     SourceInfo, | ||||||
|     SourceQuoteOperation, |     SourceQuoteOperation, | ||||||
|     SushiSwapFillData, |     SushiSwapFillData, | ||||||
|     SwerveFillData, |     SwerveFillData, | ||||||
|     SwerveInfo, |     SwerveInfo, | ||||||
|     SnowSwapFillData, |  | ||||||
|     SnowSwapInfo, |  | ||||||
|     TokenAdjacencyGraph, |     TokenAdjacencyGraph, | ||||||
|     UniswapV2FillData, |     UniswapV2FillData, | ||||||
| } from './utils/market_operation_utils/types'; | } from './utils/market_operation_utils/types'; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import { ContractAddresses, getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; | import { getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; | ||||||
| import { DevUtilsContract } from '@0x/contract-wrappers'; | import { DevUtilsContract } from '@0x/contract-wrappers'; | ||||||
| import { schemas } from '@0x/json-schemas'; | import { schemas } from '@0x/json-schemas'; | ||||||
| import { assetDataUtils, SignedOrder } from '@0x/order-utils'; | import { assetDataUtils, SignedOrder } from '@0x/order-utils'; | ||||||
| @@ -8,8 +8,9 @@ import { BlockParamLiteral, SupportedProvider, ZeroExProvider } from 'ethereum-t | |||||||
| import * as _ from 'lodash'; | import * as _ from 'lodash'; | ||||||
|  |  | ||||||
| import { artifacts } from './artifacts'; | import { artifacts } from './artifacts'; | ||||||
| import { constants, IS_PRICE_AWARE_RFQ_ENABLED } from './constants'; | import { BRIDGE_ADDRESSES_BY_CHAIN, constants, IS_PRICE_AWARE_RFQ_ENABLED } from './constants'; | ||||||
| import { | import { | ||||||
|  |     AssetSwapperContractAddresses, | ||||||
|     CalculateSwapQuoteOpts, |     CalculateSwapQuoteOpts, | ||||||
|     LiquidityForTakerMakerAssetDataPair, |     LiquidityForTakerMakerAssetDataPair, | ||||||
|     MarketBuySwapQuote, |     MarketBuySwapQuote, | ||||||
| @@ -48,7 +49,7 @@ export class SwapQuoter { | |||||||
|     public readonly expiryBufferMs: number; |     public readonly expiryBufferMs: number; | ||||||
|     public readonly chainId: number; |     public readonly chainId: number; | ||||||
|     public readonly permittedOrderFeeTypes: Set<OrderPrunerPermittedFeeTypes>; |     public readonly permittedOrderFeeTypes: Set<OrderPrunerPermittedFeeTypes>; | ||||||
|     private readonly _contractAddresses: ContractAddresses; |     private readonly _contractAddresses: AssetSwapperContractAddresses; | ||||||
|     private readonly _protocolFeeUtils: ProtocolFeeUtils; |     private readonly _protocolFeeUtils: ProtocolFeeUtils; | ||||||
|     private readonly _swapQuoteCalculator: SwapQuoteCalculator; |     private readonly _swapQuoteCalculator: SwapQuoteCalculator; | ||||||
|     private readonly _devUtilsContract: DevUtilsContract; |     private readonly _devUtilsContract: DevUtilsContract; | ||||||
| @@ -178,7 +179,10 @@ export class SwapQuoter { | |||||||
|         this.permittedOrderFeeTypes = permittedOrderFeeTypes; |         this.permittedOrderFeeTypes = permittedOrderFeeTypes; | ||||||
|  |  | ||||||
|         this._rfqtOptions = rfqt; |         this._rfqtOptions = rfqt; | ||||||
|         this._contractAddresses = options.contractAddresses || getContractAddressesForChainOrThrow(chainId); |         this._contractAddresses = options.contractAddresses || { | ||||||
|  |             ...getContractAddressesForChainOrThrow(chainId), | ||||||
|  |             ...BRIDGE_ADDRESSES_BY_CHAIN[chainId], | ||||||
|  |         }; | ||||||
|         this._devUtilsContract = new DevUtilsContract(this._contractAddresses.devUtils, provider); |         this._devUtilsContract = new DevUtilsContract(this._contractAddresses.devUtils, provider); | ||||||
|         this._protocolFeeUtils = ProtocolFeeUtils.getInstance( |         this._protocolFeeUtils = ProtocolFeeUtils.getInstance( | ||||||
|             constants.PROTOCOL_FEE_UTILS_POLLING_INTERVAL_IN_MS, |             constants.PROTOCOL_FEE_UTILS_POLLING_INTERVAL_IN_MS, | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | import { ChainId } from '@0x/contract-addresses'; | ||||||
| import { BlockParam, ContractAddresses, GethCallOverrides } from '@0x/contract-wrappers'; | import { BlockParam, ContractAddresses, GethCallOverrides } from '@0x/contract-wrappers'; | ||||||
| import { TakerRequestQueryParams } from '@0x/quote-server'; | import { TakerRequestQueryParams } from '@0x/quote-server'; | ||||||
| import { SignedOrder } from '@0x/types'; | import { SignedOrder } from '@0x/types'; | ||||||
| @@ -282,6 +283,8 @@ export interface SwapQuoterRfqtOpts { | |||||||
|     infoLogger?: LogFunction; |     infoLogger?: LogFunction; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export type AssetSwapperContractAddresses = ContractAddresses & BridgeContractAddresses; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * chainId: The ethereum chain id. Defaults to 1 (mainnet). |  * chainId: The ethereum chain id. Defaults to 1 (mainnet). | ||||||
|  * orderRefreshIntervalMs: The interval in ms that getBuyQuoteAsync should trigger an refresh of orders and order states. Defaults to 10000ms (10s). |  * orderRefreshIntervalMs: The interval in ms that getBuyQuoteAsync should trigger an refresh of orders and order states. Defaults to 10000ms (10s). | ||||||
| @@ -290,11 +293,11 @@ export interface SwapQuoterRfqtOpts { | |||||||
|  * samplerGasLimit: The gas limit used when querying the sampler contract. Defaults to 36e6 |  * samplerGasLimit: The gas limit used when querying the sampler contract. Defaults to 36e6 | ||||||
|  */ |  */ | ||||||
| export interface SwapQuoterOpts extends OrderPrunerOpts { | export interface SwapQuoterOpts extends OrderPrunerOpts { | ||||||
|     chainId: number; |     chainId: ChainId; | ||||||
|     orderRefreshIntervalMs: number; |     orderRefreshIntervalMs: number; | ||||||
|     expiryBufferMs: number; |     expiryBufferMs: number; | ||||||
|     ethereumRpcUrl?: string; |     ethereumRpcUrl?: string; | ||||||
|     contractAddresses?: ContractAddresses; |     contractAddresses?: AssetSwapperContractAddresses; | ||||||
|     samplerGasLimit?: number; |     samplerGasLimit?: number; | ||||||
|     liquidityProviderRegistryAddress?: string; |     liquidityProviderRegistryAddress?: string; | ||||||
|     multiBridgeAddress?: string; |     multiBridgeAddress?: string; | ||||||
| @@ -380,3 +383,24 @@ export interface SamplerOverrides { | |||||||
| } | } | ||||||
|  |  | ||||||
| export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; | export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; | ||||||
|  | /** | ||||||
|  |  * The Contract addresses of the deployed Bridges | ||||||
|  |  */ | ||||||
|  | export interface BridgeContractAddresses { | ||||||
|  |     uniswapBridge: string; | ||||||
|  |     uniswapV2Bridge: string; | ||||||
|  |     eth2DaiBridge: string; | ||||||
|  |     kyberBridge: string; | ||||||
|  |     curveBridge: string; | ||||||
|  |     multiBridge: string; | ||||||
|  |     balancerBridge: string; | ||||||
|  |     bancorBridge: string; | ||||||
|  |     mStableBridge: string; | ||||||
|  |     mooniswapBridge: string; | ||||||
|  |     sushiswapBridge: string; | ||||||
|  |     shellBridge: string; | ||||||
|  |     dodoBridge: string; | ||||||
|  |     creamBridge: string; | ||||||
|  |     swerveBridge: string; | ||||||
|  |     snowswapBridge: string; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,33 +1,51 @@ | |||||||
|  | import { ChainId } from '@0x/contract-addresses'; | ||||||
| import { BigNumber } from '@0x/utils'; | import { BigNumber } from '@0x/utils'; | ||||||
|  |  | ||||||
|  | import { BridgeContractAddresses } from '../../types'; | ||||||
|  |  | ||||||
| import { SourceFilters } from './source_filters'; | import { SourceFilters } from './source_filters'; | ||||||
| import { CurveFunctionSelectors, CurveInfo, ERC20BridgeSource, GetMarketOrdersOpts } from './types'; | import { | ||||||
|  |     CurveFillData, | ||||||
|  |     CurveFunctionSelectors, | ||||||
|  |     CurveInfo, | ||||||
|  |     DODOFillData, | ||||||
|  |     ERC20BridgeSource, | ||||||
|  |     FeeSchedule, | ||||||
|  |     FillData, | ||||||
|  |     GetMarketOrdersOpts, | ||||||
|  |     MultiHopFillData, | ||||||
|  |     SushiSwapFillData, | ||||||
|  |     UniswapV2FillData, | ||||||
|  | } from './types'; | ||||||
|  |  | ||||||
| // tslint:disable: custom-no-magic-numbers no-bitwise | // tslint:disable: custom-no-magic-numbers no-bitwise | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Valid sources for market sell. |  * Valid sources for market sell. | ||||||
|  */ |  */ | ||||||
| export const SELL_SOURCE_FILTER = new SourceFilters([ | export const SELL_SOURCE_FILTER = new SourceFilters( | ||||||
|     ERC20BridgeSource.Native, |     [ | ||||||
|     ERC20BridgeSource.Uniswap, |         ERC20BridgeSource.Native, | ||||||
|     ERC20BridgeSource.UniswapV2, |         ERC20BridgeSource.Uniswap, | ||||||
|     ERC20BridgeSource.Eth2Dai, |         ERC20BridgeSource.UniswapV2, | ||||||
|     ERC20BridgeSource.Kyber, |         ERC20BridgeSource.Eth2Dai, | ||||||
|     ERC20BridgeSource.Curve, |         ERC20BridgeSource.Kyber, | ||||||
|     ERC20BridgeSource.Balancer, |         ERC20BridgeSource.Curve, | ||||||
|     // Bancor is sampled off-chain, but this list should only include on-chain sources (used in ERC20BridgeSampler) |         ERC20BridgeSource.Balancer, | ||||||
|     // ERC20BridgeSource.Bancor, |         // Bancor is sampled off-chain, but this list should only include on-chain sources (used in ERC20BridgeSampler) | ||||||
|     ERC20BridgeSource.MStable, |         // ERC20BridgeSource.Bancor, | ||||||
|     ERC20BridgeSource.Mooniswap, |         ERC20BridgeSource.MStable, | ||||||
|     ERC20BridgeSource.Swerve, |         ERC20BridgeSource.Mooniswap, | ||||||
|     ERC20BridgeSource.SnowSwap, |         ERC20BridgeSource.Swerve, | ||||||
|     ERC20BridgeSource.SushiSwap, |         ERC20BridgeSource.SnowSwap, | ||||||
|     ERC20BridgeSource.Shell, |         ERC20BridgeSource.SushiSwap, | ||||||
|     ERC20BridgeSource.MultiHop, |         ERC20BridgeSource.Shell, | ||||||
|     ERC20BridgeSource.Dodo, |         ERC20BridgeSource.MultiHop, | ||||||
|     ERC20BridgeSource.Cream, |         ERC20BridgeSource.Dodo, | ||||||
| ]); |         ERC20BridgeSource.Cream, | ||||||
|  |     ], | ||||||
|  |     [ERC20BridgeSource.MultiBridge], | ||||||
|  | ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Valid sources for market buy. |  * Valid sources for market buy. | ||||||
| @@ -55,22 +73,10 @@ export const BUY_SOURCE_FILTER = new SourceFilters( | |||||||
|     [ERC20BridgeSource.MultiBridge], |     [ERC20BridgeSource.MultiBridge], | ||||||
| ); | ); | ||||||
|  |  | ||||||
| export const DEFAULT_GET_MARKET_ORDERS_OPTS: GetMarketOrdersOpts = { | /** | ||||||
|     // tslint:disable-next-line: custom-no-magic-numbers |  *  0x Protocol Fee Multiplier | ||||||
|     runLimit: 2 ** 15, |  */ | ||||||
|     excludedSources: [], | export const PROTOCOL_FEE_MULTIPLIER = new BigNumber(70000); | ||||||
|     excludedFeeSources: [], |  | ||||||
|     includedSources: [], |  | ||||||
|     bridgeSlippage: 0.005, |  | ||||||
|     maxFallbackSlippage: 0.05, |  | ||||||
|     numSamples: 13, |  | ||||||
|     sampleDistributionBase: 1.05, |  | ||||||
|     feeSchedule: {}, |  | ||||||
|     gasSchedule: {}, |  | ||||||
|     exchangeProxyOverhead: () => ZERO_AMOUNT, |  | ||||||
|     allowFallback: true, |  | ||||||
|     shouldGenerateQuoteReport: false, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Sources to poll for ETH fee price estimates. |  * Sources to poll for ETH fee price estimates. | ||||||
| @@ -283,3 +289,154 @@ export const ONE_SECOND_MS = 1000; | |||||||
| export const NULL_BYTES = '0x'; | export const NULL_BYTES = '0x'; | ||||||
| export const NULL_ADDRESS = '0x0000000000000000000000000000000000000000'; | export const NULL_ADDRESS = '0x0000000000000000000000000000000000000000'; | ||||||
| export const COMPARISON_PRICE_DECIMALS = 5; | export const COMPARISON_PRICE_DECIMALS = 5; | ||||||
|  |  | ||||||
|  | const EMPTY_BRIDGE_ADDRESSES: BridgeContractAddresses = { | ||||||
|  |     uniswapBridge: NULL_ADDRESS, | ||||||
|  |     uniswapV2Bridge: NULL_ADDRESS, | ||||||
|  |     eth2DaiBridge: NULL_ADDRESS, | ||||||
|  |     kyberBridge: NULL_ADDRESS, | ||||||
|  |     curveBridge: NULL_ADDRESS, | ||||||
|  |     multiBridge: NULL_ADDRESS, | ||||||
|  |     balancerBridge: NULL_ADDRESS, | ||||||
|  |     bancorBridge: NULL_ADDRESS, | ||||||
|  |     mStableBridge: NULL_ADDRESS, | ||||||
|  |     mooniswapBridge: NULL_ADDRESS, | ||||||
|  |     sushiswapBridge: NULL_ADDRESS, | ||||||
|  |     shellBridge: NULL_ADDRESS, | ||||||
|  |     dodoBridge: NULL_ADDRESS, | ||||||
|  |     creamBridge: NULL_ADDRESS, | ||||||
|  |     snowswapBridge: NULL_ADDRESS, | ||||||
|  |     swerveBridge: NULL_ADDRESS, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const BRIDGE_ADDRESSES_BY_CHAIN: { [chainId in ChainId]: BridgeContractAddresses } = { | ||||||
|  |     [ChainId.Mainnet]: { | ||||||
|  |         uniswapBridge: '0x36691c4f426eb8f42f150ebde43069a31cb080ad', | ||||||
|  |         uniswapV2Bridge: '0xdcd6011f4c6b80e470d9487f5871a0cba7c93f48', | ||||||
|  |         kyberBridge: '0xadd97271402590564ddd8ad23cb5317b1fb0fffb', | ||||||
|  |         eth2DaiBridge: '0x991c745401d5b5e469b8c3e2cb02c748f08754f1', | ||||||
|  |         curveBridge: '0x1796cd592d19e3bcd744fbb025bb61a6d8cb2c09', | ||||||
|  |         multiBridge: '0xc03117a8c9bde203f70aa911cb64a7a0df5ba1e1', | ||||||
|  |         balancerBridge: '0xfe01821ca163844203220cd08e4f2b2fb43ae4e4', | ||||||
|  |         bancorBridge: '0x259897d9699553edbdf8538599242354e957fb94', | ||||||
|  |         mStableBridge: '0x2bf04fcea05f0989a14d9afa37aa376baca6b2b3', | ||||||
|  |         mooniswapBridge: '0x02b7eca484ad960fca3f7709e0b2ac81eec3069c', | ||||||
|  |         sushiswapBridge: '0x47ed0262a0b688dcb836d254c6a2e96b6c48a9f5', | ||||||
|  |         shellBridge: '0x21fb3862eed7911e0f8219a077247b849846728d', | ||||||
|  |         dodoBridge: '0xe9da66965a9344aab2167e6813c03f043cc7a6ca', | ||||||
|  |         creamBridge: '0xb9d4bf2c8dab828f4ffb656acdb6c2b497d44f25', | ||||||
|  |         swerveBridge: '0xf9786d5eb1de47fa56a8f7bb387653c6d410bfee', | ||||||
|  |         snowswapBridge: '0xb1dbe83d15236ec10fdb214c6b89774b454754fd', | ||||||
|  |     }, | ||||||
|  |     [ChainId.Kovan]: { | ||||||
|  |         ...EMPTY_BRIDGE_ADDRESSES, | ||||||
|  |         uniswapBridge: '0x0e85f89f29998df65402391478e5924700c0079d', | ||||||
|  |         uniswapV2Bridge: '0x7b3530a635d099de0534dc27e46cd7c57578c3c8', | ||||||
|  |         eth2DaiBridge: '0x2d47147429b474d2e4f83e658015858a1312ed5b', | ||||||
|  |         kyberBridge: '0xaecfa25920f892b6eb496e1f6e84037f59da7f44', | ||||||
|  |         curveBridge: '0x81c0ab53a7352d2e97f682a37cba44e54647eefb', | ||||||
|  |         balancerBridge: '0x407b4128e9ecad8769b2332312a9f655cb9f5f3a', | ||||||
|  |     }, | ||||||
|  |     [ChainId.Rinkeby]: EMPTY_BRIDGE_ADDRESSES, | ||||||
|  |     [ChainId.Ropsten]: EMPTY_BRIDGE_ADDRESSES, | ||||||
|  |     [ChainId.Ganache]: EMPTY_BRIDGE_ADDRESSES, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // tslint:disable:custom-no-magic-numbers | ||||||
|  | export const DEFAULT_GAS_SCHEDULE: FeeSchedule = { | ||||||
|  |     [ERC20BridgeSource.Native]: () => 150e3, | ||||||
|  |     [ERC20BridgeSource.Uniswap]: () => 90e3, | ||||||
|  |     [ERC20BridgeSource.LiquidityProvider]: () => 140e3, | ||||||
|  |     [ERC20BridgeSource.Eth2Dai]: () => 400e3, | ||||||
|  |     [ERC20BridgeSource.Kyber]: () => 500e3, | ||||||
|  |     [ERC20BridgeSource.Curve]: fillData => { | ||||||
|  |         const poolAddress = (fillData as CurveFillData).pool.poolAddress.toLowerCase(); | ||||||
|  |         switch (poolAddress) { | ||||||
|  |             case '0xa5407eae9ba41422680e2e00537571bcc53efbfd': | ||||||
|  |             case '0x93054188d876f558f4a66b2ef1d97d16edf0895b': | ||||||
|  |             case '0x7fc77b5c7614e1533320ea6ddc2eb61fa00a9714': | ||||||
|  |             case '0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7': | ||||||
|  |                 return 150e3; | ||||||
|  |             case '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56': | ||||||
|  |                 return 750e3; | ||||||
|  |             case '0x45f783cce6b7ff23b2ab2d70e416cdb7d6055f51': | ||||||
|  |                 return 850e3; | ||||||
|  |             case '0x79a8c46dea5ada233abaffd40f3a0a2b1e5a4f27': | ||||||
|  |                 return 1e6; | ||||||
|  |             case '0x52ea46506b9cc5ef470c5bf89f17dc28bb35d85c': | ||||||
|  |                 return 600e3; | ||||||
|  |             default: | ||||||
|  |                 throw new Error(`Unrecognized Curve address: ${poolAddress}`); | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     [ERC20BridgeSource.MultiBridge]: () => 350e3, | ||||||
|  |     [ERC20BridgeSource.UniswapV2]: (fillData?: FillData) => { | ||||||
|  |         // TODO: Different base cost if to/from ETH. | ||||||
|  |         let gas = 90e3; | ||||||
|  |         const path = (fillData as UniswapV2FillData).tokenAddressPath; | ||||||
|  |         if (path.length > 2) { | ||||||
|  |             gas += (path.length - 2) * 60e3; // +60k for each hop. | ||||||
|  |         } | ||||||
|  |         return gas; | ||||||
|  |     }, | ||||||
|  |     [ERC20BridgeSource.SushiSwap]: (fillData?: FillData) => { | ||||||
|  |         // TODO: Different base cost if to/from ETH. | ||||||
|  |         let gas = 95e3; | ||||||
|  |         const path = (fillData as SushiSwapFillData).tokenAddressPath; | ||||||
|  |         if (path.length > 2) { | ||||||
|  |             gas += (path.length - 2) * 60e3; // +60k for each hop. | ||||||
|  |         } | ||||||
|  |         return gas; | ||||||
|  |     }, | ||||||
|  |     [ERC20BridgeSource.Balancer]: () => 120e3, | ||||||
|  |     [ERC20BridgeSource.Cream]: () => 300e3, | ||||||
|  |     [ERC20BridgeSource.MStable]: () => 700e3, | ||||||
|  |     [ERC20BridgeSource.Mooniswap]: () => 220e3, | ||||||
|  |     [ERC20BridgeSource.Swerve]: () => 150e3, | ||||||
|  |     [ERC20BridgeSource.Shell]: () => 300e3, | ||||||
|  |     [ERC20BridgeSource.MultiHop]: (fillData?: FillData) => { | ||||||
|  |         const firstHop = (fillData as MultiHopFillData).firstHopSource; | ||||||
|  |         const secondHop = (fillData as MultiHopFillData).secondHopSource; | ||||||
|  |         const firstHopGas = DEFAULT_GAS_SCHEDULE[firstHop.source]!(firstHop.fillData); | ||||||
|  |         const secondHopGas = DEFAULT_GAS_SCHEDULE[secondHop.source]!(secondHop.fillData); | ||||||
|  |         return new BigNumber(firstHopGas) | ||||||
|  |             .plus(secondHopGas) | ||||||
|  |             .plus(30e3) | ||||||
|  |             .toNumber(); | ||||||
|  |     }, | ||||||
|  |     [ERC20BridgeSource.Dodo]: (fillData?: FillData) => { | ||||||
|  |         const isSellBase = (fillData as DODOFillData).isSellBase; | ||||||
|  |         // Sell base is cheaper as it is natively supported | ||||||
|  |         // sell quote requires additional calculation and overhead | ||||||
|  |         return isSellBase ? 440e3 : 540e3; | ||||||
|  |     }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const DEFAULT_FEE_SCHEDULE: FeeSchedule = Object.assign( | ||||||
|  |     {}, | ||||||
|  |     ...(Object.keys(DEFAULT_GAS_SCHEDULE) as ERC20BridgeSource[]).map(k => ({ | ||||||
|  |         [k]: | ||||||
|  |             k === ERC20BridgeSource.Native | ||||||
|  |                 ? (fillData: FillData) => PROTOCOL_FEE_MULTIPLIER.plus(DEFAULT_GAS_SCHEDULE[k]!(fillData)) | ||||||
|  |                 : (fillData: FillData) => DEFAULT_GAS_SCHEDULE[k]!(fillData), | ||||||
|  |     })), | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | // tslint:enable:custom-no-magic-numbers | ||||||
|  |  | ||||||
|  | export const DEFAULT_GET_MARKET_ORDERS_OPTS: GetMarketOrdersOpts = { | ||||||
|  |     // tslint:disable-next-line: custom-no-magic-numbers | ||||||
|  |     runLimit: 2 ** 15, | ||||||
|  |     excludedSources: [], | ||||||
|  |     excludedFeeSources: [], | ||||||
|  |     includedSources: [], | ||||||
|  |     bridgeSlippage: 0.005, | ||||||
|  |     maxFallbackSlippage: 0.05, | ||||||
|  |     numSamples: 13, | ||||||
|  |     sampleDistributionBase: 1.05, | ||||||
|  |     feeSchedule: DEFAULT_FEE_SCHEDULE, | ||||||
|  |     gasSchedule: DEFAULT_GAS_SCHEDULE, | ||||||
|  |     exchangeProxyOverhead: () => ZERO_AMOUNT, | ||||||
|  |     allowFallback: true, | ||||||
|  |     shouldGenerateQuoteReport: false, | ||||||
|  | }; | ||||||
|   | |||||||
| @@ -1,12 +1,11 @@ | |||||||
| import { ContractAddresses } from '@0x/contract-addresses'; |  | ||||||
| import { Web3Wrapper } from '@0x/dev-utils'; |  | ||||||
| import { RFQTIndicativeQuote } from '@0x/quote-server'; | import { RFQTIndicativeQuote } from '@0x/quote-server'; | ||||||
| import { SignedOrder } from '@0x/types'; | import { SignedOrder } from '@0x/types'; | ||||||
| import { BigNumber, NULL_ADDRESS } from '@0x/utils'; | import { BigNumber, NULL_ADDRESS } from '@0x/utils'; | ||||||
|  | import { Web3Wrapper } from '@0x/web3-wrapper'; | ||||||
| import * as _ from 'lodash'; | import * as _ from 'lodash'; | ||||||
|  |  | ||||||
| import { IS_PRICE_AWARE_RFQ_ENABLED } from '../../constants'; | import { IS_PRICE_AWARE_RFQ_ENABLED } from '../../constants'; | ||||||
| import { MarketOperation, Omit } from '../../types'; | import { AssetSwapperContractAddresses, MarketOperation, Omit } from '../../types'; | ||||||
| import { QuoteRequestor } from '../quote_requestor'; | import { QuoteRequestor } from '../quote_requestor'; | ||||||
|  |  | ||||||
| import { generateQuoteReport, QuoteReport } from './../quote_report_generator'; | import { generateQuoteReport, QuoteReport } from './../quote_report_generator'; | ||||||
| @@ -106,7 +105,7 @@ export class MarketOperationUtils { | |||||||
|  |  | ||||||
|     constructor( |     constructor( | ||||||
|         private readonly _sampler: DexOrderSampler, |         private readonly _sampler: DexOrderSampler, | ||||||
|         private readonly contractAddresses: ContractAddresses, |         private readonly contractAddresses: AssetSwapperContractAddresses, | ||||||
|         private readonly _orderDomain: OrderDomain, |         private readonly _orderDomain: OrderDomain, | ||||||
|         private readonly _liquidityProviderRegistry: string = NULL_ADDRESS, |         private readonly _liquidityProviderRegistry: string = NULL_ADDRESS, | ||||||
|         private readonly _tokenAdjacencyGraph: TokenAdjacencyGraph = {}, |         private readonly _tokenAdjacencyGraph: TokenAdjacencyGraph = {}, | ||||||
|   | |||||||
| @@ -1,10 +1,9 @@ | |||||||
| import { ContractAddresses } from '@0x/contract-addresses'; |  | ||||||
| import { assetDataUtils, ERC20AssetData, generatePseudoRandomSalt, orderCalculationUtils } from '@0x/order-utils'; | import { assetDataUtils, ERC20AssetData, generatePseudoRandomSalt, orderCalculationUtils } from '@0x/order-utils'; | ||||||
| import { RFQTIndicativeQuote } from '@0x/quote-server'; | import { RFQTIndicativeQuote } from '@0x/quote-server'; | ||||||
| import { SignedOrder } from '@0x/types'; | import { SignedOrder } from '@0x/types'; | ||||||
| import { AbiEncoder, BigNumber } from '@0x/utils'; | import { AbiEncoder, BigNumber } from '@0x/utils'; | ||||||
|  |  | ||||||
| import { MarketOperation, SignedOrderWithFillableAmounts } from '../../types'; | import { AssetSwapperContractAddresses, MarketOperation, SignedOrderWithFillableAmounts } from '../../types'; | ||||||
|  |  | ||||||
| import { | import { | ||||||
|     ERC20_PROXY_ID, |     ERC20_PROXY_ID, | ||||||
| @@ -135,7 +134,7 @@ export interface CreateOrderFromPathOpts { | |||||||
|     inputToken: string; |     inputToken: string; | ||||||
|     outputToken: string; |     outputToken: string; | ||||||
|     orderDomain: OrderDomain; |     orderDomain: OrderDomain; | ||||||
|     contractAddresses: ContractAddresses; |     contractAddresses: AssetSwapperContractAddresses; | ||||||
|     bridgeSlippage: number; |     bridgeSlippage: number; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -182,9 +181,9 @@ function getBridgeAddressFromFill(fill: CollapsedFill, opts: CreateOrderFromPath | |||||||
|         case ERC20BridgeSource.Curve: |         case ERC20BridgeSource.Curve: | ||||||
|             return opts.contractAddresses.curveBridge; |             return opts.contractAddresses.curveBridge; | ||||||
|         case ERC20BridgeSource.Swerve: |         case ERC20BridgeSource.Swerve: | ||||||
|             return opts.contractAddresses.curveBridge; |             return opts.contractAddresses.swerveBridge; | ||||||
|         case ERC20BridgeSource.SnowSwap: |         case ERC20BridgeSource.SnowSwap: | ||||||
|             return opts.contractAddresses.curveBridge; |             return opts.contractAddresses.snowswapBridge; | ||||||
|         case ERC20BridgeSource.Bancor: |         case ERC20BridgeSource.Bancor: | ||||||
|             return opts.contractAddresses.bancorBridge; |             return opts.contractAddresses.bancorBridge; | ||||||
|         case ERC20BridgeSource.Balancer: |         case ERC20BridgeSource.Balancer: | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import { SupportedProvider } from '@0x/dev-utils'; | import { SupportedProvider } from '@0x/dev-utils'; | ||||||
| import { SignedOrder } from '@0x/types'; | import { SignedOrder } from '@0x/types'; | ||||||
| import { BigNumber } from '@0x/utils'; | import { BigNumber, NULL_ADDRESS } from '@0x/utils'; | ||||||
| import * as _ from 'lodash'; | import * as _ from 'lodash'; | ||||||
|  |  | ||||||
| import { ERC20BridgeSamplerContract } from '../../wrappers'; | import { ERC20BridgeSamplerContract } from '../../wrappers'; | ||||||
| @@ -1054,7 +1054,7 @@ export class SamplerOperations { | |||||||
|         const _sources = BATCH_SOURCE_FILTERS.exclude( |         const _sources = BATCH_SOURCE_FILTERS.exclude( | ||||||
|             liquidityProviderRegistryAddress ? [] : [ERC20BridgeSource.LiquidityProvider], |             liquidityProviderRegistryAddress ? [] : [ERC20BridgeSource.LiquidityProvider], | ||||||
|         ) |         ) | ||||||
|             .exclude(multiBridgeAddress ? [] : [ERC20BridgeSource.MultiBridge]) |             .exclude(multiBridgeAddress || multiBridgeAddress === NULL_ADDRESS ? [] : [ERC20BridgeSource.MultiBridge]) | ||||||
|             .getAllowed(sources); |             .getAllowed(sources); | ||||||
|         return _.flatten( |         return _.flatten( | ||||||
|             _sources.map( |             _sources.map( | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ import { ContractArtifact } from 'ethereum-types'; | |||||||
| import * as ApproximateBuys from '../test/generated-artifacts/ApproximateBuys.json'; | import * as ApproximateBuys from '../test/generated-artifacts/ApproximateBuys.json'; | ||||||
| import * as BalancerSampler from '../test/generated-artifacts/BalancerSampler.json'; | import * as BalancerSampler from '../test/generated-artifacts/BalancerSampler.json'; | ||||||
| import * as CurveSampler from '../test/generated-artifacts/CurveSampler.json'; | import * as CurveSampler from '../test/generated-artifacts/CurveSampler.json'; | ||||||
|  | import * as DeploymentConstants from '../test/generated-artifacts/DeploymentConstants.json'; | ||||||
| import * as DODOSampler from '../test/generated-artifacts/DODOSampler.json'; | import * as DODOSampler from '../test/generated-artifacts/DODOSampler.json'; | ||||||
| import * as DummyLiquidityProvider from '../test/generated-artifacts/DummyLiquidityProvider.json'; | import * as DummyLiquidityProvider from '../test/generated-artifacts/DummyLiquidityProvider.json'; | ||||||
| import * as DummyLiquidityProviderRegistry from '../test/generated-artifacts/DummyLiquidityProviderRegistry.json'; | import * as DummyLiquidityProviderRegistry from '../test/generated-artifacts/DummyLiquidityProviderRegistry.json'; | ||||||
| @@ -44,9 +45,9 @@ export const artifacts = { | |||||||
|     BalancerSampler: BalancerSampler as ContractArtifact, |     BalancerSampler: BalancerSampler as ContractArtifact, | ||||||
|     CurveSampler: CurveSampler as ContractArtifact, |     CurveSampler: CurveSampler as ContractArtifact, | ||||||
|     DODOSampler: DODOSampler as ContractArtifact, |     DODOSampler: DODOSampler as ContractArtifact, | ||||||
|  |     DeploymentConstants: DeploymentConstants as ContractArtifact, | ||||||
|     ERC20BridgeSampler: ERC20BridgeSampler as ContractArtifact, |     ERC20BridgeSampler: ERC20BridgeSampler as ContractArtifact, | ||||||
|     Eth2DaiSampler: Eth2DaiSampler as ContractArtifact, |     Eth2DaiSampler: Eth2DaiSampler as ContractArtifact, | ||||||
|     IMooniswap: IMooniswap as ContractArtifact, |  | ||||||
|     KyberSampler: KyberSampler as ContractArtifact, |     KyberSampler: KyberSampler as ContractArtifact, | ||||||
|     LiquidityProviderSampler: LiquidityProviderSampler as ContractArtifact, |     LiquidityProviderSampler: LiquidityProviderSampler as ContractArtifact, | ||||||
|     MStableSampler: MStableSampler as ContractArtifact, |     MStableSampler: MStableSampler as ContractArtifact, | ||||||
| @@ -66,6 +67,7 @@ export const artifacts = { | |||||||
|     ILiquidityProvider: ILiquidityProvider as ContractArtifact, |     ILiquidityProvider: ILiquidityProvider as ContractArtifact, | ||||||
|     ILiquidityProviderRegistry: ILiquidityProviderRegistry as ContractArtifact, |     ILiquidityProviderRegistry: ILiquidityProviderRegistry as ContractArtifact, | ||||||
|     IMStable: IMStable as ContractArtifact, |     IMStable: IMStable as ContractArtifact, | ||||||
|  |     IMooniswap: IMooniswap as ContractArtifact, | ||||||
|     IMultiBridge: IMultiBridge as ContractArtifact, |     IMultiBridge: IMultiBridge as ContractArtifact, | ||||||
|     IShell: IShell as ContractArtifact, |     IShell: IShell as ContractArtifact, | ||||||
|     IUniswapExchangeQuotes: IUniswapExchangeQuotes as ContractArtifact, |     IUniswapExchangeQuotes: IUniswapExchangeQuotes as ContractArtifact, | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| // tslint:disable: no-unbound-method | // tslint:disable: no-unbound-method | ||||||
| import { getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; | import { ChainId, getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; | ||||||
| import { | import { | ||||||
|     assertRoughlyEquals, |     assertRoughlyEquals, | ||||||
|     constants, |     constants, | ||||||
| @@ -9,10 +9,10 @@ import { | |||||||
|     Numberish, |     Numberish, | ||||||
|     randomAddress, |     randomAddress, | ||||||
| } from '@0x/contracts-test-utils'; | } from '@0x/contracts-test-utils'; | ||||||
| import { Web3Wrapper } from '@0x/dev-utils'; |  | ||||||
| import { assetDataUtils, generatePseudoRandomSalt } from '@0x/order-utils'; | import { assetDataUtils, generatePseudoRandomSalt } from '@0x/order-utils'; | ||||||
| import { AssetProxyId, ERC20BridgeAssetData, SignedOrder } from '@0x/types'; | import { AssetProxyId, ERC20BridgeAssetData, SignedOrder } from '@0x/types'; | ||||||
| import { BigNumber, fromTokenUnitAmount, hexUtils, NULL_ADDRESS } from '@0x/utils'; | import { BigNumber, fromTokenUnitAmount, hexUtils, NULL_ADDRESS } from '@0x/utils'; | ||||||
|  | import { Web3Wrapper } from '@0x/web3-wrapper'; | ||||||
| import * as _ from 'lodash'; | import * as _ from 'lodash'; | ||||||
| import * as TypeMoq from 'typemoq'; | import * as TypeMoq from 'typemoq'; | ||||||
|  |  | ||||||
| @@ -21,6 +21,7 @@ import { IS_PRICE_AWARE_RFQ_ENABLED } from '../src/constants'; | |||||||
| import { getRfqtIndicativeQuotesAsync, MarketOperationUtils } from '../src/utils/market_operation_utils/'; | import { getRfqtIndicativeQuotesAsync, MarketOperationUtils } from '../src/utils/market_operation_utils/'; | ||||||
| import { BalancerPoolsCache } from '../src/utils/market_operation_utils/balancer_utils'; | import { BalancerPoolsCache } from '../src/utils/market_operation_utils/balancer_utils'; | ||||||
| import { | import { | ||||||
|  |     BRIDGE_ADDRESSES_BY_CHAIN, | ||||||
|     BUY_SOURCE_FILTER, |     BUY_SOURCE_FILTER, | ||||||
|     POSITIVE_INF, |     POSITIVE_INF, | ||||||
|     SELL_SOURCE_FILTER, |     SELL_SOURCE_FILTER, | ||||||
| @@ -38,6 +39,7 @@ import { | |||||||
|     ERC20BridgeSource, |     ERC20BridgeSource, | ||||||
|     FillData, |     FillData, | ||||||
|     GenerateOptimizedOrdersOpts, |     GenerateOptimizedOrdersOpts, | ||||||
|  |     GetMarketOrdersOpts, | ||||||
|     MarketSideLiquidity, |     MarketSideLiquidity, | ||||||
|     NativeFillData, |     NativeFillData, | ||||||
| } from '../src/utils/market_operation_utils/types'; | } from '../src/utils/market_operation_utils/types'; | ||||||
| @@ -66,8 +68,12 @@ const SELL_SOURCES = SELL_SOURCE_FILTER.sources; | |||||||
|  |  | ||||||
| // tslint:disable: custom-no-magic-numbers promise-function-async | // tslint:disable: custom-no-magic-numbers promise-function-async | ||||||
| describe('MarketOperationUtils tests', () => { | describe('MarketOperationUtils tests', () => { | ||||||
|     const CHAIN_ID = 1; |     const CHAIN_ID = ChainId.Mainnet; | ||||||
|     const contractAddresses = { ...getContractAddressesForChainOrThrow(CHAIN_ID), multiBridge: NULL_ADDRESS }; |     const contractAddresses = { | ||||||
|  |         ...getContractAddressesForChainOrThrow(CHAIN_ID), | ||||||
|  |         multiBridge: NULL_ADDRESS, | ||||||
|  |         ...BRIDGE_ADDRESSES_BY_CHAIN[CHAIN_ID], | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     function getMockedQuoteRequestor( |     function getMockedQuoteRequestor( | ||||||
|         type: 'indicative' | 'firm', |         type: 'indicative' | 'firm', | ||||||
| @@ -522,13 +528,15 @@ describe('MarketOperationUtils tests', () => { | |||||||
|                 FILL_AMOUNT, |                 FILL_AMOUNT, | ||||||
|                 _.times(NUM_SAMPLES, i => DEFAULT_RATES[ERC20BridgeSource.Native][i]), |                 _.times(NUM_SAMPLES, i => DEFAULT_RATES[ERC20BridgeSource.Native][i]), | ||||||
|             ); |             ); | ||||||
|             const DEFAULT_OPTS = { |             const DEFAULT_OPTS: Partial<GetMarketOrdersOpts> = { | ||||||
|                 numSamples: NUM_SAMPLES, |                 numSamples: NUM_SAMPLES, | ||||||
|                 sampleDistributionBase: 1, |                 sampleDistributionBase: 1, | ||||||
|                 bridgeSlippage: 0, |                 bridgeSlippage: 0, | ||||||
|                 maxFallbackSlippage: 100, |                 maxFallbackSlippage: 100, | ||||||
|                 excludedSources: DEFAULT_EXCLUDED, |                 excludedSources: DEFAULT_EXCLUDED, | ||||||
|                 allowFallback: false, |                 allowFallback: false, | ||||||
|  |                 gasSchedule: {}, | ||||||
|  |                 feeSchedule: {}, | ||||||
|             }; |             }; | ||||||
|  |  | ||||||
|             beforeEach(() => { |             beforeEach(() => { | ||||||
| @@ -1428,7 +1436,7 @@ describe('MarketOperationUtils tests', () => { | |||||||
|                         ...DEFAULT_OPTS, |                         ...DEFAULT_OPTS, | ||||||
|                         numSamples: 4, |                         numSamples: 4, | ||||||
|                         excludedSources: [ |                         excludedSources: [ | ||||||
|                             ...DEFAULT_OPTS.excludedSources, |                             ...(DEFAULT_OPTS.excludedSources as ERC20BridgeSource[]), | ||||||
|                             ERC20BridgeSource.Eth2Dai, |                             ERC20BridgeSource.Eth2Dai, | ||||||
|                             ERC20BridgeSource.Kyber, |                             ERC20BridgeSource.Kyber, | ||||||
|                             ERC20BridgeSource.Bancor, |                             ERC20BridgeSource.Bancor, | ||||||
| @@ -1449,13 +1457,15 @@ describe('MarketOperationUtils tests', () => { | |||||||
|                 FILL_AMOUNT, |                 FILL_AMOUNT, | ||||||
|                 _.times(NUM_SAMPLES, () => DEFAULT_RATES[ERC20BridgeSource.Native][0]), |                 _.times(NUM_SAMPLES, () => DEFAULT_RATES[ERC20BridgeSource.Native][0]), | ||||||
|             ); |             ); | ||||||
|             const DEFAULT_OPTS = { |             const DEFAULT_OPTS: Partial<GetMarketOrdersOpts> = { | ||||||
|                 numSamples: NUM_SAMPLES, |                 numSamples: NUM_SAMPLES, | ||||||
|                 sampleDistributionBase: 1, |                 sampleDistributionBase: 1, | ||||||
|                 bridgeSlippage: 0, |                 bridgeSlippage: 0, | ||||||
|                 maxFallbackSlippage: 100, |                 maxFallbackSlippage: 100, | ||||||
|                 excludedSources: DEFAULT_EXCLUDED, |                 excludedSources: DEFAULT_EXCLUDED, | ||||||
|                 allowFallback: false, |                 allowFallback: false, | ||||||
|  |                 gasSchedule: {}, | ||||||
|  |                 feeSchedule: {}, | ||||||
|             }; |             }; | ||||||
|  |  | ||||||
|             beforeEach(() => { |             beforeEach(() => { | ||||||
| @@ -1869,7 +1879,7 @@ describe('MarketOperationUtils tests', () => { | |||||||
|                         ...DEFAULT_OPTS, |                         ...DEFAULT_OPTS, | ||||||
|                         numSamples: 4, |                         numSamples: 4, | ||||||
|                         excludedSources: [ |                         excludedSources: [ | ||||||
|                             ...DEFAULT_OPTS.excludedSources, |                             ...(DEFAULT_OPTS.excludedSources as ERC20BridgeSource[]), | ||||||
|                             ERC20BridgeSource.Eth2Dai, |                             ERC20BridgeSource.Eth2Dai, | ||||||
|                             ERC20BridgeSource.Kyber, |                             ERC20BridgeSource.Kyber, | ||||||
|                         ], |                         ], | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import { ContractFunctionObj } from '@0x/base-contract'; | import { ContractTxFunctionObj } from '@0x/base-contract'; | ||||||
| import { constants } from '@0x/contracts-test-utils'; | import { constants } from '@0x/contracts-test-utils'; | ||||||
| import { Order } from '@0x/types'; | import { Order } from '@0x/types'; | ||||||
| import { BigNumber, hexUtils } from '@0x/utils'; | import { BigNumber, hexUtils } from '@0x/utils'; | ||||||
| @@ -82,7 +82,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         this._handlers = handlers; |         this._handlers = handlers; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public batchCall(callDatas: string[]): ContractFunctionObj<string[]> { |     public batchCall(callDatas: string[]): ContractTxFunctionObj<string[]> { | ||||||
|         return { |         return { | ||||||
|             ...super.batchCall(callDatas), |             ...super.batchCall(callDatas), | ||||||
|             callAsync: async (..._callArgs: any[]) => callDatas.map(callData => this._callEncodedFunction(callData)), |             callAsync: async (..._callArgs: any[]) => callDatas.map(callData => this._callEncodedFunction(callData)), | ||||||
| @@ -92,7 +92,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|     public getOrderFillableMakerAssetAmounts( |     public getOrderFillableMakerAssetAmounts( | ||||||
|         orders: Order[], |         orders: Order[], | ||||||
|         signatures: string[], |         signatures: string[], | ||||||
|     ): ContractFunctionObj<GetOrderFillableAssetAmountResult> { |     ): ContractTxFunctionObj<GetOrderFillableAssetAmountResult> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.getOrderFillableMakerAssetAmounts, |             super.getOrderFillableMakerAssetAmounts, | ||||||
|             this._handlers.getOrderFillableMakerAssetAmounts, |             this._handlers.getOrderFillableMakerAssetAmounts, | ||||||
| @@ -105,7 +105,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|     public getOrderFillableTakerAssetAmounts( |     public getOrderFillableTakerAssetAmounts( | ||||||
|         orders: Order[], |         orders: Order[], | ||||||
|         signatures: string[], |         signatures: string[], | ||||||
|     ): ContractFunctionObj<GetOrderFillableAssetAmountResult> { |     ): ContractTxFunctionObj<GetOrderFillableAssetAmountResult> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.getOrderFillableTakerAssetAmounts, |             super.getOrderFillableTakerAssetAmounts, | ||||||
|             this._handlers.getOrderFillableTakerAssetAmounts, |             this._handlers.getOrderFillableTakerAssetAmounts, | ||||||
| @@ -120,7 +120,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         takerToken: string, |         takerToken: string, | ||||||
|         makerToken: string, |         makerToken: string, | ||||||
|         takerAssetAmounts: BigNumber[], |         takerAssetAmounts: BigNumber[], | ||||||
|     ): ContractFunctionObj<[string, BigNumber[]]> { |     ): ContractTxFunctionObj<[string, BigNumber[]]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleSellsFromKyberNetwork, |             super.sampleSellsFromKyberNetwork, | ||||||
|             this._handlers.sampleSellsFromKyberNetwork, |             this._handlers.sampleSellsFromKyberNetwork, | ||||||
| @@ -135,7 +135,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         takerToken: string, |         takerToken: string, | ||||||
|         makerToken: string, |         makerToken: string, | ||||||
|         takerAssetAmounts: BigNumber[], |         takerAssetAmounts: BigNumber[], | ||||||
|     ): ContractFunctionObj<BigNumber[]> { |     ): ContractTxFunctionObj<BigNumber[]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleSellsFromEth2Dai, |             super.sampleSellsFromEth2Dai, | ||||||
|             this._handlers.sampleSellsFromEth2Dai, |             this._handlers.sampleSellsFromEth2Dai, | ||||||
| @@ -149,7 +149,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         takerToken: string, |         takerToken: string, | ||||||
|         makerToken: string, |         makerToken: string, | ||||||
|         takerAssetAmounts: BigNumber[], |         takerAssetAmounts: BigNumber[], | ||||||
|     ): ContractFunctionObj<BigNumber[]> { |     ): ContractTxFunctionObj<BigNumber[]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleSellsFromUniswap, |             super.sampleSellsFromUniswap, | ||||||
|             this._handlers.sampleSellsFromUniswap, |             this._handlers.sampleSellsFromUniswap, | ||||||
| @@ -159,7 +159,10 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public sampleSellsFromUniswapV2(path: string[], takerAssetAmounts: BigNumber[]): ContractFunctionObj<BigNumber[]> { |     public sampleSellsFromUniswapV2( | ||||||
|  |         path: string[], | ||||||
|  |         takerAssetAmounts: BigNumber[], | ||||||
|  |     ): ContractTxFunctionObj<BigNumber[]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleSellsFromUniswapV2, |             super.sampleSellsFromUniswapV2, | ||||||
|             this._handlers.sampleSellsFromUniswapV2, |             this._handlers.sampleSellsFromUniswapV2, | ||||||
| @@ -173,7 +176,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         takerToken: string, |         takerToken: string, | ||||||
|         makerToken: string, |         makerToken: string, | ||||||
|         takerAssetAmounts: BigNumber[], |         takerAssetAmounts: BigNumber[], | ||||||
|     ): ContractFunctionObj<[BigNumber[], string]> { |     ): ContractTxFunctionObj<[BigNumber[], string]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleSellsFromLiquidityProviderRegistry, |             super.sampleSellsFromLiquidityProviderRegistry, | ||||||
|             this._handlers.sampleSellsFromLiquidityProviderRegistry, |             this._handlers.sampleSellsFromLiquidityProviderRegistry, | ||||||
| @@ -190,7 +193,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         intermediateToken: string, |         intermediateToken: string, | ||||||
|         makerToken: string, |         makerToken: string, | ||||||
|         takerAssetAmounts: BigNumber[], |         takerAssetAmounts: BigNumber[], | ||||||
|     ): ContractFunctionObj<BigNumber[]> { |     ): ContractTxFunctionObj<BigNumber[]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleSellsFromMultiBridge, |             super.sampleSellsFromMultiBridge, | ||||||
|             this._handlers.sampleSellsFromMultiBridge, |             this._handlers.sampleSellsFromMultiBridge, | ||||||
| @@ -206,7 +209,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         takerToken: string, |         takerToken: string, | ||||||
|         makerToken: string, |         makerToken: string, | ||||||
|         makerAssetAmounts: BigNumber[], |         makerAssetAmounts: BigNumber[], | ||||||
|     ): ContractFunctionObj<BigNumber[]> { |     ): ContractTxFunctionObj<BigNumber[]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleBuysFromEth2Dai, |             super.sampleBuysFromEth2Dai, | ||||||
|             this._handlers.sampleBuysFromEth2Dai, |             this._handlers.sampleBuysFromEth2Dai, | ||||||
| @@ -220,7 +223,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         takerToken: string, |         takerToken: string, | ||||||
|         makerToken: string, |         makerToken: string, | ||||||
|         makerAssetAmounts: BigNumber[], |         makerAssetAmounts: BigNumber[], | ||||||
|     ): ContractFunctionObj<BigNumber[]> { |     ): ContractTxFunctionObj<BigNumber[]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleBuysFromUniswap, |             super.sampleBuysFromUniswap, | ||||||
|             this._handlers.sampleBuysFromUniswap, |             this._handlers.sampleBuysFromUniswap, | ||||||
| @@ -230,7 +233,7 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public sampleBuysFromUniswapV2(path: string[], makerAssetAmounts: BigNumber[]): ContractFunctionObj<BigNumber[]> { |     public sampleBuysFromUniswapV2(path: string[], makerAssetAmounts: BigNumber[]): ContractTxFunctionObj<BigNumber[]> { | ||||||
|         return this._wrapCall( |         return this._wrapCall( | ||||||
|             super.sampleBuysFromUniswapV2, |             super.sampleBuysFromUniswapV2, | ||||||
|             this._handlers.sampleBuysFromUniswapV2, |             this._handlers.sampleBuysFromUniswapV2, | ||||||
| @@ -266,11 +269,11 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     private _wrapCall<TArgs extends any[], TResult>( |     private _wrapCall<TArgs extends any[], TResult>( | ||||||
|         superFn: (this: MockSamplerContract, ...args: TArgs) => ContractFunctionObj<TResult>, |         superFn: (this: MockSamplerContract, ...args: TArgs) => ContractTxFunctionObj<TResult>, | ||||||
|         handler?: (this: MockSamplerContract, ...args: TArgs) => TResult, |         handler?: (this: MockSamplerContract, ...args: TArgs) => TResult, | ||||||
|         // tslint:disable-next-line: trailing-comma |         // tslint:disable-next-line: trailing-comma | ||||||
|         ...args: TArgs |         ...args: TArgs | ||||||
|     ): ContractFunctionObj<TResult> { |     ): ContractTxFunctionObj<TResult> { | ||||||
|         return { |         return { | ||||||
|             ...superFn.call(this, ...args), |             ...superFn.call(this, ...args), | ||||||
|             callAsync: async (..._callArgs: any[]): Promise<TResult> => { |             callAsync: async (..._callArgs: any[]): Promise<TResult> => { | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ export * from '../test/generated-wrappers/approximate_buys'; | |||||||
| export * from '../test/generated-wrappers/balancer_sampler'; | export * from '../test/generated-wrappers/balancer_sampler'; | ||||||
| export * from '../test/generated-wrappers/curve_sampler'; | export * from '../test/generated-wrappers/curve_sampler'; | ||||||
| export * from '../test/generated-wrappers/d_o_d_o_sampler'; | export * from '../test/generated-wrappers/d_o_d_o_sampler'; | ||||||
|  | export * from '../test/generated-wrappers/deployment_constants'; | ||||||
| export * from '../test/generated-wrappers/dummy_liquidity_provider'; | export * from '../test/generated-wrappers/dummy_liquidity_provider'; | ||||||
| export * from '../test/generated-wrappers/dummy_liquidity_provider_registry'; | export * from '../test/generated-wrappers/dummy_liquidity_provider_registry'; | ||||||
| export * from '../test/generated-wrappers/erc20_bridge_sampler'; | export * from '../test/generated-wrappers/erc20_bridge_sampler'; | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ | |||||||
|         "test/generated-artifacts/BalancerSampler.json", |         "test/generated-artifacts/BalancerSampler.json", | ||||||
|         "test/generated-artifacts/CurveSampler.json", |         "test/generated-artifacts/CurveSampler.json", | ||||||
|         "test/generated-artifacts/DODOSampler.json", |         "test/generated-artifacts/DODOSampler.json", | ||||||
|  |         "test/generated-artifacts/DeploymentConstants.json", | ||||||
|         "test/generated-artifacts/DummyLiquidityProvider.json", |         "test/generated-artifacts/DummyLiquidityProvider.json", | ||||||
|         "test/generated-artifacts/DummyLiquidityProviderRegistry.json", |         "test/generated-artifacts/DummyLiquidityProviderRegistry.json", | ||||||
|         "test/generated-artifacts/ERC20BridgeSampler.json", |         "test/generated-artifacts/ERC20BridgeSampler.json", | ||||||
|   | |||||||
| @@ -1,4 +1,13 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |         "version": "5.0.0", | ||||||
|  |         "changes": [ | ||||||
|  |             { | ||||||
|  |                 "note": "Moved Bridge addresses into Asset-swapper", | ||||||
|  |                 "pr": 4 | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|         "version": "4.12.0", |         "version": "4.12.0", | ||||||
|         "changes": [ |         "changes": [ | ||||||
|   | |||||||
| @@ -19,33 +19,19 @@ | |||||||
|         "stakingProxy": "0xa26e80e7dea86279c6d778d702cc413e6cffa777", |         "stakingProxy": "0xa26e80e7dea86279c6d778d702cc413e6cffa777", | ||||||
|         "devUtils": "0x74134cf88b21383713e096a5ecf59e297dc7f547", |         "devUtils": "0x74134cf88b21383713e096a5ecf59e297dc7f547", | ||||||
|         "erc20BridgeProxy": "0x8ed95d1746bf1e4dab58d8ed4724f1ef95b20db0", |         "erc20BridgeProxy": "0x8ed95d1746bf1e4dab58d8ed4724f1ef95b20db0", | ||||||
|         "uniswapBridge": "0x36691c4f426eb8f42f150ebde43069a31cb080ad", |  | ||||||
|         "uniswapV2Bridge": "0xdcd6011f4c6b80e470d9487f5871a0cba7c93f48", |  | ||||||
|         "erc20BridgeSampler": "0xd8c38704c9937ea3312de29f824b4ad3450a5e61", |         "erc20BridgeSampler": "0xd8c38704c9937ea3312de29f824b4ad3450a5e61", | ||||||
|         "kyberBridge": "0xadd97271402590564ddd8ad23cb5317b1fb0fffb", |  | ||||||
|         "eth2DaiBridge": "0x991c745401d5b5e469b8c3e2cb02c748f08754f1", |  | ||||||
|         "chaiBridge": "0x77c31eba23043b9a72d13470f3a3a311344d7438", |         "chaiBridge": "0x77c31eba23043b9a72d13470f3a3a311344d7438", | ||||||
|         "dydxBridge": "0x92af95e37afddac412e5688a9dcc1dd815d4ae53", |         "dydxBridge": "0x92af95e37afddac412e5688a9dcc1dd815d4ae53", | ||||||
|         "godsUnchainedValidator": "0x09a379ef7218bcfd8913faa8b281ebc5a2e0bc04", |         "godsUnchainedValidator": "0x09a379ef7218bcfd8913faa8b281ebc5a2e0bc04", | ||||||
|         "broker": "0xd4690a51044db77d91d7aa8f7a3a5ad5da331af0", |         "broker": "0xd4690a51044db77d91d7aa8f7a3a5ad5da331af0", | ||||||
|         "chainlinkStopLimit": "0xeb27220f95f364e1d9531992c48613f231839f53", |         "chainlinkStopLimit": "0xeb27220f95f364e1d9531992c48613f231839f53", | ||||||
|         "curveBridge": "0x1796cd592d19e3bcd744fbb025bb61a6d8cb2c09", |  | ||||||
|         "maximumGasPrice": "0xe2bfd35306495d11e3c9db0d8de390cda24563cf", |         "maximumGasPrice": "0xe2bfd35306495d11e3c9db0d8de390cda24563cf", | ||||||
|         "dexForwarderBridge": "0xc47b7094f378e54347e281aab170e8cca69d880a", |         "dexForwarderBridge": "0xc47b7094f378e54347e281aab170e8cca69d880a", | ||||||
|         "multiBridge": "0xc03117a8c9bde203f70aa911cb64a7a0df5ba1e1", |  | ||||||
|         "balancerBridge": "0xfe01821ca163844203220cd08e4f2b2fb43ae4e4", |  | ||||||
|         "bancorBridge": "0x259897d9699553edbdf8538599242354e957fb94", |  | ||||||
|         "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e", |         "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e", | ||||||
|         "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", |         "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", | ||||||
|         "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", |         "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", | ||||||
|         "exchangeProxyTransformerDeployer": "0x39dce47a67ad34344eab877eae3ef1fa2a1d50bb", |         "exchangeProxyTransformerDeployer": "0x39dce47a67ad34344eab877eae3ef1fa2a1d50bb", | ||||||
|         "exchangeProxyFlashWallet": "0x22f9dcf4647084d6c31b2765f6910cd85c178c18", |         "exchangeProxyFlashWallet": "0x22f9dcf4647084d6c31b2765f6910cd85c178c18", | ||||||
|         "mStableBridge": "0x2bf04fcea05f0989a14d9afa37aa376baca6b2b3", |  | ||||||
|         "mooniswapBridge": "0x02b7eca484ad960fca3f7709e0b2ac81eec3069c", |  | ||||||
|         "sushiswapBridge": "0x47ed0262a0b688dcb836d254c6a2e96b6c48a9f5", |  | ||||||
|         "shellBridge": "0x21fb3862eed7911e0f8219a077247b849846728d", |  | ||||||
|         "dodoBridge": "0xe9da66965a9344aab2167e6813c03f043cc7a6ca", |  | ||||||
|         "creamBridge": "0xb9d4bf2c8dab828f4ffb656acdb6c2b497d44f25", |  | ||||||
|         "transformers": { |         "transformers": { | ||||||
|             "wethTransformer": "0x68c0bb685099dc7cb5c5ce2b26185945b357383e", |             "wethTransformer": "0x68c0bb685099dc7cb5c5ce2b26185945b357383e", | ||||||
|             "payTakerTransformer": "0x49b9df2c58491764cf40cb052dd4243df63622c7", |             "payTakerTransformer": "0x49b9df2c58491764cf40cb052dd4243df63622c7", | ||||||
| @@ -73,33 +59,19 @@ | |||||||
|         "staking": "0x4af649ffde640ceb34b1afaba3e0bb8e9698cb01", |         "staking": "0x4af649ffde640ceb34b1afaba3e0bb8e9698cb01", | ||||||
|         "stakingProxy": "0x6acab4c9c4e3a0c78435fdb5ad1719c95460a668", |         "stakingProxy": "0x6acab4c9c4e3a0c78435fdb5ad1719c95460a668", | ||||||
|         "erc20BridgeProxy": "0xb344afed348de15eb4a9e180205a2b0739628339", |         "erc20BridgeProxy": "0xb344afed348de15eb4a9e180205a2b0739628339", | ||||||
|         "uniswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "uniswapV2Bridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "eth2DaiBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", |         "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", | ||||||
|         "kyberBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "chaiBridge": "0x0000000000000000000000000000000000000000", |         "chaiBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "dydxBridge": "0x0000000000000000000000000000000000000000", |         "dydxBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "godsUnchainedValidator": "0xd4690a51044db77d91d7aa8f7a3a5ad5da331af0", |         "godsUnchainedValidator": "0xd4690a51044db77d91d7aa8f7a3a5ad5da331af0", | ||||||
|         "broker": "0x4022e3982f326455f0905de3dbc4449999baf2dc", |         "broker": "0x4022e3982f326455f0905de3dbc4449999baf2dc", | ||||||
|         "chainlinkStopLimit": "0x67a094cf028221ffdd93fc658f963151d05e2a74", |         "chainlinkStopLimit": "0x67a094cf028221ffdd93fc658f963151d05e2a74", | ||||||
|         "curveBridge": "0x1796cd592d19e3bcd744fbb025bb61a6d8cb2c09", |  | ||||||
|         "maximumGasPrice": "0x407b4128e9ecad8769b2332312a9f655cb9f5f3a", |         "maximumGasPrice": "0x407b4128e9ecad8769b2332312a9f655cb9f5f3a", | ||||||
|         "dexForwarderBridge": "0x3261ea1411a1a840aed708896f779e1b837c917e", |         "dexForwarderBridge": "0x3261ea1411a1a840aed708896f779e1b837c917e", | ||||||
|         "multiBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "balancerBridge": "0x47697b44bd89051e93b4d5857ba8e024800a74ac", |  | ||||||
|         "bancorBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e", |         "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e", | ||||||
|         "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", |         "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", | ||||||
|         "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", |         "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", | ||||||
|         "exchangeProxyTransformerDeployer": "0x1c9a27658dd303a31205a3b245e8993b92d4d502", |         "exchangeProxyTransformerDeployer": "0x1c9a27658dd303a31205a3b245e8993b92d4d502", | ||||||
|         "exchangeProxyFlashWallet": "0x22f9dcf4647084d6c31b2765f6910cd85c178c18", |         "exchangeProxyFlashWallet": "0x22f9dcf4647084d6c31b2765f6910cd85c178c18", | ||||||
|         "mStableBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "mooniswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "sushiswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "shellBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "dodoBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "creamBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "transformers": { |         "transformers": { | ||||||
|             "wethTransformer": "0x8d822fe2b42f60531203e288f5f357fa79474437", |             "wethTransformer": "0x8d822fe2b42f60531203e288f5f357fa79474437", | ||||||
|             "payTakerTransformer": "0x150652244723102faeaefa4c79597d097ffa26c6", |             "payTakerTransformer": "0x150652244723102faeaefa4c79597d097ffa26c6", | ||||||
| @@ -127,33 +99,19 @@ | |||||||
|         "staking": "0x6acab4c9c4e3a0c78435fdb5ad1719c95460a668", |         "staking": "0x6acab4c9c4e3a0c78435fdb5ad1719c95460a668", | ||||||
|         "stakingProxy": "0x781ee6683595f823208be6540a279f940e6af196", |         "stakingProxy": "0x781ee6683595f823208be6540a279f940e6af196", | ||||||
|         "erc20BridgeProxy": "0xa2aa4befed748fba27a3be7dfd2c4b2c6db1f49b", |         "erc20BridgeProxy": "0xa2aa4befed748fba27a3be7dfd2c4b2c6db1f49b", | ||||||
|         "uniswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "uniswapV2Bridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "eth2DaiBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", |         "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", | ||||||
|         "kyberBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "chaiBridge": "0x0000000000000000000000000000000000000000", |         "chaiBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "dydxBridge": "0x0000000000000000000000000000000000000000", |         "dydxBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", |         "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", | ||||||
|         "broker": "0x0dd2d6cabbd8ae7d2fe6840fa597a44b1a7e4747", |         "broker": "0x0dd2d6cabbd8ae7d2fe6840fa597a44b1a7e4747", | ||||||
|         "chainlinkStopLimit": "0x407b4128e9ecad8769b2332312a9f655cb9f5f3a", |         "chainlinkStopLimit": "0x407b4128e9ecad8769b2332312a9f655cb9f5f3a", | ||||||
|         "curveBridge": "0x1796cd592d19e3bcd744fbb025bb61a6d8cb2c09", |  | ||||||
|         "maximumGasPrice": "0x47697b44bd89051e93b4d5857ba8e024800a74ac", |         "maximumGasPrice": "0x47697b44bd89051e93b4d5857ba8e024800a74ac", | ||||||
|         "dexForwarderBridge": "0x0000000000000000000000000000000000000000", |         "dexForwarderBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "multiBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "balancerBridge": "0x5d8c9ba74607d2cbc4176882a42d4ace891c1c00", |  | ||||||
|         "bancorBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e", |         "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e", | ||||||
|         "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", |         "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", | ||||||
|         "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", |         "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", | ||||||
|         "exchangeProxyTransformerDeployer": "0x1c9a27658dd303a31205a3b245e8993b92d4d502", |         "exchangeProxyTransformerDeployer": "0x1c9a27658dd303a31205a3b245e8993b92d4d502", | ||||||
|         "exchangeProxyFlashWallet": "0x22f9dcf4647084d6c31b2765f6910cd85c178c18", |         "exchangeProxyFlashWallet": "0x22f9dcf4647084d6c31b2765f6910cd85c178c18", | ||||||
|         "mStableBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "mooniswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "sushiswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "shellBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "dodoBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "creamBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "transformers": { |         "transformers": { | ||||||
|             "wethTransformer": "0x8d822fe2b42f60531203e288f5f357fa79474437", |             "wethTransformer": "0x8d822fe2b42f60531203e288f5f357fa79474437", | ||||||
|             "payTakerTransformer": "0x150652244723102faeaefa4c79597d097ffa26c6", |             "payTakerTransformer": "0x150652244723102faeaefa4c79597d097ffa26c6", | ||||||
| @@ -181,33 +139,19 @@ | |||||||
|         "staking": "0x73ea24041e03a012c51a45c307e0ba376af0238c", |         "staking": "0x73ea24041e03a012c51a45c307e0ba376af0238c", | ||||||
|         "stakingProxy": "0xe94cb304b3f515be7c95fedcfa249a84995fd748", |         "stakingProxy": "0xe94cb304b3f515be7c95fedcfa249a84995fd748", | ||||||
|         "erc20BridgeProxy": "0x3577552c1fb7a44ad76beeb7ab53251668a21f8d", |         "erc20BridgeProxy": "0x3577552c1fb7a44ad76beeb7ab53251668a21f8d", | ||||||
|         "uniswapBridge": "0x0e85f89f29998df65402391478e5924700c0079d", |  | ||||||
|         "uniswapV2Bridge": "0x7b3530a635d099de0534dc27e46cd7c57578c3c8", |  | ||||||
|         "eth2DaiBridge": "0x2d47147429b474d2e4f83e658015858a1312ed5b", |  | ||||||
|         "erc20BridgeSampler": "0xcf9e66851f274aa4721e54526117876d90d51aa1", |         "erc20BridgeSampler": "0xcf9e66851f274aa4721e54526117876d90d51aa1", | ||||||
|         "kyberBridge": "0xaecfa25920f892b6eb496e1f6e84037f59da7f44", |  | ||||||
|         "chaiBridge": "0x0000000000000000000000000000000000000000", |         "chaiBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "dydxBridge": "0xc213707de0454008758071c2edc1365621b8a5c5", |         "dydxBridge": "0xc213707de0454008758071c2edc1365621b8a5c5", | ||||||
|         "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", |         "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", | ||||||
|         "broker": "0xcdeb6d90ee7c96b4c713f7bb4f8604981f7ebe9d", |         "broker": "0xcdeb6d90ee7c96b4c713f7bb4f8604981f7ebe9d", | ||||||
|         "chainlinkStopLimit": "0x0000000000000000000000000000000000000000", |         "chainlinkStopLimit": "0x0000000000000000000000000000000000000000", | ||||||
|         "curveBridge": "0x81c0ab53a7352d2e97f682a37cba44e54647eefb", |  | ||||||
|         "maximumGasPrice": "0x67a094cf028221ffdd93fc658f963151d05e2a74", |         "maximumGasPrice": "0x67a094cf028221ffdd93fc658f963151d05e2a74", | ||||||
|         "dexForwarderBridge": "0x985d1a95c6a86a3bf85c4d425af984abceaf01de", |         "dexForwarderBridge": "0x985d1a95c6a86a3bf85c4d425af984abceaf01de", | ||||||
|         "multiBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "balancerBridge": "0x407b4128e9ecad8769b2332312a9f655cb9f5f3a", |  | ||||||
|         "bancorBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e", |         "exchangeProxyGovernor": "0x618f9c67ce7bf1a50afa1e7e0238422601b0ff6e", | ||||||
|         "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", |         "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", | ||||||
|         "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", |         "exchangeProxyAllowanceTarget": "0xf740b67da229f2f10bcbd38a7979992fcc71b8eb", | ||||||
|         "exchangeProxyTransformerDeployer": "0x1b62de2dbb5e7aa519e9c442721ecef75702807f", |         "exchangeProxyTransformerDeployer": "0x1b62de2dbb5e7aa519e9c442721ecef75702807f", | ||||||
|         "exchangeProxyFlashWallet": "0x22f9dcf4647084d6c31b2765f6910cd85c178c18", |         "exchangeProxyFlashWallet": "0x22f9dcf4647084d6c31b2765f6910cd85c178c18", | ||||||
|         "mStableBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "mooniswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "sushiswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "shellBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "dodoBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "creamBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "transformers": { |         "transformers": { | ||||||
|             "wethTransformer": "0x9ce35b5ee9e710535e3988e3f8731d9ca9dba17d", |             "wethTransformer": "0x9ce35b5ee9e710535e3988e3f8731d9ca9dba17d", | ||||||
|             "payTakerTransformer": "0x5a53e7b02a83aa9f60ccf4e424f0442c255bc977", |             "payTakerTransformer": "0x5a53e7b02a83aa9f60ccf4e424f0442c255bc977", | ||||||
| @@ -235,33 +179,19 @@ | |||||||
|         "zrxVault": "0xf23276778860e420acfc18ebeebf7e829b06965c", |         "zrxVault": "0xf23276778860e420acfc18ebeebf7e829b06965c", | ||||||
|         "staking": "0x8a063452f7df2614db1bca3a85ef35da40cf0835", |         "staking": "0x8a063452f7df2614db1bca3a85ef35da40cf0835", | ||||||
|         "stakingProxy": "0x59adefa01843c627ba5d6aa350292b4b7ccae67a", |         "stakingProxy": "0x59adefa01843c627ba5d6aa350292b4b7ccae67a", | ||||||
|         "uniswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "uniswapV2Bridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "eth2DaiBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", |         "erc20BridgeSampler": "0x0000000000000000000000000000000000000000", | ||||||
|         "kyberBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "chaiBridge": "0x0000000000000000000000000000000000000000", |         "chaiBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "dydxBridge": "0x0000000000000000000000000000000000000000", |         "dydxBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", |         "godsUnchainedValidator": "0x0000000000000000000000000000000000000000", | ||||||
|         "broker": "0x0000000000000000000000000000000000000000", |         "broker": "0x0000000000000000000000000000000000000000", | ||||||
|         "chainlinkStopLimit": "0x0000000000000000000000000000000000000000", |         "chainlinkStopLimit": "0x0000000000000000000000000000000000000000", | ||||||
|         "curveBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "maximumGasPrice": "0x0000000000000000000000000000000000000000", |         "maximumGasPrice": "0x0000000000000000000000000000000000000000", | ||||||
|         "dexForwarderBridge": "0x0000000000000000000000000000000000000000", |         "dexForwarderBridge": "0x0000000000000000000000000000000000000000", | ||||||
|         "multiBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "balancerBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "bancorBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "exchangeProxyGovernor": "0x0000000000000000000000000000000000000000", |         "exchangeProxyGovernor": "0x0000000000000000000000000000000000000000", | ||||||
|         "exchangeProxy": "0x5315e44798395d4a952530d131249fe00f554565", |         "exchangeProxy": "0x5315e44798395d4a952530d131249fe00f554565", | ||||||
|         "exchangeProxyAllowanceTarget": "0x8362c3ebd90041b30ec45908332e592721642637", |         "exchangeProxyAllowanceTarget": "0x8362c3ebd90041b30ec45908332e592721642637", | ||||||
|         "exchangeProxyTransformerDeployer": "0x5409ed021d9299bf6814279a6a1411a7e866a631", |         "exchangeProxyTransformerDeployer": "0x5409ed021d9299bf6814279a6a1411a7e866a631", | ||||||
|         "exchangeProxyFlashWallet": "0xb9682a8e7920b431f1d412b8510f0077410c8faa", |         "exchangeProxyFlashWallet": "0xb9682a8e7920b431f1d412b8510f0077410c8faa", | ||||||
|         "mStableBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "mooniswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "sushiswapBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "shellBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "dodoBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "creamBridge": "0x0000000000000000000000000000000000000000", |  | ||||||
|         "transformers": { |         "transformers": { | ||||||
|             "wethTransformer": "0xc6b0d3c45a6b5092808196cb00df5c357d55e1d5", |             "wethTransformer": "0xc6b0d3c45a6b5092808196cb00df5c357d55e1d5", | ||||||
|             "payTakerTransformer": "0x7209185959d7227fb77274e1e88151d7c4c368d3", |             "payTakerTransformer": "0x7209185959d7227fb77274e1e88151d7c4c368d3", | ||||||
|   | |||||||
| @@ -21,32 +21,18 @@ export interface ContractAddresses { | |||||||
|     stakingProxy: string; |     stakingProxy: string; | ||||||
|     erc20BridgeProxy: string; |     erc20BridgeProxy: string; | ||||||
|     erc20BridgeSampler: string; |     erc20BridgeSampler: string; | ||||||
|     uniswapBridge: string; |  | ||||||
|     uniswapV2Bridge: string; |  | ||||||
|     eth2DaiBridge: string; |  | ||||||
|     kyberBridge: string; |  | ||||||
|     chaiBridge: string; |     chaiBridge: string; | ||||||
|     dydxBridge: string; |     dydxBridge: string; | ||||||
|     curveBridge: string; |  | ||||||
|     godsUnchainedValidator: string; |     godsUnchainedValidator: string; | ||||||
|     broker: string; |     broker: string; | ||||||
|     chainlinkStopLimit: string; |     chainlinkStopLimit: string; | ||||||
|     maximumGasPrice: string; |     maximumGasPrice: string; | ||||||
|     dexForwarderBridge: string; |     dexForwarderBridge: string; | ||||||
|     multiBridge: string; |  | ||||||
|     balancerBridge: string; |  | ||||||
|     bancorBridge: string; |  | ||||||
|     exchangeProxyGovernor: string; |     exchangeProxyGovernor: string; | ||||||
|     exchangeProxy: string; |     exchangeProxy: string; | ||||||
|     exchangeProxyAllowanceTarget: string; |     exchangeProxyAllowanceTarget: string; | ||||||
|     exchangeProxyTransformerDeployer: string; |     exchangeProxyTransformerDeployer: string; | ||||||
|     exchangeProxyFlashWallet: string; |     exchangeProxyFlashWallet: string; | ||||||
|     mStableBridge: string; |  | ||||||
|     mooniswapBridge: string; |  | ||||||
|     sushiswapBridge: string; |  | ||||||
|     shellBridge: string; |  | ||||||
|     dodoBridge: string; |  | ||||||
|     creamBridge: string; |  | ||||||
|     transformers: { |     transformers: { | ||||||
|         wethTransformer: string; |         wethTransformer: string; | ||||||
|         payTakerTransformer: string; |         payTakerTransformer: string; | ||||||
|   | |||||||
| @@ -317,16 +317,22 @@ export async function runMigrationsAsync( | |||||||
|             mooniswapBridge: NULL_ADDRESS, |             mooniswapBridge: NULL_ADDRESS, | ||||||
|             mStableBridge: NULL_ADDRESS, |             mStableBridge: NULL_ADDRESS, | ||||||
|             oasisBridge: NULL_ADDRESS, |             oasisBridge: NULL_ADDRESS, | ||||||
|  |             swerveBridge: NULL_ADDRESS, | ||||||
|  |             sushiswapBridge: NULL_ADDRESS, | ||||||
|             uniswapBridge: NULL_ADDRESS, |             uniswapBridge: NULL_ADDRESS, | ||||||
|             uniswapV2Bridge: NULL_ADDRESS, |             uniswapV2Bridge: NULL_ADDRESS, | ||||||
|             kyberNetworkProxy: NULL_ADDRESS, |             kyberNetworkProxy: NULL_ADDRESS, | ||||||
|             oasis: NULL_ADDRESS, |             oasis: NULL_ADDRESS, | ||||||
|  |             sushiswapRouter: NULL_ADDRESS, | ||||||
|             uniswapV2Router: NULL_ADDRESS, |             uniswapV2Router: NULL_ADDRESS, | ||||||
|             uniswapExchangeFactory: NULL_ADDRESS, |             uniswapExchangeFactory: NULL_ADDRESS, | ||||||
|             mStable: NULL_ADDRESS, |             mStable: NULL_ADDRESS, | ||||||
|             shellBridge: NULL_ADDRESS, |             shellBridge: NULL_ADDRESS, | ||||||
|             creamBridge: NULL_ADDRESS, |             creamBridge: NULL_ADDRESS, | ||||||
|             shell: NULL_ADDRESS, |             shell: NULL_ADDRESS, | ||||||
|  |             dodoBridge: NULL_ADDRESS, | ||||||
|  |             dodoHelper: NULL_ADDRESS, | ||||||
|  |             snowSwapBridge: NULL_ADDRESS, | ||||||
|             weth: etherToken.address, |             weth: etherToken.address, | ||||||
|         }, |         }, | ||||||
|     ); |     ); | ||||||
| @@ -384,29 +390,15 @@ export async function runMigrationsAsync( | |||||||
|         zrxVault: zrxVault.address, |         zrxVault: zrxVault.address, | ||||||
|         staking: stakingLogic.address, |         staking: stakingLogic.address, | ||||||
|         stakingProxy: stakingProxy.address, |         stakingProxy: stakingProxy.address, | ||||||
|         uniswapBridge: NULL_ADDRESS, |  | ||||||
|         eth2DaiBridge: NULL_ADDRESS, |  | ||||||
|         kyberBridge: NULL_ADDRESS, |  | ||||||
|         erc20BridgeSampler: NULL_ADDRESS, |         erc20BridgeSampler: NULL_ADDRESS, | ||||||
|         chaiBridge: NULL_ADDRESS, |         chaiBridge: NULL_ADDRESS, | ||||||
|         dydxBridge: NULL_ADDRESS, |         dydxBridge: NULL_ADDRESS, | ||||||
|         curveBridge: NULL_ADDRESS, |  | ||||||
|         uniswapV2Bridge: NULL_ADDRESS, |  | ||||||
|         godsUnchainedValidator: NULL_ADDRESS, |         godsUnchainedValidator: NULL_ADDRESS, | ||||||
|         broker: NULL_ADDRESS, |         broker: NULL_ADDRESS, | ||||||
|         chainlinkStopLimit: NULL_ADDRESS, |         chainlinkStopLimit: NULL_ADDRESS, | ||||||
|         maximumGasPrice: NULL_ADDRESS, |         maximumGasPrice: NULL_ADDRESS, | ||||||
|         dexForwarderBridge: NULL_ADDRESS, |         dexForwarderBridge: NULL_ADDRESS, | ||||||
|         multiBridge: NULL_ADDRESS, |  | ||||||
|         balancerBridge: NULL_ADDRESS, |  | ||||||
|         bancorBridge: NULL_ADDRESS, |  | ||||||
|         exchangeProxyGovernor: NULL_ADDRESS, |         exchangeProxyGovernor: NULL_ADDRESS, | ||||||
|         mStableBridge: NULL_ADDRESS, |  | ||||||
|         mooniswapBridge: NULL_ADDRESS, |  | ||||||
|         sushiswapBridge: NULL_ADDRESS, |  | ||||||
|         shellBridge: NULL_ADDRESS, |  | ||||||
|         dodoBridge: NULL_ADDRESS, |  | ||||||
|         creamBridge: NULL_ADDRESS, |  | ||||||
|         exchangeProxy: exchangeProxy.address, |         exchangeProxy: exchangeProxy.address, | ||||||
|         exchangeProxyAllowanceTarget: exchangeProxyAllowanceTargetAddress, |         exchangeProxyAllowanceTarget: exchangeProxyAllowanceTargetAddress, | ||||||
|         exchangeProxyTransformerDeployer: txDefaults.from, |         exchangeProxyTransformerDeployer: txDefaults.from, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user