@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.
- package/CHANGELOG.md +21 -0
- package/README.md +166 -3
- package/dist/aggregate.d.ts.map +1 -1
- package/dist/aggregate.js +153 -40
- package/dist/aggregate.js.map +1 -1
- package/dist/fallback.d.ts +20 -0
- package/dist/fallback.d.ts.map +1 -1
- package/dist/fallback.js +36 -5
- package/dist/fallback.js.map +1 -1
- package/dist/lp.d.ts +149 -0
- package/dist/lp.d.ts.map +1 -0
- package/dist/lp.js +499 -0
- package/dist/lp.js.map +1 -0
- package/dist/lpMath.d.ts +25 -0
- package/dist/lpMath.d.ts.map +1 -0
- package/dist/lpMath.js +103 -0
- package/dist/lpMath.js.map +1 -0
- package/dist/lpV4.d.ts +108 -0
- package/dist/lpV4.d.ts.map +1 -0
- package/dist/lpV4.js +283 -0
- package/dist/lpV4.js.map +1 -0
- package/dist/owner.d.ts +1 -1
- package/dist/owner.d.ts.map +1 -1
- package/dist/owner.js +18 -5
- package/dist/owner.js.map +1 -1
- package/dist/scan.d.ts +54 -0
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +124 -92
- package/dist/scan.js.map +1 -1
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +4 -0
- package/dist/source.js.map +1 -1
- package/dist/subpaths/lp.d.ts +33 -0
- package/dist/subpaths/lp.d.ts.map +1 -0
- package/dist/subpaths/lp.js +47 -0
- package/dist/subpaths/lp.js.map +1 -0
- package/dist/subpaths/write.d.ts +20 -0
- package/dist/subpaths/write.d.ts.map +1 -0
- package/dist/subpaths/write.js +18 -0
- package/dist/subpaths/write.js.map +1 -0
- package/dist/tron.d.ts +2 -0
- package/dist/tron.d.ts.map +1 -1
- package/dist/tron.js +4 -0
- package/dist/tron.js.map +1 -1
- package/dist/write/batch.d.ts +88 -0
- package/dist/write/batch.d.ts.map +1 -0
- package/dist/write/batch.js +231 -0
- package/dist/write/batch.js.map +1 -0
- package/dist/write/collect.d.ts +53 -0
- package/dist/write/collect.d.ts.map +1 -0
- package/dist/write/collect.js +255 -0
- package/dist/write/collect.js.map +1 -0
- package/dist/write/rpc.d.ts +68 -0
- package/dist/write/rpc.d.ts.map +1 -0
- package/dist/write/rpc.js +236 -0
- package/dist/write/rpc.js.map +1 -0
- package/dist/write/send.d.ts +124 -0
- package/dist/write/send.d.ts.map +1 -0
- package/dist/write/send.js +373 -0
- package/dist/write/send.js.map +1 -0
- package/dist/write/signer.d.ts +58 -0
- package/dist/write/signer.d.ts.map +1 -0
- package/dist/write/signer.js +41 -0
- package/dist/write/signer.js.map +1 -0
- package/dist/write/transfer.d.ts +83 -0
- package/dist/write/transfer.d.ts.map +1 -0
- package/dist/write/transfer.js +259 -0
- package/dist/write/transfer.js.map +1 -0
- package/dist/write/tron.d.ts +58 -0
- package/dist/write/tron.d.ts.map +1 -0
- package/dist/write/tron.js +956 -0
- package/dist/write/tron.js.map +1 -0
- package/package.json +27 -14
- package/src/aggregate.ts +168 -36
- package/src/fallback.ts +55 -11
- package/src/lp.ts +721 -0
- package/src/lpMath.ts +113 -0
- package/src/lpV4.ts +406 -0
- package/src/owner.ts +19 -6
- package/src/scan.ts +155 -86
- package/src/source.ts +5 -0
- package/src/subpaths/lp.ts +71 -0
- package/src/subpaths/write.ts +26 -0
- package/src/tron.ts +5 -0
- package/src/write/batch.ts +302 -0
- package/src/write/collect.ts +312 -0
- package/src/write/rpc.ts +277 -0
- package/src/write/send.ts +490 -0
- package/src/write/signer.ts +90 -0
- package/src/write/transfer.ts +344 -0
- package/src/write/tron.ts +1100 -0
package/dist/lpMath.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 集中流动性(Uniswap V3 / V4 及其分叉)的数学:tick ↔ sqrtPrice、按流动性算代币数量、未领取的手续费。
|
|
3
|
+
* 与 Uniswap 合约里的整数算法逐位一致(TickMath、LiquidityAmounts、Position 的手续费计算)。
|
|
4
|
+
*/
|
|
5
|
+
export const MIN_TICK = -887272;
|
|
6
|
+
export const MAX_TICK = 887272;
|
|
7
|
+
const Q96 = 2n ** 96n;
|
|
8
|
+
const Q128 = 2n ** 128n;
|
|
9
|
+
const Q256 = 2n ** 256n;
|
|
10
|
+
const MAX_UINT256 = Q256 - 1n;
|
|
11
|
+
/** TickMath.getSqrtRatioAtTick 里的常数:sqrt(1.0001)^(-2^i) 的 Q128 定点数 */
|
|
12
|
+
const RATIOS = [
|
|
13
|
+
0xfff97272373d413259a46990580e213an,
|
|
14
|
+
0xfff2e50f5f656932ef12357cf3c7fdccn,
|
|
15
|
+
0xffe5caca7e10e4e61c3624eaa0941cd0n,
|
|
16
|
+
0xffcb9843d60f6159c9db58835c926644n,
|
|
17
|
+
0xff973b41fa98c081472e6896dfb254c0n,
|
|
18
|
+
0xff2ea16466c96a3843ec78b326b52861n,
|
|
19
|
+
0xfe5dee046a99a2a811c461f1969c3053n,
|
|
20
|
+
0xfcbe86c7900a88aedcffc83b479aa3a4n,
|
|
21
|
+
0xf987a7253ac413176f2b074cf7815e54n,
|
|
22
|
+
0xf3392b0822b70005940c7a398e4b70f3n,
|
|
23
|
+
0xe7159475a2c29b7443b29c7fa6e889d9n,
|
|
24
|
+
0xd097f3bdfd2022b8845ad8f792aa5825n,
|
|
25
|
+
0xa9f746462d870fdf8a65dc1f90e061e5n,
|
|
26
|
+
0x70d869a156d2a1b890bb3df62baf32f7n,
|
|
27
|
+
0x31be135f97d08fd981231505542fcfa6n,
|
|
28
|
+
0x9aa508b5b7a84e1c677de54f3e99bc9n,
|
|
29
|
+
0x5d6af8dedb81196699c329225ee604n,
|
|
30
|
+
0x2216e584f5fa1ea926041bedfe98n,
|
|
31
|
+
0x48a170391f7dc42444e8fa2n,
|
|
32
|
+
];
|
|
33
|
+
/** TickMath.getSqrtRatioAtTick:tick → sqrt(1.0001^tick) 的 Q64.96 定点数 */
|
|
34
|
+
export function getSqrtRatioAtTick(tick) {
|
|
35
|
+
if (!Number.isInteger(tick) || tick < MIN_TICK || tick > MAX_TICK) {
|
|
36
|
+
throw new RangeError(`tick out of range: ${tick}`);
|
|
37
|
+
}
|
|
38
|
+
const absTick = Math.abs(tick);
|
|
39
|
+
let ratio = absTick & 0x1 ? 0xfffcb933bd6fad37aa2d162d1a594001n : 0x100000000000000000000000000000000n;
|
|
40
|
+
for (let i = 0; i < RATIOS.length; i++) {
|
|
41
|
+
if (absTick & (0x2 << i)) {
|
|
42
|
+
ratio = (ratio * RATIOS[i]) >> 128n;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (tick > 0) {
|
|
46
|
+
ratio = MAX_UINT256 / ratio;
|
|
47
|
+
}
|
|
48
|
+
// Q128.128 → Q64.96,向上取整(与合约一致)
|
|
49
|
+
return (ratio >> 32n) + (ratio % (1n << 32n) === 0n ? 0n : 1n);
|
|
50
|
+
}
|
|
51
|
+
/** SqrtPriceMath.getAmount0Delta(向下取整):区间 [a, b] 内 L 对应的 token0 数量 */
|
|
52
|
+
function amount0Delta(sqrtA, sqrtB, liquidity) {
|
|
53
|
+
return ((liquidity << 96n) * (sqrtB - sqrtA)) / sqrtB / sqrtA;
|
|
54
|
+
}
|
|
55
|
+
/** SqrtPriceMath.getAmount1Delta(向下取整):区间 [a, b] 内 L 对应的 token1 数量 */
|
|
56
|
+
function amount1Delta(sqrtA, sqrtB, liquidity) {
|
|
57
|
+
return (liquidity * (sqrtB - sqrtA)) / Q96;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* LiquidityAmounts.getAmountsForLiquidity:当前价格 sqrtPrice 下,价格区间 [sqrtA, sqrtB] 内流动性 L 对应的两种代币数量
|
|
61
|
+
* (与移除全部流动性时拿到的数量一致,向下取整)
|
|
62
|
+
*/
|
|
63
|
+
export function getAmountsForLiquidity(sqrtPrice, sqrtA, sqrtB, liquidity) {
|
|
64
|
+
if (sqrtA > sqrtB) {
|
|
65
|
+
;
|
|
66
|
+
[sqrtA, sqrtB] = [sqrtB, sqrtA];
|
|
67
|
+
}
|
|
68
|
+
if (liquidity === 0n) {
|
|
69
|
+
return [0n, 0n];
|
|
70
|
+
}
|
|
71
|
+
if (sqrtPrice <= sqrtA) {
|
|
72
|
+
return [amount0Delta(sqrtA, sqrtB, liquidity), 0n];
|
|
73
|
+
}
|
|
74
|
+
if (sqrtPrice < sqrtB) {
|
|
75
|
+
return [amount0Delta(sqrtPrice, sqrtB, liquidity), amount1Delta(sqrtA, sqrtPrice, liquidity)];
|
|
76
|
+
}
|
|
77
|
+
return [0n, amount1Delta(sqrtA, sqrtB, liquidity)];
|
|
78
|
+
}
|
|
79
|
+
const wrap = (x) => ((x % Q256) + Q256) % Q256;
|
|
80
|
+
/**
|
|
81
|
+
* 区间内的累计手续费增长(Tick.getFeeGrowthInside,按 uint256 回绕)。
|
|
82
|
+
* global:池子的 feeGrowthGlobalX128;lowerOutside / upperOutside:两端 tick 的 feeGrowthOutsideX128
|
|
83
|
+
*/
|
|
84
|
+
export function getFeeGrowthInside(tick, tickLower, tickUpper, global, lowerOutside, upperOutside) {
|
|
85
|
+
const below = tick >= tickLower ? lowerOutside : wrap(global - lowerOutside);
|
|
86
|
+
const above = tick < tickUpper ? upperOutside : wrap(global - upperOutside);
|
|
87
|
+
return wrap(global - below - above);
|
|
88
|
+
}
|
|
89
|
+
/** 自上次结算以来新产生的手续费:L × (inside − insideLast) / 2^128(差值按 uint256 回绕,与合约一致) */
|
|
90
|
+
export function getFeesEarned(liquidity, feeGrowthInside, feeGrowthInsideLast) {
|
|
91
|
+
return (liquidity * wrap(feeGrowthInside - feeGrowthInsideLast)) / Q128;
|
|
92
|
+
}
|
|
93
|
+
/** sqrtPriceX96 → token1 / token0 的价格(按精度换算后的人类可读数字,有浮点误差,只用于展示) */
|
|
94
|
+
export function sqrtPriceToPrice(sqrtPriceX96, decimals0, decimals1) {
|
|
95
|
+
// 全程浮点:sqrtPrice 不超过 2^160,转 Number 只丢末尾的位(相对误差约 1e-16);先除 2^96 再平方,价格很小时也不会变成 0
|
|
96
|
+
const ratio = Number(sqrtPriceX96) / 2 ** 96;
|
|
97
|
+
return ratio * ratio * 10 ** (decimals0 - decimals1);
|
|
98
|
+
}
|
|
99
|
+
/** tick → token1 / token0 的价格(按精度换算,只用于展示) */
|
|
100
|
+
export function tickToPrice(tick, decimals0, decimals1) {
|
|
101
|
+
return 1.0001 ** tick * 10 ** (decimals0 - decimals1);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=lpMath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lpMath.js","sourceRoot":"","sources":["../src/lpMath.ts"],"names":[],"mappings":"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"}
|
package/dist/lpV4.d.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { CallOverrides } from './aggregate.js';
|
|
2
|
+
import type { Provider } from './provider.js';
|
|
3
|
+
import { type LogScanProgress } from './scan.js';
|
|
4
|
+
/** Uniswap V4 用到的 LP 协议字段(与 lp.ts 的 LpProtocol 一致,避免循环引用) */
|
|
5
|
+
interface V4Protocol {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
version: 'v2' | 'v3' | 'v4';
|
|
9
|
+
chainId: number;
|
|
10
|
+
positionManager?: string;
|
|
11
|
+
stateView?: string;
|
|
12
|
+
deployBlock?: number;
|
|
13
|
+
}
|
|
14
|
+
/** V4 扫描进度的存储:默认存在内存里;传自定义存储可以跨页面刷新 / 重启接着扫 */
|
|
15
|
+
export interface LpScanStorage {
|
|
16
|
+
get(key: string): LogScanProgress | undefined | Promise<LogScanProgress | undefined>;
|
|
17
|
+
set(key: string, state: LogScanProgress): void | Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/** 内存存储:最多保存 1000 组进度,超出淘汰最早的 */
|
|
20
|
+
export declare function memoryLpScanStorage(limit?: number): LpScanStorage;
|
|
21
|
+
/** 基于 getItem / setItem 的存储(如 localStorage):`v4: { scan: { storage: keyValueLpScanStorage(localStorage) } }` */
|
|
22
|
+
export declare function keyValueLpScanStorage(store: {
|
|
23
|
+
getItem(key: string): string | null;
|
|
24
|
+
setItem(key: string, value: string): void;
|
|
25
|
+
}, prefix?: string): LpScanStorage;
|
|
26
|
+
export interface V4ScanOptions {
|
|
27
|
+
/** 进度存储,默认内存(进程 / 页面结束就丢失) */
|
|
28
|
+
storage?: LpScanStorage;
|
|
29
|
+
/**
|
|
30
|
+
* 第一次扫描从哪个区块开始:数字;'deployment' 从仓位合约部署的区块开始(扫全部历史;
|
|
31
|
+
* 自定义协议没有 deployBlock 时等同于 'latest');'latest' 从现在开始(只能发现之后的新仓位)。默认 'deployment'
|
|
32
|
+
*/
|
|
33
|
+
fromBlock?: number | 'deployment' | 'latest';
|
|
34
|
+
/** 单次 getLogs 的最大区块范围,默认 10000(只查仓位合约的事件,节点一般允许较大的范围);节点有上限时自动缩小 */
|
|
35
|
+
blockRange?: number;
|
|
36
|
+
/** 每次调用最多发多少个 getLogs,默认 20 */
|
|
37
|
+
maxRequests?: number;
|
|
38
|
+
/** 每次调用的扫描时间预算(毫秒),默认 5000 */
|
|
39
|
+
timeBudget?: number;
|
|
40
|
+
/** 只扫到最新区块往前这么多个区块,默认 5。不要设为 0:刚出的区块可能被重组,扫到的仓位核对时“不存在”会被从进度里去掉 */
|
|
41
|
+
confirmations?: number;
|
|
42
|
+
/**
|
|
43
|
+
* 每次扫描后的进度:cursor 是已扫到的区块,target 是这次的目标区块,done 表示已扫到最新。
|
|
44
|
+
* 没扫完之前 V4 的结果不完整(从 fromBlock 往后扫,最近铸造的仓位最后才扫到),可以据此提示用户或继续调用
|
|
45
|
+
*/
|
|
46
|
+
onProgress?(progress: V4ScanProgress): void;
|
|
47
|
+
}
|
|
48
|
+
export interface V4ScanProgress {
|
|
49
|
+
chainId: number;
|
|
50
|
+
positionManager: string;
|
|
51
|
+
startBlock: number;
|
|
52
|
+
cursor: number;
|
|
53
|
+
/**
|
|
54
|
+
* 这次的目标区块;没扫(暂停中、拿不到最新区块)时为 null。
|
|
55
|
+
* 触发暂停的那一次照常有 target,同时带 pausedUntil;第一次就拿不到最新区块时 startBlock / cursor 为 -1
|
|
56
|
+
*/
|
|
57
|
+
target: number | null;
|
|
58
|
+
done: boolean;
|
|
59
|
+
/** 节点不开放 getLogs 时暂停到这个时间(毫秒时间戳),之前的调用不再扫描 */
|
|
60
|
+
pausedUntil?: number;
|
|
61
|
+
}
|
|
62
|
+
export interface LpV4Options {
|
|
63
|
+
/** 已知的仓位 tokenId(如应用自己记下的):直接查,不用扫描 */
|
|
64
|
+
tokenIds?: ReadonlyArray<string | number | bigint>;
|
|
65
|
+
/**
|
|
66
|
+
* 扫描仓位合约发给这个地址的 NFT(Transfer 事件)来发现仓位。V4 的仓位合约不能按地址列出 NFT,只能这样找。
|
|
67
|
+
* 需要节点支持 eth_getLogs;扫全部历史在公共节点上很慢(每次调用推进一段,进度可以存起来),建议用自己的节点。默认不扫描
|
|
68
|
+
*/
|
|
69
|
+
scan?: boolean | V4ScanOptions;
|
|
70
|
+
}
|
|
71
|
+
declare const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
72
|
+
/** PositionInfo(uint256):| 200 位 poolId | 24 位 tickUpper | 24 位 tickLower | 8 位 hasSubscriber | */
|
|
73
|
+
export declare function decodePositionInfo(info: bigint): {
|
|
74
|
+
tickLower: number;
|
|
75
|
+
tickUpper: number;
|
|
76
|
+
};
|
|
77
|
+
/** poolId = keccak256(abi.encode(PoolKey)) */
|
|
78
|
+
export declare function poolIdOf(key: {
|
|
79
|
+
currency0: string;
|
|
80
|
+
currency1: string;
|
|
81
|
+
fee: number | bigint;
|
|
82
|
+
tickSpacing: number | bigint;
|
|
83
|
+
hooks: string;
|
|
84
|
+
}): string;
|
|
85
|
+
/** V4 的原始仓位(与 lp.ts 的 RawConcentrated 结构一致) */
|
|
86
|
+
export interface RawV4Position {
|
|
87
|
+
version: 'v4';
|
|
88
|
+
protocol: V4Protocol;
|
|
89
|
+
pool: string;
|
|
90
|
+
tokenId: bigint;
|
|
91
|
+
token0: string;
|
|
92
|
+
token1: string;
|
|
93
|
+
fee: number;
|
|
94
|
+
tickLower: number;
|
|
95
|
+
tickUpper: number;
|
|
96
|
+
tick: number;
|
|
97
|
+
sqrtPriceX96: bigint;
|
|
98
|
+
liquidity: bigint;
|
|
99
|
+
amount0: bigint;
|
|
100
|
+
amount1: bigint;
|
|
101
|
+
fees0: bigint;
|
|
102
|
+
fees1: bigint;
|
|
103
|
+
hooks: string;
|
|
104
|
+
}
|
|
105
|
+
/** 查 Uniswap V4 仓位:先找 tokenId(传入的 + 扫描到的),核对仍归 owner,再批量读池子和仓位状态 */
|
|
106
|
+
export declare function v4Positions(provider: Provider, owner: string, protocols: readonly V4Protocol[], v4: LpV4Options, includeClosed: boolean, maxPositions: number, overrides: CallOverrides): Promise<RawV4Position[]>;
|
|
107
|
+
export { ZERO_ADDRESS as V4_NATIVE_CURRENCY };
|
|
108
|
+
//# sourceMappingURL=lpV4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lpV4.d.ts","sourceRoot":"","sources":["../src/lpV4.ts"],"names":[],"mappings":"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"}
|
package/dist/lpV4.js
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { AbiCoder, keccak256 } from 'ethers';
|
|
2
|
+
import { getAmountsForLiquidity, getFeesEarned, getSqrtRatioAtTick } from './lpMath.js';
|
|
3
|
+
import { runLogScan } from './scan.js';
|
|
4
|
+
/** 内存存储:最多保存 1000 组进度,超出淘汰最早的 */
|
|
5
|
+
export function memoryLpScanStorage(limit = 1000) {
|
|
6
|
+
const map = new Map();
|
|
7
|
+
return {
|
|
8
|
+
get: (key) => map.get(key),
|
|
9
|
+
set: (key, state) => {
|
|
10
|
+
map.delete(key);
|
|
11
|
+
map.set(key, state);
|
|
12
|
+
if (map.size > limit) {
|
|
13
|
+
map.delete(map.keys().next().value);
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** 基于 getItem / setItem 的存储(如 localStorage):`v4: { scan: { storage: keyValueLpScanStorage(localStorage) } }` */
|
|
19
|
+
export function keyValueLpScanStorage(store, prefix = 'w3lib:lp-v4-scan:') {
|
|
20
|
+
return {
|
|
21
|
+
get: (key) => {
|
|
22
|
+
try {
|
|
23
|
+
const raw = store.getItem(prefix + key);
|
|
24
|
+
return raw ? JSON.parse(raw) : undefined; // 格式在读取后校验
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
set: (key, state) => {
|
|
31
|
+
try {
|
|
32
|
+
store.setItem(prefix + key, JSON.stringify(state));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// 存储满或不可用:只影响下次能否接着扫
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
|
|
41
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
42
|
+
/** PoolKey.fee 的最高位:动态手续费池子(实际手续费看 slot0 的 lpFee) */
|
|
43
|
+
const DYNAMIC_FEE_FLAG = 0x800000;
|
|
44
|
+
const POSITION_MANAGER_ABI = [
|
|
45
|
+
'function ownerOf(uint256 tokenId) view returns (address)',
|
|
46
|
+
'function getPoolAndPositionInfo(uint256 tokenId) view returns ((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) poolKey, uint256 info)',
|
|
47
|
+
'function getPositionLiquidity(uint256 tokenId) view returns (uint128)',
|
|
48
|
+
];
|
|
49
|
+
const STATE_VIEW_ABI = [
|
|
50
|
+
'function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)',
|
|
51
|
+
'function getFeeGrowthInside(bytes32 poolId, int24 tickLower, int24 tickUpper) view returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128)',
|
|
52
|
+
'function getPositionInfo(bytes32 poolId, address owner, int24 tickLower, int24 tickUpper, bytes32 salt) view returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128)',
|
|
53
|
+
];
|
|
54
|
+
const defaultStorage = memoryLpScanStorage();
|
|
55
|
+
/** int24 的补码 → number */
|
|
56
|
+
function int24(value) {
|
|
57
|
+
const n = Number(value & 0xffffffn);
|
|
58
|
+
return n >= 0x800000 ? n - 0x1000000 : n;
|
|
59
|
+
}
|
|
60
|
+
/** PositionInfo(uint256):| 200 位 poolId | 24 位 tickUpper | 24 位 tickLower | 8 位 hasSubscriber | */
|
|
61
|
+
export function decodePositionInfo(info) {
|
|
62
|
+
return { tickLower: int24(info >> 8n), tickUpper: int24(info >> 32n) };
|
|
63
|
+
}
|
|
64
|
+
/** poolId = keccak256(abi.encode(PoolKey)) */
|
|
65
|
+
export function poolIdOf(key) {
|
|
66
|
+
return keccak256(AbiCoder.defaultAbiCoder().encode(['address', 'address', 'uint24', 'int24', 'address'], [key.currency0, key.currency1, key.fee, key.tickSpacing, key.hooks]));
|
|
67
|
+
}
|
|
68
|
+
const isProgress = (raw) => {
|
|
69
|
+
const s = raw;
|
|
70
|
+
return (!!s &&
|
|
71
|
+
typeof s === 'object' &&
|
|
72
|
+
Number.isSafeInteger(s.startBlock) &&
|
|
73
|
+
Number.isSafeInteger(s.cursor) &&
|
|
74
|
+
Number.isSafeInteger(s.blockRange) &&
|
|
75
|
+
s.blockRange >= 1 &&
|
|
76
|
+
Array.isArray(s.items) &&
|
|
77
|
+
s.items.every((t) => typeof t === 'string' && /^\d+$/.test(t)));
|
|
78
|
+
};
|
|
79
|
+
/** 扫描仓位合约发给 owner 的 NFT,返回扫描到的 tokenId(之后再核对是否仍归 owner) */
|
|
80
|
+
async function scanTokenIds(provider, chainId, protocol, owner, options, signal) {
|
|
81
|
+
const storage = options.storage ?? defaultStorage;
|
|
82
|
+
const key = `${chainId}:${protocol.positionManager.toLowerCase()}:${owner.toLowerCase()}`;
|
|
83
|
+
let saved;
|
|
84
|
+
try {
|
|
85
|
+
const raw = await storage.get(key);
|
|
86
|
+
saved = isProgress(raw) ? raw : undefined; // 格式不对(旧版本 / 被改坏)时丢弃,重新开始
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
saved = undefined;
|
|
90
|
+
}
|
|
91
|
+
const fromBlock = options.fromBlock ?? 'deployment';
|
|
92
|
+
const ownerTopic = `0x${owner.slice(2).toLowerCase().padStart(64, '0')}`;
|
|
93
|
+
let reported = false;
|
|
94
|
+
const report = (state, target) => {
|
|
95
|
+
reported = true;
|
|
96
|
+
try {
|
|
97
|
+
options.onProgress?.({
|
|
98
|
+
chainId,
|
|
99
|
+
positionManager: protocol.positionManager,
|
|
100
|
+
startBlock: state.startBlock,
|
|
101
|
+
cursor: state.cursor,
|
|
102
|
+
target,
|
|
103
|
+
done: target !== null && state.cursor >= target,
|
|
104
|
+
...(state.pausedUntil ? { pausedUntil: state.pausedUntil } : {}),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// 回调出错不影响扫描和保存进度
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const progress = await runLogScan({
|
|
112
|
+
provider,
|
|
113
|
+
saved,
|
|
114
|
+
initialCursor: (target) => typeof fromBlock === 'number' ? fromBlock - 1 : fromBlock === 'deployment' && protocol.deployBlock !== undefined ? protocol.deployBlock - 1 : target,
|
|
115
|
+
filter: { address: protocol.positionManager, topics: [TRANSFER_TOPIC, null, ownerTopic] },
|
|
116
|
+
// ERC721 的 Transfer:第 4 个 topic 是 tokenId
|
|
117
|
+
collect: (log) => (log.topics.length === 4 ? BigInt(log.topics[3]).toString() : null),
|
|
118
|
+
maxRange: Math.max(1, Math.floor(options.blockRange ?? 10_000)),
|
|
119
|
+
maxRequests: Math.max(1, options.maxRequests ?? 20),
|
|
120
|
+
timeBudget: options.timeBudget ?? 5000,
|
|
121
|
+
confirmations: Math.max(0, Math.floor(options.confirmations ?? 5)),
|
|
122
|
+
signal,
|
|
123
|
+
onDone: report,
|
|
124
|
+
});
|
|
125
|
+
if (!progress) {
|
|
126
|
+
// 第一次扫描就拿不到最新区块:也告诉调用方(还没开始,没有进度)
|
|
127
|
+
report({ startBlock: -1, cursor: -1, items: [], blockRange: 0 }, null);
|
|
128
|
+
return { ids: [], cursor: -1, prune: async () => { } };
|
|
129
|
+
}
|
|
130
|
+
if (!reported) {
|
|
131
|
+
report(progress, null); // 暂停中 / 拿不到最新区块:这次没扫,也告诉调用方
|
|
132
|
+
}
|
|
133
|
+
const save = async (state) => {
|
|
134
|
+
try {
|
|
135
|
+
await storage.set(key, state);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// 存储不可用:只影响下次能否接着扫
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
if (progress !== saved) {
|
|
142
|
+
await save(progress);
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
ids: progress.items,
|
|
146
|
+
cursor: progress.cursor,
|
|
147
|
+
// 已经转给别人 / 销毁的 tokenId 从进度里去掉,之后不用每次再核对(转回来时会有新的 Transfer 事件,重新扫到)
|
|
148
|
+
prune: async (ids) => {
|
|
149
|
+
const drop = new Set(ids);
|
|
150
|
+
if (progress.items.some((id) => drop.has(id))) {
|
|
151
|
+
await save({ ...progress, items: progress.items.filter((id) => !drop.has(id)) });
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/** 查 Uniswap V4 仓位:先找 tokenId(传入的 + 扫描到的),核对仍归 owner,再批量读池子和仓位状态 */
|
|
157
|
+
export async function v4Positions(provider, owner, protocols, v4, includeClosed, maxPositions, overrides) {
|
|
158
|
+
const chainId = await provider.getChainId();
|
|
159
|
+
const explicit = (v4.tokenIds ?? []).flatMap((id) => {
|
|
160
|
+
try {
|
|
161
|
+
return [BigInt(id).toString()];
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return []; // 非法 tokenId 忽略
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
const scanOptions = v4.scan === true ? {} : v4.scan || null;
|
|
168
|
+
const limit = Math.floor(maxPositions);
|
|
169
|
+
if (!(limit > 0)) {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
// 每个协议的候选 tokenId:太多时只核对最大的 maxPositions 个(tokenId 递增,越大越新)
|
|
173
|
+
const candidates = await Promise.all(protocols.map(async (protocol) => {
|
|
174
|
+
const scan = scanOptions ? await scanTokenIds(provider, chainId, protocol, owner, scanOptions, overrides.signal) : null;
|
|
175
|
+
const ids = [...new Set([...explicit, ...(scan?.ids ?? [])])].map(BigInt).sort((a, b) => (a < b ? 1 : a > b ? -1 : 0));
|
|
176
|
+
return { protocol, ids: ids.slice(0, limit), scan };
|
|
177
|
+
}));
|
|
178
|
+
const items = candidates.flatMap(({ protocol, ids }) => ids.map((tokenId) => ({ protocol, tokenId })));
|
|
179
|
+
if (!items.length) {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
// 核对仍归 owner(扫描到的可能已经转走 / 销毁),同时读仓位信息。
|
|
183
|
+
// 读最新状态时才清理扫描进度,并要求节点不落后于扫描进度(否则可能把刚转进来的仓位当成别人的,之后再也扫不到)
|
|
184
|
+
const latest = overrides.blockTag === undefined || overrides.blockTag === 'latest';
|
|
185
|
+
const scannedUpTo = Math.max(-1, ...candidates.map((c) => (c.scan ? c.scan.cursor : -1)));
|
|
186
|
+
const calls = () => items.flatMap(({ protocol, tokenId }) => {
|
|
187
|
+
const pm = provider.contract(protocol.positionManager, POSITION_MANAGER_ABI);
|
|
188
|
+
return [pm.ownerOf(tokenId), pm.getPoolAndPositionInfo(tokenId), pm.getPositionLiquidity(tokenId)];
|
|
189
|
+
});
|
|
190
|
+
let pruneSafe = latest && scannedUpTo >= 0;
|
|
191
|
+
let first;
|
|
192
|
+
if (pruneSafe) {
|
|
193
|
+
try {
|
|
194
|
+
first = await provider.tryAll(calls(), { ...overrides, minBlock: Math.max(overrides.minBlock ?? 0, scannedUpTo) });
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
if (overrides.signal?.aborted) {
|
|
198
|
+
throw err;
|
|
199
|
+
}
|
|
200
|
+
// 节点都落后于扫描进度(或其他错误):照常查一次,这次不清理进度,查询本身不因此失败
|
|
201
|
+
pruneSafe = false;
|
|
202
|
+
first = await provider.tryAll(calls(), overrides);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
first = await provider.tryAll(calls(), overrides);
|
|
207
|
+
}
|
|
208
|
+
const transferred = new Map(protocols.map((p) => [p, []]));
|
|
209
|
+
const owned = items.flatMap((item, i) => {
|
|
210
|
+
const holder = first[i * 3];
|
|
211
|
+
const info = first[i * 3 + 1];
|
|
212
|
+
// 转给了别人;或已销毁(ownerOf revert 且仓位信息为 0)
|
|
213
|
+
if ((holder && holder.toLowerCase() !== owner.toLowerCase()) || (holder === null && info !== null && info[1] === 0n)) {
|
|
214
|
+
transferred.get(item.protocol)?.push(item.tokenId.toString());
|
|
215
|
+
}
|
|
216
|
+
const liquidity = first[i * 3 + 2];
|
|
217
|
+
if (!holder || holder.toLowerCase() !== owner.toLowerCase() || !info || liquidity === null) {
|
|
218
|
+
return [];
|
|
219
|
+
}
|
|
220
|
+
if (!includeClosed && liquidity === 0n) {
|
|
221
|
+
return []; // V4 修改流动性时自动领取手续费:流动性为 0 就没有未领取的手续费
|
|
222
|
+
}
|
|
223
|
+
const key = info[0];
|
|
224
|
+
const { tickLower, tickUpper } = decodePositionInfo(info[1]);
|
|
225
|
+
return [{ ...item, key, poolId: poolIdOf(key), tickLower, tickUpper, liquidity }];
|
|
226
|
+
});
|
|
227
|
+
if (pruneSafe) {
|
|
228
|
+
await Promise.all(candidates.map(({ protocol, scan }) => scan?.prune(transferred.get(protocol) ?? [])));
|
|
229
|
+
}
|
|
230
|
+
if (!owned.length) {
|
|
231
|
+
return [];
|
|
232
|
+
}
|
|
233
|
+
// 池子状态(每个池子一次)+ 每个仓位的手续费增长
|
|
234
|
+
const poolIds = [...new Set(owned.map((x) => `${x.protocol.stateView.toLowerCase()}:${x.poolId}`))];
|
|
235
|
+
const second = await provider.tryAll([
|
|
236
|
+
...poolIds.map((k) => {
|
|
237
|
+
const [stateView, poolId] = k.split(':');
|
|
238
|
+
return provider.contract(stateView, STATE_VIEW_ABI).getSlot0(poolId);
|
|
239
|
+
}),
|
|
240
|
+
...owned.flatMap((x) => {
|
|
241
|
+
const sv = provider.contract(x.protocol.stateView, STATE_VIEW_ABI);
|
|
242
|
+
const salt = `0x${x.tokenId.toString(16).padStart(64, '0')}`;
|
|
243
|
+
return [sv.getFeeGrowthInside(x.poolId, x.tickLower, x.tickUpper), sv.getPositionInfo(x.poolId, x.protocol.positionManager, x.tickLower, x.tickUpper, salt)];
|
|
244
|
+
}),
|
|
245
|
+
], overrides);
|
|
246
|
+
const slot0 = new Map(poolIds.map((k, i) => [k, second[i]]));
|
|
247
|
+
return owned.flatMap((x, i) => {
|
|
248
|
+
const s = slot0.get(`${x.protocol.stateView.toLowerCase()}:${x.poolId}`);
|
|
249
|
+
const inside = second[poolIds.length + i * 2];
|
|
250
|
+
const last = second[poolIds.length + i * 2 + 1];
|
|
251
|
+
if (!s || !inside || !last) {
|
|
252
|
+
return [];
|
|
253
|
+
}
|
|
254
|
+
const sqrtPriceX96 = s[0];
|
|
255
|
+
const tick = Number(s[1]);
|
|
256
|
+
const [amount0, amount1] = getAmountsForLiquidity(sqrtPriceX96, getSqrtRatioAtTick(x.tickLower), getSqrtRatioAtTick(x.tickUpper), x.liquidity);
|
|
257
|
+
const fee = Number(x.key.fee);
|
|
258
|
+
return [
|
|
259
|
+
{
|
|
260
|
+
version: 'v4',
|
|
261
|
+
protocol: x.protocol,
|
|
262
|
+
pool: x.poolId,
|
|
263
|
+
tokenId: x.tokenId,
|
|
264
|
+
token0: x.key.currency0,
|
|
265
|
+
token1: x.key.currency1,
|
|
266
|
+
// 动态手续费池子:PoolKey 里只有标记,实际手续费是 slot0 的 lpFee
|
|
267
|
+
fee: fee & DYNAMIC_FEE_FLAG ? Number(s[3]) : fee,
|
|
268
|
+
tickLower: x.tickLower,
|
|
269
|
+
tickUpper: x.tickUpper,
|
|
270
|
+
tick,
|
|
271
|
+
sqrtPriceX96,
|
|
272
|
+
liquidity: x.liquidity,
|
|
273
|
+
amount0,
|
|
274
|
+
amount1,
|
|
275
|
+
fees0: getFeesEarned(x.liquidity, inside[0], last[1]),
|
|
276
|
+
fees1: getFeesEarned(x.liquidity, inside[1], last[2]),
|
|
277
|
+
hooks: x.key.hooks,
|
|
278
|
+
},
|
|
279
|
+
];
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
export { ZERO_ADDRESS as V4_NATIVE_CURRENCY };
|
|
283
|
+
//# sourceMappingURL=lpV4.js.map
|
package/dist/lpV4.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lpV4.js","sourceRoot":"","sources":["../src/lpV4.ts"],"names":[],"mappings":"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"}
|
package/dist/owner.d.ts
CHANGED
|
@@ -85,7 +85,7 @@ export interface PriceSourceContext {
|
|
|
85
85
|
}
|
|
86
86
|
export interface PriceSource {
|
|
87
87
|
readonly name: string;
|
|
88
|
-
/** 返回
|
|
88
|
+
/** 返回 去重键 → 美元价格:EVM 是小写 0x 地址;Tron 是 T 开头的 base58 地址(区分大小写);主币用键 'native'。没有价格的不返回 */
|
|
89
89
|
prices(ctx: PriceSourceContext): Promise<Map<string, number>>;
|
|
90
90
|
}
|
|
91
91
|
/** DefiLlama 的链标识:chainId → slug(2026-10 实测可用) */
|
package/dist/owner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../src/owner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../src/owner.ts"],"names":[],"mappings":"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"}
|
package/dist/owner.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NATIVE_TOKEN, formatUnits } from './erc20.js';
|
|
2
2
|
import { transferScan } from './scan.js';
|
|
3
|
-
import { isTronAddress } from './tron.js';
|
|
3
|
+
import { TRON_CHAIN_ID, isTronAddress, isTronChain, toTronAddress } from './tron.js';
|
|
4
4
|
const REQUEST_TIMEOUT = 20_000;
|
|
5
5
|
const LIST_TTL = 60 * 60 * 1000;
|
|
6
6
|
const MAX_CACHED_LISTS = 16;
|
|
@@ -354,6 +354,7 @@ export const DEFILLAMA_CHAINS = {
|
|
|
354
354
|
80094: 'berachain',
|
|
355
355
|
81457: 'blast',
|
|
356
356
|
534352: 'scroll',
|
|
357
|
+
[TRON_CHAIN_ID.mainnet]: 'tron',
|
|
357
358
|
};
|
|
358
359
|
/** 主币价格:按主币 symbol 对应 CoinGecko 的币种 id(DefiLlama 用 coingecko:<id> 查) */
|
|
359
360
|
const NATIVE_PRICE_IDS = {
|
|
@@ -382,7 +383,17 @@ export function defillamaPrices(options = {}) {
|
|
|
382
383
|
const result = new Map();
|
|
383
384
|
const slug = DEFILLAMA_CHAINS[chainId];
|
|
384
385
|
const nativeId = nativeSymbol ? NATIVE_PRICE_IDS[nativeSymbol.toUpperCase()] : undefined;
|
|
385
|
-
|
|
386
|
+
// 查询键 → 结果里用的去重键:EVM 地址小写;Tron 地址区分大小写,DefiLlama 要用原样的 base58(T…)地址
|
|
387
|
+
const resultKey = new Map();
|
|
388
|
+
const tokenKeys = slug
|
|
389
|
+
? tokens.map((t) => {
|
|
390
|
+
const tron = slug === 'tron';
|
|
391
|
+
const query = `${slug}:${tron ? toTronAddress(t) : t.toLowerCase()}`;
|
|
392
|
+
resultKey.set(query.toLowerCase(), tron ? toTronAddress(t) : t.toLowerCase());
|
|
393
|
+
return query;
|
|
394
|
+
})
|
|
395
|
+
: [];
|
|
396
|
+
const keys = [...(nativeId ? [`coingecko:${nativeId}`] : []), ...tokenKeys];
|
|
386
397
|
const batches = [];
|
|
387
398
|
for (let i = 0; i < keys.length; i += 100) {
|
|
388
399
|
batches.push(keys.slice(i, i + 100));
|
|
@@ -393,7 +404,7 @@ export function defillamaPrices(options = {}) {
|
|
|
393
404
|
if (typeof coin.price !== 'number' || !Number.isFinite(coin.price) || (coin.confidence !== undefined && coin.confidence < minConfidence)) {
|
|
394
405
|
continue;
|
|
395
406
|
}
|
|
396
|
-
result.set(key.startsWith('coingecko:') ? 'native' : key.slice(key.indexOf(':') + 1).toLowerCase(), coin.price);
|
|
407
|
+
result.set(key.startsWith('coingecko:') ? 'native' : (resultKey.get(key.toLowerCase()) ?? key.slice(key.indexOf(':') + 1).toLowerCase()), coin.price);
|
|
397
408
|
}
|
|
398
409
|
}
|
|
399
410
|
return result;
|
|
@@ -453,8 +464,10 @@ export async function ownerTokens(provider, owner, options = {}) {
|
|
|
453
464
|
held.length ? provider.tokens(held.map((x) => x.meta.address), { ...overrides, fields: ['decimals', 'name', 'symbol'] }) : Promise.resolve([]),
|
|
454
465
|
nativeAddress ? provider.tokens([nativeAddress], { fields: ['name', 'symbol'] }) : Promise.resolve([undefined]),
|
|
455
466
|
]);
|
|
467
|
+
// 价格源的键:Tron 上统一用 T 地址(代币来源给的可能是 0x 格式)
|
|
468
|
+
const priceKey = (address) => (isTronChain(chainId) ? toTronAddress(address) : addressKey(address));
|
|
456
469
|
const priceMap = priceSource
|
|
457
|
-
? await priceSource.prices({ chainId, tokens: held.map((x) => x.meta.address), nativeSymbol: nativeAddress ? (nativeInfo?.symbol ?? null) : null, fetch: fetchFn })
|
|
470
|
+
? await priceSource.prices({ chainId, tokens: held.map((x) => (isTronChain(chainId) ? toTronAddress(x.meta.address) : x.meta.address)), nativeSymbol: nativeAddress ? (nativeInfo?.symbol ?? null) : null, fetch: fetchFn })
|
|
458
471
|
: new Map();
|
|
459
472
|
const valueOf = (formatted, price) => (price === undefined ? null : Number(formatted) * price);
|
|
460
473
|
let list = held.flatMap(({ meta, balance }, i) => {
|
|
@@ -465,7 +478,7 @@ export async function ownerTokens(provider, owner, options = {}) {
|
|
|
465
478
|
}
|
|
466
479
|
const decimals = chain.decimals;
|
|
467
480
|
const formatted = decimals === balance.decimals ? balance.formatted : formatUnits(BigInt(balance.balance), decimals);
|
|
468
|
-
const price = priceMap.get(
|
|
481
|
+
const price = priceMap.get(priceKey(meta.address));
|
|
469
482
|
return [
|
|
470
483
|
{
|
|
471
484
|
token: meta.address,
|