add real VIP support for eligible RFQT swaps (#458)
Co-authored-by: Lawrence Forman <me@merklejerk.com>
This commit is contained in:
		
				
					committed by
					
						
						Noah Khamliche
					
				
			
			
				
	
			
			
			
						parent
						
							95aa9d0150
						
					
				
				
					commit
					b197bf734d
				
			@@ -1,4 +1,13 @@
 | 
				
			|||||||
[
 | 
					[
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        "version": "16.54.0",
 | 
				
			||||||
 | 
					        "changes": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "note": "Add true VIP support for eligible RFQt swaps",
 | 
				
			||||||
 | 
					                "pr": 458
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        "version": "16.53.0",
 | 
					        "version": "16.53.0",
 | 
				
			||||||
        "changes": [
 | 
					        "changes": [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,16 @@ import {
 | 
				
			|||||||
} from '../utils/market_operation_utils/constants';
 | 
					} from '../utils/market_operation_utils/constants';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    ERC20BridgeSource,
 | 
					    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';
 | 
					} from '../utils/market_operation_utils/types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {
 | 
					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)) {
 | 
					        if (this.chainId === ChainId.Mainnet && isMultiplexBatchFillCompatible(quote, optsWithDefaults)) {
 | 
				
			||||||
            return {
 | 
					            return {
 | 
				
			||||||
                calldataHexString: this._encodeMultiplexBatchFillCalldata(
 | 
					                calldataHexString: this._encodeMultiplexBatchFillCalldata(
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user