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

View File

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

View File

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