diff --git a/packages/asset-swapper/CHANGELOG.json b/packages/asset-swapper/CHANGELOG.json index ce461d80ff..29a521bd58 100644 --- a/packages/asset-swapper/CHANGELOG.json +++ b/packages/asset-swapper/CHANGELOG.json @@ -121,6 +121,10 @@ { "note": "Added `Curve` Tripool", "pr": 2708 + }, + { + "note": "Pass back fillData from quote reporter", + "pr": 2702 } ] }, diff --git a/packages/asset-swapper/src/utils/quote_report_generator.ts b/packages/asset-swapper/src/utils/quote_report_generator.ts index 4884540431..81fce3c0f0 100644 --- a/packages/asset-swapper/src/utils/quote_report_generator.ts +++ b/packages/asset-swapper/src/utils/quote_report_generator.ts @@ -8,6 +8,7 @@ import { CollapsedFill, DexSample, ERC20BridgeSource, + FillData, MultiHopFillData, NativeCollapsedFill, } from './market_operation_utils/types'; @@ -17,6 +18,7 @@ export interface BridgeReportSource { liquiditySource: Exclude; makerAmount: BigNumber; takerAmount: BigNumber; + fillData?: FillData; } export interface MultiHopReportSource { @@ -24,6 +26,7 @@ export interface MultiHopReportSource { makerAmount: BigNumber; takerAmount: BigNumber; hopSources: ERC20BridgeSource[]; + fillData: FillData; } interface NativeReportSourceBase { @@ -120,12 +123,14 @@ function _dexSampleToReportSource(ds: DexSample, marketOperation: MarketOperatio makerAmount: ds.input, takerAmount: ds.output, liquiditySource, + fillData: ds.fillData, }; } else if (marketOperation === MarketOperation.Sell) { return { makerAmount: ds.output, takerAmount: ds.input, liquiditySource, + fillData: ds.fillData, }; } else { throw new Error(`Unexpected marketOperation ${marketOperation}`); @@ -144,6 +149,7 @@ function _multiHopSampleToReportSource( liquiditySource: ERC20BridgeSource.MultiHop, makerAmount: ds.input, takerAmount: ds.output, + fillData: ds.fillData!, hopSources: [firstHop.source, secondHop.source], }; } else if (marketOperation === MarketOperation.Sell) { @@ -151,6 +157,7 @@ function _multiHopSampleToReportSource( liquiditySource: ERC20BridgeSource.MultiHop, makerAmount: ds.output, takerAmount: ds.input, + fillData: ds.fillData!, hopSources: [firstHop.source, secondHop.source], }; } else { diff --git a/packages/asset-swapper/test/quote_report_generator_test.ts b/packages/asset-swapper/test/quote_report_generator_test.ts index 51c45c9866..16eb3a3457 100644 --- a/packages/asset-swapper/test/quote_report_generator_test.ts +++ b/packages/asset-swapper/test/quote_report_generator_test.ts @@ -56,21 +56,25 @@ describe('generateQuoteReport', async () => { source: ERC20BridgeSource.Kyber, input: new BigNumber(10000), output: new BigNumber(10001), + fillData: {}, }; const kyberSample2: DexSample = { source: ERC20BridgeSource.Kyber, input: new BigNumber(10003), output: new BigNumber(10004), + fillData: {}, }; const uniswapSample1: DexSample = { source: ERC20BridgeSource.UniswapV2, input: new BigNumber(10003), output: new BigNumber(10004), + fillData: {}, }; const uniswapSample2: DexSample = { source: ERC20BridgeSource.UniswapV2, input: new BigNumber(10005), output: new BigNumber(10006), + fillData: {}, }; const dexQuotes: DexSample[] = [kyberSample1, kyberSample2, uniswapSample1, uniswapSample2]; @@ -178,21 +182,25 @@ describe('generateQuoteReport', async () => { liquiditySource: ERC20BridgeSource.UniswapV2, makerAmount: uniswapSample1.output, takerAmount: uniswapSample1.input, + fillData: {}, }; const uniswap2Source: BridgeReportSource = { liquiditySource: ERC20BridgeSource.UniswapV2, makerAmount: uniswapSample2.output, takerAmount: uniswapSample2.input, + fillData: {}, }; const kyber1Source: BridgeReportSource = { liquiditySource: ERC20BridgeSource.Kyber, makerAmount: kyberSample1.output, takerAmount: kyberSample1.input, + fillData: {}, }; const kyber2Source: BridgeReportSource = { liquiditySource: ERC20BridgeSource.Kyber, makerAmount: kyberSample2.output, takerAmount: kyberSample2.input, + fillData: {}, }; const expectedSourcesConsidered: QuoteReportSource[] = [ @@ -246,11 +254,13 @@ describe('generateQuoteReport', async () => { source: ERC20BridgeSource.Kyber, input: new BigNumber(10000), output: new BigNumber(10001), + fillData: {}, }; const uniswapSample1: DexSample = { source: ERC20BridgeSource.UniswapV2, input: new BigNumber(10003), output: new BigNumber(10004), + fillData: {}, }; const dexQuotes: DexSample[] = [kyberSample1, uniswapSample1]; @@ -302,11 +312,13 @@ describe('generateQuoteReport', async () => { liquiditySource: ERC20BridgeSource.UniswapV2, makerAmount: uniswapSample1.input, takerAmount: uniswapSample1.output, + fillData: {}, }; const kyber1Source: BridgeReportSource = { liquiditySource: ERC20BridgeSource.Kyber, makerAmount: kyberSample1.input, takerAmount: kyberSample1.output, + fillData: {}, }; const expectedSourcesConsidered: QuoteReportSource[] = [ @@ -347,6 +359,7 @@ describe('generateQuoteReport', async () => { source: ERC20BridgeSource.Kyber, input: new BigNumber(10000), output: new BigNumber(10001), + fillData: {}, }; const orderbookOrder1FillableAmount = new BigNumber(1000); @@ -355,23 +368,25 @@ describe('generateQuoteReport', async () => { takerAssetAmount: orderbookOrder1FillableAmount.plus(101), }); + const twoHopFillData: MultiHopFillData = { + intermediateToken: hexUtils.random(20), + firstHopSource: { + source: ERC20BridgeSource.Balancer, + encodeCall: () => '', + handleCallResults: _callResults => [new BigNumber(1337)], + }, + secondHopSource: { + source: ERC20BridgeSource.Curve, + encodeCall: () => '', + handleCallResults: _callResults => [new BigNumber(1337)], + }, + }; + const twoHopSample: DexSample = { source: ERC20BridgeSource.MultiHop, input: new BigNumber(3005), output: new BigNumber(3006), - fillData: { - intermediateToken: hexUtils.random(20), - firstHopSource: { - source: ERC20BridgeSource.Balancer, - encodeCall: () => '', - handleCallResults: _callResults => [new BigNumber(1337)], - }, - secondHopSource: { - source: ERC20BridgeSource.Curve, - encodeCall: () => '', - handleCallResults: _callResults => [new BigNumber(1337)], - }, - }, + fillData: twoHopFillData, }; const orderReport = generateQuoteReport( @@ -394,12 +409,14 @@ describe('generateQuoteReport', async () => { liquiditySource: ERC20BridgeSource.Kyber, makerAmount: kyberSample1.output, takerAmount: kyberSample1.input, + fillData: {}, }; const twoHopSource: MultiHopReportSource = { liquiditySource: ERC20BridgeSource.MultiHop, makerAmount: twoHopSample.output, takerAmount: twoHopSample.input, hopSources: [ERC20BridgeSource.Balancer, ERC20BridgeSource.Curve], + fillData: twoHopFillData, }; const expectedSourcesConsidered: QuoteReportSource[] = [kyber1Source, orderbookOrder1Source, twoHopSource];