@w3lib/evm-batch-call 0.4.1 → 0.5.0

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 (92) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +166 -3
  3. package/dist/aggregate.d.ts.map +1 -1
  4. package/dist/aggregate.js +153 -40
  5. package/dist/aggregate.js.map +1 -1
  6. package/dist/fallback.d.ts +20 -0
  7. package/dist/fallback.d.ts.map +1 -1
  8. package/dist/fallback.js +36 -5
  9. package/dist/fallback.js.map +1 -1
  10. package/dist/lp.d.ts +149 -0
  11. package/dist/lp.d.ts.map +1 -0
  12. package/dist/lp.js +499 -0
  13. package/dist/lp.js.map +1 -0
  14. package/dist/lpMath.d.ts +25 -0
  15. package/dist/lpMath.d.ts.map +1 -0
  16. package/dist/lpMath.js +103 -0
  17. package/dist/lpMath.js.map +1 -0
  18. package/dist/lpV4.d.ts +108 -0
  19. package/dist/lpV4.d.ts.map +1 -0
  20. package/dist/lpV4.js +283 -0
  21. package/dist/lpV4.js.map +1 -0
  22. package/dist/owner.d.ts +1 -1
  23. package/dist/owner.d.ts.map +1 -1
  24. package/dist/owner.js +18 -5
  25. package/dist/owner.js.map +1 -1
  26. package/dist/scan.d.ts +54 -0
  27. package/dist/scan.d.ts.map +1 -1
  28. package/dist/scan.js +124 -92
  29. package/dist/scan.js.map +1 -1
  30. package/dist/source.d.ts +2 -0
  31. package/dist/source.d.ts.map +1 -1
  32. package/dist/source.js +4 -0
  33. package/dist/source.js.map +1 -1
  34. package/dist/subpaths/lp.d.ts +33 -0
  35. package/dist/subpaths/lp.d.ts.map +1 -0
  36. package/dist/subpaths/lp.js +47 -0
  37. package/dist/subpaths/lp.js.map +1 -0
  38. package/dist/subpaths/write.d.ts +20 -0
  39. package/dist/subpaths/write.d.ts.map +1 -0
  40. package/dist/subpaths/write.js +18 -0
  41. package/dist/subpaths/write.js.map +1 -0
  42. package/dist/tron.d.ts +2 -0
  43. package/dist/tron.d.ts.map +1 -1
  44. package/dist/tron.js +4 -0
  45. package/dist/tron.js.map +1 -1
  46. package/dist/write/batch.d.ts +88 -0
  47. package/dist/write/batch.d.ts.map +1 -0
  48. package/dist/write/batch.js +231 -0
  49. package/dist/write/batch.js.map +1 -0
  50. package/dist/write/collect.d.ts +53 -0
  51. package/dist/write/collect.d.ts.map +1 -0
  52. package/dist/write/collect.js +255 -0
  53. package/dist/write/collect.js.map +1 -0
  54. package/dist/write/rpc.d.ts +68 -0
  55. package/dist/write/rpc.d.ts.map +1 -0
  56. package/dist/write/rpc.js +236 -0
  57. package/dist/write/rpc.js.map +1 -0
  58. package/dist/write/send.d.ts +124 -0
  59. package/dist/write/send.d.ts.map +1 -0
  60. package/dist/write/send.js +373 -0
  61. package/dist/write/send.js.map +1 -0
  62. package/dist/write/signer.d.ts +58 -0
  63. package/dist/write/signer.d.ts.map +1 -0
  64. package/dist/write/signer.js +41 -0
  65. package/dist/write/signer.js.map +1 -0
  66. package/dist/write/transfer.d.ts +83 -0
  67. package/dist/write/transfer.d.ts.map +1 -0
  68. package/dist/write/transfer.js +259 -0
  69. package/dist/write/transfer.js.map +1 -0
  70. package/dist/write/tron.d.ts +58 -0
  71. package/dist/write/tron.d.ts.map +1 -0
  72. package/dist/write/tron.js +956 -0
  73. package/dist/write/tron.js.map +1 -0
  74. package/package.json +27 -14
  75. package/src/aggregate.ts +168 -36
  76. package/src/fallback.ts +55 -11
  77. package/src/lp.ts +721 -0
  78. package/src/lpMath.ts +113 -0
  79. package/src/lpV4.ts +406 -0
  80. package/src/owner.ts +19 -6
  81. package/src/scan.ts +155 -86
  82. package/src/source.ts +5 -0
  83. package/src/subpaths/lp.ts +71 -0
  84. package/src/subpaths/write.ts +26 -0
  85. package/src/tron.ts +5 -0
  86. package/src/write/batch.ts +302 -0
  87. package/src/write/collect.ts +312 -0
  88. package/src/write/rpc.ts +277 -0
  89. package/src/write/send.ts +490 -0
  90. package/src/write/signer.ts +90 -0
  91. package/src/write/transfer.ts +344 -0
  92. package/src/write/tron.ts +1100 -0
package/dist/lp.js ADDED
@@ -0,0 +1,499 @@
1
+ import { formatUnits } from './erc20.js';
2
+ import { getAmountsForLiquidity, getFeeGrowthInside, getFeesEarned, getSqrtRatioAtTick, sqrtPriceToPrice, tickToPrice } from './lpMath.js';
3
+ import { v4Positions } from './lpV4.js';
4
+ import { defillamaPrices } from './owner.js';
5
+ import { TRON_CHAIN_ID, isTronAddress, isTronChain, toEvmAddress, toTronAddress } from './tron.js';
6
+ import { withSignal } from './util.js';
7
+ const v2 = (id, name, chainId, factory) => ({ id, name, version: 'v2', chainId, factory });
8
+ const v3 = (id, name, chainId, positionManager, factory) => ({ id, name, version: 'v3', chainId, positionManager, factory });
9
+ const v4 = (chainId, positionManager, stateView, deployBlock) => ({
10
+ id: 'uniswap-v4',
11
+ name: 'Uniswap V4',
12
+ version: 'v4',
13
+ chainId,
14
+ positionManager,
15
+ stateView,
16
+ ...(deployBlock !== undefined ? { deployBlock } : {}),
17
+ });
18
+ const UNI_V3_NPM = '0xC36442b4a4522E871399CD717aBDD847Ab11FE88';
19
+ const UNI_V3_FACTORY = '0x1F98431c8aD98523631AE4a59f267346ea31F984';
20
+ const CAKE_V3_NPM = '0x46A15B0b27311cedF172AB29E4f4766fbE7F4364';
21
+ const CAKE_V3_FACTORY = '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865';
22
+ const SUSHI_V2_FACTORY = '0xc35DADB65012eC5796536bD9864eD8773aBc74C4';
23
+ /**
24
+ * 内置的 DEX 部署(2026-10 在链上逐个核对:V3 的 name / factory、V2 的 allPairsLength)。
25
+ * 不在表里的 DEX / 链可以通过 `protocols` 选项传入自己的 LpProtocol。
26
+ */
27
+ export const LP_PROTOCOLS = [
28
+ // Ethereum
29
+ v2('uniswap-v2', 'Uniswap V2', 1, '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f'),
30
+ v2('sushiswap-v2', 'SushiSwap', 1, '0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac'),
31
+ v2('pancakeswap-v2', 'PancakeSwap V2', 1, '0x1097053Fd2ea711dad45caCcc45EfF7548fCB362'),
32
+ v3('uniswap-v3', 'Uniswap V3', 1, UNI_V3_NPM, UNI_V3_FACTORY),
33
+ v3('pancakeswap-v3', 'PancakeSwap V3', 1, CAKE_V3_NPM, CAKE_V3_FACTORY),
34
+ // BSC
35
+ v2('pancakeswap-v2', 'PancakeSwap V2', 56, '0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73'),
36
+ v2('uniswap-v2', 'Uniswap V2', 56, '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6'),
37
+ v2('sushiswap-v2', 'SushiSwap', 56, SUSHI_V2_FACTORY),
38
+ v3('pancakeswap-v3', 'PancakeSwap V3', 56, CAKE_V3_NPM, CAKE_V3_FACTORY),
39
+ v3('uniswap-v3', 'Uniswap V3', 56, '0x7b8A01B39D58278b5DE7e48c8449c9f4F5170613', '0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7'),
40
+ // Base
41
+ v2('uniswap-v2', 'Uniswap V2', 8453, '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6'),
42
+ v2('pancakeswap-v2', 'PancakeSwap V2', 8453, '0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E'),
43
+ v3('uniswap-v3', 'Uniswap V3', 8453, '0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1', '0x33128a8fC17869897dcE68Ed026d694621f6FDfD'),
44
+ v3('pancakeswap-v3', 'PancakeSwap V3', 8453, CAKE_V3_NPM, CAKE_V3_FACTORY),
45
+ // Arbitrum
46
+ v2('uniswap-v2', 'Uniswap V2', 42161, '0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9'),
47
+ v2('sushiswap-v2', 'SushiSwap', 42161, SUSHI_V2_FACTORY),
48
+ v2('pancakeswap-v2', 'PancakeSwap V2', 42161, '0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E'),
49
+ v3('uniswap-v3', 'Uniswap V3', 42161, UNI_V3_NPM, UNI_V3_FACTORY),
50
+ v3('pancakeswap-v3', 'PancakeSwap V3', 42161, CAKE_V3_NPM, CAKE_V3_FACTORY),
51
+ // Optimism
52
+ v2('uniswap-v2', 'Uniswap V2', 10, '0x0c3c1c532F1e39EdF36BE9Fe0bE1410313E074Bf'),
53
+ v3('uniswap-v3', 'Uniswap V3', 10, UNI_V3_NPM, UNI_V3_FACTORY),
54
+ // Polygon
55
+ v2('uniswap-v2', 'Uniswap V2', 137, '0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C'),
56
+ v2('sushiswap-v2', 'SushiSwap', 137, SUSHI_V2_FACTORY),
57
+ v3('uniswap-v3', 'Uniswap V3', 137, UNI_V3_NPM, UNI_V3_FACTORY),
58
+ // Avalanche
59
+ v3('uniswap-v3', 'Uniswap V3', 43114, '0x655C406EBFa14EE2006250925e54ec43AD184f8B', '0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD'),
60
+ // Uniswap V4(PositionManager / StateView 在链上核对过:name、poolManager 一致)
61
+ v4(1, '0xbd216513d74c8cf14cf4747e6aaa6420ff64ee9e', '0x7ffe42c4a5deea5b0fec41c94c136cf115597227', 21689089),
62
+ v4(56, '0x7a4a5c919ae2541aed11041a1aeee68f1287f95b', '0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4', 45970613),
63
+ v4(8453, '0x7c5f5a4bbd8fd63184577525326123b519429bdc', '0xa3c0c9b65bad0b08107aa264b0f3db444b867a71', 25350993),
64
+ v4(42161, '0xd88f38f930b7952f2db2432cb002e7abbf3dd869', '0x76fd297e2d437cd7f76d50f01afe6160f86e9990', 297842893),
65
+ v4(10, '0x3c3ea4b57a46241e54610e5f022e5c45859a1017', '0xc18a3169788f4f75a170290584eca6395c75ecdb', 130947681),
66
+ v4(137, '0x1ec2ebf4f37e7363fdfe3551602425af0b3ceef9', '0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a', 66980394),
67
+ // Tron:SunSwap(V2 工厂的 allPairsLength、V3 仓位合约的 name / factory 在链上核对过)
68
+ v2('sunswap-v2', 'SunSwap V2', TRON_CHAIN_ID.mainnet, 'TKWJdrQkqHisa1X8HUdHEfREvTzw4pMAaY'),
69
+ v3('sunswap-v3', 'SunSwap V3', TRON_CHAIN_ID.mainnet, 'TLSWrv7eC1AZCXkRjpqMZUmvgd99cj7pPF', 'TThJt8zaJzJMhCEScH7zWKnp5buVZqys9x'),
70
+ ];
71
+ /**
72
+ * 各链常见的计价币:查 V2 LP 时,用“传入的代币 × 计价币”(以及计价币之间)在工厂合约里查池子。
73
+ * 主流池子几乎都有一边是这些币
74
+ */
75
+ export const LP_QUOTE_TOKENS = {
76
+ 1: [
77
+ '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', // WETH
78
+ '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT
79
+ '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC
80
+ '0x6B175474E89094C44Da98b954EedeAC495271d0F', // DAI
81
+ ],
82
+ 56: [
83
+ '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c', // WBNB
84
+ '0x55d398326f99059fF775485246999027B3197955', // USDT
85
+ '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', // USDC
86
+ '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56', // BUSD
87
+ ],
88
+ 8453: [
89
+ '0x4200000000000000000000000000000000000006', // WETH
90
+ '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
91
+ ],
92
+ 42161: [
93
+ '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', // WETH
94
+ '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', // USDC
95
+ '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9', // USDT
96
+ ],
97
+ 10: [
98
+ '0x4200000000000000000000000000000000000006', // WETH
99
+ '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', // USDC
100
+ '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58', // USDT
101
+ ],
102
+ 137: [
103
+ '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270', // WPOL
104
+ '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', // USDC
105
+ '0xc2132D05D31c914a87C6611C10748AEb04B58e8F', // USDT
106
+ ],
107
+ 43114: [
108
+ '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7', // WAVAX
109
+ '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', // USDC
110
+ ],
111
+ [TRON_CHAIN_ID.mainnet]: [
112
+ 'TNUC9Qb1rRpS5CbWLmNMxXBjyFoydXjWFR', // WTRX
113
+ 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t', // USDT
114
+ 'TPYmHEhy5n8TCEfYGqW2rPxsghSfzghPDn', // USDD
115
+ 'TSSMHYeV2uE9qYH95DqyoCuNCzEL1NvU3S', // SUN
116
+ ],
117
+ };
118
+ // ---------------------------------------------------------------------------
119
+ // ABI
120
+ // ---------------------------------------------------------------------------
121
+ const V2_FACTORY_ABI = ['function getPair(address tokenA, address tokenB) view returns (address)'];
122
+ const V2_PAIR_ABI = [
123
+ 'function balanceOf(address owner) view returns (uint256)',
124
+ 'function totalSupply() view returns (uint256)',
125
+ 'function token0() view returns (address)',
126
+ 'function token1() view returns (address)',
127
+ 'function factory() view returns (address)',
128
+ 'function getReserves() view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast)',
129
+ ];
130
+ const V3_NPM_ABI = [
131
+ 'function balanceOf(address owner) view returns (uint256)',
132
+ 'function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)',
133
+ 'function positions(uint256 tokenId) view returns (uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1)',
134
+ ];
135
+ const V3_FACTORY_ABI = ['function getPool(address tokenA, address tokenB, uint24 fee) view returns (address)'];
136
+ // 只声明前几个返回值:各分叉后面的字段类型不同(如 PancakeSwap 的 feeProtocol 是 uint32),多出来的数据解码时忽略
137
+ const V3_POOL_ABI = [
138
+ 'function slot0() view returns (uint160 sqrtPriceX96, int24 tick)',
139
+ 'function feeGrowthGlobal0X128() view returns (uint256)',
140
+ 'function feeGrowthGlobal1X128() view returns (uint256)',
141
+ 'function ticks(int24 tick) view returns (uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128)',
142
+ ];
143
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
144
+ const U128_MASK = (1n << 128n) - 1n;
145
+ /** 地址统一成小写的 0x 格式再比较(Tron 的 T 地址先转换;合约调用返回的地址都是 0x 格式) */
146
+ const lower = (address) => (isTronAddress(address) ? toEvmAddress(address) : address).toLowerCase();
147
+ /** 选项里传给合约调用的部分(区块、取消等) */
148
+ function callOverrides(options) {
149
+ const { blockTag, from, minBlock, signal } = options;
150
+ return { ...(blockTag !== undefined ? { blockTag } : {}), ...(from !== undefined ? { from } : {}), ...(minBlock !== undefined ? { minBlock } : {}), ...(signal ? { signal } : {}) };
151
+ }
152
+ // ---------------------------------------------------------------------------
153
+ // 查询
154
+ // ---------------------------------------------------------------------------
155
+ /** 选出要查的协议 */
156
+ export function resolveLpProtocols(chainId, options = {}) {
157
+ const builtin = LP_PROTOCOLS.filter((p) => p.chainId === chainId);
158
+ const selected = options.protocols
159
+ ? options.protocols.flatMap((p) => {
160
+ if (typeof p !== 'string') {
161
+ return p.chainId === chainId ? [p] : [];
162
+ }
163
+ const found = builtin.filter((b) => b.id === p);
164
+ if (!found.length) {
165
+ throw new Error(`Unknown LP protocol ${p} on chain ${chainId}; pass an LpProtocol object for protocols that are not built in`);
166
+ }
167
+ return found;
168
+ })
169
+ : builtin;
170
+ return options.versions ? selected.filter((p) => options.versions?.includes(p.version)) : selected;
171
+ }
172
+ async function v2Positions(provider, owner, protocols, allV2, options, chainId) {
173
+ const { pools = [], tokens = [], quoteTokens = LP_QUOTE_TOKENS[chainId] ?? [], source, fetch: fetchOption } = options;
174
+ const overrides = callOverrides(options);
175
+ const candidates = new Set(pools.map(lower));
176
+ // 代币来源(如 alchemy)列出的代币里可能有 LP 代币:都当作候选,下面用 token0 / token1 / factory 识别
177
+ if (source) {
178
+ const fetchFn = fetchOption ?? ((...args) => fetch(...args));
179
+ const discovered = (await source.discover({ chainId, owner, fetch: fetchFn, provider })) ?? [];
180
+ for (const token of discovered) {
181
+ candidates.add(lower(token.address));
182
+ }
183
+ }
184
+ // 传入的代币 × 计价币(以及计价币之间)在每个 V2 工厂里查池子
185
+ const quotes = [...new Set(quoteTokens.map(lower))];
186
+ const bases = [...new Set([...tokens.map(lower), ...quotes])];
187
+ const pairKeys = new Set();
188
+ const getPair = [];
189
+ for (const protocol of protocols) {
190
+ const factory = provider.contract(protocol.factory, V2_FACTORY_ABI);
191
+ for (const base of bases) {
192
+ for (const quote of quotes) {
193
+ const key = `${lower(protocol.factory)}:${[base, quote].sort().join(':')}`;
194
+ if (base === quote || pairKeys.has(key)) {
195
+ continue;
196
+ }
197
+ pairKeys.add(key);
198
+ getPair.push(factory.getPair(base, quote));
199
+ }
200
+ }
201
+ }
202
+ for (const pair of await provider.tryAll(getPair, overrides)) {
203
+ if (pair && pair !== ZERO_ADDRESS) {
204
+ candidates.add(lower(pair));
205
+ }
206
+ }
207
+ if (!candidates.size) {
208
+ return [];
209
+ }
210
+ // 持有的 LP 代币
211
+ const list = [...candidates];
212
+ const balances = await provider.tryAll(list.map((pair) => provider.contract(pair, V2_PAIR_ABI).balanceOf(owner)), overrides);
213
+ const held = list.filter((_, i) => (balances[i] ?? 0n) > 0n);
214
+ if (!held.length) {
215
+ return [];
216
+ }
217
+ // 池子详情:token0 / token1 / 储备 / 总量 / 工厂(识别协议;读不到的不是 V2 池子)
218
+ const details = await provider.tryAll(held.flatMap((pair) => {
219
+ const c = provider.contract(pair, V2_PAIR_ABI);
220
+ return [c.token0(), c.token1(), c.getReserves(), c.totalSupply(), c.factory()];
221
+ }), overrides);
222
+ const selectedFactories = new Set(protocols.map((p) => lower(p.factory)));
223
+ return held.flatMap((pool, i) => {
224
+ const [token0, token1, reserves, totalSupply, factory] = details.slice(i * 5, i * 5 + 5);
225
+ if (!token0 || !token1 || !reserves || !totalSupply) {
226
+ return [];
227
+ }
228
+ const factoryAddress = factory ? lower(factory) : '';
229
+ const protocol = allV2.find((p) => lower(p.factory) === factoryAddress) ?? null;
230
+ // 显式传入的池子不限协议;查出来 / 来源发现的只保留选中的协议(来源里的普通代币没有 token0,上面已经去掉)
231
+ if (!pools.some((p) => lower(p) === pool) && protocol && !selectedFactories.has(factoryAddress)) {
232
+ return [];
233
+ }
234
+ const balance = balances[list.indexOf(pool)];
235
+ return [
236
+ {
237
+ version: 'v2',
238
+ protocol,
239
+ factory: factoryAddress,
240
+ pool,
241
+ token0,
242
+ token1,
243
+ balance,
244
+ totalSupply,
245
+ amount0: totalSupply === 0n ? 0n : (reserves[0] * balance) / totalSupply,
246
+ amount1: totalSupply === 0n ? 0n : (reserves[1] * balance) / totalSupply,
247
+ },
248
+ ];
249
+ });
250
+ }
251
+ async function v3Positions(provider, owner, protocols, options) {
252
+ const { includeClosed = false } = options;
253
+ const maxPositions = Math.floor(options.maxPositions ?? 500);
254
+ const overrides = callOverrides(options);
255
+ if (!protocols.length || !(maxPositions > 0)) {
256
+ return [];
257
+ }
258
+ // 每个协议持有几个仓位 NFT → 逐个取 tokenId
259
+ const counts = await provider.tryAll(protocols.map((p) => provider.contract(p.positionManager, V3_NPM_ABI).balanceOf(owner)), overrides);
260
+ const indexCalls = [];
261
+ const indexOwners = [];
262
+ protocols.forEach((protocol, i) => {
263
+ // 仓位很多的地址(做市机器人等)只看最近的 maxPositions 个:新铸造的 NFT 排在最后
264
+ const count = Number(counts[i] ?? 0n);
265
+ const npm = provider.contract(protocol.positionManager, V3_NPM_ABI);
266
+ for (let index = Math.max(0, count - maxPositions); index < count; index++) {
267
+ indexCalls.push(npm.tokenOfOwnerByIndex(owner, index));
268
+ indexOwners.push(protocol);
269
+ }
270
+ });
271
+ if (!indexCalls.length) {
272
+ return [];
273
+ }
274
+ const tokenIds = await provider.tryAll(indexCalls, overrides);
275
+ const ids = tokenIds.flatMap((id, i) => (id === null ? [] : [{ protocol: indexOwners[i], tokenId: id }]));
276
+ const positions = await provider.tryAll(ids.map(({ protocol, tokenId }) => provider.contract(protocol.positionManager, V3_NPM_ABI).positions(tokenId)), overrides);
277
+ const open = ids
278
+ .map((item, i) => ({ ...item, data: positions[i] ?? null }))
279
+ .filter((x) => x.data !== null)
280
+ .filter((x) => includeClosed || x.data.liquidity > 0n || x.data.tokensOwed0 > 0n || x.data.tokensOwed1 > 0n);
281
+ if (!open.length) {
282
+ return [];
283
+ }
284
+ // 池子地址(同一个协议、同一对代币、同一档手续费只查一次)
285
+ const poolKey = (x) => `${x.protocol.positionManager}:${lower(x.data.token0)}:${lower(x.data.token1)}:${x.data.fee}`;
286
+ const poolKeys = [...new Set(open.map(poolKey))];
287
+ const poolSamples = poolKeys.map((key) => open.find((x) => poolKey(x) === key));
288
+ const poolAddresses = await provider.tryAll(poolSamples.map((x) => provider.contract(x.protocol.factory, V3_FACTORY_ABI).getPool(x.data.token0, x.data.token1, x.data.fee)), overrides);
289
+ const poolOf = new Map(poolKeys.map((key, i) => [key, poolAddresses[i] && poolAddresses[i] !== ZERO_ADDRESS ? poolAddresses[i] : null]));
290
+ // 池子状态(每个池子一次)+ 每个仓位两端 tick 的手续费增长
291
+ const pools = [...new Set([...poolOf.values()].filter((p) => p !== null).map(lower))];
292
+ const poolCalls = pools.flatMap((pool) => {
293
+ const c = provider.contract(pool, V3_POOL_ABI);
294
+ return [c.slot0(), c.feeGrowthGlobal0X128(), c.feeGrowthGlobal1X128()];
295
+ });
296
+ const tickCalls = open.flatMap((x) => {
297
+ const pool = poolOf.get(poolKey(x));
298
+ if (!pool) {
299
+ return [];
300
+ }
301
+ const c = provider.contract(pool, V3_POOL_ABI);
302
+ return [c.ticks(x.data.tickLower), c.ticks(x.data.tickUpper)];
303
+ });
304
+ const state = await provider.tryAll([...poolCalls, ...tickCalls], overrides);
305
+ const poolState = new Map(pools.map((pool, i) => {
306
+ const [slot0, global0, global1] = state.slice(i * 3, i * 3 + 3);
307
+ return [pool, slot0 && global0 !== null && global1 !== null ? { sqrtPriceX96: slot0[0], tick: Number(slot0[1]), global0, global1 } : null];
308
+ }));
309
+ let t = poolCalls.length;
310
+ return open.flatMap((x) => {
311
+ const pool = poolOf.get(poolKey(x));
312
+ if (!pool) {
313
+ return [];
314
+ }
315
+ const lowerTick = state[t++];
316
+ const upperTick = state[t++];
317
+ const s = poolState.get(lower(pool));
318
+ if (!s || !lowerTick || !upperTick) {
319
+ return [];
320
+ }
321
+ const tickLower = Number(x.data.tickLower);
322
+ const tickUpper = Number(x.data.tickUpper);
323
+ const [amount0, amount1] = getAmountsForLiquidity(s.sqrtPriceX96, getSqrtRatioAtTick(tickLower), getSqrtRatioAtTick(tickUpper), x.data.liquidity);
324
+ const inside0 = getFeeGrowthInside(s.tick, tickLower, tickUpper, s.global0, lowerTick[2], upperTick[2]);
325
+ const inside1 = getFeeGrowthInside(s.tick, tickLower, tickUpper, s.global1, lowerTick[3], upperTick[3]);
326
+ return [
327
+ {
328
+ version: 'v3',
329
+ protocol: x.protocol,
330
+ pool,
331
+ tokenId: x.tokenId,
332
+ token0: x.data.token0,
333
+ token1: x.data.token1,
334
+ fee: Number(x.data.fee),
335
+ tickLower,
336
+ tickUpper,
337
+ tick: s.tick,
338
+ sqrtPriceX96: s.sqrtPriceX96,
339
+ liquidity: x.data.liquidity,
340
+ amount0,
341
+ amount1,
342
+ // 与仓位合约一致:tokensOwed += uint128(新增),按 uint128 截断 / 回绕(正常仓位不会碰到)
343
+ fees0: (x.data.tokensOwed0 + (getFeesEarned(x.data.liquidity, inside0, x.data.feeGrowthInside0LastX128) & U128_MASK)) & U128_MASK,
344
+ fees1: (x.data.tokensOwed1 + (getFeesEarned(x.data.liquidity, inside1, x.data.feeGrowthInside1LastX128) & U128_MASK)) & U128_MASK,
345
+ },
346
+ ];
347
+ });
348
+ }
349
+ function reportPriceError(onPriceError, err) {
350
+ try {
351
+ onPriceError?.(err);
352
+ }
353
+ catch {
354
+ // 回调出错不影响查询结果
355
+ }
356
+ }
357
+ /** 补上代币信息(symbol / 精度)、换算数量、可选的美元价值 */
358
+ async function finalize(provider, chainId, raw, options) {
359
+ const { prices, fetch: fetchOption } = options;
360
+ const overrides = callOverrides(options);
361
+ const tron = isTronChain(chainId);
362
+ /** 输出的地址:Tron 上转成 T 地址(与 tronWeb 等一致) */
363
+ const out = (address) => (tron && /^0x[0-9a-fA-F]{40}$/.test(address) ? toTronAddress(address) : address);
364
+ /** 价格源的键:EVM 小写 0x 地址;Tron 用 T 地址(区分大小写) */
365
+ const priceKey = (address) => (tron ? toTronAddress(address) : lower(address));
366
+ const addresses = [...new Set(raw.flatMap((r) => [lower(r.token0), lower(r.token1)]))];
367
+ // V4 的主币池子 currency 是零地址:Provider 的 nativeTokens 不含零地址时(如配置成只认 0xeeee…),按它的第一个主币地址查主币信息
368
+ const nativeAlias = provider.isNativeToken(ZERO_ADDRESS) ? undefined : provider.nativeTokens[0];
369
+ const query = addresses.map((a) => (a === ZERO_ADDRESS && nativeAlias !== undefined ? nativeAlias : a));
370
+ const details = addresses.length ? await provider.tokens(query, { ...overrides, fields: ['symbol', 'decimals'] }) : [];
371
+ const info = new Map(addresses.map((address, i) => {
372
+ const d = details[i];
373
+ return [address, { address: out(address), native: d?.native ?? false, symbol: d?.symbol ?? null, decimals: d?.decimals ?? null }];
374
+ }));
375
+ const token = (address) => {
376
+ const t = info.get(lower(address));
377
+ return { ...t, address: out(address) };
378
+ };
379
+ const fmt = (value, t) => (t.decimals === null ? null : formatUnits(value, t.decimals));
380
+ // 美元价值(可选)
381
+ const priceSource = prices === true ? defillamaPrices() : prices || null;
382
+ let priceMap = new Map();
383
+ if (priceSource && raw.length) {
384
+ const fetchFn = fetchOption ?? ((...args) => fetch(...args));
385
+ const nativeToken = [...info.values()].find((t) => t.native);
386
+ // 价格源出错(服务不可用、被拦截等)时照样返回仓位,只是不带价格(valueUsd / feesUsd 为 null)
387
+ try {
388
+ priceMap = await priceSource.prices({
389
+ chainId,
390
+ tokens: addresses.filter((a) => !info.get(a)?.native).map((a) => (tron ? toTronAddress(a) : a)),
391
+ nativeSymbol: nativeToken ? nativeToken.symbol : null,
392
+ fetch: fetchFn,
393
+ });
394
+ }
395
+ catch (err) {
396
+ // 同步抛错和 reject 都在这里接住
397
+ reportPriceError(options.onPriceError, err);
398
+ }
399
+ }
400
+ const usd = (t, formatted) => {
401
+ const price = priceMap.get(t.native ? 'native' : priceKey(t.address));
402
+ return formatted === null || price === undefined ? null : Number(formatted) * price;
403
+ };
404
+ const sum = (a, b, amountA, amountB) => {
405
+ // 数量为 0 的一边没有价格也不影响
406
+ if ((a === null && amountA > 0n) || (b === null && amountB > 0n)) {
407
+ return null;
408
+ }
409
+ return (a ?? 0) + (b ?? 0);
410
+ };
411
+ const list = raw.map((r) => {
412
+ const token0 = token(r.token0);
413
+ const token1 = token(r.token1);
414
+ const amount0Formatted = fmt(r.amount0, token0);
415
+ const amount1Formatted = fmt(r.amount1, token1);
416
+ const base = {
417
+ chainId,
418
+ // 不认识的工厂:'v2:<工厂地址>'(Tron 上是 T 地址;读不到工厂时为 'v2:unknown')
419
+ protocol: r.protocol ? r.protocol.id : `v2:${r.factory ? out(r.factory) : 'unknown'}`,
420
+ protocolName: r.protocol ? r.protocol.name : 'Unknown V2',
421
+ pool: r.version === 'v4' ? r.pool : out(r.pool),
422
+ token0,
423
+ token1,
424
+ amount0: r.amount0.toString(),
425
+ amount1: r.amount1.toString(),
426
+ amount0Formatted,
427
+ amount1Formatted,
428
+ ...(priceSource ? { valueUsd: sum(usd(token0, amount0Formatted), usd(token1, amount1Formatted), r.amount0, r.amount1) } : {}),
429
+ };
430
+ if (r.version === 'v2') {
431
+ return {
432
+ ...base,
433
+ version: 'v2',
434
+ balance: r.balance.toString(),
435
+ totalSupply: r.totalSupply.toString(),
436
+ share: r.totalSupply === 0n ? 0 : Number((r.balance * 10n ** 18n) / r.totalSupply) / 1e18,
437
+ };
438
+ }
439
+ const fees0Formatted = fmt(r.fees0, token0);
440
+ const fees1Formatted = fmt(r.fees1, token1);
441
+ const decimalsKnown = token0.decimals !== null && token1.decimals !== null;
442
+ return {
443
+ ...base,
444
+ version: r.version,
445
+ tokenId: r.tokenId.toString(),
446
+ positionManager: out(r.protocol.positionManager),
447
+ fee: r.fee,
448
+ tickLower: r.tickLower,
449
+ tickUpper: r.tickUpper,
450
+ tick: r.tick,
451
+ inRange: r.tick >= r.tickLower && r.tick < r.tickUpper,
452
+ liquidity: r.liquidity.toString(),
453
+ price: decimalsKnown ? sqrtPriceToPrice(r.sqrtPriceX96, token0.decimals, token1.decimals) : null,
454
+ priceLower: decimalsKnown ? tickToPrice(r.tickLower, token0.decimals, token1.decimals) : null,
455
+ priceUpper: decimalsKnown ? tickToPrice(r.tickUpper, token0.decimals, token1.decimals) : null,
456
+ fees0: r.fees0.toString(),
457
+ fees1: r.fees1.toString(),
458
+ fees0Formatted,
459
+ fees1Formatted,
460
+ ...(priceSource ? { feesUsd: sum(usd(token0, fees0Formatted), usd(token1, fees1Formatted), r.fees0, r.fees1) } : {}),
461
+ ...(r.hooks !== undefined ? { hooks: r.hooks } : {}),
462
+ };
463
+ });
464
+ // 有价格时按价值从高到低(仓位价值 + 未领取手续费),没有价格的排在后面
465
+ if (priceSource) {
466
+ const total = (p) => (p.valueUsd === null || p.valueUsd === undefined ? -1 : p.valueUsd + ('feesUsd' in p ? (p.feesUsd ?? 0) : 0));
467
+ list.sort((a, b) => total(b) - total(a));
468
+ }
469
+ return list;
470
+ }
471
+ /**
472
+ * 查一个地址的 LP 仓位:V2(持有的 LP 代币)、V3 / V4(仓位 NFT)。所有合约读取都用 multicall 批量完成。
473
+ *
474
+ * ```ts
475
+ * await lpPositions(multi, user) // 这条链上内置的全部协议
476
+ * await lpPositions(multi, user, { tokens: heldTokens, prices: true }) // V2 用持有的代币找池子,带美元价值
477
+ * ```
478
+ */
479
+ export function lpPositions(provider, owner, options = {}) {
480
+ // 取消时立即 reject(扫描 / 价格等进行中的请求不中断,结果丢弃)
481
+ return withSignal(options.signal, () => queryLpPositions(provider, owner, options));
482
+ }
483
+ async function queryLpPositions(provider, owner, options) {
484
+ const chainId = await provider.getChainId();
485
+ const protocols = resolveLpProtocols(chainId, options);
486
+ const allV2 = [...LP_PROTOCOLS.filter((p) => p.chainId === chainId && p.version === 'v2'), ...protocols.filter((p) => p.version === 'v2')];
487
+ const v2Selected = protocols.filter((p) => p.version === 'v2');
488
+ const v3Selected = protocols.filter((p) => p.version === 'v3');
489
+ const v4Selected = protocols.filter((p) => p.version === 'v4');
490
+ const wantV2 = !options.versions || options.versions.includes('v2');
491
+ const wantV4 = v4Selected.length > 0 && !!(options.v4?.tokenIds?.length || options.v4?.scan);
492
+ const [v2List, v3List, v4List] = await Promise.all([
493
+ wantV2 && (v2Selected.length || options.pools?.length || options.source) ? v2Positions(provider, owner, v2Selected, allV2, options, chainId) : Promise.resolve([]),
494
+ v3Positions(provider, owner, v3Selected, options),
495
+ wantV4 ? v4Positions(provider, owner, v4Selected, options.v4 ?? {}, options.includeClosed ?? false, options.maxPositions ?? 500, callOverrides(options)) : Promise.resolve([]),
496
+ ]);
497
+ return finalize(provider, chainId, [...v2List, ...v3List, ...v4List], options);
498
+ }
499
+ //# sourceMappingURL=lp.js.map
package/dist/lp.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lp.js","sourceRoot":"","sources":["../src/lp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 集中流动性(Uniswap V3 / V4 及其分叉)的数学:tick ↔ sqrtPrice、按流动性算代币数量、未领取的手续费。
3
+ * 与 Uniswap 合约里的整数算法逐位一致(TickMath、LiquidityAmounts、Position 的手续费计算)。
4
+ */
5
+ export declare const MIN_TICK = -887272;
6
+ export declare const MAX_TICK = 887272;
7
+ /** TickMath.getSqrtRatioAtTick:tick → sqrt(1.0001^tick) 的 Q64.96 定点数 */
8
+ export declare function getSqrtRatioAtTick(tick: number): bigint;
9
+ /**
10
+ * LiquidityAmounts.getAmountsForLiquidity:当前价格 sqrtPrice 下,价格区间 [sqrtA, sqrtB] 内流动性 L 对应的两种代币数量
11
+ * (与移除全部流动性时拿到的数量一致,向下取整)
12
+ */
13
+ export declare function getAmountsForLiquidity(sqrtPrice: bigint, sqrtA: bigint, sqrtB: bigint, liquidity: bigint): [bigint, bigint];
14
+ /**
15
+ * 区间内的累计手续费增长(Tick.getFeeGrowthInside,按 uint256 回绕)。
16
+ * global:池子的 feeGrowthGlobalX128;lowerOutside / upperOutside:两端 tick 的 feeGrowthOutsideX128
17
+ */
18
+ export declare function getFeeGrowthInside(tick: number, tickLower: number, tickUpper: number, global: bigint, lowerOutside: bigint, upperOutside: bigint): bigint;
19
+ /** 自上次结算以来新产生的手续费:L × (inside − insideLast) / 2^128(差值按 uint256 回绕,与合约一致) */
20
+ export declare function getFeesEarned(liquidity: bigint, feeGrowthInside: bigint, feeGrowthInsideLast: bigint): bigint;
21
+ /** sqrtPriceX96 → token1 / token0 的价格(按精度换算后的人类可读数字,有浮点误差,只用于展示) */
22
+ export declare function sqrtPriceToPrice(sqrtPriceX96: bigint, decimals0: number, decimals1: number): number;
23
+ /** tick → token1 / token0 的价格(按精度换算,只用于展示) */
24
+ export declare function tickToPrice(tick: number, decimals0: number, decimals1: number): number;
25
+ //# sourceMappingURL=lpMath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lpMath.d.ts","sourceRoot":"","sources":["../src/lpMath.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,QAAQ,UAAU,CAAA;AAC/B,eAAO,MAAM,QAAQ,SAAS,CAAA;AA8B9B,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBvD;AAYD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAc3H;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAIzJ;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAE7G;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAInG;AAED,8CAA8C;AAC9C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtF"}