From 4672c72fefda414e294b7c384897906cfc69a38c Mon Sep 17 00:00:00 2001 From: Lawrence Forman Date: Thu, 24 Sep 2020 10:54:14 -0400 Subject: [PATCH] `@0x/asset-swapper`: compute max quote slippage from the first non-native order in `getSwapMinBuyAmount()` --- .../src/quote_consumers/utils.ts | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/asset-swapper/src/quote_consumers/utils.ts b/packages/asset-swapper/src/quote_consumers/utils.ts index 9f5d40b871..67b2677acf 100644 --- a/packages/asset-swapper/src/quote_consumers/utils.ts +++ b/packages/asset-swapper/src/quote_consumers/utils.ts @@ -1,12 +1,9 @@ import { BigNumber } from '@0x/utils'; import * as _ from 'lodash'; -import { constants } from '../constants'; import { MarketOperation, SwapQuote } from '../types'; import { ERC20BridgeSource } from '../utils/market_operation_utils/types'; -const { ZERO_AMOUNT } = constants; - /** * Compute the mminimum buy token amount for market operations by inferring * the slippage from the orders in a quote. We cannot rely on @@ -17,23 +14,20 @@ export function getSwapMinBuyAmount(quote: SwapQuote): BigNumber { if (quote.type === MarketOperation.Buy || quote.isTwoHop) { return quote.worstCaseQuoteInfo.makerAssetAmount; } - // Infer the allowed maker asset slippage from the orders. - const totalOrderMakerAssetAmount = BigNumber.sum(...quote.orders.map(o => o.fillableMakerAssetAmount)); - // tslint:disable: prefer-conditional-expression - let totalFillMakerAssetAmount = ZERO_AMOUNT; + let slipRatio = new BigNumber(1); + // Infer the allowed maker asset slippage from any non-native order. for (const o of quote.orders) { if (o.fills.length === 0 || o.fills[0].source === ERC20BridgeSource.Native) { - // No slippage on natuve orders. - totalFillMakerAssetAmount = totalFillMakerAssetAmount.plus(o.fillableMakerAssetAmount); - } else { - totalFillMakerAssetAmount = totalFillMakerAssetAmount.plus(BigNumber.sum(...o.fills.map(f => f.output))); + // No slippage on native orders. + continue; } + const totalFillMakerAssetAmount = BigNumber.sum(...o.fills.map(f => f.output)); + slipRatio = o.fillableMakerAssetAmount.div(totalFillMakerAssetAmount); + break; } - // tslint:enable: prefer-conditional-expression - if (totalOrderMakerAssetAmount.eq(totalFillMakerAssetAmount)) { + if (slipRatio.gte(1)) { // No slippage allowed across all orders. return quote.bestCaseQuoteInfo.makerAssetAmount; } - const slipRatio = totalOrderMakerAssetAmount.div(totalFillMakerAssetAmount); return quote.bestCaseQuoteInfo.makerAssetAmount.times(slipRatio).integerValue(BigNumber.ROUND_DOWN); }