@xspswap/smart-order-router 1.1.4 → 1.2.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/build/main/providers/caching-token-provider.js +2 -2
- package/build/main/providers/on-chain-quote-provider.js +2 -1
- package/build/main/providers/token-provider.d.ts +7 -12
- package/build/main/providers/token-provider.js +11 -26
- package/build/main/providers/v2/caching-pool-provider.js +1 -1
- package/build/main/providers/v2/pool-provider.d.ts +12 -3
- package/build/main/providers/v2/pool-provider.js +11 -10
- package/build/main/providers/v2/quote-provider.js +2 -2
- package/build/main/providers/v2/static-subgraph-provider.js +4 -16
- package/build/main/providers/v2/subgraph-provider-with-fallback.js +2 -1
- package/build/main/providers/v2-fathom/constants.d.ts +2 -0
- package/build/main/providers/v2-fathom/constants.js +6 -0
- package/build/main/providers/v2-fathom/static-subgraph-provider.d.ts +23 -0
- package/build/main/providers/v2-fathom/static-subgraph-provider.js +170 -0
- package/build/main/providers/v2-fathom/subgraph-provider.d.ts +35 -0
- package/build/main/providers/v2-fathom/subgraph-provider.js +130 -0
- package/build/main/providers/v2-fathom/utils.d.ts +2 -0
- package/build/main/providers/v2-fathom/utils.js +14 -0
- package/build/main/providers/v3/pool-provider.js +3 -2
- package/build/main/providers/v3/static-subgraph-provider.js +33 -82
- package/build/main/routers/alpha-router/alpha-router.d.ts +10 -2
- package/build/main/routers/alpha-router/alpha-router.js +43 -14
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.d.ts +4 -3
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.js +3 -3
- package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +2 -1
- package/build/main/routers/alpha-router/functions/compute-all-routes.js +3 -3
- package/build/main/routers/alpha-router/functions/get-candidate-pools.d.ts +2 -1
- package/build/main/routers/alpha-router/functions/get-candidate-pools.js +11 -3
- package/build/main/routers/alpha-router/quoters/base-quoter.d.ts +3 -1
- package/build/main/routers/alpha-router/quoters/base-quoter.js +3 -2
- package/build/main/routers/alpha-router/quoters/mixed-quoter.js +3 -2
- package/build/main/routers/alpha-router/quoters/v2-quoter.d.ts +2 -1
- package/build/main/routers/alpha-router/quoters/v2-quoter.js +10 -4
- package/build/main/routers/alpha-router/quoters/v3-quoter.js +3 -2
- package/build/main/routers/legacy-router/legacy-router.js +1 -1
- package/build/main/routers/router.d.ts +5 -3
- package/build/main/routers/router.js +5 -5
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/main/util/gas-factory-helpers.d.ts +1 -1
- package/build/main/util/gas-factory-helpers.js +4 -2
- package/build/main/util/methodParameters.js +3 -2
- package/build/main/util/protocols.js +3 -1
- package/build/main/util/routes.js +5 -2
- package/build/module/providers/caching-token-provider.js +3 -3
- package/build/module/providers/on-chain-quote-provider.js +2 -1
- package/build/module/providers/token-provider.d.ts +7 -12
- package/build/module/providers/token-provider.js +10 -24
- package/build/module/providers/v2/caching-pool-provider.js +1 -1
- package/build/module/providers/v2/pool-provider.d.ts +12 -3
- package/build/module/providers/v2/pool-provider.js +11 -10
- package/build/module/providers/v2/quote-provider.js +2 -2
- package/build/module/providers/v2/static-subgraph-provider.js +5 -17
- package/build/module/providers/v2/subgraph-provider-with-fallback.js +2 -1
- package/build/module/providers/v2-fathom/constants.d.ts +2 -0
- package/build/module/providers/v2-fathom/constants.js +3 -0
- package/build/module/providers/v2-fathom/static-subgraph-provider.d.ts +23 -0
- package/build/module/providers/v2-fathom/static-subgraph-provider.js +163 -0
- package/build/module/providers/v2-fathom/subgraph-provider.d.ts +35 -0
- package/build/module/providers/v2-fathom/subgraph-provider.js +131 -0
- package/build/module/providers/v2-fathom/utils.d.ts +2 -0
- package/build/module/providers/v2-fathom/utils.js +10 -0
- package/build/module/providers/v3/pool-provider.js +3 -2
- package/build/module/providers/v3/static-subgraph-provider.js +34 -83
- package/build/module/routers/alpha-router/alpha-router.d.ts +10 -2
- package/build/module/routers/alpha-router/alpha-router.js +43 -14
- package/build/module/routers/alpha-router/entities/route-with-valid-quote.d.ts +4 -3
- package/build/module/routers/alpha-router/entities/route-with-valid-quote.js +3 -3
- package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +2 -1
- package/build/module/routers/alpha-router/functions/compute-all-routes.js +3 -3
- package/build/module/routers/alpha-router/functions/get-candidate-pools.d.ts +2 -1
- package/build/module/routers/alpha-router/functions/get-candidate-pools.js +11 -3
- package/build/module/routers/alpha-router/quoters/base-quoter.d.ts +3 -1
- package/build/module/routers/alpha-router/quoters/base-quoter.js +3 -2
- package/build/module/routers/alpha-router/quoters/mixed-quoter.js +3 -2
- package/build/module/routers/alpha-router/quoters/v2-quoter.d.ts +2 -1
- package/build/module/routers/alpha-router/quoters/v2-quoter.js +10 -4
- package/build/module/routers/alpha-router/quoters/v3-quoter.js +3 -2
- package/build/module/routers/legacy-router/legacy-router.js +2 -2
- package/build/module/routers/router.d.ts +5 -3
- package/build/module/routers/router.js +5 -5
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/build/module/util/gas-factory-helpers.d.ts +1 -1
- package/build/module/util/gas-factory-helpers.js +5 -3
- package/build/module/util/methodParameters.js +5 -4
- package/build/module/util/protocols.js +3 -1
- package/build/module/util/routes.js +5 -2
- package/package.json +7 -7
|
@@ -2,28 +2,16 @@ import { Pair } from '@x-swap-protocol/v2-sdk';
|
|
|
2
2
|
import _ from 'lodash';
|
|
3
3
|
import { ChainId, WRAPPED_NATIVE_CURRENCY } from '../../util/chains';
|
|
4
4
|
import { log } from '../../util/log';
|
|
5
|
-
import {
|
|
5
|
+
import { PLI_XDC, WXDC_XDC, XSP_XDC } from '../token-provider';
|
|
6
6
|
const BASES_TO_CHECK_TRADES_AGAINST = {
|
|
7
|
-
[ChainId.XDC]: [WRAPPED_NATIVE_CURRENCY[ChainId.XDC]
|
|
7
|
+
[ChainId.XDC]: [WRAPPED_NATIVE_CURRENCY[ChainId.XDC]],
|
|
8
8
|
[ChainId.XDC_APOTHEM]: [],
|
|
9
9
|
};
|
|
10
10
|
const ADDITIONAL_BASES = {
|
|
11
11
|
[ChainId.XDC]: {
|
|
12
|
-
[WXDC_XDC.address]: [
|
|
13
|
-
|
|
14
|
-
XSP_XDC,
|
|
15
|
-
USDT_XDC,
|
|
16
|
-
PLI_XDC,
|
|
17
|
-
BIC_XDC,
|
|
18
|
-
PRNT_XDC,
|
|
19
|
-
],
|
|
20
|
-
[XTT_XDC.address]: [WXDC_XDC, XSP_XDC],
|
|
21
|
-
[XSP_XDC.address]: [WXDC_XDC, XTT_XDC, PLI_XDC],
|
|
22
|
-
[USDT_XDC.address]: [WXDC_XDC, BIC_XDC, SRX_XDC],
|
|
23
|
-
[BIC_XDC.address]: [WXDC_XDC, USDT_XDC],
|
|
12
|
+
[WXDC_XDC.address]: [XSP_XDC, PLI_XDC],
|
|
13
|
+
[XSP_XDC.address]: [WXDC_XDC],
|
|
24
14
|
[PLI_XDC.address]: [WXDC_XDC],
|
|
25
|
-
[WTK_XDC.address]: [WXDC_XDC],
|
|
26
|
-
[PRNT_XDC.address]: [WXDC_XDC],
|
|
27
15
|
},
|
|
28
16
|
[ChainId.XDC_APOTHEM]: {},
|
|
29
17
|
};
|
|
@@ -169,4 +157,4 @@ export class StaticV2SubgraphProvider {
|
|
|
169
157
|
return subgraphPools;
|
|
170
158
|
}
|
|
171
159
|
}
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy92Mi9zdGF0aWMtc3ViZ3JhcGgtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9DLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBUS9ELE1BQU0sNkJBQTZCLEdBQW1CO0lBQ3BELENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUU7Q0FDMUIsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBRWxCO0lBQ0YsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDYixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7UUFDdEMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDN0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7S0FDOUI7SUFDRCxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFO0NBQzFCLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFckUs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
|
|
@@ -17,6 +17,7 @@ export class V2SubgraphProviderWithFallBacks {
|
|
|
17
17
|
async getPools(tokenIn, tokenOut, providerConfig) {
|
|
18
18
|
for (let i = 0; i < this.fallbacks.length; i++) {
|
|
19
19
|
const provider = this.fallbacks[i];
|
|
20
|
+
console.log(provider);
|
|
20
21
|
try {
|
|
21
22
|
const pools = await provider.getPools(tokenIn, tokenOut, providerConfig);
|
|
22
23
|
return pools;
|
|
@@ -28,4 +29,4 @@ export class V2SubgraphProviderWithFallBacks {
|
|
|
28
29
|
throw new Error('Failed to get subgraph pools from any providers');
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZ3JhcGgtcHJvdmlkZXItd2l0aC1mYWxsYmFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjIvc3ViZ3JhcGgtcHJvdmlkZXItd2l0aC1mYWxsYmFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBS2pDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTywrQkFBK0I7SUFDMUM7OztPQUdHO0lBQ0gsWUFBb0IsU0FBZ0M7UUFBaEMsY0FBUyxHQUFULFNBQVMsQ0FBdUI7SUFBRyxDQUFDO0lBRWpELEtBQUssQ0FBQyxRQUFRLENBQ25CLE9BQWUsRUFDZixRQUFnQixFQUNoQixjQUErQjtRQUUvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RCLElBQUk7Z0JBQ0YsTUFBTSxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUNuQyxPQUFPLEVBQ1AsUUFBUSxFQUNSLGNBQWMsQ0FDZixDQUFDO2dCQUNGLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixHQUFHLENBQUMsSUFBSSxDQUFDLHNEQUFzRCxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3JFO1NBQ0Y7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export const FATHOM_INIT_CODE_HASH = '0xa6d23746864049fd29713adbbf145eeecdddd2f9a91be053c057394dd5d7d9ad';
|
|
2
|
+
export const FATHOM_FACTORY_ADDRESS = '0x9fAb572F75008A42c6aF80b36Ab20C76a38ABc4B';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy92Mi1mYXRob20vY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUNoQyxvRUFBb0UsQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FDakMsNENBQTRDLENBQUMifQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Token } from '@x-swap-protocol/sdk-core';
|
|
2
|
+
import { ChainId } from '../../util/chains';
|
|
3
|
+
import { IV2SubgraphProvider, V2SubgraphPool } from './subgraph-provider';
|
|
4
|
+
export declare const V2_XDC_ADDITIONAL_BASES: {
|
|
5
|
+
[tokenAddress: string]: Token[];
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Provider that does not get data from an external source and instead returns
|
|
9
|
+
* a hardcoded list of Subgraph pools.
|
|
10
|
+
*
|
|
11
|
+
* Since the pools are hardcoded, the liquidity/price values are dummys and should not
|
|
12
|
+
* be depended on.
|
|
13
|
+
*
|
|
14
|
+
* Useful for instances where other data sources are unavailable. E.g. subgraph not available.
|
|
15
|
+
*
|
|
16
|
+
* @export
|
|
17
|
+
* @class StaticV2SubgraphProvider
|
|
18
|
+
*/
|
|
19
|
+
export declare class StaticV2FathomSubgraphProvider implements IV2SubgraphProvider {
|
|
20
|
+
private chainId;
|
|
21
|
+
constructor(chainId: ChainId);
|
|
22
|
+
getPools(tokenIn?: Token, tokenOut?: Token): Promise<V2SubgraphPool[]>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { ChainId } from '../../util/chains';
|
|
3
|
+
import { log } from '../../util/log';
|
|
4
|
+
import { EURS_XDC, FXD_XDC, PLI_XDC, USDT_XDC, WXDC_XDC, } from '../token-provider';
|
|
5
|
+
import { getFathomPoolAddress } from './utils';
|
|
6
|
+
const BASES_TO_CHECK_TRADES_AGAINST = {
|
|
7
|
+
[ChainId.XDC]: [WXDC_XDC, FXD_XDC],
|
|
8
|
+
[ChainId.XDC_APOTHEM]: [],
|
|
9
|
+
};
|
|
10
|
+
const ADDITIONAL_BASES = {
|
|
11
|
+
[ChainId.XDC]: {
|
|
12
|
+
[WXDC_XDC.address]: [USDT_XDC, FXD_XDC],
|
|
13
|
+
[FXD_XDC.address]: [WXDC_XDC, USDT_XDC, EURS_XDC],
|
|
14
|
+
[USDT_XDC.address]: [WXDC_XDC, FXD_XDC],
|
|
15
|
+
[EURS_XDC.address]: [FXD_XDC],
|
|
16
|
+
[PLI_XDC.address]: [WXDC_XDC],
|
|
17
|
+
},
|
|
18
|
+
[ChainId.XDC_APOTHEM]: {},
|
|
19
|
+
};
|
|
20
|
+
export const V2_XDC_ADDITIONAL_BASES = ADDITIONAL_BASES[ChainId.XDC];
|
|
21
|
+
let paths = [];
|
|
22
|
+
const recFinder = (path, used, lastToken, dest, hops) => {
|
|
23
|
+
const hop = path.length;
|
|
24
|
+
if (hop < hops) {
|
|
25
|
+
if (!lastToken) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const additional = V2_XDC_ADDITIONAL_BASES[lastToken.address];
|
|
29
|
+
if (additional) {
|
|
30
|
+
for (const ad of additional) {
|
|
31
|
+
const adToken = ad;
|
|
32
|
+
const newPair = [lastToken, adToken];
|
|
33
|
+
const newPath = [...path, newPair];
|
|
34
|
+
if (adToken.address === dest.address) {
|
|
35
|
+
paths.push(newPath);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (!used[adToken.address]) {
|
|
39
|
+
recFinder(newPath, { ...used, [adToken.address]: true }, adToken, dest, hops);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Provider that does not get data from an external source and instead returns
|
|
47
|
+
* a hardcoded list of Subgraph pools.
|
|
48
|
+
*
|
|
49
|
+
* Since the pools are hardcoded, the liquidity/price values are dummys and should not
|
|
50
|
+
* be depended on.
|
|
51
|
+
*
|
|
52
|
+
* Useful for instances where other data sources are unavailable. E.g. subgraph not available.
|
|
53
|
+
*
|
|
54
|
+
* @export
|
|
55
|
+
* @class StaticV2SubgraphProvider
|
|
56
|
+
*/
|
|
57
|
+
export class StaticV2FathomSubgraphProvider {
|
|
58
|
+
constructor(chainId) {
|
|
59
|
+
this.chainId = chainId;
|
|
60
|
+
}
|
|
61
|
+
async getPools(tokenIn, tokenOut) {
|
|
62
|
+
paths = [];
|
|
63
|
+
log.info('In static subgraph provider for V2');
|
|
64
|
+
const bases = BASES_TO_CHECK_TRADES_AGAINST[this.chainId];
|
|
65
|
+
const basePairs = _.flatMap(bases, (base) => bases.map((otherBase) => [base, otherBase]));
|
|
66
|
+
let pairs = [];
|
|
67
|
+
if (tokenIn && tokenOut) {
|
|
68
|
+
const additionalIn = ADDITIONAL_BASES[this.chainId][tokenIn.address];
|
|
69
|
+
const additionalOut = ADDITIONAL_BASES[this.chainId][tokenOut.address];
|
|
70
|
+
if (!additionalIn || !additionalOut) {
|
|
71
|
+
basePairs.push([tokenIn, tokenOut]);
|
|
72
|
+
if (additionalIn) {
|
|
73
|
+
basePairs.push(...additionalIn.map((v) => [tokenIn, v]));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
basePairs.push(...bases.map((base) => [tokenIn, base]));
|
|
77
|
+
}
|
|
78
|
+
if (additionalOut) {
|
|
79
|
+
basePairs.push(...additionalOut.map((v) => [tokenOut, v]));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
basePairs.push(...bases.map((base) => [tokenOut, base]));
|
|
83
|
+
}
|
|
84
|
+
pairs = _(basePairs)
|
|
85
|
+
.filter((tokens) => Boolean(tokens[0] && tokens[1]))
|
|
86
|
+
.filter(([tokenA, tokenB]) => tokenA.address !== tokenB.address && !tokenA.equals(tokenB))
|
|
87
|
+
.flatMap(([tokenA, tokenB]) => {
|
|
88
|
+
const additionalA = ADDITIONAL_BASES[this.chainId][tokenA.address];
|
|
89
|
+
// const additionalB = ADDITIONAL_BASES[this.chainId][tokenB.address];
|
|
90
|
+
if (additionalA) {
|
|
91
|
+
const additionalPool = additionalA.filter((v) => v.address.toLowerCase() === tokenB.address.toLowerCase());
|
|
92
|
+
const res = additionalPool.map((v) => {
|
|
93
|
+
return [tokenA, v];
|
|
94
|
+
});
|
|
95
|
+
return res;
|
|
96
|
+
}
|
|
97
|
+
return [[tokenA, tokenB]];
|
|
98
|
+
})
|
|
99
|
+
.value();
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
recFinder([], { [tokenIn.address]: true }, tokenIn, tokenOut, 5);
|
|
103
|
+
// console.log(
|
|
104
|
+
// paths.map((path) =>
|
|
105
|
+
// path
|
|
106
|
+
// .map(
|
|
107
|
+
// (p) => `(${p[0].symbol} - ${p[1].symbol} : ${p[2] / 10000}% )`
|
|
108
|
+
// )
|
|
109
|
+
// .join(' --> ')
|
|
110
|
+
// )
|
|
111
|
+
// );
|
|
112
|
+
const uniquePairs = {};
|
|
113
|
+
paths.forEach((path) => {
|
|
114
|
+
path.forEach((pool) => {
|
|
115
|
+
const id = `${pool[0].address}-${pool[1].address}`;
|
|
116
|
+
uniquePairs[id] = pool;
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
const direct = tokenIn && tokenOut ? [[tokenIn, tokenOut]] : [];
|
|
120
|
+
pairs = [...Object.values(uniquePairs), ...direct];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// pairs = _(basePairs)
|
|
124
|
+
// .filter((tokens): tokens is [Token, Token] =>
|
|
125
|
+
// Boolean(tokens[0] && tokens[1])
|
|
126
|
+
// )
|
|
127
|
+
// .filter(
|
|
128
|
+
// ([tokenA, tokenB]) =>
|
|
129
|
+
// tokenA.address !== tokenB.address && !tokenA.equals(tokenB)
|
|
130
|
+
// )
|
|
131
|
+
// .value();
|
|
132
|
+
const poolAddressSet = new Set();
|
|
133
|
+
const subgraphPools = _(pairs)
|
|
134
|
+
.map(([tokenA, tokenB]) => {
|
|
135
|
+
const poolAddress = getFathomPoolAddress(tokenA, tokenB);
|
|
136
|
+
console.log(poolAddress);
|
|
137
|
+
if (poolAddressSet.has(poolAddress)) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
poolAddressSet.add(poolAddress);
|
|
141
|
+
const [token0, token1] = tokenA.sortsBefore(tokenB)
|
|
142
|
+
? [tokenA, tokenB]
|
|
143
|
+
: [tokenB, tokenA];
|
|
144
|
+
return {
|
|
145
|
+
id: poolAddress,
|
|
146
|
+
liquidity: '100',
|
|
147
|
+
token0: {
|
|
148
|
+
id: token0.address,
|
|
149
|
+
},
|
|
150
|
+
token1: {
|
|
151
|
+
id: token1.address,
|
|
152
|
+
},
|
|
153
|
+
supply: 100,
|
|
154
|
+
reserve: 100,
|
|
155
|
+
reserveUSD: 100,
|
|
156
|
+
};
|
|
157
|
+
})
|
|
158
|
+
.compact()
|
|
159
|
+
.value();
|
|
160
|
+
return subgraphPools;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy92Mi1mYXRob20vc3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxHQUNULE1BQU0sbUJBQW1CLENBQUM7QUFHM0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBTS9DLE1BQU0sNkJBQTZCLEdBQW1CO0lBQ3BELENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztJQUNsQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFO0NBQzFCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUVsQjtJQUNGLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQ3ZDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7UUFDakQsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQ3ZDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQzdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDO0tB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
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Token } from '@x-swap-protocol/sdk-core';
|
|
2
|
+
import { ChainId } from '../../util/chains';
|
|
3
|
+
import { ProviderConfig } from '../provider';
|
|
4
|
+
export interface V2SubgraphPool {
|
|
5
|
+
id: string;
|
|
6
|
+
token0: {
|
|
7
|
+
id: string;
|
|
8
|
+
};
|
|
9
|
+
token1: {
|
|
10
|
+
id: string;
|
|
11
|
+
};
|
|
12
|
+
supply: number;
|
|
13
|
+
reserve: number;
|
|
14
|
+
reserveUSD: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Provider for getting V2 pools from the Subgraph
|
|
18
|
+
*
|
|
19
|
+
* @export
|
|
20
|
+
* @interface IV2SubgraphProvider
|
|
21
|
+
*/
|
|
22
|
+
export interface IV2SubgraphProvider {
|
|
23
|
+
getPools(tokenIn?: Token, tokenOut?: Token, providerConfig?: ProviderConfig): Promise<V2SubgraphPool[]>;
|
|
24
|
+
}
|
|
25
|
+
export declare class V2SubgraphProvider implements IV2SubgraphProvider {
|
|
26
|
+
private chainId;
|
|
27
|
+
private subgraphUrl;
|
|
28
|
+
private retries;
|
|
29
|
+
private timeout;
|
|
30
|
+
private rollback;
|
|
31
|
+
private pageSize;
|
|
32
|
+
private client;
|
|
33
|
+
constructor(chainId: ChainId, subgraphUrl: string, retries?: number, timeout?: number, rollback?: boolean, pageSize?: number);
|
|
34
|
+
getPools(_tokenIn?: Token, _tokenOut?: Token, providerConfig?: ProviderConfig): Promise<V2SubgraphPool[]>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import retry from 'async-retry';
|
|
2
|
+
import Timeout from 'await-timeout';
|
|
3
|
+
import { gql, GraphQLClient } from 'graphql-request';
|
|
4
|
+
import _ from 'lodash';
|
|
5
|
+
import { log } from '../../util/log';
|
|
6
|
+
const threshold = 0.025;
|
|
7
|
+
const PAGE_SIZE = 1000; // 1k is max possible query size from subgraph.
|
|
8
|
+
export class V2SubgraphProvider {
|
|
9
|
+
constructor(chainId, subgraphUrl, retries = 2, timeout = 360000, rollback = true, pageSize = PAGE_SIZE) {
|
|
10
|
+
this.chainId = chainId;
|
|
11
|
+
this.subgraphUrl = subgraphUrl;
|
|
12
|
+
this.retries = retries;
|
|
13
|
+
this.timeout = timeout;
|
|
14
|
+
this.rollback = rollback;
|
|
15
|
+
this.pageSize = pageSize;
|
|
16
|
+
if (!subgraphUrl) {
|
|
17
|
+
throw new Error(`No subgraph url for chain id: ${this.chainId}`);
|
|
18
|
+
}
|
|
19
|
+
this.client = new GraphQLClient(this.subgraphUrl);
|
|
20
|
+
}
|
|
21
|
+
async getPools(_tokenIn, _tokenOut, providerConfig) {
|
|
22
|
+
let blockNumber = (providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber)
|
|
23
|
+
? await providerConfig.blockNumber
|
|
24
|
+
: undefined;
|
|
25
|
+
// Due to limitations with the Subgraph API this is the only way to parameterize the query.
|
|
26
|
+
const query2 = gql `
|
|
27
|
+
query getPools($pageSize: Int!, $id: String) {
|
|
28
|
+
pairs(
|
|
29
|
+
first: $pageSize
|
|
30
|
+
${blockNumber ? `block: { number: ${blockNumber} }` : ``}
|
|
31
|
+
where: { id_gt: $id }
|
|
32
|
+
) {
|
|
33
|
+
id
|
|
34
|
+
token0 { id, symbol }
|
|
35
|
+
token1 { id, symbol }
|
|
36
|
+
totalSupply
|
|
37
|
+
trackedReserveETH
|
|
38
|
+
reserveUSD
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
`;
|
|
42
|
+
let pools = [];
|
|
43
|
+
log.info(`Getting V2 pools from the subgraph with page size ${this.pageSize}${(providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber)
|
|
44
|
+
? ` as of block ${providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber}`
|
|
45
|
+
: ''}.`);
|
|
46
|
+
await retry(async () => {
|
|
47
|
+
const timeout = new Timeout();
|
|
48
|
+
const getPools = async () => {
|
|
49
|
+
let lastId = '';
|
|
50
|
+
let pairs = [];
|
|
51
|
+
let pairsPage = [];
|
|
52
|
+
do {
|
|
53
|
+
await retry(async () => {
|
|
54
|
+
const poolsResult = await this.client.request(query2, {
|
|
55
|
+
pageSize: this.pageSize,
|
|
56
|
+
id: lastId,
|
|
57
|
+
});
|
|
58
|
+
pairsPage = poolsResult.pairs;
|
|
59
|
+
pairs = pairs.concat(pairsPage);
|
|
60
|
+
lastId = pairs[pairs.length - 1].id;
|
|
61
|
+
}, {
|
|
62
|
+
retries: this.retries,
|
|
63
|
+
onRetry: (err, retry) => {
|
|
64
|
+
pools = [];
|
|
65
|
+
log.info({ err }, `Failed request for page of pools from subgraph. Retry attempt: ${retry}`);
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
} while (pairsPage.length > 0);
|
|
69
|
+
return pairs;
|
|
70
|
+
};
|
|
71
|
+
/* eslint-disable no-useless-catch */
|
|
72
|
+
try {
|
|
73
|
+
const getPoolsPromise = getPools();
|
|
74
|
+
const timerPromise = timeout.set(this.timeout).then(() => {
|
|
75
|
+
throw new Error(`Timed out getting pools from subgraph: ${this.timeout}`);
|
|
76
|
+
});
|
|
77
|
+
pools = await Promise.race([getPoolsPromise, timerPromise]);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
timeout.clear();
|
|
85
|
+
}
|
|
86
|
+
/* eslint-enable no-useless-catch */
|
|
87
|
+
}, {
|
|
88
|
+
retries: this.retries,
|
|
89
|
+
onRetry: (err, retry) => {
|
|
90
|
+
if (this.rollback &&
|
|
91
|
+
blockNumber &&
|
|
92
|
+
_.includes(err.message, 'indexed up to')) {
|
|
93
|
+
blockNumber = blockNumber - 10;
|
|
94
|
+
log.info(`Detected subgraph indexing error. Rolled back block number to: ${blockNumber}`);
|
|
95
|
+
}
|
|
96
|
+
pools = [];
|
|
97
|
+
log.info({ err }, `Failed to get pools from subgraph. Retry attempt: ${retry}`);
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
// Filter pools that have tracked reserve ETH less than threshold.
|
|
101
|
+
// trackedReserveETH filters pools that do not involve a pool from this allowlist:
|
|
102
|
+
// https://github.com/Uniswap/v2-subgraph/blob/7c82235cad7aee4cfce8ea82f0030af3d224833e/src/mappings/pricing.ts#L43
|
|
103
|
+
// Which helps filter pools with manipulated prices/liquidity.
|
|
104
|
+
// TODO: Remove. Temporary fix to ensure tokens without trackedReserveETH are in the list.
|
|
105
|
+
const FEI = '0x956f47f50a910163d8bf957cf5846d573e7f87ca';
|
|
106
|
+
const poolsSanitized = pools
|
|
107
|
+
.filter((pool) => {
|
|
108
|
+
return (pool.token0.id == FEI ||
|
|
109
|
+
pool.token1.id == FEI ||
|
|
110
|
+
parseFloat(pool.trackedReserveETH) > threshold);
|
|
111
|
+
})
|
|
112
|
+
.map((pool) => {
|
|
113
|
+
return {
|
|
114
|
+
...pool,
|
|
115
|
+
id: pool.id.toLowerCase(),
|
|
116
|
+
token0: {
|
|
117
|
+
id: pool.token0.id.toLowerCase(),
|
|
118
|
+
},
|
|
119
|
+
token1: {
|
|
120
|
+
id: pool.token1.id.toLowerCase(),
|
|
121
|
+
},
|
|
122
|
+
supply: parseFloat(pool.totalSupply),
|
|
123
|
+
reserve: parseFloat(pool.trackedReserveETH),
|
|
124
|
+
reserveUSD: parseFloat(pool.reserveUSD),
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
log.info(`Got ${pools.length} V2 pools from the subgraph. ${poolsSanitized.length} after filtering`);
|
|
128
|
+
return poolsSanitized;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZ3JhcGgtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3YyLWZhdGhvbS9zdWJncmFwaC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDaEMsT0FBTyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQStCckMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBRXhCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLCtDQUErQztBQWdCdkUsTUFBTSxPQUFPLGtCQUFrQjtJQUc3QixZQUNVLE9BQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFVBQVUsQ0FBQyxFQUNYLFVBQVUsTUFBTSxFQUNoQixXQUFXLElBQUksRUFDZixXQUFXLFNBQVM7UUFMcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFJO1FBQ1gsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFPO1FBQ2YsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUU1QixJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQ25CLFFBQWdCLEVBQ2hCLFNBQWlC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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { getCreate2Address } from '@ethersproject/address';
|
|
2
|
+
import { keccak256, pack } from '@ethersproject/solidity';
|
|
3
|
+
import { FATHOM_FACTORY_ADDRESS, FATHOM_INIT_CODE_HASH } from './constants';
|
|
4
|
+
export const getFathomPoolAddress = (tokenA, tokenB) => {
|
|
5
|
+
const [token0, token1] = tokenA.sortsBefore(tokenB)
|
|
6
|
+
? [tokenA, tokenB]
|
|
7
|
+
: [tokenB, tokenA];
|
|
8
|
+
return getCreate2Address(FATHOM_FACTORY_ADDRESS, keccak256(['bytes'], [pack(['address', 'address'], [token0.address, token1.address])]), FATHOM_INIT_CODE_HASH);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3YyLWZhdGhvbS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE1BQWEsRUFBRSxNQUFhLEVBQUUsRUFBRTtJQUNuRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXJCLE9BQU8saUJBQWlCLENBQ3RCLHNCQUFzQixFQUN0QixTQUFTLENBQ1AsQ0FBQyxPQUFPLENBQUMsRUFDVCxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDakUsRUFDRCxxQkFBcUIsQ0FDdEIsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
|
|
@@ -63,6 +63,7 @@ export class V3PoolProvider {
|
|
|
63
63
|
const [token0, token1, fee] = sortedTokenPairs[i];
|
|
64
64
|
const slot0 = slot0Result.result;
|
|
65
65
|
const liquidity = liquidityResult.result[0];
|
|
66
|
+
// todo: Uniswap Oku
|
|
66
67
|
const pool = new Pool(token0, token1, fee, slot0.sqrtPriceX96.toString(), liquidity.toString(), slot0.tick);
|
|
67
68
|
const poolAddress = sortedPoolAddresses[i];
|
|
68
69
|
poolAddressToPool[poolAddress] = pool;
|
|
@@ -97,7 +98,7 @@ export class V3PoolProvider {
|
|
|
97
98
|
tokenA: token0,
|
|
98
99
|
tokenB: token1,
|
|
99
100
|
fee: feeAmount,
|
|
100
|
-
initCodeHashManualOverride: POOL_INIT_CODE_HASH
|
|
101
|
+
initCodeHashManualOverride: POOL_INIT_CODE_HASH,
|
|
101
102
|
});
|
|
102
103
|
this.POOL_ADDRESS_CACHE[cacheKey] = poolAddress;
|
|
103
104
|
return { poolAddress, token0, token1 };
|
|
@@ -115,4 +116,4 @@ export class V3PoolProvider {
|
|
|
115
116
|
return results;
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjMvcG9vbC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQWEsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUUsT0FBTyxLQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFckcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQTREM0QsTUFBTSxPQUFPLGNBQWM7SUFLekI7Ozs7O09BS0c7SUFDSCxZQUNZLE9BQWdCLEVBQ2hCLGtCQUFzQyxFQUN0QyxlQUFtQztRQUMzQyxPQUFPLEVBQUUsQ0FBQztRQUNWLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEdBQUc7S0FDaEI7UUFOUyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsaUJBQVksR0FBWixZQUFZLENBSXJCO1FBakJILHlFQUF5RTtRQUN6RSxrREFBa0Q7UUFDMUMsdUJBQWtCLEdBQThCLEVBQUUsQ0FBQztJQWdCeEQsQ0FBQztJQUVHLEtBQUssQ0FBQyxRQUFRLENBQ25CLFVBQXVDLEVBQ3ZDLGNBQStCO1FBRS9CLE1BQU0sY0FBYyxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3RELE1BQU0sZ0JBQWdCLEdBQXFDLEVBQUUsQ0FBQztRQUM5RCxN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
|