fix: [WIP] Adds RFQ price-aware comparison price to Quote Report (#18)

* Adds RFQ price-aware comparison price to Quote Report

* added linting fix

* added small lints

* better syntax
This commit is contained in:
Daniel Pyrathon 2020-10-29 08:48:01 -07:00 committed by GitHub
parent 866f958a10
commit e2e14a977a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 2 deletions

View File

@ -88,6 +88,7 @@ export class MarketOperationUtils {
quoteRequestor: QuoteRequestor | undefined, quoteRequestor: QuoteRequestor | undefined,
marketSideLiquidity: MarketSideLiquidity, marketSideLiquidity: MarketSideLiquidity,
optimizerResult: OptimizerResult, optimizerResult: OptimizerResult,
comparisonPrice?: BigNumber | undefined,
): QuoteReport { ): QuoteReport {
const { side, dexQuotes, twoHopQuotes, orderFillableAmounts } = marketSideLiquidity; const { side, dexQuotes, twoHopQuotes, orderFillableAmounts } = marketSideLiquidity;
const { liquidityDelivered } = optimizerResult; const { liquidityDelivered } = optimizerResult;
@ -98,6 +99,7 @@ export class MarketOperationUtils {
nativeOrders, nativeOrders,
orderFillableAmounts, orderFillableAmounts,
liquidityDelivered, liquidityDelivered,
comparisonPrice,
quoteRequestor, quoteRequestor,
); );
} }
@ -676,6 +678,7 @@ export class MarketOperationUtils {
} }
// If RFQ liquidity is enabled, make a request to check RFQ liquidity // If RFQ liquidity is enabled, make a request to check RFQ liquidity
let comparisonPrice: BigNumber | undefined;
const { rfqt } = _opts; const { rfqt } = _opts;
if ( if (
rfqt && rfqt &&
@ -684,7 +687,6 @@ export class MarketOperationUtils {
marketSideLiquidity.quoteSourceFilters.isAllowed(ERC20BridgeSource.Native) marketSideLiquidity.quoteSourceFilters.isAllowed(ERC20BridgeSource.Native)
) { ) {
// Calculate a suggested price. For now, this is simply the overall price of the aggregation. // Calculate a suggested price. For now, this is simply the overall price of the aggregation.
let comparisonPrice: BigNumber | undefined;
if (optimizerResult) { if (optimizerResult) {
const totalMakerAmount = BigNumber.sum( const totalMakerAmount = BigNumber.sum(
...optimizerResult.optimizedOrders.map(order => order.makerAssetAmount), ...optimizerResult.optimizedOrders.map(order => order.makerAssetAmount),
@ -781,6 +783,7 @@ export class MarketOperationUtils {
_opts.rfqt ? _opts.rfqt.quoteRequestor : undefined, _opts.rfqt ? _opts.rfqt.quoteRequestor : undefined,
marketSideLiquidity, marketSideLiquidity,
optimizerResult, optimizerResult,
comparisonPrice,
); );
} }
return { ...optimizerResult, quoteReport }; return { ...optimizerResult, quoteReport };

View File

@ -42,6 +42,7 @@ export interface NativeOrderbookReportSource extends NativeReportSourceBase {
export interface NativeRFQTReportSource extends NativeReportSourceBase { export interface NativeRFQTReportSource extends NativeReportSourceBase {
isRfqt: true; isRfqt: true;
makerUri: string; makerUri: string;
comparisonPrice?: number;
} }
export type QuoteReportSource = export type QuoteReportSource =
| BridgeReportSource | BridgeReportSource
@ -65,11 +66,12 @@ export function generateQuoteReport(
nativeOrders: SignedOrder[], nativeOrders: SignedOrder[],
orderFillableAmounts: BigNumber[], orderFillableAmounts: BigNumber[],
liquidityDelivered: ReadonlyArray<CollapsedFill> | DexSample<MultiHopFillData>, liquidityDelivered: ReadonlyArray<CollapsedFill> | DexSample<MultiHopFillData>,
comparisonPrice?: BigNumber | undefined,
quoteRequestor?: QuoteRequestor, quoteRequestor?: QuoteRequestor,
): QuoteReport { ): QuoteReport {
const dexReportSourcesConsidered = dexQuotes.map(quote => _dexSampleToReportSource(quote, marketOperation)); const dexReportSourcesConsidered = dexQuotes.map(quote => _dexSampleToReportSource(quote, marketOperation));
const nativeOrderSourcesConsidered = nativeOrders.map((order, idx) => const nativeOrderSourcesConsidered = nativeOrders.map((order, idx) =>
_nativeOrderToReportSource(order, orderFillableAmounts[idx], quoteRequestor), _nativeOrderToReportSource(order, orderFillableAmounts[idx], comparisonPrice, quoteRequestor),
); );
const multiHopSourcesConsidered = multiHopQuotes.map(quote => const multiHopSourcesConsidered = multiHopQuotes.map(quote =>
_multiHopSampleToReportSource(quote, marketOperation), _multiHopSampleToReportSource(quote, marketOperation),
@ -94,6 +96,7 @@ export function generateQuoteReport(
return _nativeOrderToReportSource( return _nativeOrderToReportSource(
foundNativeOrder, foundNativeOrder,
nativeOrderSignaturesToFillableAmounts[foundNativeOrder.signature], nativeOrderSignaturesToFillableAmounts[foundNativeOrder.signature],
comparisonPrice,
quoteRequestor, quoteRequestor,
); );
} else { } else {
@ -197,6 +200,7 @@ function _nativeOrderFromCollapsedFill(cf: CollapsedFill): SignedOrder | undefin
function _nativeOrderToReportSource( function _nativeOrderToReportSource(
nativeOrder: SignedOrder, nativeOrder: SignedOrder,
fillableAmount: BigNumber, fillableAmount: BigNumber,
comparisonPrice?: BigNumber | undefined,
quoteRequestor?: QuoteRequestor, quoteRequestor?: QuoteRequestor,
): NativeRFQTReportSource | NativeOrderbookReportSource { ): NativeRFQTReportSource | NativeOrderbookReportSource {
const nativeOrderBase: NativeReportSourceBase = { const nativeOrderBase: NativeReportSourceBase = {
@ -215,6 +219,9 @@ function _nativeOrderToReportSource(
isRfqt: true, isRfqt: true,
makerUri: foundRfqtMakerUri, makerUri: foundRfqtMakerUri,
}; };
if (comparisonPrice) {
rfqtSource.comparisonPrice = comparisonPrice.toNumber();
}
return rfqtSource; return rfqtSource;
} else { } else {
// if it's not an rfqt order, treat as normal // if it's not an rfqt order, treat as normal

View File

@ -141,6 +141,7 @@ describe('generateQuoteReport', async () => {
nativeOrders, nativeOrders,
orderFillableAmounts, orderFillableAmounts,
pathGenerated, pathGenerated,
undefined,
quoteRequestor.object, quoteRequestor.object,
); );