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:
parent
f2507cb94a
commit
5f570b772d
@ -121,6 +121,10 @@
|
|||||||
{
|
{
|
||||||
"note": "Added `Curve` Tripool",
|
"note": "Added `Curve` Tripool",
|
||||||
"pr": 2708
|
"pr": 2708
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Pass back fillData from quote reporter",
|
||||||
|
"pr": 2702
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -8,6 +8,7 @@ import {
|
|||||||
CollapsedFill,
|
CollapsedFill,
|
||||||
DexSample,
|
DexSample,
|
||||||
ERC20BridgeSource,
|
ERC20BridgeSource,
|
||||||
|
FillData,
|
||||||
MultiHopFillData,
|
MultiHopFillData,
|
||||||
NativeCollapsedFill,
|
NativeCollapsedFill,
|
||||||
} from './market_operation_utils/types';
|
} from './market_operation_utils/types';
|
||||||
@ -17,6 +18,7 @@ export interface BridgeReportSource {
|
|||||||
liquiditySource: Exclude<ERC20BridgeSource, ERC20BridgeSource.Native>;
|
liquiditySource: Exclude<ERC20BridgeSource, ERC20BridgeSource.Native>;
|
||||||
makerAmount: BigNumber;
|
makerAmount: BigNumber;
|
||||||
takerAmount: BigNumber;
|
takerAmount: BigNumber;
|
||||||
|
fillData?: FillData;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MultiHopReportSource {
|
export interface MultiHopReportSource {
|
||||||
@ -24,6 +26,7 @@ export interface MultiHopReportSource {
|
|||||||
makerAmount: BigNumber;
|
makerAmount: BigNumber;
|
||||||
takerAmount: BigNumber;
|
takerAmount: BigNumber;
|
||||||
hopSources: ERC20BridgeSource[];
|
hopSources: ERC20BridgeSource[];
|
||||||
|
fillData: FillData;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface NativeReportSourceBase {
|
interface NativeReportSourceBase {
|
||||||
@ -120,12 +123,14 @@ function _dexSampleToReportSource(ds: DexSample, marketOperation: MarketOperatio
|
|||||||
makerAmount: ds.input,
|
makerAmount: ds.input,
|
||||||
takerAmount: ds.output,
|
takerAmount: ds.output,
|
||||||
liquiditySource,
|
liquiditySource,
|
||||||
|
fillData: ds.fillData,
|
||||||
};
|
};
|
||||||
} else if (marketOperation === MarketOperation.Sell) {
|
} else if (marketOperation === MarketOperation.Sell) {
|
||||||
return {
|
return {
|
||||||
makerAmount: ds.output,
|
makerAmount: ds.output,
|
||||||
takerAmount: ds.input,
|
takerAmount: ds.input,
|
||||||
liquiditySource,
|
liquiditySource,
|
||||||
|
fillData: ds.fillData,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Unexpected marketOperation ${marketOperation}`);
|
throw new Error(`Unexpected marketOperation ${marketOperation}`);
|
||||||
@ -144,6 +149,7 @@ function _multiHopSampleToReportSource(
|
|||||||
liquiditySource: ERC20BridgeSource.MultiHop,
|
liquiditySource: ERC20BridgeSource.MultiHop,
|
||||||
makerAmount: ds.input,
|
makerAmount: ds.input,
|
||||||
takerAmount: ds.output,
|
takerAmount: ds.output,
|
||||||
|
fillData: ds.fillData!,
|
||||||
hopSources: [firstHop.source, secondHop.source],
|
hopSources: [firstHop.source, secondHop.source],
|
||||||
};
|
};
|
||||||
} else if (marketOperation === MarketOperation.Sell) {
|
} else if (marketOperation === MarketOperation.Sell) {
|
||||||
@ -151,6 +157,7 @@ function _multiHopSampleToReportSource(
|
|||||||
liquiditySource: ERC20BridgeSource.MultiHop,
|
liquiditySource: ERC20BridgeSource.MultiHop,
|
||||||
makerAmount: ds.output,
|
makerAmount: ds.output,
|
||||||
takerAmount: ds.input,
|
takerAmount: ds.input,
|
||||||
|
fillData: ds.fillData!,
|
||||||
hopSources: [firstHop.source, secondHop.source],
|
hopSources: [firstHop.source, secondHop.source],
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
|
@ -56,21 +56,25 @@ describe('generateQuoteReport', async () => {
|
|||||||
source: ERC20BridgeSource.Kyber,
|
source: ERC20BridgeSource.Kyber,
|
||||||
input: new BigNumber(10000),
|
input: new BigNumber(10000),
|
||||||
output: new BigNumber(10001),
|
output: new BigNumber(10001),
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const kyberSample2: DexSample = {
|
const kyberSample2: DexSample = {
|
||||||
source: ERC20BridgeSource.Kyber,
|
source: ERC20BridgeSource.Kyber,
|
||||||
input: new BigNumber(10003),
|
input: new BigNumber(10003),
|
||||||
output: new BigNumber(10004),
|
output: new BigNumber(10004),
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const uniswapSample1: DexSample = {
|
const uniswapSample1: DexSample = {
|
||||||
source: ERC20BridgeSource.UniswapV2,
|
source: ERC20BridgeSource.UniswapV2,
|
||||||
input: new BigNumber(10003),
|
input: new BigNumber(10003),
|
||||||
output: new BigNumber(10004),
|
output: new BigNumber(10004),
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const uniswapSample2: DexSample = {
|
const uniswapSample2: DexSample = {
|
||||||
source: ERC20BridgeSource.UniswapV2,
|
source: ERC20BridgeSource.UniswapV2,
|
||||||
input: new BigNumber(10005),
|
input: new BigNumber(10005),
|
||||||
output: new BigNumber(10006),
|
output: new BigNumber(10006),
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const dexQuotes: DexSample[] = [kyberSample1, kyberSample2, uniswapSample1, uniswapSample2];
|
const dexQuotes: DexSample[] = [kyberSample1, kyberSample2, uniswapSample1, uniswapSample2];
|
||||||
|
|
||||||
@ -178,21 +182,25 @@ describe('generateQuoteReport', async () => {
|
|||||||
liquiditySource: ERC20BridgeSource.UniswapV2,
|
liquiditySource: ERC20BridgeSource.UniswapV2,
|
||||||
makerAmount: uniswapSample1.output,
|
makerAmount: uniswapSample1.output,
|
||||||
takerAmount: uniswapSample1.input,
|
takerAmount: uniswapSample1.input,
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const uniswap2Source: BridgeReportSource = {
|
const uniswap2Source: BridgeReportSource = {
|
||||||
liquiditySource: ERC20BridgeSource.UniswapV2,
|
liquiditySource: ERC20BridgeSource.UniswapV2,
|
||||||
makerAmount: uniswapSample2.output,
|
makerAmount: uniswapSample2.output,
|
||||||
takerAmount: uniswapSample2.input,
|
takerAmount: uniswapSample2.input,
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const kyber1Source: BridgeReportSource = {
|
const kyber1Source: BridgeReportSource = {
|
||||||
liquiditySource: ERC20BridgeSource.Kyber,
|
liquiditySource: ERC20BridgeSource.Kyber,
|
||||||
makerAmount: kyberSample1.output,
|
makerAmount: kyberSample1.output,
|
||||||
takerAmount: kyberSample1.input,
|
takerAmount: kyberSample1.input,
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const kyber2Source: BridgeReportSource = {
|
const kyber2Source: BridgeReportSource = {
|
||||||
liquiditySource: ERC20BridgeSource.Kyber,
|
liquiditySource: ERC20BridgeSource.Kyber,
|
||||||
makerAmount: kyberSample2.output,
|
makerAmount: kyberSample2.output,
|
||||||
takerAmount: kyberSample2.input,
|
takerAmount: kyberSample2.input,
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
const expectedSourcesConsidered: QuoteReportSource[] = [
|
const expectedSourcesConsidered: QuoteReportSource[] = [
|
||||||
@ -246,11 +254,13 @@ describe('generateQuoteReport', async () => {
|
|||||||
source: ERC20BridgeSource.Kyber,
|
source: ERC20BridgeSource.Kyber,
|
||||||
input: new BigNumber(10000),
|
input: new BigNumber(10000),
|
||||||
output: new BigNumber(10001),
|
output: new BigNumber(10001),
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const uniswapSample1: DexSample = {
|
const uniswapSample1: DexSample = {
|
||||||
source: ERC20BridgeSource.UniswapV2,
|
source: ERC20BridgeSource.UniswapV2,
|
||||||
input: new BigNumber(10003),
|
input: new BigNumber(10003),
|
||||||
output: new BigNumber(10004),
|
output: new BigNumber(10004),
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const dexQuotes: DexSample[] = [kyberSample1, uniswapSample1];
|
const dexQuotes: DexSample[] = [kyberSample1, uniswapSample1];
|
||||||
|
|
||||||
@ -302,11 +312,13 @@ describe('generateQuoteReport', async () => {
|
|||||||
liquiditySource: ERC20BridgeSource.UniswapV2,
|
liquiditySource: ERC20BridgeSource.UniswapV2,
|
||||||
makerAmount: uniswapSample1.input,
|
makerAmount: uniswapSample1.input,
|
||||||
takerAmount: uniswapSample1.output,
|
takerAmount: uniswapSample1.output,
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const kyber1Source: BridgeReportSource = {
|
const kyber1Source: BridgeReportSource = {
|
||||||
liquiditySource: ERC20BridgeSource.Kyber,
|
liquiditySource: ERC20BridgeSource.Kyber,
|
||||||
makerAmount: kyberSample1.input,
|
makerAmount: kyberSample1.input,
|
||||||
takerAmount: kyberSample1.output,
|
takerAmount: kyberSample1.output,
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
const expectedSourcesConsidered: QuoteReportSource[] = [
|
const expectedSourcesConsidered: QuoteReportSource[] = [
|
||||||
@ -347,6 +359,7 @@ describe('generateQuoteReport', async () => {
|
|||||||
source: ERC20BridgeSource.Kyber,
|
source: ERC20BridgeSource.Kyber,
|
||||||
input: new BigNumber(10000),
|
input: new BigNumber(10000),
|
||||||
output: new BigNumber(10001),
|
output: new BigNumber(10001),
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
const orderbookOrder1FillableAmount = new BigNumber(1000);
|
const orderbookOrder1FillableAmount = new BigNumber(1000);
|
||||||
@ -355,23 +368,25 @@ describe('generateQuoteReport', async () => {
|
|||||||
takerAssetAmount: orderbookOrder1FillableAmount.plus(101),
|
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<MultiHopFillData> = {
|
const twoHopSample: DexSample<MultiHopFillData> = {
|
||||||
source: ERC20BridgeSource.MultiHop,
|
source: ERC20BridgeSource.MultiHop,
|
||||||
input: new BigNumber(3005),
|
input: new BigNumber(3005),
|
||||||
output: new BigNumber(3006),
|
output: new BigNumber(3006),
|
||||||
fillData: {
|
fillData: twoHopFillData,
|
||||||
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 orderReport = generateQuoteReport(
|
const orderReport = generateQuoteReport(
|
||||||
@ -394,12 +409,14 @@ describe('generateQuoteReport', async () => {
|
|||||||
liquiditySource: ERC20BridgeSource.Kyber,
|
liquiditySource: ERC20BridgeSource.Kyber,
|
||||||
makerAmount: kyberSample1.output,
|
makerAmount: kyberSample1.output,
|
||||||
takerAmount: kyberSample1.input,
|
takerAmount: kyberSample1.input,
|
||||||
|
fillData: {},
|
||||||
};
|
};
|
||||||
const twoHopSource: MultiHopReportSource = {
|
const twoHopSource: MultiHopReportSource = {
|
||||||
liquiditySource: ERC20BridgeSource.MultiHop,
|
liquiditySource: ERC20BridgeSource.MultiHop,
|
||||||
makerAmount: twoHopSample.output,
|
makerAmount: twoHopSample.output,
|
||||||
takerAmount: twoHopSample.input,
|
takerAmount: twoHopSample.input,
|
||||||
hopSources: [ERC20BridgeSource.Balancer, ERC20BridgeSource.Curve],
|
hopSources: [ERC20BridgeSource.Balancer, ERC20BridgeSource.Curve],
|
||||||
|
fillData: twoHopFillData,
|
||||||
};
|
};
|
||||||
|
|
||||||
const expectedSourcesConsidered: QuoteReportSource[] = [kyber1Source, orderbookOrder1Source, twoHopSource];
|
const expectedSourcesConsidered: QuoteReportSource[] = [kyber1Source, orderbookOrder1Source, twoHopSource];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user