@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,33 @@
1
+ export type DecodedType = 'transfer' | 'swap' | 'approve' | 'liquidity' | 'contract' | 'unknown';
2
+ export interface DecodedCall {
3
+ type: DecodedType;
4
+ /** 协议 / 合约名:Router 地址在内置协议表里时用表里的名字,否则是 ABI 所属的类别(如 "Uniswap V2 Router") */
5
+ protocol?: string;
6
+ /** 方法名(unknown 时没有) */
7
+ method?: string;
8
+ /** 一句话描述(simulate 会在有余额变化时补上数量) */
9
+ summary: string;
10
+ /** 参数(地址 / 数字都是字符串,可以直接 JSON 序列化);unknown 时是 { selector } */
11
+ args?: Record<string, unknown>;
12
+ /** multicall / Universal Router 等里面包含的子调用 */
13
+ calls?: DecodedCall[];
14
+ }
15
+ /**
16
+ * 解码一笔交易的 calldata。`to` 和 `chainId` 用来按内置协议表给 Router 标协议名。
17
+ *
18
+ * ```ts
19
+ * decodeCalldata(data, { to: router, chainId: 1 })
20
+ * // { type: 'swap', protocol: 'Uniswap SwapRouter02', method: 'exactInputSingle', summary: 'Uniswap SwapRouter02 exactInputSingle', args: {…} }
21
+ * ```
22
+ */
23
+ export declare function decodeCalldata(data: string | undefined, ctx?: {
24
+ to?: string;
25
+ chainId?: number;
26
+ value?: bigint;
27
+ }, depth?: number): DecodedCall;
28
+ /**
29
+ * revert 数据 → 可读的原因:Error(string)、Panic(带含义),常见的自定义错误(Universal Router、Permit2、OpenZeppelin)带参数,
30
+ * 认不出的是 `custom error 0x选择器`。没有数据时返回 null
31
+ */
32
+ export declare function decodeRevert(data: string | null | undefined, depth?: number): string | null;
33
+ //# sourceMappingURL=simulateDecode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulateDecode.d.ts","sourceRoot":"","sources":["../src/simulateDecode.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAA;AAEhG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAA;IACjB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;CACtB;AA0LD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,EAAE,KAAK,SAAI,GAAG,WAAW,CAqC5I;AAwED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,SAAI,GAAG,MAAM,GAAG,IAAI,CAoBtF"}
@@ -0,0 +1,321 @@
1
+ /**
2
+ * 模拟用的解码:calldata(ERC20 / 721 / 1155、WETH、Uniswap V2 / V3 Router、Universal Router、V3 仓位合约、Permit2、Multicall3、Disperse,
3
+ * 其中 Router / 仓位合约的地址按内置协议表标出协议名)和 revert 数据(Error / Panic、常见的自定义错误)。
4
+ * 不查网络(不用 4byte):认不出的选择器返回 unknown 和原始选择器。
5
+ */
6
+ import { Interface, dataSlice } from 'ethers';
7
+ import { knownSpenders } from './approvals.js';
8
+ import { decodeRevertReason } from './errors.js';
9
+ const TOKEN_ID = 'tuple(address token, uint160 amount, uint48 expiration, uint48 nonce)';
10
+ const GROUPS = [
11
+ {
12
+ name: 'Token',
13
+ abi: [
14
+ 'function transfer(address to, uint256 amount)',
15
+ 'function transferFrom(address from, address to, uint256 amount)',
16
+ 'function approve(address spender, uint256 amount)',
17
+ 'function increaseAllowance(address spender, uint256 amount)',
18
+ 'function decreaseAllowance(address spender, uint256 amount)',
19
+ 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)',
20
+ 'function setApprovalForAll(address operator, bool approved)',
21
+ 'function safeTransferFrom(address from, address to, uint256 tokenId)',
22
+ 'function safeTransferFrom(address from, address to, uint256 tokenId, bytes data)',
23
+ 'function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data)',
24
+ 'function safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data)',
25
+ 'function deposit() payable',
26
+ 'function withdraw(uint256 amount)',
27
+ ],
28
+ },
29
+ {
30
+ name: 'Uniswap V2 Router',
31
+ abi: [
32
+ 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',
33
+ 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline)',
34
+ 'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable',
35
+ 'function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline)',
36
+ 'function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',
37
+ 'function swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline) payable',
38
+ 'function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',
39
+ 'function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable',
40
+ 'function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)',
41
+ 'function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline)',
42
+ 'function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable',
43
+ 'function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline)',
44
+ 'function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline)',
45
+ 'function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline)',
46
+ ],
47
+ },
48
+ {
49
+ name: 'Uniswap V3 Router',
50
+ abi: [
51
+ // SwapRouter(struct 里有 deadline)和 SwapRouter02(没有)
52
+ 'function exactInputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable',
53
+ 'function exactInput(tuple(bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum) params) payable',
54
+ 'function exactOutputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable',
55
+ 'function exactOutput(tuple(bytes path, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum) params) payable',
56
+ 'function exactInputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable',
57
+ 'function exactInput(tuple(bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum) params) payable',
58
+ 'function exactOutputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96) params) payable',
59
+ 'function exactOutput(tuple(bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum) params) payable',
60
+ 'function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to) payable',
61
+ 'function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to) payable',
62
+ 'function multicall(uint256 deadline, bytes[] data) payable',
63
+ 'function multicall(bytes32 previousBlockhash, bytes[] data) payable',
64
+ 'function multicall(bytes[] data) payable',
65
+ 'function unwrapWETH9(uint256 amountMinimum, address recipient) payable',
66
+ 'function unwrapWETH9(uint256 amountMinimum) payable',
67
+ 'function wrapETH(uint256 value) payable',
68
+ 'function refundETH() payable',
69
+ 'function sweepToken(address token, uint256 amountMinimum, address recipient) payable',
70
+ 'function sweepToken(address token, uint256 amountMinimum) payable',
71
+ ],
72
+ },
73
+ {
74
+ name: 'Uniswap V3 Positions',
75
+ abi: [
76
+ 'function mint(tuple(address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline) params) payable',
77
+ 'function increaseLiquidity(tuple(uint256 tokenId, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, uint256 deadline) params) payable',
78
+ 'function decreaseLiquidity(tuple(uint256 tokenId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min, uint256 deadline) params) payable',
79
+ 'function collect(tuple(uint256 tokenId, address recipient, uint128 amount0Max, uint128 amount1Max) params) payable',
80
+ 'function burn(uint256 tokenId) payable',
81
+ 'function createAndInitializePoolIfNecessary(address token0, address token1, uint24 fee, uint160 sqrtPriceX96) payable',
82
+ 'function modifyLiquidities(bytes unlockData, uint256 deadline) payable',
83
+ ],
84
+ },
85
+ {
86
+ name: 'Universal Router',
87
+ abi: ['function execute(bytes commands, bytes[] inputs, uint256 deadline) payable', 'function execute(bytes commands, bytes[] inputs) payable'],
88
+ },
89
+ {
90
+ name: 'Permit2',
91
+ abi: [
92
+ 'function approve(address token, address spender, uint160 amount, uint48 expiration)',
93
+ `function permit(address owner, tuple(${TOKEN_ID} details, address spender, uint256 sigDeadline) permitSingle, bytes signature)`,
94
+ `function permit(address owner, tuple(${TOKEN_ID}[] details, address spender, uint256 sigDeadline) permitBatch, bytes signature)`,
95
+ 'function transferFrom(address from, address to, uint160 amount, address token)',
96
+ 'function lockdown(tuple(address token, address spender)[] approvals)',
97
+ 'function invalidateNonces(address token, address spender, uint48 newNonce)',
98
+ ],
99
+ },
100
+ {
101
+ name: 'Multicall3',
102
+ abi: [
103
+ 'function aggregate(tuple(address target, bytes callData)[] calls) payable',
104
+ 'function tryAggregate(bool requireSuccess, tuple(address target, bytes callData)[] calls) payable',
105
+ 'function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) payable',
106
+ 'function aggregate3Value(tuple(address target, bool allowFailure, uint256 value, bytes callData)[] calls) payable',
107
+ ],
108
+ },
109
+ {
110
+ name: 'Disperse',
111
+ abi: ['function disperseEther(address[] recipients, uint256[] values) payable', 'function disperseToken(address token, address[] recipients, uint256[] values)'],
112
+ },
113
+ { name: 'Smart account', abi: ['function executeBatch(tuple(address target, uint256 value, bytes data)[] calls)'] },
114
+ ];
115
+ let table = null;
116
+ function entries() {
117
+ if (!table) {
118
+ table = new Map();
119
+ for (const group of GROUPS) {
120
+ const iface = new Interface(group.abi);
121
+ iface.forEachFunction((fragment) => {
122
+ // 同一个选择器的第一个为准(Token 组里的 approve / transferFrom 同时是 ERC20 和 ERC721 的)
123
+ if (!table?.has(fragment.selector))
124
+ table?.set(fragment.selector, { fragment, iface, group: group.name });
125
+ });
126
+ }
127
+ }
128
+ return table;
129
+ }
130
+ const typeOf = (method) => {
131
+ if (/^swap|^exact(Input|Output)/.test(method))
132
+ return 'swap';
133
+ if (/Liquidity|^collect$|^burn$|^mint$|^modifyLiquidities$|^createAndInitializePool/.test(method))
134
+ return 'liquidity';
135
+ if (/^(transfer|safeTransfer|safeBatchTransfer|disperse)/.test(method))
136
+ return 'transfer';
137
+ if (/^(approve|permit|setApprovalForAll|increaseAllowance|decreaseAllowance|lockdown|invalidate)/.test(method))
138
+ return 'approve';
139
+ return 'contract';
140
+ };
141
+ /** 子调用里最重要的类型,决定外层 multicall 的类型 */
142
+ const PRIORITY = ['swap', 'liquidity', 'transfer', 'approve', 'contract', 'unknown'];
143
+ /** Universal Router 的命令字节(低 6 位)→ 名字 */
144
+ const UR_COMMANDS = {
145
+ 0x00: 'V3_SWAP_EXACT_IN',
146
+ 0x01: 'V3_SWAP_EXACT_OUT',
147
+ 0x02: 'PERMIT2_TRANSFER_FROM',
148
+ 0x03: 'PERMIT2_PERMIT_BATCH',
149
+ 0x04: 'SWEEP',
150
+ 0x05: 'TRANSFER',
151
+ 0x06: 'PAY_PORTION',
152
+ 0x08: 'V2_SWAP_EXACT_IN',
153
+ 0x09: 'V2_SWAP_EXACT_OUT',
154
+ 0x0a: 'PERMIT2_PERMIT',
155
+ 0x0b: 'WRAP_ETH',
156
+ 0x0c: 'UNWRAP_WETH',
157
+ 0x0d: 'PERMIT2_TRANSFER_FROM_BATCH',
158
+ 0x0e: 'BALANCE_CHECK_ERC20',
159
+ 0x10: 'V4_SWAP',
160
+ 0x11: 'V3_POSITION_MANAGER_PERMIT',
161
+ 0x12: 'V3_POSITION_MANAGER_CALL',
162
+ 0x13: 'V4_INITIALIZE_POOL',
163
+ 0x14: 'V4_POSITION_MANAGER_CALL',
164
+ 0x21: 'EXECUTE_SUB_PLAN',
165
+ };
166
+ const urType = (name) => (/SWAP/.test(name) ? 'swap' : /POSITION_MANAGER_CALL/.test(name) ? 'liquidity' : /PERMIT/.test(name) ? 'approve' : /TRANSFER|SWEEP|PAY_PORTION/.test(name) ? 'transfer' : 'contract');
167
+ const MAX_DEPTH = 2;
168
+ /** 参数转成可 JSON 序列化的值(bigint → 字符串,Result → 数组 / 对象) */
169
+ function plain(value) {
170
+ if (typeof value === 'bigint')
171
+ return value.toString();
172
+ if (Array.isArray(value))
173
+ return value.map(plain);
174
+ if (value && typeof value === 'object' && typeof value.toObject === 'function')
175
+ return plain(value.toObject());
176
+ return value;
177
+ }
178
+ const short = (a) => `${a.slice(0, 6)}…${a.slice(-4)}`;
179
+ /**
180
+ * 解码一笔交易的 calldata。`to` 和 `chainId` 用来按内置协议表给 Router 标协议名。
181
+ *
182
+ * ```ts
183
+ * decodeCalldata(data, { to: router, chainId: 1 })
184
+ * // { type: 'swap', protocol: 'Uniswap SwapRouter02', method: 'exactInputSingle', summary: 'Uniswap SwapRouter02 exactInputSingle', args: {…} }
185
+ * ```
186
+ */
187
+ export function decodeCalldata(data, ctx = {}, depth = 0) {
188
+ const hex = data && data !== '0x' ? data : '0x';
189
+ const name = ctx.to && ctx.chainId !== undefined ? knownSpenders(ctx.chainId).find((s) => s.address.toLowerCase() === ctx.to?.toLowerCase())?.name : undefined;
190
+ if (hex === '0x') {
191
+ return ctx.value && ctx.value > 0n ? { type: 'transfer', method: 'transfer', summary: `Send native token${ctx.to ? ` to ${short(ctx.to)}` : ''}`, args: { to: ctx.to, value: ctx.value.toString() } } : { type: 'unknown', summary: 'Empty call' };
192
+ }
193
+ if (hex.length < 10)
194
+ return { type: 'unknown', summary: 'Unknown call', args: { selector: hex } };
195
+ const selector = dataSlice(hex, 0, 4);
196
+ const entry = entries().get(selector);
197
+ if (!entry)
198
+ return { type: 'unknown', ...(name ? { protocol: name } : {}), summary: `Unknown method ${selector}${name ? ` on ${name}` : ''}`, args: { selector } };
199
+ const method = entry.fragment.name;
200
+ const args = {};
201
+ let parsed;
202
+ try {
203
+ parsed = entry.iface.decodeFunctionData(entry.fragment, hex);
204
+ // Result 按需解码,数据残缺时在读取参数时才报错
205
+ entry.fragment.inputs.forEach((input, i) => {
206
+ args[input.name || String(i)] = plain(parsed[i]);
207
+ });
208
+ }
209
+ catch {
210
+ return { type: 'unknown', ...(name ? { protocol: name } : {}), summary: `Undecodable ${method} call`, args: { selector, method } };
211
+ }
212
+ const protocol = name ?? (entry.group === 'Token' ? undefined : entry.group);
213
+ let type = typeOf(method);
214
+ const out = { type, ...(protocol ? { protocol } : {}), method, summary: protocol ? `${protocol} ${method}` : method, args };
215
+ // 子调用:multicall / aggregate / executeBatch / Universal Router
216
+ if (depth < MAX_DEPTH) {
217
+ const inner = innerCalls(method, parsed, ctx.chainId, depth);
218
+ if (inner?.length) {
219
+ out.calls = inner;
220
+ type = PRIORITY.find((t) => inner.some((c) => c.type === t)) ?? 'contract';
221
+ out.type = type;
222
+ out.summary = `${protocol ? `${protocol} ` : ''}${method}: ${inner.map((c) => c.method ?? 'unknown').join(' + ')}`;
223
+ }
224
+ }
225
+ return out;
226
+ }
227
+ function innerCalls(method, parsed, chainId, depth) {
228
+ const sub = (to, data, value) => decodeCalldata(data, { to, chainId, value }, depth + 1);
229
+ if (method === 'multicall') {
230
+ const list = parsed[parsed.length - 1];
231
+ return list.map((d) => sub(undefined, d));
232
+ }
233
+ if (method === 'aggregate' || method === 'tryAggregate' || method === 'aggregate3' || method === 'aggregate3Value') {
234
+ const calls = parsed[parsed.length - 1];
235
+ return calls.map((c) => sub(c.target, c.callData, c.value));
236
+ }
237
+ if (method === 'executeBatch')
238
+ return parsed[0].map((c) => sub(c.target, c.data, c.value));
239
+ if (method === 'execute') {
240
+ const commands = parsed[0].slice(2).match(/../g) ?? [];
241
+ return commands.map((byte) => {
242
+ const cmd = UR_COMMANDS[Number.parseInt(byte, 16) & 0x3f] ?? `COMMAND_0x${byte}`;
243
+ return { type: urType(cmd), method: cmd, summary: cmd };
244
+ });
245
+ }
246
+ return null;
247
+ }
248
+ // ---------------------------------------------------------------------------
249
+ // revert 原因
250
+ // ---------------------------------------------------------------------------
251
+ const customErrors = new Interface([
252
+ // Universal Router
253
+ 'error ExecutionFailed(uint256 commandIndex, bytes message)',
254
+ 'error InvalidCommandType(uint256 commandType)',
255
+ 'error TransactionDeadlinePassed()',
256
+ 'error V3TooLittleReceived()',
257
+ 'error V3TooMuchRequested()',
258
+ 'error V2TooLittleReceived()',
259
+ 'error V2TooMuchRequested()',
260
+ 'error V3InvalidSwap()',
261
+ 'error InsufficientETH()',
262
+ 'error InsufficientToken()',
263
+ 'error BalanceTooLow()',
264
+ 'error InvalidBips()',
265
+ 'error LengthMismatch()',
266
+ // Permit2
267
+ 'error AllowanceExpired(uint256 deadline)',
268
+ 'error InsufficientAllowance(uint256 amount)',
269
+ 'error InvalidSigner()',
270
+ 'error InvalidNonce()',
271
+ 'error SignatureExpired(uint256 signatureDeadline)',
272
+ // OpenZeppelin 5
273
+ 'error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)',
274
+ 'error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)',
275
+ 'error ERC20InvalidSender(address sender)',
276
+ 'error ERC20InvalidReceiver(address receiver)',
277
+ 'error ERC721InsufficientApproval(address operator, uint256 tokenId)',
278
+ 'error ERC721NonexistentToken(uint256 tokenId)',
279
+ 'error OwnableUnauthorizedAccount(address account)',
280
+ 'error EnforcedPause()',
281
+ 'error ReentrancyGuardReentrantCall()',
282
+ 'error AddressEmptyCode(address target)',
283
+ 'error SafeERC20FailedOperation(address token)',
284
+ 'error FailedCall()',
285
+ ]);
286
+ const PANIC = {
287
+ '1': 'assertion failed',
288
+ '17': 'arithmetic overflow / underflow',
289
+ '18': 'division by zero',
290
+ '33': 'invalid enum value',
291
+ '50': 'array index out of bounds',
292
+ '65': 'out of memory',
293
+ };
294
+ /**
295
+ * revert 数据 → 可读的原因:Error(string)、Panic(带含义),常见的自定义错误(Universal Router、Permit2、OpenZeppelin)带参数,
296
+ * 认不出的是 `custom error 0x选择器`。没有数据时返回 null
297
+ */
298
+ export function decodeRevert(data, depth = 0) {
299
+ if (!data || data === '0x' || data.length < 10)
300
+ return null;
301
+ const basic = decodeRevertReason(data);
302
+ if (basic) {
303
+ const panic = /^Panic\((\d+)\)$/.exec(basic);
304
+ return panic ? `${basic}${PANIC[panic[1]] ? ` ${PANIC[panic[1]]}` : ''}` : basic;
305
+ }
306
+ try {
307
+ const parsed = customErrors.parseError(data);
308
+ if (parsed) {
309
+ if (parsed.name === 'ExecutionFailed' && depth < 2) {
310
+ const inner = decodeRevert(String(parsed.args[1]), depth + 1);
311
+ return `ExecutionFailed(command ${parsed.args[0]}${inner ? `: ${inner}` : ''})`;
312
+ }
313
+ return `${parsed.name}(${parsed.args.map((a) => String(a)).join(', ')})`;
314
+ }
315
+ }
316
+ catch {
317
+ // 落到下面
318
+ }
319
+ return `custom error ${dataSlice(data, 0, 4)}`;
320
+ }
321
+ //# sourceMappingURL=simulateDecode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulateDecode.js","sourceRoot":"","sources":["../src/simulateDecode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { WriteRpc } from '../write/rpc.js';
2
+ import type { EntryPointVersion } from './userOp.js';
3
+ /** eth-infinitism 的 SimpleAccountFactory(account-abstraction v0.7 / v0.8),各主流链上地址相同 */
4
+ export declare const SIMPLE_ACCOUNT_FACTORY_V07 = "0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985";
5
+ export declare const SIMPLE_ACCOUNT_FACTORY_V08 = "0x13E9ed32155810FDbd067D4522C492D6f68E5944";
6
+ /**
7
+ * 账户类型:
8
+ * - 'simple':eth-infinitism SimpleAccount,工厂按 owner + salt 生成的合约账户(首次使用时随 UserOperation 部署)。账户地址不是 owner 的地址,资产要放在账户里
9
+ * - 'simple7702':钱包自己(EOA 通过 EIP-7702 委托给 Simple7702Account),UserOperation 的 sender 就是钱包地址,只能用 EntryPoint v0.8
10
+ */
11
+ export type SmartAccountKind = 'simple' | 'simple7702';
12
+ export interface BatchItem {
13
+ to: string;
14
+ value: bigint;
15
+ data: string;
16
+ }
17
+ /** 账户执行一批调用的 calldata(v0.8 的账户用 Call[],v0.7 的 SimpleAccount 用三个数组) */
18
+ export declare function encodeExecuteBatch(version: EntryPointVersion, calls: readonly BatchItem[]): string;
19
+ export declare function defaultFactory(version: EntryPointVersion): string;
20
+ export interface CounterfactualAccount {
21
+ address: string;
22
+ deployed: boolean;
23
+ factory: string;
24
+ /** 还没部署时的 createAccount calldata */
25
+ factoryData: string;
26
+ }
27
+ /** SimpleAccount 的地址(部署前就能算出来:向工厂 getAddress)和部署状态 */
28
+ export declare function resolveSimpleAccount(rpc: WriteRpc, owner: string, version: EntryPointVersion, salt?: bigint | number | string, factory?: string): Promise<CounterfactualAccount>;
29
+ /** 查询账户地址(不发送任何东西),传入 owner 地址 */
30
+ export declare function getSimpleAccountAddress(rpc: WriteRpc, owner: string, version?: EntryPointVersion, salt?: bigint | number | string, factory?: string): Promise<string>;
31
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/smartAccount/account.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,uFAAuF;AACvF,eAAO,MAAM,0BAA0B,+CAA+C,CAAA;AACtF,eAAO,MAAM,0BAA0B,+CAA+C,CAAA;AAEtF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,YAAY,CAAA;AAQtD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAKlG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAEjE;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,sDAAsD;AACtD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,GAAE,MAAM,GAAG,MAAM,GAAG,MAAW,EAAE,OAAO,SAA0B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAQ3M;AAED,kCAAkC;AAClC,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAyB,EAAE,IAAI,GAAE,MAAM,GAAG,MAAM,GAAG,MAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtL"}
@@ -0,0 +1,33 @@
1
+ import { Interface, getAddress } from 'ethers';
2
+ /** eth-infinitism 的 SimpleAccountFactory(account-abstraction v0.7 / v0.8),各主流链上地址相同 */
3
+ export const SIMPLE_ACCOUNT_FACTORY_V07 = '0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985';
4
+ export const SIMPLE_ACCOUNT_FACTORY_V08 = '0x13E9ed32155810FDbd067D4522C492D6f68E5944';
5
+ const factoryInterface = new Interface(['function createAccount(address owner, uint256 salt) returns (address)', 'function getAddress(address owner, uint256 salt) view returns (address)']);
6
+ const callTuple = '(address target, uint256 value, bytes data)[]';
7
+ const batchV08 = new Interface([`function executeBatch(${callTuple} calls)`]);
8
+ const batchV07 = new Interface(['function executeBatch(address[] dest, uint256[] value, bytes[] func)']);
9
+ /** 账户执行一批调用的 calldata(v0.8 的账户用 Call[],v0.7 的 SimpleAccount 用三个数组) */
10
+ export function encodeExecuteBatch(version, calls) {
11
+ if (version === '0.8') {
12
+ return batchV08.encodeFunctionData('executeBatch', [calls.map((c) => [c.to, c.value, c.data])]);
13
+ }
14
+ return batchV07.encodeFunctionData('executeBatch', [calls.map((c) => c.to), calls.map((c) => c.value), calls.map((c) => c.data)]);
15
+ }
16
+ export function defaultFactory(version) {
17
+ return version === '0.8' ? SIMPLE_ACCOUNT_FACTORY_V08 : SIMPLE_ACCOUNT_FACTORY_V07;
18
+ }
19
+ /** SimpleAccount 的地址(部署前就能算出来:向工厂 getAddress)和部署状态 */
20
+ export async function resolveSimpleAccount(rpc, owner, version, salt = 0n, factory = defaultFactory(version)) {
21
+ const factoryAddress = getAddress(factory);
22
+ if ((await rpc.code(factoryAddress)) === '0x') {
23
+ throw new Error(`The SimpleAccountFactory ${factoryAddress} is not deployed on chain ${rpc.chainId}; pass smartAccount.factory`);
24
+ }
25
+ const [address] = factoryInterface.decodeFunctionResult('getAddress', await rpc.call({ to: factoryAddress, data: factoryInterface.encodeFunctionData('getAddress', [owner, salt]) }));
26
+ const code = await rpc.code(address);
27
+ return { address: getAddress(address), deployed: code !== '0x', factory: factoryAddress, factoryData: factoryInterface.encodeFunctionData('createAccount', [owner, salt]) };
28
+ }
29
+ /** 查询账户地址(不发送任何东西),传入 owner 地址 */
30
+ export async function getSimpleAccountAddress(rpc, owner, version = '0.7', salt = 0n, factory) {
31
+ return (await resolveSimpleAccount(rpc, owner, version, salt, factory)).address;
32
+ }
33
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/smartAccount/account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { type UserOperation } from './userOp.js';
2
+ export interface RpcClientOptions {
3
+ /** 自定义 fetch(测试、代理) */
4
+ fetch?: typeof fetch;
5
+ /** 附加请求头(Authorization 等) */
6
+ headers?: Record<string, string>;
7
+ }
8
+ /** bundler 返回的 UserOperation 回执 */
9
+ export interface UserOperationReceipt {
10
+ userOpHash: string;
11
+ sender: string;
12
+ success: boolean;
13
+ /** 执行失败时的原因(revert 数据) */
14
+ reason?: string;
15
+ actualGasCost: bigint;
16
+ actualGasUsed: bigint;
17
+ /** 打包它的那笔交易 */
18
+ transactionHash: string;
19
+ blockNumber: number | null;
20
+ }
21
+ export interface GasEstimate {
22
+ callGasLimit: bigint;
23
+ verificationGasLimit: bigint;
24
+ preVerificationGas: bigint;
25
+ paymasterVerificationGasLimit?: bigint;
26
+ paymasterPostOpGasLimit?: bigint;
27
+ }
28
+ /**
29
+ * ERC-4337 bundler 客户端:eth_sendUserOperation / eth_estimateUserOperationGas / eth_getUserOperationReceipt / eth_supportedEntryPoints。
30
+ *
31
+ * ```ts
32
+ * const bundler = new BundlerClient('https://public.pimlico.io/v2/8453/rpc')
33
+ * await bundler.supportedEntryPoints()
34
+ * ```
35
+ */
36
+ export declare class BundlerClient {
37
+ #private;
38
+ constructor(url: string, options?: RpcClientOptions);
39
+ supportedEntryPoints(): Promise<string[]>;
40
+ chainId(): Promise<number>;
41
+ /** 估算 gas:signature 为空时用占位签名 */
42
+ estimateUserOperationGas(op: UserOperation, entryPoint: string): Promise<GasEstimate>;
43
+ /** 提交,返回 userOpHash */
44
+ sendUserOperation(op: UserOperation, entryPoint: string): Promise<string>;
45
+ /** 回执;还没上链为 null */
46
+ getUserOperationReceipt(hash: string): Promise<UserOperationReceipt | null>;
47
+ /** 轮询回执直到上链;超时返回 null(UserOperation 之后仍可能上链) */
48
+ waitForUserOperation(hash: string, options?: {
49
+ timeout?: number;
50
+ pollInterval?: number;
51
+ signal?: AbortSignal;
52
+ }): Promise<UserOperationReceipt | null>;
53
+ }
54
+ /** paymaster 返回的字段,合并进 UserOperation */
55
+ export type PaymasterFields = Pick<UserOperation, 'paymaster' | 'paymasterData' | 'paymasterVerificationGasLimit' | 'paymasterPostOpGasLimit'>;
56
+ export interface PaymasterContext {
57
+ entryPoint: string;
58
+ chainId: number;
59
+ /** 'stub':估算 gas 前,要占位数据;'final':gas 已定,要真正的签名数据 */
60
+ stage: 'stub' | 'final';
61
+ }
62
+ /** 自定义 paymaster:拿到 UserOperation 返回 paymaster 字段(verifying paymaster 自己签名、自家后端等) */
63
+ export type PaymasterHook = (op: UserOperation, context: PaymasterContext) => Promise<PaymasterFields> | PaymasterFields;
64
+ /**
65
+ * ERC-7677 paymaster 服务客户端:pm_getPaymasterStubData(估算 gas 用的占位数据)/ pm_getPaymasterData(最终数据)。
66
+ * URL / Key 由应用提供。`client.hook` 可直接作为 `paymaster` 选项
67
+ */
68
+ export declare class PaymasterClient {
69
+ #private;
70
+ /** 服务商要求的 context(如 Pimlico 的 `{ sponsorshipPolicyId }`) */
71
+ readonly context: Record<string, unknown>;
72
+ constructor(url: string,
73
+ /** 服务商要求的 context(如 Pimlico 的 `{ sponsorshipPolicyId }`) */
74
+ context?: Record<string, unknown>, options?: RpcClientOptions);
75
+ readonly hook: PaymasterHook;
76
+ }
77
+ //# sourceMappingURL=clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/smartAccount/clients.ts"],"names":[],"mappings":"AACA,OAAO,EAA6C,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3F,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAwBD,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,6BAA6B,CAAC,EAAE,MAAM,CAAA;IACtC,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC;AAED;;;;;;;GAOG;AACH,qBAAa,aAAa;;gBAEZ,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAIvD,oBAAoB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAI1B,gCAAgC;IAC1B,wBAAwB,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAY3F,uBAAuB;IACvB,iBAAiB,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzE,oBAAoB;IACd,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAoBjF,gDAAgD;IAC1C,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;CAmBhK;AAED,wCAAwC;AACxC,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,eAAe,GAAG,+BAA+B,GAAG,yBAAyB,CAAC,CAAA;AAE9I,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;CACxB;AAED,qFAAqF;AACrF,MAAM,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;AAExH;;;GAGG;AACH,qBAAa,eAAe;;IAIxB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFzC,GAAG,EAAE,MAAM;IACX,4DAA4D;IACnD,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAC9C,OAAO,GAAE,gBAAqB;IAKhC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAa3B;CACF"}