@w3lib/evm-batch-call 0.6.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 (248) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +367 -3
  3. package/contracts/TokenProbe.sol +103 -0
  4. package/dist/aggregate.d.ts.map +1 -1
  5. package/dist/aggregate.js +114 -3
  6. package/dist/aggregate.js.map +1 -1
  7. package/dist/approvals.d.ts +169 -0
  8. package/dist/approvals.d.ts.map +1 -0
  9. package/dist/approvals.js +310 -0
  10. package/dist/approvals.js.map +1 -0
  11. package/dist/chains.d.ts.map +1 -1
  12. package/dist/chains.js +4 -0
  13. package/dist/chains.js.map +1 -1
  14. package/dist/dividends.d.ts +135 -0
  15. package/dist/dividends.d.ts.map +1 -0
  16. package/dist/dividends.js +253 -0
  17. package/dist/dividends.js.map +1 -0
  18. package/dist/fees.d.ts +97 -0
  19. package/dist/fees.d.ts.map +1 -0
  20. package/dist/fees.js +115 -0
  21. package/dist/fees.js.map +1 -0
  22. package/dist/history.d.ts +154 -0
  23. package/dist/history.d.ts.map +1 -0
  24. package/dist/history.js +247 -0
  25. package/dist/history.js.map +1 -0
  26. package/dist/historySources.d.ts +32 -0
  27. package/dist/historySources.d.ts.map +1 -0
  28. package/dist/historySources.js +319 -0
  29. package/dist/historySources.js.map +1 -0
  30. package/dist/http.d.ts +10 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +30 -0
  33. package/dist/http.js.map +1 -0
  34. package/dist/liquidity/v3.d.ts +2 -0
  35. package/dist/liquidity/v3.d.ts.map +1 -1
  36. package/dist/liquidity/v3.js +1 -1
  37. package/dist/liquidity/v3.js.map +1 -1
  38. package/dist/liquidity/v4.d.ts +21 -0
  39. package/dist/liquidity/v4.d.ts.map +1 -1
  40. package/dist/liquidity/v4.js +4 -3
  41. package/dist/liquidity/v4.js.map +1 -1
  42. package/dist/lp.d.ts +10 -1
  43. package/dist/lp.d.ts.map +1 -1
  44. package/dist/lp.js +19 -2
  45. package/dist/lp.js.map +1 -1
  46. package/dist/lpV4.d.ts +4 -0
  47. package/dist/lpV4.d.ts.map +1 -1
  48. package/dist/lpV4.js +27 -3
  49. package/dist/lpV4.js.map +1 -1
  50. package/dist/multicall.d.ts.map +1 -1
  51. package/dist/multicall.js +3 -0
  52. package/dist/multicall.js.map +1 -1
  53. package/dist/names.d.ts +55 -0
  54. package/dist/names.d.ts.map +1 -0
  55. package/dist/names.js +93 -0
  56. package/dist/names.js.map +1 -0
  57. package/dist/owner.d.ts +4 -26
  58. package/dist/owner.d.ts.map +1 -1
  59. package/dist/owner.js +7 -112
  60. package/dist/owner.js.map +1 -1
  61. package/dist/permit.d.ts +137 -0
  62. package/dist/permit.d.ts.map +1 -0
  63. package/dist/permit.js +355 -0
  64. package/dist/permit.js.map +1 -0
  65. package/dist/portfolio.d.ts +56 -0
  66. package/dist/portfolio.d.ts.map +1 -0
  67. package/dist/portfolio.js +54 -0
  68. package/dist/portfolio.js.map +1 -0
  69. package/dist/price.d.ts +95 -0
  70. package/dist/price.d.ts.map +1 -0
  71. package/dist/price.js +329 -0
  72. package/dist/price.js.map +1 -0
  73. package/dist/rewards/farms.d.ts +26 -0
  74. package/dist/rewards/farms.d.ts.map +1 -0
  75. package/dist/rewards/farms.js +210 -0
  76. package/dist/rewards/farms.js.map +1 -0
  77. package/dist/rewards/index.d.ts +42 -0
  78. package/dist/rewards/index.d.ts.map +1 -0
  79. package/dist/rewards/index.js +382 -0
  80. package/dist/rewards/index.js.map +1 -0
  81. package/dist/rewards/types.d.ts +170 -0
  82. package/dist/rewards/types.d.ts.map +1 -0
  83. package/dist/rewards/types.js +2 -0
  84. package/dist/rewards/types.js.map +1 -0
  85. package/dist/risk.d.ts +42 -0
  86. package/dist/risk.d.ts.map +1 -0
  87. package/dist/risk.js +134 -0
  88. package/dist/risk.js.map +1 -0
  89. package/dist/rpcNodes.d.ts.map +1 -1
  90. package/dist/rpcNodes.js +18 -0
  91. package/dist/rpcNodes.js.map +1 -1
  92. package/dist/simulate.d.ts +186 -0
  93. package/dist/simulate.d.ts.map +1 -0
  94. package/dist/simulate.js +559 -0
  95. package/dist/simulate.js.map +1 -0
  96. package/dist/simulateDecode.d.ts +33 -0
  97. package/dist/simulateDecode.d.ts.map +1 -0
  98. package/dist/simulateDecode.js +321 -0
  99. package/dist/simulateDecode.js.map +1 -0
  100. package/dist/smartAccount/account.d.ts +31 -0
  101. package/dist/smartAccount/account.d.ts.map +1 -0
  102. package/dist/smartAccount/account.js +33 -0
  103. package/dist/smartAccount/account.js.map +1 -0
  104. package/dist/smartAccount/clients.d.ts +77 -0
  105. package/dist/smartAccount/clients.d.ts.map +1 -0
  106. package/dist/smartAccount/clients.js +122 -0
  107. package/dist/smartAccount/clients.js.map +1 -0
  108. package/dist/smartAccount/eip5792.d.ts +77 -0
  109. package/dist/smartAccount/eip5792.d.ts.map +1 -0
  110. package/dist/smartAccount/eip5792.js +152 -0
  111. package/dist/smartAccount/eip5792.js.map +1 -0
  112. package/dist/smartAccount/send.d.ts +40 -0
  113. package/dist/smartAccount/send.d.ts.map +1 -0
  114. package/dist/smartAccount/send.js +271 -0
  115. package/dist/smartAccount/send.js.map +1 -0
  116. package/dist/smartAccount/userOp.d.ts +91 -0
  117. package/dist/smartAccount/userOp.d.ts.map +1 -0
  118. package/dist/smartAccount/userOp.js +124 -0
  119. package/dist/smartAccount/userOp.js.map +1 -0
  120. package/dist/subpaths/approvals.d.ts +26 -0
  121. package/dist/subpaths/approvals.d.ts.map +1 -0
  122. package/dist/subpaths/approvals.js +27 -0
  123. package/dist/subpaths/approvals.js.map +1 -0
  124. package/dist/subpaths/dividends.d.ts +28 -0
  125. package/dist/subpaths/dividends.d.ts.map +1 -0
  126. package/dist/subpaths/dividends.js +29 -0
  127. package/dist/subpaths/dividends.js.map +1 -0
  128. package/dist/subpaths/fees.d.ts +23 -0
  129. package/dist/subpaths/fees.d.ts.map +1 -0
  130. package/dist/subpaths/fees.js +25 -0
  131. package/dist/subpaths/fees.js.map +1 -0
  132. package/dist/subpaths/history.d.ts +22 -0
  133. package/dist/subpaths/history.d.ts.map +1 -0
  134. package/dist/subpaths/history.js +23 -0
  135. package/dist/subpaths/history.js.map +1 -0
  136. package/dist/subpaths/names.d.ts +35 -0
  137. package/dist/subpaths/names.d.ts.map +1 -0
  138. package/dist/subpaths/names.js +39 -0
  139. package/dist/subpaths/names.js.map +1 -0
  140. package/dist/subpaths/permit.d.ts +14 -0
  141. package/dist/subpaths/permit.d.ts.map +1 -0
  142. package/dist/subpaths/permit.js +14 -0
  143. package/dist/subpaths/permit.js.map +1 -0
  144. package/dist/subpaths/price.d.ts +38 -0
  145. package/dist/subpaths/price.d.ts.map +1 -0
  146. package/dist/subpaths/price.js +40 -0
  147. package/dist/subpaths/price.js.map +1 -0
  148. package/dist/subpaths/rewards.d.ts +27 -0
  149. package/dist/subpaths/rewards.d.ts.map +1 -0
  150. package/dist/subpaths/rewards.js +25 -0
  151. package/dist/subpaths/rewards.js.map +1 -0
  152. package/dist/subpaths/risk.d.ts +19 -0
  153. package/dist/subpaths/risk.d.ts.map +1 -0
  154. package/dist/subpaths/risk.js +20 -0
  155. package/dist/subpaths/risk.js.map +1 -0
  156. package/dist/subpaths/simulate.d.ts +25 -0
  157. package/dist/subpaths/simulate.d.ts.map +1 -0
  158. package/dist/subpaths/simulate.js +28 -0
  159. package/dist/subpaths/simulate.js.map +1 -0
  160. package/dist/subpaths/smart-account.d.ts +24 -0
  161. package/dist/subpaths/smart-account.d.ts.map +1 -0
  162. package/dist/subpaths/smart-account.js +24 -0
  163. package/dist/subpaths/smart-account.js.map +1 -0
  164. package/dist/subpaths/swap.d.ts +19 -0
  165. package/dist/subpaths/swap.d.ts.map +1 -0
  166. package/dist/subpaths/swap.js +20 -0
  167. package/dist/subpaths/swap.js.map +1 -0
  168. package/dist/swap.d.ts +168 -0
  169. package/dist/swap.d.ts.map +1 -0
  170. package/dist/swap.js +387 -0
  171. package/dist/swap.js.map +1 -0
  172. package/dist/tokenProbe.d.ts +3 -0
  173. package/dist/tokenProbe.d.ts.map +1 -0
  174. package/dist/tokenProbe.js +4 -0
  175. package/dist/tokenProbe.js.map +1 -0
  176. package/dist/write/batch.d.ts +34 -2
  177. package/dist/write/batch.d.ts.map +1 -1
  178. package/dist/write/batch.js +22 -3
  179. package/dist/write/batch.js.map +1 -1
  180. package/dist/write/collect.d.ts +9 -0
  181. package/dist/write/collect.d.ts.map +1 -1
  182. package/dist/write/collect.js +41 -1
  183. package/dist/write/collect.js.map +1 -1
  184. package/dist/write/send.d.ts +4 -0
  185. package/dist/write/send.d.ts.map +1 -1
  186. package/dist/write/send.js.map +1 -1
  187. package/dist/write/signer.d.ts +5 -1
  188. package/dist/write/signer.d.ts.map +1 -1
  189. package/dist/write/signer.js.map +1 -1
  190. package/dist/write/transfer.d.ts +5 -3
  191. package/dist/write/transfer.d.ts.map +1 -1
  192. package/dist/write/transfer.js +12 -6
  193. package/dist/write/transfer.js.map +1 -1
  194. package/dist/write/tron.d.ts +25 -0
  195. package/dist/write/tron.d.ts.map +1 -1
  196. package/dist/write/tron.js +26 -0
  197. package/dist/write/tron.js.map +1 -1
  198. package/package.json +73 -16
  199. package/src/aggregate.ts +110 -3
  200. package/src/approvals.ts +462 -0
  201. package/src/chains.ts +4 -0
  202. package/src/dividends.ts +360 -0
  203. package/src/fees.ts +201 -0
  204. package/src/history.ts +367 -0
  205. package/src/historySources.ts +360 -0
  206. package/src/http.ts +34 -0
  207. package/src/liquidity/v3.ts +1 -1
  208. package/src/liquidity/v4.ts +4 -3
  209. package/src/lp.ts +21 -2
  210. package/src/lpV4.ts +32 -2
  211. package/src/multicall.ts +3 -0
  212. package/src/names.ts +141 -0
  213. package/src/owner.ts +7 -138
  214. package/src/permit.ts +457 -0
  215. package/src/portfolio.ts +98 -0
  216. package/src/price.ts +415 -0
  217. package/src/rewards/farms.ts +229 -0
  218. package/src/rewards/index.ts +431 -0
  219. package/src/rewards/types.ts +179 -0
  220. package/src/risk.ts +166 -0
  221. package/src/rpcNodes.ts +18 -0
  222. package/src/simulate.ts +727 -0
  223. package/src/simulateDecode.ts +352 -0
  224. package/src/smartAccount/account.ts +63 -0
  225. package/src/smartAccount/clients.ts +180 -0
  226. package/src/smartAccount/eip5792.ts +187 -0
  227. package/src/smartAccount/send.ts +341 -0
  228. package/src/smartAccount/userOp.ts +180 -0
  229. package/src/subpaths/approvals.ts +48 -0
  230. package/src/subpaths/dividends.ts +47 -0
  231. package/src/subpaths/fees.ts +43 -0
  232. package/src/subpaths/history.ts +41 -0
  233. package/src/subpaths/names.ts +43 -0
  234. package/src/subpaths/permit.ts +39 -0
  235. package/src/subpaths/price.ts +60 -0
  236. package/src/subpaths/rewards.ts +46 -0
  237. package/src/subpaths/risk.ts +23 -0
  238. package/src/subpaths/simulate.ts +51 -0
  239. package/src/subpaths/smart-account.ts +40 -0
  240. package/src/subpaths/swap.ts +36 -0
  241. package/src/swap.ts +534 -0
  242. package/src/tokenProbe.ts +5 -0
  243. package/src/write/batch.ts +44 -5
  244. package/src/write/collect.ts +60 -1
  245. package/src/write/send.ts +4 -0
  246. package/src/write/signer.ts +5 -1
  247. package/src/write/transfer.ts +17 -10
  248. package/src/write/tron.ts +43 -0
@@ -0,0 +1,271 @@
1
+ import { Interface, getAddress, getBytes } from 'ethers';
2
+ import { decodeRevertReason } from '../errors.js';
3
+ import { SIMPLE_7702_ACCOUNT, delegationOf, failedIndex } from '../write/batch.js';
4
+ import { WriteRpc, failureText } from '../write/rpc.js';
5
+ import { FeeSource, emptyOutcome, mapPool, sendJobs, toWriteResult } from '../write/send.js';
6
+ import { resolveSigner } from '../write/signer.js';
7
+ import { encodeExecuteBatch, resolveSimpleAccount } from './account.js';
8
+ import { BundlerClient, PaymasterClient } from './clients.js';
9
+ import { DUMMY_SIGNATURE, EIP7702_MARKER, entryPointAddress, entryPointInterface, getUserOpHash, packUserOp, userOpTypedData, } from './userOp.js';
10
+ const FALLBACK_CALL_GAS = 300000n;
11
+ const PER_CALL_OVERHEAD = 15000n;
12
+ const VERIFICATION_GAS = 200000n;
13
+ const DEPLOY_VERIFICATION_GAS = 700000n;
14
+ const PRE_VERIFICATION_GAS = 100000n;
15
+ function paymasterHook(p) {
16
+ if (!p)
17
+ return null;
18
+ return typeof p === 'function' ? p : p.hook;
19
+ }
20
+ /**
21
+ * 智能账户批量执行:同一钱包的调用打成一个(按 batchSize 拆分)UserOperation,由 bundler 或自己(handleOps)打包上链,一个 UserOperation 里的调用原子执行。
22
+ * 结果的 gasUsed / fee 是 UserOperation 的 actualGasUsed / actualGasCost(账户或 paymaster 付的),不含打包交易其余部分
23
+ */
24
+ export async function sendSmartBatch(rpc, calls, options) {
25
+ const so = options.smartAccount ?? {};
26
+ const kind = so.account ?? 'simple';
27
+ const version = so.entryPoint ?? (kind === 'simple7702' ? '0.8' : '0.7');
28
+ if (kind === 'simple7702' && version !== '0.8') {
29
+ throw new Error("The 7702 account (Simple7702Account) only works with EntryPoint v0.8");
30
+ }
31
+ if (!so.bundler && !so.selfBundle) {
32
+ throw new Error('smartAccount.bundler (a bundler URL) or smartAccount.selfBundle is required');
33
+ }
34
+ const ctx = {
35
+ rpc,
36
+ options,
37
+ so,
38
+ kind,
39
+ version,
40
+ entryPoint: entryPointAddress(version),
41
+ delegate: getAddress(so.delegate ?? options.delegate ?? SIMPLE_7702_ACCOUNT),
42
+ fees: new FeeSource(rpc, options),
43
+ bundler: so.selfBundle ? null : typeof so.bundler === 'string' ? new BundlerClient(so.bundler) : (so.bundler ?? null),
44
+ paymaster: paymasterHook(so.paymaster),
45
+ };
46
+ const results = calls.map((c, i) => toWriteResult(i, c.signer.address, c.to, emptyOutcome('skipped')));
47
+ const report = (indexes, outcome, failed) => {
48
+ indexes.forEach((i, k) => {
49
+ const c = calls[i];
50
+ const o = failed ? (k === failed.index ? { ...outcome, error: failed.reason } : outcome) : outcome;
51
+ results[i] = { ...toWriteResult(i, outcome.sender, c.to, o), userOpHash: outcome.userOpHash, atomic: true };
52
+ options.onUpdate?.(results[i]);
53
+ });
54
+ };
55
+ const byWallet = new Map();
56
+ calls.forEach((c, i) => byWallet.set(c.signer.address.toLowerCase(), [...(byWallet.get(c.signer.address.toLowerCase()) ?? []), i]));
57
+ const batchSize = Math.max(1, options.batchSize ?? 50);
58
+ // 同一个 sponsor 钱包发所有 handleOps:并发会抢 nonce,按顺序发
59
+ await mapPool([...byWallet.values()], so.selfBundle && so.selfBundle !== true ? 1 : (options.concurrency ?? 8), async (indexes) => {
60
+ const signer = calls[indexes[0]].signer;
61
+ let stopped = false;
62
+ for (let start = 0; start < indexes.length; start += batchSize) {
63
+ const chunk = indexes.slice(start, start + batchSize);
64
+ if (stopped || options.signal?.aborted) {
65
+ report(chunk, { ...emptyOutcome('skipped', options.signal?.aborted ? 'aborted' : 'skipped: a previous batch from this wallet failed'), userOpHash: null, sender: signer.address });
66
+ continue;
67
+ }
68
+ const last = start + batchSize >= indexes.length;
69
+ let outcome;
70
+ try {
71
+ outcome = await sendOp(ctx, signer, chunk.map((i) => calls[i]), last ? options.wait !== false : true);
72
+ }
73
+ catch (err) {
74
+ outcome = { ...emptyOutcome('failed', failureText(err)), userOpHash: null, sender: signer.address };
75
+ }
76
+ report(chunk, outcome, outcome.status === 'reverted' && outcome.revertData ? (failedIndex(outcome.revertData, chunk.length) ?? undefined) : undefined);
77
+ if (outcome.status !== 'confirmed' && outcome.status !== 'simulated' && !options.continueOnError)
78
+ stopped = true;
79
+ }
80
+ });
81
+ return results;
82
+ }
83
+ async function accountInfo(ctx, signer) {
84
+ const { rpc } = ctx;
85
+ if (ctx.kind === 'simple') {
86
+ const a = await resolveSimpleAccount(rpc, signer.address, ctx.version, ctx.so.salt, ctx.so.factory);
87
+ return { sender: a.address, live: a.deployed, needsAuth: false, ...(a.deployed ? {} : { factory: a.factory, factoryData: a.factoryData }) };
88
+ }
89
+ if (!signer.local || typeof signer.signer.authorize !== 'function') {
90
+ throw new Error('The 7702 account requires a signer that can sign EIP-7702 authorizations locally (a private key or an ethers Wallet)');
91
+ }
92
+ if ((await rpc.code(ctx.delegate)) === '0x') {
93
+ throw new Error(`The delegate contract ${ctx.delegate} is not deployed on chain ${rpc.chainId}`);
94
+ }
95
+ const { delegated, to } = await delegationOf(rpc, signer.address);
96
+ if (delegated && to !== ctx.delegate && !(ctx.so.redelegate ?? ctx.options.redelegate)) {
97
+ throw new Error(`${signer.address} is already delegated to ${to}; pass redelegate: true to replace it`);
98
+ }
99
+ const needsAuth = !delegated || to !== ctx.delegate;
100
+ return { sender: signer.address, live: !needsAuth, needsAuth, ...(needsAuth ? { factory: EIP7702_MARKER, factoryData: '0x' } : {}) };
101
+ }
102
+ async function readNonce(ctx, sender) {
103
+ const data = await ctx.rpc.call({ to: ctx.entryPoint, data: entryPointInterface.encodeFunctionData('getNonce', [sender, 0]) });
104
+ return entryPointInterface.decodeFunctionResult('getNonce', data)[0];
105
+ }
106
+ /** 没有 bundler 时估算 gas:整批能执行时估整批(从 EntryPoint 调账户),否则逐个调用估算后相加 */
107
+ async function estimateCallGas(ctx, info, callData, items) {
108
+ const multiplier = BigInt(Math.round((ctx.options.gasMultiplier ?? 1.2) * 1000));
109
+ if (info.live) {
110
+ return (await ctx.rpc.estimateGas({ from: ctx.entryPoint, to: info.sender, data: callData })) * multiplier / 1000n + PER_CALL_OVERHEAD;
111
+ }
112
+ let total = 0n;
113
+ for (const [i, c] of items.entries()) {
114
+ try {
115
+ total += await ctx.rpc.estimateGas({ from: info.sender, to: c.to, data: c.data, value: c.value });
116
+ }
117
+ catch (err) {
118
+ // 依赖前面调用结果的(先 approve 再兑换)单独估算会失败;第一个调用失败说明批量本身就会失败
119
+ if (i === 0)
120
+ throw err;
121
+ total += FALLBACK_CALL_GAS;
122
+ }
123
+ total += PER_CALL_OVERHEAD;
124
+ }
125
+ return (total * multiplier) / 1000n;
126
+ }
127
+ async function signOp(ctx, signer, op, hash) {
128
+ if (ctx.version === '0.8') {
129
+ if (typeof signer.signer.signTypedData !== 'function')
130
+ throw new Error('The signer does not support signTypedData');
131
+ const { domain, types, message } = userOpTypedData(op, ctx.entryPoint, ctx.rpc.chainId, ctx.delegate);
132
+ return signer.signer.signTypedData(domain, types, message);
133
+ }
134
+ if (typeof signer.signer.signMessage !== 'function')
135
+ throw new Error('The signer does not support signMessage');
136
+ return signer.signer.signMessage(getBytes(hash));
137
+ }
138
+ async function signAuth(ctx, signer, nonce) {
139
+ return signer.signer.authorize({ address: ctx.delegate, nonce, chainId: ctx.rpc.chainId });
140
+ }
141
+ async function sendOp(ctx, signer, items, wait) {
142
+ const { rpc, options } = ctx;
143
+ const info = await accountInfo(ctx, signer);
144
+ const callData = encodeExecuteBatch(ctx.version, items);
145
+ const selfBundle = Boolean(ctx.so.selfBundle);
146
+ const fee = selfBundle ? null : await ctx.fees.get();
147
+ const op = {
148
+ sender: info.sender,
149
+ nonce: await readNonce(ctx, info.sender),
150
+ ...(info.factory ? { factory: info.factory, factoryData: info.factoryData } : {}),
151
+ callData,
152
+ callGasLimit: 0n,
153
+ verificationGasLimit: 0n,
154
+ preVerificationGas: 0n,
155
+ maxFeePerGas: fee?.perGas ?? 0n,
156
+ maxPriorityFeePerGas: fee ? (fee.type === 2 ? fee.maxPriorityFeePerGas : fee.perGas) : 0n,
157
+ signature: DUMMY_SIGNATURE,
158
+ };
159
+ const pmContext = { entryPoint: ctx.entryPoint, chainId: rpc.chainId };
160
+ const hook = ctx.paymaster;
161
+ // gas:bundler 估算,或本地估算
162
+ if (ctx.bundler) {
163
+ if (info.needsAuth) {
164
+ // bundler 是别人:授权 nonce 就是钱包当前的 nonce
165
+ op.eip7702Auth = await signAuth(ctx, signer, await rpc.nonce(signer.address));
166
+ }
167
+ if (hook)
168
+ Object.assign(op, await hook(op, { ...pmContext, stage: 'stub' }));
169
+ Object.assign(op, await ctx.bundler.estimateUserOperationGas(op, ctx.entryPoint));
170
+ }
171
+ else {
172
+ if (hook)
173
+ Object.assign(op, await hook(op, { ...pmContext, stage: 'stub' }));
174
+ op.callGasLimit = await estimateCallGas(ctx, info, callData, items);
175
+ op.verificationGasLimit = info.factory ? DEPLOY_VERIFICATION_GAS : VERIFICATION_GAS;
176
+ op.preVerificationGas = PRE_VERIFICATION_GAS;
177
+ }
178
+ Object.assign(op, ctx.so.gas);
179
+ if (hook)
180
+ Object.assign(op, await hook({ ...op, signature: DUMMY_SIGNATURE }, { ...pmContext, stage: 'final' }));
181
+ const delegate = info.needsAuth || ctx.kind === 'simple7702' ? ctx.delegate : undefined;
182
+ const hash = getUserOpHash(op, ctx.entryPoint, rpc.chainId, ctx.version, delegate);
183
+ op.signature = await signOp(ctx, signer, op, hash);
184
+ if (ctx.bundler) {
185
+ if (options.dryRun)
186
+ return { ...emptyOutcome('simulated'), gasLimit: op.callGasLimit + op.verificationGasLimit + op.preVerificationGas, userOpHash: hash, sender: info.sender };
187
+ const sent = await ctx.bundler.sendUserOperation(op, ctx.entryPoint);
188
+ if (sent.toLowerCase() !== hash.toLowerCase()) {
189
+ throw new Error(`The bundler returned a different userOpHash (${sent}) than computed locally (${hash}); not tracking it`);
190
+ }
191
+ if (!wait)
192
+ return { ...emptyOutcome('sent'), userOpHash: hash, sender: info.sender };
193
+ const receipt = await ctx.bundler.waitForUserOperation(hash, options);
194
+ if (!receipt)
195
+ return { ...emptyOutcome('pending', 'not confirmed in time; the UserOperation may still be included'), userOpHash: hash, sender: info.sender };
196
+ return {
197
+ ...emptyOutcome(receipt.success ? 'confirmed' : 'reverted', receipt.success ? null : 'execution reverted'),
198
+ hash: receipt.transactionHash,
199
+ blockNumber: receipt.blockNumber,
200
+ gasUsed: receipt.actualGasUsed,
201
+ fee: receipt.actualGasCost,
202
+ revertData: receipt.reason && receipt.reason.startsWith('0x') ? receipt.reason : null,
203
+ userOpHash: hash,
204
+ sender: info.sender,
205
+ };
206
+ }
207
+ // 自己打包:bundler 钱包发一笔 handleOps(带 7702 授权时一起带上)
208
+ const bundlerSigner = ctx.so.selfBundle === true ? signer : await resolveSigner(ctx.so.selfBundle);
209
+ if (!bundlerSigner.local)
210
+ throw new Error('selfBundle requires a signer that can sign transactions locally (a private key or an ethers Wallet)');
211
+ const packed = packUserOp(op);
212
+ const data = entryPointInterface.encodeFunctionData('handleOps', [[packed], bundlerSigner.address]);
213
+ const job = {
214
+ signer: bundlerSigner,
215
+ build: async (nonce) => {
216
+ let authorizationList;
217
+ if (info.needsAuth) {
218
+ // 钱包自己发这笔交易时,交易先把 nonce 加一再处理授权
219
+ const authNonce = bundlerSigner.address === signer.address ? nonce + 1 : await rpc.nonce(signer.address);
220
+ authorizationList = [await signAuth(ctx, signer, authNonce)];
221
+ }
222
+ return { to: ctx.entryPoint, data, value: 0n, authorizationList };
223
+ },
224
+ };
225
+ const [txOutcome] = await sendJobs(rpc, [job], { ...options, wait }, ctx.fees);
226
+ const outcome = txOutcome;
227
+ if (outcome.status === 'failed' && outcome.revertData) {
228
+ outcome.error = decodeFailedOp(outcome.revertData) ?? outcome.error;
229
+ }
230
+ const result = { ...outcome, userOpHash: hash, sender: info.sender };
231
+ if (outcome.status === 'confirmed' && outcome.hash) {
232
+ // 交易成功不代表 UserOperation 成功:看 UserOperationEvent
233
+ const receipt = await rpc.receipt(outcome.hash);
234
+ const event = receipt?.logs.map((l) => parseLog(l)).find((e) => e?.name === 'UserOperationEvent' && String(e.args[0]).toLowerCase() === hash.toLowerCase());
235
+ if (!event) {
236
+ return { ...result, status: 'reverted', error: 'the UserOperation was not executed by the EntryPoint' };
237
+ }
238
+ const reason = receipt?.logs.map((l) => parseLog(l)).find((e) => e?.name === 'UserOperationRevertReason' && String(e.args[0]).toLowerCase() === hash.toLowerCase());
239
+ result.gasUsed = event.args[6];
240
+ result.fee = event.args[5];
241
+ if (event.args[4] !== true) {
242
+ const revert = reason ? String(reason.args[3]) : null;
243
+ return { ...result, status: 'reverted', error: 'execution reverted', revertData: revert };
244
+ }
245
+ }
246
+ return result;
247
+ }
248
+ const logInterface = new Interface(entryPointInterface.fragments);
249
+ function parseLog(log) {
250
+ try {
251
+ return logInterface.parseLog({ topics: [...log.topics], data: log.data });
252
+ }
253
+ catch {
254
+ return null;
255
+ }
256
+ }
257
+ /** EntryPoint 的 FailedOp(opIndex, reason):reason 形如 'AA24 signature error' */
258
+ function decodeFailedOp(data) {
259
+ try {
260
+ const e = entryPointInterface.parseError(data);
261
+ if (e?.name === 'FailedOp' || e?.name === 'FailedOpWithRevert') {
262
+ const inner = e.name === 'FailedOpWithRevert' ? decodeRevertReason(String(e.args[2])) : null;
263
+ return `EntryPoint rejected the UserOperation: ${e.args[1]}${inner ? ` (${inner})` : ''}`;
264
+ }
265
+ }
266
+ catch {
267
+ // 不是 EntryPoint 的错误
268
+ }
269
+ return null;
270
+ }
271
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/smartAccount/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { Interface, type Authorization } from 'ethers';
2
+ /** ERC-4337 EntryPoint 的两个版本,各主流链上地址相同 */
3
+ export declare const ENTRY_POINT_V07 = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
4
+ export declare const ENTRY_POINT_V08 = "0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108";
5
+ export type EntryPointVersion = '0.7' | '0.8';
6
+ export declare function entryPointAddress(version: EntryPointVersion): string;
7
+ /** EntryPoint v0.8 把 initCode 以 0x7702 开头(至少 20 字节)的 UserOperation 当作 EIP-7702 账户 */
8
+ export declare const EIP7702_MARKER = "0x7702000000000000000000000000000000000000";
9
+ /** UserOperation(bundler JSON-RPC 的“拆开”格式,数值用 bigint) */
10
+ export interface UserOperation {
11
+ sender: string;
12
+ nonce: bigint;
13
+ /** 账户还没部署时创建它的工厂 + calldata;EIP-7702 账户用 EIP7702_MARKER 作为 factory */
14
+ factory?: string;
15
+ factoryData?: string;
16
+ callData: string;
17
+ callGasLimit: bigint;
18
+ verificationGasLimit: bigint;
19
+ preVerificationGas: bigint;
20
+ maxFeePerGas: bigint;
21
+ maxPriorityFeePerGas: bigint;
22
+ paymaster?: string;
23
+ paymasterVerificationGasLimit?: bigint;
24
+ paymasterPostOpGasLimit?: bigint;
25
+ paymasterData?: string;
26
+ signature: string;
27
+ /** EIP-7702 授权(账户还没委托时随 UserOperation 一起交给 bundler) */
28
+ eip7702Auth?: Authorization;
29
+ }
30
+ /** 打包后的 UserOperation(EntryPoint.handleOps 的参数) */
31
+ export interface PackedUserOperation {
32
+ sender: string;
33
+ nonce: bigint;
34
+ initCode: string;
35
+ callData: string;
36
+ accountGasLimits: string;
37
+ preVerificationGas: bigint;
38
+ gasFees: string;
39
+ paymasterAndData: string;
40
+ signature: string;
41
+ }
42
+ export declare function initCodeOf(op: Pick<UserOperation, 'factory' | 'factoryData'>): string;
43
+ export declare function paymasterAndDataOf(op: UserOperation): string;
44
+ export declare function packUserOp(op: UserOperation): PackedUserOperation;
45
+ /** v0.8 的 EIP-712 类型(userOpHash 就是它的摘要,所以钱包可以直接 signTypedData 签) */
46
+ export declare const USER_OP_TYPES: {
47
+ PackedUserOperation: {
48
+ name: string;
49
+ type: string;
50
+ }[];
51
+ };
52
+ /**
53
+ * v0.8 的 EIP-712 数据。EIP-7702 账户(initCode 以 0x7702 开头):EntryPoint 算哈希时把 initCode 换成
54
+ * “账户当前委托的合约地址 ‖ initCode[20:]”,所以要传 delegate(账户将要委托 / 已委托的合约)
55
+ */
56
+ export declare function userOpTypedData(op: UserOperation, entryPoint: string, chainId: number, delegate?: string): {
57
+ domain: {
58
+ name: string;
59
+ version: string;
60
+ chainId: number;
61
+ verifyingContract: string;
62
+ };
63
+ types: {
64
+ PackedUserOperation: {
65
+ name: string;
66
+ type: string;
67
+ }[];
68
+ };
69
+ message: {
70
+ initCode: string;
71
+ sender: string;
72
+ nonce: bigint;
73
+ callData: string;
74
+ accountGasLimits: string;
75
+ preVerificationGas: bigint;
76
+ gasFees: string;
77
+ paymasterAndData: string;
78
+ };
79
+ };
80
+ /** UserOperation 哈希(与 EntryPoint.getUserOpHash 一致) */
81
+ export declare function getUserOpHash(op: UserOperation, entryPoint: string, chainId: number, version: EntryPointVersion, delegate?: string): string;
82
+ /** JSON-RPC 数值:0x 十六进制、没有前导零 */
83
+ export declare const quantity: (v: bigint | number) => string;
84
+ /** bundler JSON-RPC 的 UserOperation(数值为 0x 十六进制) */
85
+ export declare function userOpToRpc(op: UserOperation): Record<string, unknown>;
86
+ /** 估算 gas 时用的占位签名(65 字节、格式合法的 ECDSA 签名,账户校验时不会因为长度 / 格式直接 revert) */
87
+ export declare const DUMMY_SIGNATURE: string;
88
+ export declare const entryPointInterface: Interface;
89
+ /** 十六进制数值 → bigint(bundler 返回的字段) */
90
+ export declare function hexToBigInt(value: unknown): bigint;
91
+ //# sourceMappingURL=userOp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userOp.d.ts","sourceRoot":"","sources":["../../src/smartAccount/userOp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAoF,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAA;AAElJ,0CAA0C;AAC1C,eAAO,MAAM,eAAe,+CAA+C,CAAA;AAC3E,eAAO,MAAM,eAAe,+CAA+C,CAAA;AAE3E,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,CAAA;AAE7C,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAEpE;AAED,qFAAqF;AACrF,eAAO,MAAM,cAAc,+CAA+C,CAAA;AAE1E,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6BAA6B,CAAC,EAAE,MAAM,CAAA;IACtC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,uDAAuD;IACvD,WAAW,CAAC,EAAE,aAAa,CAAA;CAC5B;AAED,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;CAClB;AAID,wBAAgB,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,aAAa,CAAC,GAAG,MAAM,CAErF;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAK5D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,mBAAmB,CAYjE;AAED,oEAAoE;AACpE,eAAO,MAAM,aAAa;;;;;CAWzB,CAAA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;gBAxD/F,MAAM;eACP,MAAM;kBAEH,MAAM;0BACE,MAAM;4BACJ,MAAM;iBACjB,MAAM;0BACG,MAAM;;EAgEzB;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAc3I;AAED,gCAAgC;AAChC,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,GAAG,MAAM,KAAG,MAA+B,CAAA;AAE7E,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4BtE;AAED,qEAAqE;AACrE,eAAO,MAAM,eAAe,QAA8D,CAAA;AAE1F,eAAO,MAAM,mBAAmB,WAQ9B,CAAA;AAEF,qCAAqC;AACrC,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD"}
@@ -0,0 +1,124 @@
1
+ import { AbiCoder, Interface, TypedDataEncoder, concat, getAddress, getBytes, keccak256, toBeHex, zeroPadValue } from 'ethers';
2
+ /** ERC-4337 EntryPoint 的两个版本,各主流链上地址相同 */
3
+ export const ENTRY_POINT_V07 = '0x0000000071727De22E5E9d8BAf0edAc6f37da032';
4
+ export const ENTRY_POINT_V08 = '0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108';
5
+ export function entryPointAddress(version) {
6
+ return version === '0.8' ? ENTRY_POINT_V08 : ENTRY_POINT_V07;
7
+ }
8
+ /** EntryPoint v0.8 把 initCode 以 0x7702 开头(至少 20 字节)的 UserOperation 当作 EIP-7702 账户 */
9
+ export const EIP7702_MARKER = '0x7702000000000000000000000000000000000000';
10
+ const u128 = (value) => zeroPadValue(toBeHex(value), 16);
11
+ export function initCodeOf(op) {
12
+ return op.factory ? concat([op.factory, op.factoryData ?? '0x']) : '0x';
13
+ }
14
+ export function paymasterAndDataOf(op) {
15
+ if (!op.paymaster) {
16
+ return '0x';
17
+ }
18
+ return concat([op.paymaster, u128(op.paymasterVerificationGasLimit ?? 0n), u128(op.paymasterPostOpGasLimit ?? 0n), op.paymasterData ?? '0x']);
19
+ }
20
+ export function packUserOp(op) {
21
+ return {
22
+ sender: getAddress(op.sender),
23
+ nonce: op.nonce,
24
+ initCode: initCodeOf(op),
25
+ callData: op.callData,
26
+ accountGasLimits: concat([u128(op.verificationGasLimit), u128(op.callGasLimit)]),
27
+ preVerificationGas: op.preVerificationGas,
28
+ gasFees: concat([u128(op.maxPriorityFeePerGas), u128(op.maxFeePerGas)]),
29
+ paymasterAndData: paymasterAndDataOf(op),
30
+ signature: op.signature,
31
+ };
32
+ }
33
+ /** v0.8 的 EIP-712 类型(userOpHash 就是它的摘要,所以钱包可以直接 signTypedData 签) */
34
+ export const USER_OP_TYPES = {
35
+ PackedUserOperation: [
36
+ { name: 'sender', type: 'address' },
37
+ { name: 'nonce', type: 'uint256' },
38
+ { name: 'initCode', type: 'bytes' },
39
+ { name: 'callData', type: 'bytes' },
40
+ { name: 'accountGasLimits', type: 'bytes32' },
41
+ { name: 'preVerificationGas', type: 'uint256' },
42
+ { name: 'gasFees', type: 'bytes32' },
43
+ { name: 'paymasterAndData', type: 'bytes' },
44
+ ],
45
+ };
46
+ /**
47
+ * v0.8 的 EIP-712 数据。EIP-7702 账户(initCode 以 0x7702 开头):EntryPoint 算哈希时把 initCode 换成
48
+ * “账户当前委托的合约地址 ‖ initCode[20:]”,所以要传 delegate(账户将要委托 / 已委托的合约)
49
+ */
50
+ export function userOpTypedData(op, entryPoint, chainId, delegate) {
51
+ const packed = packUserOp(op);
52
+ let initCode = packed.initCode;
53
+ if (initCode.toLowerCase().startsWith('0x7702') && getBytes(initCode).length >= 20) {
54
+ if (!delegate) {
55
+ throw new Error('delegate is required to hash an EIP-7702 UserOperation');
56
+ }
57
+ initCode = concat([getAddress(delegate), `0x${initCode.slice(2 + 40)}`]);
58
+ }
59
+ const { signature: _signature, ...message } = packed;
60
+ return {
61
+ domain: { name: 'ERC4337', version: '1', chainId, verifyingContract: getAddress(entryPoint) },
62
+ types: USER_OP_TYPES,
63
+ message: { ...message, initCode },
64
+ };
65
+ }
66
+ /** UserOperation 哈希(与 EntryPoint.getUserOpHash 一致) */
67
+ export function getUserOpHash(op, entryPoint, chainId, version, delegate) {
68
+ if (version === '0.8') {
69
+ const { domain, types, message } = userOpTypedData(op, entryPoint, chainId, delegate);
70
+ return TypedDataEncoder.hash(domain, types, message);
71
+ }
72
+ const p = packUserOp(op);
73
+ const coder = AbiCoder.defaultAbiCoder();
74
+ const inner = keccak256(coder.encode(['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'], [p.sender, p.nonce, keccak256(p.initCode), keccak256(p.callData), p.accountGasLimits, p.preVerificationGas, p.gasFees, keccak256(p.paymasterAndData)]));
75
+ return keccak256(coder.encode(['bytes32', 'address', 'uint256'], [inner, getAddress(entryPoint), chainId]));
76
+ }
77
+ /** JSON-RPC 数值:0x 十六进制、没有前导零 */
78
+ export const quantity = (v) => `0x${v.toString(16)}`;
79
+ /** bundler JSON-RPC 的 UserOperation(数值为 0x 十六进制) */
80
+ export function userOpToRpc(op) {
81
+ const q = quantity;
82
+ const rpc = { sender: getAddress(op.sender), nonce: q(op.nonce), callData: op.callData };
83
+ if (op.factory) {
84
+ rpc.factory = op.factory;
85
+ rpc.factoryData = op.factoryData ?? '0x';
86
+ }
87
+ Object.assign(rpc, {
88
+ callGasLimit: q(op.callGasLimit),
89
+ verificationGasLimit: q(op.verificationGasLimit),
90
+ preVerificationGas: q(op.preVerificationGas),
91
+ maxFeePerGas: q(op.maxFeePerGas),
92
+ maxPriorityFeePerGas: q(op.maxPriorityFeePerGas),
93
+ });
94
+ if (op.paymaster) {
95
+ Object.assign(rpc, {
96
+ paymaster: op.paymaster,
97
+ paymasterVerificationGasLimit: q(op.paymasterVerificationGasLimit ?? 0n),
98
+ paymasterPostOpGasLimit: q(op.paymasterPostOpGasLimit ?? 0n),
99
+ paymasterData: op.paymasterData ?? '0x',
100
+ });
101
+ }
102
+ rpc.signature = op.signature;
103
+ if (op.eip7702Auth) {
104
+ const a = op.eip7702Auth;
105
+ rpc.eip7702Auth = { chainId: q(BigInt(a.chainId)), address: a.address, nonce: q(BigInt(a.nonce)), yParity: a.signature.yParity === 0 ? '0x0' : '0x1', r: a.signature.r, s: a.signature.s };
106
+ }
107
+ return rpc;
108
+ }
109
+ /** 估算 gas 时用的占位签名(65 字节、格式合法的 ECDSA 签名,账户校验时不会因为长度 / 格式直接 revert) */
110
+ export const DUMMY_SIGNATURE = `0x${'f'.repeat(31)}0${'0'.repeat(32)}7${'a'.repeat(63)}1c`;
111
+ export const entryPointInterface = new Interface([
112
+ 'function handleOps((address sender, uint256 nonce, bytes initCode, bytes callData, bytes32 accountGasLimits, uint256 preVerificationGas, bytes32 gasFees, bytes paymasterAndData, bytes signature)[] ops, address beneficiary)',
113
+ 'function getNonce(address sender, uint192 key) view returns (uint256)',
114
+ 'function getUserOpHash((address sender, uint256 nonce, bytes initCode, bytes callData, bytes32 accountGasLimits, uint256 preVerificationGas, bytes32 gasFees, bytes paymasterAndData, bytes signature) userOp) view returns (bytes32)',
115
+ 'error FailedOp(uint256 opIndex, string reason)',
116
+ 'error FailedOpWithRevert(uint256 opIndex, string reason, bytes inner)',
117
+ 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)',
118
+ 'event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason)',
119
+ ]);
120
+ /** 十六进制数值 → bigint(bundler 返回的字段) */
121
+ export function hexToBigInt(value) {
122
+ return value === undefined || value === null ? 0n : BigInt(value);
123
+ }
124
+ //# sourceMappingURL=userOp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userOp.js","sourceRoot":"","sources":["../../src/smartAccount/userOp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 授权管理(子路径 `@w3lib/evm-batch-call/approvals`):批量查地址给出的授权(ERC20、Permit2、NFT 的 setApprovalForAll),
3
+ * 按 Approval 事件发现授权过的代币,批量撤销。不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
4
+ *
5
+ * ```ts
6
+ * import { getApprovals, revokeApprovals } from '@w3lib/evm-batch-call/approvals'
7
+ *
8
+ * const list = await getApprovals(user, { chainId: 56, tokens: [USDT, CAKE] })
9
+ * await revokeApprovals(provider, key, list.filter((a) => a.type !== 'nft' && a.unlimited))
10
+ * ```
11
+ */
12
+ import { type Approval, type ApprovalsQuery } from '../approvals.js';
13
+ import { type ShortcutProviderOptions } from '../shortcuts.js';
14
+ export { PERMIT2_ADDRESS, approvals, buildRevokes, knownSpenders, revokeApprovals, scanApprovals, type Approval, type ApprovalScanOptions, type ApprovalScanProgress, type ApprovalScanResult, type ApprovalsQuery, type Erc20Approval, type KnownSpender, type NftApproval, type Permit2Approval, type RevokeResult, type RevokeTx, } from '../approvals.js';
15
+ export interface GetApprovalsOptions extends ApprovalsQuery, ShortcutProviderOptions {
16
+ }
17
+ /**
18
+ * 查地址给出的授权,节点参数与 getBalances 相同。默认检查已知的 Router / 聚合器 / NFT 市场。
19
+ *
20
+ * ```ts
21
+ * await getApprovals(user, { chainId: 56, tokens: [USDT, CAKE] })
22
+ * // [{ type: 'erc20', token: USDT, symbol: 'USDT', spender: '0x1111…', spenderName: '1inch Router v6', amount: '…', unlimited: true }, …]
23
+ * ```
24
+ */
25
+ export declare function getApprovals(owner: string, options: GetApprovalsOptions): Promise<Approval[]>;
26
+ //# sourceMappingURL=approvals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/subpaths/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAW,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,QAAQ,GACd,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,mBAAoB,SAAQ,cAAc,EAAE,uBAAuB;CAAG;AAEvF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG7F"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 授权管理(子路径 `@w3lib/evm-batch-call/approvals`):批量查地址给出的授权(ERC20、Permit2、NFT 的 setApprovalForAll),
3
+ * 按 Approval 事件发现授权过的代币,批量撤销。不放在主入口,不用时打包不会带上这部分代码;发送的代码按需加载。
4
+ *
5
+ * ```ts
6
+ * import { getApprovals, revokeApprovals } from '@w3lib/evm-batch-call/approvals'
7
+ *
8
+ * const list = await getApprovals(user, { chainId: 56, tokens: [USDT, CAKE] })
9
+ * await revokeApprovals(provider, key, list.filter((a) => a.type !== 'nft' && a.unlimited))
10
+ * ```
11
+ */
12
+ import { approvals } from '../approvals.js';
13
+ import { resolve } from '../shortcuts.js';
14
+ export { PERMIT2_ADDRESS, approvals, buildRevokes, knownSpenders, revokeApprovals, scanApprovals, } from '../approvals.js';
15
+ /**
16
+ * 查地址给出的授权,节点参数与 getBalances 相同。默认检查已知的 Router / 聚合器 / NFT 市场。
17
+ *
18
+ * ```ts
19
+ * await getApprovals(user, { chainId: 56, tokens: [USDT, CAKE] })
20
+ * // [{ type: 'erc20', token: USDT, symbol: 'USDT', spender: '0x1111…', spenderName: '1inch Router v6', amount: '…', unlimited: true }, …]
21
+ * ```
22
+ */
23
+ export function getApprovals(owner, options) {
24
+ const { provider, own } = resolve(options, ['tokens', 'spenders', 'pairs', 'permit2', 'nfts', 'operators', 'nftPairs', 'includeZero']);
25
+ return approvals(provider, owner, own);
26
+ }
27
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/subpaths/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,SAAS,EAAsC,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAgC,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,GAYd,MAAM,iBAAiB,CAAA;AAIxB;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAA4B;IACtE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAA;IACtI,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Flap 分红(子路径 `@w3lib/evm-batch-call/dividends`):查持有人在 Flap(flap.sh,BNB Chain 发币平台)税收代币上累计的分红
3
+ * (可领取 / 已领取、分红资产、美元价值),批量领取(可用 7702 / 4337 / 5792 合成一笔原子交易)。
4
+ * 不放在主入口,不用时打包不会带上这部分代码;发送和模拟的代码按需加载。只支持 BSC,合约形态和核实范围见 README「Flap 分红」。
5
+ *
6
+ * ```ts
7
+ * import { getDividends, claimDividends } from '@w3lib/evm-batch-call/dividends'
8
+ *
9
+ * const { items } = await getDividends(user, { chainId: 56, discover: true }) // 或 tokens: [flapToken]
10
+ * await claimDividends(provider, key, items, { mode: '7702', simulate: true })
11
+ * ```
12
+ */
13
+ import { type DividendsOptions, type DividendsResult } from '../dividends.js';
14
+ import { type ShortcutProviderOptions } from '../shortcuts.js';
15
+ export { FLAP_DIVIDEND_CHAINS, FLAP_TOKEN_SUFFIXES, buildClaimDividends, claimDividends, dividends, scanDividendTokens, type ClaimDividendResult, type ClaimDividendTx, type ClaimDividendsOptions, type DividendItem, type DividendScanOptions, type DividendUnsupported, type DividendsOptions, type DividendsResult, } from '../dividends.js';
16
+ export interface GetDividendsOptions extends DividendsOptions, ShortcutProviderOptions {
17
+ }
18
+ /**
19
+ * 查持有人在 Flap 代币上的分红,节点参数与 getBalances 相同(chainId 只能是 56)。
20
+ * tokens 给定要查的代币;discover 从收到过的 Transfer 事件里发现(卖光的代币上之前累计的分红也能领)。
21
+ *
22
+ * ```ts
23
+ * const { items, unsupported } = await getDividends(user, { chainId: 56, tokens: [flapToken] })
24
+ * // [{ token, symbol, balance, claimable: '88823258714382840', asset: '0x9b8E…', assetSymbol: 'FXIon', usd: null, dividendContract, … }]
25
+ * ```
26
+ */
27
+ export declare function getDividends(owner: string, options?: GetDividendsOptions): Promise<DividendsResult>;
28
+ //# sourceMappingURL=dividends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dividends.d.ts","sourceRoot":"","sources":["../../src/subpaths/dividends.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAa,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,EAAW,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB,EAAE,uBAAuB;CAAG;AAEzF;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,eAAe,CAAC,CAGvG"}