asset-swapper: Quote report pass back optional fill data (#2702)

* ADDS quote report: pass back optional fill data for dex samples

* ADDS return fillData for Multihop in quote report

* FIXES quote report generator tests handle passing back fillData

* FIXES typing multi hop report source will always have fillData

* ADDS asset-swapper CHANGELOG entry
This commit is contained in:
Kim Persson 2020-09-24 15:06:44 +02:00 committed by GitHub
parent f2507cb94a
commit 5f570b772d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 13 deletions

View File

@ -121,6 +121,10 @@
{
"note": "Added `Curve` Tripool",
"pr": 2708
},
{
"note": "Pass back fillData from quote reporter",
"pr": 2702
}
]
},

View File

@ -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<ERC20BridgeSource, ERC20BridgeSource.Native>;
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 {

View File

@ -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,11 +368,7 @@ describe('generateQuoteReport', async () => {
takerAssetAmount: orderbookOrder1FillableAmount.plus(101),
});
const twoHopSample: DexSample<MultiHopFillData> = {
source: ERC20BridgeSource.MultiHop,
input: new BigNumber(3005),
output: new BigNumber(3006),
fillData: {
const twoHopFillData: MultiHopFillData = {
intermediateToken: hexUtils.random(20),
firstHopSource: {
source: ERC20BridgeSource.Balancer,
@ -371,7 +380,13 @@ describe('generateQuoteReport', async () => {
encodeCall: () => '',
handleCallResults: _callResults => [new BigNumber(1337)],
},
},
};
const twoHopSample: DexSample<MultiHopFillData> = {
source: ERC20BridgeSource.MultiHop,
input: new BigNumber(3005),
output: new BigNumber(3006),
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];