@w3lib/evm-batch-call 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +166 -3
  3. package/dist/aggregate.d.ts.map +1 -1
  4. package/dist/aggregate.js +153 -40
  5. package/dist/aggregate.js.map +1 -1
  6. package/dist/fallback.d.ts +20 -0
  7. package/dist/fallback.d.ts.map +1 -1
  8. package/dist/fallback.js +36 -5
  9. package/dist/fallback.js.map +1 -1
  10. package/dist/lp.d.ts +149 -0
  11. package/dist/lp.d.ts.map +1 -0
  12. package/dist/lp.js +499 -0
  13. package/dist/lp.js.map +1 -0
  14. package/dist/lpMath.d.ts +25 -0
  15. package/dist/lpMath.d.ts.map +1 -0
  16. package/dist/lpMath.js +103 -0
  17. package/dist/lpMath.js.map +1 -0
  18. package/dist/lpV4.d.ts +108 -0
  19. package/dist/lpV4.d.ts.map +1 -0
  20. package/dist/lpV4.js +283 -0
  21. package/dist/lpV4.js.map +1 -0
  22. package/dist/owner.d.ts +1 -1
  23. package/dist/owner.d.ts.map +1 -1
  24. package/dist/owner.js +18 -5
  25. package/dist/owner.js.map +1 -1
  26. package/dist/scan.d.ts +54 -0
  27. package/dist/scan.d.ts.map +1 -1
  28. package/dist/scan.js +124 -92
  29. package/dist/scan.js.map +1 -1
  30. package/dist/source.d.ts +2 -0
  31. package/dist/source.d.ts.map +1 -1
  32. package/dist/source.js +4 -0
  33. package/dist/source.js.map +1 -1
  34. package/dist/subpaths/lp.d.ts +33 -0
  35. package/dist/subpaths/lp.d.ts.map +1 -0
  36. package/dist/subpaths/lp.js +47 -0
  37. package/dist/subpaths/lp.js.map +1 -0
  38. package/dist/subpaths/write.d.ts +20 -0
  39. package/dist/subpaths/write.d.ts.map +1 -0
  40. package/dist/subpaths/write.js +18 -0
  41. package/dist/subpaths/write.js.map +1 -0
  42. package/dist/tron.d.ts +2 -0
  43. package/dist/tron.d.ts.map +1 -1
  44. package/dist/tron.js +4 -0
  45. package/dist/tron.js.map +1 -1
  46. package/dist/write/batch.d.ts +88 -0
  47. package/dist/write/batch.d.ts.map +1 -0
  48. package/dist/write/batch.js +231 -0
  49. package/dist/write/batch.js.map +1 -0
  50. package/dist/write/collect.d.ts +53 -0
  51. package/dist/write/collect.d.ts.map +1 -0
  52. package/dist/write/collect.js +255 -0
  53. package/dist/write/collect.js.map +1 -0
  54. package/dist/write/rpc.d.ts +68 -0
  55. package/dist/write/rpc.d.ts.map +1 -0
  56. package/dist/write/rpc.js +236 -0
  57. package/dist/write/rpc.js.map +1 -0
  58. package/dist/write/send.d.ts +124 -0
  59. package/dist/write/send.d.ts.map +1 -0
  60. package/dist/write/send.js +373 -0
  61. package/dist/write/send.js.map +1 -0
  62. package/dist/write/signer.d.ts +58 -0
  63. package/dist/write/signer.d.ts.map +1 -0
  64. package/dist/write/signer.js +41 -0
  65. package/dist/write/signer.js.map +1 -0
  66. package/dist/write/transfer.d.ts +83 -0
  67. package/dist/write/transfer.d.ts.map +1 -0
  68. package/dist/write/transfer.js +259 -0
  69. package/dist/write/transfer.js.map +1 -0
  70. package/dist/write/tron.d.ts +58 -0
  71. package/dist/write/tron.d.ts.map +1 -0
  72. package/dist/write/tron.js +956 -0
  73. package/dist/write/tron.js.map +1 -0
  74. package/package.json +27 -14
  75. package/src/aggregate.ts +168 -36
  76. package/src/fallback.ts +55 -11
  77. package/src/lp.ts +721 -0
  78. package/src/lpMath.ts +113 -0
  79. package/src/lpV4.ts +406 -0
  80. package/src/owner.ts +19 -6
  81. package/src/scan.ts +155 -86
  82. package/src/source.ts +5 -0
  83. package/src/subpaths/lp.ts +71 -0
  84. package/src/subpaths/write.ts +26 -0
  85. package/src/tron.ts +5 -0
  86. package/src/write/batch.ts +302 -0
  87. package/src/write/collect.ts +312 -0
  88. package/src/write/rpc.ts +277 -0
  89. package/src/write/send.ts +490 -0
  90. package/src/write/signer.ts +90 -0
  91. package/src/write/transfer.ts +344 -0
  92. package/src/write/tron.ts +1100 -0
@@ -0,0 +1,83 @@
1
+ import { type BigNumberish } from 'ethers';
2
+ import type { Provider } from '../provider.js';
3
+ import { type SendOptions, type TronSendOptions, type WriteResult } from './send.js';
4
+ import { type SignerInput } from './signer.js';
5
+ /**
6
+ * Disperse 合约(disperse.app),各主流链上地址相同:一笔交易把主币 / 代币分发给多个地址。
7
+ * 代币分发前需要 approve 给它;它只会从调用者自己的账户 transferFrom,别人无法动用这份额度
8
+ */
9
+ export declare const DISPERSE_ADDRESS = "0xD152f549545093347A162Dce210e7293f1452150";
10
+ /** 一个收款项:amount(最小单位)和 formatted(按精度换算后,如 '1.5')二选一 */
11
+ export interface TransferItem {
12
+ to: string;
13
+ /** 数量,最小单位(wei),bigint 或十进制字符串 */
14
+ amount?: BigNumberish;
15
+ /** 按 decimals 换算后的数量,如 '1.5';小数位超过精度时报错(不四舍五入) */
16
+ formatted?: string;
17
+ /** 这一项转的代币,默认 options.token */
18
+ token?: string;
19
+ }
20
+ /**
21
+ * - 'disperse'(默认):通过 Disperse 合约,每种代币每 batchSize 个收款人一笔交易。以下情况自动改为逐笔发送:
22
+ * 链上没有 Disperse 合约;某种代币只有一个收款人;某一批预估 revert(收款地址拒收主币、转账收税的代币等,逐笔发送能把出问题的那一个单独标成失败)
23
+ * - 'tx':每个收款人一笔交易
24
+ * - '7702':EIP-7702 批量执行,每 batchSize 个收款人一笔(见 BatchCallOptions.mode)
25
+ */
26
+ export type TransferMode = 'disperse' | 'tx' | '7702';
27
+ export interface BatchTransferOptions extends SendOptions, TronSendOptions {
28
+ /** 默认转的代币,默认主币(NATIVE_TOKEN);每项也可以单独指定 token */
29
+ token?: string;
30
+ mode?: TransferMode;
31
+ /** 每笔交易最多几个收款人:disperse 默认 200,7702 默认 50 */
32
+ batchSize?: number;
33
+ /** Disperse 合约地址,默认 DISPERSE_ADDRESS */
34
+ disperse?: string;
35
+ /** 发送前检查余额够不够(按代币汇总),不够时抛错、什么都不发。默认 true(主币不含手续费) */
36
+ checkBalance?: boolean;
37
+ /** 7702:委托的合约,见 BatchCallOptions.delegate */
38
+ delegate?: string;
39
+ /** 7702:见 BatchCallOptions.redelegate */
40
+ redelegate?: boolean;
41
+ }
42
+ /** 单个收款项的结果,to 是收款地址 */
43
+ export interface TransferResult extends WriteResult {
44
+ token: string;
45
+ native: boolean;
46
+ /** 数量(最小单位) */
47
+ amount: string;
48
+ /** 按精度换算后的数量;精度查不到时为 null */
49
+ formatted: string | null;
50
+ /** 实际的发送方式(disperse 自动退回逐笔时为 'tx') */
51
+ via: TransferMode;
52
+ /**
53
+ * 这一项的代币为了走 Disperse 发出的 approve 交易(额度不够时才有;USDT 等先归零时有两笔)。
54
+ * 同一种代币的各项相同;主币、逐笔发送、额度已够时为空数组
55
+ */
56
+ approvals: ApproveResult[];
57
+ }
58
+ /** approve 交易的结果:to 是代币地址,spender 是 Disperse 合约 */
59
+ export interface ApproveResult extends Omit<WriteResult, 'index'> {
60
+ spender: string;
61
+ /** approve 的额度(最小单位) */
62
+ amount: string;
63
+ }
64
+ /** 测试用 */
65
+ export declare function resetDisperseCache(): void;
66
+ /**
67
+ * 一对多批量转账(主币 / ERC20,可混合)。结果与 recipients 一一对应。
68
+ *
69
+ * ```ts
70
+ * await batchTransfer(multi, privateKey, [
71
+ * { to: a, formatted: '1.5' }, // 默认代币(options.token,默认主币)
72
+ * { to: b, amount: 10n ** 18n },
73
+ * { to: c, token: USDT, formatted: '20' },
74
+ * ], { token: NATIVE_TOKEN })
75
+ * // [{ index: 0, to: a, token, native: true, amount: '1500000000000000000', formatted: '1.5', status: 'confirmed', hash, via: 'disperse', … }, …]
76
+ * ```
77
+ *
78
+ * - 默认通过 Disperse 合约分发(见 TransferMode),代币会先 approve 本次的精确总额
79
+ * - 默认先检查余额,不够时抛错,一笔都不发
80
+ * - 某个收款项失败不影响其他收款项
81
+ */
82
+ export declare function batchTransfer(provider: Provider, from: SignerInput, recipients: readonly TransferItem[], options?: BatchTransferOptions): Promise<TransferResult[]>;
83
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/write/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AAGxF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAG9C,OAAO,EAAyC,KAAK,WAAW,EAAE,KAAK,eAAe,EAA8B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AACvJ,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAElF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,+CAA+C,CAAA;AAQ5E,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,kCAAkC;IAClC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,oBAAqB,SAAQ,WAAW,EAAE,eAAe;IACxE,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAwB;AACxB,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,eAAe;IACf,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,sCAAsC;IACtC,GAAG,EAAE,YAAY,CAAA;IACjB;;;OAGG;IACH,SAAS,EAAE,aAAa,EAAE,CAAA;CAC3B;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;IAC/D,OAAO,EAAE,MAAM,CAAA;IACf,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAA;CACf;AAeD,UAAU;AACV,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAaD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,YAAY,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAa7K"}
@@ -0,0 +1,259 @@
1
+ import { Interface, getAddress, getBigInt, parseUnits } from 'ethers';
2
+ import { ERC20_ABI, NATIVE_TOKEN, formatUnits } from '../erc20.js';
3
+ import { send7702, sendEach, tronModule } from './batch.js';
4
+ import { WriteRpc } from './rpc.js';
5
+ import { emptyOutcome, sendJobs, toWriteResult } from './send.js';
6
+ import { resolveSigner } from './signer.js';
7
+ /**
8
+ * Disperse 合约(disperse.app),各主流链上地址相同:一笔交易把主币 / 代币分发给多个地址。
9
+ * 代币分发前需要 approve 给它;它只会从调用者自己的账户 transferFrom,别人无法动用这份额度
10
+ */
11
+ export const DISPERSE_ADDRESS = '0xD152f549545093347A162Dce210e7293f1452150';
12
+ const disperseInterface = new Interface([
13
+ 'function disperseEther(address[] recipients, uint256[] values) payable',
14
+ 'function disperseToken(address token, address[] recipients, uint256[] values)',
15
+ ]);
16
+ const erc20Interface = new Interface(ERC20_ABI);
17
+ /** 链上有没有 Disperse 合约(按 chainId + 地址缓存) */
18
+ const disperseDeployed = new Map();
19
+ /** 测试用 */
20
+ export function resetDisperseCache() {
21
+ disperseDeployed.clear();
22
+ }
23
+ async function hasCode(rpc, address) {
24
+ const key = `${rpc.chainId}:${address.toLowerCase()}`;
25
+ let deployed = disperseDeployed.get(key);
26
+ if (deployed === undefined) {
27
+ const code = await rpc.code(address);
28
+ deployed = Boolean(code && code !== '0x');
29
+ disperseDeployed.set(key, deployed);
30
+ }
31
+ return deployed;
32
+ }
33
+ /**
34
+ * 一对多批量转账(主币 / ERC20,可混合)。结果与 recipients 一一对应。
35
+ *
36
+ * ```ts
37
+ * await batchTransfer(multi, privateKey, [
38
+ * { to: a, formatted: '1.5' }, // 默认代币(options.token,默认主币)
39
+ * { to: b, amount: 10n ** 18n },
40
+ * { to: c, token: USDT, formatted: '20' },
41
+ * ], { token: NATIVE_TOKEN })
42
+ * // [{ index: 0, to: a, token, native: true, amount: '1500000000000000000', formatted: '1.5', status: 'confirmed', hash, via: 'disperse', … }, …]
43
+ * ```
44
+ *
45
+ * - 默认通过 Disperse 合约分发(见 TransferMode),代币会先 approve 本次的精确总额
46
+ * - 默认先检查余额,不够时抛错,一笔都不发
47
+ * - 某个收款项失败不影响其他收款项
48
+ */
49
+ export async function batchTransfer(provider, from, recipients, options = {}) {
50
+ const tron = await tronModule(provider);
51
+ if (tron) {
52
+ return tron.tronBatchTransfer(provider, from, recipients, options);
53
+ }
54
+ const rpc = await WriteRpc.from(provider);
55
+ const signer = await resolveSigner(from);
56
+ const planned = await plan(provider, signer.address, recipients, options);
57
+ const mode = options.mode ?? 'disperse';
58
+ if (mode === 'tx' || mode === '7702') {
59
+ return sendDirect(rpc, signer, planned, mode, options);
60
+ }
61
+ return sendDisperse(rpc, provider, signer, planned, options);
62
+ }
63
+ /** 解析数量(formatted 按精度换算)并检查余额 */
64
+ async function plan(provider, owner, recipients, options) {
65
+ const defaultToken = options.token ?? NATIVE_TOKEN;
66
+ const tokens = [...new Set(recipients.map((r) => (r.token ?? defaultToken).toLowerCase()))];
67
+ const balances = tokens.length ? await provider.balances(owner, tokens) : [];
68
+ const info = new Map(balances.map((b, i) => [tokens[i], b]));
69
+ const planned = recipients.map((item, index) => {
70
+ const tokenKey = (item.token ?? defaultToken).toLowerCase();
71
+ const balance = info.get(tokenKey);
72
+ const native = provider.isNativeToken(tokenKey);
73
+ const decimals = balance?.success ? balance.decimals : null;
74
+ if ((item.amount === undefined) === (item.formatted === undefined)) {
75
+ throw new Error(`recipients[${index}]: pass exactly one of amount / formatted`);
76
+ }
77
+ let amount;
78
+ if (item.formatted !== undefined) {
79
+ if (decimals === null) {
80
+ throw new Error(`recipients[${index}]: cannot read decimals of ${item.token ?? defaultToken}, pass amount instead of formatted`);
81
+ }
82
+ amount = parseUnits(item.formatted, decimals);
83
+ }
84
+ else {
85
+ amount = getBigInt(item.amount);
86
+ }
87
+ if (amount < 0n) {
88
+ throw new Error(`recipients[${index}]: amount must not be negative`);
89
+ }
90
+ return { index, to: getAddress(item.to), token: native ? (item.token ?? defaultToken) : getAddress(tokenKey), native, amount, decimals };
91
+ });
92
+ if (options.checkBalance ?? true) {
93
+ const totals = new Map();
94
+ planned.forEach((p) => totals.set(p.token.toLowerCase(), (totals.get(p.token.toLowerCase()) ?? 0n) + p.amount));
95
+ for (const [token, total] of totals) {
96
+ const balance = info.get(token);
97
+ if (!balance?.success) {
98
+ throw new Error(`Cannot read the balance of ${token} (${balance?.error ?? 'unknown error'}); pass checkBalance: false to skip the check`);
99
+ }
100
+ if (BigInt(balance.balance) < total) {
101
+ throw new Error(`Insufficient balance of ${token}: need ${total}, have ${balance.balance}`);
102
+ }
103
+ }
104
+ }
105
+ return planned;
106
+ }
107
+ /** 收款项对应的调用:主币直接转,代币调 transfer */
108
+ function transferCall(signer, p) {
109
+ return p.native
110
+ ? { signer, to: p.to, data: '0x', value: p.amount }
111
+ : { signer, to: p.token, data: erc20Interface.encodeFunctionData('transfer', [p.to, p.amount]), value: 0n };
112
+ }
113
+ function toTransferResult(p, result, via) {
114
+ return {
115
+ ...result,
116
+ index: p.index,
117
+ to: p.to,
118
+ token: p.token,
119
+ native: p.native,
120
+ amount: p.amount.toString(),
121
+ formatted: p.decimals === null ? null : formatUnits(p.amount, p.decimals),
122
+ via,
123
+ approvals: [],
124
+ };
125
+ }
126
+ /** 'tx' / '7702':直接转账 */
127
+ async function sendDirect(rpc, signer, planned, mode, options) {
128
+ const calls = planned.map((p) => transferCall(signer, p));
129
+ const callOptions = {
130
+ ...options,
131
+ mode,
132
+ continueOnError: true,
133
+ onUpdate: options.onUpdate && ((r) => options.onUpdate?.(toTransferResult(planned[r.index], r, mode))),
134
+ };
135
+ const results = mode === '7702' ? await send7702(rpc, calls, callOptions) : await sendEach(rpc, calls, callOptions);
136
+ return results.map((r, i) => toTransferResult(planned[i], r, mode));
137
+ }
138
+ /** 预估 / 执行时合约 revert(换成逐笔发送可能成功,或至少能定位到是哪个收款项) */
139
+ function isReverted(outcome) {
140
+ return outcome.status === 'reverted' || (outcome.status === 'failed' && (outcome.revertData !== null || /revert/i.test(outcome.error ?? '')));
141
+ }
142
+ /** 'disperse':每种代币每 batchSize 个收款人一笔;不适用 / 失败的部分逐笔发送 */
143
+ async function sendDisperse(rpc, provider, signer, planned, options) {
144
+ const disperse = getAddress(options.disperse ?? DISPERSE_ADDRESS);
145
+ const batchSize = Math.max(1, options.batchSize ?? 200);
146
+ // 初始结果(没有执行到的项保持 skipped),不触发 onUpdate
147
+ const results = planned.map((p) => toTransferResult(p, toWriteResult(p.index, signer.address, p.to, emptyOutcome('skipped')), 'disperse'));
148
+ const report = (p, outcome, via) => {
149
+ results[p.index] = toTransferResult(p, toWriteResult(p.index, signer.address, p.to, outcome), via);
150
+ options.onUpdate?.(results[p.index]);
151
+ };
152
+ // 按代币分组(数量为 0 的项也照常转,与逐笔发送一致)
153
+ const groups = new Map();
154
+ planned.forEach((p) => groups.set(p.token.toLowerCase(), [...(groups.get(p.token.toLowerCase()) ?? []), p]));
155
+ const direct = [];
156
+ const useDisperse = planned.length > 1 && (await hasCode(rpc, disperse));
157
+ const jobs = [];
158
+ /** 每个 disperse 批次的收款项(与 jobs 里的位置对应,approve 为 null) */
159
+ const batches = [];
160
+ /** 代币(小写)→ 发出的 approve */
161
+ const approvals = new Map();
162
+ const approve = (token, amount) => {
163
+ const list = approvals.get(token.toLowerCase()) ?? [];
164
+ approvals.set(token.toLowerCase(), list);
165
+ const k = list.length;
166
+ const result = (outcome) => {
167
+ const { index: _index, ...rest } = toWriteResult(0, signer.address, token, outcome);
168
+ return { ...rest, spender: disperse, amount: amount.toString() };
169
+ };
170
+ list.push(result(emptyOutcome('skipped')));
171
+ jobs.push({
172
+ signer,
173
+ continueOnError: true,
174
+ build: async () => ({ to: token, data: erc20Interface.encodeFunctionData('approve', [disperse, amount]), value: 0n }),
175
+ onUpdate: (outcome) => (list[k] = result(outcome)),
176
+ });
177
+ batches.push(null);
178
+ };
179
+ for (const items of groups.values()) {
180
+ if (!useDisperse || items.length < 2) {
181
+ direct.push(...items);
182
+ continue;
183
+ }
184
+ const first = items[0];
185
+ if (!first.native) {
186
+ const total = items.reduce((sum, p) => sum + p.amount, 0n);
187
+ const [allowance] = await provider.allowances(signer.address, disperse, [first.token], { decimals: false });
188
+ const current = allowance?.success ? BigInt(allowance.allowance) : 0n;
189
+ if (current < total) {
190
+ if (options.dryRun) {
191
+ // 还没 approve,Disperse 的调用没法预估:只预估 approve,分发批次直接标记 simulated
192
+ approve(first.token, total);
193
+ items.forEach((p) => report(p, { ...emptyOutcome('simulated') }, 'disperse'));
194
+ continue;
195
+ }
196
+ // USDT 等代币要求额度先归零才能改成另一个非零值
197
+ if (current > 0n) {
198
+ approve(first.token, 0n);
199
+ }
200
+ approve(first.token, total);
201
+ }
202
+ }
203
+ for (let start = 0; start < items.length; start += batchSize) {
204
+ const chunk = items.slice(start, start + batchSize);
205
+ const recipients = chunk.map((p) => p.to);
206
+ const values = chunk.map((p) => p.amount);
207
+ const value = first.native ? values.reduce((a, b) => a + b, 0n) : 0n;
208
+ const data = first.native
209
+ ? disperseInterface.encodeFunctionData('disperseEther', [recipients, values])
210
+ : disperseInterface.encodeFunctionData('disperseToken', [first.token, recipients, values]);
211
+ jobs.push({
212
+ signer,
213
+ continueOnError: true,
214
+ build: async () => ({ to: disperse, data, value }),
215
+ onUpdate: (outcome) => {
216
+ // 预估 revert 的批次稍后逐笔重发,先不报告失败
217
+ if (!(outcome.status === 'failed' && isReverted(outcome))) {
218
+ chunk.forEach((p) => report(p, outcome, 'disperse'));
219
+ }
220
+ },
221
+ });
222
+ batches.push(chunk);
223
+ }
224
+ }
225
+ const outcomes = await sendJobs(rpc, jobs, options);
226
+ // 预估就 revert 的批次(没有花手续费)改为逐笔发送;已上链但 revert 的批次不重发,避免重复支付
227
+ outcomes.forEach((outcome, i) => {
228
+ const chunk = batches[i];
229
+ if (chunk && outcome.status === 'failed' && isReverted(outcome)) {
230
+ direct.push(...chunk);
231
+ }
232
+ });
233
+ if (direct.length && !options.signal?.aborted) {
234
+ direct.sort((a, b) => a.index - b.index);
235
+ const calls = direct.map((p) => transferCall(signer, p));
236
+ await sendEach(rpc, calls, {
237
+ ...options,
238
+ mode: 'tx',
239
+ continueOnError: true,
240
+ onUpdate: (r) => report(direct[r.index], outcomeOf(r), 'tx'),
241
+ });
242
+ }
243
+ return results.map((r) => ({ ...r, approvals: [...(approvals.get(r.token.toLowerCase()) ?? [])] }));
244
+ }
245
+ /** WriteResult 转回 TxOutcome(逐笔重发的结果并入 report) */
246
+ function outcomeOf(r) {
247
+ return {
248
+ status: r.status,
249
+ hash: r.hash,
250
+ nonce: r.nonce,
251
+ gasLimit: r.gasLimit === null ? null : BigInt(r.gasLimit),
252
+ gasUsed: r.gasUsed === null ? null : BigInt(r.gasUsed),
253
+ fee: r.fee === null ? null : BigInt(r.fee),
254
+ blockNumber: r.blockNumber,
255
+ error: r.error,
256
+ revertData: null,
257
+ };
258
+ }
259
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/write/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { Provider } from '../provider.js';
2
+ import type { BatchCallOptions, WriteCall } from './batch.js';
3
+ import type { BatchCollectOptions, CollectResult } from './collect.js';
4
+ import { type TronSendOptions, type WriteResult } from './send.js';
5
+ import { type SignerInput } from './signer.js';
6
+ import type { BatchTransferOptions, TransferItem, TransferResult } from './transfer.js';
7
+ /** 要签名的交易 */
8
+ interface Unsigned {
9
+ txId: string;
10
+ /** raw_data 的 protobuf 编码 */
11
+ raw: Uint8Array;
12
+ contract: TronContract;
13
+ ref: RefBlock;
14
+ expiration: number;
15
+ timestamp: number;
16
+ feeLimit: bigint;
17
+ }
18
+ /**
19
+ * TronWeb 格式的交易 JSON(钱包按 raw_data 展示交易内容,按 raw_data_hex / txID 签名)。
20
+ * raw_data 与 encodeRawData 的编码一一对应(TronWeb 的 txJsonToPb 编码结果与 raw_data_hex 相同)
21
+ */
22
+ export declare function toTronWebTransaction(tx: Pick<Unsigned, 'txId' | 'raw' | 'contract' | 'ref' | 'expiration' | 'timestamp' | 'feeLimit'>): Record<string, unknown>;
23
+ /**
24
+ * 外部签名(钱包 / 自定义签名器)的核对和规范化:65 字节 r、s、v;v 可以是 0/1 或 27/28;
25
+ * s 在上半区(旧版 TronWeb 等不做规范化的实现约一半是这样)时换成 n − s 并翻转 v(同一个签名的另一种写法,java-tron 两种都接受)。
26
+ * 从签名恢复出的地址必须是发送方:钱包切了账户、或改了交易内容时对不上
27
+ */
28
+ export declare function checkedSignature(signature: unknown, txId: string, address: string, who?: string): string;
29
+ export type TronContract = {
30
+ type: 'transfer';
31
+ owner: string;
32
+ to: string;
33
+ amount: bigint;
34
+ } | {
35
+ type: 'trigger';
36
+ owner: string;
37
+ contract: string;
38
+ data: string;
39
+ callValue: bigint;
40
+ };
41
+ interface RefBlock {
42
+ number: number;
43
+ hash: string;
44
+ timestamp: number;
45
+ }
46
+ /** 交易的 raw_data:参考区块、过期时间、合约、时间戳、fee_limit(字段按编号顺序写,与节点重新序列化的结果一致,txID 才对得上) */
47
+ export declare function encodeRawData(contract: TronContract, ref: RefBlock, expiration: number, timestamp: number, feeLimit: bigint): Uint8Array;
48
+ export declare function tronBatchCall(provider: Provider, calls: readonly WriteCall[], options?: BatchCallOptions & TronSendOptions): Promise<WriteResult[]>;
49
+ /** Tron 一对多转账:每个收款人一笔交易(Tron 上没有通用的 Disperse 合约),结果的 via 为 'tx' */
50
+ export declare function tronBatchTransfer(provider: Provider, from: SignerInput, recipients: readonly TransferItem[], options?: BatchTransferOptions & TronSendOptions): Promise<TransferResult[]>;
51
+ /**
52
+ * Tron 归集:与 EVM 相同的流程(补 gas → 归集代币 → 扫空 TRX)。手续费按 Tron 的资源模型算:
53
+ * 合约调用烧能量(模拟的能量 × 能量单价,减去账户已有的能量,加 20% 余量),每笔交易烧带宽(免费 / 质押带宽不够时按字节计费)。
54
+ * 没激活的子钱包由补 gas 的转账激活(激活费由 gasWallet 付)
55
+ */
56
+ export declare function tronBatchCollect(provider: Provider, wallets: readonly SignerInput[], to: string, options: BatchCollectOptions & TronSendOptions): Promise<CollectResult>;
57
+ export {};
58
+ //# sourceMappingURL=tron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tron.d.ts","sourceRoot":"","sources":["../../src/write/tron.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAqB,aAAa,EAAE,MAAM,cAAc,CAAA;AAEzF,OAAO,EAA0D,KAAK,eAAe,EAAkB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAC1I,OAAO,EAAgB,KAAK,WAAW,EAAmB,MAAM,aAAa,CAAA;AAC7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAIvF,aAAa;AACb,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,GAAG,EAAE,UAAU,CAAA;IACf,QAAQ,EAAE,YAAY,CAAA;IACtB,GAAG,EAAE,QAAQ,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAuBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0B/J;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAW,GAAG,MAAM,CA2B1G;AA6FD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAoBzF,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAWxI;AAgfD,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,OAAO,GAAE,gBAAgB,GAAG,eAAoB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAyC7J;AA8DD,mEAAmE;AACnE,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,OAAO,GAAE,oBAAoB,GAAG,eAAoB,GACnD,OAAO,CAAC,cAAc,EAAE,CAAC,CA6B3B;AAYD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CA4L9K"}