@xspswap/smart-order-router 1.1.6 → 1.1.7

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.
Files changed (205) hide show
  1. package/build/main/providers/caching/route/model/cached-routes.d.ts +3 -2
  2. package/build/main/providers/caching/route/model/cached-routes.js +4 -4
  3. package/build/main/providers/caching/route/route-caching-provider.d.ts +2 -1
  4. package/build/main/providers/caching/route/route-caching-provider.js +6 -11
  5. package/build/main/providers/caching-gas-provider.d.ts +1 -1
  6. package/build/main/providers/caching-gas-provider.js +1 -1
  7. package/build/main/providers/caching-token-list-provider.d.ts +2 -1
  8. package/build/main/providers/caching-token-list-provider.js +2 -1
  9. package/build/main/providers/caching-token-provider.d.ts +2 -1
  10. package/build/main/providers/caching-token-provider.js +5 -6
  11. package/build/main/providers/eth-estimate-gas-provider.d.ts +1 -1
  12. package/build/main/providers/eth-estimate-gas-provider.js +1 -1
  13. package/build/main/providers/multicall-uniswap-provider.d.ts +1 -1
  14. package/build/main/providers/multicall-uniswap-provider.js +3 -3
  15. package/build/main/providers/on-chain-gas-price-provider.d.ts +1 -1
  16. package/build/main/providers/on-chain-quote-provider.d.ts +1 -1
  17. package/build/main/providers/on-chain-quote-provider.js +13 -24
  18. package/build/main/providers/simulation-provider.d.ts +2 -2
  19. package/build/main/providers/simulation-provider.js +6 -6
  20. package/build/main/providers/swap-router-provider.d.ts +2 -1
  21. package/build/main/providers/swap-router-provider.js +2 -3
  22. package/build/main/providers/tenderly-simulation-provider.d.ts +1 -1
  23. package/build/main/providers/tenderly-simulation-provider.js +7 -8
  24. package/build/main/providers/token-provider.d.ts +2 -3
  25. package/build/main/providers/token-provider.js +30 -32
  26. package/build/main/providers/token-validator-provider.d.ts +2 -1
  27. package/build/main/providers/token-validator-provider.js +2 -3
  28. package/build/main/providers/uri-subgraph-provider.d.ts +1 -1
  29. package/build/main/providers/uri-subgraph-provider.js +1 -1
  30. package/build/main/providers/v2/caching-pool-provider.d.ts +3 -5
  31. package/build/main/providers/v2/caching-pool-provider.js +3 -5
  32. package/build/main/providers/v2/caching-subgraph-provider.d.ts +1 -1
  33. package/build/main/providers/v2/pool-provider.d.ts +4 -13
  34. package/build/main/providers/v2/pool-provider.js +10 -12
  35. package/build/main/providers/v2/quote-provider.js +2 -2
  36. package/build/main/providers/v2/static-subgraph-provider.d.ts +2 -1
  37. package/build/main/providers/v2/static-subgraph-provider.js +7 -7
  38. package/build/main/providers/v2/subgraph-provider.d.ts +2 -1
  39. package/build/main/providers/v2/subgraph-provider.js +1 -1
  40. package/build/main/providers/v3/caching-pool-provider.d.ts +3 -5
  41. package/build/main/providers/v3/caching-pool-provider.js +3 -5
  42. package/build/main/providers/v3/caching-subgraph-provider.d.ts +1 -1
  43. package/build/main/providers/v3/pool-provider.d.ts +3 -5
  44. package/build/main/providers/v3/pool-provider.js +8 -14
  45. package/build/main/providers/v3/static-subgraph-provider.d.ts +2 -1
  46. package/build/main/providers/v3/static-subgraph-provider.js +25 -37
  47. package/build/main/providers/v3/subgraph-provider.d.ts +2 -1
  48. package/build/main/providers/v3/subgraph-provider.js +2 -2
  49. package/build/main/routers/alpha-router/alpha-router.d.ts +6 -25
  50. package/build/main/routers/alpha-router/alpha-router.js +38 -100
  51. package/build/main/routers/alpha-router/config.d.ts +1 -1
  52. package/build/main/routers/alpha-router/entities/route-with-valid-quote.d.ts +7 -9
  53. package/build/main/routers/alpha-router/entities/route-with-valid-quote.js +8 -8
  54. package/build/main/routers/alpha-router/functions/best-swap-route.d.ts +2 -1
  55. package/build/main/routers/alpha-router/functions/best-swap-route.js +1 -1
  56. package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +3 -4
  57. package/build/main/routers/alpha-router/functions/compute-all-routes.js +6 -6
  58. package/build/main/routers/alpha-router/functions/get-candidate-pools.d.ts +5 -7
  59. package/build/main/routers/alpha-router/functions/get-candidate-pools.js +17 -19
  60. package/build/main/routers/alpha-router/gas-models/gas-model.d.ts +2 -1
  61. package/build/main/routers/alpha-router/gas-models/gas-model.js +4 -4
  62. package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +4 -4
  63. package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js +12 -13
  64. package/build/main/routers/alpha-router/gas-models/v3/gas-costs.d.ts +1 -1
  65. package/build/main/routers/alpha-router/gas-models/v3/gas-costs.js +11 -11
  66. package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js +5 -4
  67. package/build/main/routers/alpha-router/quoters/base-quoter.d.ts +3 -5
  68. package/build/main/routers/alpha-router/quoters/base-quoter.js +2 -3
  69. package/build/main/routers/alpha-router/quoters/mixed-quoter.d.ts +3 -4
  70. package/build/main/routers/alpha-router/quoters/mixed-quoter.js +14 -80
  71. package/build/main/routers/alpha-router/quoters/v2-quoter.d.ts +3 -4
  72. package/build/main/routers/alpha-router/quoters/v2-quoter.js +4 -9
  73. package/build/main/routers/alpha-router/quoters/v3-quoter.d.ts +4 -5
  74. package/build/main/routers/alpha-router/quoters/v3-quoter.js +10 -9
  75. package/build/main/routers/legacy-router/bases.d.ts +2 -1
  76. package/build/main/routers/legacy-router/bases.js +6 -7
  77. package/build/main/routers/legacy-router/legacy-router.d.ts +2 -1
  78. package/build/main/routers/legacy-router/legacy-router.js +5 -5
  79. package/build/main/routers/router.d.ts +4 -7
  80. package/build/main/routers/router.js +8 -8
  81. package/build/main/tsconfig.tsbuildinfo +1 -1
  82. package/build/main/util/addresses.d.ts +21 -0
  83. package/build/main/util/addresses.js +59 -6
  84. package/build/main/util/chains.d.ts +11 -2
  85. package/build/main/util/chains.js +37 -18
  86. package/build/main/util/gas-factory-helpers.d.ts +3 -2
  87. package/build/main/util/gas-factory-helpers.js +6 -10
  88. package/build/main/util/methodParameters.d.ts +2 -2
  89. package/build/main/util/methodParameters.js +5 -5
  90. package/build/main/util/protocols.d.ts +0 -2
  91. package/build/main/util/protocols.js +2 -14
  92. package/build/main/util/routes.js +10 -19
  93. package/build/module/providers/caching/route/model/cached-routes.d.ts +3 -2
  94. package/build/module/providers/caching/route/model/cached-routes.js +4 -4
  95. package/build/module/providers/caching/route/route-caching-provider.d.ts +2 -1
  96. package/build/module/providers/caching/route/route-caching-provider.js +7 -12
  97. package/build/module/providers/caching-gas-provider.d.ts +1 -1
  98. package/build/module/providers/caching-gas-provider.js +1 -1
  99. package/build/module/providers/caching-token-list-provider.d.ts +2 -1
  100. package/build/module/providers/caching-token-list-provider.js +2 -1
  101. package/build/module/providers/caching-token-provider.d.ts +2 -1
  102. package/build/module/providers/caching-token-provider.js +5 -6
  103. package/build/module/providers/eth-estimate-gas-provider.d.ts +1 -1
  104. package/build/module/providers/eth-estimate-gas-provider.js +1 -1
  105. package/build/module/providers/multicall-uniswap-provider.d.ts +1 -1
  106. package/build/module/providers/multicall-uniswap-provider.js +3 -3
  107. package/build/module/providers/on-chain-gas-price-provider.d.ts +1 -1
  108. package/build/module/providers/on-chain-quote-provider.d.ts +1 -1
  109. package/build/module/providers/on-chain-quote-provider.js +16 -27
  110. package/build/module/providers/simulation-provider.d.ts +2 -2
  111. package/build/module/providers/simulation-provider.js +6 -6
  112. package/build/module/providers/swap-router-provider.d.ts +2 -1
  113. package/build/module/providers/swap-router-provider.js +2 -3
  114. package/build/module/providers/tenderly-simulation-provider.d.ts +1 -1
  115. package/build/module/providers/tenderly-simulation-provider.js +7 -8
  116. package/build/module/providers/token-provider.d.ts +2 -3
  117. package/build/module/providers/token-provider.js +10 -12
  118. package/build/module/providers/token-validator-provider.d.ts +2 -1
  119. package/build/module/providers/token-validator-provider.js +3 -4
  120. package/build/module/providers/uri-subgraph-provider.d.ts +1 -1
  121. package/build/module/providers/uri-subgraph-provider.js +1 -1
  122. package/build/module/providers/v2/caching-pool-provider.d.ts +3 -5
  123. package/build/module/providers/v2/caching-pool-provider.js +3 -5
  124. package/build/module/providers/v2/caching-subgraph-provider.d.ts +1 -1
  125. package/build/module/providers/v2/pool-provider.d.ts +4 -13
  126. package/build/module/providers/v2/pool-provider.js +10 -12
  127. package/build/module/providers/v2/quote-provider.js +2 -2
  128. package/build/module/providers/v2/static-subgraph-provider.d.ts +2 -1
  129. package/build/module/providers/v2/static-subgraph-provider.js +5 -5
  130. package/build/module/providers/v2/subgraph-provider.d.ts +2 -1
  131. package/build/module/providers/v2/subgraph-provider.js +1 -1
  132. package/build/module/providers/v3/caching-pool-provider.d.ts +3 -5
  133. package/build/module/providers/v3/caching-pool-provider.js +3 -5
  134. package/build/module/providers/v3/caching-subgraph-provider.d.ts +1 -1
  135. package/build/module/providers/v3/pool-provider.d.ts +3 -5
  136. package/build/module/providers/v3/pool-provider.js +8 -14
  137. package/build/module/providers/v3/static-subgraph-provider.d.ts +2 -1
  138. package/build/module/providers/v3/static-subgraph-provider.js +24 -36
  139. package/build/module/providers/v3/subgraph-provider.d.ts +2 -1
  140. package/build/module/providers/v3/subgraph-provider.js +2 -2
  141. package/build/module/routers/alpha-router/alpha-router.d.ts +6 -25
  142. package/build/module/routers/alpha-router/alpha-router.js +40 -102
  143. package/build/module/routers/alpha-router/config.d.ts +1 -1
  144. package/build/module/routers/alpha-router/entities/route-with-valid-quote.d.ts +7 -9
  145. package/build/module/routers/alpha-router/entities/route-with-valid-quote.js +8 -8
  146. package/build/module/routers/alpha-router/functions/best-swap-route.d.ts +2 -1
  147. package/build/module/routers/alpha-router/functions/best-swap-route.js +1 -1
  148. package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +3 -4
  149. package/build/module/routers/alpha-router/functions/compute-all-routes.js +6 -6
  150. package/build/module/routers/alpha-router/functions/get-candidate-pools.d.ts +5 -7
  151. package/build/module/routers/alpha-router/functions/get-candidate-pools.js +19 -21
  152. package/build/module/routers/alpha-router/gas-models/gas-model.d.ts +2 -1
  153. package/build/module/routers/alpha-router/gas-models/gas-model.js +3 -3
  154. package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +4 -4
  155. package/build/module/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js +13 -14
  156. package/build/module/routers/alpha-router/gas-models/v3/gas-costs.d.ts +1 -1
  157. package/build/module/routers/alpha-router/gas-models/v3/gas-costs.js +8 -8
  158. package/build/module/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js +6 -5
  159. package/build/module/routers/alpha-router/quoters/base-quoter.d.ts +3 -5
  160. package/build/module/routers/alpha-router/quoters/base-quoter.js +2 -3
  161. package/build/module/routers/alpha-router/quoters/mixed-quoter.d.ts +3 -4
  162. package/build/module/routers/alpha-router/quoters/mixed-quoter.js +15 -81
  163. package/build/module/routers/alpha-router/quoters/v2-quoter.d.ts +3 -4
  164. package/build/module/routers/alpha-router/quoters/v2-quoter.js +4 -9
  165. package/build/module/routers/alpha-router/quoters/v3-quoter.d.ts +4 -5
  166. package/build/module/routers/alpha-router/quoters/v3-quoter.js +10 -9
  167. package/build/module/routers/legacy-router/bases.d.ts +2 -1
  168. package/build/module/routers/legacy-router/bases.js +7 -8
  169. package/build/module/routers/legacy-router/legacy-router.d.ts +2 -1
  170. package/build/module/routers/legacy-router/legacy-router.js +6 -6
  171. package/build/module/routers/router.d.ts +4 -7
  172. package/build/module/routers/router.js +8 -8
  173. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  174. package/build/module/util/addresses.d.ts +21 -0
  175. package/build/module/util/addresses.js +66 -3
  176. package/build/module/util/chains.d.ts +11 -2
  177. package/build/module/util/chains.js +32 -13
  178. package/build/module/util/gas-factory-helpers.d.ts +3 -2
  179. package/build/module/util/gas-factory-helpers.js +8 -12
  180. package/build/module/util/methodParameters.d.ts +2 -2
  181. package/build/module/util/methodParameters.js +7 -7
  182. package/build/module/util/protocols.d.ts +0 -2
  183. package/build/module/util/protocols.js +1 -11
  184. package/build/module/util/routes.js +11 -20
  185. package/package.json +1 -1
  186. package/build/main/providers/v2-fathom/constants.d.ts +0 -2
  187. package/build/main/providers/v2-fathom/constants.js +0 -6
  188. package/build/main/providers/v2-fathom/static-subgraph-provider.d.ts +0 -22
  189. package/build/main/providers/v2-fathom/static-subgraph-provider.js +0 -169
  190. package/build/main/providers/v2-fathom/subgraph-provider.d.ts +0 -34
  191. package/build/main/providers/v2-fathom/subgraph-provider.js +0 -130
  192. package/build/main/providers/v2-fathom/utils.d.ts +0 -2
  193. package/build/main/providers/v2-fathom/utils.js +0 -14
  194. package/build/main/providers/v3/static-subgraph-provider-v3-uni.d.ts +0 -29
  195. package/build/main/providers/v3/static-subgraph-provider-v3-uni.js +0 -209
  196. package/build/module/providers/v2-fathom/constants.d.ts +0 -2
  197. package/build/module/providers/v2-fathom/constants.js +0 -3
  198. package/build/module/providers/v2-fathom/static-subgraph-provider.d.ts +0 -22
  199. package/build/module/providers/v2-fathom/static-subgraph-provider.js +0 -162
  200. package/build/module/providers/v2-fathom/subgraph-provider.d.ts +0 -34
  201. package/build/module/providers/v2-fathom/subgraph-provider.js +0 -131
  202. package/build/module/providers/v2-fathom/utils.d.ts +0 -2
  203. package/build/module/providers/v2-fathom/utils.js +0 -10
  204. package/build/module/providers/v3/static-subgraph-provider-v3-uni.d.ts +0 -29
  205. package/build/module/providers/v3/static-subgraph-provider-v3-uni.js +0 -202
@@ -1,22 +0,0 @@
1
- import { ChainId, Token } from '@x-swap-protocol/sdk-core';
2
- import { IV2SubgraphProvider, V2SubgraphPool } from './subgraph-provider';
3
- export declare const FATHOM_V2_XDC_ADDITIONAL_BASES: {
4
- [tokenAddress: string]: Token[];
5
- };
6
- /**
7
- * Provider that does not get data from an external source and instead returns
8
- * a hardcoded list of Subgraph pools.
9
- *
10
- * Since the pools are hardcoded, the liquidity/price values are dummys and should not
11
- * be depended on.
12
- *
13
- * Useful for instances where other data sources are unavailable. E.g. subgraph not available.
14
- *
15
- * @export
16
- * @class StaticV2SubgraphProvider
17
- */
18
- export declare class StaticV2FathomSubgraphProvider implements IV2SubgraphProvider {
19
- private chainId;
20
- constructor(chainId: ChainId);
21
- getPools(tokenIn?: Token, tokenOut?: Token): Promise<V2SubgraphPool[]>;
22
- }
@@ -1,162 +0,0 @@
1
- import { ChainId } from '@x-swap-protocol/sdk-core';
2
- import _ from 'lodash';
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.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.APOTHEM]: {},
19
- };
20
- export const FATHOM_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 = FATHOM_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
- if (poolAddressSet.has(poolAddress)) {
137
- return undefined;
138
- }
139
- poolAddressSet.add(poolAddress);
140
- const [token0, token1] = tokenA.sortsBefore(tokenB)
141
- ? [tokenA, tokenB]
142
- : [tokenB, tokenA];
143
- return {
144
- id: poolAddress,
145
- liquidity: '100',
146
- token0: {
147
- id: token0.address,
148
- },
149
- token1: {
150
- id: token1.address,
151
- },
152
- supply: 100,
153
- reserve: 100,
154
- reserveUSD: 100,
155
- };
156
- })
157
- .compact()
158
- .value();
159
- return subgraphPools;
160
- }
161
- }
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy92Mi1mYXRob20vc3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQVMsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxHQUNULE1BQU0sbUJBQW1CLENBQUM7QUFHM0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBTS9DLE1BQU0sNkJBQTZCLEdBQW1CO0lBQ3BELENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztJQUNsQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO0NBQ3RCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUVsQjtJQUNGLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQ3ZDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7UUFDakQsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQ3ZDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQzdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDO0tB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
@@ -1,34 +0,0 @@
1
- import { ChainId, Token } from '@x-swap-protocol/sdk-core';
2
- import { ProviderConfig } from '../provider';
3
- export interface V2SubgraphPool {
4
- id: string;
5
- token0: {
6
- id: string;
7
- };
8
- token1: {
9
- id: string;
10
- };
11
- supply: number;
12
- reserve: number;
13
- reserveUSD: number;
14
- }
15
- /**
16
- * Provider for getting V2 pools from the Subgraph
17
- *
18
- * @export
19
- * @interface IV2SubgraphProvider
20
- */
21
- export interface IV2SubgraphProvider {
22
- getPools(tokenIn?: Token, tokenOut?: Token, providerConfig?: ProviderConfig): Promise<V2SubgraphPool[]>;
23
- }
24
- export declare class V2SubgraphProvider implements IV2SubgraphProvider {
25
- private chainId;
26
- private subgraphUrl;
27
- private retries;
28
- private timeout;
29
- private rollback;
30
- private pageSize;
31
- private client;
32
- constructor(chainId: ChainId, subgraphUrl: string, retries?: number, timeout?: number, rollback?: boolean, pageSize?: number);
33
- getPools(_tokenIn?: Token, _tokenOut?: Token, providerConfig?: ProviderConfig): Promise<V2SubgraphPool[]>;
34
- }
@@ -1,131 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZ3JhcGgtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3YyLWZhdGhvbS9zdWJncmFwaC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDaEMsT0FBTyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQStCckMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBRXhCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLCtDQUErQztBQWdCdkUsTUFBTSxPQUFPLGtCQUFrQjtJQUc3QixZQUNVLE9BQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFVBQVUsQ0FBQyxFQUNYLFVBQVUsTUFBTSxFQUNoQixXQUFXLElBQUksRUFDZixXQUFXLFNBQVM7UUFMcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFJO1FBQ1gsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFPO1FBQ2YsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUU1QixJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQ25CLFFBQWdCLEVBQ2hCLFNBQWlC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
@@ -1,2 +0,0 @@
1
- import { Token } from '@x-swap-protocol/sdk-core';
2
- export declare const getFathomPoolAddress: (tokenA: Token, tokenB: Token) => string;
@@ -1,10 +0,0 @@
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
@@ -1,29 +0,0 @@
1
- import { ChainId, Token } from '@x-swap-protocol/sdk-core';
2
- import { FeeAmount } from '@x-swap-protocol/v3-sdk';
3
- import { IV3PoolProvider } from './pool-provider';
4
- import { IV3SubgraphProvider, V3SubgraphPool } from './subgraph-provider';
5
- export declare const ADDITIONAL_BASES: {
6
- [chainId in ChainId]: {
7
- [tokenAddress: string]: [Token, FeeAmount][];
8
- };
9
- };
10
- export declare const Uni_V3_XDC_ADDITIONAL_BASES: {
11
- [tokenAddress: string]: [Token, FeeAmount][];
12
- };
13
- /**
14
- * Provider that uses a hardcoded list of V3 pools to generate a list of subgraph pools.
15
- *
16
- * Since the pools are hardcoded and the data does not come from the Subgraph, the TVL values
17
- * are dummys and should not be depended on.
18
- *
19
- * Useful for instances where other data sources are unavailable. E.g. Subgraph not available.
20
- *
21
- * @export
22
- * @class StaticV3SubgraphProvider
23
- */
24
- export declare class StaticV3UniSubgraphProvider implements IV3SubgraphProvider {
25
- private chainId;
26
- private poolProvider;
27
- constructor(chainId: ChainId, poolProvider: IV3PoolProvider);
28
- getPools(tokenIn?: Token, tokenOut?: Token): Promise<V3SubgraphPool[]>;
29
- }
@@ -1,202 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
- import { ChainId, WETH9 } from '@x-swap-protocol/sdk-core';
3
- import { FeeAmount, Pool, UniV3Factory } from '@x-swap-protocol/v3-sdk';
4
- import JSBI from 'jsbi';
5
- import _ from 'lodash';
6
- import { unparseFeeAmount } from '../../util/amounts';
7
- import { log } from '../../util/log';
8
- import { BBB_XDC, CGO_XDC, GAMA_XDC, SRX_XDC, stgUSDT_XDC, USDC_XDC, WXDC_XDC, } from '../token-provider';
9
- const BASES_TO_CHECK_TRADES_AGAINST = {
10
- [ChainId.XDC]: [WETH9[ChainId.XDC], USDC_XDC],
11
- [ChainId.APOTHEM]: [WETH9[ChainId.APOTHEM]],
12
- };
13
- export const ADDITIONAL_BASES = {
14
- [ChainId.XDC]: {
15
- [WETH9[ChainId.XDC].address]: [
16
- [USDC_XDC, FeeAmount.MEDIUM],
17
- [GAMA_XDC, FeeAmount.LOWEST],
18
- [stgUSDT_XDC, FeeAmount.MEDIUM],
19
- [SRX_XDC, FeeAmount.MEDIUM],
20
- [CGO_XDC, FeeAmount.MEDIUM],
21
- [BBB_XDC, FeeAmount.MEDIUM],
22
- [SRX_XDC, FeeAmount.HIGH],
23
- ],
24
- [USDC_XDC.address]: [
25
- [CGO_XDC, FeeAmount.MEDIUM],
26
- [WXDC_XDC, FeeAmount.MEDIUM],
27
- [SRX_XDC, FeeAmount.MEDIUM],
28
- [stgUSDT_XDC, FeeAmount.LOW],
29
- ],
30
- [GAMA_XDC.address]: [
31
- [WXDC_XDC, FeeAmount.LOWEST],
32
- [USDC_XDC, FeeAmount.LOWEST],
33
- ],
34
- [stgUSDT_XDC.address]: [
35
- [WXDC_XDC, FeeAmount.MEDIUM],
36
- [USDC_XDC, FeeAmount.LOW],
37
- ],
38
- [CGO_XDC.address]: [
39
- [WXDC_XDC, FeeAmount.MEDIUM],
40
- [USDC_XDC, FeeAmount.MEDIUM],
41
- ],
42
- [BBB_XDC.address]: [[WXDC_XDC, FeeAmount.MEDIUM]],
43
- [SRX_XDC.address]: [
44
- [WXDC_XDC, FeeAmount.MEDIUM],
45
- [USDC_XDC, FeeAmount.MEDIUM],
46
- [WXDC_XDC, FeeAmount.HIGH],
47
- ],
48
- },
49
- [ChainId.APOTHEM]: {},
50
- };
51
- export const Uni_V3_XDC_ADDITIONAL_BASES = ADDITIONAL_BASES[ChainId.XDC];
52
- let paths = [];
53
- const recFinder = (path, used, lastToken, dest, hops) => {
54
- const hop = path.length;
55
- // if (hop > 0) {
56
- // lastToken = path[hop - 1]![1];
57
- // }
58
- if (hop < hops) {
59
- if (!lastToken) {
60
- return;
61
- }
62
- const additional = Uni_V3_XDC_ADDITIONAL_BASES[lastToken.address];
63
- if (additional) {
64
- for (const ad of additional) {
65
- const adToken = ad;
66
- const newPair = [lastToken, ...adToken];
67
- const newPath = [...path, newPair];
68
- if (adToken[0].address === dest.address) {
69
- paths.push(newPath);
70
- continue;
71
- }
72
- if (!used[adToken[0].address]) {
73
- recFinder(newPath, { ...used, [adToken[0].address]: true }, adToken[0], dest, hops);
74
- }
75
- }
76
- }
77
- }
78
- };
79
- /**
80
- * Provider that uses a hardcoded list of V3 pools to generate a list of subgraph pools.
81
- *
82
- * Since the pools are hardcoded and the data does not come from the Subgraph, the TVL values
83
- * are dummys and should not be depended on.
84
- *
85
- * Useful for instances where other data sources are unavailable. E.g. Subgraph not available.
86
- *
87
- * @export
88
- * @class StaticV3SubgraphProvider
89
- */
90
- export class StaticV3UniSubgraphProvider {
91
- constructor(chainId, poolProvider) {
92
- this.chainId = chainId;
93
- this.poolProvider = poolProvider;
94
- }
95
- async getPools(tokenIn, tokenOut) {
96
- paths = [];
97
- log.info('In static subgraph provider for V3');
98
- const bases = BASES_TO_CHECK_TRADES_AGAINST[this.chainId];
99
- const basePairs = _.flatMap(bases, (base) => bases.map((otherBase) => [base, otherBase]));
100
- let pairs = [];
101
- if (tokenIn && tokenOut) {
102
- const additionalIn = ADDITIONAL_BASES[this.chainId][tokenIn.address];
103
- const additionalOut = ADDITIONAL_BASES[this.chainId][tokenOut.address];
104
- if (!additionalIn || !additionalOut) {
105
- basePairs.push([tokenIn, tokenOut]);
106
- if (additionalIn) {
107
- basePairs.push(...additionalIn.map((v) => [tokenIn, v[0]]));
108
- }
109
- else {
110
- basePairs.push(...bases.map((base) => [tokenIn, base]));
111
- }
112
- if (additionalOut) {
113
- basePairs.push(...additionalOut.map((v) => [tokenOut, v[0]]));
114
- }
115
- else {
116
- basePairs.push(...bases.map((base) => [tokenOut, base]));
117
- }
118
- pairs = _(basePairs)
119
- .filter((tokens) => Boolean(tokens[0] && tokens[1]))
120
- .filter(([tokenA, tokenB]) => tokenA.address !== tokenB.address && !tokenA.equals(tokenB))
121
- .flatMap(([tokenA, tokenB]) => {
122
- const additionalA = ADDITIONAL_BASES[this.chainId][tokenA.address];
123
- // const additionalB = ADDITIONAL_BASES[this.chainId][tokenB.address];
124
- if (additionalA) {
125
- const additionalPool = additionalA.filter((v) => v[0].address.toLowerCase() === tokenB.address.toLowerCase());
126
- const res = additionalPool.map((v) => {
127
- return [tokenA, v[0], v[1]];
128
- });
129
- return res;
130
- }
131
- return [
132
- [tokenA, tokenB, FeeAmount.LOWEST],
133
- [tokenA, tokenB, FeeAmount.LOW],
134
- [tokenA, tokenB, FeeAmount.MEDIUM],
135
- [tokenA, tokenB, FeeAmount.HIGH],
136
- ];
137
- })
138
- .value();
139
- }
140
- else {
141
- recFinder([], { [tokenIn.address]: true }, tokenIn, tokenOut, 5);
142
- // console.log(
143
- // paths.map((path) =>
144
- // path
145
- // .map(
146
- // (p) => `(${p[0].symbol} - ${p[1].symbol} : ${p[2] / 10000}% )`
147
- // )
148
- // .join(' --> ')
149
- // )
150
- // );
151
- const uniquePairs = {};
152
- paths.forEach((path) => {
153
- path.forEach((pool) => {
154
- const id = `${pool[0].address}-${pool[1].address}-${pool[2]}`;
155
- uniquePairs[id] = pool;
156
- });
157
- });
158
- const direct = tokenIn && tokenOut
159
- ? [
160
- [tokenIn, tokenOut, FeeAmount.LOWEST],
161
- [tokenIn, tokenOut, FeeAmount.LOW],
162
- [tokenIn, tokenOut, FeeAmount.MEDIUM],
163
- [tokenIn, tokenOut, FeeAmount.HIGH],
164
- ]
165
- : [];
166
- pairs = [...Object.values(uniquePairs), ...direct];
167
- }
168
- }
169
- log.info(`V3-UNI Static subgraph provider about to get ${pairs.length} pools on-chain`);
170
- const poolAccessor = await this.poolProvider.getPools(pairs);
171
- const pools = poolAccessor.getAllPools();
172
- const poolAddressSet = new Set();
173
- const subgraphPools = _(pools)
174
- .map((pool) => {
175
- const { token0, token1, fee, liquidity } = pool;
176
- const poolAddress = Pool.getAddress(pool.token0, pool.token1, pool.fee, UniV3Factory);
177
- if (poolAddressSet.has(poolAddress)) {
178
- return undefined;
179
- }
180
- poolAddressSet.add(poolAddress);
181
- const liquidityNumber = JSBI.toNumber(liquidity);
182
- return {
183
- id: poolAddress,
184
- feeTier: unparseFeeAmount(fee),
185
- liquidity: liquidity.toString(),
186
- token0: {
187
- id: token0.address,
188
- },
189
- token1: {
190
- id: token1.address,
191
- },
192
- // As a very rough proxy we just use liquidity for TVL.
193
- tvlETH: liquidityNumber,
194
- tvlUSD: liquidityNumber,
195
- };
196
- })
197
- .compact()
198
- .value();
199
- return subgraphPools;
200
- }
201
- }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLXYzLXVuaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjMvc3RhdGljLXN1YmdyYXBoLXByb3ZpZGVyLXYzLXVuaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBUyxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFdBQVcsRUFDWCxRQUFRLEVBQ1IsUUFBUSxHQUNULE1BQU0sbUJBQW1CLENBQUM7QUFTM0IsTUFBTSw2QkFBNkIsR0FBbUI7SUFDcEQsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQztJQUM3QyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Q0FDNUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUV6QjtJQUNGLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzVCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDNUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUM1QixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQy9CLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDM0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUMzQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQzNCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUM7U0FDMUI7UUFDRCxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNsQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQzNCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDNUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUMzQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDO1NBQzdCO1FBQ0QsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUM1QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDO1NBQzdCO1FBQ0QsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDckIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUM1QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDO1NBQzFCO1FBQ0QsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUM1QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDO1NBQzdCO1FBQ0QsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFB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