@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
|
@@ -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,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StaticV2FathomSubgraphProvider = exports.V2_XDC_ADDITIONAL_BASES = void 0;
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const chains_1 = require("../../util/chains");
|
|
9
|
+
const log_1 = require("../../util/log");
|
|
10
|
+
const token_provider_1 = require("../token-provider");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
const BASES_TO_CHECK_TRADES_AGAINST = {
|
|
13
|
+
[chains_1.ChainId.XDC]: [token_provider_1.WXDC_XDC, token_provider_1.FXD_XDC],
|
|
14
|
+
[chains_1.ChainId.XDC_APOTHEM]: [],
|
|
15
|
+
};
|
|
16
|
+
const ADDITIONAL_BASES = {
|
|
17
|
+
[chains_1.ChainId.XDC]: {
|
|
18
|
+
[token_provider_1.WXDC_XDC.address]: [token_provider_1.USDT_XDC, token_provider_1.FXD_XDC],
|
|
19
|
+
[token_provider_1.FXD_XDC.address]: [token_provider_1.WXDC_XDC, token_provider_1.USDT_XDC, token_provider_1.EURS_XDC],
|
|
20
|
+
[token_provider_1.USDT_XDC.address]: [token_provider_1.WXDC_XDC, token_provider_1.FXD_XDC],
|
|
21
|
+
[token_provider_1.EURS_XDC.address]: [token_provider_1.FXD_XDC],
|
|
22
|
+
[token_provider_1.PLI_XDC.address]: [token_provider_1.WXDC_XDC],
|
|
23
|
+
},
|
|
24
|
+
[chains_1.ChainId.XDC_APOTHEM]: {},
|
|
25
|
+
};
|
|
26
|
+
exports.V2_XDC_ADDITIONAL_BASES = ADDITIONAL_BASES[chains_1.ChainId.XDC];
|
|
27
|
+
let paths = [];
|
|
28
|
+
const recFinder = (path, used, lastToken, dest, hops) => {
|
|
29
|
+
const hop = path.length;
|
|
30
|
+
if (hop < hops) {
|
|
31
|
+
if (!lastToken) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const additional = exports.V2_XDC_ADDITIONAL_BASES[lastToken.address];
|
|
35
|
+
if (additional) {
|
|
36
|
+
for (const ad of additional) {
|
|
37
|
+
const adToken = ad;
|
|
38
|
+
const newPair = [lastToken, adToken];
|
|
39
|
+
const newPath = [...path, newPair];
|
|
40
|
+
if (adToken.address === dest.address) {
|
|
41
|
+
paths.push(newPath);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!used[adToken.address]) {
|
|
45
|
+
recFinder(newPath, Object.assign(Object.assign({}, used), { [adToken.address]: true }), adToken, dest, hops);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Provider that does not get data from an external source and instead returns
|
|
53
|
+
* a hardcoded list of Subgraph pools.
|
|
54
|
+
*
|
|
55
|
+
* Since the pools are hardcoded, the liquidity/price values are dummys and should not
|
|
56
|
+
* be depended on.
|
|
57
|
+
*
|
|
58
|
+
* Useful for instances where other data sources are unavailable. E.g. subgraph not available.
|
|
59
|
+
*
|
|
60
|
+
* @export
|
|
61
|
+
* @class StaticV2SubgraphProvider
|
|
62
|
+
*/
|
|
63
|
+
class StaticV2FathomSubgraphProvider {
|
|
64
|
+
constructor(chainId) {
|
|
65
|
+
this.chainId = chainId;
|
|
66
|
+
}
|
|
67
|
+
async getPools(tokenIn, tokenOut) {
|
|
68
|
+
paths = [];
|
|
69
|
+
log_1.log.info('In static subgraph provider for V2');
|
|
70
|
+
const bases = BASES_TO_CHECK_TRADES_AGAINST[this.chainId];
|
|
71
|
+
const basePairs = lodash_1.default.flatMap(bases, (base) => bases.map((otherBase) => [base, otherBase]));
|
|
72
|
+
let pairs = [];
|
|
73
|
+
if (tokenIn && tokenOut) {
|
|
74
|
+
const additionalIn = ADDITIONAL_BASES[this.chainId][tokenIn.address];
|
|
75
|
+
const additionalOut = ADDITIONAL_BASES[this.chainId][tokenOut.address];
|
|
76
|
+
if (!additionalIn || !additionalOut) {
|
|
77
|
+
basePairs.push([tokenIn, tokenOut]);
|
|
78
|
+
if (additionalIn) {
|
|
79
|
+
basePairs.push(...additionalIn.map((v) => [tokenIn, v]));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
basePairs.push(...bases.map((base) => [tokenIn, base]));
|
|
83
|
+
}
|
|
84
|
+
if (additionalOut) {
|
|
85
|
+
basePairs.push(...additionalOut.map((v) => [tokenOut, v]));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
basePairs.push(...bases.map((base) => [tokenOut, base]));
|
|
89
|
+
}
|
|
90
|
+
pairs = (0, lodash_1.default)(basePairs)
|
|
91
|
+
.filter((tokens) => Boolean(tokens[0] && tokens[1]))
|
|
92
|
+
.filter(([tokenA, tokenB]) => tokenA.address !== tokenB.address && !tokenA.equals(tokenB))
|
|
93
|
+
.flatMap(([tokenA, tokenB]) => {
|
|
94
|
+
const additionalA = ADDITIONAL_BASES[this.chainId][tokenA.address];
|
|
95
|
+
// const additionalB = ADDITIONAL_BASES[this.chainId][tokenB.address];
|
|
96
|
+
if (additionalA) {
|
|
97
|
+
const additionalPool = additionalA.filter((v) => v.address.toLowerCase() === tokenB.address.toLowerCase());
|
|
98
|
+
const res = additionalPool.map((v) => {
|
|
99
|
+
return [tokenA, v];
|
|
100
|
+
});
|
|
101
|
+
return res;
|
|
102
|
+
}
|
|
103
|
+
return [[tokenA, tokenB]];
|
|
104
|
+
})
|
|
105
|
+
.value();
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
recFinder([], { [tokenIn.address]: true }, tokenIn, tokenOut, 5);
|
|
109
|
+
// console.log(
|
|
110
|
+
// paths.map((path) =>
|
|
111
|
+
// path
|
|
112
|
+
// .map(
|
|
113
|
+
// (p) => `(${p[0].symbol} - ${p[1].symbol} : ${p[2] / 10000}% )`
|
|
114
|
+
// )
|
|
115
|
+
// .join(' --> ')
|
|
116
|
+
// )
|
|
117
|
+
// );
|
|
118
|
+
const uniquePairs = {};
|
|
119
|
+
paths.forEach((path) => {
|
|
120
|
+
path.forEach((pool) => {
|
|
121
|
+
const id = `${pool[0].address}-${pool[1].address}`;
|
|
122
|
+
uniquePairs[id] = pool;
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
const direct = tokenIn && tokenOut ? [[tokenIn, tokenOut]] : [];
|
|
126
|
+
pairs = [...Object.values(uniquePairs), ...direct];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// pairs = _(basePairs)
|
|
130
|
+
// .filter((tokens): tokens is [Token, Token] =>
|
|
131
|
+
// Boolean(tokens[0] && tokens[1])
|
|
132
|
+
// )
|
|
133
|
+
// .filter(
|
|
134
|
+
// ([tokenA, tokenB]) =>
|
|
135
|
+
// tokenA.address !== tokenB.address && !tokenA.equals(tokenB)
|
|
136
|
+
// )
|
|
137
|
+
// .value();
|
|
138
|
+
const poolAddressSet = new Set();
|
|
139
|
+
const subgraphPools = (0, lodash_1.default)(pairs)
|
|
140
|
+
.map(([tokenA, tokenB]) => {
|
|
141
|
+
const poolAddress = (0, utils_1.getFathomPoolAddress)(tokenA, tokenB);
|
|
142
|
+
console.log(poolAddress);
|
|
143
|
+
if (poolAddressSet.has(poolAddress)) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
poolAddressSet.add(poolAddress);
|
|
147
|
+
const [token0, token1] = tokenA.sortsBefore(tokenB)
|
|
148
|
+
? [tokenA, tokenB]
|
|
149
|
+
: [tokenB, tokenA];
|
|
150
|
+
return {
|
|
151
|
+
id: poolAddress,
|
|
152
|
+
liquidity: '100',
|
|
153
|
+
token0: {
|
|
154
|
+
id: token0.address,
|
|
155
|
+
},
|
|
156
|
+
token1: {
|
|
157
|
+
id: token1.address,
|
|
158
|
+
},
|
|
159
|
+
supply: 100,
|
|
160
|
+
reserve: 100,
|
|
161
|
+
reserveUSD: 100,
|
|
162
|
+
};
|
|
163
|
+
})
|
|
164
|
+
.compact()
|
|
165
|
+
.value();
|
|
166
|
+
return subgraphPools;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.StaticV2FathomSubgraphProvider = StaticV2FathomSubgraphProvider;
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy92Mi1mYXRob20vc3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG9EQUF1QjtBQUV2Qiw4Q0FBNEM7QUFDNUMsd0NBQXFDO0FBQ3JDLHNEQU0yQjtBQUczQixtQ0FBK0M7QUFNL0MsTUFBTSw2QkFBNkIsR0FBbUI7SUFDcEQsQ0FBQyxnQkFBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMseUJBQVEsRUFBRSx3QkFBTyxDQUFDO0lBQ2xDLENBQUMsZ0JBQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFO0NBQzFCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUVsQjtJQUNGLENBQUMsZ0JBQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNiLENBQUMseUJBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLHlCQUFRLEVBQUUsd0JBQU8sQ0FBQztRQUN2QyxDQUFDLHdCQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyx5QkFBUSxFQUFFLHlCQUFRLEVBQUUseUJBQVEsQ0FBQztRQUNqRCxDQUFDLHlCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyx5QkFBUSxFQUFFLHdCQUFPLENBQUM7UUFDdkMsQ0FBQyx5QkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsd0JBQU8sQ0FBQztRQUM3QixDQUFDLHdCQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyx5QkFBUSxDQUFDO0tBQzlCO0lBQ0QsQ0FBQyxnQkFBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUU7Q0FDMUIsQ0FBQztBQUNXLFFBQUEsdUJBQXVCLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVyRSxJQUFJLEtBQUssR0FBdUIsRUFBRSxDQUFDO0FBRW5D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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,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.V2SubgraphProvider = void 0;
|
|
7
|
+
const async_retry_1 = __importDefault(require("async-retry"));
|
|
8
|
+
const await_timeout_1 = __importDefault(require("await-timeout"));
|
|
9
|
+
const graphql_request_1 = require("graphql-request");
|
|
10
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
11
|
+
const log_1 = require("../../util/log");
|
|
12
|
+
const threshold = 0.025;
|
|
13
|
+
const PAGE_SIZE = 1000; // 1k is max possible query size from subgraph.
|
|
14
|
+
class V2SubgraphProvider {
|
|
15
|
+
constructor(chainId, subgraphUrl, retries = 2, timeout = 360000, rollback = true, pageSize = PAGE_SIZE) {
|
|
16
|
+
this.chainId = chainId;
|
|
17
|
+
this.subgraphUrl = subgraphUrl;
|
|
18
|
+
this.retries = retries;
|
|
19
|
+
this.timeout = timeout;
|
|
20
|
+
this.rollback = rollback;
|
|
21
|
+
this.pageSize = pageSize;
|
|
22
|
+
if (!subgraphUrl) {
|
|
23
|
+
throw new Error(`No subgraph url for chain id: ${this.chainId}`);
|
|
24
|
+
}
|
|
25
|
+
this.client = new graphql_request_1.GraphQLClient(this.subgraphUrl);
|
|
26
|
+
}
|
|
27
|
+
async getPools(_tokenIn, _tokenOut, providerConfig) {
|
|
28
|
+
let blockNumber = (providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber)
|
|
29
|
+
? await providerConfig.blockNumber
|
|
30
|
+
: undefined;
|
|
31
|
+
// Due to limitations with the Subgraph API this is the only way to parameterize the query.
|
|
32
|
+
const query2 = (0, graphql_request_1.gql) `
|
|
33
|
+
query getPools($pageSize: Int!, $id: String) {
|
|
34
|
+
pairs(
|
|
35
|
+
first: $pageSize
|
|
36
|
+
${blockNumber ? `block: { number: ${blockNumber} }` : ``}
|
|
37
|
+
where: { id_gt: $id }
|
|
38
|
+
) {
|
|
39
|
+
id
|
|
40
|
+
token0 { id, symbol }
|
|
41
|
+
token1 { id, symbol }
|
|
42
|
+
totalSupply
|
|
43
|
+
trackedReserveETH
|
|
44
|
+
reserveUSD
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
let pools = [];
|
|
49
|
+
log_1.log.info(`Getting V2 pools from the subgraph with page size ${this.pageSize}${(providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber)
|
|
50
|
+
? ` as of block ${providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber}`
|
|
51
|
+
: ''}.`);
|
|
52
|
+
await (0, async_retry_1.default)(async () => {
|
|
53
|
+
const timeout = new await_timeout_1.default();
|
|
54
|
+
const getPools = async () => {
|
|
55
|
+
let lastId = '';
|
|
56
|
+
let pairs = [];
|
|
57
|
+
let pairsPage = [];
|
|
58
|
+
do {
|
|
59
|
+
await (0, async_retry_1.default)(async () => {
|
|
60
|
+
const poolsResult = await this.client.request(query2, {
|
|
61
|
+
pageSize: this.pageSize,
|
|
62
|
+
id: lastId,
|
|
63
|
+
});
|
|
64
|
+
pairsPage = poolsResult.pairs;
|
|
65
|
+
pairs = pairs.concat(pairsPage);
|
|
66
|
+
lastId = pairs[pairs.length - 1].id;
|
|
67
|
+
}, {
|
|
68
|
+
retries: this.retries,
|
|
69
|
+
onRetry: (err, retry) => {
|
|
70
|
+
pools = [];
|
|
71
|
+
log_1.log.info({ err }, `Failed request for page of pools from subgraph. Retry attempt: ${retry}`);
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
} while (pairsPage.length > 0);
|
|
75
|
+
return pairs;
|
|
76
|
+
};
|
|
77
|
+
/* eslint-disable no-useless-catch */
|
|
78
|
+
try {
|
|
79
|
+
const getPoolsPromise = getPools();
|
|
80
|
+
const timerPromise = timeout.set(this.timeout).then(() => {
|
|
81
|
+
throw new Error(`Timed out getting pools from subgraph: ${this.timeout}`);
|
|
82
|
+
});
|
|
83
|
+
pools = await Promise.race([getPoolsPromise, timerPromise]);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
timeout.clear();
|
|
91
|
+
}
|
|
92
|
+
/* eslint-enable no-useless-catch */
|
|
93
|
+
}, {
|
|
94
|
+
retries: this.retries,
|
|
95
|
+
onRetry: (err, retry) => {
|
|
96
|
+
if (this.rollback &&
|
|
97
|
+
blockNumber &&
|
|
98
|
+
lodash_1.default.includes(err.message, 'indexed up to')) {
|
|
99
|
+
blockNumber = blockNumber - 10;
|
|
100
|
+
log_1.log.info(`Detected subgraph indexing error. Rolled back block number to: ${blockNumber}`);
|
|
101
|
+
}
|
|
102
|
+
pools = [];
|
|
103
|
+
log_1.log.info({ err }, `Failed to get pools from subgraph. Retry attempt: ${retry}`);
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
// Filter pools that have tracked reserve ETH less than threshold.
|
|
107
|
+
// trackedReserveETH filters pools that do not involve a pool from this allowlist:
|
|
108
|
+
// https://github.com/Uniswap/v2-subgraph/blob/7c82235cad7aee4cfce8ea82f0030af3d224833e/src/mappings/pricing.ts#L43
|
|
109
|
+
// Which helps filter pools with manipulated prices/liquidity.
|
|
110
|
+
// TODO: Remove. Temporary fix to ensure tokens without trackedReserveETH are in the list.
|
|
111
|
+
const FEI = '0x956f47f50a910163d8bf957cf5846d573e7f87ca';
|
|
112
|
+
const poolsSanitized = pools
|
|
113
|
+
.filter((pool) => {
|
|
114
|
+
return (pool.token0.id == FEI ||
|
|
115
|
+
pool.token1.id == FEI ||
|
|
116
|
+
parseFloat(pool.trackedReserveETH) > threshold);
|
|
117
|
+
})
|
|
118
|
+
.map((pool) => {
|
|
119
|
+
return Object.assign(Object.assign({}, pool), { id: pool.id.toLowerCase(), token0: {
|
|
120
|
+
id: pool.token0.id.toLowerCase(),
|
|
121
|
+
}, token1: {
|
|
122
|
+
id: pool.token1.id.toLowerCase(),
|
|
123
|
+
}, supply: parseFloat(pool.totalSupply), reserve: parseFloat(pool.trackedReserveETH), reserveUSD: parseFloat(pool.reserveUSD) });
|
|
124
|
+
});
|
|
125
|
+
log_1.log.info(`Got ${pools.length} V2 pools from the subgraph. ${poolsSanitized.length} after filtering`);
|
|
126
|
+
return poolsSanitized;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.V2SubgraphProvider = V2SubgraphProvider;
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZ3JhcGgtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3YyLWZhdGhvbS9zdWJncmFwaC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSw4REFBZ0M7QUFDaEMsa0VBQW9DO0FBQ3BDLHFEQUFxRDtBQUNyRCxvREFBdUI7QUFHdkIsd0NBQXFDO0FBK0JyQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFFeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsK0NBQStDO0FBZ0J2RSxNQUFhLGtCQUFrQjtJQUc3QixZQUNVLE9BQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFVBQVUsQ0FBQyxFQUNYLFVBQVUsTUFBTSxFQUNoQixXQUFXLElBQUksRUFDZixXQUFXLFNBQVM7UUFMcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFJO1FBQ1gsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFPO1FBQ2YsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUU1QixJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLCtCQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUNuQixRQUFnQixFQUNoQixTQUFpQixFQUNqQixjQUErQjtRQUUvQixJQUFJLFdBQVcsR0FBRyxDQUFBLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxXQUFXO1lBQzNDLENBQUMsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxXQUFXO1lBQ2xDLENBQUMs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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFathomPoolAddress = void 0;
|
|
4
|
+
const address_1 = require("@ethersproject/address");
|
|
5
|
+
const solidity_1 = require("@ethersproject/solidity");
|
|
6
|
+
const constants_1 = require("./constants");
|
|
7
|
+
const getFathomPoolAddress = (tokenA, tokenB) => {
|
|
8
|
+
const [token0, token1] = tokenA.sortsBefore(tokenB)
|
|
9
|
+
? [tokenA, tokenB]
|
|
10
|
+
: [tokenB, tokenA];
|
|
11
|
+
return (0, address_1.getCreate2Address)(constants_1.FATHOM_FACTORY_ADDRESS, (0, solidity_1.keccak256)(['bytes'], [(0, solidity_1.pack)(['address', 'address'], [token0.address, token1.address])]), constants_1.FATHOM_INIT_CODE_HASH);
|
|
12
|
+
};
|
|
13
|
+
exports.getFathomPoolAddress = getFathomPoolAddress;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3YyLWZhdGhvbS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvREFBMkQ7QUFDM0Qsc0RBQTBEO0FBRzFELDJDQUE0RTtBQUVyRSxNQUFNLG9CQUFvQixHQUFHLENBQUMsTUFBYSxFQUFFLE1BQWEsRUFBRSxFQUFFO0lBQ25FLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFckIsT0FBTyxJQUFBLDJCQUFpQixFQUN0QixrQ0FBc0IsRUFDdEIsSUFBQSxvQkFBUyxFQUNQLENBQUMsT0FBTyxDQUFDLEVBQ1QsQ0FBQyxJQUFBLGVBQUksRUFBQyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDakUsRUFDRCxpQ0FBcUIsQ0FDdEIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQWJXLFFBQUEsb0JBQW9CLHdCQWEvQiJ9
|
|
@@ -69,6 +69,7 @@ class V3PoolProvider {
|
|
|
69
69
|
const [token0, token1, fee] = sortedTokenPairs[i];
|
|
70
70
|
const slot0 = slot0Result.result;
|
|
71
71
|
const liquidity = liquidityResult.result[0];
|
|
72
|
+
// todo: Uniswap Oku
|
|
72
73
|
const pool = new v3_sdk_1.Pool(token0, token1, fee, slot0.sqrtPriceX96.toString(), liquidity.toString(), slot0.tick);
|
|
73
74
|
const poolAddress = sortedPoolAddresses[i];
|
|
74
75
|
poolAddressToPool[poolAddress] = pool;
|
|
@@ -103,7 +104,7 @@ class V3PoolProvider {
|
|
|
103
104
|
tokenA: token0,
|
|
104
105
|
tokenB: token1,
|
|
105
106
|
fee: feeAmount,
|
|
106
|
-
initCodeHashManualOverride: addresses_2.POOL_INIT_CODE_HASH
|
|
107
|
+
initCodeHashManualOverride: addresses_2.POOL_INIT_CODE_HASH,
|
|
107
108
|
});
|
|
108
109
|
this.POOL_ADDRESS_CACHE[cacheKey] = poolAddress;
|
|
109
110
|
return { poolAddress, token0, token1 };
|
|
@@ -122,4 +123,4 @@ class V3PoolProvider {
|
|
|
122
123
|
}
|
|
123
124
|
}
|
|
124
125
|
exports.V3PoolProvider = V3PoolProvider;
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjMvcG9vbC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxvREFBOEU7QUFDOUUsOERBQTZEO0FBQzdELG9EQUF1QjtBQUV2Qix3R0FBcUc7QUFFckcsb0RBQWlFO0FBQ2pFLHdDQUFxQztBQUNyQyw4Q0FBaUQ7QUFHakQsb0RBQTJEO0FBNEQzRCxNQUFhLGNBQWM7SUFLekI7Ozs7O09BS0c7SUFDSCxZQUNZLE9BQWdCLEVBQ2hCLGtCQUFzQyxFQUN0QyxlQUFtQztRQUMzQyxPQUFPLEVBQUUsQ0FBQztRQUNWLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEdBQUc7S0FDaEI7UUFOUyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsaUJBQVksR0FBWixZQUFZLENBSXJCO1FBakJILHlFQUF5RTtRQUN6RSxrREFBa0Q7UUFDMUMsdUJBQWtCLEdBQThCLEVBQUUsQ0FBQztJQWdCeEQsQ0FBQztJQUVHLEtBQUssQ0FBQyxRQUFRLENBQ25CLFVBQXVDLEVBQ3ZDLGNBQStCO1FBRS9CLE1BQU0sY0FBYyxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3RELE1BQU0sZ0JBQWdCLEdBQXFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLG1CQUFtQixHQUFhLEVBQUUsQ0FBQztRQUV6QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtZQUNsQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7WUFFOUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDekQsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLENBQ1YsQ0FBQztZQUVG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
|