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:
David Sun
2019-07-24 11:09:15 -07:00
committed by GitHub
4 changed files with 41 additions and 3 deletions

View File

@@ -10,6 +10,7 @@ import {
SwapQuoterOpts,
} from './types';
const NULL_BYTES = '0x';
const NULL_ADDRESS = '0x0000000000000000000000000000000000000000';
const MAINNET_NETWORK_ID = 1;
const ONE_SECOND_MS = 1000;
@@ -44,6 +45,7 @@ const DEFAULT_LIQUIDITY_REQUEST_OPTS: LiquidityRequestOpts = {
};
export const constants = {
NULL_BYTES,
ZERO_AMOUNT: new BigNumber(0),
NULL_ADDRESS,
MAINNET_NETWORK_ID,

View File

@@ -77,6 +77,8 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumerBase<Exchange
const signatures = _.map(orders, o => o.signature);
const optimizedOrders = swapQuoteConsumerUtils.optimizeOrdersForMarketExchangeOperation(orders, quote.type);
let params: ExchangeSmartContractParams;
let methodName: string;
@@ -84,7 +86,7 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumerBase<Exchange
const { makerAssetFillAmount } = quote;
params = {
orders,
orders: optimizedOrders,
signatures,
makerAssetFillAmount,
type: MarketOperation.Buy,
@@ -95,7 +97,7 @@ export class ExchangeSwapQuoteConsumer implements SwapQuoteConsumerBase<Exchange
const { takerAssetFillAmount } = quote;
params = {
orders,
orders: optimizedOrders,
signatures,
takerAssetFillAmount,
type: MarketOperation.Sell,

View File

@@ -12,6 +12,12 @@ export const assert = {
sharedAssert.isHexString(`${variableName}.makerAssetData`, swapQuote.makerAssetData);
sharedAssert.doesConformToSchema(`${variableName}.orders`, swapQuote.orders, 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}.worstCaseQuoteInfo`, swapQuote.worstCaseQuoteInfo);
if (swapQuote.type === MarketOperation.Buy) {
@@ -20,6 +26,23 @@ export const assert = {
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 {
assert.isValidSwapQuote(variableName, swapQuote);
assert.isValidForwarderSignedOrders(`${variableName}.orders`, swapQuote.orders, wethAssetData);

View File

@@ -1,5 +1,5 @@
import { ContractWrappers } from '@0x/contract-wrappers';
import { SignedOrder } from '@0x/types';
import { MarketOperation, SignedOrder } from '@0x/types';
import { BigNumber } from '@0x/utils';
import { SupportedProvider, Web3Wrapper } from '@0x/web3-wrapper';
import { Provider } from 'ethereum-types';
@@ -72,6 +72,17 @@ export const swapQuoteConsumerUtils = {
isValidForwarderSignedOrder(order: SignedOrder, wethAssetData: string): boolean {
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(
quote: SwapQuote,
contractWrappers: ContractWrappers,