return quote report

This commit is contained in:
Steve Klebanoff
2020-07-06 22:18:22 -07:00
parent e79db7de89
commit f64a42ebb5
5 changed files with 25 additions and 6 deletions

View File

@@ -3,6 +3,7 @@ import { SignedOrder } from '@0x/types';
import { BigNumber } from '@0x/utils';
import { GetMarketOrdersOpts, OptimizedMarketOrder } from './utils/market_operation_utils/types';
import { QuoteReport } from './utils/quote_report_generator';
import { LogFunction } from './utils/quote_requestor';
/**
@@ -155,7 +156,7 @@ export interface SwapQuoteBase {
bestCaseQuoteInfo: SwapQuoteInfo;
worstCaseQuoteInfo: SwapQuoteInfo;
sourceBreakdown: SwapQuoteOrdersBreakdown;
quoteReport: string;
quoteReport: QuoteReport;
}
/**

View File

@@ -2,10 +2,13 @@ import { ContractAddresses } from '@0x/contract-addresses';
import { RFQTIndicativeQuote } from '@0x/quote-server';
import { SignedOrder } from '@0x/types';
import { BigNumber, NULL_ADDRESS } from '@0x/utils';
import * as _ from 'lodash';
import { MarketOperation } from '../../types';
import { QuoteRequestor } from '../quote_requestor';
import { difference } from '../utils';
import { QuoteReportGenerator } from './../quote_report_generator';
import { BUY_SOURCES, DEFAULT_GET_MARKET_ORDERS_OPTS, FEE_QUOTE_SOURCES, ONE_ETHER, SELL_SOURCES } from './constants';
import { createFillPaths, getPathAdjustedRate, getPathAdjustedSlippage } from './fills';
import {
@@ -121,6 +124,7 @@ export class MarketOperationUtils {
[orderFillableAmounts, liquidityProviderAddress, ethToMakerAssetRate, dexQuotes],
rfqtIndicativeQuotes,
] = await Promise.all([samplerPromise, rfqtPromise]);
return this._generateOptimizedOrders({
orderFillableAmounts,
nativeOrders,
@@ -139,6 +143,7 @@ export class MarketOperationUtils {
feeSchedule: _opts.feeSchedule,
allowFallback: _opts.allowFallback,
shouldBatchBridgeOrders: _opts.shouldBatchBridgeOrders,
quoteRequestor: _opts.rfqt ? _opts.rfqt.quoteRequestor : undefined,
});
}
@@ -225,6 +230,7 @@ export class MarketOperationUtils {
feeSchedule: _opts.feeSchedule,
allowFallback: _opts.allowFallback,
shouldBatchBridgeOrders: _opts.shouldBatchBridgeOrders,
quoteRequestor: _opts.rfqt ? _opts.rfqt.quoteRequestor : undefined,
});
}
@@ -332,6 +338,7 @@ export class MarketOperationUtils {
shouldBatchBridgeOrders?: boolean;
liquidityProviderAddress?: string;
multiBridgeAddress?: string;
quoteRequestor?: QuoteRequestor;
}): OptimizedOrdersAndQuoteReport {
const { inputToken, outputToken, side, inputAmount } = opts;
const maxFallbackSlippage = opts.maxFallbackSlippage || 0;
@@ -396,7 +403,10 @@ export class MarketOperationUtils {
multiBridgeAddress: opts.multiBridgeAddress,
shouldBatchBridgeOrders: !!opts.shouldBatchBridgeOrders,
});
return { optimizedOrders, quoteReport: 'TODO' };
const collapsedPaths = _.flatten(optimizedOrders.map(o => o.fills));
const quoteReport = new QuoteReportGenerator(opts.side, _.flatten(opts.dexQuotes), opts.nativeOrders, opts.orderFillableAmounts, collapsedPaths, opts.quoteRequestor).generateReport();
return { optimizedOrders, quoteReport };
}
private _optionalSources(): ERC20BridgeSource[] {

View File

@@ -3,6 +3,7 @@ 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
@@ -221,5 +222,5 @@ export interface FakeBuyOpts {
export interface OptimizedOrdersAndQuoteReport {
optimizedOrders: OptimizedMarketOrder[];
quoteReport: string;
quoteReport: QuoteReport;
}

View File

@@ -44,7 +44,7 @@ export class QuoteReportGenerator {
private readonly _collapsedFills: CollapsedFill[];
private readonly _quoteRequestor?: QuoteRequestor;
constructor(marketOperation: MarketOperation, dexQuotes: DexSample[], nativeOrders: SignedOrder[], orderFillableAmounts: BigNumber[], collapsedFills: CollapsedFill[], quoteRequestor: QuoteRequestor) {
constructor(marketOperation: MarketOperation, dexQuotes: DexSample[], nativeOrders: SignedOrder[], orderFillableAmounts: BigNumber[], collapsedFills: CollapsedFill[], quoteRequestor?: QuoteRequestor) {
this._dexQuotes = dexQuotes;
this._nativeOrders = nativeOrders;
this._marketOperation = marketOperation;

View File

@@ -20,6 +20,7 @@ import { convertNativeOrderToFullyFillableOptimizedOrders } from './market_opera
import { GetMarketOrdersOpts, OptimizedMarketOrder, OptimizedOrdersAndQuoteReport } from './market_operation_utils/types';
import { isSupportedAssetDataInOrders } from './utils';
import { QuoteReport } from './quote_report_generator';
import { QuoteFillResult, simulateBestCaseFill, simulateWorstCaseFill } from './quote_simulation';
// TODO(dave4506) How do we want to reintroduce InsufficientAssetLiquidityError?
@@ -87,6 +88,7 @@ export class SwapQuoteCalculator {
assetFillAmounts,
opts,
);
const blankQuoteReport = { sourcesConsidered: [], sourcesDelivered: [] }; // TODO: better solution here
const batchSwapQuotes = await Promise.all(
batchSignedOrders.map(async (orders, i) => {
if (orders) {
@@ -94,11 +96,12 @@ export class SwapQuoteCalculator {
return createSwapQuote(
makerAssetData,
takerAssetData,
{ optimizedOrders: orders, quoteReport: 'TODO' },
{ optimizedOrders: orders, quoteReport: blankQuoteReport },
operation,
assetFillAmounts[i],
gasPrice,
opts.gasSchedule,
blankQuoteReport,
);
} else {
return undefined;
@@ -134,8 +137,9 @@ export class SwapQuoteCalculator {
: { assetProxyId: '' };
if (firstOrderMakerAssetData.assetProxyId === AssetProxyId.ERC721) {
const blankQuoteReport = { sourcesConsidered: [], sourcesDelivered: [] }; // TODO: better solution here
// HACK: to conform ERC721 orders to the output of market operation utils, assumes complete fillable
result = { optimizedOrders: prunedOrders.map(o => convertNativeOrderToFullyFillableOptimizedOrders(o)), quoteReport: 'TODO' };
result = { optimizedOrders: prunedOrders.map(o => convertNativeOrderToFullyFillableOptimizedOrders(o)), quoteReport: blankQuoteReport };
} else {
if (operation === MarketOperation.Buy) {
result = await this._marketOperationUtils.getMarketBuyOrdersAsync(
@@ -163,6 +167,7 @@ export class SwapQuoteCalculator {
assetFillAmount,
gasPrice,
opts.gasSchedule,
result.quoteReport,
);
}
}
@@ -175,6 +180,7 @@ function createSwapQuote(
assetFillAmount: BigNumber,
gasPrice: BigNumber,
gasSchedule: { [source: string]: number },
quoteReport: QuoteReport,
): SwapQuote {
const resultOrders = result.optimizedOrders;
@@ -202,6 +208,7 @@ function createSwapQuote(
worstCaseQuoteInfo: fillResultsToQuoteInfo(worstCaseFillResult),
sourceBreakdown: getSwapQuoteOrdersBreakdown(bestCaseFillResult.fillAmountBySource),
orders: resultOrders,
quoteReport,
};
if (operation === MarketOperation.Buy) {