Compare commits
	
		
			7 Commits
		
	
	
		
			@0x/contra
			...
			feat/PTP
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d52d882b14 | ||
| 
						 | 
					4c8629840b | ||
| 
						 | 
					feede28293 | ||
| 
						 | 
					08cf51b101 | ||
| 
						 | 
					4ba6918e06 | ||
| 
						 | 
					52a3ffa77c | ||
| 
						 | 
					afe77a432c | 
@@ -33,6 +33,7 @@ import "./mixins/MixinCurveV2.sol";
 | 
			
		||||
import "./mixins/MixinCryptoCom.sol";
 | 
			
		||||
import "./mixins/MixinDodo.sol";
 | 
			
		||||
import "./mixins/MixinDodoV2.sol";
 | 
			
		||||
import "./mixins/MixinGMX.sol";
 | 
			
		||||
import "./mixins/MixinKyber.sol";
 | 
			
		||||
import "./mixins/MixinKyberDmm.sol";
 | 
			
		||||
import "./mixins/MixinLido.sol";
 | 
			
		||||
@@ -60,6 +61,7 @@ contract BridgeAdapter is
 | 
			
		||||
    MixinCryptoCom,
 | 
			
		||||
    MixinDodo,
 | 
			
		||||
    MixinDodoV2,
 | 
			
		||||
    MixinGMX,
 | 
			
		||||
    MixinKyber,
 | 
			
		||||
    MixinKyberDmm,
 | 
			
		||||
    MixinLido,
 | 
			
		||||
@@ -87,6 +89,7 @@ contract BridgeAdapter is
 | 
			
		||||
        MixinCryptoCom()
 | 
			
		||||
        MixinDodo()
 | 
			
		||||
        MixinDodoV2()
 | 
			
		||||
        MixinGMX()
 | 
			
		||||
        MixinKyber(weth)
 | 
			
		||||
        MixinLido(weth)
 | 
			
		||||
        MixinMakerPSM()
 | 
			
		||||
@@ -265,6 +268,12 @@ contract BridgeAdapter is
 | 
			
		||||
                sellAmount,
 | 
			
		||||
                order.bridgeData
 | 
			
		||||
            );
 | 
			
		||||
        } else if (protocolId == BridgeProtocols.GMX) {
 | 
			
		||||
            boughtAmount = _tradeGMX(
 | 
			
		||||
                buyToken,
 | 
			
		||||
                sellAmount,
 | 
			
		||||
                order.bridgeData
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            boughtAmount = _tradeZeroExBridge(
 | 
			
		||||
                sellToken,
 | 
			
		||||
 
 | 
			
		||||
@@ -52,4 +52,5 @@ library BridgeProtocols {
 | 
			
		||||
    uint128 internal constant CLIPPER     = 22; // Not used: Clipper is now using PLP interface
 | 
			
		||||
    uint128 internal constant AAVEV2      = 23;
 | 
			
		||||
    uint128 internal constant COMPOUND    = 24;
 | 
			
		||||
    uint128 internal constant GMX         = 25;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,104 @@
 | 
			
		||||
// 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-utils/contracts/src/v06/LibSafeMathV06.sol";
 | 
			
		||||
import "../IBridgeAdapter.sol";
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
    UniswapV2
 | 
			
		||||
*/
 | 
			
		||||
interface IGmxRouter {
 | 
			
		||||
 | 
			
		||||
    // /// @dev Swaps an exact amount of input tokens for as many output tokens as possible, along the route determined by the path.
 | 
			
		||||
    // ///      The first element of path is the input token, the last is the output token, and any intermediate elements represent
 | 
			
		||||
    // ///      intermediate pairs to trade through (if, for example, a direct pair does not exist).
 | 
			
		||||
    // /// @param _path An array of token addresses. path.length must be >= 2. Pools for each consecutive pair of addresses must exist and have liquidity.
 | 
			
		||||
    // /// @param _amountIn The amount of input tokens to send.
 | 
			
		||||
    // /// @param _minOut The minimum amount of output tokens that must be received for the transaction not to revert.
 | 
			
		||||
    // /// @param _reciever Recipient of the output tokens.
 | 
			
		||||
    function swap(
 | 
			
		||||
       address[] calldata _path, uint256 _amountIn, uint256 _minOut, address _receiver
 | 
			
		||||
    ) external;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
contract MixinGMX {
 | 
			
		||||
 | 
			
		||||
    using LibERC20TokenV06 for IERC20TokenV06;
 | 
			
		||||
    using LibSafeMathV06 for uint256;
 | 
			
		||||
 | 
			
		||||
    function _tradeGMX(
 | 
			
		||||
        IERC20TokenV06 buyToken,
 | 
			
		||||
        uint256 sellAmount,
 | 
			
		||||
        bytes memory bridgeData
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        returns (uint256 boughtAmount)
 | 
			
		||||
    {
 | 
			
		||||
        address _router;
 | 
			
		||||
        address reader;
 | 
			
		||||
        address vault;
 | 
			
		||||
        address[] memory _path;
 | 
			
		||||
        IGmxRouter router;
 | 
			
		||||
        IERC20TokenV06[] memory path;
 | 
			
		||||
        
 | 
			
		||||
        {
 | 
			
		||||
            //decode the bridge data
 | 
			
		||||
            (_router, reader, vault, _path) = abi.decode(bridgeData, (address, address, address, address[]));
 | 
			
		||||
            // To get around `abi.decode()` not supporting interface array types.
 | 
			
		||||
            assembly { path := _path }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        require(path.length >= 2, "MixinGMX/PATH_LENGTH_MUST_BE_AT_LEAST_TWO");
 | 
			
		||||
        require(
 | 
			
		||||
            path[path.length - 1] == buyToken,
 | 
			
		||||
            "MixinGMX/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN"
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        //connect to the GMX router
 | 
			
		||||
        router = IGmxRouter(_router);
 | 
			
		||||
 | 
			
		||||
        // Grant the GMX router an allowance to sell the first token.
 | 
			
		||||
        path[0].approveIfBelow(address(router), sellAmount);
 | 
			
		||||
 | 
			
		||||
        //track the balance to know how much we bought
 | 
			
		||||
        uint256 beforeBalance = buyToken.balanceOf(address(this));
 | 
			
		||||
        router.swap(
 | 
			
		||||
            // Convert to `buyToken` along this path.
 | 
			
		||||
            _path,
 | 
			
		||||
             // Sell all tokens we hold.
 | 
			
		||||
            sellAmount,
 | 
			
		||||
             // Minimum buy amount.
 | 
			
		||||
            0,
 | 
			
		||||
            // Recipient is `this`.
 | 
			
		||||
            address(this)
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        //calculate the difference in balance from preswap->postswap to find how many tokens out
 | 
			
		||||
        boughtAmount = buyToken.balanceOf(address(this)).safeSub(beforeBalance);
 | 
			
		||||
 | 
			
		||||
        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|MixinBancor|MixinCoFiX|MixinCompound|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|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|MixinBancor|MixinCoFiX|MixinCompound|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinGMX|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|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",
 | 
			
		||||
 
 | 
			
		||||
@@ -109,6 +109,7 @@ import * as MixinCurve from '../test/generated-artifacts/MixinCurve.json';
 | 
			
		||||
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';
 | 
			
		||||
@@ -321,6 +322,7 @@ export const artifacts = {
 | 
			
		||||
    MixinCurveV2: MixinCurveV2 as ContractArtifact,
 | 
			
		||||
    MixinDodo: MixinDodo as ContractArtifact,
 | 
			
		||||
    MixinDodoV2: MixinDodoV2 as ContractArtifact,
 | 
			
		||||
    MixinGMX: MixinGMX as ContractArtifact,
 | 
			
		||||
    MixinKyber: MixinKyber as ContractArtifact,
 | 
			
		||||
    MixinKyberDmm: MixinKyberDmm as ContractArtifact,
 | 
			
		||||
    MixinLido: MixinLido as ContractArtifact,
 | 
			
		||||
 
 | 
			
		||||
@@ -107,6 +107,7 @@ export * from '../test/generated-wrappers/mixin_curve';
 | 
			
		||||
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';
 | 
			
		||||
 
 | 
			
		||||
@@ -140,6 +140,7 @@
 | 
			
		||||
        "test/generated-artifacts/MixinCurveV2.json",
 | 
			
		||||
        "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",
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,7 @@
 | 
			
		||||
        "wsrun": "^5.2.4"
 | 
			
		||||
    },
 | 
			
		||||
    "resolutions": {
 | 
			
		||||
        "merkle-patricia-tree": "3.0.0"
 | 
			
		||||
        "merkle-patricia-tree": "3.0.0",
 | 
			
		||||
        "bignumber.js": "9.0.2"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -22,9 +22,9 @@ pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "./interfaces/IBancor.sol";
 | 
			
		||||
 | 
			
		||||
contract CompilerHack {}
 | 
			
		||||
 | 
			
		||||
contract BancorSampler is CompilerHack {
 | 
			
		||||
 | 
			
		||||
contract BancorSampler {
 | 
			
		||||
 | 
			
		||||
    /// @dev Base gas limit for Bancor calls.
 | 
			
		||||
    uint256 constant private BANCOR_CALL_GAS = 300e3; // 300k
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ import "./CompoundSampler.sol";
 | 
			
		||||
import "./CurveSampler.sol";
 | 
			
		||||
import "./DODOSampler.sol";
 | 
			
		||||
import "./DODOV2Sampler.sol";
 | 
			
		||||
import "./GMXSampler.sol";
 | 
			
		||||
import "./KyberSampler.sol";
 | 
			
		||||
import "./KyberDmmSampler.sol";
 | 
			
		||||
import "./LidoSampler.sol";
 | 
			
		||||
@@ -36,6 +37,7 @@ import "./MultiBridgeSampler.sol";
 | 
			
		||||
import "./MStableSampler.sol";
 | 
			
		||||
import "./MooniswapSampler.sol";
 | 
			
		||||
import "./NativeOrderSampler.sol";
 | 
			
		||||
import "./PlatypusSampler.sol";
 | 
			
		||||
import "./ShellSampler.sol";
 | 
			
		||||
import "./SmoothySampler.sol";
 | 
			
		||||
import "./TwoHopSampler.sol";
 | 
			
		||||
@@ -53,6 +55,7 @@ contract ERC20BridgeSampler is
 | 
			
		||||
    CurveSampler,
 | 
			
		||||
    DODOSampler,
 | 
			
		||||
    DODOV2Sampler,
 | 
			
		||||
    GMXSampler,
 | 
			
		||||
    KyberSampler,
 | 
			
		||||
    KyberDmmSampler,
 | 
			
		||||
    LidoSampler,
 | 
			
		||||
@@ -62,6 +65,7 @@ contract ERC20BridgeSampler is
 | 
			
		||||
    MooniswapSampler,
 | 
			
		||||
    MultiBridgeSampler,
 | 
			
		||||
    NativeOrderSampler,
 | 
			
		||||
    PlatypusSampler,
 | 
			
		||||
    ShellSampler,
 | 
			
		||||
    SmoothySampler,
 | 
			
		||||
    TwoHopSampler,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										99
									
								
								packages/asset-swapper/contracts/src/GMXSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								packages/asset-swapper/contracts/src/GMXSampler.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
pragma solidity ^0.6;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "./interfaces/IGMX.sol";
 | 
			
		||||
import "./ApproximateBuys.sol";
 | 
			
		||||
import "./SamplerUtils.sol";
 | 
			
		||||
 | 
			
		||||
contract GMXSampler is
 | 
			
		||||
    SamplerUtils,
 | 
			
		||||
    ApproximateBuys
 | 
			
		||||
{
 | 
			
		||||
    struct GMXInfo {
 | 
			
		||||
        address reader;
 | 
			
		||||
        address vault;
 | 
			
		||||
        address[] path;
 | 
			
		||||
    }
 | 
			
		||||
    // address immutable WAVAX = 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7;
 | 
			
		||||
    // address immutable AVAX = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
 | 
			
		||||
 | 
			
		||||
    function sampleSellsFromGMX(
 | 
			
		||||
        address reader,
 | 
			
		||||
        address vault,
 | 
			
		||||
        address[] memory path,
 | 
			
		||||
        uint256[] memory takerTokenAmounts
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256[] memory makerTokenAmounts)
 | 
			
		||||
    {
 | 
			
		||||
        uint256 numSamples = takerTokenAmounts.length;
 | 
			
		||||
        makerTokenAmounts = new uint256[](numSamples);
 | 
			
		||||
        for (uint256 i = 0; i < numSamples; i++) {
 | 
			
		||||
            try
 | 
			
		||||
                IGMX(reader).getAmountOut(IVault(vault), path[0], path[1], takerTokenAmounts[i])
 | 
			
		||||
                returns (uint256 amountAfterFees, uint256 feeAmount)
 | 
			
		||||
            {
 | 
			
		||||
                makerTokenAmounts[i] = amountAfterFees;
 | 
			
		||||
                // Break early if there are 0 amounts
 | 
			
		||||
                if (makerTokenAmounts[i] == 0) {
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            } catch (bytes memory) {
 | 
			
		||||
                // Swallow failures, leaving all results as zero.
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function sampleBuysFromGMX(
 | 
			
		||||
        address reader,
 | 
			
		||||
        address vault,
 | 
			
		||||
        address[] memory path,
 | 
			
		||||
        uint256[] memory makerTokenAmounts
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256[] memory takerTokenAmounts)
 | 
			
		||||
    {
 | 
			
		||||
        address[] memory invertBuyPath = new address[](2);
 | 
			
		||||
        invertBuyPath[0] = path[1];
 | 
			
		||||
        invertBuyPath[1] = path[0];
 | 
			
		||||
        return _sampleApproximateBuys(
 | 
			
		||||
                ApproximateBuyQuoteOpts({
 | 
			
		||||
                    makerTokenData: abi.encode(reader, vault, invertBuyPath),
 | 
			
		||||
                    takerTokenData: abi.encode(reader, vault, path),
 | 
			
		||||
                    getSellQuoteCallback: _sampleSellForApproximateBuyFromGMX
 | 
			
		||||
                }),
 | 
			
		||||
                makerTokenAmounts
 | 
			
		||||
            );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    function _sampleSellForApproximateBuyFromGMX(
 | 
			
		||||
        bytes memory takerTokenData,
 | 
			
		||||
        bytes memory makerTokenData,
 | 
			
		||||
        uint256 sellAmount
 | 
			
		||||
    )
 | 
			
		||||
        private
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 buyAmount)
 | 
			
		||||
    {
 | 
			
		||||
        (address _reader, address _vault, address[] memory _path ) = abi.decode(takerTokenData, (address, address, address[]));
 | 
			
		||||
 | 
			
		||||
        (bool success, bytes memory resultData) = address(this).staticcall(abi.encodeWithSelector(
 | 
			
		||||
            this.sampleSellsFromGMX.selector,
 | 
			
		||||
            _reader,
 | 
			
		||||
            _vault,
 | 
			
		||||
            _path,
 | 
			
		||||
            _toSingleValueArray(sellAmount)
 | 
			
		||||
        ));
 | 
			
		||||
        if(!success) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        // solhint-disable-next-line indent
 | 
			
		||||
        return abi.decode(resultData, (uint256[]))[0];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										118
									
								
								packages/asset-swapper/contracts/src/PlatypusSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								packages/asset-swapper/contracts/src/PlatypusSampler.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,118 @@
 | 
			
		||||
pragma solidity ^0.6;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import "./interfaces/IPlatypus.sol";
 | 
			
		||||
import "./ApproximateBuys.sol";
 | 
			
		||||
import "./SamplerUtils.sol";
 | 
			
		||||
 | 
			
		||||
contract PlatypusSampler is
 | 
			
		||||
    SamplerUtils,
 | 
			
		||||
    ApproximateBuys
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    function sampleSellsFromPlatypus(
 | 
			
		||||
        address router,
 | 
			
		||||
        address[] memory path,
 | 
			
		||||
        address[] memory pool,
 | 
			
		||||
        uint256[] memory takerTokenAmounts
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256[] memory makerTokenAmounts)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        uint256 numSamples = takerTokenAmounts.length;
 | 
			
		||||
        makerTokenAmounts = new uint256[](numSamples);
 | 
			
		||||
        for (uint256 i = 0; i < numSamples; i++) {
 | 
			
		||||
            try
 | 
			
		||||
                IPlatypus(router).quotePotentialSwaps(path, pool, takerTokenAmounts[i])
 | 
			
		||||
                returns (uint256 amountAfterFees, uint256 feeAmount)
 | 
			
		||||
            {
 | 
			
		||||
                makerTokenAmounts[i] = amountAfterFees;
 | 
			
		||||
                // Break early if there are 0 amounts
 | 
			
		||||
                if (makerTokenAmounts[i] == 0) {
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            } catch (bytes memory) {
 | 
			
		||||
                // Swallow failures, leaving all results as zero.
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function sampleBuysFromPlatypus(
 | 
			
		||||
        address router,
 | 
			
		||||
        address[] memory path,
 | 
			
		||||
        address[] memory pool,
 | 
			
		||||
        uint256[] memory makerTokenAmounts
 | 
			
		||||
    )
 | 
			
		||||
        public
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256[] memory takerTokenAmounts)
 | 
			
		||||
    {
 | 
			
		||||
        address[] memory invertBuyPath;
 | 
			
		||||
        address[] memory invertPoolPath;
 | 
			
		||||
 | 
			
		||||
        if(path.length > 2){
 | 
			
		||||
 | 
			
		||||
            invertBuyPath = new address[](3);
 | 
			
		||||
            invertPoolPath = new address[](2);
 | 
			
		||||
 | 
			
		||||
            invertBuyPath[0] = path[2];
 | 
			
		||||
            invertBuyPath[2] = path[0];
 | 
			
		||||
            invertBuyPath[1] = path[1];
 | 
			
		||||
 | 
			
		||||
            invertPoolPath[0] = pool[1];
 | 
			
		||||
            invertPoolPath[1] = pool[0];
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
 | 
			
		||||
            invertBuyPath = new address[](2);
 | 
			
		||||
            invertPoolPath = new address[](1);
 | 
			
		||||
 | 
			
		||||
            invertBuyPath[0] = path[1];
 | 
			
		||||
            invertBuyPath[1] = path[0];
 | 
			
		||||
            invertPoolPath[0] = pool[0];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        uint256[] memory result = _sampleApproximateBuys(
 | 
			
		||||
                ApproximateBuyQuoteOpts({
 | 
			
		||||
                    makerTokenData: abi.encode(router, invertBuyPath, invertPoolPath),
 | 
			
		||||
                    takerTokenData: abi.encode(router, path, pool),
 | 
			
		||||
                    getSellQuoteCallback: _sampleSellForApproximateBuyFromPlatypus
 | 
			
		||||
                }),
 | 
			
		||||
                makerTokenAmounts
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    function _sampleSellForApproximateBuyFromPlatypus(
 | 
			
		||||
        bytes memory makerTokenData,
 | 
			
		||||
        bytes memory takerTokenData,
 | 
			
		||||
        uint256 sellAmount
 | 
			
		||||
    )
 | 
			
		||||
        private
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256 buyAmount)
 | 
			
		||||
    {
 | 
			
		||||
        (address router,  address[] memory _path, address[] memory _pool ) = abi.decode(makerTokenData, (address, address[], address[]));
 | 
			
		||||
 | 
			
		||||
        (bool success, bytes memory resultData) = address(this).staticcall(abi.encodeWithSelector(
 | 
			
		||||
            this.sampleSellsFromPlatypus.selector,
 | 
			
		||||
            router,
 | 
			
		||||
            _path,
 | 
			
		||||
            _pool,
 | 
			
		||||
            _toSingleValueArray(sellAmount)
 | 
			
		||||
        ));
 | 
			
		||||
 | 
			
		||||
        if(!success) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        // solhint-disable-next-line indent
 | 
			
		||||
        return abi.decode(resultData, (uint256[]))[0];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								packages/asset-swapper/contracts/src/interfaces/IGMX.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								packages/asset-swapper/contracts/src/interfaces/IGMX.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
pragma solidity ^0.6;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
interface IGMX {
 | 
			
		||||
    function getMaxAmountIn(IVault _vault, address _tokenIn, address _tokenOut)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256);
 | 
			
		||||
 | 
			
		||||
    function getAmountOut(IVault _vault, address _tokenIn, address _tokenOut, uint256 _amountIn)
 | 
			
		||||
        external
 | 
			
		||||
        view
 | 
			
		||||
        returns (uint256, uint256);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface IVault {
 | 
			
		||||
    function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
 | 
			
		||||
    function stableSwapFeeBasisPoints() external view returns (uint256);
 | 
			
		||||
    function stableTokens(address _token) external view returns (bool);
 | 
			
		||||
    function tokenDecimals(address _token) external view returns (uint256);
 | 
			
		||||
    function getMaxPrice(address _token) external view returns (uint256);
 | 
			
		||||
    function getMinPrice(address _token) external view returns (uint256);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.6;
 | 
			
		||||
 | 
			
		||||
interface IPlatypus {
 | 
			
		||||
    function quotePotentialSwaps(
 | 
			
		||||
        address[] memory tokenPath,
 | 
			
		||||
        address[] memory poolPath,
 | 
			
		||||
        uint256 fromAmount
 | 
			
		||||
    ) external view returns (uint256 potentialOutcome, uint256 haircut);
 | 
			
		||||
}
 | 
			
		||||
@@ -39,7 +39,7 @@
 | 
			
		||||
    "config": {
 | 
			
		||||
        "publicInterfaceContracts": "ERC20BridgeSampler,BalanceChecker,FakeTaker",
 | 
			
		||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BalancerV2Sampler|BancorSampler|CompoundSampler|CurveSampler|DODOSampler|DODOV2Sampler|DummyLiquidityProvider|ERC20BridgeSampler|FakeTaker|IBalancer|IBancor|ICurve|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IShell|ISmoothy|IUniswapExchangeQuotes|IUniswapV2Router01|KyberDmmSampler|KyberSampler|LidoSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|SamplerUtils|ShellSampler|SmoothySampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UniswapV3Sampler|UtilitySampler).json",
 | 
			
		||||
        "abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BalancerV2Sampler|BancorSampler|CompoundSampler|CurveSampler|DODOSampler|DODOV2Sampler|DummyLiquidityProvider|ERC20BridgeSampler|FakeTaker|GMXSampler|IBalancer|IBancor|ICurve|IGMX|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IPlatypus|IShell|ISmoothy|IUniswapExchangeQuotes|IUniswapV2Router01|KyberDmmSampler|KyberSampler|LidoSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|PlatypusSampler|SamplerUtils|ShellSampler|SmoothySampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UniswapV3Sampler|UtilitySampler).json",
 | 
			
		||||
        "postpublish": {
 | 
			
		||||
            "assets": []
 | 
			
		||||
        }
 | 
			
		||||
@@ -128,5 +128,6 @@
 | 
			
		||||
    "publishConfig": {
 | 
			
		||||
        "access": "public"
 | 
			
		||||
    },
 | 
			
		||||
    "gitHead": "4f91bfd907996b2f4dd383778b50c479c2602b56"
 | 
			
		||||
    "gitHead": "4f91bfd907996b2f4dd383778b50c479c2602b56",
 | 
			
		||||
    "resolutions": {}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -357,7 +357,7 @@ export class SwapQuoter {
 | 
			
		||||
        if (nativeOrders.length === 0) {
 | 
			
		||||
            nativeOrders.push(createDummyOrder(makerToken, takerToken));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        //  ** Prepare options for fetching market side liquidity **
 | 
			
		||||
        // Scale fees by gas price.
 | 
			
		||||
        const cloneOpts = _.omit(opts, 'gasPrice') as GetMarketOrdersOpts;
 | 
			
		||||
 
 | 
			
		||||
@@ -62,8 +62,9 @@ import {
 | 
			
		||||
    UNISWAPV2_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
    WAULTSWAP_ROUTER_BY_CHAIN_ID,
 | 
			
		||||
    XSIGMA_MAINNET_INFOS,
 | 
			
		||||
    PLATYPUS_AVALANCHE_INFOS,
 | 
			
		||||
} from './constants';
 | 
			
		||||
import { CurveInfo, ERC20BridgeSource } from './types';
 | 
			
		||||
import { CurveInfo, ERC20BridgeSource, PlatypusInfo } from './types';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Filter Kyber reserves which should not be used (0xbb bridged reserves)
 | 
			
		||||
@@ -463,6 +464,48 @@ export function getMobiusMoneyInfoForPair(chainId: ChainId, takerToken: string,
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getPlatypusInfoForPair(chainId: ChainId, takerToken: string, makerToken: string): PlatypusInfo[] {
 | 
			
		||||
    if (chainId !== ChainId.Avalanche) {
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
    let ptpPools: PlatypusInfo[] = [];
 | 
			
		||||
    const makerTokenPool = Object.values(PLATYPUS_AVALANCHE_INFOS).filter(c =>
 | 
			
		||||
        [makerToken].every(
 | 
			
		||||
            t =>
 | 
			
		||||
                c.tokens.includes(t),
 | 
			
		||||
        ),
 | 
			
		||||
    );
 | 
			
		||||
    const takerTokenPool = Object.values(PLATYPUS_AVALANCHE_INFOS).filter(c =>
 | 
			
		||||
        [takerToken].every(
 | 
			
		||||
            t =>
 | 
			
		||||
                c.tokens.includes(t),
 | 
			
		||||
        ),
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if( makerTokenPool[0].tokens.includes(takerToken)){
 | 
			
		||||
        let pool: PlatypusInfo = {
 | 
			
		||||
            gasSchedule: makerTokenPool[0].gasSchedule,
 | 
			
		||||
            poolAddress: [makerTokenPool[0].poolAddress[0]],
 | 
			
		||||
            tokens: [makerToken,takerToken],
 | 
			
		||||
        };
 | 
			
		||||
        ptpPools.push(pool);
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
        const intermediateToken = makerTokenPool[0].tokens.filter(element => takerTokenPool[0].tokens.includes(element));
 | 
			
		||||
        //return similar values from two arrays
 | 
			
		||||
 | 
			
		||||
        let pool: PlatypusInfo = {
 | 
			
		||||
            gasSchedule: makerTokenPool[0].gasSchedule + makerTokenPool[0].gasSchedule,
 | 
			
		||||
            poolAddress: [makerTokenPool[0].poolAddress[0], takerTokenPool[0].poolAddress[0]],
 | 
			
		||||
            tokens: [makerToken,intermediateToken[0],takerToken],
 | 
			
		||||
        };
 | 
			
		||||
        ptpPools.push(pool);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ptpPools;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getShellLikeInfosForPair(
 | 
			
		||||
    chainId: ChainId,
 | 
			
		||||
    takerToken: string,
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,8 @@ import {
 | 
			
		||||
    LiquidityProviderRegistry,
 | 
			
		||||
    MakerPsmFillData,
 | 
			
		||||
    MultiHopFillData,
 | 
			
		||||
    PlatypusFillData,
 | 
			
		||||
    PlatypusInfo,
 | 
			
		||||
    PsmInfo,
 | 
			
		||||
    TokenAdjacencyGraph,
 | 
			
		||||
    UniswapV2FillData,
 | 
			
		||||
@@ -184,6 +186,8 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
 | 
			
		||||
            ERC20BridgeSource.KyberDmm,
 | 
			
		||||
            ERC20BridgeSource.AaveV2,
 | 
			
		||||
            ERC20BridgeSource.Synapse,
 | 
			
		||||
            ERC20BridgeSource.GMX,
 | 
			
		||||
            ERC20BridgeSource.Platypus,
 | 
			
		||||
        ]),
 | 
			
		||||
        [ChainId.Fantom]: new SourceFilters([
 | 
			
		||||
            ERC20BridgeSource.MultiHop,
 | 
			
		||||
@@ -331,6 +335,8 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
 | 
			
		||||
            ERC20BridgeSource.KyberDmm,
 | 
			
		||||
            ERC20BridgeSource.AaveV2,
 | 
			
		||||
            ERC20BridgeSource.Synapse,
 | 
			
		||||
            ERC20BridgeSource.GMX,
 | 
			
		||||
            ERC20BridgeSource.Platypus,
 | 
			
		||||
        ]),
 | 
			
		||||
        [ChainId.Fantom]: new SourceFilters([
 | 
			
		||||
            ERC20BridgeSource.MultiHop,
 | 
			
		||||
@@ -551,6 +557,7 @@ export const AVALANCHE_TOKENS = {
 | 
			
		||||
    // native USDC on Avalanche
 | 
			
		||||
    nUSDC: '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e',
 | 
			
		||||
    USDT: '0xc7198437980c041c805a1edcba50c1ce5db95118',
 | 
			
		||||
    USDt: '0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7',
 | 
			
		||||
    aDAI: '0x47afa96cdc9fab46904a55a6ad4bf6660b53c38a',
 | 
			
		||||
    aUSDC: '0x46a51127c3ce23fb7ab1de06226147f446e4a857',
 | 
			
		||||
    aUSDT: '0x532e6537fea298397212f09a61e03311686f548e',
 | 
			
		||||
@@ -558,6 +565,10 @@ export const AVALANCHE_TOKENS = {
 | 
			
		||||
    nUSD: '0xcfc37a6ab183dd4aed08c204d1c2773c0b1bdf46',
 | 
			
		||||
    aWETH: '0x53f7c5869a859f0aec3d334ee8b4cf01e3492f21',
 | 
			
		||||
    MIM: '0x130966628846bfd36ff31a822705796e8cb8c18d',
 | 
			
		||||
    sAVAX: '0x2b2c81e08f1af8835a78bb2a90ae924ace0ea4be',
 | 
			
		||||
    UST: '0xb599c3590f42f8f995ecfa0f85d2980b76862fc1',
 | 
			
		||||
    FRAX: '0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64',
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const CELO_TOKENS = {
 | 
			
		||||
@@ -833,6 +844,14 @@ export const ACRYPTOS_POOLS = {
 | 
			
		||||
    acs3btc: '0xbe7caa236544d1b9a0e7f91e94b9f5bfd3b5ca81',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const PLATYPUS_AVALANCHE_POOLS = {
 | 
			
		||||
    usd: '0x66357dcace80431aee0a7507e2e361b7e2402370',
 | 
			
		||||
    ust: '0xe0d166de15665bc4b7185b2e35e847e51316e126',
 | 
			
		||||
    frax: '0xb8e567fc23c39c94a1f6359509d7b43d1fbed824',
 | 
			
		||||
    mim: '0x30c30d826be87cd0a4b90855c2f38f7fcfe4eaa7',
 | 
			
		||||
    sAVAX: '0x4658ea7e9960d6158a261104aaa160cc953bb6ba',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId<string[]>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Mainnet]: [
 | 
			
		||||
@@ -1816,6 +1835,34 @@ export const ACRYPTOS_BSC_INFOS: { [name: string]: CurveInfo } = {
 | 
			
		||||
    }),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const PLATYPUS_AVALANCHE_INFOS: { [name: string]: PlatypusInfo } = {
 | 
			
		||||
    [PLATYPUS_AVALANCHE_POOLS.usd]: {
 | 
			
		||||
        poolAddress: [PLATYPUS_AVALANCHE_POOLS.usd],
 | 
			
		||||
        tokens: [AVALANCHE_TOKENS.USDT, AVALANCHE_TOKENS.USDC, AVALANCHE_TOKENS.DAI, AVALANCHE_TOKENS.nUSDC, AVALANCHE_TOKENS.USDt],
 | 
			
		||||
        gasSchedule: 350e3,
 | 
			
		||||
    },
 | 
			
		||||
    [PLATYPUS_AVALANCHE_POOLS.ust]: {
 | 
			
		||||
        poolAddress: [PLATYPUS_AVALANCHE_POOLS.ust],
 | 
			
		||||
        tokens: [AVALANCHE_TOKENS.nUSDC, AVALANCHE_TOKENS.UST],
 | 
			
		||||
        gasSchedule: 350e3,
 | 
			
		||||
    },
 | 
			
		||||
    [PLATYPUS_AVALANCHE_POOLS.frax]: {
 | 
			
		||||
        poolAddress: [PLATYPUS_AVALANCHE_POOLS.frax],
 | 
			
		||||
        tokens: [AVALANCHE_TOKENS.nUSDC, AVALANCHE_TOKENS.FRAX], //liq issues
 | 
			
		||||
        gasSchedule: 350e3,
 | 
			
		||||
    },
 | 
			
		||||
    [PLATYPUS_AVALANCHE_POOLS.mim]: {
 | 
			
		||||
        poolAddress: [PLATYPUS_AVALANCHE_POOLS.mim],
 | 
			
		||||
        tokens: [AVALANCHE_TOKENS.MIM, AVALANCHE_TOKENS.nUSDC],
 | 
			
		||||
        gasSchedule: 350e3,
 | 
			
		||||
    },
 | 
			
		||||
    [PLATYPUS_AVALANCHE_POOLS.sAVAX]: {
 | 
			
		||||
        poolAddress: [PLATYPUS_AVALANCHE_POOLS.sAVAX],
 | 
			
		||||
        tokens: [AVALANCHE_TOKENS.WAVAX, AVALANCHE_TOKENS.sAVAX], //add unwrapping
 | 
			
		||||
        gasSchedule: 350e3,
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Kyber reserve prefixes
 | 
			
		||||
 * 0xff Fed price reserve
 | 
			
		||||
@@ -2344,6 +2391,33 @@ export const SPOOKYSWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
 | 
			
		||||
    },
 | 
			
		||||
    NULL_ADDRESS,
 | 
			
		||||
);
 | 
			
		||||
export const GMX_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Avalanche]: '0x5f719c2f1095f7b9fc68a68e35b51194f4b6abe8',
 | 
			
		||||
    },
 | 
			
		||||
    NULL_ADDRESS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export const GMX_READER_BY_CHAIN_ID = valueByChainId<string>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Avalanche]: '0x67b789d48c926006f5132bfce4e976f0a7a63d5d',
 | 
			
		||||
    },
 | 
			
		||||
    NULL_ADDRESS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export const GMX_VAULT_BY_CHAIN_ID = valueByChainId<string>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Avalanche]: '0x9ab2de34a33fb459b538c43f251eb825645e8595',
 | 
			
		||||
    },
 | 
			
		||||
    NULL_ADDRESS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export const PLATYPUS_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
 | 
			
		||||
    {
 | 
			
		||||
        [ChainId.Avalanche]: '0x73256ec7575d999c360c1eec118ecbefd8da7d12',
 | 
			
		||||
    },
 | 
			
		||||
    NULL_ADDRESS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export const VIP_ERC20_BRIDGE_SOURCES_BY_CHAIN_ID = valueByChainId<ERC20BridgeSource[]>(
 | 
			
		||||
    {
 | 
			
		||||
@@ -2548,6 +2622,8 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
 | 
			
		||||
    //
 | 
			
		||||
    [ERC20BridgeSource.Pangolin]: uniswapV2CloneGasSchedule,
 | 
			
		||||
    [ERC20BridgeSource.TraderJoe]: uniswapV2CloneGasSchedule,
 | 
			
		||||
    [ERC20BridgeSource.GMX]: () => 450e3,
 | 
			
		||||
    [ERC20BridgeSource.Platypus]: () => 450e3,
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Celo
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@ import {
 | 
			
		||||
    FinalUniswapV3FillData,
 | 
			
		||||
    GeistFillData,
 | 
			
		||||
    GenericRouterFillData,
 | 
			
		||||
    GMXFillData,
 | 
			
		||||
    KyberDmmFillData,
 | 
			
		||||
    KyberFillData,
 | 
			
		||||
    LidoFillData,
 | 
			
		||||
@@ -34,6 +35,7 @@ import {
 | 
			
		||||
    OptimizedMarketOrder,
 | 
			
		||||
    OptimizedMarketOrderBase,
 | 
			
		||||
    OrderDomain,
 | 
			
		||||
    PlatypusFillData,
 | 
			
		||||
    ShellFillData,
 | 
			
		||||
    UniswapV2FillData,
 | 
			
		||||
    UniswapV3FillData,
 | 
			
		||||
@@ -208,6 +210,10 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s
 | 
			
		||||
            return encodeBridgeSourceId(BridgeProtocol.AaveV2, 'Geist');
 | 
			
		||||
        case ERC20BridgeSource.MobiusMoney:
 | 
			
		||||
            return encodeBridgeSourceId(BridgeProtocol.Nerve, 'MobiusMoney');
 | 
			
		||||
        case ERC20BridgeSource.GMX:
 | 
			
		||||
            return encodeBridgeSourceId(BridgeProtocol.GMX, 'GMX');
 | 
			
		||||
        case ERC20BridgeSource.Platypus:
 | 
			
		||||
            return encodeBridgeSourceId(BridgeProtocol.Platypus, 'Platypus');
 | 
			
		||||
        default:
 | 
			
		||||
            throw new Error(AggregationError.NoBridgeForSource);
 | 
			
		||||
    }
 | 
			
		||||
@@ -367,6 +373,23 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder
 | 
			
		||||
            const geistFillData = (order as OptimizedMarketBridgeOrder<GeistFillData>).fillData;
 | 
			
		||||
            bridgeData = encoder.encode([geistFillData.lendingPool, geistFillData.gToken]);
 | 
			
		||||
            break;
 | 
			
		||||
        case ERC20BridgeSource.GMX:
 | 
			
		||||
            const gmxFillData = (order as OptimizedMarketBridgeOrder<GMXFillData>).fillData;
 | 
			
		||||
            bridgeData = encoder.encode([
 | 
			
		||||
                gmxFillData.router,
 | 
			
		||||
                gmxFillData.reader,
 | 
			
		||||
                gmxFillData.vault,
 | 
			
		||||
                gmxFillData.tokenAddressPath,
 | 
			
		||||
            ]);
 | 
			
		||||
            break;
 | 
			
		||||
        case ERC20BridgeSource.Platypus:
 | 
			
		||||
            const platypusFillData = (order as OptimizedMarketBridgeOrder<PlatypusFillData>).fillData;
 | 
			
		||||
            bridgeData = encoder.encode([
 | 
			
		||||
                platypusFillData.router,
 | 
			
		||||
                platypusFillData.pool,
 | 
			
		||||
                platypusFillData.tokenAddressPath,
 | 
			
		||||
            ]);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
            throw new Error(AggregationError.NoBridgeForSource);
 | 
			
		||||
@@ -452,6 +475,8 @@ const balancerV2Encoder = AbiEncoder.create([
 | 
			
		||||
    { name: 'poolId', type: 'bytes32' },
 | 
			
		||||
]);
 | 
			
		||||
const routerAddressPathEncoder = AbiEncoder.create('(address,address[])');
 | 
			
		||||
const gmxAddressPathEncoder = AbiEncoder.create('(address,address,address,address[])');
 | 
			
		||||
const platypusAddressPathEncoder = AbiEncoder.create('(address,address[],address[])');
 | 
			
		||||
const tokenAddressEncoder = AbiEncoder.create([{ name: 'tokenAddress', type: 'address' }]);
 | 
			
		||||
 | 
			
		||||
export const BRIDGE_ENCODERS: {
 | 
			
		||||
@@ -505,6 +530,9 @@ export const BRIDGE_ENCODERS: {
 | 
			
		||||
    [ERC20BridgeSource.SpiritSwap]: routerAddressPathEncoder,
 | 
			
		||||
    [ERC20BridgeSource.SpookySwap]: routerAddressPathEncoder,
 | 
			
		||||
    [ERC20BridgeSource.MorpheusSwap]: routerAddressPathEncoder,
 | 
			
		||||
    // Avalanche
 | 
			
		||||
    [ERC20BridgeSource.GMX]: gmxAddressPathEncoder,
 | 
			
		||||
    [ERC20BridgeSource.Platypus]: platypusAddressPathEncoder,
 | 
			
		||||
    // Celo
 | 
			
		||||
    [ERC20BridgeSource.UbeSwap]: routerAddressPathEncoder,
 | 
			
		||||
    // BSC
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import {
 | 
			
		||||
    getCurveLikeInfosForPair,
 | 
			
		||||
    getDodoV2Offsets,
 | 
			
		||||
    getKyberOffsets,
 | 
			
		||||
    getPlatypusInfoForPair,
 | 
			
		||||
    getShellLikeInfosForPair,
 | 
			
		||||
    isAllowedKyberReserveId,
 | 
			
		||||
    isBadTokenForSource,
 | 
			
		||||
@@ -30,6 +31,9 @@ import {
 | 
			
		||||
    COMPOUND_API_URL_BY_CHAIN_ID,
 | 
			
		||||
    DODOV1_CONFIG_BY_CHAIN_ID,
 | 
			
		||||
    DODOV2_FACTORIES_BY_CHAIN_ID,
 | 
			
		||||
    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,
 | 
			
		||||
@@ -42,6 +46,7 @@ import {
 | 
			
		||||
    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,
 | 
			
		||||
    UNISWAPV3_CONFIG_BY_CHAIN_ID,
 | 
			
		||||
@@ -71,6 +76,7 @@ import {
 | 
			
		||||
    GeistFillData,
 | 
			
		||||
    GeistInfo,
 | 
			
		||||
    GenericRouterFillData,
 | 
			
		||||
    GMXFillData,
 | 
			
		||||
    HopInfo,
 | 
			
		||||
    KyberDmmFillData,
 | 
			
		||||
    KyberFillData,
 | 
			
		||||
@@ -82,6 +88,7 @@ import {
 | 
			
		||||
    MakerPsmFillData,
 | 
			
		||||
    MooniswapFillData,
 | 
			
		||||
    MultiHopFillData,
 | 
			
		||||
    PlatypusFillData,
 | 
			
		||||
    PsmInfo,
 | 
			
		||||
    ShellFillData,
 | 
			
		||||
    SourceQuoteOperation,
 | 
			
		||||
@@ -1213,6 +1220,65 @@ export class SamplerOperations {
 | 
			
		||||
            params: [cToken, takerToken, makerToken, makerFillAmounts],
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    public getGMXSellQuotes(
 | 
			
		||||
        router: string,
 | 
			
		||||
        reader: string,
 | 
			
		||||
        vault: string,
 | 
			
		||||
        tokenAddressPath: string[],
 | 
			
		||||
        takerFillAmounts: BigNumber[],
 | 
			
		||||
    ): SourceQuoteOperation<GMXFillData> {
 | 
			
		||||
        return new SamplerContractOperation({
 | 
			
		||||
            source: ERC20BridgeSource.GMX,
 | 
			
		||||
            fillData: { router, reader, vault, tokenAddressPath },
 | 
			
		||||
            contract: this._samplerContract,
 | 
			
		||||
            function: this._samplerContract.sampleSellsFromGMX,
 | 
			
		||||
            params: [reader, vault, tokenAddressPath, takerFillAmounts],
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    public getGMXBuyQuotes(
 | 
			
		||||
        router: string,
 | 
			
		||||
        reader: string,
 | 
			
		||||
        vault: string,
 | 
			
		||||
        tokenAddressPath: string[],
 | 
			
		||||
        makerFillAmounts: BigNumber[],
 | 
			
		||||
    ): SourceQuoteOperation<GMXFillData> {
 | 
			
		||||
        return new SamplerContractOperation({
 | 
			
		||||
            source: ERC20BridgeSource.GMX,
 | 
			
		||||
            fillData: { router, reader, vault, tokenAddressPath },
 | 
			
		||||
            contract: this._samplerContract,
 | 
			
		||||
            function: this._samplerContract.sampleBuysFromGMX,
 | 
			
		||||
            params: [reader, vault, tokenAddressPath, makerFillAmounts],
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public getPlatypusSellQuotes(
 | 
			
		||||
        router: string,
 | 
			
		||||
        pool: string[],
 | 
			
		||||
        tokenAddressPath: string[],
 | 
			
		||||
        takerFillAmounts: BigNumber[],
 | 
			
		||||
    ): SourceQuoteOperation<PlatypusFillData> {
 | 
			
		||||
        return new SamplerContractOperation({
 | 
			
		||||
            source: ERC20BridgeSource.Platypus,
 | 
			
		||||
            fillData: { router, pool, tokenAddressPath },
 | 
			
		||||
            contract: this._samplerContract,
 | 
			
		||||
            function: this._samplerContract.sampleSellsFromPlatypus,
 | 
			
		||||
            params: [router, tokenAddressPath, pool, takerFillAmounts],
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    public getPlatypusBuyQuotes(
 | 
			
		||||
        router: string,
 | 
			
		||||
        pool: string[],
 | 
			
		||||
        tokenAddressPath: string[],
 | 
			
		||||
        makerFillAmounts: BigNumber[],
 | 
			
		||||
    ): SourceQuoteOperation<PlatypusFillData> {
 | 
			
		||||
        return new SamplerContractOperation({
 | 
			
		||||
            source: ERC20BridgeSource.Platypus,
 | 
			
		||||
            fillData: { router, tokenAddressPath, pool },
 | 
			
		||||
            contract: this._samplerContract,
 | 
			
		||||
            function: this._samplerContract.sampleBuysFromPlatypus,
 | 
			
		||||
            params: [router, tokenAddressPath, pool, makerFillAmounts],
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public getMedianSellRate(
 | 
			
		||||
        sources: ERC20BridgeSource[],
 | 
			
		||||
@@ -1605,8 +1671,28 @@ export class SamplerOperations {
 | 
			
		||||
                            takerFillAmounts,
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                    default:
 | 
			
		||||
                        throw new Error(`Unsupported sell sample source: ${source}`);
 | 
			
		||||
                    case ERC20BridgeSource.GMX: {
 | 
			
		||||
                        return this.getGMXSellQuotes(
 | 
			
		||||
                            GMX_ROUTER_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                            GMX_READER_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                            GMX_VAULT_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                            [takerToken, makerToken],
 | 
			
		||||
                            takerFillAmounts,
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                    case ERC20BridgeSource.Platypus: {
 | 
			
		||||
                        return getPlatypusInfoForPair(this.chainId, takerToken, makerToken).map(pool =>
 | 
			
		||||
                            this.getPlatypusSellQuotes(
 | 
			
		||||
                            PLATYPUS_ROUTER_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                            pool.poolAddress,
 | 
			
		||||
                            pool.tokens,
 | 
			
		||||
                            takerFillAmounts,
 | 
			
		||||
                            ),
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new Error(`Unsupported sell sample source: ${source}`);
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }),
 | 
			
		||||
        );
 | 
			
		||||
@@ -1909,6 +1995,25 @@ export class SamplerOperations {
 | 
			
		||||
                        }
 | 
			
		||||
                        return this.getCompoundBuyQuotes(cToken.tokenAddress, makerToken, takerToken, makerFillAmounts);
 | 
			
		||||
                    }
 | 
			
		||||
                    case ERC20BridgeSource.GMX: {
 | 
			
		||||
                        return this.getGMXBuyQuotes(
 | 
			
		||||
                            GMX_ROUTER_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                            GMX_READER_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                            GMX_VAULT_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                            [takerToken, makerToken],
 | 
			
		||||
                            makerFillAmounts,
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                    case ERC20BridgeSource.Platypus: {
 | 
			
		||||
                        return getPlatypusInfoForPair(this.chainId, takerToken, makerToken).map(pool =>
 | 
			
		||||
                            this.getPlatypusBuyQuotes(
 | 
			
		||||
                            PLATYPUS_ROUTER_BY_CHAIN_ID[this.chainId],
 | 
			
		||||
                            pool.poolAddress,
 | 
			
		||||
                            pool.tokens,
 | 
			
		||||
                            makerFillAmounts,
 | 
			
		||||
                            ),
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                    default:
 | 
			
		||||
                        throw new Error(`Unsupported buy sample source: ${source}`);
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -94,6 +94,9 @@ export enum ERC20BridgeSource {
 | 
			
		||||
    // Avalanche
 | 
			
		||||
    Pangolin = 'Pangolin',
 | 
			
		||||
    TraderJoe = 'TraderJoe',
 | 
			
		||||
    // tslint:disable-next-line: enum-naming
 | 
			
		||||
    GMX = 'GMX',
 | 
			
		||||
    Platypus = 'Platypus',
 | 
			
		||||
    // Celo only
 | 
			
		||||
    UbeSwap = 'UbeSwap',
 | 
			
		||||
    MobiusMoney = 'MobiusMoney',
 | 
			
		||||
@@ -188,6 +191,11 @@ export interface GeistInfo {
 | 
			
		||||
    underlyingToken: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface PlatypusInfo {
 | 
			
		||||
    poolAddress: string[];
 | 
			
		||||
    tokens: string[];
 | 
			
		||||
    gasSchedule: number;
 | 
			
		||||
}
 | 
			
		||||
// Internal `fillData` field for `Fill` objects.
 | 
			
		||||
export interface FillData {}
 | 
			
		||||
 | 
			
		||||
@@ -223,6 +231,19 @@ export interface UniswapV2FillData extends FillData {
 | 
			
		||||
    router: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface GMXFillData extends FillData {
 | 
			
		||||
    router: string;
 | 
			
		||||
    reader: string;
 | 
			
		||||
    vault: string;
 | 
			
		||||
    tokenAddressPath: string[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface PlatypusFillData extends FillData {
 | 
			
		||||
    router: string;
 | 
			
		||||
    pool: string[];
 | 
			
		||||
    tokenAddressPath: string[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ShellFillData extends FillData {
 | 
			
		||||
    poolAddress: string;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,13 +17,16 @@ import * as DODOV2Sampler from '../test/generated-artifacts/DODOV2Sampler.json';
 | 
			
		||||
import * as DummyLiquidityProvider from '../test/generated-artifacts/DummyLiquidityProvider.json';
 | 
			
		||||
import * as ERC20BridgeSampler from '../test/generated-artifacts/ERC20BridgeSampler.json';
 | 
			
		||||
import * as FakeTaker from '../test/generated-artifacts/FakeTaker.json';
 | 
			
		||||
import * as GMXSampler from '../test/generated-artifacts/GMXSampler.json';
 | 
			
		||||
import * as IBalancer from '../test/generated-artifacts/IBalancer.json';
 | 
			
		||||
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';
 | 
			
		||||
import * as IPlatypus from '../test/generated-artifacts/IPlatypus.json';
 | 
			
		||||
import * as IShell from '../test/generated-artifacts/IShell.json';
 | 
			
		||||
import * as ISmoothy from '../test/generated-artifacts/ISmoothy.json';
 | 
			
		||||
import * as IUniswapExchangeQuotes from '../test/generated-artifacts/IUniswapExchangeQuotes.json';
 | 
			
		||||
@@ -37,6 +40,7 @@ import * as MooniswapSampler from '../test/generated-artifacts/MooniswapSampler.
 | 
			
		||||
import * as MStableSampler from '../test/generated-artifacts/MStableSampler.json';
 | 
			
		||||
import * as MultiBridgeSampler from '../test/generated-artifacts/MultiBridgeSampler.json';
 | 
			
		||||
import * as NativeOrderSampler from '../test/generated-artifacts/NativeOrderSampler.json';
 | 
			
		||||
import * as PlatypusSampler from '../test/generated-artifacts/PlatypusSampler.json';
 | 
			
		||||
import * as SamplerUtils from '../test/generated-artifacts/SamplerUtils.json';
 | 
			
		||||
import * as ShellSampler from '../test/generated-artifacts/ShellSampler.json';
 | 
			
		||||
import * as SmoothySampler from '../test/generated-artifacts/SmoothySampler.json';
 | 
			
		||||
@@ -59,6 +63,7 @@ export const artifacts = {
 | 
			
		||||
    DODOV2Sampler: DODOV2Sampler as ContractArtifact,
 | 
			
		||||
    ERC20BridgeSampler: ERC20BridgeSampler as ContractArtifact,
 | 
			
		||||
    FakeTaker: FakeTaker as ContractArtifact,
 | 
			
		||||
    GMXSampler: GMXSampler as ContractArtifact,
 | 
			
		||||
    KyberDmmSampler: KyberDmmSampler as ContractArtifact,
 | 
			
		||||
    KyberSampler: KyberSampler as ContractArtifact,
 | 
			
		||||
    LidoSampler: LidoSampler as ContractArtifact,
 | 
			
		||||
@@ -68,6 +73,7 @@ export const artifacts = {
 | 
			
		||||
    MooniswapSampler: MooniswapSampler as ContractArtifact,
 | 
			
		||||
    MultiBridgeSampler: MultiBridgeSampler as ContractArtifact,
 | 
			
		||||
    NativeOrderSampler: NativeOrderSampler as ContractArtifact,
 | 
			
		||||
    PlatypusSampler: PlatypusSampler as ContractArtifact,
 | 
			
		||||
    SamplerUtils: SamplerUtils as ContractArtifact,
 | 
			
		||||
    ShellSampler: ShellSampler as ContractArtifact,
 | 
			
		||||
    SmoothySampler: SmoothySampler as ContractArtifact,
 | 
			
		||||
@@ -79,10 +85,12 @@ export const artifacts = {
 | 
			
		||||
    IBalancer: IBalancer as ContractArtifact,
 | 
			
		||||
    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,
 | 
			
		||||
    IPlatypus: IPlatypus as ContractArtifact,
 | 
			
		||||
    IShell: IShell as ContractArtifact,
 | 
			
		||||
    ISmoothy: ISmoothy as ContractArtifact,
 | 
			
		||||
    IUniswapExchangeQuotes: IUniswapExchangeQuotes as ContractArtifact,
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ export * from '../test/generated-wrappers/d_o_d_o_v2_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/dummy_liquidity_provider';
 | 
			
		||||
export * from '../test/generated-wrappers/erc20_bridge_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/fake_taker';
 | 
			
		||||
export * from '../test/generated-wrappers/g_m_x_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/i_balancer';
 | 
			
		||||
export * from '../test/generated-wrappers/i_bancor';
 | 
			
		||||
export * from '../test/generated-wrappers/i_curve';
 | 
			
		||||
@@ -22,10 +23,12 @@ 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';
 | 
			
		||||
export * from '../test/generated-wrappers/i_platypus';
 | 
			
		||||
export * from '../test/generated-wrappers/i_shell';
 | 
			
		||||
export * from '../test/generated-wrappers/i_smoothy';
 | 
			
		||||
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';
 | 
			
		||||
@@ -35,6 +38,7 @@ export * from '../test/generated-wrappers/maker_p_s_m_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/mooniswap_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/multi_bridge_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/native_order_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/platypus_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/sampler_utils';
 | 
			
		||||
export * from '../test/generated-wrappers/shell_sampler';
 | 
			
		||||
export * from '../test/generated-wrappers/smoothy_sampler';
 | 
			
		||||
 
 | 
			
		||||
@@ -18,13 +18,16 @@
 | 
			
		||||
        "test/generated-artifacts/DummyLiquidityProvider.json",
 | 
			
		||||
        "test/generated-artifacts/ERC20BridgeSampler.json",
 | 
			
		||||
        "test/generated-artifacts/FakeTaker.json",
 | 
			
		||||
        "test/generated-artifacts/GMXSampler.json",
 | 
			
		||||
        "test/generated-artifacts/IBalancer.json",
 | 
			
		||||
        "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",
 | 
			
		||||
        "test/generated-artifacts/IPlatypus.json",
 | 
			
		||||
        "test/generated-artifacts/IShell.json",
 | 
			
		||||
        "test/generated-artifacts/ISmoothy.json",
 | 
			
		||||
        "test/generated-artifacts/IUniswapExchangeQuotes.json",
 | 
			
		||||
@@ -38,6 +41,7 @@
 | 
			
		||||
        "test/generated-artifacts/MooniswapSampler.json",
 | 
			
		||||
        "test/generated-artifacts/MultiBridgeSampler.json",
 | 
			
		||||
        "test/generated-artifacts/NativeOrderSampler.json",
 | 
			
		||||
        "test/generated-artifacts/PlatypusSampler.json",
 | 
			
		||||
        "test/generated-artifacts/SamplerUtils.json",
 | 
			
		||||
        "test/generated-artifacts/ShellSampler.json",
 | 
			
		||||
        "test/generated-artifacts/SmoothySampler.json",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,12 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "version": "1.12.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Added Support for GMX liquidity source on Avalanche"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1646225739,
 | 
			
		||||
        "version": "1.11.1",
 | 
			
		||||
 
 | 
			
		||||
@@ -134,6 +134,8 @@ export enum BridgeProtocol {
 | 
			
		||||
    Clipper, // Not used: Clipper is now using PLP interface
 | 
			
		||||
    AaveV2,
 | 
			
		||||
    Compound,
 | 
			
		||||
    GMX,
 | 
			
		||||
    Platypus,
 | 
			
		||||
}
 | 
			
		||||
// tslint:enable: enum-naming
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3755,10 +3755,10 @@ bigi@1.4.2, bigi@^1.1.0:
 | 
			
		||||
  version "1.4.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825"
 | 
			
		||||
 | 
			
		||||
bignumber.js@7.2.1, bignumber.js@9.0.1, bignumber.js@^9.0.0, bignumber.js@~4.1.0, bignumber.js@~9.0.0:
 | 
			
		||||
  version "9.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
 | 
			
		||||
  integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
 | 
			
		||||
bignumber.js@7.2.1, bignumber.js@9.0.2, bignumber.js@^9.0.0, bignumber.js@~4.1.0, bignumber.js@~9.0.0:
 | 
			
		||||
  version "9.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673"
 | 
			
		||||
  integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==
 | 
			
		||||
 | 
			
		||||
binary-extensions@^2.0.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user