@w3lib/evm-batch-call 0.7.0 → 0.8.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 (159) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +206 -1
  3. package/dist/dividends.d.ts +135 -0
  4. package/dist/dividends.d.ts.map +1 -0
  5. package/dist/dividends.js +253 -0
  6. package/dist/dividends.js.map +1 -0
  7. package/dist/history.d.ts +154 -0
  8. package/dist/history.d.ts.map +1 -0
  9. package/dist/history.js +247 -0
  10. package/dist/history.js.map +1 -0
  11. package/dist/historySources.d.ts +32 -0
  12. package/dist/historySources.d.ts.map +1 -0
  13. package/dist/historySources.js +319 -0
  14. package/dist/historySources.js.map +1 -0
  15. package/dist/liquidity/v3.d.ts +2 -0
  16. package/dist/liquidity/v3.d.ts.map +1 -1
  17. package/dist/liquidity/v3.js +1 -1
  18. package/dist/liquidity/v3.js.map +1 -1
  19. package/dist/liquidity/v4.d.ts +21 -0
  20. package/dist/liquidity/v4.d.ts.map +1 -1
  21. package/dist/liquidity/v4.js +4 -3
  22. package/dist/liquidity/v4.js.map +1 -1
  23. package/dist/lp.d.ts +8 -0
  24. package/dist/lp.d.ts.map +1 -1
  25. package/dist/lp.js +17 -1
  26. package/dist/lp.js.map +1 -1
  27. package/dist/lpV4.d.ts +4 -0
  28. package/dist/lpV4.d.ts.map +1 -1
  29. package/dist/lpV4.js +27 -3
  30. package/dist/lpV4.js.map +1 -1
  31. package/dist/permit.d.ts +137 -0
  32. package/dist/permit.d.ts.map +1 -0
  33. package/dist/permit.js +355 -0
  34. package/dist/permit.js.map +1 -0
  35. package/dist/portfolio.d.ts +2 -0
  36. package/dist/portfolio.d.ts.map +1 -1
  37. package/dist/portfolio.js +9 -4
  38. package/dist/portfolio.js.map +1 -1
  39. package/dist/rewards/farms.d.ts +26 -0
  40. package/dist/rewards/farms.d.ts.map +1 -0
  41. package/dist/rewards/farms.js +210 -0
  42. package/dist/rewards/farms.js.map +1 -0
  43. package/dist/rewards/index.d.ts +42 -0
  44. package/dist/rewards/index.d.ts.map +1 -0
  45. package/dist/rewards/index.js +382 -0
  46. package/dist/rewards/index.js.map +1 -0
  47. package/dist/rewards/types.d.ts +170 -0
  48. package/dist/rewards/types.d.ts.map +1 -0
  49. package/dist/rewards/types.js +2 -0
  50. package/dist/rewards/types.js.map +1 -0
  51. package/dist/simulate.d.ts +186 -0
  52. package/dist/simulate.d.ts.map +1 -0
  53. package/dist/simulate.js +559 -0
  54. package/dist/simulate.js.map +1 -0
  55. package/dist/simulateDecode.d.ts +33 -0
  56. package/dist/simulateDecode.d.ts.map +1 -0
  57. package/dist/simulateDecode.js +321 -0
  58. package/dist/simulateDecode.js.map +1 -0
  59. package/dist/smartAccount/account.d.ts +31 -0
  60. package/dist/smartAccount/account.d.ts.map +1 -0
  61. package/dist/smartAccount/account.js +33 -0
  62. package/dist/smartAccount/account.js.map +1 -0
  63. package/dist/smartAccount/clients.d.ts +77 -0
  64. package/dist/smartAccount/clients.d.ts.map +1 -0
  65. package/dist/smartAccount/clients.js +122 -0
  66. package/dist/smartAccount/clients.js.map +1 -0
  67. package/dist/smartAccount/eip5792.d.ts +77 -0
  68. package/dist/smartAccount/eip5792.d.ts.map +1 -0
  69. package/dist/smartAccount/eip5792.js +152 -0
  70. package/dist/smartAccount/eip5792.js.map +1 -0
  71. package/dist/smartAccount/send.d.ts +40 -0
  72. package/dist/smartAccount/send.d.ts.map +1 -0
  73. package/dist/smartAccount/send.js +271 -0
  74. package/dist/smartAccount/send.js.map +1 -0
  75. package/dist/smartAccount/userOp.d.ts +91 -0
  76. package/dist/smartAccount/userOp.d.ts.map +1 -0
  77. package/dist/smartAccount/userOp.js +124 -0
  78. package/dist/smartAccount/userOp.js.map +1 -0
  79. package/dist/subpaths/dividends.d.ts +28 -0
  80. package/dist/subpaths/dividends.d.ts.map +1 -0
  81. package/dist/subpaths/dividends.js +29 -0
  82. package/dist/subpaths/dividends.js.map +1 -0
  83. package/dist/subpaths/history.d.ts +22 -0
  84. package/dist/subpaths/history.d.ts.map +1 -0
  85. package/dist/subpaths/history.js +23 -0
  86. package/dist/subpaths/history.js.map +1 -0
  87. package/dist/subpaths/permit.d.ts +14 -0
  88. package/dist/subpaths/permit.d.ts.map +1 -0
  89. package/dist/subpaths/permit.js +14 -0
  90. package/dist/subpaths/permit.js.map +1 -0
  91. package/dist/subpaths/price.js +2 -2
  92. package/dist/subpaths/price.js.map +1 -1
  93. package/dist/subpaths/rewards.d.ts +27 -0
  94. package/dist/subpaths/rewards.d.ts.map +1 -0
  95. package/dist/subpaths/rewards.js +25 -0
  96. package/dist/subpaths/rewards.js.map +1 -0
  97. package/dist/subpaths/simulate.d.ts +25 -0
  98. package/dist/subpaths/simulate.d.ts.map +1 -0
  99. package/dist/subpaths/simulate.js +28 -0
  100. package/dist/subpaths/simulate.js.map +1 -0
  101. package/dist/subpaths/smart-account.d.ts +24 -0
  102. package/dist/subpaths/smart-account.d.ts.map +1 -0
  103. package/dist/subpaths/smart-account.js +24 -0
  104. package/dist/subpaths/smart-account.js.map +1 -0
  105. package/dist/swap.d.ts +45 -5
  106. package/dist/swap.d.ts.map +1 -1
  107. package/dist/swap.js +108 -12
  108. package/dist/swap.js.map +1 -1
  109. package/dist/write/batch.d.ts +34 -2
  110. package/dist/write/batch.d.ts.map +1 -1
  111. package/dist/write/batch.js +22 -3
  112. package/dist/write/batch.js.map +1 -1
  113. package/dist/write/collect.d.ts +9 -0
  114. package/dist/write/collect.d.ts.map +1 -1
  115. package/dist/write/collect.js +41 -1
  116. package/dist/write/collect.js.map +1 -1
  117. package/dist/write/send.d.ts +4 -0
  118. package/dist/write/send.d.ts.map +1 -1
  119. package/dist/write/send.js.map +1 -1
  120. package/dist/write/signer.d.ts +5 -1
  121. package/dist/write/signer.d.ts.map +1 -1
  122. package/dist/write/signer.js.map +1 -1
  123. package/dist/write/transfer.d.ts +5 -3
  124. package/dist/write/transfer.d.ts.map +1 -1
  125. package/dist/write/transfer.js +12 -6
  126. package/dist/write/transfer.js.map +1 -1
  127. package/package.json +35 -1
  128. package/src/dividends.ts +360 -0
  129. package/src/history.ts +367 -0
  130. package/src/historySources.ts +360 -0
  131. package/src/liquidity/v3.ts +1 -1
  132. package/src/liquidity/v4.ts +4 -3
  133. package/src/lp.ts +18 -1
  134. package/src/lpV4.ts +32 -2
  135. package/src/permit.ts +457 -0
  136. package/src/portfolio.ts +11 -4
  137. package/src/rewards/farms.ts +229 -0
  138. package/src/rewards/index.ts +431 -0
  139. package/src/rewards/types.ts +179 -0
  140. package/src/simulate.ts +727 -0
  141. package/src/simulateDecode.ts +352 -0
  142. package/src/smartAccount/account.ts +63 -0
  143. package/src/smartAccount/clients.ts +180 -0
  144. package/src/smartAccount/eip5792.ts +187 -0
  145. package/src/smartAccount/send.ts +341 -0
  146. package/src/smartAccount/userOp.ts +180 -0
  147. package/src/subpaths/dividends.ts +47 -0
  148. package/src/subpaths/history.ts +41 -0
  149. package/src/subpaths/permit.ts +39 -0
  150. package/src/subpaths/price.ts +2 -2
  151. package/src/subpaths/rewards.ts +46 -0
  152. package/src/subpaths/simulate.ts +51 -0
  153. package/src/subpaths/smart-account.ts +40 -0
  154. package/src/swap.ts +139 -18
  155. package/src/write/batch.ts +44 -5
  156. package/src/write/collect.ts +60 -1
  157. package/src/write/send.ts +4 -0
  158. package/src/write/signer.ts +5 -1
  159. package/src/write/transfer.ts +17 -10
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Flap(flap.sh,BNB Chain 发币平台)的分红:持有带分红的 Flap 税收代币(FlapTaxToken)的地址按持仓比例分到税收,
3
+ * 分红放在每个代币自己的 Dividend 合约里,持有人(或任何人替持有人)调用 withdrawDividendsFor 领取。
4
+ *
5
+ * 核实过的合约(BSC 主网,2026-10 在主网分叉上实测):
6
+ * - 代币:`dividendContract()` 返回它的 Dividend 合约(Tax Token V3 总是部署;V2 只在 dividendBps > 0 时部署)
7
+ * - Dividend 合约(EIP-1167 克隆,实现 0xd67447C2…5905,Sourcify / BscScan 上未验证源码,函数靠官方文档 + 链上调用核对):
8
+ * `dividendToken()`、`weth()`、`minimumShareBalance()`、`withdrawableDividends(address)`、`withdrawnDividends(address)`、
9
+ * `withdrawDividendsFor(address)`(任何人可调,款项直接到持有人)
10
+ * - 官方 TaxTokenHelper(0x53841c73…8346)的 `getDividendInfo(token, user) → (claimed, pending)` 与上面两个函数结果一致(测试里交叉核对)
11
+ *
12
+ * 只有一种合约形态,所以只有一个适配器(flap);识别不了的代币(没有 dividendContract() 或 Dividend 合约缺函数)放进 unsupported,
13
+ * 不猜函数。
14
+ */
15
+ import { Interface, getAddress } from 'ethers';
16
+ import { NATIVE_TOKEN, formatUnits } from './erc20.js';
17
+ import { runLogScan } from './scan.js';
18
+ import { isTronChain } from './tron.js';
19
+ /** 支持的链:目前只有 BSC(Flap 在 Base、X Layer 等链上也有部署,但没有核实过,不开放) */
20
+ export const FLAP_DIVIDEND_CHAINS = {
21
+ 56: {
22
+ portal: '0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0',
23
+ taxTokenHelper: '0x53841c73217735F37BC1775538b03b23feFD8346',
24
+ swapRegistry: '0x644A8f560138418bAD4EdEFC7c17878a3c2fBEB6',
25
+ },
26
+ };
27
+ /** Flap 代币地址的靓号后缀(Portal 创建时用):税收代币是 7777,普通代币是 8888(实测也有 8888 的代币带分红合约);发现持仓时只收这类地址 */
28
+ export const FLAP_TOKEN_SUFFIXES = ['7777', '8888'];
29
+ const TOKEN_ABI = [
30
+ 'function dividendContract() view returns (address)',
31
+ 'function balanceOf(address) view returns (uint256)',
32
+ 'function symbol() view returns (string)',
33
+ 'function decimals() view returns (uint8)',
34
+ ];
35
+ const DIVIDEND_ABI = [
36
+ 'function dividendToken() view returns (address)',
37
+ 'function weth() view returns (address)',
38
+ 'function minimumShareBalance() view returns (uint256)',
39
+ 'function withdrawableDividends(address) view returns (uint256)',
40
+ 'function withdrawnDividends(address) view returns (uint256)',
41
+ ];
42
+ const ERC20_META_ABI = ['function symbol() view returns (string)', 'function decimals() view returns (uint8)'];
43
+ const claimInterface = new Interface(['function withdrawDividendsFor(address user)']);
44
+ const ZERO = '0x0000000000000000000000000000000000000000';
45
+ const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
46
+ /** 一次最多检查的代币数(防止传入或发现的列表无限大) */
47
+ const MAX_TOKENS = 200;
48
+ function assertChain(chainId) {
49
+ if (isTronChain(chainId) || !FLAP_DIVIDEND_CHAINS[chainId]) {
50
+ throw new Error(`Flap dividends are only supported on BNB Chain (56), got chain ${chainId}`);
51
+ }
52
+ }
53
+ /** 发现持有人收到过的 Flap 税收代币(只发现,不核对有没有分红:把 tokens 交给 dividends) */
54
+ export async function scanDividendTokens(provider, owner, options = {}) {
55
+ assertChain(await provider.getChainId());
56
+ const ownerTopic = `0x${getAddress(owner).slice(2).toLowerCase().padStart(64, '0')}`;
57
+ const lookback = Math.max(0, Math.floor(options.lookbackBlocks ?? 5000));
58
+ const suffixes = (options.suffixes ?? FLAP_TOKEN_SUFFIXES).map((x) => x.toLowerCase());
59
+ const progress = await runLogScan({
60
+ provider,
61
+ saved: options.progress,
62
+ initialCursor: (target) => (options.fromBlock !== undefined ? options.fromBlock - 1 : target - lookback),
63
+ filter: { topics: [TRANSFER_TOPIC, null, ownerTopic] },
64
+ // 只收 ERC20 的 Transfer(3 个 topic)里靓号后缀的合约
65
+ collect: (log) => (log.topics.length === 3 && suffixes.some((s) => log.address.toLowerCase().endsWith(s)) ? log.address.toLowerCase() : null),
66
+ maxRange: Math.max(1, Math.floor(options.blockRange ?? 1000)),
67
+ maxRequests: Math.max(1, Math.floor(options.maxRequests ?? 10)),
68
+ timeBudget: options.timeBudget ?? 10_000,
69
+ confirmations: 0,
70
+ ...(options.signal ? { signal: options.signal } : {}),
71
+ });
72
+ return { tokens: (progress?.items ?? []).map((a) => getAddress(a)), cursor: progress?.cursor ?? -1, progress };
73
+ }
74
+ /**
75
+ * 查持有人在 Flap 代币上的分红:余额、可领取数量、已领取数量、分红资产和美元价值。
76
+ * 代币来自 tokens 和 discover(扫描收到过的 Transfer),每个代币都在链上核对(dividendContract() + Dividend 合约的函数),
77
+ * 核对不过的放进 unsupported。不发送交易
78
+ */
79
+ export async function dividends(provider, owner, options = {}) {
80
+ const chainId = await provider.getChainId();
81
+ assertChain(chainId);
82
+ const holder = getAddress(owner);
83
+ let scan;
84
+ const found = new Map();
85
+ const explicit = new Set();
86
+ for (const t of options.tokens ?? []) {
87
+ found.set(getAddress(t).toLowerCase(), getAddress(t));
88
+ explicit.add(getAddress(t).toLowerCase());
89
+ }
90
+ if (options.discover) {
91
+ const r = await scanDividendTokens(provider, holder, options.discover === true ? {} : options.discover);
92
+ scan = { cursor: r.cursor, progress: r.progress, tokens: r.tokens };
93
+ for (const t of r.tokens)
94
+ found.set(t.toLowerCase(), t);
95
+ }
96
+ const tokens = [...found.values()];
97
+ if (tokens.length > MAX_TOKENS)
98
+ throw new Error(`Too many tokens (${tokens.length}), at most ${MAX_TOKENS} per call`);
99
+ const result = { items: [], unsupported: [], ...(scan ? { scan } : {}) };
100
+ if (!tokens.length)
101
+ return result;
102
+ // 第一步:代币本身(余额、精度、Dividend 合约地址)
103
+ const stage1 = await provider.tryAll(tokens.flatMap((t) => [provider.contract(t, TOKEN_ABI).dividendContract(), provider.contract(t, TOKEN_ABI).balanceOf(holder), provider.contract(t, TOKEN_ABI).symbol(), provider.contract(t, TOKEN_ABI).decimals()]));
104
+ const valid = [];
105
+ tokens.forEach((token, i) => {
106
+ const [dividend, balance, symbol, decimals] = stage1.slice(i * 4, i * 4 + 4);
107
+ if (dividend === null || dividend === ZERO) {
108
+ // 发现来的代币大多不是分红代币(普通 8888 代币等),只报告用户明确传入的
109
+ if (explicit.has(token.toLowerCase()))
110
+ result.unsupported.push({ token, reason: dividend === null ? 'no dividendContract() (not a Flap tax token V2/V3)' : 'token has no dividend contract' });
111
+ }
112
+ else if (balance === null || decimals === null) {
113
+ result.unsupported.push({ token, reason: 'not an ERC20 token' });
114
+ }
115
+ else {
116
+ valid.push({ token, dividend, balance, symbol: typeof symbol === 'string' ? symbol : null, decimals: Number(decimals) });
117
+ }
118
+ });
119
+ // 第二步:Dividend 合约(分红代币、可领取、已领取、最低持仓)
120
+ const stage2 = valid.length
121
+ ? await provider.tryAll(valid.flatMap((v) => {
122
+ const d = provider.contract(v.dividend, DIVIDEND_ABI);
123
+ return [d.dividendToken(), d.weth(), d.withdrawableDividends(holder), d.withdrawnDividends(holder), d.minimumShareBalance()];
124
+ }))
125
+ : [];
126
+ const rows = [];
127
+ valid.forEach((v, i) => {
128
+ const [dividendToken, weth, claimable, claimed, min] = stage2.slice(i * 5, i * 5 + 5);
129
+ if (dividendToken === null || claimable === null || claimed === null || min === null) {
130
+ result.unsupported.push({ token: v.token, reason: 'dividend contract does not expose the expected functions (unknown generation)' });
131
+ }
132
+ else {
133
+ rows.push({ v, dividendToken, weth, claimable, claimed, min });
134
+ }
135
+ });
136
+ // 第三步:分红资产的 symbol / decimals(WBNB 作为 BNB 领取:按主币处理)
137
+ const isNative = (r) => r.dividendToken === ZERO || (r.weth !== null && r.dividendToken.toLowerCase() === r.weth.toLowerCase());
138
+ const assetTokens = [...new Set(rows.filter((r) => !isNative(r)).map((r) => r.dividendToken))];
139
+ const meta = new Map();
140
+ if (assetTokens.length) {
141
+ const res = await provider.tryAll(assetTokens.flatMap((a) => [provider.contract(a, ERC20_META_ABI).symbol(), provider.contract(a, ERC20_META_ABI).decimals()]));
142
+ assetTokens.forEach((a, i) => meta.set(a, { symbol: typeof res[i * 2] === 'string' ? res[i * 2] : null, decimals: res[i * 2 + 1] === null ? 18 : Number(res[i * 2 + 1]), known: res[i * 2 + 1] !== null }));
143
+ }
144
+ const nativeMeta = { symbol: 'BNB', decimals: 18, known: true };
145
+ const items = rows.map((r) => {
146
+ const native = isNative(r);
147
+ const m = native ? nativeMeta : (meta.get(r.dividendToken) ?? { symbol: null, decimals: 18, known: false });
148
+ return {
149
+ owner: holder,
150
+ token: r.v.token,
151
+ symbol: r.v.symbol,
152
+ decimals: r.v.decimals,
153
+ balance: r.v.balance.toString(),
154
+ dividendContract: getAddress(r.v.dividend),
155
+ dividendToken: getAddress(r.dividendToken),
156
+ asset: native ? 'native' : getAddress(r.dividendToken),
157
+ assetSymbol: m.symbol,
158
+ assetDecimals: m.decimals,
159
+ ...(m.known ? {} : { decimalsUnknown: true }),
160
+ claimable: r.claimable.toString(),
161
+ claimableFormatted: formatUnits(r.claimable, m.decimals),
162
+ claimed: r.claimed.toString(),
163
+ claimedFormatted: formatUnits(r.claimed, m.decimals),
164
+ usd: null,
165
+ minimumShareBalance: r.min.toString(),
166
+ accruing: r.v.balance >= r.min && r.v.balance > 0n,
167
+ adapter: 'flap',
168
+ };
169
+ });
170
+ const shown = options.includeZero ? items : items.filter((i) => BigInt(i.claimable) > 0n);
171
+ if (options.prices !== false && shown.length) {
172
+ try {
173
+ const { tokenPrices } = await import('./price.js');
174
+ const assets = [...new Set(shown.map((i) => (i.asset === 'native' ? NATIVE_TOKEN : i.asset)))];
175
+ const prices = await tokenPrices(provider, assets, { ...(typeof options.prices === 'object' ? { sources: [options.prices] } : {}), ...(options.fetch ? { fetch: options.fetch } : {}) });
176
+ const byAsset = new Map(prices.map((p) => [p.token.toLowerCase(), p.price]));
177
+ for (const i of shown) {
178
+ if (i.decimalsUnknown)
179
+ continue; // 精度未知,换算不出可信的美元价值
180
+ const price = byAsset.get((i.asset === 'native' ? NATIVE_TOKEN : i.asset).toLowerCase());
181
+ i.usd = price === null || price === undefined ? null : Number(i.claimableFormatted) * price;
182
+ }
183
+ }
184
+ catch (err) {
185
+ result.priceError = err instanceof Error ? err.message : String(err);
186
+ }
187
+ }
188
+ result.items = shown;
189
+ return result;
190
+ }
191
+ /**
192
+ * 领取分红要发的交易(不签名):每个代币一笔 `withdrawDividendsFor(owner)`,发给它的 Dividend 合约,款项直接到 owner。
193
+ * 只包含 claimable > 0 的项。只校验 owner / dividendContract 是合法地址,不连链:items 来自调用方,
194
+ * 要确认 dividendContract 确实是代币自己的 Dividend 合约,用 claimDividends(发送前会在链上核对)
195
+ */
196
+ export function buildClaimDividends(items) {
197
+ return items
198
+ .filter((item) => BigInt(item.claimable) > 0n)
199
+ .map((item) => {
200
+ if (item.adapter !== 'flap')
201
+ throw new Error(`Unsupported dividend adapter for ${item.token}`);
202
+ let to;
203
+ let owner;
204
+ try {
205
+ to = getAddress(item.dividendContract);
206
+ owner = getAddress(item.owner);
207
+ }
208
+ catch {
209
+ throw new Error(`Invalid dividendContract / owner address for ${item.token}`);
210
+ }
211
+ return { to, data: claimInterface.encodeFunctionData('withdrawDividendsFor', [owner]), value: '0', item };
212
+ });
213
+ }
214
+ /**
215
+ * 领取分红:构建(同 buildClaimDividends)后用 from 签名发送,钱包和选项同 batchCall
216
+ * (mode: '7702' / '4337' / '5792' 时合成一笔原子交易)。任何人都可以替持有人领取,款项直接到 item.owner,所以 from 不必是持有人(如代付 gas)。
217
+ *
218
+ * ```ts
219
+ * const { items } = await getDividends(user, { chainId: 56, discover: true })
220
+ * await claimDividends(provider, key, items, { mode: '7702' })
221
+ * ```
222
+ */
223
+ export async function claimDividends(provider, from, items, options = {}) {
224
+ assertChain(await provider.getChainId());
225
+ const { simulate: preCheck = true, ...sendOptions } = options;
226
+ const txs = buildClaimDividends(items);
227
+ if (!txs.length)
228
+ return [];
229
+ const skipped = new Map();
230
+ // 核对 items 里的 dividendContract 确实是代币自己的 Dividend 合约(items 来自调用方,不能直接信)
231
+ const onChain = await provider.tryAll(txs.map((tx) => provider.contract(tx.item.token, TOKEN_ABI).dividendContract()));
232
+ onChain.forEach((d, i) => {
233
+ if (d === null || txs[i].to.toLowerCase() !== d.toLowerCase()) {
234
+ skipped.set(i, `dividendContract mismatch: ${txs[i].to} is not the dividend contract of ${txs[i].item.token}`);
235
+ }
236
+ });
237
+ if (preCheck) {
238
+ const { simulate } = await import('./simulate.js');
239
+ const sims = await Promise.all(txs.map((tx, i) => skipped.has(i) ? Promise.resolve({ success: true }) : simulate(provider, { to: tx.to, data: tx.data, from: tx.item.owner }, { usd: false, risk: false }).catch((err) => ({ success: false, error: err instanceof Error ? err.message : String(err) }))));
240
+ sims.forEach((s, i) => !s.success && skipped.set(i, s.error ?? 'simulation failed'));
241
+ }
242
+ const send = txs.map((tx, i) => ({ tx, i })).filter(({ i }) => !skipped.has(i));
243
+ const { batchCall } = await import('./write/batch.js');
244
+ const sent = send.length ? await batchCall(provider, send.map(({ tx }) => ({ from, to: tx.to, data: tx.data })), { continueOnError: true, ...sendOptions }) : [];
245
+ const sentBy = new Map(send.map(({ i }, k) => [i, sent[k]]));
246
+ return txs.map((tx, i) => {
247
+ const r = sentBy.get(i);
248
+ if (r)
249
+ return { ...r, index: i, item: tx.item };
250
+ return { index: i, from: tx.item.owner, to: tx.to, status: 'skipped', hash: null, nonce: null, gasLimit: null, gasUsed: null, fee: null, blockNumber: null, error: skipped.get(i) ?? null, item: tx.item };
251
+ });
252
+ }
253
+ //# sourceMappingURL=dividends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dividends.js","sourceRoot":"","sources":["../src/dividends.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ import type { Provider } from './provider.js';
2
+ import { type HistorySource } from './historySources.js';
3
+ export type ActivityType = 'transfer' | 'swap' | 'approve' | 'liquidity' | 'mint' | 'contract' | 'other';
4
+ export interface ActivityChange {
5
+ /** 代币 / NFT 合约地址;主币是 'native' */
6
+ asset: string;
7
+ symbol: string | null;
8
+ decimals: number;
9
+ /** 带符号的最小单位数量 */
10
+ delta: string;
11
+ formatted: string;
12
+ /** NFT(721 / 1155):tokenId */
13
+ tokenId?: string;
14
+ }
15
+ export interface Activity {
16
+ hash: string;
17
+ /** 秒级时间戳 */
18
+ time: number;
19
+ block?: number;
20
+ status: 'success' | 'failed';
21
+ type: ActivityType;
22
+ /** 转账 / 铸造的方向(自己转给自己是 self);兑换等没有 */
23
+ direction?: 'in' | 'out' | 'self';
24
+ /** 对方地址(转账的另一方;合约调用是合约地址) */
25
+ counterparty?: string;
26
+ /** 一句话描述 */
27
+ label?: string;
28
+ /** 这个地址的资产变化(失败的交易没有) */
29
+ changes: ActivityChange[];
30
+ /** 手续费(最小单位的主币,只有这个地址是发送者时)。Tron 为 sun */
31
+ fee?: string;
32
+ protocol?: string;
33
+ /** 调用的方法名(能解码时) */
34
+ method?: string;
35
+ }
36
+ export interface RawTx {
37
+ hash: string;
38
+ /** 位置:EVM 是区块号,Tron 是毫秒时间戳(分页用) */
39
+ pos: number;
40
+ block?: number;
41
+ time: number;
42
+ from: string;
43
+ to?: string | null;
44
+ /** 附带的主币 */
45
+ value: bigint;
46
+ /** calldata(0x 开头) */
47
+ input: string;
48
+ ok: boolean;
49
+ fee?: bigint;
50
+ }
51
+ export interface RawMove {
52
+ hash: string;
53
+ pos: number;
54
+ block?: number;
55
+ time: number;
56
+ /** 'native' 或代币合约地址 */
57
+ asset: string;
58
+ from: string;
59
+ to: string;
60
+ value: bigint;
61
+ tokenId?: string;
62
+ symbol?: string | null;
63
+ decimals?: number | null;
64
+ }
65
+ export interface RawPage {
66
+ txs: RawTx[];
67
+ moves: RawMove[];
68
+ /** 位置 ≥ 这个值的记录是完整的(列表按条数截断时,最后一个位置上的记录可能只拿到一部分);没有更多历史时为 0 */
69
+ completeFrom: number;
70
+ /** 下一页查到这个位置(含)为止,往旧的方向;没有更多历史时没有 */
71
+ next?: number;
72
+ }
73
+ export interface HistoryQuery {
74
+ /** 要查的地址:EVM 是 0x 小写,Tron 是 T 开头 */
75
+ address: string;
76
+ chainId: number;
77
+ /** 每次从各个列表取多少条 */
78
+ limit: number;
79
+ /** 只查位置 ≤ 这个值的记录(分页用,不传从最新开始) */
80
+ endPos?: number;
81
+ /** 是否包含 NFT 转账 */
82
+ nft: boolean;
83
+ provider: Provider;
84
+ fetch: typeof fetch;
85
+ signal?: AbortSignal;
86
+ }
87
+ /** 数据来源适配器:按查询返回原始记录 */
88
+ export interface HistoryAdapter {
89
+ name: string;
90
+ /** 这个来源是否支持这条链(不支持的在故障切换里直接跳过) */
91
+ supports?(chainId: number): boolean;
92
+ fetch(query: HistoryQuery): Promise<RawPage>;
93
+ }
94
+ export interface HistoryOptions {
95
+ /** 数据来源:名字('blockscout' | 'etherscan' | 'rpc' | 'trongrid')、适配器对象,或它们的数组(按顺序故障切换)。默认:有 Blockscout 的链 [blockscout, rpc],否则 [rpc];传了 apiKey 时 etherscan 排最前;Tron 是 trongrid */
96
+ source?: HistorySource | readonly HistorySource[];
97
+ /** Etherscan 系(v2,一个 Key 覆盖多条链)/ TronGrid 的 API Key */
98
+ apiKey?: string;
99
+ /** 至少返回多少条(按区块整块取,可能略多;历史到头时可能不足) */
100
+ limit?: number;
101
+ /** 上一次返回的 nextCursor */
102
+ cursor?: string;
103
+ /** 只要这些类型(过滤后不够 limit 会继续往前翻页,直到 maxPages) */
104
+ types?: readonly ActivityType[];
105
+ /** 时间范围(秒级时间戳):只要这个时间之前 / 之后的;往前翻到早于 after 就停 */
106
+ before?: number;
107
+ after?: number;
108
+ /** 是否包含 NFT 转账,默认 true */
109
+ nft?: boolean;
110
+ /** 为凑够 limit 最多翻几页,默认 5 */
111
+ maxPages?: number;
112
+ fetch?: typeof fetch;
113
+ signal?: AbortSignal;
114
+ }
115
+ export interface HistoryResult {
116
+ items: Activity[];
117
+ /** 还有更早的历史时给出,传给下一次的 cursor */
118
+ nextCursor?: string;
119
+ /** 实际用的数据来源 */
120
+ source: string;
121
+ }
122
+ export declare class HistorySourceError extends Error {
123
+ readonly errors: ReadonlyArray<{
124
+ source: string;
125
+ error: unknown;
126
+ }>;
127
+ constructor(errors: ReadonlyArray<{
128
+ source: string;
129
+ error: unknown;
130
+ }>);
131
+ }
132
+ interface BuildCtx {
133
+ chainId: number;
134
+ tron: boolean;
135
+ /** 比较用的 0x 小写地址 */
136
+ me: string;
137
+ native: {
138
+ symbol: string | null;
139
+ decimals: number;
140
+ };
141
+ }
142
+ export declare function buildActivities(page: Pick<RawPage, 'txs' | 'moves'>, ctx: BuildCtx, minPos?: number): Activity[];
143
+ /**
144
+ * 查一个地址的历史活动(最新的在前),分页用 nextCursor。
145
+ *
146
+ * ```ts
147
+ * const page = await history(provider, user, { limit: 20 }) // Blockscout,失败换 RPC 日志
148
+ * const next = await history(provider, user, { cursor: page.nextCursor, types: ['swap'] })
149
+ * await history(provider, user, { source: ['etherscan', 'rpc'], apiKey }) // Etherscan v2 的 Key 覆盖多条链
150
+ * ```
151
+ */
152
+ export declare function history(provider: Provider, address: string, options?: HistoryOptions): Promise<HistoryResult>;
153
+ export type { HistorySource } from './historySources.js';
154
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}