initial decoupling of Quote reporter

This commit is contained in:
Daniel Pyrathon 2020-09-24 15:27:55 -07:00
parent 5f570b772d
commit 235e406620
2 changed files with 46 additions and 52 deletions

View File

@ -33,6 +33,7 @@ import {
DexSample,
ERC20BridgeSource,
FeeSchedule,
FillData,
GetMarketOrdersOpts,
MarketSideLiquidity,
OptimizedMarketOrder,
@ -78,6 +79,20 @@ export class MarketOperationUtils {
private readonly _buySources: SourceFilters;
private readonly _feeSources = new SourceFilters(FEE_QUOTE_SOURCES);
private static _computeQuoteReport(nativeOrders: SignedOrder[], quoteRequestor: QuoteRequestor, marketSideLiquidity: MarketSideLiquidity, optimizerResult: OptimizerResult): void {
const {side, dexQuotes, twoHopQuotes, orderFillableAmounts } = marketSideLiquidity;
const { liquidityDelivered } = optimizerResult;
generateQuoteReport(
side,
_.flatten(dexQuotes),
twoHopQuotes,
nativeOrders,
orderFillableAmounts,
liquidityDelivered,
quoteRequestor,
);
}
constructor(
private readonly _sampler: DexOrderSampler,
private readonly contractAddresses: ContractAddresses,
@ -339,19 +354,22 @@ export class MarketOperationUtils {
nativeOrders: SignedOrder[],
takerAmount: BigNumber,
opts?: Partial<GetMarketOrdersOpts>,
gasPrice?: BigNumber,
): Promise<OptimizerResult> {
const _opts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts };
const marketSideLiquidity = await this.getMarketSellLiquidityAsync(nativeOrders, takerAmount, _opts);
return this._generateOptimizedOrdersAsync(marketSideLiquidity, {
bridgeSlippage: _opts.bridgeSlippage,
maxFallbackSlippage: _opts.maxFallbackSlippage,
excludedSources: _opts.excludedSources,
feeSchedule: _opts.feeSchedule,
allowFallback: _opts.allowFallback,
shouldBatchBridgeOrders: _opts.shouldBatchBridgeOrders,
quoteRequestor: _opts.rfqt ? _opts.rfqt.quoteRequestor : undefined,
shouldGenerateQuoteReport: _opts.shouldGenerateQuoteReport,
const defaultOpts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts };
const marketSideLiquidity = await this.getMarketSellLiquidityAsync(nativeOrders, takerAmount, defaultOpts);
const optimizedOrders = await this._generateOptimizedOrdersAsync(marketSideLiquidity, {
bridgeSlippage: defaultOpts.bridgeSlippage,
maxFallbackSlippage: defaultOpts.maxFallbackSlippage,
excludedSources: defaultOpts.excludedSources,
feeSchedule: defaultOpts.feeSchedule,
allowFallback: defaultOpts.allowFallback,
shouldBatchBridgeOrders: defaultOpts.shouldBatchBridgeOrders,
});
if (defaultOpts.shouldGenerateQuoteReport && defaultOpts.rfqt && defaultOpts.rfqt.quoteRequestor) {
MarketOperationUtils._computeQuoteReport(nativeOrders, defaultOpts.rfqt.quoteRequestor, marketSideLiquidity, optimizedResult);
}
return optimizedOrders;
}
/**
@ -367,18 +385,20 @@ export class MarketOperationUtils {
makerAmount: BigNumber,
opts?: Partial<GetMarketOrdersOpts>,
): Promise<OptimizerResult> {
const _opts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts };
const marketSideLiquidity = await this.getMarketBuyLiquidityAsync(nativeOrders, makerAmount, _opts);
return this._generateOptimizedOrdersAsync(marketSideLiquidity, {
bridgeSlippage: _opts.bridgeSlippage,
maxFallbackSlippage: _opts.maxFallbackSlippage,
excludedSources: _opts.excludedSources,
feeSchedule: _opts.feeSchedule,
allowFallback: _opts.allowFallback,
shouldBatchBridgeOrders: _opts.shouldBatchBridgeOrders,
quoteRequestor: _opts.rfqt ? _opts.rfqt.quoteRequestor : undefined,
shouldGenerateQuoteReport: _opts.shouldGenerateQuoteReport,
const defaultOpts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts };
const marketSideLiquidity = await this.getMarketBuyLiquidityAsync(nativeOrders, makerAmount, defaultOpts);
const optimizedResult = await this._generateOptimizedOrdersAsync(marketSideLiquidity, {
bridgeSlippage: defaultOpts.bridgeSlippage,
maxFallbackSlippage: defaultOpts.maxFallbackSlippage,
excludedSources: defaultOpts.excludedSources,
feeSchedule: defaultOpts.feeSchedule,
allowFallback: defaultOpts.allowFallback,
shouldBatchBridgeOrders: defaultOpts.shouldBatchBridgeOrders,
});
if (defaultOpts.shouldGenerateQuoteReport && defaultOpts.rfqt && defaultOpts.rfqt.quoteRequestor) {
MarketOperationUtils._computeQuoteReport(nativeOrders, defaultOpts.rfqt.quoteRequestor, marketSideLiquidity, optimizedResult);
}
return optimizedResult;
}
/**
@ -468,7 +488,6 @@ export class MarketOperationUtils {
feeSchedule: _opts.feeSchedule,
allowFallback: _opts.allowFallback,
shouldBatchBridgeOrders: _opts.shouldBatchBridgeOrders,
shouldGenerateQuoteReport: false,
},
);
return optimizedOrders;
@ -491,8 +510,6 @@ export class MarketOperationUtils {
feeSchedule?: FeeSchedule;
allowFallback?: boolean;
shouldBatchBridgeOrders?: boolean;
quoteRequestor?: QuoteRequestor;
shouldGenerateQuoteReport?: boolean;
},
): Promise<OptimizerResult> {
const {
@ -506,7 +523,6 @@ export class MarketOperationUtils {
dexQuotes,
ethToOutputRate,
ethToInputRate,
twoHopQuotes,
} = marketSideLiquidity;
const maxFallbackSlippage = opts.maxFallbackSlippage || 0;
@ -549,18 +565,7 @@ export class MarketOperationUtils {
);
if (bestTwoHopQuote && bestTwoHopRate.isGreaterThan(optimalPathRate)) {
const twoHopOrders = createOrdersFromTwoHopSample(bestTwoHopQuote, orderOpts);
const twoHopQuoteReport = opts.shouldGenerateQuoteReport
? generateQuoteReport(
side,
_.flatten(dexQuotes),
twoHopQuotes,
nativeOrders,
orderFillableAmounts,
bestTwoHopQuote,
opts.quoteRequestor,
)
: undefined;
return { optimizedOrders: twoHopOrders, quoteReport: twoHopQuoteReport, isTwoHop: true };
return { optimizedOrders: twoHopOrders, liquidityDelivered: bestTwoHopQuote, isTwoHop: true };
}
// Generate a fallback path if native orders are in the optimal path.
@ -591,18 +596,8 @@ export class MarketOperationUtils {
}
}
const optimizedOrders = createOrdersFromPath(optimalPath, orderOpts);
const quoteReport = opts.shouldGenerateQuoteReport
? generateQuoteReport(
side,
_.flatten(dexQuotes),
twoHopQuotes,
nativeOrders,
orderFillableAmounts,
_.flatten(optimizedOrders.map(order => order.fills)),
opts.quoteRequestor,
)
: undefined;
return { optimizedOrders, quoteReport, isTwoHop: false };
const liquidityDelivered = _.flatten(optimizedOrders.map(order => order.fills));
return { optimizedOrders, liquidityDelivered, isTwoHop: false };
}
}

View File

@ -4,7 +4,6 @@ import { BigNumber } from '@0x/utils';
import { RfqtRequestOpts, SignedOrderWithFillableAmounts } from '../../types';
import { QuoteRequestor } from '../../utils/quote_requestor';
import { QuoteReport } from '../quote_report_generator';
/**
* Order domain keys: chainId and exchange
@ -322,7 +321,7 @@ export interface SourceQuoteOperation<TFillData extends FillData = FillData>
export interface OptimizerResult {
optimizedOrders: OptimizedMarketOrder[];
isTwoHop: boolean;
quoteReport?: QuoteReport;
liquidityDelivered: CollapsedFill[] | DexSample<MultiHopFillData>;
}
export type MarketDepthSide = Array<Array<DexSample<FillData>>>;