Offboard/clean up Oasis, CoFix, and legacy Kyber [TKR-405] (#482)
* Remove Oasis * Remove CoFix code * Remove MixinKyber * Remove Kyber from asset-swapper * Delete unused imports, interface, and etc. * Fix the test failure issue when it's run with neon-router * Update CHANGELOG.json
This commit is contained in:
		@@ -40,7 +40,6 @@ import "./mixins/MixinMakerPSM.sol";
 | 
			
		||||
import "./mixins/MixinMooniswap.sol";
 | 
			
		||||
import "./mixins/MixinMStable.sol";
 | 
			
		||||
import "./mixins/MixinNerve.sol";
 | 
			
		||||
import "./mixins/MixinOasis.sol";
 | 
			
		||||
import "./mixins/MixinPlatypus.sol";
 | 
			
		||||
import "./mixins/MixinShell.sol";
 | 
			
		||||
import "./mixins/MixinUniswap.sol";
 | 
			
		||||
@@ -68,7 +67,6 @@ contract BridgeAdapter is
 | 
			
		||||
    MixinMooniswap,
 | 
			
		||||
    MixinMStable,
 | 
			
		||||
    MixinNerve,
 | 
			
		||||
    MixinOasis,
 | 
			
		||||
    MixinPlatypus,
 | 
			
		||||
    MixinShell,
 | 
			
		||||
    MixinUniswap,
 | 
			
		||||
@@ -94,7 +92,6 @@ contract BridgeAdapter is
 | 
			
		||||
        MixinMooniswap(weth)
 | 
			
		||||
        MixinMStable()
 | 
			
		||||
        MixinNerve()
 | 
			
		||||
        MixinOasis()
 | 
			
		||||
        MixinPlatypus()
 | 
			
		||||
        MixinShell()
 | 
			
		||||
        MixinUniswap(weth)
 | 
			
		||||
@@ -187,13 +184,6 @@ contract BridgeAdapter is
 | 
			
		||||
                sellAmount,
 | 
			
		||||
                order.bridgeData
 | 
			
		||||
            );
 | 
			
		||||
        } else if (protocolId == BridgeProtocols.OASIS) {
 | 
			
		||||
            boughtAmount = _tradeOasis(
 | 
			
		||||
                sellToken,
 | 
			
		||||
                buyToken,
 | 
			
		||||
                sellAmount,
 | 
			
		||||
                order.bridgeData
 | 
			
		||||
            );
 | 
			
		||||
        } else if (protocolId == BridgeProtocols.SHELL) {
 | 
			
		||||
            boughtAmount = _tradeShell(
 | 
			
		||||
                sellToken,
 | 
			
		||||
 
 | 
			
		||||
@@ -32,16 +32,16 @@ library BridgeProtocols {
 | 
			
		||||
    uint128 internal constant UNISWAPV2       = 2;
 | 
			
		||||
    uint128 internal constant UNISWAP         = 3;
 | 
			
		||||
    uint128 internal constant BALANCER        = 4;
 | 
			
		||||
    uint128 internal constant KYBER           = 5;
 | 
			
		||||
    uint128 internal constant KYBER           = 5;  // Not used: deprecated.
 | 
			
		||||
    uint128 internal constant MOONISWAP       = 6;
 | 
			
		||||
    uint128 internal constant MSTABLE         = 7;
 | 
			
		||||
    uint128 internal constant OASIS           = 8;
 | 
			
		||||
    uint128 internal constant OASIS           = 8;  // Not used: deprecated.
 | 
			
		||||
    uint128 internal constant SHELL           = 9;
 | 
			
		||||
    uint128 internal constant DODO            = 10;
 | 
			
		||||
    uint128 internal constant DODOV2          = 11;
 | 
			
		||||
    uint128 internal constant CRYPTOCOM       = 12;
 | 
			
		||||
    uint128 internal constant BANCOR          = 13;
 | 
			
		||||
    uint128 internal constant COFIX           = 14;
 | 
			
		||||
    uint128 internal constant COFIX           = 14; // Not used: deprecated.
 | 
			
		||||
    uint128 internal constant NERVE           = 15;
 | 
			
		||||
    uint128 internal constant MAKERPSM        = 16;
 | 
			
		||||
    uint128 internal constant BALANCERV2      = 17;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,92 +0,0 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  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 "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
interface ICoFiXRouter {
 | 
			
		||||
    // msg.value = fee
 | 
			
		||||
    function swapExactTokensForETH(
 | 
			
		||||
        address token,
 | 
			
		||||
        uint amountIn,
 | 
			
		||||
        uint amountOutMin,
 | 
			
		||||
        address to,
 | 
			
		||||
        address rewardTo,
 | 
			
		||||
        uint deadline
 | 
			
		||||
    ) external payable returns (uint _amountIn, uint _amountOut);
 | 
			
		||||
 | 
			
		||||
    // msg.value = amountIn + fee
 | 
			
		||||
    function swapExactETHForTokens(
 | 
			
		||||
        address token,
 | 
			
		||||
        uint amountIn,
 | 
			
		||||
        uint amountOutMin,
 | 
			
		||||
        address to,
 | 
			
		||||
        address rewardTo,
 | 
			
		||||
        uint deadline
 | 
			
		||||
    ) external payable returns (uint _amountIn, uint _amountOut);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface ICoFiXPair {
 | 
			
		||||
 | 
			
		||||
    function swapWithExact(address outToken, address to)
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
        returns (
 | 
			
		||||
            uint amountIn,
 | 
			
		||||
            uint amountOut,
 | 
			
		||||
            uint oracleFeeChange,
 | 
			
		||||
            uint256[4] memory tradeInfo
 | 
			
		||||
        );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
contract MixinCoFiX {
 | 
			
		||||
 | 
			
		||||
    using LibERC20TokenV06 for IERC20TokenV06;
 | 
			
		||||
 | 
			
		||||
    function _tradeCoFiX(
 | 
			
		||||
        IERC20TokenV06 sellToken,
 | 
			
		||||
        IERC20TokenV06 buyToken,
 | 
			
		||||
        uint256 sellAmount,
 | 
			
		||||
        bytes memory bridgeData
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        returns (uint256 boughtAmount)
 | 
			
		||||
    {
 | 
			
		||||
        (uint256 fee, ICoFiXPair pool) = abi.decode(bridgeData, (uint256, ICoFiXPair));
 | 
			
		||||
        // Transfer tokens into the pool
 | 
			
		||||
        LibERC20TokenV06.compatTransfer(
 | 
			
		||||
            sellToken,
 | 
			
		||||
            address(pool),
 | 
			
		||||
            sellAmount
 | 
			
		||||
        );
 | 
			
		||||
        // Call the swap exact with the tokens now in the pool
 | 
			
		||||
        // pay the NEST Oracle fee with ETH
 | 
			
		||||
        (/* In */, boughtAmount, , ) = pool.swapWithExact{value: fee}(
 | 
			
		||||
            address(buyToken),
 | 
			
		||||
            address(this)
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return boughtAmount;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,124 +0,0 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  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 "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol";
 | 
			
		||||
import "../IBridgeAdapter.sol";
 | 
			
		||||
 | 
			
		||||
interface IKyberNetworkProxy {
 | 
			
		||||
 | 
			
		||||
    /// @dev Sells `sellTokenAddress` tokens for `buyTokenAddress` tokens
 | 
			
		||||
    /// using a hint for the reserve.
 | 
			
		||||
    /// @param sellToken Token to sell.
 | 
			
		||||
    /// @param sellAmount Amount of tokens to sell.
 | 
			
		||||
    /// @param buyToken Token to buy.
 | 
			
		||||
    /// @param recipientAddress Address to send bought tokens to.
 | 
			
		||||
    /// @param maxBuyTokenAmount A limit on the amount of tokens to buy.
 | 
			
		||||
    /// @param minConversionRate The minimal conversion rate. If actual rate
 | 
			
		||||
    ///        is lower, trade is canceled.
 | 
			
		||||
    /// @param walletId The wallet ID to send part of the fees
 | 
			
		||||
    /// @param hint The hint for the selective inclusion (or exclusion) of reserves
 | 
			
		||||
    /// @return boughtAmount Amount of tokens bought.
 | 
			
		||||
    function tradeWithHint(
 | 
			
		||||
        IERC20TokenV06 sellToken,
 | 
			
		||||
        uint256 sellAmount,
 | 
			
		||||
        IERC20TokenV06 buyToken,
 | 
			
		||||
        address payable recipientAddress,
 | 
			
		||||
        uint256 maxBuyTokenAmount,
 | 
			
		||||
        uint256 minConversionRate,
 | 
			
		||||
        address payable walletId,
 | 
			
		||||
        bytes calldata hint
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        payable
 | 
			
		||||
        returns (uint256 boughtAmount);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
contract MixinKyber {
 | 
			
		||||
 | 
			
		||||
    using LibERC20TokenV06 for IERC20TokenV06;
 | 
			
		||||
 | 
			
		||||
    /// @dev Address indicating the trade is using ETH
 | 
			
		||||
    IERC20TokenV06 private immutable KYBER_ETH_ADDRESS =
 | 
			
		||||
        IERC20TokenV06(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
 | 
			
		||||
    /// @dev Mainnet address of the WETH contract.
 | 
			
		||||
    IEtherTokenV06 private immutable WETH;
 | 
			
		||||
 | 
			
		||||
    constructor(IEtherTokenV06 weth)
 | 
			
		||||
        public
 | 
			
		||||
    {
 | 
			
		||||
        WETH = weth;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function _tradeKyber(
 | 
			
		||||
        IERC20TokenV06 sellToken,
 | 
			
		||||
        IERC20TokenV06 buyToken,
 | 
			
		||||
        uint256 sellAmount,
 | 
			
		||||
        bytes memory bridgeData
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        returns (uint256 boughtAmount)
 | 
			
		||||
    {
 | 
			
		||||
        (IKyberNetworkProxy kyber, bytes memory hint) =
 | 
			
		||||
            abi.decode(bridgeData, (IKyberNetworkProxy, bytes));
 | 
			
		||||
 | 
			
		||||
        uint256 payableAmount = 0;
 | 
			
		||||
        if (sellToken != WETH) {
 | 
			
		||||
            // If the input token is not WETH, grant an allowance to the exchange
 | 
			
		||||
            // to spend them.
 | 
			
		||||
            sellToken.approveIfBelow(
 | 
			
		||||
                address(kyber),
 | 
			
		||||
                sellAmount
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            // If the input token is WETH, unwrap it and attach it to the call.
 | 
			
		||||
            payableAmount = sellAmount;
 | 
			
		||||
            WETH.withdraw(payableAmount);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Try to sell all of this contract's input token balance through
 | 
			
		||||
        // `KyberNetworkProxy.trade()`.
 | 
			
		||||
        boughtAmount = kyber.tradeWithHint{ value: payableAmount }(
 | 
			
		||||
            // Input token.
 | 
			
		||||
            sellToken == WETH ? KYBER_ETH_ADDRESS : sellToken,
 | 
			
		||||
            // Sell amount.
 | 
			
		||||
            sellAmount,
 | 
			
		||||
            // Output token.
 | 
			
		||||
            buyToken == WETH ? KYBER_ETH_ADDRESS : buyToken,
 | 
			
		||||
            // Transfer to this contract
 | 
			
		||||
            address(uint160(address(this))),
 | 
			
		||||
            // Buy as much as possible.
 | 
			
		||||
            uint256(-1),
 | 
			
		||||
            // Lowest minimum conversion rate
 | 
			
		||||
            1,
 | 
			
		||||
            // No affiliate address.
 | 
			
		||||
            address(0),
 | 
			
		||||
            hint
 | 
			
		||||
        );
 | 
			
		||||
        // If receving ETH, wrap it to WETH.
 | 
			
		||||
        if (buyToken == WETH) {
 | 
			
		||||
            WETH.deposit{ value: boughtAmount }();
 | 
			
		||||
        }
 | 
			
		||||
        return boughtAmount;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,76 +0,0 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  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 "../IBridgeAdapter.sol";
 | 
			
		||||
 | 
			
		||||
interface IOasis {
 | 
			
		||||
 | 
			
		||||
    /// @dev Sell `sellAmount` of `sellToken` token and receive `buyToken` token.
 | 
			
		||||
    /// @param sellToken The token being sold.
 | 
			
		||||
    /// @param sellAmount The amount of `sellToken` token being sold.
 | 
			
		||||
    /// @param buyToken The token being bought.
 | 
			
		||||
    /// @param minBoughtAmount Minimum amount of `buyToken` token to buy.
 | 
			
		||||
    /// @return boughtAmount Amount of `buyToken` bought.
 | 
			
		||||
    function sellAllAmount(
 | 
			
		||||
        IERC20TokenV06 sellToken,
 | 
			
		||||
        uint256 sellAmount,
 | 
			
		||||
        IERC20TokenV06 buyToken,
 | 
			
		||||
        uint256 minBoughtAmount
 | 
			
		||||
    )
 | 
			
		||||
        external
 | 
			
		||||
        returns (uint256 boughtAmount);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
contract MixinOasis {
 | 
			
		||||
 | 
			
		||||
    using LibERC20TokenV06 for IERC20TokenV06;
 | 
			
		||||
 | 
			
		||||
    function _tradeOasis(
 | 
			
		||||
        IERC20TokenV06 sellToken,
 | 
			
		||||
        IERC20TokenV06 buyToken,
 | 
			
		||||
        uint256 sellAmount,
 | 
			
		||||
        bytes memory bridgeData
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        returns (uint256 boughtAmount)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        (IOasis oasis) = abi.decode(bridgeData, (IOasis));
 | 
			
		||||
 | 
			
		||||
        // Grant an allowance to the exchange to spend `sellToken` token.
 | 
			
		||||
        sellToken.approveIfBelow(
 | 
			
		||||
            address(oasis),
 | 
			
		||||
            sellAmount
 | 
			
		||||
        );
 | 
			
		||||
        // Try to sell all of this contract's `sellToken` token balance.
 | 
			
		||||
        boughtAmount = oasis.sellAllAmount(
 | 
			
		||||
            sellToken,
 | 
			
		||||
            sellAmount,
 | 
			
		||||
            buyToken,
 | 
			
		||||
            // min fill amount
 | 
			
		||||
            1
 | 
			
		||||
        );
 | 
			
		||||
        return boughtAmount;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -43,7 +43,7 @@
 | 
			
		||||
    "config": {
 | 
			
		||||
        "publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,PositiveSlippageFeeTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,AffiliateFeeTransformer,MetaTransactionsFeature,LogMetadataTransformer,BridgeAdapter,LiquidityProviderFeature,ILiquidityProviderFeature,NativeOrdersFeature,INativeOrdersFeature,FeeCollectorController,FeeCollector,CurveLiquidityProvider,BatchFillNativeOrdersFeature,IBatchFillNativeOrdersFeature,MultiplexFeature,IMultiplexFeature,OtcOrdersFeature,IOtcOrdersFeature",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|ERC1155OrdersFeature|ERC165Feature|ERC721OrdersFeature|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinERC1155Spender|FixinERC721Spender|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|FundRecoveryFeature|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC1155OrdersFeature|IERC1155Token|IERC165Feature|IERC20Bridge|IERC20Transformer|IERC721OrdersFeature|IERC721Token|IFeature|IFeeRecipient|IFlashWallet|IFundRecoveryFeature|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|IPropertyValidator|ISimpleFunctionRegistryFeature|IStaking|ITakerCallback|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC1155OrdersStorage|LibERC20Transformer|LibERC721OrdersStorage|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNFTOrder|LibNFTOrdersRichErrors|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinAaveV2|MixinBalancer|MixinBalancerV2|MixinBalancerV2Batch|MixinBancor|MixinCoFiX|MixinCompound|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinGMX|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|MixinPlatypus|MixinShell|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|MultiplexLiquidityProvider|MultiplexOtc|MultiplexRfq|MultiplexTransformERC20|MultiplexUniswapV2|MultiplexUniswapV3|NFTOrders|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFeeRecipient|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC1155Token|TestMintableERC20Token|TestMintableERC721Token|TestMooniswap|TestNFTOrderPresigner|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestPropertyValidator|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV2Factory|TestUniswapV2Pool|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json"
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|ERC1155OrdersFeature|ERC165Feature|ERC721OrdersFeature|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinERC1155Spender|FixinERC721Spender|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|FundRecoveryFeature|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC1155OrdersFeature|IERC1155Token|IERC165Feature|IERC20Bridge|IERC20Transformer|IERC721OrdersFeature|IERC721Token|IFeature|IFeeRecipient|IFlashWallet|IFundRecoveryFeature|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|IPropertyValidator|ISimpleFunctionRegistryFeature|IStaking|ITakerCallback|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC1155OrdersStorage|LibERC20Transformer|LibERC721OrdersStorage|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNFTOrder|LibNFTOrdersRichErrors|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinAaveV2|MixinBalancer|MixinBalancerV2|MixinBalancerV2Batch|MixinBancor|MixinCompound|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinGMX|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinPlatypus|MixinShell|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|MultiplexLiquidityProvider|MultiplexOtc|MultiplexRfq|MultiplexTransformERC20|MultiplexUniswapV2|MultiplexUniswapV3|NFTOrders|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFeeRecipient|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC1155Token|TestMintableERC20Token|TestMintableERC721Token|TestMooniswap|TestNFTOrderPresigner|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestPropertyValidator|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV2Factory|TestUniswapV2Pool|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json"
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
        "type": "git",
 | 
			
		||||
 
 | 
			
		||||
@@ -103,7 +103,6 @@ import * as MixinBalancer from '../test/generated-artifacts/MixinBalancer.json';
 | 
			
		||||
import * as MixinBalancerV2 from '../test/generated-artifacts/MixinBalancerV2.json';
 | 
			
		||||
import * as MixinBalancerV2Batch from '../test/generated-artifacts/MixinBalancerV2Batch.json';
 | 
			
		||||
import * as MixinBancor from '../test/generated-artifacts/MixinBancor.json';
 | 
			
		||||
import * as MixinCoFiX from '../test/generated-artifacts/MixinCoFiX.json';
 | 
			
		||||
import * as MixinCompound from '../test/generated-artifacts/MixinCompound.json';
 | 
			
		||||
import * as MixinCryptoCom from '../test/generated-artifacts/MixinCryptoCom.json';
 | 
			
		||||
import * as MixinCurve from '../test/generated-artifacts/MixinCurve.json';
 | 
			
		||||
@@ -111,14 +110,12 @@ import * as MixinCurveV2 from '../test/generated-artifacts/MixinCurveV2.json';
 | 
			
		||||
import * as MixinDodo from '../test/generated-artifacts/MixinDodo.json';
 | 
			
		||||
import * as MixinDodoV2 from '../test/generated-artifacts/MixinDodoV2.json';
 | 
			
		||||
import * as MixinGMX from '../test/generated-artifacts/MixinGMX.json';
 | 
			
		||||
import * as MixinKyber from '../test/generated-artifacts/MixinKyber.json';
 | 
			
		||||
import * as MixinKyberDmm from '../test/generated-artifacts/MixinKyberDmm.json';
 | 
			
		||||
import * as MixinLido from '../test/generated-artifacts/MixinLido.json';
 | 
			
		||||
import * as MixinMakerPSM from '../test/generated-artifacts/MixinMakerPSM.json';
 | 
			
		||||
import * as MixinMooniswap from '../test/generated-artifacts/MixinMooniswap.json';
 | 
			
		||||
import * as MixinMStable from '../test/generated-artifacts/MixinMStable.json';
 | 
			
		||||
import * as MixinNerve from '../test/generated-artifacts/MixinNerve.json';
 | 
			
		||||
import * as MixinOasis from '../test/generated-artifacts/MixinOasis.json';
 | 
			
		||||
import * as MixinPlatypus from '../test/generated-artifacts/MixinPlatypus.json';
 | 
			
		||||
import * as MixinShell from '../test/generated-artifacts/MixinShell.json';
 | 
			
		||||
import * as MixinUniswap from '../test/generated-artifacts/MixinUniswap.json';
 | 
			
		||||
@@ -318,7 +315,6 @@ export const artifacts = {
 | 
			
		||||
    MixinBalancerV2: MixinBalancerV2 as ContractArtifact,
 | 
			
		||||
    MixinBalancerV2Batch: MixinBalancerV2Batch as ContractArtifact,
 | 
			
		||||
    MixinBancor: MixinBancor as ContractArtifact,
 | 
			
		||||
    MixinCoFiX: MixinCoFiX as ContractArtifact,
 | 
			
		||||
    MixinCompound: MixinCompound as ContractArtifact,
 | 
			
		||||
    MixinCryptoCom: MixinCryptoCom as ContractArtifact,
 | 
			
		||||
    MixinCurve: MixinCurve as ContractArtifact,
 | 
			
		||||
@@ -326,14 +322,12 @@ export const artifacts = {
 | 
			
		||||
    MixinDodo: MixinDodo as ContractArtifact,
 | 
			
		||||
    MixinDodoV2: MixinDodoV2 as ContractArtifact,
 | 
			
		||||
    MixinGMX: MixinGMX as ContractArtifact,
 | 
			
		||||
    MixinKyber: MixinKyber as ContractArtifact,
 | 
			
		||||
    MixinKyberDmm: MixinKyberDmm as ContractArtifact,
 | 
			
		||||
    MixinLido: MixinLido as ContractArtifact,
 | 
			
		||||
    MixinMStable: MixinMStable as ContractArtifact,
 | 
			
		||||
    MixinMakerPSM: MixinMakerPSM as ContractArtifact,
 | 
			
		||||
    MixinMooniswap: MixinMooniswap as ContractArtifact,
 | 
			
		||||
    MixinNerve: MixinNerve as ContractArtifact,
 | 
			
		||||
    MixinOasis: MixinOasis as ContractArtifact,
 | 
			
		||||
    MixinPlatypus: MixinPlatypus as ContractArtifact,
 | 
			
		||||
    MixinShell: MixinShell as ContractArtifact,
 | 
			
		||||
    MixinUniswap: MixinUniswap as ContractArtifact,
 | 
			
		||||
 
 | 
			
		||||
@@ -101,7 +101,6 @@ export * from '../test/generated-wrappers/mixin_balancer';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_balancer_v2';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_balancer_v2_batch';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_bancor';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_co_fi_x';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_compound';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_crypto_com';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_curve';
 | 
			
		||||
@@ -109,14 +108,12 @@ export * from '../test/generated-wrappers/mixin_curve_v2';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_dodo';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_dodo_v2';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_g_m_x';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_kyber';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_kyber_dmm';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_lido';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_m_stable';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_maker_p_s_m';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_mooniswap';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_nerve';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_oasis';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_platypus';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_shell';
 | 
			
		||||
export * from '../test/generated-wrappers/mixin_uniswap';
 | 
			
		||||
 
 | 
			
		||||
@@ -134,7 +134,6 @@
 | 
			
		||||
        "test/generated-artifacts/MixinBalancerV2.json",
 | 
			
		||||
        "test/generated-artifacts/MixinBalancerV2Batch.json",
 | 
			
		||||
        "test/generated-artifacts/MixinBancor.json",
 | 
			
		||||
        "test/generated-artifacts/MixinCoFiX.json",
 | 
			
		||||
        "test/generated-artifacts/MixinCompound.json",
 | 
			
		||||
        "test/generated-artifacts/MixinCryptoCom.json",
 | 
			
		||||
        "test/generated-artifacts/MixinCurve.json",
 | 
			
		||||
@@ -142,14 +141,12 @@
 | 
			
		||||
        "test/generated-artifacts/MixinDodo.json",
 | 
			
		||||
        "test/generated-artifacts/MixinDodoV2.json",
 | 
			
		||||
        "test/generated-artifacts/MixinGMX.json",
 | 
			
		||||
        "test/generated-artifacts/MixinKyber.json",
 | 
			
		||||
        "test/generated-artifacts/MixinKyberDmm.json",
 | 
			
		||||
        "test/generated-artifacts/MixinLido.json",
 | 
			
		||||
        "test/generated-artifacts/MixinMStable.json",
 | 
			
		||||
        "test/generated-artifacts/MixinMakerPSM.json",
 | 
			
		||||
        "test/generated-artifacts/MixinMooniswap.json",
 | 
			
		||||
        "test/generated-artifacts/MixinNerve.json",
 | 
			
		||||
        "test/generated-artifacts/MixinOasis.json",
 | 
			
		||||
        "test/generated-artifacts/MixinPlatypus.json",
 | 
			
		||||
        "test/generated-artifacts/MixinShell.json",
 | 
			
		||||
        "test/generated-artifacts/MixinUniswap.json",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,13 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "version": "16.61.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Offboard/clean up Oasis, CoFix, and legacy Kyber",
 | 
			
		||||
                "pr": 482
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "version": "16.60.1",
 | 
			
		||||
        "changes": [
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										99
									
								
								packages/asset-swapper/contracts/src/ERC20BridgeSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								packages/asset-swapper/contracts/src/ERC20BridgeSampler.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "./BalancerSampler.sol";
 | 
			
		||||
import "./BalancerV2Sampler.sol";
 | 
			
		||||
import "./BalancerV2BatchSampler.sol";
 | 
			
		||||
import "./BancorSampler.sol";
 | 
			
		||||
import "./CompoundSampler.sol";
 | 
			
		||||
import "./CurveSampler.sol";
 | 
			
		||||
import "./DODOSampler.sol";
 | 
			
		||||
import "./DODOV2Sampler.sol";
 | 
			
		||||
import "./GMXSampler.sol";
 | 
			
		||||
import "./KyberDmmSampler.sol";
 | 
			
		||||
import "./LidoSampler.sol";
 | 
			
		||||
import "./LiquidityProviderSampler.sol";
 | 
			
		||||
import "./MakerPSMSampler.sol";
 | 
			
		||||
import "./MStableSampler.sol";
 | 
			
		||||
import "./MooniswapSampler.sol";
 | 
			
		||||
import "./NativeOrderSampler.sol";
 | 
			
		||||
import "./PlatypusSampler.sol";
 | 
			
		||||
import "./ShellSampler.sol";
 | 
			
		||||
import "./SmoothySampler.sol";
 | 
			
		||||
import "./TwoHopSampler.sol";
 | 
			
		||||
import "./UniswapSampler.sol";
 | 
			
		||||
import "./UniswapV2Sampler.sol";
 | 
			
		||||
import "./UniswapV3Sampler.sol";
 | 
			
		||||
import "./UtilitySampler.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
contract ERC20BridgeSampler is
 | 
			
		||||
    BalancerSampler,
 | 
			
		||||
    BalancerV2Sampler,
 | 
			
		||||
    BalancerV2BatchSampler,
 | 
			
		||||
    BancorSampler,
 | 
			
		||||
    CompoundSampler,
 | 
			
		||||
    CurveSampler,
 | 
			
		||||
    DODOSampler,
 | 
			
		||||
    DODOV2Sampler,
 | 
			
		||||
    GMXSampler,
 | 
			
		||||
    KyberDmmSampler,
 | 
			
		||||
    LidoSampler,
 | 
			
		||||
    LiquidityProviderSampler,
 | 
			
		||||
    MakerPSMSampler,
 | 
			
		||||
    MStableSampler,
 | 
			
		||||
    MooniswapSampler,
 | 
			
		||||
    NativeOrderSampler,
 | 
			
		||||
    PlatypusSampler,
 | 
			
		||||
    ShellSampler,
 | 
			
		||||
    SmoothySampler,
 | 
			
		||||
    TwoHopSampler,
 | 
			
		||||
    UniswapSampler,
 | 
			
		||||
    UniswapV2Sampler,
 | 
			
		||||
    UniswapV3Sampler,
 | 
			
		||||
    UtilitySampler
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    struct CallResults {
 | 
			
		||||
        bytes data;
 | 
			
		||||
        bool success;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev Call multiple public functions on this contract in a single transaction.
 | 
			
		||||
    /// @param callDatas ABI-encoded call data for each function call.
 | 
			
		||||
    /// @return callResults ABI-encoded results data for each call.
 | 
			
		||||
    function batchCall(bytes[] calldata callDatas)
 | 
			
		||||
        external
 | 
			
		||||
        returns (CallResults[] memory callResults)
 | 
			
		||||
    {
 | 
			
		||||
        callResults = new CallResults[](callDatas.length);
 | 
			
		||||
        for (uint256 i = 0; i != callDatas.length; ++i) {
 | 
			
		||||
            callResults[i].success = true;
 | 
			
		||||
            if (callDatas[i].length == 0) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            (callResults[i].success, callResults[i].data) = address(this).call(callDatas[i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    receive() external payable {}
 | 
			
		||||
}
 | 
			
		||||
@@ -38,15 +38,7 @@
 | 
			
		||||
    "config": {
 | 
			
		||||
        "publicInterfaceContracts": "BalanceChecker,FakeTaker",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(BalanceChecker|FakeTaker).json",
 | 
			
		||||
=======
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BalancerV2BatchSampler|BalancerV2Common|BalancerV2Sampler|BancorSampler|CompoundSampler|CurveSampler|DODOSampler|DODOV2Sampler|ERC20BridgeSampler|FakeTaker|IBalancer|IBalancerV2Vault|IBancor|ICurve|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IShell|ISmoothy|IUniswapExchangeQuotes|IUniswapV2Router01|KyberDmmSampler|KyberSampler|LidoSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|NativeOrderSampler|SamplerUtils|ShellSampler|SmoothySampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UniswapV3Sampler|UtilitySampler).json",
 | 
			
		||||
>>>>>>> 470e9a469 (AS: Balancer V2 batchSwap (#462))
 | 
			
		||||
=======
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BalancerV2BatchSampler|BalancerV2Common|BalancerV2Sampler|BancorSampler|CompoundSampler|CurveSampler|DODOSampler|DODOV2Sampler|ERC20BridgeSampler|FakeTaker|GMXSampler|IBalancer|IBalancerV2Vault|IBancor|ICurve|IGMX|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IPlatypus|IShell|ISmoothy|IUniswapExchangeQuotes|IUniswapV2Router01|KyberDmmSampler|KyberSampler|LidoSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|NativeOrderSampler|PlatypusSampler|SamplerUtils|ShellSampler|SmoothySampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UniswapV3Sampler|UtilitySampler).json",
 | 
			
		||||
>>>>>>> 9a28e51f5 (rebased dev and merged)
 | 
			
		||||
        "postpublish": {
 | 
			
		||||
            "assets": []
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -146,6 +146,10 @@ export {
 | 
			
		||||
    ExchangeProxyOverhead,
 | 
			
		||||
    Fill,
 | 
			
		||||
    GetMarketOrdersRfqOpts,
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
=======
 | 
			
		||||
    LiquidityProviderFillData,
 | 
			
		||||
>>>>>>> 2d16f83e3 (Offboard/clean up Oasis, CoFix, and legacy Kyber [TKR-405] (#482))
 | 
			
		||||
    LiquidityProviderRegistry,
 | 
			
		||||
    MarketDepth,
 | 
			
		||||
    MarketDepthSide,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import { ChainId } from '@0x/contract-addresses';
 | 
			
		||||
import { BigNumber, NULL_BYTES } from '@0x/utils';
 | 
			
		||||
import { BigNumber } from '@0x/utils';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
    ACRYPTOS_BSC_INFOS,
 | 
			
		||||
@@ -28,10 +28,7 @@ import {
 | 
			
		||||
    IRONSWAP_POLYGON_INFOS,
 | 
			
		||||
    JETSWAP_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
    JULSWAP_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
    KYBER_BANNED_RESERVES,
 | 
			
		||||
    KYBER_BRIDGED_LIQUIDITY_PREFIX,
 | 
			
		||||
    MAX_DODOV2_POOLS_QUERIED,
 | 
			
		||||
    MAX_KYBER_RESERVES_QUERIED,
 | 
			
		||||
    MOBIUSMONEY_CELO_INFOS,
 | 
			
		||||
    MORPHEUSSWAP_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
    MSTABLE_POOLS_BY_CHAIN_ID,
 | 
			
		||||
@@ -66,32 +63,11 @@ import {
 | 
			
		||||
} from './constants';
 | 
			
		||||
import { CurveInfo, ERC20BridgeSource, PlatypusInfo } from './types';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Filter Kyber reserves which should not be used (0xbb bridged reserves)
 | 
			
		||||
 * @param reserveId Kyber reserveId
 | 
			
		||||
 */
 | 
			
		||||
export function isAllowedKyberReserveId(reserveId: string): boolean {
 | 
			
		||||
    return (
 | 
			
		||||
        reserveId !== NULL_BYTES &&
 | 
			
		||||
        !reserveId.startsWith(KYBER_BRIDGED_LIQUIDITY_PREFIX) &&
 | 
			
		||||
        !KYBER_BANNED_RESERVES.includes(reserveId)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tslint:disable-next-line: completed-docs ban-types
 | 
			
		||||
export function isValidAddress(address: string | String): address is string {
 | 
			
		||||
    return (typeof address === 'string' || address instanceof String) && address.toString() !== NULL_ADDRESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the offsets to be used to discover Kyber reserves
 | 
			
		||||
 */
 | 
			
		||||
export function getKyberOffsets(): BigNumber[] {
 | 
			
		||||
    return Array(MAX_KYBER_RESERVES_QUERIED)
 | 
			
		||||
        .fill(0)
 | 
			
		||||
        .map((_v, i) => new BigNumber(i));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tslint:disable completed-docs
 | 
			
		||||
export function getDodoV2Offsets(): BigNumber[] {
 | 
			
		||||
    return Array(MAX_DODOV2_POOLS_QUERIED)
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,6 @@ import {
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
=======
 | 
			
		||||
    isFinalUniswapV3FillData,
 | 
			
		||||
    KyberSamplerOpts,
 | 
			
		||||
    LidoInfo,
 | 
			
		||||
    LiquidityProviderFillData,
 | 
			
		||||
    LiquidityProviderRegistry,
 | 
			
		||||
@@ -57,9 +56,12 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
 | 
			
		||||
            ERC20BridgeSource.Uniswap,
 | 
			
		||||
            ERC20BridgeSource.UniswapV2,
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
=======
 | 
			
		||||
            ERC20BridgeSource.Kyber,
 | 
			
		||||
>>>>>>> 9eadc5fc2 (chore: Offboard Eth2Dai [TKR-356] (#470))
 | 
			
		||||
=======
 | 
			
		||||
>>>>>>> 2d16f83e3 (Offboard/clean up Oasis, CoFix, and legacy Kyber [TKR-405] (#482))
 | 
			
		||||
            ERC20BridgeSource.Curve,
 | 
			
		||||
            ERC20BridgeSource.Balancer,
 | 
			
		||||
            ERC20BridgeSource.BalancerV2,
 | 
			
		||||
@@ -205,9 +207,12 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
 | 
			
		||||
            ERC20BridgeSource.Uniswap,
 | 
			
		||||
            ERC20BridgeSource.UniswapV2,
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
=======
 | 
			
		||||
            ERC20BridgeSource.Kyber,
 | 
			
		||||
>>>>>>> 9eadc5fc2 (chore: Offboard Eth2Dai [TKR-356] (#470))
 | 
			
		||||
=======
 | 
			
		||||
>>>>>>> 2d16f83e3 (Offboard/clean up Oasis, CoFix, and legacy Kyber [TKR-405] (#482))
 | 
			
		||||
            ERC20BridgeSource.Curve,
 | 
			
		||||
            ERC20BridgeSource.Balancer,
 | 
			
		||||
            ERC20BridgeSource.BalancerV2,
 | 
			
		||||
@@ -1824,35 +1829,6 @@ export const PLATYPUS_AVALANCHE_INFOS: { [name: string]: PlatypusInfo } = {
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Kyber reserve prefixes
 | 
			
		||||
 * 0xff Fed price reserve
 | 
			
		||||
 * 0xaa Automated price reserve
 | 
			
		||||
 * 0xbb Bridged price reserve (i.e Uniswap/Curve)
 | 
			
		||||
 */
 | 
			
		||||
export const KYBER_BRIDGED_LIQUIDITY_PREFIX = '0xbb';
 | 
			
		||||
export const KYBER_BANNED_RESERVES = ['0xff4f6e65426974205175616e7400000000000000000000000000000000000000'];
 | 
			
		||||
export const MAX_KYBER_RESERVES_QUERIED = 5;
 | 
			
		||||
export const KYBER_CONFIG_BY_CHAIN_ID = valueByChainId<KyberSamplerOpts>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Mainnet]: {
 | 
			
		||||
            networkProxy: '0x9aab3f75489902f3a48495025729a0af77d4b11e',
 | 
			
		||||
            hintHandler: '0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C',
 | 
			
		||||
            weth: MAINNET_TOKENS.WETH,
 | 
			
		||||
        },
 | 
			
		||||
        [ChainId.Ropsten]: {
 | 
			
		||||
            networkProxy: '0x818e6fecd516ecc3849daf6845e3ec868087b755',
 | 
			
		||||
            hintHandler: '0x63f773c026093eef988e803bdd5772dd235a8e71',
 | 
			
		||||
            weth: getContractAddressesForChainOrThrow(ChainId.Ropsten).etherToken,
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        networkProxy: NULL_ADDRESS,
 | 
			
		||||
        hintHandler: NULL_ADDRESS,
 | 
			
		||||
        weth: NULL_ADDRESS,
 | 
			
		||||
    },
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export const LIQUIDITY_PROVIDER_REGISTRY_BY_CHAIN_ID = valueByChainId<LiquidityProviderRegistry>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Mainnet]: {
 | 
			
		||||
@@ -1957,13 +1933,6 @@ export const MSTABLE_POOLS_BY_CHAIN_ID = valueByChainId(
 | 
			
		||||
    },
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export const OASIS_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Mainnet]: '0x5e3e0548935a83ad29fb2a9153d331dc6d49020f',
 | 
			
		||||
    },
 | 
			
		||||
    NULL_ADDRESS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export const KYBER_DMM_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Mainnet]: '0x1c87257f5e8609940bc751a07bb085bb7f8cdbe6',
 | 
			
		||||
@@ -2448,7 +2417,6 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
 | 
			
		||||
    [ERC20BridgeSource.LiquidityProvider]: fillData => {
 | 
			
		||||
        return (fillData as LiquidityProviderFillData).gasCost || 100e3;
 | 
			
		||||
    },
 | 
			
		||||
    [ERC20BridgeSource.Kyber]: () => 450e3,
 | 
			
		||||
    [ERC20BridgeSource.Curve]: fillData => (fillData as CurveFillData).pool.gasSchedule,
 | 
			
		||||
    [ERC20BridgeSource.CurveV2]: fillData => (fillData as CurveFillData).pool.gasSchedule,
 | 
			
		||||
    [ERC20BridgeSource.Nerve]: fillData => (fillData as CurveFillData).pool.gasSchedule,
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,6 @@ import {
 | 
			
		||||
    GenericRouterFillData,
 | 
			
		||||
    GMXFillData,
 | 
			
		||||
    KyberDmmFillData,
 | 
			
		||||
    KyberFillData,
 | 
			
		||||
    LidoFillData,
 | 
			
		||||
    LiquidityProviderFillData,
 | 
			
		||||
    MakerPsmFillData,
 | 
			
		||||
@@ -61,8 +60,6 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s
 | 
			
		||||
            return encodeBridgeSourceId(BridgeProtocol.BalancerV2Batch, 'BalancerV2');
 | 
			
		||||
        case ERC20BridgeSource.Bancor:
 | 
			
		||||
            return encodeBridgeSourceId(BridgeProtocol.Bancor, 'Bancor');
 | 
			
		||||
        // case ERC20BridgeSource.CoFiX:
 | 
			
		||||
        //    return encodeBridgeSourceId(BridgeProtocol.CoFiX, 'CoFiX');
 | 
			
		||||
        case ERC20BridgeSource.Curve:
 | 
			
		||||
            return encodeBridgeSourceId(BridgeProtocol.Curve, 'Curve');
 | 
			
		||||
        case ERC20BridgeSource.Cream:
 | 
			
		||||
@@ -274,10 +271,6 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder
 | 
			
		||||
            const uniswapV2FillData = (order as OptimizedMarketBridgeOrder<UniswapV2FillData>).fillData;
 | 
			
		||||
            bridgeData = encoder.encode([uniswapV2FillData.router, uniswapV2FillData.tokenAddressPath]);
 | 
			
		||||
            break;
 | 
			
		||||
        case ERC20BridgeSource.Kyber:
 | 
			
		||||
            const kyberFillData = (order as OptimizedMarketBridgeOrder<KyberFillData>).fillData;
 | 
			
		||||
            bridgeData = encoder.encode([kyberFillData.networkProxy, kyberFillData.hint]);
 | 
			
		||||
            break;
 | 
			
		||||
        case ERC20BridgeSource.Mooniswap:
 | 
			
		||||
            const mooniswapFillData = (order as OptimizedMarketBridgeOrder<MooniswapFillData>).fillData;
 | 
			
		||||
            bridgeData = encoder.encode([mooniswapFillData.poolAddress]);
 | 
			
		||||
@@ -427,10 +420,6 @@ export const BRIDGE_ENCODERS: {
 | 
			
		||||
        { name: 'provider', type: 'address' },
 | 
			
		||||
        { name: 'data', type: 'bytes' },
 | 
			
		||||
    ]),
 | 
			
		||||
    [ERC20BridgeSource.Kyber]: AbiEncoder.create([
 | 
			
		||||
        { name: 'kyberNetworkProxy', type: 'address' },
 | 
			
		||||
        { name: 'hint', type: 'bytes' },
 | 
			
		||||
    ]),
 | 
			
		||||
    [ERC20BridgeSource.Dodo]: AbiEncoder.create([
 | 
			
		||||
        { name: 'helper', type: 'address' },
 | 
			
		||||
        { name: 'poolAddress', type: 'address' },
 | 
			
		||||
 
 | 
			
		||||
@@ -13,10 +13,8 @@ import { BancorService } from './bancor_service';
 | 
			
		||||
import {
 | 
			
		||||
    getCurveLikeInfosForPair,
 | 
			
		||||
    getDodoV2Offsets,
 | 
			
		||||
    getKyberOffsets,
 | 
			
		||||
    getPlatypusInfoForPair,
 | 
			
		||||
    getShellLikeInfosForPair,
 | 
			
		||||
    isAllowedKyberReserveId,
 | 
			
		||||
    isBadTokenForSource,
 | 
			
		||||
    isValidAddress,
 | 
			
		||||
    uniswapV2LikeRouterAddress,
 | 
			
		||||
@@ -35,7 +33,6 @@ import {
 | 
			
		||||
    GMX_READER_BY_CHAIN_ID,
 | 
			
		||||
    GMX_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
    GMX_VAULT_BY_CHAIN_ID,
 | 
			
		||||
    KYBER_CONFIG_BY_CHAIN_ID,
 | 
			
		||||
    KYBER_DMM_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
    LIDO_INFO_BY_CHAIN,
 | 
			
		||||
    LIQUIDITY_PROVIDER_REGISTRY_BY_CHAIN_ID,
 | 
			
		||||
@@ -44,7 +41,6 @@ import {
 | 
			
		||||
    MOONISWAP_REGISTRIES_BY_CHAIN_ID,
 | 
			
		||||
    NATIVE_FEE_TOKEN_BY_CHAIN_ID,
 | 
			
		||||
    NULL_ADDRESS,
 | 
			
		||||
    NULL_BYTES,
 | 
			
		||||
    PLATYPUS_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
    SELL_SOURCE_FILTER_BY_CHAIN_ID,
 | 
			
		||||
    UNISWAPV1_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
@@ -81,8 +77,6 @@ import {
 | 
			
		||||
    GMXFillData,
 | 
			
		||||
    HopInfo,
 | 
			
		||||
    KyberDmmFillData,
 | 
			
		||||
    KyberFillData,
 | 
			
		||||
    KyberSamplerOpts,
 | 
			
		||||
    LidoFillData,
 | 
			
		||||
    LidoInfo,
 | 
			
		||||
    LiquidityProviderFillData,
 | 
			
		||||
@@ -266,54 +260,6 @@ export class SamplerOperations {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public getKyberSellQuotes(
 | 
			
		||||
        kyberOpts: KyberSamplerOpts,
 | 
			
		||||
        reserveOffset: BigNumber,
 | 
			
		||||
        makerToken: string,
 | 
			
		||||
        takerToken: string,
 | 
			
		||||
        takerFillAmounts: BigNumber[],
 | 
			
		||||
    ): SourceQuoteOperation {
 | 
			
		||||
        return new SamplerContractOperation({
 | 
			
		||||
            source: ERC20BridgeSource.Kyber,
 | 
			
		||||
            contract: this._samplerContract,
 | 
			
		||||
            function: this._samplerContract.sampleSellsFromKyberNetwork,
 | 
			
		||||
            params: [{ ...kyberOpts, reserveOffset, hint: NULL_BYTES }, takerToken, makerToken, takerFillAmounts],
 | 
			
		||||
            callback: (callResults: string, fillData: KyberFillData): BigNumber[] => {
 | 
			
		||||
                const [reserveId, hint, samples] = this._samplerContract.getABIDecodedReturnData<
 | 
			
		||||
                    [string, string, BigNumber[]]
 | 
			
		||||
                >('sampleSellsFromKyberNetwork', callResults);
 | 
			
		||||
                fillData.hint = hint;
 | 
			
		||||
                fillData.reserveId = reserveId;
 | 
			
		||||
                fillData.networkProxy = kyberOpts.networkProxy;
 | 
			
		||||
                return isAllowedKyberReserveId(reserveId) ? samples : [];
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public getKyberBuyQuotes(
 | 
			
		||||
        kyberOpts: KyberSamplerOpts,
 | 
			
		||||
        reserveOffset: BigNumber,
 | 
			
		||||
        makerToken: string,
 | 
			
		||||
        takerToken: string,
 | 
			
		||||
        makerFillAmounts: BigNumber[],
 | 
			
		||||
    ): SourceQuoteOperation {
 | 
			
		||||
        return new SamplerContractOperation({
 | 
			
		||||
            source: ERC20BridgeSource.Kyber,
 | 
			
		||||
            contract: this._samplerContract,
 | 
			
		||||
            function: this._samplerContract.sampleBuysFromKyberNetwork,
 | 
			
		||||
            params: [{ ...kyberOpts, reserveOffset, hint: NULL_BYTES }, takerToken, makerToken, makerFillAmounts],
 | 
			
		||||
            callback: (callResults: string, fillData: KyberFillData): BigNumber[] => {
 | 
			
		||||
                const [reserveId, hint, samples] = this._samplerContract.getABIDecodedReturnData<
 | 
			
		||||
                    [string, string, BigNumber[]]
 | 
			
		||||
                >('sampleBuysFromKyberNetwork', callResults);
 | 
			
		||||
                fillData.hint = hint;
 | 
			
		||||
                fillData.reserveId = reserveId;
 | 
			
		||||
                fillData.networkProxy = kyberOpts.networkProxy;
 | 
			
		||||
                return isAllowedKyberReserveId(reserveId) ? samples : [];
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public getKyberDmmSellQuotes(
 | 
			
		||||
        router: string,
 | 
			
		||||
        tokenAddressPath: string[],
 | 
			
		||||
@@ -1479,16 +1425,6 @@ export class SamplerOperations {
 | 
			
		||||
                            return [];
 | 
			
		||||
                        }
 | 
			
		||||
                        return this.getKyberDmmSellQuotes(kyberDmmRouter, [takerToken, makerToken], takerFillAmounts);
 | 
			
		||||
                    case ERC20BridgeSource.Kyber:
 | 
			
		||||
                        return getKyberOffsets().map(offset =>
 | 
			
		||||
                            this.getKyberSellQuotes(
 | 
			
		||||
                                KYBER_CONFIG_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                                offset,
 | 
			
		||||
                                makerToken,
 | 
			
		||||
                                takerToken,
 | 
			
		||||
                                takerFillAmounts,
 | 
			
		||||
                            ),
 | 
			
		||||
                        );
 | 
			
		||||
                    case ERC20BridgeSource.Curve:
 | 
			
		||||
                    case ERC20BridgeSource.CurveV2:
 | 
			
		||||
                    case ERC20BridgeSource.Nerve:
 | 
			
		||||
@@ -1810,16 +1746,6 @@ export class SamplerOperations {
 | 
			
		||||
                            return [];
 | 
			
		||||
                        }
 | 
			
		||||
                        return this.getKyberDmmBuyQuotes(kyberDmmRouter, [takerToken, makerToken], makerFillAmounts);
 | 
			
		||||
                    case ERC20BridgeSource.Kyber:
 | 
			
		||||
                        return getKyberOffsets().map(offset =>
 | 
			
		||||
                            this.getKyberBuyQuotes(
 | 
			
		||||
                                KYBER_CONFIG_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                                offset,
 | 
			
		||||
                                makerToken,
 | 
			
		||||
                                takerToken,
 | 
			
		||||
                                makerFillAmounts,
 | 
			
		||||
                            ),
 | 
			
		||||
                        );
 | 
			
		||||
                    case ERC20BridgeSource.Curve:
 | 
			
		||||
                    case ERC20BridgeSource.CurveV2:
 | 
			
		||||
                    case ERC20BridgeSource.Nerve:
 | 
			
		||||
 
 | 
			
		||||
@@ -46,9 +46,12 @@ export enum ERC20BridgeSource {
 | 
			
		||||
    Uniswap = 'Uniswap',
 | 
			
		||||
    UniswapV2 = 'Uniswap_V2',
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
=======
 | 
			
		||||
    Kyber = 'Kyber',
 | 
			
		||||
>>>>>>> 9eadc5fc2 (chore: Offboard Eth2Dai [TKR-356] (#470))
 | 
			
		||||
=======
 | 
			
		||||
>>>>>>> 2d16f83e3 (Offboard/clean up Oasis, CoFix, and legacy Kyber [TKR-405] (#482))
 | 
			
		||||
    Curve = 'Curve',
 | 
			
		||||
    LiquidityProvider = 'LiquidityProvider',
 | 
			
		||||
    MultiBridge = 'MultiBridge',
 | 
			
		||||
@@ -244,8 +247,61 @@ export interface LiquidityProviderFillData extends FillData {
 | 
			
		||||
    gasCost: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
export interface BridgeFillData {
 | 
			
		||||
    encodedFillData: Bytes;
 | 
			
		||||
=======
 | 
			
		||||
export interface BancorFillData extends FillData {
 | 
			
		||||
    path: string[];
 | 
			
		||||
    networkAddress: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface MooniswapFillData extends FillData {
 | 
			
		||||
    poolAddress: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface DODOFillData extends FillData {
 | 
			
		||||
    poolAddress: string;
 | 
			
		||||
    isSellBase: boolean;
 | 
			
		||||
    helperAddress: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface GenericRouterFillData extends FillData {
 | 
			
		||||
    router: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface MultiHopFillData extends FillData {
 | 
			
		||||
    firstHopSource: SourceQuoteOperation;
 | 
			
		||||
    secondHopSource: SourceQuoteOperation;
 | 
			
		||||
    intermediateToken: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface MakerPsmExtendedData {
 | 
			
		||||
    isSellOperation: boolean;
 | 
			
		||||
    takerToken: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type MakerPsmFillData = FillData & MakerPsmExtendedData & PsmInfo;
 | 
			
		||||
 | 
			
		||||
export interface HopInfo {
 | 
			
		||||
    sourceIndex: BigNumber;
 | 
			
		||||
    returnData: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface UniswapV3PathAmount {
 | 
			
		||||
    uniswapPath: string;
 | 
			
		||||
    inputAmount: BigNumber;
 | 
			
		||||
    gasUsed: number;
 | 
			
		||||
}
 | 
			
		||||
export interface UniswapV3FillData extends FillData {
 | 
			
		||||
    tokenAddressPath: string[];
 | 
			
		||||
    router: string;
 | 
			
		||||
    pathAmounts: UniswapV3PathAmount[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface KyberDmmFillData extends UniswapV2FillData {
 | 
			
		||||
    poolsPath: string[];
 | 
			
		||||
>>>>>>> 2d16f83e3 (Offboard/clean up Oasis, CoFix, and legacy Kyber [TKR-405] (#482))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface UniswapV2FillData extends BridgeFillData {
 | 
			
		||||
@@ -640,9 +696,3 @@ export interface GenerateOptimizedOrdersOpts {
 | 
			
		||||
export interface ComparisonPrice {
 | 
			
		||||
    wholeOrder: BigNumber | undefined;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface KyberSamplerOpts {
 | 
			
		||||
    networkProxy: string;
 | 
			
		||||
    hintHandler: string;
 | 
			
		||||
    weth: string;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@ import * as IBalancerV2Vault from '../test/generated-artifacts/IBalancerV2Vault.
 | 
			
		||||
import * as IBancor from '../test/generated-artifacts/IBancor.json';
 | 
			
		||||
import * as ICurve from '../test/generated-artifacts/ICurve.json';
 | 
			
		||||
import * as IGMX from '../test/generated-artifacts/IGMX.json';
 | 
			
		||||
import * as IKyberNetwork from '../test/generated-artifacts/IKyberNetwork.json';
 | 
			
		||||
import * as IMooniswap from '../test/generated-artifacts/IMooniswap.json';
 | 
			
		||||
import * as IMStable from '../test/generated-artifacts/IMStable.json';
 | 
			
		||||
import * as IMultiBridge from '../test/generated-artifacts/IMultiBridge.json';
 | 
			
		||||
@@ -36,7 +35,6 @@ import * as ISmoothy from '../test/generated-artifacts/ISmoothy.json';
 | 
			
		||||
import * as IUniswapExchangeQuotes from '../test/generated-artifacts/IUniswapExchangeQuotes.json';
 | 
			
		||||
import * as IUniswapV2Router01 from '../test/generated-artifacts/IUniswapV2Router01.json';
 | 
			
		||||
import * as KyberDmmSampler from '../test/generated-artifacts/KyberDmmSampler.json';
 | 
			
		||||
import * as KyberSampler from '../test/generated-artifacts/KyberSampler.json';
 | 
			
		||||
import * as LidoSampler from '../test/generated-artifacts/LidoSampler.json';
 | 
			
		||||
import * as LiquidityProviderSampler from '../test/generated-artifacts/LiquidityProviderSampler.json';
 | 
			
		||||
import * as MakerPSMSampler from '../test/generated-artifacts/MakerPSMSampler.json';
 | 
			
		||||
@@ -72,7 +70,6 @@ export const artifacts = {
 | 
			
		||||
    FakeTaker: FakeTaker as ContractArtifact,
 | 
			
		||||
    GMXSampler: GMXSampler as ContractArtifact,
 | 
			
		||||
    KyberDmmSampler: KyberDmmSampler as ContractArtifact,
 | 
			
		||||
    KyberSampler: KyberSampler as ContractArtifact,
 | 
			
		||||
    LidoSampler: LidoSampler as ContractArtifact,
 | 
			
		||||
    LiquidityProviderSampler: LiquidityProviderSampler as ContractArtifact,
 | 
			
		||||
    MStableSampler: MStableSampler as ContractArtifact,
 | 
			
		||||
@@ -93,7 +90,6 @@ export const artifacts = {
 | 
			
		||||
    IBancor: IBancor as ContractArtifact,
 | 
			
		||||
    ICurve: ICurve as ContractArtifact,
 | 
			
		||||
    IGMX: IGMX as ContractArtifact,
 | 
			
		||||
    IKyberNetwork: IKyberNetwork as ContractArtifact,
 | 
			
		||||
    IMStable: IMStable as ContractArtifact,
 | 
			
		||||
    IMooniswap: IMooniswap as ContractArtifact,
 | 
			
		||||
    IMultiBridge: IMultiBridge as ContractArtifact,
 | 
			
		||||
 
 | 
			
		||||
@@ -21,8 +21,8 @@ const GAS_PRICE = new BigNumber(50e9); // 50 gwei
 | 
			
		||||
const NATIVE_ORDER_FEE = new BigNumber(220e3); // 220K gas
 | 
			
		||||
 | 
			
		||||
// DEX samples to fill in MarketSideLiquidity
 | 
			
		||||
const kyberSample1: DexSample = {
 | 
			
		||||
    source: ERC20BridgeSource.Kyber,
 | 
			
		||||
const curveSample: DexSample = {
 | 
			
		||||
    source: ERC20BridgeSource.Curve,
 | 
			
		||||
    input: new BigNumber(10000),
 | 
			
		||||
    output: new BigNumber(10001),
 | 
			
		||||
    fillData: {},
 | 
			
		||||
@@ -33,7 +33,7 @@ const uniswapSample1: DexSample = {
 | 
			
		||||
    output: new BigNumber(10004),
 | 
			
		||||
    fillData: {},
 | 
			
		||||
};
 | 
			
		||||
const dexQuotes: DexSample[] = [kyberSample1, uniswapSample1];
 | 
			
		||||
const dexQuotes: DexSample[] = [curveSample, uniswapSample1];
 | 
			
		||||
 | 
			
		||||
const feeSchedule = {
 | 
			
		||||
    [ERC20BridgeSource.Native]: _.constant(GAS_PRICE.times(NATIVE_ORDER_FEE)),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,7 @@
 | 
			
		||||
import { ChainId } from '@0x/contract-addresses';
 | 
			
		||||
import { blockchainTests, describe, expect, toBaseUnitAmount, Web3ProviderEngine } from '@0x/contracts-test-utils';
 | 
			
		||||
import { RPCSubprovider } from '@0x/subproviders';
 | 
			
		||||
import { BigNumber, NULL_BYTES, providerUtils } from '@0x/utils';
 | 
			
		||||
import { BigNumber, providerUtils } from '@0x/utils';
 | 
			
		||||
 | 
			
		||||
import { KYBER_CONFIG_BY_CHAIN_ID, MAINNET_TOKENS } from '../../src/utils/market_operation_utils/constants';
 | 
			
		||||
import { artifacts } from '../artifacts';
 | 
			
		||||
import { ERC20BridgeSamplerContract } from '../wrappers';
 | 
			
		||||
 | 
			
		||||
@@ -79,60 +77,4 @@ blockchainTests.skip('Mainnet Sampler Tests', env => {
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    describe('Kyber', () => {
 | 
			
		||||
        const WETH = MAINNET_TOKENS.WETH;
 | 
			
		||||
        const DAI = MAINNET_TOKENS.DAI;
 | 
			
		||||
        const USDC = MAINNET_TOKENS.USDC;
 | 
			
		||||
        const RESERVE_OFFSET = new BigNumber(0);
 | 
			
		||||
        const KYBER_OPTS = {
 | 
			
		||||
            ...KYBER_CONFIG_BY_CHAIN_ID[ChainId.Mainnet],
 | 
			
		||||
            reserveOffset: RESERVE_OFFSET,
 | 
			
		||||
            hint: NULL_BYTES,
 | 
			
		||||
        };
 | 
			
		||||
        describe('sampleSellsFromKyberNetwork()', () => {
 | 
			
		||||
            it('samples sells from Kyber DAI->WETH', async () => {
 | 
			
		||||
                const [, samples] = await testContract
 | 
			
		||||
                    .sampleSellsFromKyberNetwork(KYBER_OPTS, DAI, WETH, [toBaseUnitAmount(1)])
 | 
			
		||||
                    .callAsync({ overrides });
 | 
			
		||||
                expect(samples.length).to.be.bignumber.greaterThan(0);
 | 
			
		||||
                expect(samples[0]).to.be.bignumber.greaterThan(0);
 | 
			
		||||
            });
 | 
			
		||||
            it('samples sells from Kyber WETH->DAI', async () => {
 | 
			
		||||
                const [, samples] = await testContract
 | 
			
		||||
                    .sampleSellsFromKyberNetwork(KYBER_OPTS, WETH, DAI, [toBaseUnitAmount(1)])
 | 
			
		||||
                    .callAsync({ overrides });
 | 
			
		||||
                expect(samples.length).to.be.bignumber.greaterThan(0);
 | 
			
		||||
                expect(samples[0]).to.be.bignumber.greaterThan(0);
 | 
			
		||||
            });
 | 
			
		||||
            it('samples sells from Kyber DAI->USDC', async () => {
 | 
			
		||||
                const [, samples] = await testContract
 | 
			
		||||
                    .sampleSellsFromKyberNetwork(KYBER_OPTS, DAI, USDC, [toBaseUnitAmount(1)])
 | 
			
		||||
                    .callAsync({ overrides });
 | 
			
		||||
                expect(samples.length).to.be.bignumber.greaterThan(0);
 | 
			
		||||
                expect(samples[0]).to.be.bignumber.greaterThan(0);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        describe('sampleBuysFromKyber()', () => {
 | 
			
		||||
            it('samples buys from Kyber WETH->DAI', async () => {
 | 
			
		||||
                // From ETH to DAI
 | 
			
		||||
                // I want to buy 1 DAI
 | 
			
		||||
                const [, samples] = await testContract
 | 
			
		||||
                    .sampleBuysFromKyberNetwork(KYBER_OPTS, WETH, DAI, [toBaseUnitAmount(1)])
 | 
			
		||||
                    .callAsync({ overrides });
 | 
			
		||||
                expect(samples.length).to.be.bignumber.greaterThan(0);
 | 
			
		||||
                expect(samples[0]).to.be.bignumber.greaterThan(0);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            it('samples buys from Kyber DAI->WETH', async () => {
 | 
			
		||||
                // From USDC to DAI
 | 
			
		||||
                // I want to buy 1 WETH
 | 
			
		||||
                const [, samples] = await testContract
 | 
			
		||||
                    .sampleBuysFromKyberNetwork(KYBER_OPTS, DAI, WETH, [toBaseUnitAmount(1)])
 | 
			
		||||
                    .callAsync({ overrides });
 | 
			
		||||
                expect(samples.length).to.be.bignumber.greaterThan(0);
 | 
			
		||||
                expect(samples[0]).to.be.bignumber.greaterThan(0);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ import { generatePseudoRandomSalt } from './utils/utils';
 | 
			
		||||
const CHAIN_ID = 1;
 | 
			
		||||
const EMPTY_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000';
 | 
			
		||||
// tslint:disable: custom-no-magic-numbers
 | 
			
		||||
describe.skip('DexSampler tests', () => {
 | 
			
		||||
describe('DexSampler tests', () => {
 | 
			
		||||
    const MAKER_TOKEN = randomAddress();
 | 
			
		||||
    const TAKER_TOKEN = randomAddress();
 | 
			
		||||
    const chainId = ChainId.Mainnet;
 | 
			
		||||
@@ -142,40 +142,6 @@ describe.skip('DexSampler tests', () => {
 | 
			
		||||
            expect(fillableAmounts).to.deep.eq(expectedFillableAmounts);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('getKyberSellQuotes()', async () => {
 | 
			
		||||
            const expectedTakerToken = randomAddress();
 | 
			
		||||
            const expectedMakerToken = randomAddress();
 | 
			
		||||
            const expectedTakerFillAmounts = getSampleAmounts(new BigNumber(100e18), 10);
 | 
			
		||||
            const expectedMakerFillAmounts = getSampleAmounts(new BigNumber(100e18), 10);
 | 
			
		||||
            const sampler = new MockSamplerContract({
 | 
			
		||||
                sampleSellsFromKyberNetwork: (_reserveOffset, takerToken, makerToken, fillAmounts) => {
 | 
			
		||||
                    expect(takerToken).to.eq(expectedTakerToken);
 | 
			
		||||
                    expect(makerToken).to.eq(expectedMakerToken);
 | 
			
		||||
                    expect(fillAmounts).to.deep.eq(expectedTakerFillAmounts);
 | 
			
		||||
                    return ['0x', '0x', expectedMakerFillAmounts];
 | 
			
		||||
                },
 | 
			
		||||
            });
 | 
			
		||||
            const dexOrderSampler = new DexOrderSampler(
 | 
			
		||||
                chainId,
 | 
			
		||||
                sampler,
 | 
			
		||||
                undefined,
 | 
			
		||||
                undefined,
 | 
			
		||||
                undefined,
 | 
			
		||||
                undefined,
 | 
			
		||||
                async () => undefined,
 | 
			
		||||
            );
 | 
			
		||||
            const [fillableAmounts] = await dexOrderSampler.executeAsync(
 | 
			
		||||
                dexOrderSampler.getKyberSellQuotes(
 | 
			
		||||
                    { hintHandler: randomAddress(), networkProxy: randomAddress(), weth: randomAddress() },
 | 
			
		||||
                    new BigNumber(0),
 | 
			
		||||
                    expectedMakerToken,
 | 
			
		||||
                    expectedTakerToken,
 | 
			
		||||
                    expectedTakerFillAmounts,
 | 
			
		||||
                ),
 | 
			
		||||
            );
 | 
			
		||||
            expect(fillableAmounts).to.deep.eq(expectedMakerFillAmounts);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('getLiquidityProviderSellQuotes()', async () => {
 | 
			
		||||
            const expectedMakerToken = randomAddress();
 | 
			
		||||
            const expectedTakerToken = randomAddress();
 | 
			
		||||
@@ -370,7 +336,6 @@ describe.skip('DexSampler tests', () => {
 | 
			
		||||
            const expectedMakerToken = randomAddress();
 | 
			
		||||
            const sources = [ERC20BridgeSource.Uniswap, ERC20BridgeSource.UniswapV2];
 | 
			
		||||
            const ratesBySource: RatesBySource = {
 | 
			
		||||
                [ERC20BridgeSource.Kyber]: getRandomFloat(0, 100),
 | 
			
		||||
                [ERC20BridgeSource.Uniswap]: getRandomFloat(0, 100),
 | 
			
		||||
                [ERC20BridgeSource.UniswapV2]: getRandomFloat(0, 100),
 | 
			
		||||
            };
 | 
			
		||||
 
 | 
			
		||||
@@ -50,9 +50,9 @@ const TAKER_TOKEN = randomAddress();
 | 
			
		||||
 | 
			
		||||
const DEFAULT_INCLUDED = [
 | 
			
		||||
    ERC20BridgeSource.SushiSwap,
 | 
			
		||||
    ERC20BridgeSource.Kyber,
 | 
			
		||||
    ERC20BridgeSource.Native,
 | 
			
		||||
    ERC20BridgeSource.Uniswap,
 | 
			
		||||
    ERC20BridgeSource.Curve,
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const DEFAULT_EXCLUDED = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].sources.filter(
 | 
			
		||||
@@ -321,7 +321,7 @@ describe('MarketOperationUtils tests', () => {
 | 
			
		||||
        [ERC20BridgeSource.Native]: createDecreasingRates(NUM_SAMPLES),
 | 
			
		||||
        [ERC20BridgeSource.SushiSwap]: createDecreasingRates(NUM_SAMPLES),
 | 
			
		||||
        [ERC20BridgeSource.Uniswap]: createDecreasingRates(NUM_SAMPLES),
 | 
			
		||||
        [ERC20BridgeSource.Kyber]: createDecreasingRates(NUM_SAMPLES),
 | 
			
		||||
        [ERC20BridgeSource.Curve]: createDecreasingRates(NUM_SAMPLES),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    interface FillDataBySource {
 | 
			
		||||
@@ -337,7 +337,6 @@ describe('MarketOperationUtils tests', () => {
 | 
			
		||||
            deadline: Math.floor(Date.now() / 1000) + 300,
 | 
			
		||||
        },
 | 
			
		||||
        [ERC20BridgeSource.Bancor]: { path: [], networkAddress: randomAddress() },
 | 
			
		||||
        [ERC20BridgeSource.Kyber]: { hint: '0x', reserveId: '0x', networkAddress: randomAddress() },
 | 
			
		||||
        [ERC20BridgeSource.Curve]: {
 | 
			
		||||
            pool: {
 | 
			
		||||
                poolAddress: randomAddress(),
 | 
			
		||||
@@ -1034,7 +1033,7 @@ describe('MarketOperationUtils tests', () => {
 | 
			
		||||
                rates[ERC20BridgeSource.Native] = [0.4, 0.3, 0.2, 0.1];
 | 
			
		||||
                rates[ERC20BridgeSource.Uniswap] = [0.5, 0.05, 0.05, 0.05];
 | 
			
		||||
                rates[ERC20BridgeSource.SushiSwap] = [0.6, 0.05, 0.05, 0.05];
 | 
			
		||||
                rates[ERC20BridgeSource.Kyber] = [0, 0, 0, 0]; // unused
 | 
			
		||||
                rates[ERC20BridgeSource.Curve] = [0, 0, 0, 0]; // unused
 | 
			
		||||
                replaceSamplerOps({
 | 
			
		||||
                    getSellQuotes: createGetMultipleSellQuotesOperationFromRates(rates),
 | 
			
		||||
                });
 | 
			
		||||
@@ -1066,7 +1065,6 @@ describe('MarketOperationUtils tests', () => {
 | 
			
		||||
                    [ERC20BridgeSource.Native]: [1, 0.99, 0.98, 0.97], // Effectively [0.94, 0.93, 0.92, 0.91]
 | 
			
		||||
                    [ERC20BridgeSource.Uniswap]: [0.96, 0.1, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.SushiSwap]: [0.95, 0.1, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.Kyber]: [0.1, 0.1, 0.1, 0.1],
 | 
			
		||||
                };
 | 
			
		||||
                const feeSchedule = {
 | 
			
		||||
                    [ERC20BridgeSource.Native]: _.constant(
 | 
			
		||||
@@ -1097,12 +1095,10 @@ describe('MarketOperationUtils tests', () => {
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            it('factors in fees for dexes', async () => {
 | 
			
		||||
                // Kyber will have the best rates but will have fees,
 | 
			
		||||
                // dropping its effective rates.
 | 
			
		||||
                const uniswapFeeRate = 0.2;
 | 
			
		||||
                const rates: RatesBySource = {
 | 
			
		||||
                    [ERC20BridgeSource.Native]: [0.95, 0.1, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.Kyber]: [0.1, 0.1, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.Curve]: [0.1, 0.1, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.SushiSwap]: [0.92, 0.1, 0.1, 0.1],
 | 
			
		||||
                    // Effectively [0.8, ~0.5, ~0, ~0]
 | 
			
		||||
                    [ERC20BridgeSource.Uniswap]: [1, 0.7, 0.2, 0.2],
 | 
			
		||||
@@ -1136,7 +1132,7 @@ describe('MarketOperationUtils tests', () => {
 | 
			
		||||
 | 
			
		||||
            it('can mix one concave source', async () => {
 | 
			
		||||
                const rates: RatesBySource = {
 | 
			
		||||
                    [ERC20BridgeSource.Kyber]: [0, 0, 0, 0], // Won't use
 | 
			
		||||
                    [ERC20BridgeSource.Curve]: [0, 0, 0, 0], // Won't use
 | 
			
		||||
                    [ERC20BridgeSource.SushiSwap]: [0.5, 0.85, 0.75, 0.75], // Concave
 | 
			
		||||
                    [ERC20BridgeSource.Uniswap]: [0.96, 0.2, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.Native]: [0.95, 0.2, 0.2, 0.1],
 | 
			
		||||
@@ -1168,7 +1164,7 @@ describe('MarketOperationUtils tests', () => {
 | 
			
		||||
                rates[ERC20BridgeSource.Native] = [1, 1, 0.01, 0.01];
 | 
			
		||||
                rates[ERC20BridgeSource.Uniswap] = [1, 1, 0.01, 0.01];
 | 
			
		||||
                rates[ERC20BridgeSource.SushiSwap] = [0.49, 0.49, 0.49, 0.49];
 | 
			
		||||
                rates[ERC20BridgeSource.Kyber] = [0.35, 0.2, 0.01, 0.01];
 | 
			
		||||
                rates[ERC20BridgeSource.Curve] = [0.35, 0.2, 0.01, 0.01];
 | 
			
		||||
                replaceSamplerOps({
 | 
			
		||||
                    getSellQuotes: createGetMultipleSellQuotesOperationFromRates(rates),
 | 
			
		||||
                });
 | 
			
		||||
@@ -1517,7 +1513,7 @@ describe('MarketOperationUtils tests', () => {
 | 
			
		||||
                    [ERC20BridgeSource.Native]: [1, 0.99, 0.98, 0.97], // Effectively [0.94, ~0.93, ~0.92, ~0.91]
 | 
			
		||||
                    [ERC20BridgeSource.Uniswap]: [0.96, 0.1, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.SushiSwap]: [0.95, 0.1, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.Kyber]: [0.1, 0.1, 0.1, 0.1],
 | 
			
		||||
                    [ERC20BridgeSource.Curve]: [0.1, 0.1, 0.1, 0.1],
 | 
			
		||||
                };
 | 
			
		||||
                const feeSchedule = {
 | 
			
		||||
                    [ERC20BridgeSource.Native]: _.constant(
 | 
			
		||||
 
 | 
			
		||||
@@ -58,8 +58,8 @@ describe('generateQuoteReport', async () => {
 | 
			
		||||
    it('should generate report properly for sell', () => {
 | 
			
		||||
        const marketOperation: MarketOperation = MarketOperation.Sell;
 | 
			
		||||
 | 
			
		||||
        const kyberSample2: DexSample = {
 | 
			
		||||
            source: ERC20BridgeSource.Kyber,
 | 
			
		||||
        const balancerSample2: DexSample = {
 | 
			
		||||
            source: ERC20BridgeSource.BalancerV2,
 | 
			
		||||
            input: new BigNumber(10003),
 | 
			
		||||
            output: new BigNumber(10004),
 | 
			
		||||
            fillData: {},
 | 
			
		||||
@@ -117,15 +117,15 @@ describe('generateQuoteReport', async () => {
 | 
			
		||||
            sourcePathId: hexUtils.random(),
 | 
			
		||||
            type: FillQuoteTransformerOrderType.Bridge,
 | 
			
		||||
        };
 | 
			
		||||
        const kyber2Fill: CollapsedFill = {
 | 
			
		||||
            ...kyberSample2,
 | 
			
		||||
        const balancer2Fill: CollapsedFill = {
 | 
			
		||||
            ...balancerSample2,
 | 
			
		||||
            subFills: [],
 | 
			
		||||
            sourcePathId: hexUtils.random(),
 | 
			
		||||
            type: FillQuoteTransformerOrderType.Bridge,
 | 
			
		||||
        };
 | 
			
		||||
        const orderbookOrder2Fill: CollapsedFill = collapsedFillFromNativeOrder(orderbookOrder2);
 | 
			
		||||
        const rfqtOrder2Fill: CollapsedFill = collapsedFillFromNativeOrder(rfqtOrder2);
 | 
			
		||||
        const pathGenerated: CollapsedFill[] = [rfqtOrder2Fill, orderbookOrder2Fill, uniswap2Fill, kyber2Fill];
 | 
			
		||||
        const pathGenerated: CollapsedFill[] = [rfqtOrder2Fill, orderbookOrder2Fill, uniswap2Fill, balancer2Fill];
 | 
			
		||||
 | 
			
		||||
        // quote generator mock
 | 
			
		||||
        const quoteRequestor = TypeMoq.Mock.ofType<QuoteRequestor>();
 | 
			
		||||
@@ -190,10 +190,10 @@ describe('generateQuoteReport', async () => {
 | 
			
		||||
            takerAmount: uniswapSample2.input,
 | 
			
		||||
            fillData: {},
 | 
			
		||||
        };
 | 
			
		||||
        const kyber2Source: BridgeQuoteReportEntry = {
 | 
			
		||||
            liquiditySource: ERC20BridgeSource.Kyber,
 | 
			
		||||
            makerAmount: kyberSample2.output,
 | 
			
		||||
            takerAmount: kyberSample2.input,
 | 
			
		||||
        const balancer2Source: BridgeQuoteReportEntry = {
 | 
			
		||||
            liquiditySource: ERC20BridgeSource.BalancerV2,
 | 
			
		||||
            makerAmount: balancerSample2.output,
 | 
			
		||||
            takerAmount: balancerSample2.input,
 | 
			
		||||
            fillData: {},
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
@@ -202,7 +202,7 @@ describe('generateQuoteReport', async () => {
 | 
			
		||||
            rfqtOrder2Source,
 | 
			
		||||
            orderbookOrder2Source,
 | 
			
		||||
            uniswap2Source,
 | 
			
		||||
            kyber2Source,
 | 
			
		||||
            balancer2Source,
 | 
			
		||||
        ];
 | 
			
		||||
        expectEqualQuoteReportEntries(orderReport.sourcesConsidered, expectedSourcesConsidered, `sourcesConsidered`);
 | 
			
		||||
        expectEqualQuoteReportEntries(orderReport.sourcesDelivered, expectedSourcesDelivered, `sourcesDelivered`);
 | 
			
		||||
@@ -210,8 +210,8 @@ describe('generateQuoteReport', async () => {
 | 
			
		||||
    });
 | 
			
		||||
    it('should handle properly for buy without quoteRequestor', () => {
 | 
			
		||||
        const marketOperation: MarketOperation = MarketOperation.Buy;
 | 
			
		||||
        const kyberSample1: DexSample = {
 | 
			
		||||
            source: ERC20BridgeSource.Kyber,
 | 
			
		||||
        const balancerSample1: DexSample = {
 | 
			
		||||
            source: ERC20BridgeSource.BalancerV2,
 | 
			
		||||
            input: new BigNumber(10000),
 | 
			
		||||
            output: new BigNumber(10001),
 | 
			
		||||
            fillData: {},
 | 
			
		||||
@@ -248,13 +248,13 @@ describe('generateQuoteReport', async () => {
 | 
			
		||||
            sourcePathId: hexUtils.random(),
 | 
			
		||||
            type: FillQuoteTransformerOrderType.Bridge,
 | 
			
		||||
        };
 | 
			
		||||
        const kyber1Fill: CollapsedFill = {
 | 
			
		||||
            ...kyberSample1,
 | 
			
		||||
        const balancer1Fill: CollapsedFill = {
 | 
			
		||||
            ...balancerSample1,
 | 
			
		||||
            subFills: [],
 | 
			
		||||
            sourcePathId: hexUtils.random(),
 | 
			
		||||
            type: FillQuoteTransformerOrderType.Bridge,
 | 
			
		||||
        };
 | 
			
		||||
        const pathGenerated: CollapsedFill[] = [orderbookOrder1Fill, uniswap1Fill, kyber1Fill];
 | 
			
		||||
        const pathGenerated: CollapsedFill[] = [orderbookOrder1Fill, uniswap1Fill, balancer1Fill];
 | 
			
		||||
 | 
			
		||||
        const orderReport = generateQuoteReport(marketOperation, nativeOrders, pathGenerated);
 | 
			
		||||
 | 
			
		||||
@@ -274,16 +274,16 @@ describe('generateQuoteReport', async () => {
 | 
			
		||||
            takerAmount: uniswapSample1.output,
 | 
			
		||||
            fillData: {},
 | 
			
		||||
        };
 | 
			
		||||
        const kyber1Source: BridgeQuoteReportEntry = {
 | 
			
		||||
            liquiditySource: ERC20BridgeSource.Kyber,
 | 
			
		||||
            makerAmount: kyberSample1.input,
 | 
			
		||||
            takerAmount: kyberSample1.output,
 | 
			
		||||
        const balancer1Source: BridgeQuoteReportEntry = {
 | 
			
		||||
            liquiditySource: ERC20BridgeSource.BalancerV2,
 | 
			
		||||
            makerAmount: balancerSample1.input,
 | 
			
		||||
            takerAmount: balancerSample1.output,
 | 
			
		||||
            fillData: {},
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        // No order is considered here because only Native RFQ orders are considered.
 | 
			
		||||
        const expectedSourcesConsidered: QuoteReportEntry[] = [];
 | 
			
		||||
        const expectedSourcesDelivered: QuoteReportEntry[] = [orderbookOrder1Source, uniswap1Source, kyber1Source];
 | 
			
		||||
        const expectedSourcesDelivered: QuoteReportEntry[] = [orderbookOrder1Source, uniswap1Source, balancer1Source];
 | 
			
		||||
        expectEqualQuoteReportEntries(orderReport.sourcesConsidered, expectedSourcesConsidered, `sourcesConsidered`);
 | 
			
		||||
        expectEqualQuoteReportEntries(orderReport.sourcesDelivered, expectedSourcesDelivered, `sourcesDelivered`);
 | 
			
		||||
    });
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,9 @@
 | 
			
		||||
import { ContractTxFunctionObj } from '@0x/base-contract';
 | 
			
		||||
import { constants } from '@0x/contracts-test-utils';
 | 
			
		||||
import { LimitOrderFields, Signature } from '@0x/protocol-utils';
 | 
			
		||||
import { BigNumber, hexUtils, NULL_BYTES } from '@0x/utils';
 | 
			
		||||
import { BigNumber, hexUtils } from '@0x/utils';
 | 
			
		||||
 | 
			
		||||
import { SamplerCallResult } from '../../src/types';
 | 
			
		||||
import { KyberSamplerOpts } from '../../src/utils/market_operation_utils/types';
 | 
			
		||||
import { ERC20BridgeSamplerContract } from '../../src/wrappers';
 | 
			
		||||
 | 
			
		||||
export type GetOrderFillableAssetAmountResult = BigNumber[];
 | 
			
		||||
@@ -39,18 +38,6 @@ export type SampleBuysEth2DaiHandler = (
 | 
			
		||||
    makerToken: string,
 | 
			
		||||
    makerTokenAmounts: BigNumber[],
 | 
			
		||||
) => SampleResults;
 | 
			
		||||
export type SampleSellsKyberHandler = (
 | 
			
		||||
    opts: KyberSamplerOpts,
 | 
			
		||||
    takerToken: string,
 | 
			
		||||
    makerToken: string,
 | 
			
		||||
    takerTokenAmounts: BigNumber[],
 | 
			
		||||
) => [string, string, SampleResults];
 | 
			
		||||
export type SampleBuysKyberHandler = (
 | 
			
		||||
    reserveId: string,
 | 
			
		||||
    takerToken: string,
 | 
			
		||||
    makerToken: string,
 | 
			
		||||
    makerTokenAmounts: BigNumber[],
 | 
			
		||||
) => [string, SampleResults];
 | 
			
		||||
export type SampleUniswapV2Handler = (router: string, path: string[], assetAmounts: BigNumber[]) => SampleResults;
 | 
			
		||||
export type SampleBuysMultihopHandler = (path: string[], takerTokenAmounts: BigNumber[]) => SampleResults;
 | 
			
		||||
export type SampleSellsLPHandler = (
 | 
			
		||||
@@ -70,7 +57,6 @@ const DUMMY_PROVIDER = {
 | 
			
		||||
interface Handlers {
 | 
			
		||||
    getLimitOrderFillableMakerAssetAmounts: GetOrderFillableAssetAmountHandler;
 | 
			
		||||
    getLimitOrderFillableTakerAssetAmounts: GetOrderFillableAssetAmountHandler;
 | 
			
		||||
    sampleSellsFromKyberNetwork: SampleSellsKyberHandler;
 | 
			
		||||
    sampleSellsFromLiquidityProvider: SampleSellsLPHandler;
 | 
			
		||||
    sampleSellsFromUniswap: SampleSellsUniswapHandler;
 | 
			
		||||
    sampleSellsFromUniswapV2: SampleUniswapV2Handler;
 | 
			
		||||
@@ -123,22 +109,6 @@ export class MockSamplerContract extends ERC20BridgeSamplerContract {
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public sampleSellsFromKyberNetwork(
 | 
			
		||||
        opts: KyberSamplerOpts,
 | 
			
		||||
        takerToken: string,
 | 
			
		||||
        makerToken: string,
 | 
			
		||||
        takerAssetAmounts: BigNumber[],
 | 
			
		||||
    ): ContractTxFunctionObj<[string, string, BigNumber[]]> {
 | 
			
		||||
        return this._wrapCall(
 | 
			
		||||
            super.sampleSellsFromKyberNetwork,
 | 
			
		||||
            this._handlers.sampleSellsFromKyberNetwork,
 | 
			
		||||
            { ...opts, reserveOffset: new BigNumber(1), hint: NULL_BYTES },
 | 
			
		||||
            takerToken,
 | 
			
		||||
            makerToken,
 | 
			
		||||
            takerAssetAmounts,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public sampleSellsFromUniswap(
 | 
			
		||||
        router: string,
 | 
			
		||||
        takerToken: string,
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ export * from '../test/generated-wrappers/i_balancer';
 | 
			
		||||
export * from '../test/generated-wrappers/i_balancer_v2_vault';
 | 
			
		||||
export * from '../test/generated-wrappers/i_bancor';
 | 
			
		||||
export * from '../test/generated-wrappers/i_curve';
 | 
			
		||||
export * from '../test/generated-wrappers/i_kyber_network';
 | 
			
		||||
export * from '../test/generated-wrappers/i_m_stable';
 | 
			
		||||
export * from '../test/generated-wrappers/i_mooniswap';
 | 
			
		||||
export * from '../test/generated-wrappers/i_multi_bridge';
 | 
			
		||||
@@ -34,7 +33,6 @@ export * from '../test/generated-wrappers/i_uniswap_exchange_quotes';
 | 
			
		||||
export * from '../test/generated-wrappers/i_uniswap_v2_router01';
 | 
			
		||||
export * from '../test/generated-wrappers/igmx';
 | 
			
		||||
export * from '../test/generated-wrappers/kyber_dmm_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/kyber_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/lido_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/liquidity_provider_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/m_stable_sampler';
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@
 | 
			
		||||
        "test/generated-artifacts/IBancor.json",
 | 
			
		||||
        "test/generated-artifacts/ICurve.json",
 | 
			
		||||
        "test/generated-artifacts/IGMX.json",
 | 
			
		||||
        "test/generated-artifacts/IKyberNetwork.json",
 | 
			
		||||
        "test/generated-artifacts/IMStable.json",
 | 
			
		||||
        "test/generated-artifacts/IMooniswap.json",
 | 
			
		||||
        "test/generated-artifacts/IMultiBridge.json",
 | 
			
		||||
@@ -36,7 +35,6 @@
 | 
			
		||||
        "test/generated-artifacts/IUniswapExchangeQuotes.json",
 | 
			
		||||
        "test/generated-artifacts/IUniswapV2Router01.json",
 | 
			
		||||
        "test/generated-artifacts/KyberDmmSampler.json",
 | 
			
		||||
        "test/generated-artifacts/KyberSampler.json",
 | 
			
		||||
        "test/generated-artifacts/LidoSampler.json",
 | 
			
		||||
        "test/generated-artifacts/LiquidityProviderSampler.json",
 | 
			
		||||
        "test/generated-artifacts/MStableSampler.json",
 | 
			
		||||
 
 | 
			
		||||
@@ -114,16 +114,13 @@ export enum BridgeProtocol {
 | 
			
		||||
    UniswapV2,
 | 
			
		||||
    Uniswap,
 | 
			
		||||
    Balancer,
 | 
			
		||||
    Kyber,
 | 
			
		||||
    Mooniswap,
 | 
			
		||||
    MStable,
 | 
			
		||||
    Oasis,
 | 
			
		||||
    Shell,
 | 
			
		||||
    Dodo,
 | 
			
		||||
    DodoV2,
 | 
			
		||||
    CryptoCom,
 | 
			
		||||
    Bancor,
 | 
			
		||||
    CoFiX,
 | 
			
		||||
    Nerve,
 | 
			
		||||
    MakerPsm,
 | 
			
		||||
    BalancerV2,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user