@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.
Files changed (88) hide show
  1. package/README.md +5 -0
  2. package/build/main/providers/caching-token-provider.js +2 -2
  3. package/build/main/providers/on-chain-quote-provider.js +2 -1
  4. package/build/main/providers/token-provider.d.ts +7 -12
  5. package/build/main/providers/token-provider.js +11 -26
  6. package/build/main/providers/v2/caching-pool-provider.js +1 -1
  7. package/build/main/providers/v2/pool-provider.d.ts +12 -3
  8. package/build/main/providers/v2/pool-provider.js +11 -10
  9. package/build/main/providers/v2/quote-provider.js +2 -2
  10. package/build/main/providers/v2/static-subgraph-provider.js +4 -16
  11. package/build/main/providers/v2/subgraph-provider-with-fallback.js +2 -1
  12. package/build/main/providers/v2-fathom/constants.d.ts +2 -0
  13. package/build/main/providers/v2-fathom/constants.js +6 -0
  14. package/build/main/providers/v2-fathom/static-subgraph-provider.d.ts +23 -0
  15. package/build/main/providers/v2-fathom/static-subgraph-provider.js +170 -0
  16. package/build/main/providers/v2-fathom/subgraph-provider.d.ts +35 -0
  17. package/build/main/providers/v2-fathom/subgraph-provider.js +130 -0
  18. package/build/main/providers/v2-fathom/utils.d.ts +2 -0
  19. package/build/main/providers/v2-fathom/utils.js +14 -0
  20. package/build/main/providers/v3/pool-provider.js +3 -2
  21. package/build/main/providers/v3/static-subgraph-provider.js +33 -82
  22. package/build/main/routers/alpha-router/alpha-router.d.ts +10 -2
  23. package/build/main/routers/alpha-router/alpha-router.js +43 -14
  24. package/build/main/routers/alpha-router/entities/route-with-valid-quote.d.ts +4 -3
  25. package/build/main/routers/alpha-router/entities/route-with-valid-quote.js +3 -3
  26. package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +2 -1
  27. package/build/main/routers/alpha-router/functions/compute-all-routes.js +3 -3
  28. package/build/main/routers/alpha-router/functions/get-candidate-pools.d.ts +2 -1
  29. package/build/main/routers/alpha-router/functions/get-candidate-pools.js +11 -3
  30. package/build/main/routers/alpha-router/quoters/base-quoter.d.ts +3 -1
  31. package/build/main/routers/alpha-router/quoters/base-quoter.js +3 -2
  32. package/build/main/routers/alpha-router/quoters/mixed-quoter.js +3 -2
  33. package/build/main/routers/alpha-router/quoters/v2-quoter.d.ts +2 -1
  34. package/build/main/routers/alpha-router/quoters/v2-quoter.js +10 -4
  35. package/build/main/routers/alpha-router/quoters/v3-quoter.js +3 -2
  36. package/build/main/routers/legacy-router/legacy-router.js +1 -1
  37. package/build/main/routers/router.d.ts +5 -3
  38. package/build/main/routers/router.js +5 -5
  39. package/build/main/tsconfig.tsbuildinfo +1 -1
  40. package/build/main/util/gas-factory-helpers.d.ts +1 -1
  41. package/build/main/util/gas-factory-helpers.js +4 -2
  42. package/build/main/util/methodParameters.js +3 -2
  43. package/build/main/util/protocols.js +3 -1
  44. package/build/main/util/routes.js +5 -2
  45. package/build/module/providers/caching-token-provider.js +3 -3
  46. package/build/module/providers/on-chain-quote-provider.js +2 -1
  47. package/build/module/providers/token-provider.d.ts +7 -12
  48. package/build/module/providers/token-provider.js +10 -24
  49. package/build/module/providers/v2/caching-pool-provider.js +1 -1
  50. package/build/module/providers/v2/pool-provider.d.ts +12 -3
  51. package/build/module/providers/v2/pool-provider.js +11 -10
  52. package/build/module/providers/v2/quote-provider.js +2 -2
  53. package/build/module/providers/v2/static-subgraph-provider.js +5 -17
  54. package/build/module/providers/v2/subgraph-provider-with-fallback.js +2 -1
  55. package/build/module/providers/v2-fathom/constants.d.ts +2 -0
  56. package/build/module/providers/v2-fathom/constants.js +3 -0
  57. package/build/module/providers/v2-fathom/static-subgraph-provider.d.ts +23 -0
  58. package/build/module/providers/v2-fathom/static-subgraph-provider.js +163 -0
  59. package/build/module/providers/v2-fathom/subgraph-provider.d.ts +35 -0
  60. package/build/module/providers/v2-fathom/subgraph-provider.js +131 -0
  61. package/build/module/providers/v2-fathom/utils.d.ts +2 -0
  62. package/build/module/providers/v2-fathom/utils.js +10 -0
  63. package/build/module/providers/v3/pool-provider.js +3 -2
  64. package/build/module/providers/v3/static-subgraph-provider.js +34 -83
  65. package/build/module/routers/alpha-router/alpha-router.d.ts +10 -2
  66. package/build/module/routers/alpha-router/alpha-router.js +43 -14
  67. package/build/module/routers/alpha-router/entities/route-with-valid-quote.d.ts +4 -3
  68. package/build/module/routers/alpha-router/entities/route-with-valid-quote.js +3 -3
  69. package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +2 -1
  70. package/build/module/routers/alpha-router/functions/compute-all-routes.js +3 -3
  71. package/build/module/routers/alpha-router/functions/get-candidate-pools.d.ts +2 -1
  72. package/build/module/routers/alpha-router/functions/get-candidate-pools.js +11 -3
  73. package/build/module/routers/alpha-router/quoters/base-quoter.d.ts +3 -1
  74. package/build/module/routers/alpha-router/quoters/base-quoter.js +3 -2
  75. package/build/module/routers/alpha-router/quoters/mixed-quoter.js +3 -2
  76. package/build/module/routers/alpha-router/quoters/v2-quoter.d.ts +2 -1
  77. package/build/module/routers/alpha-router/quoters/v2-quoter.js +10 -4
  78. package/build/module/routers/alpha-router/quoters/v3-quoter.js +3 -2
  79. package/build/module/routers/legacy-router/legacy-router.js +2 -2
  80. package/build/module/routers/router.d.ts +5 -3
  81. package/build/module/routers/router.js +5 -5
  82. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  83. package/build/module/util/gas-factory-helpers.d.ts +1 -1
  84. package/build/module/util/gas-factory-helpers.js +5 -3
  85. package/build/module/util/methodParameters.js +5 -4
  86. package/build/module/util/protocols.js +3 -1
  87. package/build/module/util/routes.js +5 -2
  88. 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,2 @@
1
+ import { Token } from '@x-swap-protocol/sdk-core';
2
+ export declare const getFathomPoolAddress: (tokenA: Token, tokenB: Token) => string;
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjMvcG9vbC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxvREFBOEU7QUFDOUUsOERBQTZEO0FBQzdELG9EQUF1QjtBQUV2Qix3R0FBcUc7QUFFckcsb0RBQWlFO0FBQ2pFLHdDQUFxQztBQUNyQyw4Q0FBaUQ7QUFHakQsb0RBQTJEO0FBNEQzRCxNQUFhLGNBQWM7SUFLekI7Ozs7O09BS0c7SUFDSCxZQUNZLE9BQWdCLEVBQ2hCLGtCQUFzQyxFQUN0QyxlQUFtQztRQUMzQyxPQUFPLEVBQUUsQ0FBQztRQUNWLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEdBQUc7S0FDaEI7UUFOUyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsaUJBQVksR0FBWixZQUFZLENBSXJCO1FBakJILHlFQUF5RTtRQUN6RSxrREFBa0Q7UUFDMUMsdUJBQWtCLEdBQThCLEVBQUUsQ0FBQztJQWdCdkQsQ0FBQztJQUVFLEtBQUssQ0FBQyxRQUFRLENBQ25CLFVBQXVDLEVBQ3ZDLGNBQStCO1FBRS9CLE1BQU0sY0FBYyxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3RELE1BQU0sZ0JBQWdCLEdBQXFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLG1CQUFtQixHQUFhLEVBQUUsQ0FBQztRQUV6QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtZQUNsQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7WUFFOUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDekQsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLENBQ1YsQ0FBQztZQUVGLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDbkMsU0FBUzthQUNWO1lBRUQsY0FBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsU0FBRyxDQUFDLEtBQUssQ0FDUCx3QkFBd0IsVUFBVSxDQUFDLE1BQU0saUNBQWlDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FDaEcsQ0FBQztRQUVGLE1BQU0sQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDekQsSUFBSSxDQUFDLFlBQVksQ0FBUyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxZQUFZLENBQ2YsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxjQUFjLENBQ2Y7U0FDRixDQUFDLENBQUM7UUFFSCxTQUFHLENBQUMsSUFBSSxDQUNOLGdDQUFnQyxjQUFjLENBQUMsSUFBSSxVQUFVLENBQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLFdBQVc7WUFDdEYsQ0FBQyxDQUFDLGdCQUFnQixjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsV0FBVyxHQUFHO1lBQ2hELENBQUMsQ0FBQyxFQUNKLEVBQUUsQ0FDSCxDQUFDO1FBRUYsTUFBTSxpQkFBaUIsR0FBb0MsRUFBRSxDQUFDO1FBRTlELE1BQU0sWUFBWSxHQUFnQyxFQUFFLENBQUM7UUFFckQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUMsc0VBQXNFO1lBQ3RFLElBQ0UsQ0FBQyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxPQUFPLENBQUE7Z0JBQ3JCLENBQUMsQ0FBQSxlQUFlLGFBQWYsZUFBZSx1QkFBZixlQUFlLENBQUUsT0FBTyxDQUFBO2dCQUN6QixXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ3JDO2dCQUNBLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBRSxDQUFDO2dCQUNuRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUV6QyxTQUFTO2FBQ1Y7WUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUUsQ0FBQztZQUNuRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxhQUFJLENBQ25CLE1BQU0sRUFDTixNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQzdCLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFDcEIsS0FBSyxDQUFDLElBQUksQ0FDWCxDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFFLENBQUM7WUFFNUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixTQUFHLENBQUMsSUFBSSxDQUNOO2dCQUNFLFlBQVksRUFBRSxnQkFBQyxDQUFDLEdBQUcsQ0FDakIsWUFBWSxFQUNaLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FDeEIsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxHQUFHLEtBQUssR0FBRyxDQUN0RDthQUNGLEVBQ0QsR0FBRyxZQUFZLENBQUMsTUFBTSw0RUFBNEUsQ0FDbkcsQ0FBQztTQUNIO1FBRUQsTUFBTSxRQUFRLEdBQUcsZ0JBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLHFCQUFZLENBQUMsQ0FBQztRQUV2RSxTQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsU0FBUyxRQUFRLENBQUMsTUFBTSxjQUFjLENBQUMsQ0FBQztRQUVoRSxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQ1AsTUFBYSxFQUNiLE1BQWEsRUFDYixTQUFvQixFQUNGLEVBQUU7Z0JBQ3BCLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZFLE9BQU8saUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELGdCQUFnQixFQUFFLENBQUMsT0FBZSxFQUFvQixFQUFFLENBQ3RELGlCQUFpQixDQUFDLE9BQU8sQ0FBQztZQUM1QixXQUFXLEVBQUUsR0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztTQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVNLGNBQWMsQ0FDbkIsTUFBYSxFQUNiLE1BQWEsRUFDYixTQUFvQjtRQUVwQixNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXJCLE1BQU0sUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7UUFFcEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhELElBQUksYUFBYSxFQUFFO1lBQ2pCLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUN2RDtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUEsMkJBQWtCLEVBQUM7WUFDckMsY0FBYyxFQUFFLHFDQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUU7WUFDeEQsTUFBTSxFQUFFLE1BQU07WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLEdBQUcsRUFBRSxTQUFTO1lBQ2QsMEJBQTBCLEVBQUUsK0JBQW1CO1NBQ2hELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUM7UUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQ3hCLGFBQXVCLEVBQ3ZCLFlBQW9CLEVBQ3BCLGNBQStCO1FBRS9CLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxJQUFBLHFCQUFLLEVBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUNBQW1DLENBR2hFO2dCQUNBLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixpQkFBaUIsRUFBRSwyREFBNEIsQ0FBQyxlQUFlLEVBQUU7Z0JBQ2pFLFlBQVksRUFBRSxZQUFZO2dCQUMxQixjQUFjO2FBQ2YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV0QixTQUFHLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRTFELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQTVMRCx3Q0E0TEMifQ==
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjMvcG9vbC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxvREFBOEU7QUFDOUUsOERBQTZEO0FBQzdELG9EQUF1QjtBQUV2Qix3R0FBcUc7QUFFckcsb0RBQWlFO0FBQ2pFLHdDQUFxQztBQUNyQyw4Q0FBaUQ7QUFHakQsb0RBQTJEO0FBNEQzRCxNQUFhLGNBQWM7SUFLekI7Ozs7O09BS0c7SUFDSCxZQUNZLE9BQWdCLEVBQ2hCLGtCQUFzQyxFQUN0QyxlQUFtQztRQUMzQyxPQUFPLEVBQUUsQ0FBQztRQUNWLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEdBQUc7S0FDaEI7UUFOUyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsaUJBQVksR0FBWixZQUFZLENBSXJCO1FBakJILHlFQUF5RTtRQUN6RSxrREFBa0Q7UUFDMUMsdUJBQWtCLEdBQThCLEVBQUUsQ0FBQztJQWdCeEQsQ0FBQztJQUVHLEtBQUssQ0FBQyxRQUFRLENBQ25CLFVBQXVDLEVBQ3ZDLGNBQStCO1FBRS9CLE1BQU0sY0FBYyxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3RELE1BQU0sZ0JBQWdCLEdBQXFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLG1CQUFtQixHQUFhLEVBQUUsQ0FBQztRQUV6QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtZQUNsQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7WUFFOUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDekQsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLENBQ1YsQ0FBQztZQUVG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