@w3lib/evm-batch-call 0.1.0 → 0.3.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 (77) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +194 -12
  3. package/dist/aggregate.d.ts +5 -2
  4. package/dist/aggregate.d.ts.map +1 -1
  5. package/dist/aggregate.js.map +1 -1
  6. package/dist/call.d.ts +8 -2
  7. package/dist/call.d.ts.map +1 -1
  8. package/dist/call.js +25 -1
  9. package/dist/call.js.map +1 -1
  10. package/dist/chains.d.ts +13 -0
  11. package/dist/chains.d.ts.map +1 -0
  12. package/dist/chains.js +35 -0
  13. package/dist/chains.js.map +1 -0
  14. package/dist/detect.d.ts +23 -0
  15. package/dist/detect.d.ts.map +1 -0
  16. package/dist/detect.js +178 -0
  17. package/dist/detect.js.map +1 -0
  18. package/dist/erc20.d.ts +83 -7
  19. package/dist/erc20.d.ts.map +1 -1
  20. package/dist/erc20.js +36 -5
  21. package/dist/erc20.js.map +1 -1
  22. package/dist/fallback.d.ts +25 -0
  23. package/dist/fallback.d.ts.map +1 -1
  24. package/dist/fallback.js +123 -21
  25. package/dist/fallback.js.map +1 -1
  26. package/dist/index.d.ts +10 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +9 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/nft.d.ts +71 -0
  31. package/dist/nft.d.ts.map +1 -0
  32. package/dist/nft.js +194 -0
  33. package/dist/nft.js.map +1 -0
  34. package/dist/owner.d.ts +136 -0
  35. package/dist/owner.d.ts.map +1 -0
  36. package/dist/owner.js +501 -0
  37. package/dist/owner.js.map +1 -0
  38. package/dist/provider.d.ts +112 -12
  39. package/dist/provider.d.ts.map +1 -1
  40. package/dist/provider.js +343 -48
  41. package/dist/provider.js.map +1 -1
  42. package/dist/scan.d.ts +59 -0
  43. package/dist/scan.d.ts.map +1 -0
  44. package/dist/scan.js +245 -0
  45. package/dist/scan.js.map +1 -0
  46. package/dist/shortcuts.d.ts +113 -0
  47. package/dist/shortcuts.d.ts.map +1 -0
  48. package/dist/shortcuts.js +193 -0
  49. package/dist/shortcuts.js.map +1 -0
  50. package/dist/source.d.ts +23 -1
  51. package/dist/source.d.ts.map +1 -1
  52. package/dist/source.js +110 -3
  53. package/dist/source.js.map +1 -1
  54. package/dist/tron.d.ts +6 -0
  55. package/dist/tron.d.ts.map +1 -1
  56. package/dist/tron.js +16 -1
  57. package/dist/tron.js.map +1 -1
  58. package/dist/util.d.ts +6 -0
  59. package/dist/util.d.ts.map +1 -0
  60. package/dist/util.js +20 -0
  61. package/dist/util.js.map +1 -0
  62. package/package.json +3 -2
  63. package/src/aggregate.ts +5 -2
  64. package/src/call.ts +32 -3
  65. package/src/chains.ts +46 -0
  66. package/src/detect.ts +193 -0
  67. package/src/erc20.ts +111 -9
  68. package/src/fallback.ts +127 -23
  69. package/src/index.ts +90 -4
  70. package/src/nft.ts +298 -0
  71. package/src/owner.ts +651 -0
  72. package/src/provider.ts +458 -54
  73. package/src/scan.ts +293 -0
  74. package/src/shortcuts.ts +278 -0
  75. package/src/source.ts +118 -3
  76. package/src/tron.ts +21 -2
  77. package/src/util.ts +20 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,43 @@
1
+ # Changelog
2
+
3
+ ## 0.3.0
4
+
5
+ ### 新增
6
+
7
+ - `Provider.getBlockNumber()` / `Provider.getLogs()`;多节点时 getLogs / getBlockNumber 失败不影响 call / getBalance 的节点顺序,getLogs 全部失败抛 `GetLogsError`(带各节点的错误)
8
+ - 资产列表 `getOwnerTokens` / `ownerTokens`:从代币来源发现候选代币,multicall 在链上核对余额,返回持有的代币
9
+ - 代币来源可替换:`metamaskTokenList`、`coingeckoTokenList`、`tokenList(url)`、`staticTokens`、`alchemy({ apiKey })`、`nodereal({ apiKey })`,以及 `firstAvailable` / `combine` 组合;默认 MetaMask 列表 → CoinGecko 列表(免费免 Key)
10
+ - 可选价格:`prices: true` 用 DefiLlama,或传自定义价格源;`minUsd` 过滤
11
+ - 增量扫描开关 `scanTransfers`(默认关闭):从第一次调用开始扫描转入的 ERC20 Transfer 事件,补充列表里没有的新代币;进度可持久化(`keyValueScanStorage` 或自定义存储),自动适配节点的区块范围上限与限频;`timeBudget` 限制每次调用的扫描时间,`confirmations` 避开链重组
12
+ - 局限性见 README「资产列表」;结果不保证完整、准确,因此标记为 `@deprecated`(不推荐使用)
13
+
14
+ ## 0.2.0
15
+
16
+ ### 不兼容的改动
17
+
18
+ - `balances(owner, tokens)` 的返回值从 `bigint[]` 改为对象数组:`{ token, native, balance, decimals, formatted, success }`。`balance` 是最小单位的十进制字符串,需要计算时用 `BigInt(balance)`;单项失败时 `success: false`(原来是 `0n`)
19
+ - 删除 `tokenInfo()` 和 `TokenInfo` 类型,改用 `tokens(tokens, { fields })`:可选择字段,主币不再返回 `null`,而是返回内置链信息
20
+ - 传入的节点会校验实际所在的链,与 chainId 不一致时报 `NETWORK_ERROR`(多节点时自动换下一个节点),不再静默返回另一条链的数据;内置公共节点不校验
21
+ - 主币精度默认取内置链信息表 `NATIVE_CURRENCIES`(表里没有时仍是 EVM 18、Tron 6)
22
+
23
+ ### 新增
24
+
25
+ - 常用查询,每个都有 Provider 方法和独立函数两种用法:
26
+ - `getBalances`:主币 + 代币余额,带 decimals 换算;`symbol: true` 额外返回 symbol
27
+ - `getTokens`:ERC20 详情,`fields` 选择返回 name / symbol / decimals / totalSupply
28
+ - `getAllowances`:授权额度与是否无限授权
29
+ - `getNftCollections`、`getNftBalances`、`getNftOwners`、`getNftTokenUris`、`getErc1155Balances`
30
+ - chainId 可选:`new Provider(window.ethereum)`、`await Provider.create(url)` 从节点识别 chainId,结果缓存(钱包切链时失效);`getChainId()`、`ready()`
31
+ - 独立函数的节点参数:`{ chainId?, provider? }`,可传 URL、URL 数组、ethers Provider、`window.ethereum`、`window.tronWeb` 或混合数组
32
+ - `NATIVE_TOKEN`、`NATIVE_CURRENCIES`、`formatAmount`、`detectChainId`、`clearChainIdCache`、`ERC721_ABI`、`ERC1155_ABI`、`MAX_UINT256` 等导出
33
+ - symbol / name 返回 bytes32 的老代币(MKR 等)也能解析
34
+ - `TronProvider` 新增 `timeout` 选项、`getChainId()`
35
+
36
+ ### 修复
37
+
38
+ - chainId 识别失败(限流、钱包未解锁等)后会重试,不再让 Provider 永久不可用
39
+ - Tron 链上 `nftOwners` 返回 T 开头的地址
40
+
41
+ ## 0.1.0
42
+
43
+ 首个版本:Multicall3 批量读取(`all` / `tryAll` / `tryEach`)、自动合并、`staticCall` 预执行、deployless(含主币余额、大结果 revert 带回、initcode 分片)、多节点故障切换与内置公共节点、Tron、浏览器插件钱包。
package/README.md CHANGED
@@ -8,10 +8,92 @@ pnpm add @w3lib/evm-batch-call ethers
8
8
 
9
9
  ## 快速上手
10
10
 
11
+ ### 常用查询
12
+
13
+ 常用的批量查询都有现成函数,一次请求查完一批,结果都是字符串 / 数字 / 布尔,可以直接 `JSON.stringify`:
14
+
15
+ ```ts
16
+ import {
17
+ NATIVE_TOKEN,
18
+ getAllowances,
19
+ getBalances,
20
+ getErc1155Balances,
21
+ getNftBalances,
22
+ getNftCollections,
23
+ getNftOwners,
24
+ getNftTokenUris,
25
+ getTokens,
26
+ } from '@w3lib/evm-batch-call'
27
+
28
+ // 余额:主币 + 代币,带 decimals 换算
29
+ await getBalances(user, [NATIVE_TOKEN, USDT], { chainId: 56 })
30
+ // [{ token: NATIVE_TOKEN, native: true, balance: '1500000000000000000', decimals: 18, formatted: '1.5', success: true }, ...]
31
+ await getBalances(user, [NATIVE_TOKEN, USDT], { chainId: 56, symbol: true }) // 额外返回 symbol
32
+
33
+ // 代币详情,字段可选:name / symbol / decimals / totalSupply(默认前三个)
34
+ await getTokens([USDT, NATIVE_TOKEN], { chainId: 56, fields: ['symbol', 'decimals', 'totalSupply'] })
35
+ // [{ address: USDT, native: false, symbol: 'USDT', decimals: 18, totalSupply: '…', totalSupplyFormatted: '…', success: true }, ...]
36
+
37
+ // 授权额度:发交易前判断是否需要 approve
38
+ const [allowance] = await getAllowances(user, router, [USDT], { chainId: 56 })
39
+ // { token: USDT, spender: router, allowance: '…', formatted: '100', unlimited: false, success: true }
40
+
41
+ // NFT
42
+ await getNftCollections([BAYC], { chainId: 1, fields: ['standard', 'name', 'totalSupply'] }) // standard 通过 ERC165 识别
43
+ await getNftBalances(user, [BAYC, MAYC], { chainId: 1 }) // ERC721 持有数量
44
+ await getNftOwners([{ contract: BAYC, tokenId: 1 }], { chainId: 1 }) // ERC721 持有人
45
+ await getNftTokenUris([{ contract: BAYC, tokenId: 1 }], { chainId: 1, ipfsGateway: 'https://ipfs.io/ipfs/' })
46
+ await getErc1155Balances(user, [{ contract: ITEMS, tokenId: 7 }], { chainId: 137 }) // ERC1155 余额
47
+ ```
48
+
49
+ | 函数 | Provider 方法 | 说明 |
50
+ | --- | --- | --- |
51
+ | `getBalances(owner, tokens, opts)` | `balances` | 主币 + 代币余额;`symbol: true` 额外返回 symbol |
52
+ | `getOwnerTokens(owner, opts)` | `ownerTokens` | 资产列表:地址持有的代币(**不推荐使用**,结果不保证完整,见[资产列表](#资产列表)) |
53
+ | `getTokens(tokens, opts)` | `tokens` | ERC20 详情,`fields` 选择返回字段,结果类型随之收窄 |
54
+ | `getAllowances(owner, spender, tokens, opts)` | `allowances` | 授权额度;`unlimited` 表示额度 ≥ uint96 最大值(覆盖 MaxUint256 及 UNI / COMP 这类截断为 uint96 的代币) |
55
+ | `getNftCollections(contracts, opts)` | `nftCollections` | NFT 集合 standard / name / symbol / totalSupply,`fields` 可选 |
56
+ | `getNftBalances(owner, contracts, opts)` | `nftBalances` | ERC721 持有数量 |
57
+ | `getNftOwners(items, opts)` | `nftOwners` | ERC721 持有人,可混合多个集合;不存在的 tokenId 为 null;Tron 链上返回 T 开头的地址 |
58
+ | `getNftTokenUris(items, opts)` | `nftTokenUris` | 元数据地址:自动兼容 ERC721 `tokenURI` 与 ERC1155 `uri`(`{id}` 按规范替换),`ipfsGateway` 转换 `ipfs://`;首次查询顺带识别集合标准并缓存,之后只发对应的调用 |
59
+ | `getErc1155Balances(owner, items, opts)` | `erc1155Balances` | ERC1155 余额 |
60
+
61
+ 共同的规则:
62
+
63
+ - **主币**:`0xeeee…eeee`(导出为 `NATIVE_TOKEN`,不区分大小写)和零地址按主币处理,不发合约调用;name / symbol / 精度来自内置链信息表(`NATIVE_CURRENCIES`),可用 `nativeTokens` / `nativeName` / `nativeSymbol` / `nativeDecimals` 配置
64
+ - **缓存**:decimals / symbol / name / NFT 标准不会变,查过一次后按链缓存(各函数共用),之后只查会变的数据;已知精度可以直接传 `{ address, decimals }`(主币也适用,优先于内置配置)
65
+ - **失败**:单项失败(非合约地址、非法地址、不存在的 tokenId 等)不影响其他项,该项 `success: false`;整个请求失败(节点不可用等)才会抛错
66
+ - **数值**:原始数值是最小单位的十进制字符串,需要计算时用 `BigInt(x)`;`formatted` 保留全部有效小数位、不四舍五入,整数不带小数点(单独格式化可用 `formatAmount(value, decimals)`)
67
+ - **老代币**:symbol / name 返回 bytes32 的代币(MKR 等)也能解析
68
+
69
+ ### 节点参数
70
+
71
+ 以上函数的节点参数相同,`chainId` 和 `provider` 至少传一个:
72
+
73
+ ```ts
74
+ await getBalances(user, tokens, { chainId: 56 }) // 只传 chainId:使用内置公共节点
75
+ await getBalances(user, tokens, { provider: 'https://bsc-dataseed.bnbchain.org' }) // 只传节点:chainId 自动识别
76
+ await getBalances(user, tokens, { provider: ['https://rpc-1.example', 'https://rpc-2.example'] }) // 主节点 + 备用节点
77
+ await getBalances(user, tokens, { provider: window.ethereum }) // EVM 钱包
78
+ await getBalances(user, tokens, { provider: window.tronWeb }) // Tron 钱包
79
+ await getBalances(user, tokens, { chainId: 56, provider: [window.ethereum, 'https://bsc-dataseed.bnbchain.org'] }) // 钱包优先,失败用公共节点
80
+ await getBalances(user, tokens, { chainId: 56, blockTag: 'pending' }) // 指定区块
81
+ ```
82
+
83
+ - **chainId 自动识别**:EVM 节点 / 钱包用 `eth_chainId`,ethers Provider 用 `getNetwork()`,Tron 读创世区块哈希的最后 4 字节(与 TronGrid 的 `eth_chainId` 一致);只传 URL 时先按 EVM 识别,失败再按 Tron 识别,所以 Tron 节点 URL 也不用传 chainId
84
+ - **识别结果缓存**:同时发起的识别共用一个请求,失败或超时不缓存(下次重试)。URL 按地址缓存;tronWeb 按当前连接的节点地址缓存(TronLink 切网络后自动重新识别);EIP-1193 钱包按对象缓存并监听 `chainChanged`,切链时失效,不支持事件监听的钱包不缓存。`clearChainIdCache()` 可手动清空
85
+ - **链校验**:传入的节点会确认它实际所在的链与 chainId 一致,不一致时报 `NETWORK_ERROR`,多节点时自动换下一个节点。所以 `[钱包, 公共节点]` 这类组合、配错了节点 URL、或用户自己创建的 `BrowserProvider` 在别的链上,都不会把另一条链的数据当成这条链的返回。校验通过已配置好的节点连接进行(带 Tron apiKey 等),与实际请求并行发出、不增加延迟,结果缓存,每个节点只多一次请求;内置公共节点不校验
86
+ - **Provider 复用**:同一个 chainId + 配置 + 节点多次调用会复用同一个 Provider(共享连接和合并队列,最多缓存 32 组,超出淘汰最早的);只传钱包时每次按钱包当前的链创建,切链后自动按新链查询。`chainId` 为 `null` / `''` 时视为未传
87
+ - 其余 Provider 配置(`fallback`、`nativeSymbol` 等,见[配置](#配置))也可以直接放进这个参数
88
+
89
+ ### 合约调用
90
+
11
91
  ```ts
12
92
  import { Provider } from '@w3lib/evm-batch-call'
13
93
 
14
- const multi = new Provider(56) // 不传节点:使用内置公共节点(多节点自动故障切换)
94
+ const multi = new Provider(56) // 只传 chainId:使用内置公共节点(多节点自动故障切换)
95
+ // const multi = await Provider.create(window.ethereum) // 只传节点:等 chainId 识别完成后返回(也可以 new Provider(window.ethereum),首次调用时识别)
96
+ // const multi = new Provider(56, rpc, config) // 都传:与 ethcall 相同
15
97
 
16
98
  const usdt = multi.erc20('0x55d398326f99059fF775485246999027B3197955')
17
99
 
@@ -28,9 +110,9 @@ const { decimals, allowance } = await multi.all({
28
110
  allowance: usdt.allowance(user, spender),
29
111
  })
30
112
 
31
- // 批量余额(主币 0xeeee…eeee / 零地址 自动识别)、批量代币信息
32
- const balances = await multi.balances(user, [USDT, NATIVE_TOKEN, BUSD]) // bigint[],失败为 0n
33
- const infos = await multi.tokenInfo([USDT, BUSD]) // { symbol, name, decimals } | null
113
+ // 常用查询都有对应的 Provider 方法
114
+ const list = await multi.balances(user, [NATIVE_TOKEN, USDT], { symbol: true })
115
+ const infos = await multi.tokens([USDT, BUSD], { fields: ['symbol', 'decimals'] })
34
116
 
35
117
  // 任意合约
36
118
  const pair = multi.contract(pairAddress, [
@@ -45,14 +127,106 @@ const router = multi.contract(routerAddress, RouterABI)
45
127
  const amountOut = await router.swap.staticCall(params, { value, from: user })
46
128
  ```
47
129
 
130
+ ## 资产列表
131
+
132
+ > **不推荐使用**(已标记 `@deprecated`):`getOwnerTokens` / `provider.ownerTokens` 只能尽力而为,结果不保证完整、准确,局限性见下文。已知要查哪些代币时请用 `getBalances`;传 `alchemy` / `nodereal` 来源能查全,但同样受第三方服务的额度和可用性约束,需要可靠的完整持仓请直接接入索引服务的接口或自己的索引。
133
+
134
+ EVM 链上**没有办法只靠节点列出一个地址持有的全部代币**(链上没有“某地址持有哪些代币”的索引)。`getOwnerTokens` 的做法是:先从“代币来源”拿到候选代币,再用 multicall 在链上核对这些代币的余额,返回有余额的部分。
135
+
136
+ ```ts
137
+ import { alchemy, getOwnerTokens, nodereal, tokenList } from '@w3lib/evm-batch-call'
138
+
139
+ await getOwnerTokens(user, { chainId: 56 }) // 默认:免费公开代币列表
140
+ await getOwnerTokens(user, { chainId: 1, prices: true, minUsd: 1 }) // 带美元价值,按价值排序,过滤 < $1 的代币
141
+ await getOwnerTokens(user, { chainId: 56, source: alchemy({ apiKey: KEY }) }) // 用 Alchemy 查全部历史持仓(需要 Key)
142
+ // [
143
+ // { token: NATIVE_TOKEN, native: true, symbol: 'BNB', formatted: '1.5', price: 600, value: 900, source: 'native', … },
144
+ // { token: '0x…', native: false, symbol: 'CAKE', formatted: '120', price: 2, value: 240, source: 'metamask', logo: '…', … },
145
+ // ]
146
+ ```
147
+
148
+ ### 代币来源
149
+
150
+ | 来源 | 需要 Key | 能发现什么 | 说明 |
151
+ | --- | --- | --- | --- |
152
+ | `metamaskTokenList()`(默认首选) | 否 | MetaMask 汇总的代币列表(Ethereum 约 9500 个、BSC 约 2 万个),默认只用至少 3 家来源收录的 | MetaMask 自用接口,非对外承诺的公开 API |
153
+ | `coingeckoTokenList()`(默认备用) | 否 | CoinGecko 收录的代币(Ethereum 约 6000 个、BSC 约 4500 个) | 覆盖 26 条链,见 `COINGECKO_PLATFORMS` |
154
+ | `tokenList(url)` | 否 | 任意 Uniswap Token List 格式的列表(自己维护的、PancakeSwap 等) | |
155
+ | `staticTokens(list)` | 否 | 固定的代币地址 | 如之前发现过、存下来的代币 |
156
+ | `alchemy({ apiKey })` | **是** | 地址的全部历史持仓 | 19 条链,见 `ALCHEMY_NETWORKS`;可用 `urls: { [chainId]: url }` 按链覆盖地址 |
157
+ | `nodereal({ apiKey })` | **是** | 地址的全部历史持仓 | 仅 BSC、Ethereum;同样支持 `urls` |
158
+
159
+ - 默认来源是 `firstAvailable(metamaskTokenList(), coingeckoTokenList())`:MetaMask 列表不支持这条链、为空或请求失败时,用 CoinGecko 列表
160
+ - 来源可以组合:`firstAvailable(a, b)` 依次尝试,`combine(a, b)` 合并去重(单个来源出错不影响其他来源),例如 `combine(defaultTokenSource(), staticTokens(savedTokens))`
161
+ - **Key 只在调用时传入**:库里没有内置任何 Key,`alchemy()` / `nodereal()` 不传 `apiKey` 会直接报错,不传就不能用这两个来源。出错信息里不会包含 Key。在浏览器里使用时 Key 会暴露给用户,建议在服务端调用,或使用对方控制台里的域名白名单
162
+ - 不管代币从哪个来源发现,**余额和精度都由本库在链上用 multicall 核对**(来源返回的余额不使用,来源给错的精度会被链上的值纠正),链上读不到精度的合约(不是正常的 ERC20)不返回
163
+ - 主币用 Provider 配置的 `nativeTokens` 里的第一个地址查询(默认 `0xeeee…eeee`),名称 / symbol 同样遵循 `nativeName` / `nativeSymbol` 配置;列表里出现的主币映射地址(如 Polygon 的 `0x…1010`、zkSync 的 `0x…800A`)会被排除,不会把主币算两次
164
+ - 公开代币列表按 URL 缓存 1 小时;`clearTokenListCache()` 可手动清空
165
+
166
+ ### 增量扫描(可选)
167
+
168
+ 代币列表发现不了的新代币(刚发行、未被收录),可以用 `scanTransfers` 开关补充:开启后,从**第一次调用开始**,每次调用都往后扫描新区块里转给该地址的 ERC20 `Transfer` 事件,把发现的代币合并进来(结果的 `source` 为 `'transfers'`)。默认关闭。
169
+
170
+ ```ts
171
+ import { getOwnerTokens, keyValueScanStorage } from '@w3lib/evm-batch-call'
172
+
173
+ await getOwnerTokens(user, { chainId: 1, scanTransfers: true }) // 进度存在内存里
174
+ await getOwnerTokens(user, { chainId: 1, scanTransfers: { storage: keyValueScanStorage(localStorage) } }) // 刷新页面后接着扫
175
+ await getOwnerTokens(user, { chainId: 1, scanTransfers: { lookbackBlocks: 20_000 } }) // 第一次额外往回扫一段
176
+ ```
177
+
178
+ | 选项 | 默认 | 说明 |
179
+ | --- | --- | --- |
180
+ | `storage` | 内存 | 扫描进度(起始区块、已扫到的区块、发现的代币)。内存存储在进程 / 页面结束后丢失;`keyValueScanStorage(localStorage)` 或自己实现 `{ get, set }`(如存数据库)可以持久化 |
181
+ | `lookbackBlocks` | 0 | 第一次调用时往回扫的区块数(0 表示只从现在开始) |
182
+ | `blockRange` | 1000 | 单次 `eth_getLogs` 的最大区块范围。节点有上限时按报错里的上限自动缩小(报错里没写上限就减半试),记下的上限 1 天后失效再重新试;偶发错误导致缩小后,连续成功会逐步放大回去 |
183
+ | `maxRequests` | 20 | 每次调用最多发多少个 `eth_getLogs`;落后很多时分多次追上 |
184
+ | `timeBudget` | 5000 | 每次调用的扫描时间预算(毫秒),超过后不再发新请求,留到下次调用 |
185
+ | `confirmations` | 5 | 只扫到最新区块往前这么多个区块,避开链重组和节点之间的高度差(否则可能漏掉刚出的区块) |
186
+
187
+ 出错时的处理:所有节点都明确不开放 `eth_getLogs` 时暂停 10 分钟;能用的节点只是限频 / 超时时不缩小范围,退避后重试(连续 3 次失败留到下次调用);有节点报范围超限时缩小范围。存储里的进度格式不对(如旧版本留下的)会被丢弃,重新开始。
188
+
189
+ 也可以单独当作代币来源使用:`combine(defaultTokenSource(), transferScan({ storage }))`;`getTransferScanState(chainId, owner, storage)` 读取扫描进度。
190
+
191
+ **增量扫描的局限**:
192
+
193
+ - **只能发现开始扫描之后收到的代币**(以及 `lookbackBlocks` 范围内的)。更早收到、又不在代币列表里的代币仍然查不到;需要完整历史请用 `alchemy` / `nodereal`
194
+ - **需要节点支持 `eth_getLogs`**,免费公共节点限制很多:BSC 上内置节点只有 blockrazor 可用,且每次最多 25 个区块(会自动适配),连续请求还会被限频;节点完全不支持时会暂停 10 分钟再试。持续使用建议传自己的节点
195
+ - **进度默认只在内存里**:页面刷新、服务重启后会从头开始(重新记下当前区块),需要持久化请传 `storage`
196
+ - **会增加 `getOwnerTokens` 的耗时**:扫描和余额查询一起等待,每次调用通常多几百毫秒到 `timeBudget`(默认 5 秒),最坏再加上一个请求的超时时间(节点超时默认 10 秒)。对耗时敏感时可以调小 `timeBudget` / `maxRequests`,或单独用 `transferScan` 在后台定期扫描、展示时只读进度
197
+ - **很久没调用时追赶较慢**:每次最多 `maxRequests` 个请求、`timeBudget` 时间(如 BSC 上 20 × 25 = 500 个区块),落后很多时需要多次调用才能追上
198
+ - **最新几个区块里收到的代币要等下一次调用**(`confirmations`,默认 5 个区块)
199
+ - 扫描到的代币不经过任何列表筛选,**大部分会是空投垃圾币**,建议配合 `prices` + `minUsd` 使用
200
+ - 只看转入(`to` 为该地址)的 ERC20 `Transfer` 事件;不发标准 `Transfer` 事件的代币发现不了;Tron 不支持
201
+
202
+ ### 价格
203
+
204
+ `prices: true` 用 DefiLlama 查美元价格(免费、不需要 Key),结果带 `price` / `value`,并按价值从高到低排序;`minUsd` 只保留价值不低于它的代币(没有价格的代币也会被去掉,主币始终保留)。只传 `minUsd` 时会自动开启 DefiLlama 价格;与 `prices: false` 同时使用会报错。也可以传自己的价格源:`prices: { name, prices: async ({ chainId, tokens, native }) => Map }`。
205
+
206
+ ### 局限性
207
+
208
+ 使用前请了解:
209
+
210
+ 1. **默认来源只能发现公开列表里的代币**。刚发行、还没被列表收录的代币(如新上线的 meme 币)、小众代币查不到;需要完整持仓时,传 `alchemy({ apiKey })` 或 `nodereal({ apiKey })`
211
+ 2. **默认来源依赖第三方免费服务**(MetaMask、CoinGecko 的列表,DefiLlama 的价格):它们可能限流、变更格式或停止服务;MetaMask 列表接口不是对外承诺的公开 API。生产环境建议组合多个来源,或使用自己维护的列表(`tokenList(url)`)
212
+ 3. **列表里也有垃圾币和零头**。默认只用至少 3 家来源收录的代币来减少垃圾币,但仍会有不少价值很低的代币;需要干净的列表时开启 `prices` 并设置 `minUsd`
213
+ 4. **价格不一定可信**。流动性很差的代币价格可能严重虚高(实测有空投代币被估值数十万美元),默认已过滤 DefiLlama 置信度低于 0.9 的价格,但展示总资产时仍建议使用自己的价格源或再做校验
214
+ 5. **需要查几千到两万个代币的余额**,耗时几秒:实测 Ethereum(约 9500 个代币)首次约 11 秒、之后约 6 秒,BSC(约 4800 个)首次约 8 秒、之后约 4 秒(首次要在链上核对持有代币的精度,之后有缓存)。大量使用时建议缓存结果;列表很大时也会占用较多节点请求
215
+ 6. **只包含 ERC20 代币**,不含 NFT(NFT 请用 `getNftBalances` 等);Tron 链没有默认来源,需要自己传 `source`
216
+ 7. 使用 Alchemy / NodeReal 时受它们的免费额度和限频约束,翻页次数默认最多 20 页(2000 个代币),可用 `maxPages` 调整
217
+ 8. 开启 `scanTransfers` 时另有局限,见上面「增量扫描」
218
+
48
219
  ## 功能
49
220
 
221
+ - **常用查询**:余额、代币详情、授权额度、NFT(集合 / 持有 / 元数据地址 / ERC1155 余额),一个函数一次请求
222
+ - **资产列表**(不推荐使用,尽力而为):`getOwnerTokens`,免费公开代币列表或带 Key 的索引服务发现代币,multicall 核对余额,可选 DefiLlama 价格
50
223
  - **批量读取**:`all` / `tryAll` / `tryEach`,N 条读调用合成一次 `eth_call`;支持数组或对象输入
51
224
  - **自动合并**:绑定合约直接 `await`,或 `provider.call(x)`,同一收集窗口内的调用合并成一次请求并去重
52
225
  - **预执行**:`staticCall` / `staticCallAll` / `method.staticCall`,带 `from` / `value` 模拟交易,返回解析好的 revert 原因
53
226
  - **主币余额合并**:`getEthBalance` 与合约调用在同一次 `eth_call` 里——无论链上有没有 Multicall3
54
227
  - **任意链可用**:内置 Multicall3 地址表;表里没有、地址无效、或查询早于部署区块时,自动改用 deployless(链上无需部署任何合约)
55
228
  - **备用节点**:传多个节点自动故障切换;不传节点使用内置公共节点表(34 条 EVM 链 + Tron)
229
+ - **chainId 可选**:传了节点就能自动识别 chainId,结果缓存,钱包切链自动失效
56
230
  - **Tron**:走 Tron HTTP API,T 开头地址可以直接用
57
231
  - **浏览器插件钱包**:直接传 `window.ethereum`(EIP-1193)或 `window.tronWeb`
58
232
  - **大批量**:合约模式按 `chunkSize`(默认 500)分片;deployless 按 48KB initcode 上限自动分片,结果超过 24KB 也能拿回
@@ -60,6 +234,7 @@ const amountOut = await router.swap.staticCall(params, { value, from: user })
60
234
  ## 节点与备用节点
61
235
 
62
236
  ```ts
237
+ new Provider('https://bsc-dataseed.bnbchain.org') // 只传节点:chainId 自动识别
63
238
  new Provider(56) // 内置公共节点
64
239
  new Provider(56, 'https://bsc-dataseed.bnbchain.org') // 单个 URL
65
240
  new Provider(56, ['https://a.example', 'https://b.example']) // 主节点 + 备用节点
@@ -151,13 +326,16 @@ deployless 还修正了 ethcall 自带字节码的两个上限问题(在 BSC
151
326
  ## 浏览器插件钱包
152
327
 
153
328
  ```ts
154
- const multi = new Provider(chainId, window.ethereum) // MetaMask / OKX / Rabby …
155
- const tron = new Provider(TRON_CHAIN_ID.mainnet, window.tronWeb) // TronLink / OKX …
329
+ const multi = new Provider(window.ethereum) // MetaMask / OKX / Rabby …,chainId 取钱包当前的链
330
+ const tron = new Provider(window.tronWeb) // TronLink / OKX …
331
+ const bsc = new Provider(56, window.ethereum) // 指定链:钱包不在这条链上时报错
156
332
  ```
157
333
 
158
334
  - EVM 钱包内部用 ethers `BrowserProvider` 包装
159
335
  - Tron 钱包请求走钱包配置的节点,预执行默认以当前连接地址作为 `from`,切换账号后自动跟随
160
- - 请求发到的是**钱包当前所选的链**,要与传入的 `chainId` 一致;可以写成 `[window.ethereum, ...公共节点]`,钱包出错时自动用公共节点
336
+ - 请求发到的是**钱包当前所选的链**。传了 `chainId` 而钱包不在这条链上(包括用户中途切链)时请求会报 `NETWORK_ERROR`,不会返回别的链的数据;写成 `[window.ethereum, ...公共节点]` 时会自动改用公共节点
337
+ - 只传钱包时,同一个 Provider 实例固定在识别时的链上,用户切链后请求同样报 `NETWORK_ERROR`;需要跟随钱包切链时用 `getBalances` 等函数(每次按当前链查询),或在 `chainChanged` 时重新创建 Provider
338
+ - 只传节点时 chainId 在首次调用时识别,识别失败(如钱包未解锁、节点限流)会在下次调用时重试;`rpc` / `multicall` 这类同步属性需要在 `await multi.ready()` 之后读取,或直接用 `await Provider.create(...)`
161
339
 
162
340
  ## Tron
163
341
 
@@ -184,14 +362,17 @@ toTronAddress('0xa614f803b6fd780986a42c78ec9c7f77e6ded13c') // 返回值里的
184
362
  ## 配置
185
363
 
186
364
  ```ts
187
- new Provider(chainId, nodes?, {
365
+ new Provider(chainId, nodes?, { // 或 new Provider(nodes, { … })
188
366
  multicall: { address: '0x…', block: 0 }, // 自定义 Multicall3 地址(默认查内置表)
189
367
  deployless: false, // true:强制走 deployless
190
368
  chunkSize: 500, // 合约模式单次 eth_call 最多打包的调用数
191
369
  batch: { wait: 0, maxSize: 500 }, // 自动合并参数
192
370
  fallback: { timeout: 10_000, cooldown: 30_000 }, // 节点超时 / 出错节点冷却时间
193
371
  tron: { apiKey, minInterval: 200 }, // 用 URL 创建 TronProvider 时的参数
194
- nativeTokens: ['0xeeee…eeee'], // balances() 里视为主币的地址
372
+ nativeTokens: [NATIVE_TOKEN, ZeroAddress], // 视为主币的地址(默认值;ZeroAddress 来自 ethers)
373
+ nativeDecimals: 18, // 主币精度 / symbol / 名称,默认按内置链信息表(NATIVE_CURRENCIES)
374
+ nativeSymbol: 'BNB',
375
+ nativeName: 'BNB',
195
376
  })
196
377
  ```
197
378
 
@@ -215,10 +396,11 @@ API 兼容,大多数情况下只需替换 import,现有调用(含 `tryAll<
215
396
  const multi = new Provider(chainId, ['https://rpc-1.example', 'https://rpc-2.example'])
216
397
 
217
398
  // 主币余额不用再单独 getBalance,和代币余额一次查
218
- const balances = await multi.balances(account, tokens) // bigint[]
399
+ const balances = await multi.balances(account, tokens) // [{ balance, decimals, formatted, success }]
219
400
 
220
- // 代币信息一次查
221
- const infos = await multi.tokenInfo(tokens)
401
+ // 代币详情、授权额度一次查
402
+ const infos = await multi.tokens(tokens)
403
+ const allowances = await multi.allowances(account, router, tokens)
222
404
 
223
405
  // Tron 也能批量查,不用逐个 triggerConstantContract
224
406
  const tron = new Provider(TRON_CHAIN_ID.mainnet, window.tronWeb)
@@ -1,8 +1,11 @@
1
1
  import { Interface, type Provider as EthersProvider } from 'ethers';
2
2
  import type { CallRequest, RawResult } from './call.js';
3
3
  import { type Multicall } from './multicall.js';
4
- /** 只用到 ethers Provider 的这两个方法,JsonRpcProvider / BrowserProvider 都满足 */
5
- export type EthersLikeProvider = Pick<EthersProvider, 'call' | 'getBalance'>;
4
+ /**
5
+ * 只用到 ethers Provider 的这几个方法:必需 call / getBalance;getLogs / getBlockNumber 可选(只有增量扫描 Transfer 事件时用到)。
6
+ * ethers 的 JsonRpcProvider / BrowserProvider 都满足
7
+ */
8
+ export type EthersLikeProvider = Pick<EthersProvider, 'call' | 'getBalance'> & Partial<Pick<EthersProvider, 'getLogs' | 'getBlockNumber'>>;
6
9
  export type BlockTag = number | bigint | string;
7
10
  export interface CallOverrides {
8
11
  blockTag?: BlockTag;
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAkC,KAAK,QAAQ,IAAI,cAAc,EAAE,MAAM,QAAQ,CAAA;AAE7G,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGvD,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEnE,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,CAAC,CAAA;AAE5E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE/C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,mBAAmB,WAG9B,CAAA;AAaF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,4BAA4B;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,GAAE,aAAkB,GAC5B,OAAO,CAAC,SAAS,EAAE,CAAC,CActB;AA0LD,uBAAuB;AACvB,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
1
+ {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAkC,KAAK,QAAQ,IAAI,cAAc,EAAE,MAAM,QAAQ,CAAA;AAE7G,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGvD,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEnE;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAA;AAE1I,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE/C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,mBAAmB,WAG9B,CAAA;AAaF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,4BAA4B;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,GAAE,aAAkB,GAC5B,OAAO,CAAC,SAAS,EAAE,CAAC,CActB;AA0LD,uBAAuB;AACvB,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"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"}
package/dist/call.d.ts CHANGED
@@ -23,8 +23,12 @@ export interface Call<T = any> {
23
23
  value?: bigint | string | number;
24
24
  gasLimit?: bigint | string | number;
25
25
  };
26
- /** 内部标记:原生币余额查询(见 Provider.getEthBalance) */
27
- kind?: 'ethBalance';
26
+ /**
27
+ * 内部标记:
28
+ * - ethBalance:原生币余额查询(见 Provider.getEthBalance)
29
+ * - stringOrBytes32:string 返回值,解码失败时按 bytes32 解析(MKR 等老代币的 symbol / name)
30
+ */
31
+ kind?: 'ethBalance' | 'stringOrBytes32';
28
32
  /** 仅用于类型推断 */
29
33
  readonly __result?: T;
30
34
  }
@@ -49,5 +53,7 @@ export interface CallRequest {
49
53
  export declare function encodeCall(call: Call, allowFailure: boolean): CallRequest;
50
54
  /** 单返回值直接返回该值,多返回值返回 ethers Result(可按下标或名字取) */
51
55
  export declare function decodeCall<T>(call: Call, returnData: string): T;
56
+ /** 标记 string 返回值的调用:解码失败时按 bytes32 解析(MKR 等老代币的 symbol / name) */
57
+ export declare function asStringOrBytes32<T>(call: Call<T>): Call<T>;
52
58
  export declare function encodeUint256(value: bigint): string;
53
59
  //# sourceMappingURL=call.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../src/call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkE,KAAK,gBAAgB,EAA+B,MAAM,QAAQ,CAAA;AAK3I,MAAM,MAAM,MAAM,GAAG,GAAG,EAAE,CAAA;AAE1B;;;GAGG;AAEH,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG;IAC3B,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAA;IACnC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;QACnC,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;QAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KACpC,CAAA;IACD,6CAA6C;IAC7C,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,cAAc;IACd,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;CACtB;AAED,2EAA2E;AAC3E,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAEzD,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,OAAO,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAgCD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,GAAG,WAAW,CAUzE;AAkCD,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,CAK/D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD"}
1
+ {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../src/call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgG,KAAK,gBAAgB,EAA+B,MAAM,QAAQ,CAAA;AAKzK,MAAM,MAAM,MAAM,GAAG,GAAG,EAAE,CAAA;AAE1B;;;GAGG;AAEH,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG;IAC3B,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAA;IACnC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;QACnC,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;QAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KACpC,CAAA;IACD;;;;OAIG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,iBAAiB,CAAA;IACvC,cAAc;IACd,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;CACtB;AAED,2EAA2E;AAC3E,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAEzD,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,OAAO,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAgCD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,GAAG,WAAW,CAUzE;AAkCD,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,CAQ/D;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAG3D;AAkBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD"}
package/dist/call.js CHANGED
@@ -1,4 +1,4 @@
1
- import { FunctionFragment, Interface, getAddress, toBeHex, zeroPadValue } from 'ethers';
1
+ import { FunctionFragment, Interface, Utf8ErrorFuncs, getAddress, toBeHex, toUtf8String, zeroPadValue } from 'ethers';
2
2
  import { isTronAddress, toEvmAddress } from './tron.js';
3
3
  // inputs → name → outputs → Interface。同一份 ABI 生成的 Call 共享 inputs/outputs 数组(见 contract.ts 的 ABI 缓存),
4
4
  // 按引用缓存,避免每条 Call 都重新解析;三者都参与 key,手工构造的 Call 共用数组时也不会串
@@ -71,11 +71,35 @@ function normalizeValue(type, value) {
71
71
  }
72
72
  /** 单返回值直接返回该值,多返回值返回 ethers Result(可按下标或名字取) */
73
73
  export function decodeCall(call, returnData) {
74
+ if (call.kind === 'stringOrBytes32') {
75
+ return decodeStringOrBytes32(call, returnData);
76
+ }
74
77
  const iface = getInterface(call);
75
78
  const fragment = iface.fragments[0];
76
79
  const result = iface.decodeFunctionResult(fragment, returnData);
77
80
  return (call.outputs.length === 1 ? result[0] : result);
78
81
  }
82
+ /** 标记 string 返回值的调用:解码失败时按 bytes32 解析(MKR 等老代币的 symbol / name) */
83
+ export function asStringOrBytes32(call) {
84
+ call.kind = 'stringOrBytes32';
85
+ return call;
86
+ }
87
+ function decodeStringOrBytes32(call, returnData) {
88
+ try {
89
+ const iface = getInterface(call);
90
+ return iface.decodeFunctionResult(iface.fragments[0], returnData)[0];
91
+ }
92
+ catch (err) {
93
+ // bytes32:恰好 32 字节,按 UTF-8 解析并去掉末尾的 \0
94
+ if (/^0x[0-9a-fA-F]{64}$/.test(returnData)) {
95
+ const text = toUtf8String(returnData, Utf8ErrorFuncs.ignore).replace(/\0+$/, '');
96
+ if (text) {
97
+ return text;
98
+ }
99
+ }
100
+ throw err;
101
+ }
102
+ }
79
103
  export function encodeUint256(value) {
80
104
  return zeroPadValue(toBeHex(value), 32);
81
105
  }
package/dist/call.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"call.js","sourceRoot":"","sources":["../src/call.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../src/call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 内置链的主币信息(balances() / tokens() 里主币的 name / symbol / 精度)。
3
+ * 来源:https://chainid.network/chains.json 的 nativeCurrency;999 在该表里与 Wanchain 测试网撞号,
4
+ * 这里按 HyperEVM 手动填写;Tron 手动填写。表里没有的链可通过 nativeSymbol / nativeDecimals 配置。
5
+ */
6
+ export interface NativeCurrency {
7
+ name: string;
8
+ symbol: string;
9
+ decimals: number;
10
+ }
11
+ export declare const NATIVE_CURRENCIES: Readonly<Record<number, NativeCurrency>>;
12
+ export declare function getNativeCurrency(chainId: number): NativeCurrency | undefined;
13
+ //# sourceMappingURL=chains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../src/chains.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA8BtE,CAAA;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE7E"}
package/dist/chains.js ADDED
@@ -0,0 +1,35 @@
1
+ export const NATIVE_CURRENCIES = {
2
+ 1: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Ethereum Mainnet
3
+ 10: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // OP Mainnet
4
+ 56: { name: 'BNB Chain Native Token', symbol: 'BNB', decimals: 18 }, // BNB Smart Chain Mainnet
5
+ 130: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Unichain
6
+ 137: { name: 'POL', symbol: 'POL', decimals: 18 }, // Polygon Mainnet
7
+ 143: { name: 'Monad', symbol: 'MON', decimals: 18 }, // Monad
8
+ 173: { name: 'EGAS', symbol: 'EGAS', decimals: 18 }, // ENI Mainnet
9
+ 196: { name: 'X Layer Global Utility Token', symbol: 'OKB', decimals: 18 }, // X Layer Mainnet
10
+ 204: { name: 'BNB Chain Native Token', symbol: 'BNB', decimals: 18 }, // opBNB Mainnet
11
+ 324: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // zkSync Mainnet
12
+ 988: { name: 'USDT0', symbol: 'USDT0', decimals: 18 }, // Stable Mainnet
13
+ 999: { name: 'HYPE', symbol: 'HYPE', decimals: 18 }, // HyperEVM
14
+ 1116: { name: 'Core Blockchain Native Token', symbol: 'CORE', decimals: 18 }, // Core Blockchain Mainnet
15
+ 2818: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Morph
16
+ 4663: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Robinhood Chain
17
+ 5000: { name: 'Mantle', symbol: 'MNT', decimals: 18 }, // Mantle
18
+ 8453: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Base
19
+ 9745: { name: 'Plasma', symbol: 'XPL', decimals: 18 }, // Plasma Mainnet
20
+ 34443: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Mode
21
+ 42161: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Arbitrum One
22
+ 43114: { name: 'Avalanche', symbol: 'AVAX', decimals: 18 }, // Avalanche C-Chain
23
+ 57073: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Ink
24
+ 59144: { name: 'Linea Ether', symbol: 'ETH', decimals: 18 }, // Linea
25
+ 80094: { name: 'BERA Token', symbol: 'BERA', decimals: 18 }, // Berachain
26
+ 81457: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Blast
27
+ 534352: { name: 'Ether', symbol: 'ETH', decimals: 18 }, // Scroll
28
+ 6666665: { name: 'SAFE(AnWang)', symbol: 'SAFE', decimals: 18 }, // Safe(AnWang) Mainnet
29
+ 20260131: { name: 'MetaAssets', symbol: 'MA', decimals: 18 }, // Meta Assets Chain
30
+ 728126428: { name: 'TRON', symbol: 'TRX', decimals: 6 }, // Tron
31
+ };
32
+ export function getNativeCurrency(chainId) {
33
+ return NATIVE_CURRENCIES[chainId];
34
+ }
35
+ //# sourceMappingURL=chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../src/chains.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { EthersLikeProvider } from './aggregate.js';
2
+ import type { ProviderSource } from './source.js';
3
+ /**
4
+ * 按来源缓存地执行一次识别(与 detectChainId 共用缓存)。
5
+ * 链校验用它通过已配置好的节点连接识别(带 apiKey / 限流等),而不是重新创建连接。
6
+ */
7
+ export declare function detectChainIdCached(source: ProviderSource, detect: () => Promise<number>, timeout?: number): Promise<number>;
8
+ /** 清空 chainId 识别缓存 */
9
+ export declare function clearChainIdCache(): void;
10
+ /**
11
+ * 从节点识别 chainId(不传 chainId 时使用),结果会缓存。数组按顺序探测,第一个成功的为准:
12
+ * - RPC URL:先按 EVM 节点发 eth_chainId,失败再按 Tron 全节点读创世区块
13
+ * - 浏览器插件钱包(EIP-1193):eth_chainId;tronWeb:Tron 创世区块
14
+ * - ethers Provider:getNetwork();TronProvider / FallbackRpc:getChainId()
15
+ *
16
+ * @param timeout 单个节点的超时(毫秒);URL 的 EVM / Tron 两次尝试各自计时
17
+ */
18
+ export declare function detectChainId(source: ProviderSource | readonly ProviderSource[], timeout?: number): Promise<number>;
19
+ /** 能否从这个来源识别 chainId(不能的来源跳过链校验,见 source.ts) */
20
+ export declare function canDetectChainId(source: ProviderSource): boolean;
21
+ /** 已创建的连接对象上识别 chainId */
22
+ export declare function detectChainIdOf(node: EthersLikeProvider): Promise<number>;
23
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAuCjD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5H;AA8CD,sBAAsB;AACtB,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,cAAc,EAAE,EAAE,OAAO,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAYzH;AAED,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAShE;AAED,0BAA0B;AAC1B,wBAAsB,eAAe,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB/E"}