diff --git a/packages/asset-buyer/src/index.ts b/packages/asset-buyer/src/index.ts index 37206e672b..42f1f58ae5 100644 --- a/packages/asset-buyer/src/index.ts +++ b/packages/asset-buyer/src/index.ts @@ -32,6 +32,8 @@ export { SwapQuoteExecutionOpts, SwapQuoteInfo, SwapQuoteRequestOpts, + MarketBuySwapQuote, + MarketSellSwapQuote, LiquidityForAssetData, LiquidityRequestOpts, OrdersAndFillableAmounts, diff --git a/packages/asset-buyer/src/quote_consumers/exchange_swap_quote_consumer.ts b/packages/asset-buyer/src/quote_consumers/exchange_swap_quote_consumer.ts index bf705a4fe7..b0b678cf2d 100644 --- a/packages/asset-buyer/src/quote_consumers/exchange_swap_quote_consumer.ts +++ b/packages/asset-buyer/src/quote_consumers/exchange_swap_quote_consumer.ts @@ -8,6 +8,9 @@ import { constants } from '../constants'; import { CalldataInfo, ExchangeMarketBuySmartContractParams, + ExchangeMarketSellSmartContractParams, + MarketBuySwapQuote, + MarketSellSwapQuote, SmartContractParamsInfo, SwapQuote, SwapQuoteConsumer, @@ -20,7 +23,7 @@ import { assert } from '../utils/assert'; import { swapQuoteConsumerUtils } from '../utils/swap_quote_consumer_utils'; import { utils } from '../utils/utils'; -export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumer { +export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumer { public readonly provider: ZeroExProvider; public readonly networkId: number; @@ -44,9 +47,20 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumer { assert.isValidSwapQuote('quote', quote); - const { params, to, ethAmount, methodAbi } = await this.getSmartContractParamsOrThrowAsync(quote, opts); + const consumableQuote = (quote as any) as (MarketBuySwapQuote | MarketSellSwapQuote); + const smartContractParamsInfo = await this.getSmartContractParamsOrThrowAsync(consumableQuote, opts); + const { to, methodAbi, ethAmount } = smartContractParamsInfo; + const abiEncoder = new AbiEncoder.Method(methodAbi); - const args = [params.orders, params.makerAssetFillAmount, params.signatures]; + + let args: any[]; + if (utils.isSwapQuoteMarketBuy(consumableQuote)) { + const marketBuyParams = (smartContractParamsInfo.params as any) as ExchangeMarketBuySmartContractParams; + args = [marketBuyParams.orders, marketBuyParams.makerAssetFillAmount, marketBuyParams.signatures]; + } else { + const marketSellParams = (smartContractParamsInfo.params as any) as ExchangeMarketSellSmartContractParams; + args = [marketSellParams.orders, marketSellParams.takerAssetFillAmount, marketSellParams.signatures]; + } const calldataHexString = abiEncoder.encode(args); return { calldataHexString, @@ -59,22 +73,45 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumer, - ): Promise> { + ): Promise> { assert.isValidSwapQuote('quote', quote); - const { orders, makerAssetFillAmount } = quote; + const consumableQuote = (quote as any) as ( + | MarketBuySwapQuote + | MarketSellSwapQuote); + + const { orders } = consumableQuote; const signatures = _.map(orders, o => o.signature); - const params: ExchangeMarketBuySmartContractParams = { - orders, - signatures, - makerAssetFillAmount, - }; + let params: ExchangeMarketBuySmartContractParams | ExchangeMarketSellSmartContractParams; + let methodName: string; + + if (utils.isSwapQuoteMarketBuy(consumableQuote)) { + const { makerAssetFillAmount } = consumableQuote; + + params = { + orders, + signatures, + makerAssetFillAmount, + }; + + methodName = 'marketBuyOrders'; + } else { + const { takerAssetFillAmount } = consumableQuote; + + params = { + orders, + signatures, + takerAssetFillAmount, + }; + + methodName = 'marketSellOrders'; + } const methodAbi = utils.getMethodAbiFromContractAbi( this._contractWrappers.exchange.abi, - 'marketBuyOrdersNoThrow', + methodName, ) as MethodAbi; return { @@ -102,21 +139,41 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumer