From c4ead689a9f792f2b1a000d942605eab0a57e9e2 Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Fri, 16 Oct 2020 10:01:12 +1000 Subject: [PATCH] fix: [asset-swapper] excludedFeeSources. DODO Trade Allowed (#2731) * fix: Fee sources and Ganache existence * Added excludedFeeSources * Comments and CHANGELOG * fix: DODO Trade Allowed (#2732) --- packages/asset-swapper/CHANGELOG.json | 8 ++++++++ .../asset-swapper/contracts/src/DODOSampler.sol | 11 +++++++++++ .../src/utils/market_operation_utils/constants.ts | 1 + .../src/utils/market_operation_utils/index.ts | 13 ++++++++----- .../src/utils/market_operation_utils/types.ts | 5 +++++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/packages/asset-swapper/CHANGELOG.json b/packages/asset-swapper/CHANGELOG.json index e9fd8e7331..1d6f3c6acd 100644 --- a/packages/asset-swapper/CHANGELOG.json +++ b/packages/asset-swapper/CHANGELOG.json @@ -157,6 +157,14 @@ { "note": "Fix for some edge cases with `includedSources` and `MultiHop`", "pr": 2730 + }, + { + "note": "Introduced `excludedFeeSources` to disable sources when determining the price of an asset in ETH", + "pr": 2731 + }, + { + "note": "Support DODO Trade Allowed parameter to automatically disable the pool", + "pr": 2732 } ] }, diff --git a/packages/asset-swapper/contracts/src/DODOSampler.sol b/packages/asset-swapper/contracts/src/DODOSampler.sol index 2d95b6df9c..db018c4f0b 100644 --- a/packages/asset-swapper/contracts/src/DODOSampler.sol +++ b/packages/asset-swapper/contracts/src/DODOSampler.sol @@ -34,6 +34,7 @@ interface IDODOHelper { interface IDODO { function querySellBaseToken(uint256 amount) external view returns (uint256); + function _TRADE_ALLOWED_() external view returns (bool); } contract DODOSampler is @@ -80,6 +81,11 @@ contract DODOSampler is sellBase = false; } + // DODO Pool has been disabled + if (!IDODO(pool)._TRADE_ALLOWED_()) { + return (sellBase, pool, makerTokenAmounts); + } + for (uint256 i = 0; i < numSamples; i++) { uint256 buyAmount = _sampleSellForApproximateBuyFromDODO( abi.encode(takerToken, pool, baseToken), // taker token data @@ -132,6 +138,11 @@ contract DODOSampler is sellBase = false; } + // DODO Pool has been disabled + if (!IDODO(pool)._TRADE_ALLOWED_()) { + return (sellBase, pool, takerTokenAmounts); + } + takerTokenAmounts = _sampleApproximateBuys( ApproximateBuyQuoteOpts({ makerTokenData: abi.encode(makerToken, pool, baseToken), diff --git a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts index 790f083c03..8c2f570e25 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -55,6 +55,7 @@ export const DEFAULT_GET_MARKET_ORDERS_OPTS: GetMarketOrdersOpts = { // tslint:disable-next-line: custom-no-magic-numbers runLimit: 2 ** 15, excludedSources: [], + excludedFeeSources: [], includedSources: [], bridgeSlippage: 0.005, maxFallbackSlippage: 0.05, diff --git a/packages/asset-swapper/src/utils/market_operation_utils/index.ts b/packages/asset-swapper/src/utils/market_operation_utils/index.ts index 60c40d70fc..f0003ae259 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/index.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/index.ts @@ -137,12 +137,12 @@ export class MarketOperationUtils { const _opts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts }; const [makerToken, takerToken] = getNativeOrderTokens(nativeOrders[0]); const sampleAmounts = getSampleAmounts(takerAmount, _opts.numSamples, _opts.sampleDistributionBase); + const requestFilters = new SourceFilters().exclude(_opts.excludedSources).include(_opts.includedSources); - // We don't exclude from the fee sources as we always want to be able to get a price - // of taker to Eth or maker to Eth, especially for MultiHop - const feeSourceFilters = this._feeSources; const quoteSourceFilters = this._sellSources.merge(requestFilters); + const feeSourceFilters = this._feeSources.exclude(_opts.excludedFeeSources); + const { onChain: sampleBalancerOnChain, offChain: sampleBalancerOffChain, @@ -255,10 +255,12 @@ export class MarketOperationUtils { const _opts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts }; const [makerToken, takerToken] = getNativeOrderTokens(nativeOrders[0]); const sampleAmounts = getSampleAmounts(makerAmount, _opts.numSamples, _opts.sampleDistributionBase); + const requestFilters = new SourceFilters().exclude(_opts.excludedSources).include(_opts.includedSources); - const feeSourceFilters = this._feeSources.merge(requestFilters); const quoteSourceFilters = this._buySources.merge(requestFilters); + const feeSourceFilters = this._feeSources.exclude(_opts.excludedFeeSources); + const { onChain: sampleBalancerOnChain, offChain: sampleBalancerOffChain, @@ -444,9 +446,10 @@ export class MarketOperationUtils { const _opts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts }; const requestFilters = new SourceFilters().exclude(_opts.excludedSources).include(_opts.includedSources); - const feeSourceFilters = this._feeSources.merge(requestFilters); const quoteSourceFilters = this._buySources.merge(requestFilters); + const feeSourceFilters = this._feeSources.exclude(_opts.excludedFeeSources); + const ops = [ ...batchNativeOrders.map(orders => this._sampler.getOrderFillableMakerAmounts(orders, this.contractAddresses.exchange), diff --git a/packages/asset-swapper/src/utils/market_operation_utils/types.ts b/packages/asset-swapper/src/utils/market_operation_utils/types.ts index 2df0ecda1b..7d526defbc 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/types.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/types.ts @@ -241,6 +241,11 @@ export interface GetMarketOrdersOpts { * Liquidity sources to exclude. Default is none. */ excludedSources: ERC20BridgeSource[]; + /** + * Liquidity sources to exclude when used to calculate the cost of the route. + * Default is none. + */ + excludedFeeSources: ERC20BridgeSource[]; /** * Liquidity sources to include. Default is none, which allows all supported * sources that aren't excluded by `excludedSources`.