Maker PSM integration [TKR-2] (#150)
* ADDS basic boilerplate for PSM bridge WIP * ADDS integrate the MakerPSM mixin and fix incorrect naming * fix: take into account PSM fee when buying USDC from PSM * feat: intial stab at a PSM sampler WIP * feat: integrate MakerPsm into AS WIP * refactor: get VAT contract address from PSM instead of passing it in * fix: hardcode PSM Gemtoken to USDC * fix: remove passing in authGem, get from PSM contract instead * fix: use constant modified to avoid using storage variables * fix: incorrect num decimals after multiplication in sampler * fix: PSM buy sampling * fix: use fillData to estimate gas schedule * Rebased on latest development * Guard and use latest Curve LiquidityProvider * `@0x/contract-addresses`: Redeploy FQT on mainnet and ropsten Co-authored-by: Jacob Evans <jacob@dekz.net> Co-authored-by: Lawrence Forman <lawrence@0xproject.com>
This commit is contained in:
		@@ -30,6 +30,7 @@ import "./mixins/MixinCryptoCom.sol";
 | 
				
			|||||||
import "./mixins/MixinDodo.sol";
 | 
					import "./mixins/MixinDodo.sol";
 | 
				
			||||||
import "./mixins/MixinDodoV2.sol";
 | 
					import "./mixins/MixinDodoV2.sol";
 | 
				
			||||||
import "./mixins/MixinKyber.sol";
 | 
					import "./mixins/MixinKyber.sol";
 | 
				
			||||||
 | 
					import "./mixins/MixinMakerPSM.sol";
 | 
				
			||||||
import "./mixins/MixinMooniswap.sol";
 | 
					import "./mixins/MixinMooniswap.sol";
 | 
				
			||||||
import "./mixins/MixinMStable.sol";
 | 
					import "./mixins/MixinMStable.sol";
 | 
				
			||||||
import "./mixins/MixinNerve.sol";
 | 
					import "./mixins/MixinNerve.sol";
 | 
				
			||||||
@@ -49,6 +50,7 @@ contract BridgeAdapter is
 | 
				
			|||||||
    MixinDodo,
 | 
					    MixinDodo,
 | 
				
			||||||
    MixinDodoV2,
 | 
					    MixinDodoV2,
 | 
				
			||||||
    MixinKyber,
 | 
					    MixinKyber,
 | 
				
			||||||
 | 
					    MixinMakerPSM,
 | 
				
			||||||
    MixinMooniswap,
 | 
					    MixinMooniswap,
 | 
				
			||||||
    MixinMStable,
 | 
					    MixinMStable,
 | 
				
			||||||
    MixinNerve,
 | 
					    MixinNerve,
 | 
				
			||||||
@@ -68,6 +70,7 @@ contract BridgeAdapter is
 | 
				
			|||||||
        MixinDodo()
 | 
					        MixinDodo()
 | 
				
			||||||
        MixinDodoV2()
 | 
					        MixinDodoV2()
 | 
				
			||||||
        MixinKyber(weth)
 | 
					        MixinKyber(weth)
 | 
				
			||||||
 | 
					        MixinMakerPSM()
 | 
				
			||||||
        MixinMooniswap(weth)
 | 
					        MixinMooniswap(weth)
 | 
				
			||||||
        MixinMStable()
 | 
					        MixinMStable()
 | 
				
			||||||
        MixinNerve()
 | 
					        MixinNerve()
 | 
				
			||||||
@@ -123,6 +126,13 @@ contract BridgeAdapter is
 | 
				
			|||||||
                sellAmount,
 | 
					                sellAmount,
 | 
				
			||||||
                order.bridgeData
 | 
					                order.bridgeData
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					        } else if (protocolId == BridgeProtocols.MAKERPSM) {
 | 
				
			||||||
 | 
					            boughtAmount = _tradeMakerPsm(
 | 
				
			||||||
 | 
					                sellToken,
 | 
				
			||||||
 | 
					                buyToken,
 | 
				
			||||||
 | 
					                sellAmount,
 | 
				
			||||||
 | 
					                order.bridgeData
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
        } else if (protocolId == BridgeProtocols.MOONISWAP) {
 | 
					        } else if (protocolId == BridgeProtocols.MOONISWAP) {
 | 
				
			||||||
            boughtAmount = _tradeMooniswap(
 | 
					            boughtAmount = _tradeMooniswap(
 | 
				
			||||||
                sellToken,
 | 
					                sellToken,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,4 +43,5 @@ library BridgeProtocols {
 | 
				
			|||||||
    uint128 internal constant BANCOR      = 13;
 | 
					    uint128 internal constant BANCOR      = 13;
 | 
				
			||||||
    uint128 internal constant COFIX       = 14;
 | 
					    uint128 internal constant COFIX       = 14;
 | 
				
			||||||
    uint128 internal constant NERVE       = 15;
 | 
					    uint128 internal constant NERVE       = 15;
 | 
				
			||||||
 | 
					    uint128 internal constant MAKERPSM    = 16;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,114 @@
 | 
				
			|||||||
 | 
					// SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright 2021 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";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IPSM {
 | 
				
			||||||
 | 
					    // @dev Get the fee for selling USDC to DAI in PSM
 | 
				
			||||||
 | 
					    // @return tin toll in [wad]
 | 
				
			||||||
 | 
					    function tin() external view returns (uint256);
 | 
				
			||||||
 | 
					    // @dev Get the fee for selling DAI to USDC in PSM
 | 
				
			||||||
 | 
					    // @return tout toll out [wad]
 | 
				
			||||||
 | 
					    function tout() external view returns (uint256);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // @dev Get the address of the PSM state Vat
 | 
				
			||||||
 | 
					    // @return address of the Vat
 | 
				
			||||||
 | 
					    function vat() external view returns (address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // @dev Get the address of the underlying vault powering PSM
 | 
				
			||||||
 | 
					    // @return address of gemJoin contract
 | 
				
			||||||
 | 
					    function gemJoin() external view returns (address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // @dev Sell USDC for DAI
 | 
				
			||||||
 | 
					    // @param usr The address of the account trading USDC for DAI.
 | 
				
			||||||
 | 
					    // @param gemAmt The amount of USDC to sell in USDC base units
 | 
				
			||||||
 | 
					    function sellGem(
 | 
				
			||||||
 | 
					        address usr,
 | 
				
			||||||
 | 
					        uint256 gemAmt
 | 
				
			||||||
 | 
					    ) external;
 | 
				
			||||||
 | 
					    // @dev Buy USDC for DAI
 | 
				
			||||||
 | 
					    // @param usr The address of the account trading DAI for USDC
 | 
				
			||||||
 | 
					    // @param gemAmt The amount of USDC to buy in USDC base units
 | 
				
			||||||
 | 
					    function buyGem(
 | 
				
			||||||
 | 
					        address usr,
 | 
				
			||||||
 | 
					        uint256 gemAmt
 | 
				
			||||||
 | 
					    ) external;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					contract MixinMakerPSM {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    using LibERC20TokenV06 for IERC20TokenV06;
 | 
				
			||||||
 | 
					    using LibSafeMathV06 for uint256;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct MakerPsmBridgeData {
 | 
				
			||||||
 | 
					        address psmAddress;
 | 
				
			||||||
 | 
					        address gemTokenAddres;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Maker units
 | 
				
			||||||
 | 
					    // wad: fixed point decimal with 18 decimals (for basic quantities, e.g. balances)
 | 
				
			||||||
 | 
					    uint256 constant private WAD = 10 ** 18;
 | 
				
			||||||
 | 
					    // ray: fixed point decimal with 27 decimals (for precise quantites, e.g. ratios)
 | 
				
			||||||
 | 
					    uint256 constant private RAY = 10 ** 27;
 | 
				
			||||||
 | 
					    // rad: fixed point decimal with 45 decimals (result of integer multiplication with a wad and a ray)
 | 
				
			||||||
 | 
					    uint256 constant private RAD = 10 ** 45;
 | 
				
			||||||
 | 
					    // See https://github.com/makerdao/dss/blob/master/DEVELOPING.md
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _tradeMakerPsm(
 | 
				
			||||||
 | 
					        IERC20TokenV06 sellToken,
 | 
				
			||||||
 | 
					        IERC20TokenV06 buyToken,
 | 
				
			||||||
 | 
					        uint256 sellAmount,
 | 
				
			||||||
 | 
					        bytes memory bridgeData
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					        internal
 | 
				
			||||||
 | 
					        returns (uint256 boughtAmount)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Decode the bridge data.
 | 
				
			||||||
 | 
					        MakerPsmBridgeData memory data = abi.decode(bridgeData, (MakerPsmBridgeData));
 | 
				
			||||||
 | 
					        uint256 beforeBalance = buyToken.balanceOf(address(this));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        IPSM psm = IPSM(data.psmAddress);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (address(sellToken) == data.gemTokenAddres) {
 | 
				
			||||||
 | 
					            sellToken.approveIfBelow(
 | 
				
			||||||
 | 
					                psm.gemJoin(),
 | 
				
			||||||
 | 
					                sellAmount
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            psm.sellGem(address(this), sellAmount);
 | 
				
			||||||
 | 
					        } else if (address(buyToken) == data.gemTokenAddres) {
 | 
				
			||||||
 | 
					            uint256 feeDivisor = WAD.safeAdd(psm.tout()); // eg. 1.001 * 10 ** 18 with 0.1% fee [tout is in wad];
 | 
				
			||||||
 | 
					            uint256 buyTokenBaseUnit = uint256(10) ** uint256(buyToken.decimals());
 | 
				
			||||||
 | 
					            uint256 gemAmount =  sellAmount.safeMul(buyTokenBaseUnit).safeDiv(feeDivisor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sellToken.approveIfBelow(
 | 
				
			||||||
 | 
					                data.psmAddress,
 | 
				
			||||||
 | 
					                sellAmount
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            psm.buyGem(address(this), gemAmount);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return buyToken.balanceOf(address(this)).safeSub(beforeBalance);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -43,7 +43,7 @@
 | 
				
			|||||||
    "config": {
 | 
					    "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",
 | 
					        "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",
 | 
				
			||||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
					        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
				
			||||||
        "abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IFeature|IFlashWallet|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOwnableFeature|IPancakeSwapFeature|ISimpleFunctionRegistryFeature|IStaking|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinBalancer|MixinBancor|MixinCoFiX|MixinCryptoCom|MixinCurve|MixinDodo|MixinDodoV2|MixinKyber|MixinMStable|MixinMooniswap|MixinNerve|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestMooniswap|TestNativeOrdersFeature|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|WethTransformer|ZeroEx|ZeroExOptimized).json"
 | 
					        "abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IFeature|IFlashWallet|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOwnableFeature|IPancakeSwapFeature|ISimpleFunctionRegistryFeature|IStaking|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinBalancer|MixinBancor|MixinCoFiX|MixinCryptoCom|MixinCurve|MixinDodo|MixinDodoV2|MixinKyber|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestMooniswap|TestNativeOrdersFeature|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|WethTransformer|ZeroEx|ZeroExOptimized).json"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "repository": {
 | 
					    "repository": {
 | 
				
			||||||
        "type": "git",
 | 
					        "type": "git",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,6 @@ import * as FeeCollector from '../generated-artifacts/FeeCollector.json';
 | 
				
			|||||||
import * as FeeCollectorController from '../generated-artifacts/FeeCollectorController.json';
 | 
					import * as FeeCollectorController from '../generated-artifacts/FeeCollectorController.json';
 | 
				
			||||||
import * as FillQuoteTransformer from '../generated-artifacts/FillQuoteTransformer.json';
 | 
					import * as FillQuoteTransformer from '../generated-artifacts/FillQuoteTransformer.json';
 | 
				
			||||||
import * as FullMigration from '../generated-artifacts/FullMigration.json';
 | 
					import * as FullMigration from '../generated-artifacts/FullMigration.json';
 | 
				
			||||||
import * as IAllowanceTarget from '../generated-artifacts/IAllowanceTarget.json';
 | 
					 | 
				
			||||||
import * as IBatchFillNativeOrdersFeature from '../generated-artifacts/IBatchFillNativeOrdersFeature.json';
 | 
					import * as IBatchFillNativeOrdersFeature from '../generated-artifacts/IBatchFillNativeOrdersFeature.json';
 | 
				
			||||||
import * as IERC20Transformer from '../generated-artifacts/IERC20Transformer.json';
 | 
					import * as IERC20Transformer from '../generated-artifacts/IERC20Transformer.json';
 | 
				
			||||||
import * as IFlashWallet from '../generated-artifacts/IFlashWallet.json';
 | 
					import * as IFlashWallet from '../generated-artifacts/IFlashWallet.json';
 | 
				
			||||||
@@ -43,7 +42,6 @@ export const artifacts = {
 | 
				
			|||||||
    FullMigration: FullMigration as ContractArtifact,
 | 
					    FullMigration: FullMigration as ContractArtifact,
 | 
				
			||||||
    InitialMigration: InitialMigration as ContractArtifact,
 | 
					    InitialMigration: InitialMigration as ContractArtifact,
 | 
				
			||||||
    IFlashWallet: IFlashWallet as ContractArtifact,
 | 
					    IFlashWallet: IFlashWallet as ContractArtifact,
 | 
				
			||||||
    IAllowanceTarget: IAllowanceTarget as ContractArtifact,
 | 
					 | 
				
			||||||
    IERC20Transformer: IERC20Transformer as ContractArtifact,
 | 
					    IERC20Transformer: IERC20Transformer as ContractArtifact,
 | 
				
			||||||
    IOwnableFeature: IOwnableFeature as ContractArtifact,
 | 
					    IOwnableFeature: IOwnableFeature as ContractArtifact,
 | 
				
			||||||
    ISimpleFunctionRegistryFeature: ISimpleFunctionRegistryFeature as ContractArtifact,
 | 
					    ISimpleFunctionRegistryFeature: ISimpleFunctionRegistryFeature as ContractArtifact,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,6 @@ export * from '../generated-wrappers/fee_collector';
 | 
				
			|||||||
export * from '../generated-wrappers/fee_collector_controller';
 | 
					export * from '../generated-wrappers/fee_collector_controller';
 | 
				
			||||||
export * from '../generated-wrappers/fill_quote_transformer';
 | 
					export * from '../generated-wrappers/fill_quote_transformer';
 | 
				
			||||||
export * from '../generated-wrappers/full_migration';
 | 
					export * from '../generated-wrappers/full_migration';
 | 
				
			||||||
export * from '../generated-wrappers/i_allowance_target';
 | 
					 | 
				
			||||||
export * from '../generated-wrappers/i_batch_fill_native_orders_feature';
 | 
					export * from '../generated-wrappers/i_batch_fill_native_orders_feature';
 | 
				
			||||||
export * from '../generated-wrappers/i_erc20_transformer';
 | 
					export * from '../generated-wrappers/i_erc20_transformer';
 | 
				
			||||||
export * from '../generated-wrappers/i_flash_wallet';
 | 
					export * from '../generated-wrappers/i_flash_wallet';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,6 +83,7 @@ import * as MixinCurve from '../test/generated-artifacts/MixinCurve.json';
 | 
				
			|||||||
import * as MixinDodo from '../test/generated-artifacts/MixinDodo.json';
 | 
					import * as MixinDodo from '../test/generated-artifacts/MixinDodo.json';
 | 
				
			||||||
import * as MixinDodoV2 from '../test/generated-artifacts/MixinDodoV2.json';
 | 
					import * as MixinDodoV2 from '../test/generated-artifacts/MixinDodoV2.json';
 | 
				
			||||||
import * as MixinKyber from '../test/generated-artifacts/MixinKyber.json';
 | 
					import * as MixinKyber from '../test/generated-artifacts/MixinKyber.json';
 | 
				
			||||||
 | 
					import * as MixinMakerPSM from '../test/generated-artifacts/MixinMakerPSM.json';
 | 
				
			||||||
import * as MixinMooniswap from '../test/generated-artifacts/MixinMooniswap.json';
 | 
					import * as MixinMooniswap from '../test/generated-artifacts/MixinMooniswap.json';
 | 
				
			||||||
import * as MixinMStable from '../test/generated-artifacts/MixinMStable.json';
 | 
					import * as MixinMStable from '../test/generated-artifacts/MixinMStable.json';
 | 
				
			||||||
import * as MixinNerve from '../test/generated-artifacts/MixinNerve.json';
 | 
					import * as MixinNerve from '../test/generated-artifacts/MixinNerve.json';
 | 
				
			||||||
@@ -241,6 +242,7 @@ export const artifacts = {
 | 
				
			|||||||
    MixinDodoV2: MixinDodoV2 as ContractArtifact,
 | 
					    MixinDodoV2: MixinDodoV2 as ContractArtifact,
 | 
				
			||||||
    MixinKyber: MixinKyber as ContractArtifact,
 | 
					    MixinKyber: MixinKyber as ContractArtifact,
 | 
				
			||||||
    MixinMStable: MixinMStable as ContractArtifact,
 | 
					    MixinMStable: MixinMStable as ContractArtifact,
 | 
				
			||||||
 | 
					    MixinMakerPSM: MixinMakerPSM as ContractArtifact,
 | 
				
			||||||
    MixinMooniswap: MixinMooniswap as ContractArtifact,
 | 
					    MixinMooniswap: MixinMooniswap as ContractArtifact,
 | 
				
			||||||
    MixinNerve: MixinNerve as ContractArtifact,
 | 
					    MixinNerve: MixinNerve as ContractArtifact,
 | 
				
			||||||
    MixinOasis: MixinOasis as ContractArtifact,
 | 
					    MixinOasis: MixinOasis as ContractArtifact,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -82,6 +82,7 @@ export * from '../test/generated-wrappers/mixin_dodo';
 | 
				
			|||||||
export * from '../test/generated-wrappers/mixin_dodo_v2';
 | 
					export * from '../test/generated-wrappers/mixin_dodo_v2';
 | 
				
			||||||
export * from '../test/generated-wrappers/mixin_kyber';
 | 
					export * from '../test/generated-wrappers/mixin_kyber';
 | 
				
			||||||
export * from '../test/generated-wrappers/mixin_m_stable';
 | 
					export * from '../test/generated-wrappers/mixin_m_stable';
 | 
				
			||||||
 | 
					export * from '../test/generated-wrappers/mixin_maker_p_s_m';
 | 
				
			||||||
export * from '../test/generated-wrappers/mixin_mooniswap';
 | 
					export * from '../test/generated-wrappers/mixin_mooniswap';
 | 
				
			||||||
export * from '../test/generated-wrappers/mixin_nerve';
 | 
					export * from '../test/generated-wrappers/mixin_nerve';
 | 
				
			||||||
export * from '../test/generated-wrappers/mixin_oasis';
 | 
					export * from '../test/generated-wrappers/mixin_oasis';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,6 @@
 | 
				
			|||||||
        "generated-artifacts/FeeCollectorController.json",
 | 
					        "generated-artifacts/FeeCollectorController.json",
 | 
				
			||||||
        "generated-artifacts/FillQuoteTransformer.json",
 | 
					        "generated-artifacts/FillQuoteTransformer.json",
 | 
				
			||||||
        "generated-artifacts/FullMigration.json",
 | 
					        "generated-artifacts/FullMigration.json",
 | 
				
			||||||
        "generated-artifacts/IAllowanceTarget.json",
 | 
					 | 
				
			||||||
        "generated-artifacts/IBatchFillNativeOrdersFeature.json",
 | 
					        "generated-artifacts/IBatchFillNativeOrdersFeature.json",
 | 
				
			||||||
        "generated-artifacts/IERC20Transformer.json",
 | 
					        "generated-artifacts/IERC20Transformer.json",
 | 
				
			||||||
        "generated-artifacts/IFlashWallet.json",
 | 
					        "generated-artifacts/IFlashWallet.json",
 | 
				
			||||||
@@ -114,6 +113,7 @@
 | 
				
			|||||||
        "test/generated-artifacts/MixinDodoV2.json",
 | 
					        "test/generated-artifacts/MixinDodoV2.json",
 | 
				
			||||||
        "test/generated-artifacts/MixinKyber.json",
 | 
					        "test/generated-artifacts/MixinKyber.json",
 | 
				
			||||||
        "test/generated-artifacts/MixinMStable.json",
 | 
					        "test/generated-artifacts/MixinMStable.json",
 | 
				
			||||||
 | 
					        "test/generated-artifacts/MixinMakerPSM.json",
 | 
				
			||||||
        "test/generated-artifacts/MixinMooniswap.json",
 | 
					        "test/generated-artifacts/MixinMooniswap.json",
 | 
				
			||||||
        "test/generated-artifacts/MixinNerve.json",
 | 
					        "test/generated-artifacts/MixinNerve.json",
 | 
				
			||||||
        "test/generated-artifacts/MixinOasis.json",
 | 
					        "test/generated-artifacts/MixinOasis.json",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ import "./DODOV2Sampler.sol";
 | 
				
			|||||||
import "./Eth2DaiSampler.sol";
 | 
					import "./Eth2DaiSampler.sol";
 | 
				
			||||||
import "./KyberSampler.sol";
 | 
					import "./KyberSampler.sol";
 | 
				
			||||||
import "./LiquidityProviderSampler.sol";
 | 
					import "./LiquidityProviderSampler.sol";
 | 
				
			||||||
 | 
					import "./MakerPSMSampler.sol";
 | 
				
			||||||
import "./MultiBridgeSampler.sol";
 | 
					import "./MultiBridgeSampler.sol";
 | 
				
			||||||
import "./MStableSampler.sol";
 | 
					import "./MStableSampler.sol";
 | 
				
			||||||
import "./MooniswapSampler.sol";
 | 
					import "./MooniswapSampler.sol";
 | 
				
			||||||
@@ -48,6 +49,7 @@ contract ERC20BridgeSampler is
 | 
				
			|||||||
    Eth2DaiSampler,
 | 
					    Eth2DaiSampler,
 | 
				
			||||||
    KyberSampler,
 | 
					    KyberSampler,
 | 
				
			||||||
    LiquidityProviderSampler,
 | 
					    LiquidityProviderSampler,
 | 
				
			||||||
 | 
					    MakerPSMSampler,
 | 
				
			||||||
    MStableSampler,
 | 
					    MStableSampler,
 | 
				
			||||||
    MooniswapSampler,
 | 
					    MooniswapSampler,
 | 
				
			||||||
    MultiBridgeSampler,
 | 
					    MultiBridgeSampler,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										267
									
								
								packages/asset-swapper/contracts/src/MakerPSMSampler.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								packages/asset-swapper/contracts/src/MakerPSMSampler.sol
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,267 @@
 | 
				
			|||||||
 | 
					// SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Copyright 2021 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 "./SamplerUtils.sol";
 | 
				
			||||||
 | 
					import "@0x/contracts-utils/contracts/src/v06/LibMathV06.sol";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IPSM {
 | 
				
			||||||
 | 
					    // @dev Get the fee for selling USDC to DAI in PSM
 | 
				
			||||||
 | 
					    // @return tin toll in [wad]
 | 
				
			||||||
 | 
					    function tin() external view returns (uint256);
 | 
				
			||||||
 | 
					    // @dev Get the fee for selling DAI to USDC in PSM
 | 
				
			||||||
 | 
					    // @return tout toll out [wad]
 | 
				
			||||||
 | 
					    function tout() external view returns (uint256);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // @dev Get the address of the PSM state Vat
 | 
				
			||||||
 | 
					    // @return address of the Vat
 | 
				
			||||||
 | 
					    function vat() external view returns (address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // @dev Get the address of the underlying vault powering PSM
 | 
				
			||||||
 | 
					    // @return address of gemJoin contract
 | 
				
			||||||
 | 
					    function gemJoin() external view returns (address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // @dev Get the address of DAI
 | 
				
			||||||
 | 
					    // @return address of DAI contract
 | 
				
			||||||
 | 
					    function dai() external view returns (address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // @dev Sell USDC for DAI
 | 
				
			||||||
 | 
					    // @param usr The address of the account trading USDC for DAI.
 | 
				
			||||||
 | 
					    // @param gemAmt The amount of USDC to sell in USDC base units
 | 
				
			||||||
 | 
					    function sellGem(
 | 
				
			||||||
 | 
					        address usr,
 | 
				
			||||||
 | 
					        uint256 gemAmt
 | 
				
			||||||
 | 
					    ) external;
 | 
				
			||||||
 | 
					    // @dev Buy USDC for DAI
 | 
				
			||||||
 | 
					    // @param usr The address of the account trading DAI for USDC
 | 
				
			||||||
 | 
					    // @param gemAmt The amount of USDC to buy in USDC base units
 | 
				
			||||||
 | 
					    function buyGem(
 | 
				
			||||||
 | 
					        address usr,
 | 
				
			||||||
 | 
					        uint256 gemAmt
 | 
				
			||||||
 | 
					    ) external;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IVAT {
 | 
				
			||||||
 | 
					    // @dev Get a collateral type by identifier
 | 
				
			||||||
 | 
					    // @param ilkIdentifier bytes32 identifier. Example: ethers.utils.formatBytes32String("PSM-USDC-A")
 | 
				
			||||||
 | 
					    // @return ilk
 | 
				
			||||||
 | 
					    // @return ilk.Art Total Normalised Debt in wad
 | 
				
			||||||
 | 
					    // @return ilk.rate Accumulated Rates in ray
 | 
				
			||||||
 | 
					    // @return ilk.spot Price with Safety Margin in ray
 | 
				
			||||||
 | 
					    // @return ilk.line Debt Ceiling in rad
 | 
				
			||||||
 | 
					    // @return ilk.dust Urn Debt Floor in rad
 | 
				
			||||||
 | 
					    function ilks(
 | 
				
			||||||
 | 
					        bytes32 ilkIdentifier
 | 
				
			||||||
 | 
					    ) external view returns (
 | 
				
			||||||
 | 
					        uint256 Art,
 | 
				
			||||||
 | 
					        uint256 rate,
 | 
				
			||||||
 | 
					        uint256 spot,
 | 
				
			||||||
 | 
					        uint256 line,
 | 
				
			||||||
 | 
					        uint256 dust
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					contract MakerPSMSampler is
 | 
				
			||||||
 | 
					    SamplerUtils
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    using LibSafeMathV06 for uint256;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Information about which PSM module to use
 | 
				
			||||||
 | 
					    struct MakerPsmInfo {
 | 
				
			||||||
 | 
					        address psmAddress;
 | 
				
			||||||
 | 
					        bytes32 ilkIdentifier;
 | 
				
			||||||
 | 
					        address gemTokenAddress;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Gas limit for MakerPsm calls.
 | 
				
			||||||
 | 
					    uint256 constant private MAKER_PSM_CALL_GAS = 300e3; // 300k
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Maker units
 | 
				
			||||||
 | 
					    // wad: fixed point decimal with 18 decimals (for basic quantities, e.g. balances)
 | 
				
			||||||
 | 
					    uint256 constant private WAD = 10 ** 18;
 | 
				
			||||||
 | 
					    // ray: fixed point decimal with 27 decimals (for precise quantites, e.g. ratios)
 | 
				
			||||||
 | 
					    uint256 constant private RAY = 10 ** 27;
 | 
				
			||||||
 | 
					    // rad: fixed point decimal with 45 decimals (result of integer multiplication with a wad and a ray)
 | 
				
			||||||
 | 
					    uint256 constant private RAD = 10 ** 45;
 | 
				
			||||||
 | 
					    // See https://github.com/makerdao/dss/blob/master/DEVELOPING.m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// @dev Sample sell quotes from Maker PSM
 | 
				
			||||||
 | 
					    function sampleSellsFromMakerPsm(
 | 
				
			||||||
 | 
					        MakerPsmInfo memory psmInfo,
 | 
				
			||||||
 | 
					        address takerToken,
 | 
				
			||||||
 | 
					        address makerToken,
 | 
				
			||||||
 | 
					        uint256[] memory takerTokenAmounts
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					        public
 | 
				
			||||||
 | 
					        view
 | 
				
			||||||
 | 
					        returns (uint256[] memory makerTokenAmounts)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _assertValidPair(makerToken, takerToken);
 | 
				
			||||||
 | 
					        IPSM psm = IPSM(psmInfo.psmAddress);
 | 
				
			||||||
 | 
					        IVAT vat = IVAT(psm.vat());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint256 numSamples = takerTokenAmounts.length;
 | 
				
			||||||
 | 
					        makerTokenAmounts = new uint256[](numSamples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (makerToken != psm.dai() && takerToken != psm.dai()) {
 | 
				
			||||||
 | 
					            return makerTokenAmounts;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (uint256 i = 0; i < numSamples; i++) {
 | 
				
			||||||
 | 
					            uint256 buyAmount = _samplePSMSell(psmInfo, makerToken, takerToken, takerTokenAmounts[i], psm, vat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (buyAmount == 0) {
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            makerTokenAmounts[i] = buyAmount;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function sampleBuysFromMakerPsm(
 | 
				
			||||||
 | 
					        MakerPsmInfo memory psmInfo,
 | 
				
			||||||
 | 
					        address takerToken,
 | 
				
			||||||
 | 
					        address makerToken,
 | 
				
			||||||
 | 
					        uint256[] memory makerTokenAmounts
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					        public
 | 
				
			||||||
 | 
					        view
 | 
				
			||||||
 | 
					        returns (uint256[] memory takerTokenAmounts)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _assertValidPair(makerToken, takerToken);
 | 
				
			||||||
 | 
					        IPSM psm = IPSM(psmInfo.psmAddress);
 | 
				
			||||||
 | 
					        IVAT vat = IVAT(psm.vat());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint256 numSamples = makerTokenAmounts.length;
 | 
				
			||||||
 | 
					        takerTokenAmounts = new uint256[](numSamples);
 | 
				
			||||||
 | 
					        if (makerToken != psm.dai() && takerToken != psm.dai()) {
 | 
				
			||||||
 | 
					            return takerTokenAmounts;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (uint256 i = 0; i < numSamples; i++) {
 | 
				
			||||||
 | 
					            uint256 sellAmount = _samplePSMBuy(psmInfo, makerToken, takerToken, makerTokenAmounts[i], psm, vat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (sellAmount == 0) {
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            takerTokenAmounts[i] = sellAmount;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _samplePSMSell(MakerPsmInfo memory psmInfo, address makerToken, address takerToken, uint256 takerTokenAmount, IPSM psm, IVAT vat)
 | 
				
			||||||
 | 
					        private
 | 
				
			||||||
 | 
					        view
 | 
				
			||||||
 | 
					        returns (uint256)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        (uint256 totalDebtInWad,,, uint256 debtCeilingInRad, uint256 debtFloorInRad) = vat.ilks(psmInfo.ilkIdentifier);
 | 
				
			||||||
 | 
					        uint256 gemTokenBaseUnit = uint256(1e6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (takerToken == psmInfo.gemTokenAddress) {
 | 
				
			||||||
 | 
					            // Simulate sellGem
 | 
				
			||||||
 | 
					            // Selling USDC to the PSM, increasing the total debt
 | 
				
			||||||
 | 
					            // Convert USDC 6 decimals to 18 decimals [wad]
 | 
				
			||||||
 | 
					            uint256 takerTokenAmountInWad = takerTokenAmount.safeMul(1e12);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            uint256 newTotalDebtInRad = totalDebtInWad.safeAdd(takerTokenAmountInWad).safeMul(RAY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // PSM is too full to fit
 | 
				
			||||||
 | 
					            if (newTotalDebtInRad >= debtCeilingInRad) {
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            uint256 feeInWad = takerTokenAmountInWad.safeMul(psm.tin()).safeDiv(WAD);
 | 
				
			||||||
 | 
					            uint256 makerTokenAmountInWad = takerTokenAmountInWad.safeSub(feeInWad);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return makerTokenAmountInWad;
 | 
				
			||||||
 | 
					        } else if (makerToken == psmInfo.gemTokenAddress) {
 | 
				
			||||||
 | 
					            // Simulate buyGem
 | 
				
			||||||
 | 
					            // Buying USDC from the PSM, decreasing the total debt
 | 
				
			||||||
 | 
					            // Selling DAI for USDC, already in 18 decimals [wad]
 | 
				
			||||||
 | 
					            uint256 takerTokenAmountInWad = takerTokenAmount;
 | 
				
			||||||
 | 
					            if (takerTokenAmountInWad > totalDebtInWad) {
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            uint256 newTotalDebtInRad = totalDebtInWad.safeSub(takerTokenAmountInWad).safeMul(RAY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // PSM is empty, not enough USDC to buy from it
 | 
				
			||||||
 | 
					            if (newTotalDebtInRad <= debtFloorInRad) {
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            uint256 feeDivisorInWad = WAD.safeAdd(psm.tout()); // eg. 1.001 * 10 ** 18 with 0.1% tout;
 | 
				
			||||||
 | 
					            uint256 makerTokenAmountInGemTokenBaseUnits =  takerTokenAmountInWad.safeMul(gemTokenBaseUnit).safeDiv(feeDivisorInWad);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return makerTokenAmountInGemTokenBaseUnits;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _samplePSMBuy(MakerPsmInfo memory psmInfo, address makerToken, address takerToken, uint256 makerTokenAmount, IPSM psm, IVAT vat)
 | 
				
			||||||
 | 
					        private
 | 
				
			||||||
 | 
					        view
 | 
				
			||||||
 | 
					        returns (uint256)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        (uint256 totalDebtInWad,,, uint256 debtCeilingInRad, uint256 debtFloorInRad) = vat.ilks(psmInfo.ilkIdentifier);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (takerToken == psmInfo.gemTokenAddress) {
 | 
				
			||||||
 | 
					            // Simulate sellGem
 | 
				
			||||||
 | 
					            // Selling USDC to the PSM, increasing the total debt
 | 
				
			||||||
 | 
					            uint256 makerTokenAmountInWad = makerTokenAmount;
 | 
				
			||||||
 | 
					            uint256 feeDivisorInWad = WAD.safeSub(psm.tin()); // eg. 0.999 * 10 ** 18 with 0.1% tin;
 | 
				
			||||||
 | 
					            uint256 takerTokenAmountInWad = makerTokenAmountInWad.safeMul(WAD).safeDiv(feeDivisorInWad);
 | 
				
			||||||
 | 
					            uint256 newTotalDebtInRad = totalDebtInWad.safeAdd(takerTokenAmountInWad).safeMul(RAY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // PSM is too full to fit
 | 
				
			||||||
 | 
					            if (newTotalDebtInRad >= debtCeilingInRad) {
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            uint256 takerTokenAmountInGemInGemBaseUnits = (takerTokenAmountInWad.safeDiv(1e12)).safeAdd(1); // Add 1 to deal with cut off decimals converting to lower decimals
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return takerTokenAmountInGemInGemBaseUnits;
 | 
				
			||||||
 | 
					        } else if (makerToken == psmInfo.gemTokenAddress) {
 | 
				
			||||||
 | 
					            // Simulate buyGem
 | 
				
			||||||
 | 
					            // Buying USDC from the PSM, decreasing the total debt
 | 
				
			||||||
 | 
					            uint256 makerTokenAmountInWad = makerTokenAmount.safeMul(1e12);
 | 
				
			||||||
 | 
					            uint256 feeMultiplierInWad = WAD.safeAdd(psm.tout()); // eg. 1.001 * 10 ** 18 with 0.1% tout;
 | 
				
			||||||
 | 
					            uint256 takerTokenAmountInWad =  makerTokenAmountInWad.safeMul(feeMultiplierInWad).safeDiv(WAD);
 | 
				
			||||||
 | 
					            if (takerTokenAmountInWad > totalDebtInWad) {
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            uint256 newTotalDebtInRad = totalDebtInWad.safeSub(takerTokenAmountInWad).safeMul(RAY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // PSM is empty, not enough USDC to buy
 | 
				
			||||||
 | 
					            if (newTotalDebtInRad <= debtFloorInRad) {
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return takerTokenAmountInWad;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -38,7 +38,7 @@
 | 
				
			|||||||
    "config": {
 | 
					    "config": {
 | 
				
			||||||
        "publicInterfaceContracts": "ERC20BridgeSampler,BalanceChecker,FakeTaker",
 | 
					        "publicInterfaceContracts": "ERC20BridgeSampler,BalanceChecker,FakeTaker",
 | 
				
			||||||
        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
					        "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
 | 
				
			||||||
        "abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BancorSampler|CurveSampler|DODOSampler|DODOV2Sampler|DummyLiquidityProvider|ERC20BridgeSampler|Eth2DaiSampler|FakeTaker|IBalancer|IBancor|ICurve|IEth2Dai|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IShell|IUniswapExchangeQuotes|IUniswapV2Router01|KyberSampler|LiquidityProviderSampler|MStableSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|SamplerUtils|ShellSampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UtilitySampler).json",
 | 
					        "abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BancorSampler|CurveSampler|DODOSampler|DODOV2Sampler|DummyLiquidityProvider|ERC20BridgeSampler|Eth2DaiSampler|FakeTaker|IBalancer|IBancor|ICurve|IEth2Dai|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IShell|IUniswapExchangeQuotes|IUniswapV2Router01|KyberSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|SamplerUtils|ShellSampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UtilitySampler).json",
 | 
				
			||||||
        "postpublish": {
 | 
					        "postpublish": {
 | 
				
			||||||
            "assets": []
 | 
					            "assets": []
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -77,6 +77,7 @@
 | 
				
			|||||||
        "@ethersproject/address": "^5.0.1",
 | 
					        "@ethersproject/address": "^5.0.1",
 | 
				
			||||||
        "@ethersproject/contracts": "^5.0.1",
 | 
					        "@ethersproject/contracts": "^5.0.1",
 | 
				
			||||||
        "@ethersproject/providers": "^5.0.4",
 | 
					        "@ethersproject/providers": "^5.0.4",
 | 
				
			||||||
 | 
					        "@ethersproject/strings": "^5.0.10",
 | 
				
			||||||
        "axios": "^0.21.1",
 | 
					        "axios": "^0.21.1",
 | 
				
			||||||
        "axios-mock-adapter": "^1.19.0",
 | 
					        "axios-mock-adapter": "^1.19.0",
 | 
				
			||||||
        "cream-sor": "^0.3.3",
 | 
					        "cream-sor": "^0.3.3",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
import { ChainId } from '@0x/contract-addresses';
 | 
					import { ChainId } from '@0x/contract-addresses';
 | 
				
			||||||
import { FillQuoteTransformerOrderType } from '@0x/protocol-utils';
 | 
					import { FillQuoteTransformerOrderType } from '@0x/protocol-utils';
 | 
				
			||||||
import { BigNumber } from '@0x/utils';
 | 
					import { BigNumber } from '@0x/utils';
 | 
				
			||||||
 | 
					import { formatBytes32String } from '@ethersproject/strings';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { TokenAdjacencyGraphBuilder } from '../token_adjacency_graph_builder';
 | 
					import { TokenAdjacencyGraphBuilder } from '../token_adjacency_graph_builder';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,7 +19,9 @@ import {
 | 
				
			|||||||
    KyberSamplerOpts,
 | 
					    KyberSamplerOpts,
 | 
				
			||||||
    LiquidityProviderFillData,
 | 
					    LiquidityProviderFillData,
 | 
				
			||||||
    LiquidityProviderRegistry,
 | 
					    LiquidityProviderRegistry,
 | 
				
			||||||
 | 
					    MakerPsmFillData,
 | 
				
			||||||
    MultiHopFillData,
 | 
					    MultiHopFillData,
 | 
				
			||||||
 | 
					    PsmInfo,
 | 
				
			||||||
    TokenAdjacencyGraph,
 | 
					    TokenAdjacencyGraph,
 | 
				
			||||||
    UniswapV2FillData,
 | 
					    UniswapV2FillData,
 | 
				
			||||||
} from './types';
 | 
					} from './types';
 | 
				
			||||||
@@ -78,6 +81,7 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
 | 
				
			|||||||
            ERC20BridgeSource.LiquidityProvider,
 | 
					            ERC20BridgeSource.LiquidityProvider,
 | 
				
			||||||
            ERC20BridgeSource.CryptoCom,
 | 
					            ERC20BridgeSource.CryptoCom,
 | 
				
			||||||
            ERC20BridgeSource.Linkswap,
 | 
					            ERC20BridgeSource.Linkswap,
 | 
				
			||||||
 | 
					            ERC20BridgeSource.MakerPsm,
 | 
				
			||||||
        ]),
 | 
					        ]),
 | 
				
			||||||
        [ChainId.Ropsten]: new SourceFilters([ERC20BridgeSource.Native]),
 | 
					        [ChainId.Ropsten]: new SourceFilters([ERC20BridgeSource.Native]),
 | 
				
			||||||
        [ChainId.Rinkeby]: new SourceFilters([ERC20BridgeSource.Native]),
 | 
					        [ChainId.Rinkeby]: new SourceFilters([ERC20BridgeSource.Native]),
 | 
				
			||||||
@@ -127,6 +131,7 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
 | 
				
			|||||||
            ERC20BridgeSource.LiquidityProvider,
 | 
					            ERC20BridgeSource.LiquidityProvider,
 | 
				
			||||||
            ERC20BridgeSource.CryptoCom,
 | 
					            ERC20BridgeSource.CryptoCom,
 | 
				
			||||||
            ERC20BridgeSource.Linkswap,
 | 
					            ERC20BridgeSource.Linkswap,
 | 
				
			||||||
 | 
					            ERC20BridgeSource.MakerPsm,
 | 
				
			||||||
        ]),
 | 
					        ]),
 | 
				
			||||||
        [ChainId.Ropsten]: new SourceFilters([ERC20BridgeSource.Native]),
 | 
					        [ChainId.Ropsten]: new SourceFilters([ERC20BridgeSource.Native]),
 | 
				
			||||||
        [ChainId.Rinkeby]: new SourceFilters([ERC20BridgeSource.Native]),
 | 
					        [ChainId.Rinkeby]: new SourceFilters([ERC20BridgeSource.Native]),
 | 
				
			||||||
@@ -698,12 +703,28 @@ export const MAX_DODOV2_POOLS_QUERIED = 3;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export const CURVE_LIQUIDITY_PROVIDER_BY_CHAIN_ID = valueByChainId<string>(
 | 
					export const CURVE_LIQUIDITY_PROVIDER_BY_CHAIN_ID = valueByChainId<string>(
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        [ChainId.Mainnet]: '0x7a6F6a048fE2Dc1397ABa0bf7879d3eacF371C53',
 | 
					        [ChainId.Mainnet]: '0x561b94454b65614ae3db0897b74303f4acf7cc75',
 | 
				
			||||||
        [ChainId.Ropsten]: '0xAa213dcDFbF104e08cbAeC3d1628eD197553AfCc',
 | 
					        [ChainId.Ropsten]: '0xae241c6fc7f28f6dc0cb58b4112ba7f63fcaf5e2',
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    NULL_ADDRESS,
 | 
					    NULL_ADDRESS,
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const MAKER_PSM_INFO_BY_CHAIN_ID = valueByChainId<PsmInfo>(
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [ChainId.Mainnet]: {
 | 
				
			||||||
 | 
					            // Currently only USDC is supported
 | 
				
			||||||
 | 
					            gemTokenAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
 | 
				
			||||||
 | 
					            ilkIdentifier: formatBytes32String('PSM-USDC-A'),
 | 
				
			||||||
 | 
					            psmAddress: '0x89b78cfa322f6c5de0abceecab66aee45393cc5a',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        gemTokenAddress: NULL_ADDRESS,
 | 
				
			||||||
 | 
					        ilkIdentifier: NULL_BYTES,
 | 
				
			||||||
 | 
					        psmAddress: NULL_ADDRESS,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const MOONISWAP_LIQUIDITY_PROVIDER_BY_CHAIN_ID = valueByChainId<string>(
 | 
					export const MOONISWAP_LIQUIDITY_PROVIDER_BY_CHAIN_ID = valueByChainId<string>(
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        [ChainId.Mainnet]: '0xa2033d6ba88756ce6a87584d69dc87bda9a4f889',
 | 
					        [ChainId.Mainnet]: '0xa2033d6ba88756ce6a87584d69dc87bda9a4f889',
 | 
				
			||||||
@@ -776,7 +797,7 @@ export const BAKERYSWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
 | 
				
			|||||||
export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
 | 
					export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
 | 
				
			||||||
    [ERC20BridgeSource.Native]: fillData => {
 | 
					    [ERC20BridgeSource.Native]: fillData => {
 | 
				
			||||||
        // TODO jacob re-order imports so there is no circular rependency with SignedNativeOrder
 | 
					        // TODO jacob re-order imports so there is no circular rependency with SignedNativeOrder
 | 
				
			||||||
        const nativeFillData = fillData as ({ type: FillQuoteTransformerOrderType });
 | 
					        const nativeFillData = fillData as { type: FillQuoteTransformerOrderType };
 | 
				
			||||||
        return nativeFillData && nativeFillData.type === FillQuoteTransformerOrderType.Limit
 | 
					        return nativeFillData && nativeFillData.type === FillQuoteTransformerOrderType.Limit
 | 
				
			||||||
            ? PROTOCOL_FEE_MULTIPLIER.plus(100e3).toNumber()
 | 
					            ? PROTOCOL_FEE_MULTIPLIER.plus(100e3).toNumber()
 | 
				
			||||||
            : // TODO jacob revisit wth v4 LimitOrders
 | 
					            : // TODO jacob revisit wth v4 LimitOrders
 | 
				
			||||||
@@ -863,6 +884,16 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
 | 
				
			|||||||
    [ERC20BridgeSource.Balancer]: () => 120e3,
 | 
					    [ERC20BridgeSource.Balancer]: () => 120e3,
 | 
				
			||||||
    [ERC20BridgeSource.Cream]: () => 120e3,
 | 
					    [ERC20BridgeSource.Cream]: () => 120e3,
 | 
				
			||||||
    [ERC20BridgeSource.MStable]: () => 700e3,
 | 
					    [ERC20BridgeSource.MStable]: () => 700e3,
 | 
				
			||||||
 | 
					    [ERC20BridgeSource.MakerPsm]: (fillData?: FillData) => {
 | 
				
			||||||
 | 
					        const psmFillData = fillData as MakerPsmFillData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // TODO(kimpers): update with more accurate numbers after allowances have been set
 | 
				
			||||||
 | 
					        if (psmFillData.takerToken === psmFillData.gemTokenAddress) {
 | 
				
			||||||
 | 
					            return psmFillData.isSellOperation ? 389e3 : 423e3;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return 444e3;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    [ERC20BridgeSource.Mooniswap]: () => 130e3,
 | 
					    [ERC20BridgeSource.Mooniswap]: () => 130e3,
 | 
				
			||||||
    [ERC20BridgeSource.Swerve]: () => 150e3,
 | 
					    [ERC20BridgeSource.Swerve]: () => 150e3,
 | 
				
			||||||
    [ERC20BridgeSource.Nerve]: () => 150e3,
 | 
					    [ERC20BridgeSource.Nerve]: () => 150e3,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,7 @@ import {
 | 
				
			|||||||
    GenericRouterFillData,
 | 
					    GenericRouterFillData,
 | 
				
			||||||
    KyberFillData,
 | 
					    KyberFillData,
 | 
				
			||||||
    LiquidityProviderFillData,
 | 
					    LiquidityProviderFillData,
 | 
				
			||||||
 | 
					    MakerPsmFillData,
 | 
				
			||||||
    MooniswapFillData,
 | 
					    MooniswapFillData,
 | 
				
			||||||
    MultiHopFillData,
 | 
					    MultiHopFillData,
 | 
				
			||||||
    NativeCollapsedFill,
 | 
					    NativeCollapsedFill,
 | 
				
			||||||
@@ -91,6 +92,8 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s
 | 
				
			|||||||
        case ERC20BridgeSource.LiquidityProvider:
 | 
					        case ERC20BridgeSource.LiquidityProvider:
 | 
				
			||||||
            // "LiquidityProvider" is too long to encode (17 characters).
 | 
					            // "LiquidityProvider" is too long to encode (17 characters).
 | 
				
			||||||
            return encodeBridgeSourceId(BridgeProtocol.Unknown, 'LP');
 | 
					            return encodeBridgeSourceId(BridgeProtocol.Unknown, 'LP');
 | 
				
			||||||
 | 
					        case ERC20BridgeSource.MakerPsm:
 | 
				
			||||||
 | 
					            return encodeBridgeSourceId(BridgeProtocol.MakerPsm, 'MakerPsm');
 | 
				
			||||||
        case ERC20BridgeSource.Mooniswap:
 | 
					        case ERC20BridgeSource.Mooniswap:
 | 
				
			||||||
            return encodeBridgeSourceId(BridgeProtocol.Mooniswap, 'Mooniswap');
 | 
					            return encodeBridgeSourceId(BridgeProtocol.Mooniswap, 'Mooniswap');
 | 
				
			||||||
        case ERC20BridgeSource.MStable:
 | 
					        case ERC20BridgeSource.MStable:
 | 
				
			||||||
@@ -216,6 +219,10 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder
 | 
				
			|||||||
            const mStableFillData = (order as OptimizedMarketBridgeOrder<GenericRouterFillData>).fillData;
 | 
					            const mStableFillData = (order as OptimizedMarketBridgeOrder<GenericRouterFillData>).fillData;
 | 
				
			||||||
            bridgeData = encoder.encode([mStableFillData.router]);
 | 
					            bridgeData = encoder.encode([mStableFillData.router]);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					        case ERC20BridgeSource.MakerPsm:
 | 
				
			||||||
 | 
					            const psmFillData = (order as OptimizedMarketBridgeOrder<MakerPsmFillData>).fillData;
 | 
				
			||||||
 | 
					            bridgeData = encoder.encode([psmFillData.psmAddress, psmFillData.gemTokenAddress]);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            throw new Error(AggregationError.NoBridgeForSource);
 | 
					            throw new Error(AggregationError.NoBridgeForSource);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -255,6 +262,10 @@ const curveEncoder = AbiEncoder.create([
 | 
				
			|||||||
    { name: 'fromTokenIdx', type: 'int128' },
 | 
					    { name: 'fromTokenIdx', type: 'int128' },
 | 
				
			||||||
    { name: 'toTokenIdx', type: 'int128' },
 | 
					    { name: 'toTokenIdx', type: 'int128' },
 | 
				
			||||||
]);
 | 
					]);
 | 
				
			||||||
 | 
					const makerPsmEncoder = AbiEncoder.create([
 | 
				
			||||||
 | 
					    { name: 'psmAddress', type: 'address' },
 | 
				
			||||||
 | 
					    { name: 'gemTokenAddress', type: 'address' },
 | 
				
			||||||
 | 
					]);
 | 
				
			||||||
const routerAddressPathEncoder = AbiEncoder.create('(address,address[])');
 | 
					const routerAddressPathEncoder = AbiEncoder.create('(address,address[])');
 | 
				
			||||||
const tokenAddressEncoder = AbiEncoder.create([{ name: 'tokenAddress', type: 'address' }]);
 | 
					const tokenAddressEncoder = AbiEncoder.create([{ name: 'tokenAddress', type: 'address' }]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -302,6 +313,8 @@ export const BRIDGE_ENCODERS: {
 | 
				
			|||||||
    [ERC20BridgeSource.Balancer]: poolEncoder,
 | 
					    [ERC20BridgeSource.Balancer]: poolEncoder,
 | 
				
			||||||
    [ERC20BridgeSource.Cream]: poolEncoder,
 | 
					    [ERC20BridgeSource.Cream]: poolEncoder,
 | 
				
			||||||
    [ERC20BridgeSource.Uniswap]: poolEncoder,
 | 
					    [ERC20BridgeSource.Uniswap]: poolEncoder,
 | 
				
			||||||
 | 
					    // Custom integrations
 | 
				
			||||||
 | 
					    [ERC20BridgeSource.MakerPsm]: makerPsmEncoder,
 | 
				
			||||||
    // BSC
 | 
					    // BSC
 | 
				
			||||||
    [ERC20BridgeSource.PancakeSwap]: routerAddressPathEncoder,
 | 
					    [ERC20BridgeSource.PancakeSwap]: routerAddressPathEncoder,
 | 
				
			||||||
    [ERC20BridgeSource.BakerySwap]: routerAddressPathEncoder,
 | 
					    [ERC20BridgeSource.BakerySwap]: routerAddressPathEncoder,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,7 @@ import {
 | 
				
			|||||||
    KYBER_CONFIG_BY_CHAIN_ID,
 | 
					    KYBER_CONFIG_BY_CHAIN_ID,
 | 
				
			||||||
    LINKSWAP_ROUTER_BY_CHAIN_ID,
 | 
					    LINKSWAP_ROUTER_BY_CHAIN_ID,
 | 
				
			||||||
    LIQUIDITY_PROVIDER_REGISTRY,
 | 
					    LIQUIDITY_PROVIDER_REGISTRY,
 | 
				
			||||||
 | 
					    MAKER_PSM_INFO_BY_CHAIN_ID,
 | 
				
			||||||
    MAX_UINT256,
 | 
					    MAX_UINT256,
 | 
				
			||||||
    MOONISWAP_REGISTRIES_BY_CHAIN_ID,
 | 
					    MOONISWAP_REGISTRIES_BY_CHAIN_ID,
 | 
				
			||||||
    MSTABLE_ROUTER_BY_CHAIN_ID,
 | 
					    MSTABLE_ROUTER_BY_CHAIN_ID,
 | 
				
			||||||
@@ -57,8 +58,10 @@ import {
 | 
				
			|||||||
    KyberSamplerOpts,
 | 
					    KyberSamplerOpts,
 | 
				
			||||||
    LiquidityProviderFillData,
 | 
					    LiquidityProviderFillData,
 | 
				
			||||||
    LiquidityProviderRegistry,
 | 
					    LiquidityProviderRegistry,
 | 
				
			||||||
 | 
					    MakerPsmFillData,
 | 
				
			||||||
    MooniswapFillData,
 | 
					    MooniswapFillData,
 | 
				
			||||||
    MultiHopFillData,
 | 
					    MultiHopFillData,
 | 
				
			||||||
 | 
					    PsmInfo,
 | 
				
			||||||
    ShellFillData,
 | 
					    ShellFillData,
 | 
				
			||||||
    SourceQuoteOperation,
 | 
					    SourceQuoteOperation,
 | 
				
			||||||
    TokenAdjacencyGraph,
 | 
					    TokenAdjacencyGraph,
 | 
				
			||||||
@@ -857,6 +860,46 @@ export class SamplerOperations {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public getMakerPsmSellQuotes(
 | 
				
			||||||
 | 
					        psmInfo: PsmInfo,
 | 
				
			||||||
 | 
					        makerToken: string,
 | 
				
			||||||
 | 
					        takerToken: string,
 | 
				
			||||||
 | 
					        takerFillAmounts: BigNumber[],
 | 
				
			||||||
 | 
					    ): SourceQuoteOperation<MakerPsmFillData> {
 | 
				
			||||||
 | 
					        return new SamplerContractOperation({
 | 
				
			||||||
 | 
					            source: ERC20BridgeSource.MakerPsm,
 | 
				
			||||||
 | 
					            fillData: {
 | 
				
			||||||
 | 
					                isSellOperation: true,
 | 
				
			||||||
 | 
					                takerToken,
 | 
				
			||||||
 | 
					                makerToken,
 | 
				
			||||||
 | 
					                ...psmInfo,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            contract: this._samplerContract,
 | 
				
			||||||
 | 
					            function: this._samplerContract.sampleSellsFromMakerPsm,
 | 
				
			||||||
 | 
					            params: [psmInfo, takerToken, makerToken, takerFillAmounts],
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public getMakerPsmBuyQuotes(
 | 
				
			||||||
 | 
					        psmInfo: PsmInfo,
 | 
				
			||||||
 | 
					        makerToken: string,
 | 
				
			||||||
 | 
					        takerToken: string,
 | 
				
			||||||
 | 
					        makerFillAmounts: BigNumber[],
 | 
				
			||||||
 | 
					    ): SourceQuoteOperation<MakerPsmFillData> {
 | 
				
			||||||
 | 
					        return new SamplerContractOperation({
 | 
				
			||||||
 | 
					            source: ERC20BridgeSource.MakerPsm,
 | 
				
			||||||
 | 
					            fillData: {
 | 
				
			||||||
 | 
					                isSellOperation: false,
 | 
				
			||||||
 | 
					                takerToken,
 | 
				
			||||||
 | 
					                makerToken,
 | 
				
			||||||
 | 
					                ...psmInfo,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            contract: this._samplerContract,
 | 
				
			||||||
 | 
					            function: this._samplerContract.sampleBuysFromMakerPsm,
 | 
				
			||||||
 | 
					            params: [psmInfo, takerToken, makerToken, makerFillAmounts],
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public getMedianSellRate(
 | 
					    public getMedianSellRate(
 | 
				
			||||||
        sources: ERC20BridgeSource[],
 | 
					        sources: ERC20BridgeSource[],
 | 
				
			||||||
        makerToken: string,
 | 
					        makerToken: string,
 | 
				
			||||||
@@ -1118,6 +1161,12 @@ export class SamplerOperations {
 | 
				
			|||||||
                                    ERC20BridgeSource.Linkswap,
 | 
					                                    ERC20BridgeSource.Linkswap,
 | 
				
			||||||
                                ),
 | 
					                                ),
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
 | 
					                        case ERC20BridgeSource.MakerPsm:
 | 
				
			||||||
 | 
					                            const psmInfo = MAKER_PSM_INFO_BY_CHAIN_ID[this.chainId];
 | 
				
			||||||
 | 
					                            if (!isValidAddress(psmInfo.psmAddress)) {
 | 
				
			||||||
 | 
					                                return [];
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            return this.getMakerPsmSellQuotes(psmInfo, makerToken, takerToken, takerFillAmounts);
 | 
				
			||||||
                        default:
 | 
					                        default:
 | 
				
			||||||
                            throw new Error(`Unsupported sell sample source: ${source}`);
 | 
					                            throw new Error(`Unsupported sell sample source: ${source}`);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -1298,6 +1347,12 @@ export class SamplerOperations {
 | 
				
			|||||||
                                    ERC20BridgeSource.Linkswap,
 | 
					                                    ERC20BridgeSource.Linkswap,
 | 
				
			||||||
                                ),
 | 
					                                ),
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
 | 
					                        case ERC20BridgeSource.MakerPsm:
 | 
				
			||||||
 | 
					                            const psmInfo = MAKER_PSM_INFO_BY_CHAIN_ID[this.chainId];
 | 
				
			||||||
 | 
					                            if (!isValidAddress(psmInfo.psmAddress)) {
 | 
				
			||||||
 | 
					                                return [];
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            return this.getMakerPsmBuyQuotes(psmInfo, makerToken, takerToken, makerFillAmounts);
 | 
				
			||||||
                        default:
 | 
					                        default:
 | 
				
			||||||
                            throw new Error(`Unsupported buy sample source: ${source}`);
 | 
					                            throw new Error(`Unsupported buy sample source: ${source}`);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,7 @@ export enum ERC20BridgeSource {
 | 
				
			|||||||
    Balancer = 'Balancer',
 | 
					    Balancer = 'Balancer',
 | 
				
			||||||
    Cream = 'CREAM',
 | 
					    Cream = 'CREAM',
 | 
				
			||||||
    Bancor = 'Bancor',
 | 
					    Bancor = 'Bancor',
 | 
				
			||||||
 | 
					    MakerPsm = 'MakerPsm',
 | 
				
			||||||
    MStable = 'mStable',
 | 
					    MStable = 'mStable',
 | 
				
			||||||
    Mooniswap = 'Mooniswap',
 | 
					    Mooniswap = 'Mooniswap',
 | 
				
			||||||
    MultiHop = 'MultiHop',
 | 
					    MultiHop = 'MultiHop',
 | 
				
			||||||
@@ -96,6 +97,15 @@ export interface CurveInfo {
 | 
				
			|||||||
    metaToken: string | undefined;
 | 
					    metaToken: string | undefined;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Configuration for a specific PSM vault
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export interface PsmInfo {
 | 
				
			||||||
 | 
					    psmAddress: string;
 | 
				
			||||||
 | 
					    ilkIdentifier: string;
 | 
				
			||||||
 | 
					    gemTokenAddress: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Internal `fillData` field for `Fill` objects.
 | 
					// Internal `fillData` field for `Fill` objects.
 | 
				
			||||||
export interface FillData {}
 | 
					export interface FillData {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -165,6 +175,14 @@ export interface MultiHopFillData extends FillData {
 | 
				
			|||||||
    secondHopSource: SourceQuoteOperation;
 | 
					    secondHopSource: SourceQuoteOperation;
 | 
				
			||||||
    intermediateToken: string;
 | 
					    intermediateToken: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface MakerPsmExtendedData {
 | 
				
			||||||
 | 
					    isSellOperation: boolean;
 | 
				
			||||||
 | 
					    takerToken: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type MakerPsmFillData = FillData & MakerPsmExtendedData & PsmInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface HopInfo {
 | 
					export interface HopInfo {
 | 
				
			||||||
    sourceIndex: BigNumber;
 | 
					    sourceIndex: BigNumber;
 | 
				
			||||||
    returnData: string;
 | 
					    returnData: string;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,7 @@ import * as IUniswapExchangeQuotes from '../test/generated-artifacts/IUniswapExc
 | 
				
			|||||||
import * as IUniswapV2Router01 from '../test/generated-artifacts/IUniswapV2Router01.json';
 | 
					import * as IUniswapV2Router01 from '../test/generated-artifacts/IUniswapV2Router01.json';
 | 
				
			||||||
import * as KyberSampler from '../test/generated-artifacts/KyberSampler.json';
 | 
					import * as KyberSampler from '../test/generated-artifacts/KyberSampler.json';
 | 
				
			||||||
import * as LiquidityProviderSampler from '../test/generated-artifacts/LiquidityProviderSampler.json';
 | 
					import * as LiquidityProviderSampler from '../test/generated-artifacts/LiquidityProviderSampler.json';
 | 
				
			||||||
 | 
					import * as MakerPSMSampler from '../test/generated-artifacts/MakerPSMSampler.json';
 | 
				
			||||||
import * as MooniswapSampler from '../test/generated-artifacts/MooniswapSampler.json';
 | 
					import * as MooniswapSampler from '../test/generated-artifacts/MooniswapSampler.json';
 | 
				
			||||||
import * as MStableSampler from '../test/generated-artifacts/MStableSampler.json';
 | 
					import * as MStableSampler from '../test/generated-artifacts/MStableSampler.json';
 | 
				
			||||||
import * as MultiBridgeSampler from '../test/generated-artifacts/MultiBridgeSampler.json';
 | 
					import * as MultiBridgeSampler from '../test/generated-artifacts/MultiBridgeSampler.json';
 | 
				
			||||||
@@ -55,6 +56,7 @@ export const artifacts = {
 | 
				
			|||||||
    KyberSampler: KyberSampler as ContractArtifact,
 | 
					    KyberSampler: KyberSampler as ContractArtifact,
 | 
				
			||||||
    LiquidityProviderSampler: LiquidityProviderSampler as ContractArtifact,
 | 
					    LiquidityProviderSampler: LiquidityProviderSampler as ContractArtifact,
 | 
				
			||||||
    MStableSampler: MStableSampler as ContractArtifact,
 | 
					    MStableSampler: MStableSampler as ContractArtifact,
 | 
				
			||||||
 | 
					    MakerPSMSampler: MakerPSMSampler as ContractArtifact,
 | 
				
			||||||
    MooniswapSampler: MooniswapSampler as ContractArtifact,
 | 
					    MooniswapSampler: MooniswapSampler as ContractArtifact,
 | 
				
			||||||
    MultiBridgeSampler: MultiBridgeSampler as ContractArtifact,
 | 
					    MultiBridgeSampler: MultiBridgeSampler as ContractArtifact,
 | 
				
			||||||
    NativeOrderSampler: NativeOrderSampler as ContractArtifact,
 | 
					    NativeOrderSampler: NativeOrderSampler as ContractArtifact,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,6 +67,7 @@ const DEFAULT_EXCLUDED = [
 | 
				
			|||||||
    ERC20BridgeSource.Linkswap,
 | 
					    ERC20BridgeSource.Linkswap,
 | 
				
			||||||
    ERC20BridgeSource.PancakeSwap,
 | 
					    ERC20BridgeSource.PancakeSwap,
 | 
				
			||||||
    ERC20BridgeSource.BakerySwap,
 | 
					    ERC20BridgeSource.BakerySwap,
 | 
				
			||||||
 | 
					    ERC20BridgeSource.MakerPsm,
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
const BUY_SOURCES = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].sources;
 | 
					const BUY_SOURCES = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].sources;
 | 
				
			||||||
const SELL_SOURCES = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].sources;
 | 
					const SELL_SOURCES = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].sources;
 | 
				
			||||||
@@ -305,6 +306,7 @@ describe('MarketOperationUtils tests', () => {
 | 
				
			|||||||
        [ERC20BridgeSource.Linkswap]: _.times(NUM_SAMPLES, () => 0),
 | 
					        [ERC20BridgeSource.Linkswap]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
        [ERC20BridgeSource.PancakeSwap]: _.times(NUM_SAMPLES, () => 0),
 | 
					        [ERC20BridgeSource.PancakeSwap]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
        [ERC20BridgeSource.BakerySwap]: _.times(NUM_SAMPLES, () => 0),
 | 
					        [ERC20BridgeSource.BakerySwap]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
 | 
					        [ERC20BridgeSource.MakerPsm]: _.times(NUM_SAMPLES, () => 0),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const DEFAULT_RATES: RatesBySource = {
 | 
					    const DEFAULT_RATES: RatesBySource = {
 | 
				
			||||||
@@ -369,6 +371,7 @@ describe('MarketOperationUtils tests', () => {
 | 
				
			|||||||
        [ERC20BridgeSource.Linkswap]: { tokenAddressPath: [] },
 | 
					        [ERC20BridgeSource.Linkswap]: { tokenAddressPath: [] },
 | 
				
			||||||
        [ERC20BridgeSource.Uniswap]: { router: randomAddress() },
 | 
					        [ERC20BridgeSource.Uniswap]: { router: randomAddress() },
 | 
				
			||||||
        [ERC20BridgeSource.Eth2Dai]: { router: randomAddress() },
 | 
					        [ERC20BridgeSource.Eth2Dai]: { router: randomAddress() },
 | 
				
			||||||
 | 
					        [ERC20BridgeSource.MakerPsm]: {},
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const DEFAULT_OPS = {
 | 
					    const DEFAULT_OPS = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ export * from '../test/generated-wrappers/i_uniswap_v2_router01';
 | 
				
			|||||||
export * from '../test/generated-wrappers/kyber_sampler';
 | 
					export * from '../test/generated-wrappers/kyber_sampler';
 | 
				
			||||||
export * from '../test/generated-wrappers/liquidity_provider_sampler';
 | 
					export * from '../test/generated-wrappers/liquidity_provider_sampler';
 | 
				
			||||||
export * from '../test/generated-wrappers/m_stable_sampler';
 | 
					export * from '../test/generated-wrappers/m_stable_sampler';
 | 
				
			||||||
 | 
					export * from '../test/generated-wrappers/maker_p_s_m_sampler';
 | 
				
			||||||
export * from '../test/generated-wrappers/mooniswap_sampler';
 | 
					export * from '../test/generated-wrappers/mooniswap_sampler';
 | 
				
			||||||
export * from '../test/generated-wrappers/multi_bridge_sampler';
 | 
					export * from '../test/generated-wrappers/multi_bridge_sampler';
 | 
				
			||||||
export * from '../test/generated-wrappers/native_order_sampler';
 | 
					export * from '../test/generated-wrappers/native_order_sampler';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,6 +31,7 @@
 | 
				
			|||||||
        "test/generated-artifacts/KyberSampler.json",
 | 
					        "test/generated-artifacts/KyberSampler.json",
 | 
				
			||||||
        "test/generated-artifacts/LiquidityProviderSampler.json",
 | 
					        "test/generated-artifacts/LiquidityProviderSampler.json",
 | 
				
			||||||
        "test/generated-artifacts/MStableSampler.json",
 | 
					        "test/generated-artifacts/MStableSampler.json",
 | 
				
			||||||
 | 
					        "test/generated-artifacts/MakerPSMSampler.json",
 | 
				
			||||||
        "test/generated-artifacts/MooniswapSampler.json",
 | 
					        "test/generated-artifacts/MooniswapSampler.json",
 | 
				
			||||||
        "test/generated-artifacts/MultiBridgeSampler.json",
 | 
					        "test/generated-artifacts/MultiBridgeSampler.json",
 | 
				
			||||||
        "test/generated-artifacts/NativeOrderSampler.json",
 | 
					        "test/generated-artifacts/NativeOrderSampler.json",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
[
 | 
					[
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        "version": "6.0.0-bsc.0",
 | 
					        "version": "6.0.0",
 | 
				
			||||||
        "changes": [
 | 
					        "changes": [
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                "note": "Add BSC chain addresses",
 | 
					                "note": "Add BSC chain addresses",
 | 
				
			||||||
@@ -13,6 +13,10 @@
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                "note": "Redeployed FQT on BSC",
 | 
					                "note": "Redeployed FQT on BSC",
 | 
				
			||||||
                "pr": 181
 | 
					                "pr": 181
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "note": "Redeployed FQT on mainnet and ropsten",
 | 
				
			||||||
 | 
					                "pr": 150
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@
 | 
				
			|||||||
            "wethTransformer": "0xb2bc06a4efb20fc6553a69dbfa49b7be938034a7",
 | 
					            "wethTransformer": "0xb2bc06a4efb20fc6553a69dbfa49b7be938034a7",
 | 
				
			||||||
            "payTakerTransformer": "0x4638a7ebe75b911b995d0ec73a81e4f85f41f24e",
 | 
					            "payTakerTransformer": "0x4638a7ebe75b911b995d0ec73a81e4f85f41f24e",
 | 
				
			||||||
            "affiliateFeeTransformer": "0xda6d9fc5998f550a094585cf9171f0e8ee3ac59f",
 | 
					            "affiliateFeeTransformer": "0xda6d9fc5998f550a094585cf9171f0e8ee3ac59f",
 | 
				
			||||||
            "fillQuoteTransformer": "0x227e767a9b7517681d1cb6b846aa9e541484c7ab",
 | 
					            "fillQuoteTransformer": "0xb8e40acea68db2a7a2020a3eba2664ba4c3b3e3d",
 | 
				
			||||||
            "positiveSlippageFeeTransformer": "0xa9416ce1dbde8d331210c07b5c253d94ee4cc3fd"
 | 
					            "positiveSlippageFeeTransformer": "0xa9416ce1dbde8d331210c07b5c253d94ee4cc3fd"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -77,7 +77,7 @@
 | 
				
			|||||||
            "wethTransformer": "0x05ad19aa3826e0609a19568ffbd1dfe86c6c7184",
 | 
					            "wethTransformer": "0x05ad19aa3826e0609a19568ffbd1dfe86c6c7184",
 | 
				
			||||||
            "payTakerTransformer": "0x6d0ebf2bcd9cc93ec553b60ad201943dcca4e291",
 | 
					            "payTakerTransformer": "0x6d0ebf2bcd9cc93ec553b60ad201943dcca4e291",
 | 
				
			||||||
            "affiliateFeeTransformer": "0x6588256778ca4432fa43983ac685c45efb2379e2",
 | 
					            "affiliateFeeTransformer": "0x6588256778ca4432fa43983ac685c45efb2379e2",
 | 
				
			||||||
            "fillQuoteTransformer": "0x2088a820787ebbe937a0612ef024f1e1d65f9784",
 | 
					            "fillQuoteTransformer": "0xc0c6fc6911978a65fe3b17391bb30b630bfc637d",
 | 
				
			||||||
            "positiveSlippageFeeTransformer": "0x8b332f700fd37e71c5c5b26c4d78b5ca63dd33b2"
 | 
					            "positiveSlippageFeeTransformer": "0x8b332f700fd37e71c5c5b26c4d78b5ca63dd33b2"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,6 +125,7 @@ export enum BridgeProtocol {
 | 
				
			|||||||
    Bancor,
 | 
					    Bancor,
 | 
				
			||||||
    CoFiX,
 | 
					    CoFiX,
 | 
				
			||||||
    Nerve,
 | 
					    Nerve,
 | 
				
			||||||
 | 
					    MakerPsm,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
// tslint:enable: enum-naming
 | 
					// tslint:enable: enum-naming
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										44
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								yarn.lock
									
									
									
									
									
								
							@@ -646,7 +646,6 @@
 | 
				
			|||||||
"@0x/abi-gen@^5.4.21":
 | 
					"@0x/abi-gen@^5.4.21":
 | 
				
			||||||
  version "5.4.21"
 | 
					  version "5.4.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/abi-gen/-/abi-gen-5.4.21.tgz#96705962c75e116bd5050784287012ede4607564"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/abi-gen/-/abi-gen-5.4.21.tgz#96705962c75e116bd5050784287012ede4607564"
 | 
				
			||||||
  integrity sha512-rJPzWUjCeygMC71HfyGQAEeYtfkv5Mi+cjIOrmWfTQmM4SN+6wBraEWKLJHkcFTZ3lmFjkS/ZfbGhQere6/Y4w==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/types" "^3.3.1"
 | 
					    "@0x/types" "^3.3.1"
 | 
				
			||||||
    "@0x/typescript-typings" "^5.1.6"
 | 
					    "@0x/typescript-typings" "^5.1.6"
 | 
				
			||||||
@@ -712,7 +711,6 @@
 | 
				
			|||||||
"@0x/contracts-gen@^2.0.32":
 | 
					"@0x/contracts-gen@^2.0.32":
 | 
				
			||||||
  version "2.0.32"
 | 
					  version "2.0.32"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/contracts-gen/-/contracts-gen-2.0.32.tgz#e4817730685acc0047157e55d58a6cab87596799"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/contracts-gen/-/contracts-gen-2.0.32.tgz#e4817730685acc0047157e55d58a6cab87596799"
 | 
				
			||||||
  integrity sha512-FkdCn9L48u6M2WyyQOWuDFvmqvYIfv1O47Hlwf8MGVJaxGmhDhqJsCr4HlmE4Jg84dK7I7xIeh0MMs8jPNpRUA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/sol-compiler" "^4.6.1"
 | 
					    "@0x/sol-compiler" "^4.6.1"
 | 
				
			||||||
    "@0x/sol-resolver" "^3.1.6"
 | 
					    "@0x/sol-resolver" "^3.1.6"
 | 
				
			||||||
@@ -805,7 +803,6 @@
 | 
				
			|||||||
"@0x/monorepo-scripts@^3.1.1":
 | 
					"@0x/monorepo-scripts@^3.1.1":
 | 
				
			||||||
  version "3.1.1"
 | 
					  version "3.1.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/monorepo-scripts/-/monorepo-scripts-3.1.1.tgz#2ded9ef1d4885bbf106612794a331e29f391733a"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/monorepo-scripts/-/monorepo-scripts-3.1.1.tgz#2ded9ef1d4885bbf106612794a331e29f391733a"
 | 
				
			||||||
  integrity sha512-thovxmZMivSeESlY+FXLxkf4wrmLe40ZjfGOcJaPhe29me03ddgEtVgToi+k7ZGfTeRWm5gmvlisHak2D6TFwA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/types" "^3.3.1"
 | 
					    "@0x/types" "^3.3.1"
 | 
				
			||||||
    "@0x/utils" "^6.2.0"
 | 
					    "@0x/utils" "^6.2.0"
 | 
				
			||||||
@@ -847,7 +844,6 @@
 | 
				
			|||||||
"@0x/sol-compiler@^4.6.1":
 | 
					"@0x/sol-compiler@^4.6.1":
 | 
				
			||||||
  version "4.6.1"
 | 
					  version "4.6.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/sol-compiler/-/sol-compiler-4.6.1.tgz#d1f9c1547605ddbd4ad9cc6ebed60b91f5e1ce3d"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/sol-compiler/-/sol-compiler-4.6.1.tgz#d1f9c1547605ddbd4ad9cc6ebed60b91f5e1ce3d"
 | 
				
			||||||
  integrity sha512-iEFcrn+5OSNCD2yr0WjF9h0+0J/0DNNpEuc1yK5OAD6F4X6U/YChYohSx/odWNhYfJODW+dj1SABWxZfybgIwQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/assert" "^3.0.21"
 | 
					    "@0x/assert" "^3.0.21"
 | 
				
			||||||
    "@0x/json-schemas" "^5.4.1"
 | 
					    "@0x/json-schemas" "^5.4.1"
 | 
				
			||||||
@@ -876,7 +872,6 @@
 | 
				
			|||||||
"@0x/sol-coverage@^4.0.31":
 | 
					"@0x/sol-coverage@^4.0.31":
 | 
				
			||||||
  version "4.0.31"
 | 
					  version "4.0.31"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/sol-coverage/-/sol-coverage-4.0.31.tgz#ec958d892dce3773059b925e442e21d7c4f9b104"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/sol-coverage/-/sol-coverage-4.0.31.tgz#ec958d892dce3773059b925e442e21d7c4f9b104"
 | 
				
			||||||
  integrity sha512-XcD2MntdpjDAV2KWmZyD6T3dI2sgaXwBXVa/cRtlC0cUAJcXp+tblwvtt1VOxc2J6QFCaTG4UTs9oS2nGbxwbA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/sol-tracing-utils" "^7.1.21"
 | 
					    "@0x/sol-tracing-utils" "^7.1.21"
 | 
				
			||||||
    "@0x/subproviders" "^6.4.1"
 | 
					    "@0x/subproviders" "^6.4.1"
 | 
				
			||||||
@@ -891,7 +886,6 @@
 | 
				
			|||||||
"@0x/sol-profiler@^4.1.21":
 | 
					"@0x/sol-profiler@^4.1.21":
 | 
				
			||||||
  version "4.1.21"
 | 
					  version "4.1.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/sol-profiler/-/sol-profiler-4.1.21.tgz#76f4860b3e0c73b8e11ac56ce25e52164cee1476"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/sol-profiler/-/sol-profiler-4.1.21.tgz#76f4860b3e0c73b8e11ac56ce25e52164cee1476"
 | 
				
			||||||
  integrity sha512-JFDUhFrWJP1WqVIKK1w/2nU/s8g91xNeZW1l4ZydEGhZPsRNgQdk8rFBwGqxPeqMqUY7T+Xm2Y/IVjYvE+Ck3w==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/sol-tracing-utils" "^7.1.21"
 | 
					    "@0x/sol-tracing-utils" "^7.1.21"
 | 
				
			||||||
    "@0x/subproviders" "^6.4.1"
 | 
					    "@0x/subproviders" "^6.4.1"
 | 
				
			||||||
@@ -915,7 +909,6 @@
 | 
				
			|||||||
"@0x/sol-trace@^3.0.31":
 | 
					"@0x/sol-trace@^3.0.31":
 | 
				
			||||||
  version "3.0.31"
 | 
					  version "3.0.31"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/sol-trace/-/sol-trace-3.0.31.tgz#9ed79139c81ad8953a9947019053ead5a20f9408"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/sol-trace/-/sol-trace-3.0.31.tgz#9ed79139c81ad8953a9947019053ead5a20f9408"
 | 
				
			||||||
  integrity sha512-wQjdVc/IOcyzIfDVfurzFQuhkZlnejwNVNWn+9S6uYXteIqgHcJv0WqD5dZNFxcNG4Jn7tXxHJ/AXxXDygM+cw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/sol-tracing-utils" "^7.1.21"
 | 
					    "@0x/sol-tracing-utils" "^7.1.21"
 | 
				
			||||||
    "@0x/subproviders" "^6.4.1"
 | 
					    "@0x/subproviders" "^6.4.1"
 | 
				
			||||||
@@ -931,7 +924,6 @@
 | 
				
			|||||||
"@0x/sol-tracing-utils@^7.1.21":
 | 
					"@0x/sol-tracing-utils@^7.1.21":
 | 
				
			||||||
  version "7.1.21"
 | 
					  version "7.1.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@0x/sol-tracing-utils/-/sol-tracing-utils-7.1.21.tgz#9ffb9f51fdc6bcf0be8f95841563a6ccccbac474"
 | 
					  resolved "https://registry.yarnpkg.com/@0x/sol-tracing-utils/-/sol-tracing-utils-7.1.21.tgz#9ffb9f51fdc6bcf0be8f95841563a6ccccbac474"
 | 
				
			||||||
  integrity sha512-Y0aYJD1h+0IBZe7A9FKorhf7qtWawftahV61FjPCOaHfvQNfVeza7wm9hdMYOb+B2hbFCDFo06GfZaINw7VFVA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@0x/dev-utils" "^4.2.1"
 | 
					    "@0x/dev-utils" "^4.2.1"
 | 
				
			||||||
    "@0x/sol-compiler" "^4.6.1"
 | 
					    "@0x/sol-compiler" "^4.6.1"
 | 
				
			||||||
@@ -1311,18 +1303,38 @@
 | 
				
			|||||||
    "@ethersproject/logger" "^5.0.5"
 | 
					    "@ethersproject/logger" "^5.0.5"
 | 
				
			||||||
    bn.js "^4.4.0"
 | 
					    bn.js "^4.4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@ethersproject/bignumber@^5.0.13":
 | 
				
			||||||
 | 
					  version "5.0.15"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.15.tgz#b089b3f1e0381338d764ac1c10512f0c93b184ed"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@ethersproject/bytes" "^5.0.9"
 | 
				
			||||||
 | 
					    "@ethersproject/logger" "^5.0.8"
 | 
				
			||||||
 | 
					    bn.js "^4.4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4":
 | 
					"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4":
 | 
				
			||||||
  version "5.0.5"
 | 
					  version "5.0.5"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.5.tgz#688b70000e550de0c97a151a21f15b87d7f97d7c"
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.5.tgz#688b70000e550de0c97a151a21f15b87d7f97d7c"
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@ethersproject/logger" "^5.0.5"
 | 
					    "@ethersproject/logger" "^5.0.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@ethersproject/bytes@^5.0.9":
 | 
				
			||||||
 | 
					  version "5.0.11"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.11.tgz#21118e75b1d00db068984c15530e316021101276"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@ethersproject/logger" "^5.0.8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4":
 | 
					"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4":
 | 
				
			||||||
  version "5.0.5"
 | 
					  version "5.0.5"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.5.tgz#0ed19b002e8404bdf6d135234dc86a7d9bcf9b71"
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.5.tgz#0ed19b002e8404bdf6d135234dc86a7d9bcf9b71"
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@ethersproject/bignumber" "^5.0.7"
 | 
					    "@ethersproject/bignumber" "^5.0.7"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@ethersproject/constants@^5.0.8":
 | 
				
			||||||
 | 
					  version "5.0.10"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.10.tgz#eb0c604fbc44c53ba9641eed31a1d0c9e1ebcadc"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@ethersproject/bignumber" "^5.0.13"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@ethersproject/contracts@^5.0.1":
 | 
					"@ethersproject/contracts@^5.0.1":
 | 
				
			||||||
  version "5.0.5"
 | 
					  version "5.0.5"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.5.tgz#64831a341ec8ca225e83ff3e9437c26b970fd5d7"
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.5.tgz#64831a341ec8ca225e83ff3e9437c26b970fd5d7"
 | 
				
			||||||
@@ -1361,6 +1373,10 @@
 | 
				
			|||||||
  version "5.0.6"
 | 
					  version "5.0.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.6.tgz#faa484203e86e08be9e07fef826afeef7183fe88"
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.6.tgz#faa484203e86e08be9e07fef826afeef7183fe88"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@ethersproject/logger@^5.0.8":
 | 
				
			||||||
 | 
					  version "5.0.10"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.10.tgz#fd884688b3143253e0356ef92d5f22d109d2e026"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@ethersproject/networks@^5.0.3":
 | 
					"@ethersproject/networks@^5.0.3":
 | 
				
			||||||
  version "5.0.4"
 | 
					  version "5.0.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.4.tgz#6d320a5e15a0cda804f5da88be0ba846156f6eec"
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.4.tgz#6d320a5e15a0cda804f5da88be0ba846156f6eec"
 | 
				
			||||||
@@ -1436,6 +1452,14 @@
 | 
				
			|||||||
    "@ethersproject/constants" "^5.0.4"
 | 
					    "@ethersproject/constants" "^5.0.4"
 | 
				
			||||||
    "@ethersproject/logger" "^5.0.5"
 | 
					    "@ethersproject/logger" "^5.0.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@ethersproject/strings@^5.0.10":
 | 
				
			||||||
 | 
					  version "5.0.10"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.10.tgz#ddce1e9724f4ac4f3f67e0cac0b48748e964bfdb"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@ethersproject/bytes" "^5.0.9"
 | 
				
			||||||
 | 
					    "@ethersproject/constants" "^5.0.8"
 | 
				
			||||||
 | 
					    "@ethersproject/logger" "^5.0.8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.5":
 | 
					"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.5":
 | 
				
			||||||
  version "5.0.6"
 | 
					  version "5.0.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.6.tgz#b8b27938be6e9ed671dbdd35fe98af8b14d0df7c"
 | 
					  resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.6.tgz#b8b27938be6e9ed671dbdd35fe98af8b14d0df7c"
 | 
				
			||||||
@@ -2995,7 +3019,6 @@ aws4@^1.8.0:
 | 
				
			|||||||
axios-mock-adapter@^1.19.0:
 | 
					axios-mock-adapter@^1.19.0:
 | 
				
			||||||
  version "1.19.0"
 | 
					  version "1.19.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.19.0.tgz#9d72e321a6c5418e1eff067aa99761a86c5188a4"
 | 
					  resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.19.0.tgz#9d72e321a6c5418e1eff067aa99761a86c5188a4"
 | 
				
			||||||
  integrity sha512-D+0U4LNPr7WroiBDvWilzTMYPYTuZlbo6BI8YHZtj7wYQS8NkARlP9KBt8IWWHTQJ0q/8oZ0ClPBtKCCkx8cQg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    fast-deep-equal "^3.1.3"
 | 
					    fast-deep-equal "^3.1.3"
 | 
				
			||||||
    is-buffer "^2.0.3"
 | 
					    is-buffer "^2.0.3"
 | 
				
			||||||
@@ -3003,7 +3026,6 @@ axios-mock-adapter@^1.19.0:
 | 
				
			|||||||
axios@^0.21.1:
 | 
					axios@^0.21.1:
 | 
				
			||||||
  version "0.21.1"
 | 
					  version "0.21.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
 | 
					  resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
 | 
				
			||||||
  integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    follow-redirects "^1.10.0"
 | 
					    follow-redirects "^1.10.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -6359,7 +6381,6 @@ flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
 | 
				
			|||||||
follow-redirects@^1.10.0:
 | 
					follow-redirects@^1.10.0:
 | 
				
			||||||
  version "1.13.3"
 | 
					  version "1.13.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267"
 | 
					  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267"
 | 
				
			||||||
  integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
for-each@~0.3.3:
 | 
					for-each@~0.3.3:
 | 
				
			||||||
  version "0.3.3"
 | 
					  version "0.3.3"
 | 
				
			||||||
@@ -11692,7 +11713,6 @@ strip-bom@^3.0.0:
 | 
				
			|||||||
strip-comments@^2.0.1:
 | 
					strip-comments@^2.0.1:
 | 
				
			||||||
  version "2.0.1"
 | 
					  version "2.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b"
 | 
					  resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b"
 | 
				
			||||||
  integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
strip-dirs@^2.0.0:
 | 
					strip-dirs@^2.0.0:
 | 
				
			||||||
  version "2.1.0"
 | 
					  version "2.1.0"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user