Merge pull request #1988 from 0xProject/feature/asset-swapper/optimized-market-sell-output
Added optimization utils for asset-swapper exchange consumer
This commit is contained in:
		@@ -10,6 +10,7 @@ import {
 | 
				
			|||||||
    SwapQuoterOpts,
 | 
					    SwapQuoterOpts,
 | 
				
			||||||
} from './types';
 | 
					} from './types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const NULL_BYTES = '0x';
 | 
				
			||||||
const NULL_ADDRESS = '0x0000000000000000000000000000000000000000';
 | 
					const NULL_ADDRESS = '0x0000000000000000000000000000000000000000';
 | 
				
			||||||
const MAINNET_NETWORK_ID = 1;
 | 
					const MAINNET_NETWORK_ID = 1;
 | 
				
			||||||
const ONE_SECOND_MS = 1000;
 | 
					const ONE_SECOND_MS = 1000;
 | 
				
			||||||
@@ -44,6 +45,7 @@ const DEFAULT_LIQUIDITY_REQUEST_OPTS: LiquidityRequestOpts = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const constants = {
 | 
					export const constants = {
 | 
				
			||||||
 | 
					    NULL_BYTES,
 | 
				
			||||||
    ZERO_AMOUNT: new BigNumber(0),
 | 
					    ZERO_AMOUNT: new BigNumber(0),
 | 
				
			||||||
    NULL_ADDRESS,
 | 
					    NULL_ADDRESS,
 | 
				
			||||||
    MAINNET_NETWORK_ID,
 | 
					    MAINNET_NETWORK_ID,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,6 +77,8 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumerBase<Exchange
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        const signatures = _.map(orders, o => o.signature);
 | 
					        const signatures = _.map(orders, o => o.signature);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const optimizedOrders = swapQuoteConsumerUtils.optimizeOrdersForMarketExchangeOperation(orders, quote.type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let params: ExchangeSmartContractParams;
 | 
					        let params: ExchangeSmartContractParams;
 | 
				
			||||||
        let methodName: string;
 | 
					        let methodName: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -84,7 +86,7 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumerBase<Exchange
 | 
				
			|||||||
            const { makerAssetFillAmount } = quote;
 | 
					            const { makerAssetFillAmount } = quote;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            params = {
 | 
					            params = {
 | 
				
			||||||
                orders,
 | 
					                orders: optimizedOrders,
 | 
				
			||||||
                signatures,
 | 
					                signatures,
 | 
				
			||||||
                makerAssetFillAmount,
 | 
					                makerAssetFillAmount,
 | 
				
			||||||
                type: MarketOperation.Buy,
 | 
					                type: MarketOperation.Buy,
 | 
				
			||||||
@@ -95,7 +97,7 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumerBase<Exchange
 | 
				
			|||||||
            const { takerAssetFillAmount } = quote;
 | 
					            const { takerAssetFillAmount } = quote;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            params = {
 | 
					            params = {
 | 
				
			||||||
                orders,
 | 
					                orders: optimizedOrders,
 | 
				
			||||||
                signatures,
 | 
					                signatures,
 | 
				
			||||||
                takerAssetFillAmount,
 | 
					                takerAssetFillAmount,
 | 
				
			||||||
                type: MarketOperation.Sell,
 | 
					                type: MarketOperation.Sell,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,12 @@ export const assert = {
 | 
				
			|||||||
        sharedAssert.isHexString(`${variableName}.makerAssetData`, swapQuote.makerAssetData);
 | 
					        sharedAssert.isHexString(`${variableName}.makerAssetData`, swapQuote.makerAssetData);
 | 
				
			||||||
        sharedAssert.doesConformToSchema(`${variableName}.orders`, swapQuote.orders, schemas.signedOrdersSchema);
 | 
					        sharedAssert.doesConformToSchema(`${variableName}.orders`, swapQuote.orders, schemas.signedOrdersSchema);
 | 
				
			||||||
        sharedAssert.doesConformToSchema(`${variableName}.feeOrders`, swapQuote.feeOrders, schemas.signedOrdersSchema);
 | 
					        sharedAssert.doesConformToSchema(`${variableName}.feeOrders`, swapQuote.feeOrders, schemas.signedOrdersSchema);
 | 
				
			||||||
 | 
					        assert.isValidOrdersForSwapQuote(
 | 
				
			||||||
 | 
					            `${variableName}.orders`,
 | 
				
			||||||
 | 
					            swapQuote.orders,
 | 
				
			||||||
 | 
					            swapQuote.makerAssetData,
 | 
				
			||||||
 | 
					            swapQuote.takerAssetData,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        assert.isValidSwapQuoteInfo(`${variableName}.bestCaseQuoteInfo`, swapQuote.bestCaseQuoteInfo);
 | 
					        assert.isValidSwapQuoteInfo(`${variableName}.bestCaseQuoteInfo`, swapQuote.bestCaseQuoteInfo);
 | 
				
			||||||
        assert.isValidSwapQuoteInfo(`${variableName}.worstCaseQuoteInfo`, swapQuote.worstCaseQuoteInfo);
 | 
					        assert.isValidSwapQuoteInfo(`${variableName}.worstCaseQuoteInfo`, swapQuote.worstCaseQuoteInfo);
 | 
				
			||||||
        if (swapQuote.type === MarketOperation.Buy) {
 | 
					        if (swapQuote.type === MarketOperation.Buy) {
 | 
				
			||||||
@@ -20,6 +26,23 @@ export const assert = {
 | 
				
			|||||||
            sharedAssert.isBigNumber(`${variableName}.takerAssetFillAmount`, swapQuote.takerAssetFillAmount);
 | 
					            sharedAssert.isBigNumber(`${variableName}.takerAssetFillAmount`, swapQuote.takerAssetFillAmount);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    isValidOrdersForSwapQuote(
 | 
				
			||||||
 | 
					        variableName: string,
 | 
				
			||||||
 | 
					        orders: SignedOrder[],
 | 
				
			||||||
 | 
					        makerAssetData: string,
 | 
				
			||||||
 | 
					        takerAssetData: string,
 | 
				
			||||||
 | 
					    ): void {
 | 
				
			||||||
 | 
					        _.every(orders, (order: SignedOrder, index: number) => {
 | 
				
			||||||
 | 
					            assert.assert(
 | 
				
			||||||
 | 
					                order.takerAssetData === takerAssetData,
 | 
				
			||||||
 | 
					                `Expected ${variableName}[${index}].takerAssetData to be ${takerAssetData}`,
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            assert.assert(
 | 
				
			||||||
 | 
					                order.makerAssetData === makerAssetData,
 | 
				
			||||||
 | 
					                `Expected ${variableName}[${index}].makerAssetData to be ${makerAssetData}`,
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    isValidForwarderSwapQuote(variableName: string, swapQuote: SwapQuote, wethAssetData: string): void {
 | 
					    isValidForwarderSwapQuote(variableName: string, swapQuote: SwapQuote, wethAssetData: string): void {
 | 
				
			||||||
        assert.isValidSwapQuote(variableName, swapQuote);
 | 
					        assert.isValidSwapQuote(variableName, swapQuote);
 | 
				
			||||||
        assert.isValidForwarderSignedOrders(`${variableName}.orders`, swapQuote.orders, wethAssetData);
 | 
					        assert.isValidForwarderSignedOrders(`${variableName}.orders`, swapQuote.orders, wethAssetData);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import { ContractWrappers } from '@0x/contract-wrappers';
 | 
					import { ContractWrappers } from '@0x/contract-wrappers';
 | 
				
			||||||
import { SignedOrder } from '@0x/types';
 | 
					import { MarketOperation, SignedOrder } from '@0x/types';
 | 
				
			||||||
import { BigNumber } from '@0x/utils';
 | 
					import { BigNumber } from '@0x/utils';
 | 
				
			||||||
import { SupportedProvider, Web3Wrapper } from '@0x/web3-wrapper';
 | 
					import { SupportedProvider, Web3Wrapper } from '@0x/web3-wrapper';
 | 
				
			||||||
import { Provider } from 'ethereum-types';
 | 
					import { Provider } from 'ethereum-types';
 | 
				
			||||||
@@ -72,6 +72,17 @@ export const swapQuoteConsumerUtils = {
 | 
				
			|||||||
    isValidForwarderSignedOrder(order: SignedOrder, wethAssetData: string): boolean {
 | 
					    isValidForwarderSignedOrder(order: SignedOrder, wethAssetData: string): boolean {
 | 
				
			||||||
        return order.takerAssetData === wethAssetData;
 | 
					        return order.takerAssetData === wethAssetData;
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    optimizeOrdersForMarketExchangeOperation(orders: SignedOrder[], operation: MarketOperation): SignedOrder[] {
 | 
				
			||||||
 | 
					        return _.map(orders, (order: SignedOrder, index: number) => {
 | 
				
			||||||
 | 
					            const optimizedOrder = _.clone(order);
 | 
				
			||||||
 | 
					            if (operation === MarketOperation.Sell && index !== 0) {
 | 
				
			||||||
 | 
					                optimizedOrder.takerAssetData = constants.NULL_BYTES;
 | 
				
			||||||
 | 
					            } else if (index !== 0) {
 | 
				
			||||||
 | 
					                optimizedOrder.makerAssetData = constants.NULL_BYTES;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return optimizedOrder;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    async getConsumerForSwapQuoteAsync(
 | 
					    async getConsumerForSwapQuoteAsync(
 | 
				
			||||||
        quote: SwapQuote,
 | 
					        quote: SwapQuote,
 | 
				
			||||||
        contractWrappers: ContractWrappers,
 | 
					        contractWrappers: ContractWrappers,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user