@paraswap/dex-lib 4.8.21 → 4.8.22

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 (38) hide show
  1. package/build/abi/pancakeswap-infinity/cl-pool-manager.abi.json +136 -0
  2. package/build/abi/pancakeswap-infinity/cl-quoter.abi.json +66 -0
  3. package/build/abi/pancakeswap-infinity/router.abi.json +23 -0
  4. package/build/dex/pancakeswap-infinity/config.d.ts +4 -0
  5. package/build/dex/pancakeswap-infinity/config.js +30 -0
  6. package/build/dex/pancakeswap-infinity/config.js.map +1 -0
  7. package/build/dex/pancakeswap-infinity/constants.d.ts +11 -0
  8. package/build/dex/pancakeswap-infinity/constants.js +15 -0
  9. package/build/dex/pancakeswap-infinity/constants.js.map +1 -0
  10. package/build/dex/pancakeswap-infinity/encoder.d.ts +16 -0
  11. package/build/dex/pancakeswap-infinity/encoder.js +289 -0
  12. package/build/dex/pancakeswap-infinity/encoder.js.map +1 -0
  13. package/build/dex/pancakeswap-infinity/liquidity.d.ts +1 -0
  14. package/build/dex/pancakeswap-infinity/liquidity.js +7 -0
  15. package/build/dex/pancakeswap-infinity/liquidity.js.map +1 -0
  16. package/build/dex/pancakeswap-infinity/optimizer.d.ts +2 -0
  17. package/build/dex/pancakeswap-infinity/optimizer.js +48 -0
  18. package/build/dex/pancakeswap-infinity/optimizer.js.map +1 -0
  19. package/build/dex/pancakeswap-infinity/pancakeswap-infinity-pool-manager.d.ts +36 -0
  20. package/build/dex/pancakeswap-infinity/pancakeswap-infinity-pool-manager.js +393 -0
  21. package/build/dex/pancakeswap-infinity/pancakeswap-infinity-pool-manager.js.map +1 -0
  22. package/build/dex/pancakeswap-infinity/pancakeswap-infinity-pool.d.ts +37 -0
  23. package/build/dex/pancakeswap-infinity/pancakeswap-infinity-pool.js +289 -0
  24. package/build/dex/pancakeswap-infinity/pancakeswap-infinity-pool.js.map +1 -0
  25. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.d.ts +42 -0
  26. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.js +350 -0
  27. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.js.map +1 -0
  28. package/build/dex/pancakeswap-infinity/subgraph.d.ts +8 -0
  29. package/build/dex/pancakeswap-infinity/subgraph.js +122 -0
  30. package/build/dex/pancakeswap-infinity/subgraph.js.map +1 -0
  31. package/build/dex/pancakeswap-infinity/types.d.ts +101 -0
  32. package/build/dex/pancakeswap-infinity/types.js +3 -0
  33. package/build/dex/pancakeswap-infinity/types.js.map +1 -0
  34. package/build/dex/pancakeswap-infinity/utils.d.ts +5 -0
  35. package/build/dex/pancakeswap-infinity/utils.js +45 -0
  36. package/build/dex/pancakeswap-infinity/utils.js.map +1 -0
  37. package/build/dex/uniswap-v3/config.js +1 -1
  38. package/package.json +1 -1
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.PancakeSwapInfinity = void 0;
40
+ const constants_1 = require("../../constants");
41
+ const utils_1 = require("../../utils");
42
+ const simple_exchange_1 = require("../simple-exchange");
43
+ const config_1 = require("./config");
44
+ const CALLDATA_GAS_COST = __importStar(require("../../calldata-gas-cost"));
45
+ const cl_quoter_abi_json_1 = __importDefault(require("../../abi/pancakeswap-infinity/cl-quoter.abi.json"));
46
+ const bigint_constants_1 = require("../../bigint-constants");
47
+ const abi_1 = require("@ethersproject/abi");
48
+ const decoders_1 = require("../../lib/decoders");
49
+ const encoder_1 = require("./encoder");
50
+ const pancakeswap_infinity_pool_manager_1 = require("./pancakeswap-infinity-pool-manager");
51
+ const uniswap_v4_pool_math_1 = require("../uniswap-v4/contract-math/uniswap-v4-pool-math");
52
+ const core_1 = require("@paraswap/core");
53
+ const subgraph_1 = require("./subgraph");
54
+ const constants_2 = require("./constants");
55
+ const uniswap_v3_1 = require("../uniswap-v3/uniswap-v3");
56
+ const liquidity_1 = require("./liquidity");
57
+ class PancakeSwapInfinity extends simple_exchange_1.SimpleExchange {
58
+ network;
59
+ dexHelper;
60
+ routerAddress;
61
+ quoterAddress;
62
+ clPoolManagerAddress;
63
+ hasConstantPriceLargeAmounts = false;
64
+ needWrapNative = false;
65
+ logger;
66
+ quoterIface;
67
+ poolManager;
68
+ static dexKeysWithNetwork = (0, utils_1.getDexKeysWithNetwork)(config_1.PancakeSwapInfinityConfig);
69
+ wethAddress;
70
+ constructor(network, dexKey, dexHelper, routerAddress = config_1.PancakeSwapInfinityConfig[dexKey][network].router, quoterAddress = config_1.PancakeSwapInfinityConfig[dexKey][network].quoter, clPoolManagerAddress = config_1.PancakeSwapInfinityConfig[dexKey][network]
71
+ .clPoolManager) {
72
+ super(dexHelper, dexKey);
73
+ this.network = network;
74
+ this.dexHelper = dexHelper;
75
+ this.routerAddress = routerAddress;
76
+ this.quoterAddress = quoterAddress;
77
+ this.clPoolManagerAddress = clPoolManagerAddress;
78
+ this.logger = dexHelper.getLogger(dexKey);
79
+ this.quoterIface = new abi_1.Interface(cl_quoter_abi_json_1.default);
80
+ this.wethAddress =
81
+ this.dexHelper.config.data.wrappedNativeTokenAddress.toLowerCase();
82
+ const dexConfig = config_1.PancakeSwapInfinityConfig[dexKey][network];
83
+ this.poolManager = new pancakeswap_infinity_pool_manager_1.PancakeSwapInfinityPoolManager(dexHelper, dexKey, network, dexConfig, this.logger, this.cacheStateKey);
84
+ }
85
+ async initializePricing(blockNumber) {
86
+ await this.poolManager.initialize(blockNumber);
87
+ }
88
+ async addMasterPool(poolKey, blockNumber) {
89
+ const _pairs = await this.dexHelper.cache.hget(uniswap_v3_1.PoolsRegistryHashKey, `${this.cacheStateKey}_${poolKey}`);
90
+ if (!_pairs) {
91
+ this.logger.warn(`${this.dexKey}: did not find poolConfig in for key ${uniswap_v3_1.PoolsRegistryHashKey} ${this.cacheStateKey}_${poolKey}`);
92
+ return false;
93
+ }
94
+ const poolInfo = JSON.parse(_pairs);
95
+ const pool = await this.poolManager.getEventPool(poolInfo.poolId, blockNumber);
96
+ return Boolean(pool);
97
+ }
98
+ async getPoolIdentifiers(from, to, side, blockNumber) {
99
+ const pools = await this.poolManager.getAvailablePoolsForPair(from.address.toLowerCase(), to.address.toLowerCase(), blockNumber);
100
+ const eventPools = (await Promise.all(pools.map(async (pool) => this.poolManager.getEventPool(pool.id, blockNumber)))).filter(pool => pool !== null);
101
+ return eventPools.map(eventPool => eventPool.poolId);
102
+ }
103
+ _getOutputs(pool, state, amounts, zeroForOne, side) {
104
+ try {
105
+ const outputsResult = uniswap_v4_pool_math_1.uniswapV4PoolMath.queryOutputs(pool, state, amounts, zeroForOne, side);
106
+ if (outputsResult !== null &&
107
+ side === core_1.SwapSide.BUY &&
108
+ outputsResult[outputsResult?.length - 1] === 0n) {
109
+ return null;
110
+ }
111
+ return outputsResult;
112
+ }
113
+ catch (e) {
114
+ this.logger.debug(`${this.dexKey}: received error in _getOutputs while calculating outputs`, e);
115
+ return null;
116
+ }
117
+ }
118
+ async getPricesVolume(from, to, amounts, side, blockNumber, limitPools) {
119
+ const pools = await this.poolManager.getAvailablePoolsForPair(from.address.toLowerCase(), to.address.toLowerCase(), blockNumber);
120
+ const availablePools = limitPools?.filter(t => pools.find(p => p.id === t)) ??
121
+ pools.map(t => t.id);
122
+ const pricesPromises = availablePools.map(async (poolId) => {
123
+ const pool = pools.find(p => p.id === poolId);
124
+ const fromAddress = from.address.toLowerCase();
125
+ const poolCurrency0 = pool.key.currency0;
126
+ const isFromEth = (0, utils_1.isETHAddress)(fromAddress);
127
+ const isFromWeth = fromAddress === this.wethAddress;
128
+ const currency0IsEth = poolCurrency0 === constants_1.NULL_ADDRESS;
129
+ const currency0IsWeth = poolCurrency0 === this.wethAddress;
130
+ const zeroForOne = fromAddress === poolCurrency0 ||
131
+ (isFromEth && currency0IsEth) ||
132
+ (isFromEth && currency0IsWeth) ||
133
+ (isFromWeth && currency0IsEth);
134
+ const eventPool = await this.poolManager.getEventPool(poolId, blockNumber);
135
+ const poolState = (await eventPool?.getState(blockNumber)) || null;
136
+ let prices;
137
+ if (poolState !== null && poolState.isValid) {
138
+ prices = this._getOutputs(pool, poolState, amounts, zeroForOne, side);
139
+ }
140
+ else {
141
+ this.logger.warn(`${this.dexKey}-${this.network}: pool ${poolId} state was not found...falling back to rpc`);
142
+ prices = await this.queryPriceFromRpc(zeroForOne, amounts, pool, side, blockNumber);
143
+ }
144
+ if (prices === null) {
145
+ return null;
146
+ }
147
+ if (prices?.every(price => price === 0n || price === 1n)) {
148
+ return null;
149
+ }
150
+ return {
151
+ unit: bigint_constants_1.BI_POWS[to.decimals],
152
+ prices,
153
+ data: {
154
+ path: [
155
+ {
156
+ pool: {
157
+ id: pool.id,
158
+ key: pool.key,
159
+ },
160
+ tokenIn: zeroForOne ? pool.key.currency0 : pool.key.currency1,
161
+ tokenOut: zeroForOne ? pool.key.currency1 : pool.key.currency0,
162
+ zeroForOne,
163
+ },
164
+ ],
165
+ },
166
+ poolAddresses: [this.clPoolManagerAddress],
167
+ exchange: this.dexKey,
168
+ gasCost: 100_000,
169
+ poolIdentifiers: [poolId],
170
+ };
171
+ });
172
+ const prices = await Promise.all(pricesPromises);
173
+ return prices.filter(res => res !== null);
174
+ }
175
+ getCalldataGasCost(poolPrices) {
176
+ if (poolPrices.data.path.length === 1) {
177
+ return (CALLDATA_GAS_COST.DEX_OVERHEAD +
178
+ // poolKey -> currency0
179
+ CALLDATA_GAS_COST.ADDRESS +
180
+ // poolKey -> currency1
181
+ CALLDATA_GAS_COST.ADDRESS +
182
+ // poolKey -> hooks
183
+ CALLDATA_GAS_COST.ADDRESS +
184
+ // poolKey -> poolManager
185
+ CALLDATA_GAS_COST.ADDRESS +
186
+ // poolKey -> fee
187
+ CALLDATA_GAS_COST.wordNonZeroBytes(3) +
188
+ // poolKey -> parameters
189
+ CALLDATA_GAS_COST.FULL_WORD +
190
+ // zeroForOne
191
+ CALLDATA_GAS_COST.BOOL +
192
+ // amountIn
193
+ CALLDATA_GAS_COST.AMOUNT +
194
+ // amountOutMinimum
195
+ CALLDATA_GAS_COST.AMOUNT +
196
+ // hookData
197
+ CALLDATA_GAS_COST.ZERO_BYTE);
198
+ }
199
+ else {
200
+ return (CALLDATA_GAS_COST.DEX_OVERHEAD +
201
+ // currency
202
+ CALLDATA_GAS_COST.ADDRESS +
203
+ // amount
204
+ CALLDATA_GAS_COST.AMOUNT +
205
+ // minAmount
206
+ CALLDATA_GAS_COST.AMOUNT +
207
+ poolPrices.data.path.reduce(step => {
208
+ return (CALLDATA_GAS_COST.DEX_OVERHEAD +
209
+ CALLDATA_GAS_COST.ADDRESS +
210
+ CALLDATA_GAS_COST.ADDRESS +
211
+ CALLDATA_GAS_COST.ADDRESS +
212
+ CALLDATA_GAS_COST.ADDRESS +
213
+ CALLDATA_GAS_COST.wordNonZeroBytes(3) +
214
+ CALLDATA_GAS_COST.FULL_WORD +
215
+ CALLDATA_GAS_COST.BOOL +
216
+ CALLDATA_GAS_COST.AMOUNT +
217
+ CALLDATA_GAS_COST.AMOUNT +
218
+ CALLDATA_GAS_COST.ZERO_BYTE);
219
+ }, 0));
220
+ }
221
+ }
222
+ getAdapters(side) {
223
+ return null;
224
+ }
225
+ async getTopPoolsForToken(_tokenAddress, limit) {
226
+ let tokenAddress = _tokenAddress.toLowerCase();
227
+ if ((0, utils_1.isETHAddress)(tokenAddress))
228
+ tokenAddress = constants_1.NULL_ADDRESS;
229
+ const { pools0, pools1 } = await (0, subgraph_1.queryAvailablePoolsForToken)(this.dexHelper, this.logger, this.dexKey, config_1.PancakeSwapInfinityConfig[this.dexKey][this.network].subgraphURL, tokenAddress, limit, undefined, [constants_1.NULL_ADDRESS]);
230
+ if (!(pools0 || pools1)) {
231
+ this.logger.error(`Error_${this.dexKey}_Subgraph: couldn't fetch the pools from the subgraph`);
232
+ return [];
233
+ }
234
+ if (pools0.length === 0 && pools1.length === 0) {
235
+ return [];
236
+ }
237
+ const blockNumber = await this.dexHelper.provider.getBlockNumber();
238
+ const pools = pools0.concat(pools1);
239
+ const poolStates = await this.poolManager.generateMultiplePoolStates(pools, blockNumber);
240
+ const validPoolStates = poolStates.filter(t => t !== null);
241
+ const tokenAmounts = [];
242
+ for (const poolState of validPoolStates) {
243
+ const { totalAmount0, totalAmount1 } = (0, liquidity_1.calculateTotalPoolLiquidity)(poolState);
244
+ tokenAmounts.push([poolState.token0, totalAmount0]);
245
+ tokenAmounts.push([poolState.token1, totalAmount1]);
246
+ }
247
+ const usdTokenAmounts = await this.dexHelper.getUsdTokenAmounts(tokenAmounts.map(t => [
248
+ t[0] === constants_1.NULL_ADDRESS ? constants_1.ETHER_ADDRESS : t[0],
249
+ t[1],
250
+ ]));
251
+ const allTokens = pools.map(pool => [pool.token0, pool.token1]).flat();
252
+ const liquidityPools = [];
253
+ for (let i = 0; i < validPoolStates.length; i++) {
254
+ const poolState = validPoolStates[i];
255
+ const isToken0 = poolState.token0 === tokenAddress;
256
+ const connector = isToken0 ? poolState.token1 : poolState.token0;
257
+ const connectorToken = allTokens.find(t => t.address === connector);
258
+ const token0UsdAmount = usdTokenAmounts[i * 2];
259
+ const token1UsdAmount = usdTokenAmounts[i * 2 + 1];
260
+ liquidityPools.push({
261
+ exchange: this.dexKey,
262
+ address: poolState.id,
263
+ connectorTokens: [
264
+ {
265
+ address: connectorToken.address,
266
+ decimals: Number(connectorToken.decimals),
267
+ liquidityUSD: isToken0
268
+ ? (token1UsdAmount *
269
+ constants_2.PANCAKESWAP_INFINITY_EFFICIENCY_FACTOR)
270
+ : (token0UsdAmount *
271
+ constants_2.PANCAKESWAP_INFINITY_EFFICIENCY_FACTOR),
272
+ },
273
+ ],
274
+ liquidityUSD: (isToken0 ? token0UsdAmount : token1UsdAmount) *
275
+ constants_2.PANCAKESWAP_INFINITY_EFFICIENCY_FACTOR,
276
+ });
277
+ }
278
+ liquidityPools.sort((a, b) => b.liquidityUSD - a.liquidityUSD);
279
+ return liquidityPools.slice(0, limit);
280
+ }
281
+ async queryPriceFromRpc(zeroForOne, amounts, pool, side, blockNumber) {
282
+ const funcName = side === core_1.SwapSide.SELL
283
+ ? 'quoteExactInputSingle'
284
+ : 'quoteExactOutputSingle';
285
+ const calls = amounts.map(amount => ({
286
+ target: this.quoterAddress,
287
+ callData: this.quoterIface.encodeFunctionData(funcName, [
288
+ {
289
+ poolKey: {
290
+ currency0: pool.key.currency0,
291
+ currency1: pool.key.currency1,
292
+ hooks: pool.key.hooks,
293
+ poolManager: pool.key.poolManager,
294
+ fee: pool.key.fee,
295
+ parameters: pool.key.parameters,
296
+ },
297
+ zeroForOne,
298
+ exactAmount: amount.toString(),
299
+ hookData: '0x',
300
+ },
301
+ ]),
302
+ decodeFunction: (result) => {
303
+ return (0, decoders_1.generalDecoder)(result, ['uint256', 'uint256'], 0n, value => BigInt(value[0].toString()));
304
+ },
305
+ }));
306
+ const results = await this.dexHelper.multiWrapper.tryAggregate(false, calls, blockNumber);
307
+ return results.map(result => (result.success ? result.returnData : 0n));
308
+ }
309
+ getDexParam(srcToken, destToken, srcAmount, destAmount, recipient, data, side) {
310
+ let encodingMethod;
311
+ if (data.path.length === 1 && side === core_1.SwapSide.SELL) {
312
+ encodingMethod = encoder_1.swapExactInputSingleCalldata;
313
+ }
314
+ else if (data.path.length === 1 && side === core_1.SwapSide.BUY) {
315
+ encodingMethod = encoder_1.swapExactOutputSingleCalldata;
316
+ }
317
+ else if (data.path.length > 1 && side === core_1.SwapSide.SELL) {
318
+ encodingMethod = encoder_1.swapExactInputCalldata;
319
+ }
320
+ else if (data.path.length > 1 && side === core_1.SwapSide.BUY) {
321
+ encodingMethod = encoder_1.swapExactOutputCalldata;
322
+ }
323
+ else {
324
+ throw new Error(`${this.dexKey}-${this.network}: Logic error for side: ${side}, data.path.length: ${data.path.length}`);
325
+ }
326
+ const exchangeData = encodingMethod(srcToken, destToken, data, BigInt(srcAmount), side === core_1.SwapSide.SELL ? 0n : BigInt(destAmount), recipient, this.wethAddress);
327
+ return {
328
+ needWrapNative: this.needWrapNative,
329
+ sendEthButSupportsInsertFromAmount: true,
330
+ dexFuncHasRecipient: true,
331
+ exchangeData,
332
+ targetExchange: this.routerAddress,
333
+ returnAmountPos: undefined,
334
+ transferSrcTokenBeforeSwap: (0, utils_1.isETHAddress)(srcToken)
335
+ ? undefined
336
+ : this.routerAddress,
337
+ skipApproval: true,
338
+ };
339
+ }
340
+ getAdapterParam(srcToken, destToken, srcAmount, destAmount, data, side) {
341
+ const payload = '0x';
342
+ return {
343
+ targetExchange: this.routerAddress,
344
+ payload,
345
+ networkFee: '0',
346
+ };
347
+ }
348
+ }
349
+ exports.PancakeSwapInfinity = PancakeSwapInfinity;
350
+ //# sourceMappingURL=pancakeswap-infinity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pancakeswap-infinity.js","sourceRoot":"","sources":["../../../src/dex/pancakeswap-infinity/pancakeswap-infinity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { SubgraphConnectorPool, SubgraphPool } from './types';
2
+ import { IDexHelper } from '../../dex-helper';
3
+ import { Logger } from 'log4js';
4
+ export declare function queryAvailablePoolsForToken(dexHelper: IDexHelper, logger: Logger, dexKey: string, subgraphUrl: string, tokenAddress: string, limit: number, staticPoolsList?: string[], hooks?: string[]): Promise<{
5
+ pools0: SubgraphConnectorPool[];
6
+ pools1: SubgraphConnectorPool[];
7
+ }>;
8
+ export declare function queryOnePageForAllAvailablePoolsFromSubgraph(dexHelper: IDexHelper, logger: Logger, dexKey: string, subgraphUrl: string, blockNumber: number, skip: number, limit: number, hooks?: string[], latestBlock?: boolean): Promise<SubgraphPool[]>;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.queryAvailablePoolsForToken = queryAvailablePoolsForToken;
4
+ exports.queryOnePageForAllAvailablePoolsFromSubgraph = queryOnePageForAllAvailablePoolsFromSubgraph;
5
+ const constants_1 = require("./constants");
6
+ const constants_2 = require("../../constants");
7
+ async function queryAvailablePoolsForToken(dexHelper, logger, dexKey, subgraphUrl, tokenAddress, limit, staticPoolsList, hooks = [constants_2.NULL_ADDRESS]) {
8
+ const list = staticPoolsList
9
+ ? staticPoolsList.map(t => `"${t}"`).join(',')
10
+ : '';
11
+ const poolsQuery = `query ($token: Bytes!, $hooks: [Bytes!], $minTVL: Int!, $count: Int) {
12
+ pools0: pools(
13
+ where: {
14
+ token0: $token
15
+ hooks_in: $hooks
16
+ liquidity_gt: 0
17
+ totalValueLockedUSD_gte: $minTVL
18
+ ${list ? `id_in: [${list}]` : ''}
19
+ }
20
+ orderBy: volumeUSD
21
+ orderDirection: desc
22
+ first: $count
23
+ ) {
24
+ id
25
+ volumeUSD
26
+ token0 {
27
+ address: id
28
+ decimals
29
+ }
30
+ token1 {
31
+ address: id
32
+ decimals
33
+ }
34
+ fee: feeTier
35
+ tickSpacing
36
+ hooks
37
+ }
38
+ pools1: pools(
39
+ where: {
40
+ token1: $token
41
+ hooks_in: $hooks
42
+ liquidity_gt: 0
43
+ totalValueLockedUSD_gte: $minTVL
44
+ ${list ? `id_in: [${list}]` : ''}
45
+ }
46
+ orderBy: volumeUSD
47
+ orderDirection: desc
48
+ first: $count
49
+ ) {
50
+ id
51
+ volumeUSD
52
+ token0 {
53
+ address: id
54
+ decimals
55
+ }
56
+ token1 {
57
+ address: id
58
+ decimals
59
+ }
60
+ fee: feeTier
61
+ tickSpacing
62
+ hooks
63
+ }
64
+ }
65
+ `;
66
+ const res = await dexHelper.httpRequest.querySubgraph(subgraphUrl, {
67
+ query: poolsQuery,
68
+ variables: {
69
+ token: tokenAddress,
70
+ count: limit,
71
+ hooks,
72
+ minTVL: constants_1.POOL_MIN_TVL_USD,
73
+ },
74
+ }, { timeout: constants_1.SUBGRAPH_TIMEOUT });
75
+ if (res.errors && res.errors.length) {
76
+ throw new Error(res.errors[0].message);
77
+ }
78
+ return res.data;
79
+ }
80
+ async function queryOnePageForAllAvailablePoolsFromSubgraph(dexHelper, logger, dexKey, subgraphUrl, blockNumber, skip, limit, hooks = [constants_2.NULL_ADDRESS], latestBlock = false) {
81
+ const poolsQuery = `query ($skip: Int!, $minTVL: Int!, $hooks: [Bytes!]) {
82
+ pools(
83
+ where: { hooks_in: $hooks, liquidity_gt: 0, totalValueLockedUSD_gte: $minTVL },
84
+ ${latestBlock ? '' : `block: { number: ${blockNumber} }`}
85
+ orderBy: totalValueLockedUSD
86
+ orderDirection: desc
87
+ skip: $skip
88
+ first: ${limit}
89
+ ) {
90
+ id
91
+ fee: feeTier
92
+ volumeUSD
93
+ tickSpacing
94
+ token0 {
95
+ address: id
96
+ }
97
+ token1 {
98
+ address: id
99
+ }
100
+ hooks
101
+ }
102
+ }`;
103
+ const res = await dexHelper.httpRequest.querySubgraph(subgraphUrl, {
104
+ query: poolsQuery,
105
+ variables: {
106
+ skip,
107
+ hooks,
108
+ minTVL: constants_1.POOL_MIN_TVL_USD,
109
+ },
110
+ }, { timeout: constants_1.SUBGRAPH_TIMEOUT });
111
+ if (res.errors && res.errors.length) {
112
+ if (res.errors[0].message.includes('missing block')) {
113
+ logger.info(`${dexKey}: subgraph fallback to the latest block...`);
114
+ return queryOnePageForAllAvailablePoolsFromSubgraph(dexHelper, logger, dexKey, subgraphUrl, blockNumber, skip, limit, hooks, true);
115
+ }
116
+ else {
117
+ throw new Error(res.errors[0].message);
118
+ }
119
+ }
120
+ return res.data.pools;
121
+ }
122
+ //# sourceMappingURL=subgraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../../src/dex/pancakeswap-infinity/subgraph.ts"],"names":[],"mappings":";;AAOA,kEAiGC;AAED,oGAwEC;AAjLD,2CAAiE;AAIjE,+CAA+C;AAExC,KAAK,UAAU,2BAA2B,CAC/C,SAAqB,EACrB,MAAc,EACd,MAAc,EACd,WAAmB,EACnB,YAAoB,EACpB,KAAa,EACb,eAA0B,EAC1B,QAAkB,CAAC,wBAAY,CAAC;IAKhC,MAAM,IAAI,GAAG,eAAe;QAC1B,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,UAAU,GAAG;;;;;;;UAOX,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;UA0B9B,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;CAqBvC,CAAC;IAEA,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,aAAa,CAOnD,WAAW,EACX;QACE,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE;YACT,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,KAAK;YACZ,KAAK;YACL,MAAM,EAAE,4BAAgB;SACzB;KACF,EACD,EAAE,OAAO,EAAE,4BAAgB,EAAE,CAC9B,CAAC;IAEF,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,4CAA4C,CAChE,SAAqB,EACrB,MAAc,EACd,MAAc,EACd,WAAmB,EACnB,WAAmB,EACnB,IAAY,EACZ,KAAa,EACb,QAAkB,CAAC,wBAAY,CAAC,EAChC,WAAW,GAAG,KAAK;IAEnB,MAAM,UAAU,GAAG;;;UAGX,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,WAAW,IAAI;;;;iBAI/C,KAAK;;;;;;;;;;;;;;MAchB,CAAC;IAEL,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,aAAa,CAMnD,WAAW,EACX;QACE,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE;YACT,IAAI;YACJ,KAAK;YACL,MAAM,EAAE,4BAAgB;SACzB;KACF,EACD,EAAE,OAAO,EAAE,4BAAgB,EAAE,CAC9B,CAAC;IAEF,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,4CAA4C,CAAC,CAAC;YACnE,OAAO,4CAA4C,CACjD,SAAS,EACT,MAAM,EACN,MAAM,EACN,WAAW,EACX,WAAW,EACX,IAAI,EACJ,KAAK,EACL,KAAK,EACL,IAAI,CACL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { Address, NumberAsString } from '../../types';
2
+ export type TickInfo = {
3
+ liquidityGross: bigint;
4
+ liquidityNet: bigint;
5
+ };
6
+ export type PoolManagerState = Record<string, never>;
7
+ export type PoolState = {
8
+ id: string;
9
+ token0: string;
10
+ token1: string;
11
+ fee: string;
12
+ hooks: string;
13
+ feeGrowthGlobal0X128: bigint;
14
+ feeGrowthGlobal1X128: bigint;
15
+ liquidity: bigint;
16
+ slot0: Slot0;
17
+ tickSpacing: number;
18
+ ticks: Record<NumberAsString, TickInfo>;
19
+ tickBitmap: Record<NumberAsString, bigint>;
20
+ isValid: boolean;
21
+ };
22
+ export type Slot0 = {
23
+ sqrtPriceX96: bigint;
24
+ tick: bigint;
25
+ protocolFee: bigint;
26
+ lpFee: bigint;
27
+ };
28
+ export type ModifyLiquidityParams = {
29
+ liquidityDelta: bigint;
30
+ tickLower: bigint;
31
+ tickUpper: bigint;
32
+ tickSpacing: bigint;
33
+ };
34
+ export type PoolPairsInfo = {
35
+ poolId: string;
36
+ };
37
+ export type PancakeSwapInfinityData = {
38
+ path: {
39
+ tokenIn: Address;
40
+ tokenOut: Address;
41
+ zeroForOne: boolean;
42
+ pool: Pool;
43
+ }[];
44
+ };
45
+ export type Pool = {
46
+ id: string;
47
+ key: PoolKey;
48
+ };
49
+ export type OutputResult = {
50
+ outputs: bigint[];
51
+ tickCounts: number[];
52
+ };
53
+ export type SubgraphConnectorPool = {
54
+ id: string;
55
+ volumeUSD: string;
56
+ token0: {
57
+ address: string;
58
+ decimals: string;
59
+ };
60
+ token1: {
61
+ address: string;
62
+ decimals: string;
63
+ };
64
+ fee: string;
65
+ tickSpacing: string;
66
+ hooks: string;
67
+ };
68
+ export type SubgraphTick = {
69
+ tickIdx: string;
70
+ liquidityGross: string;
71
+ liquidityNet: string;
72
+ };
73
+ export type SubgraphPool = {
74
+ id: string;
75
+ fee: string;
76
+ hooks: string;
77
+ volumeUSD?: string;
78
+ token0: {
79
+ address: string;
80
+ };
81
+ token1: {
82
+ address: string;
83
+ };
84
+ tickSpacing: string;
85
+ };
86
+ export type DexParams = {
87
+ clPoolManager: Address;
88
+ vault: Address;
89
+ quoter: Address;
90
+ router: Address;
91
+ subgraphURL: string;
92
+ };
93
+ export type PoolKey = {
94
+ currency0: Address;
95
+ currency1: Address;
96
+ hooks: Address;
97
+ poolManager: Address;
98
+ fee: string;
99
+ parameters: string;
100
+ tickSpacing: number;
101
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dex/pancakeswap-infinity/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { PoolKey, PoolState } from './types';
2
+ export declare function sortPools(a: PoolState, b: PoolState): 1 | -1 | 0;
3
+ export declare function toId(key: PoolKey): string;
4
+ export declare function getTickSpacingFromParameters(parameters: string): number;
5
+ export declare function encodeParameters(tickSpacing: number, hookPermissions?: number): string;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sortPools = sortPools;
4
+ exports.toId = toId;
5
+ exports.getTickSpacingFromParameters = getTickSpacingFromParameters;
6
+ exports.encodeParameters = encodeParameters;
7
+ const ethers_1 = require("ethers");
8
+ function sortPools(a, b) {
9
+ const idA = a.id.toUpperCase();
10
+ const idB = b.id.toUpperCase();
11
+ if (idA < idB) {
12
+ return -1;
13
+ }
14
+ if (idA > idB) {
15
+ return 1;
16
+ }
17
+ return 0;
18
+ }
19
+ // PancakeSwap Infinity PoolId = keccak256(abi.encode(PoolKey))
20
+ // PoolKey: (currency0, currency1, hooks, poolManager, fee, parameters)
21
+ function toId(key) {
22
+ return ethers_1.ethers.utils.keccak256(ethers_1.ethers.utils.defaultAbiCoder.encode(['address', 'address', 'address', 'address', 'uint24', 'bytes32'], [
23
+ key.currency0.toLowerCase(),
24
+ key.currency1.toLowerCase(),
25
+ key.hooks.toLowerCase(),
26
+ key.poolManager.toLowerCase(),
27
+ parseInt(key.fee),
28
+ key.parameters,
29
+ ]));
30
+ }
31
+ // Extract tickSpacing from the parameters bytes32
32
+ // tickSpacing is stored at bits 16-39 (int24, shifted left by 16)
33
+ function getTickSpacingFromParameters(parameters) {
34
+ const paramsBN = BigInt(parameters);
35
+ const raw = Number((paramsBN >> 16n) & 0xffffffn);
36
+ // Sign-extend int24
37
+ return raw > 0x7fffff ? raw - 0x1000000 : raw;
38
+ }
39
+ // Encode tickSpacing into a parameters bytes32 (no hook permissions)
40
+ function encodeParameters(tickSpacing, hookPermissions = 0) {
41
+ const ts = tickSpacing < 0 ? tickSpacing + 0x1000000 : tickSpacing;
42
+ const value = BigInt(ts) << 16n | BigInt(hookPermissions);
43
+ return ethers_1.ethers.utils.hexZeroPad(ethers_1.ethers.BigNumber.from(value).toHexString(), 32);
44
+ }
45
+ //# sourceMappingURL=utils.js.map