From b197bf734df477296859bc223b46495483f34314 Mon Sep 17 00:00:00 2001 From: Lawrence Forman Date: Tue, 5 Apr 2022 21:00:12 -0600 Subject: [PATCH] add real VIP support for eligible RFQT swaps (#458) Co-authored-by: Lawrence Forman --- packages/asset-swapper/CHANGELOG.json | 9 ++++ .../exchange_proxy_swap_quote_consumer.ts | 52 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/packages/asset-swapper/CHANGELOG.json b/packages/asset-swapper/CHANGELOG.json index 83514f3eb4..8cf8c1689f 100644 --- a/packages/asset-swapper/CHANGELOG.json +++ b/packages/asset-swapper/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "16.54.0", + "changes": [ + { + "note": "Add true VIP support for eligible RFQt swaps", + "pr": 458 + } + ] + }, { "version": "16.53.0", "changes": [ diff --git a/packages/asset-swapper/src/quote_consumers/exchange_proxy_swap_quote_consumer.ts b/packages/asset-swapper/src/quote_consumers/exchange_proxy_swap_quote_consumer.ts index 0ccdbf72a4..2f3b6e5dee 100644 --- a/packages/asset-swapper/src/quote_consumers/exchange_proxy_swap_quote_consumer.ts +++ b/packages/asset-swapper/src/quote_consumers/exchange_proxy_swap_quote_consumer.ts @@ -44,6 +44,16 @@ import { } from '../utils/market_operation_utils/constants'; import { ERC20BridgeSource, +<<<<<<< HEAD +======= + FinalUniswapV3FillData, + LiquidityProviderFillData, + MooniswapFillData, + NativeRfqOrderFillData, + OptimizedMarketBridgeOrder, + OptimizedMarketOrder, + UniswapV2FillData, +>>>>>>> 955ad4971 (add real VIP support for eligible RFQT swaps (#458)) } from '../utils/market_operation_utils/types'; import { @@ -349,6 +359,48 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase { }; } + // RFQT VIP + if ( + [ChainId.Mainnet, ChainId.Polygon].includes(this.chainId) && + !isToETH && + !isFromETH && + quote.orders.every(o => o.type === FillQuoteTransformerOrderType.Rfq) + ) { + const rfqOrdersData = quote.orders.map(o => o.fillData as NativeRfqOrderFillData); + const fillAmountPerOrder = (() => { + // Don't think order taker amounts are clipped to actual sell amount + // (the last one might be too large) so figure them out manually. + let remaining = sellAmount; + const fillAmounts = []; + for (const o of quote.orders) { + const fillAmount = BigNumber.min(o.takerAmount, remaining); + fillAmounts.push(fillAmount); + remaining = remaining.minus(fillAmount); + } + return fillAmounts; + })(); + const callData = + quote.orders.length === 1 + ? this._exchangeProxy + .fillRfqOrder(rfqOrdersData[0].order, rfqOrdersData[0].signature, fillAmountPerOrder[0]) + .getABIEncodedTransactionData() + : this._exchangeProxy + .batchFillRfqOrders( + rfqOrdersData.map(d => d.order), + rfqOrdersData.map(d => d.signature), + fillAmountPerOrder, + true, + ) + .getABIEncodedTransactionData(); + return { + calldataHexString: callData, + ethAmount: ZERO_AMOUNT, + toAddress: this._exchangeProxy.address, + allowanceTarget: this._exchangeProxy.address, + gasOverhead: ZERO_AMOUNT, + }; + } + if (this.chainId === ChainId.Mainnet && isMultiplexBatchFillCompatible(quote, optsWithDefaults)) { return { calldataHexString: this._encodeMultiplexBatchFillCalldata(