@w3lib/evm-batch-call 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +206 -1
  3. package/dist/dividends.d.ts +135 -0
  4. package/dist/dividends.d.ts.map +1 -0
  5. package/dist/dividends.js +253 -0
  6. package/dist/dividends.js.map +1 -0
  7. package/dist/history.d.ts +154 -0
  8. package/dist/history.d.ts.map +1 -0
  9. package/dist/history.js +247 -0
  10. package/dist/history.js.map +1 -0
  11. package/dist/historySources.d.ts +32 -0
  12. package/dist/historySources.d.ts.map +1 -0
  13. package/dist/historySources.js +319 -0
  14. package/dist/historySources.js.map +1 -0
  15. package/dist/liquidity/v3.d.ts +2 -0
  16. package/dist/liquidity/v3.d.ts.map +1 -1
  17. package/dist/liquidity/v3.js +1 -1
  18. package/dist/liquidity/v3.js.map +1 -1
  19. package/dist/liquidity/v4.d.ts +21 -0
  20. package/dist/liquidity/v4.d.ts.map +1 -1
  21. package/dist/liquidity/v4.js +4 -3
  22. package/dist/liquidity/v4.js.map +1 -1
  23. package/dist/lp.d.ts +8 -0
  24. package/dist/lp.d.ts.map +1 -1
  25. package/dist/lp.js +17 -1
  26. package/dist/lp.js.map +1 -1
  27. package/dist/lpV4.d.ts +4 -0
  28. package/dist/lpV4.d.ts.map +1 -1
  29. package/dist/lpV4.js +27 -3
  30. package/dist/lpV4.js.map +1 -1
  31. package/dist/permit.d.ts +137 -0
  32. package/dist/permit.d.ts.map +1 -0
  33. package/dist/permit.js +355 -0
  34. package/dist/permit.js.map +1 -0
  35. package/dist/portfolio.d.ts +2 -0
  36. package/dist/portfolio.d.ts.map +1 -1
  37. package/dist/portfolio.js +9 -4
  38. package/dist/portfolio.js.map +1 -1
  39. package/dist/rewards/farms.d.ts +26 -0
  40. package/dist/rewards/farms.d.ts.map +1 -0
  41. package/dist/rewards/farms.js +210 -0
  42. package/dist/rewards/farms.js.map +1 -0
  43. package/dist/rewards/index.d.ts +42 -0
  44. package/dist/rewards/index.d.ts.map +1 -0
  45. package/dist/rewards/index.js +382 -0
  46. package/dist/rewards/index.js.map +1 -0
  47. package/dist/rewards/types.d.ts +170 -0
  48. package/dist/rewards/types.d.ts.map +1 -0
  49. package/dist/rewards/types.js +2 -0
  50. package/dist/rewards/types.js.map +1 -0
  51. package/dist/simulate.d.ts +186 -0
  52. package/dist/simulate.d.ts.map +1 -0
  53. package/dist/simulate.js +559 -0
  54. package/dist/simulate.js.map +1 -0
  55. package/dist/simulateDecode.d.ts +33 -0
  56. package/dist/simulateDecode.d.ts.map +1 -0
  57. package/dist/simulateDecode.js +321 -0
  58. package/dist/simulateDecode.js.map +1 -0
  59. package/dist/smartAccount/account.d.ts +31 -0
  60. package/dist/smartAccount/account.d.ts.map +1 -0
  61. package/dist/smartAccount/account.js +33 -0
  62. package/dist/smartAccount/account.js.map +1 -0
  63. package/dist/smartAccount/clients.d.ts +77 -0
  64. package/dist/smartAccount/clients.d.ts.map +1 -0
  65. package/dist/smartAccount/clients.js +122 -0
  66. package/dist/smartAccount/clients.js.map +1 -0
  67. package/dist/smartAccount/eip5792.d.ts +77 -0
  68. package/dist/smartAccount/eip5792.d.ts.map +1 -0
  69. package/dist/smartAccount/eip5792.js +152 -0
  70. package/dist/smartAccount/eip5792.js.map +1 -0
  71. package/dist/smartAccount/send.d.ts +40 -0
  72. package/dist/smartAccount/send.d.ts.map +1 -0
  73. package/dist/smartAccount/send.js +271 -0
  74. package/dist/smartAccount/send.js.map +1 -0
  75. package/dist/smartAccount/userOp.d.ts +91 -0
  76. package/dist/smartAccount/userOp.d.ts.map +1 -0
  77. package/dist/smartAccount/userOp.js +124 -0
  78. package/dist/smartAccount/userOp.js.map +1 -0
  79. package/dist/subpaths/dividends.d.ts +28 -0
  80. package/dist/subpaths/dividends.d.ts.map +1 -0
  81. package/dist/subpaths/dividends.js +29 -0
  82. package/dist/subpaths/dividends.js.map +1 -0
  83. package/dist/subpaths/history.d.ts +22 -0
  84. package/dist/subpaths/history.d.ts.map +1 -0
  85. package/dist/subpaths/history.js +23 -0
  86. package/dist/subpaths/history.js.map +1 -0
  87. package/dist/subpaths/permit.d.ts +14 -0
  88. package/dist/subpaths/permit.d.ts.map +1 -0
  89. package/dist/subpaths/permit.js +14 -0
  90. package/dist/subpaths/permit.js.map +1 -0
  91. package/dist/subpaths/price.js +2 -2
  92. package/dist/subpaths/price.js.map +1 -1
  93. package/dist/subpaths/rewards.d.ts +27 -0
  94. package/dist/subpaths/rewards.d.ts.map +1 -0
  95. package/dist/subpaths/rewards.js +25 -0
  96. package/dist/subpaths/rewards.js.map +1 -0
  97. package/dist/subpaths/simulate.d.ts +25 -0
  98. package/dist/subpaths/simulate.d.ts.map +1 -0
  99. package/dist/subpaths/simulate.js +28 -0
  100. package/dist/subpaths/simulate.js.map +1 -0
  101. package/dist/subpaths/smart-account.d.ts +24 -0
  102. package/dist/subpaths/smart-account.d.ts.map +1 -0
  103. package/dist/subpaths/smart-account.js +24 -0
  104. package/dist/subpaths/smart-account.js.map +1 -0
  105. package/dist/swap.d.ts +45 -5
  106. package/dist/swap.d.ts.map +1 -1
  107. package/dist/swap.js +108 -12
  108. package/dist/swap.js.map +1 -1
  109. package/dist/write/batch.d.ts +34 -2
  110. package/dist/write/batch.d.ts.map +1 -1
  111. package/dist/write/batch.js +22 -3
  112. package/dist/write/batch.js.map +1 -1
  113. package/dist/write/collect.d.ts +9 -0
  114. package/dist/write/collect.d.ts.map +1 -1
  115. package/dist/write/collect.js +41 -1
  116. package/dist/write/collect.js.map +1 -1
  117. package/dist/write/send.d.ts +4 -0
  118. package/dist/write/send.d.ts.map +1 -1
  119. package/dist/write/send.js.map +1 -1
  120. package/dist/write/signer.d.ts +5 -1
  121. package/dist/write/signer.d.ts.map +1 -1
  122. package/dist/write/signer.js.map +1 -1
  123. package/dist/write/transfer.d.ts +5 -3
  124. package/dist/write/transfer.d.ts.map +1 -1
  125. package/dist/write/transfer.js +12 -6
  126. package/dist/write/transfer.js.map +1 -1
  127. package/package.json +35 -1
  128. package/src/dividends.ts +360 -0
  129. package/src/history.ts +367 -0
  130. package/src/historySources.ts +360 -0
  131. package/src/liquidity/v3.ts +1 -1
  132. package/src/liquidity/v4.ts +4 -3
  133. package/src/lp.ts +18 -1
  134. package/src/lpV4.ts +32 -2
  135. package/src/permit.ts +457 -0
  136. package/src/portfolio.ts +11 -4
  137. package/src/rewards/farms.ts +229 -0
  138. package/src/rewards/index.ts +431 -0
  139. package/src/rewards/types.ts +179 -0
  140. package/src/simulate.ts +727 -0
  141. package/src/simulateDecode.ts +352 -0
  142. package/src/smartAccount/account.ts +63 -0
  143. package/src/smartAccount/clients.ts +180 -0
  144. package/src/smartAccount/eip5792.ts +187 -0
  145. package/src/smartAccount/send.ts +341 -0
  146. package/src/smartAccount/userOp.ts +180 -0
  147. package/src/subpaths/dividends.ts +47 -0
  148. package/src/subpaths/history.ts +41 -0
  149. package/src/subpaths/permit.ts +39 -0
  150. package/src/subpaths/price.ts +2 -2
  151. package/src/subpaths/rewards.ts +46 -0
  152. package/src/subpaths/simulate.ts +51 -0
  153. package/src/subpaths/smart-account.ts +40 -0
  154. package/src/swap.ts +139 -18
  155. package/src/write/batch.ts +44 -5
  156. package/src/write/collect.ts +60 -1
  157. package/src/write/send.ts +4 -0
  158. package/src/write/signer.ts +5 -1
  159. package/src/write/transfer.ts +17 -10
@@ -1,5 +1,6 @@
1
1
  import { type BigNumberish } from 'ethers';
2
2
  import type { Provider } from '../provider.js';
3
+ import { type BatchCallOptions } from './batch.js';
3
4
  import { type SendOptions, type TronSendOptions, type WriteResult } from './send.js';
4
5
  import { type SignerInput } from './signer.js';
5
6
  /**
@@ -21,10 +22,11 @@ export interface TransferItem {
21
22
  * - 'disperse'(默认):通过 Disperse 合约,每种代币每 batchSize 个收款人一笔交易。以下情况自动改为逐笔发送:
22
23
  * 链上没有 Disperse 合约;某种代币只有一个收款人;某一批预估 revert(收款地址拒收主币、转账收税的代币等,逐笔发送能把出问题的那一个单独标成失败)
23
24
  * - 'tx':每个收款人一笔交易
24
- * - '7702':EIP-7702 批量执行,每 batchSize 个收款人一笔(见 BatchCallOptions.mode)
25
+ * - '7702':EIP-7702 批量执行,每 batchSize 个收款人一笔(见 BatchCallOptions.mode);传 sponsor 时由 sponsor 代付 gas
26
+ * - '4337' / '5792':智能账户 UserOperation / 浏览器钱包 wallet_sendCalls,每 batchSize 个收款人一笔、原子执行(见 BatchCallOptions.mode)
25
27
  */
26
- export type TransferMode = 'disperse' | 'tx' | '7702';
27
- export interface BatchTransferOptions extends SendOptions, TronSendOptions {
28
+ export type TransferMode = 'disperse' | 'tx' | '7702' | '4337' | '5792';
29
+ export interface BatchTransferOptions extends SendOptions, TronSendOptions, Pick<BatchCallOptions, 'sponsor' | 'smartAccount' | 'eip1193' | 'atomicRequired' | 'capabilities'> {
28
30
  /** 默认转的代币,默认主币(NATIVE_TOKEN);每项也可以单独指定 token */
29
31
  token?: string;
30
32
  mode?: TransferMode;
@@ -1 +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"}
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;AAC9C,OAAO,EAA0B,KAAK,gBAAgB,EAAuB,MAAM,YAAY,CAAA;AAE/F,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;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvE,MAAM,WAAW,oBAAqB,SAAQ,WAAW,EAAE,eAAe,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,GAAG,gBAAgB,GAAG,cAAc,CAAC;IAC5K,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,CAmB7K"}
@@ -1,6 +1,6 @@
1
1
  import { Interface, getAddress, getBigInt, parseUnits } from 'ethers';
2
2
  import { ERC20_ABI, NATIVE_TOKEN, formatUnits } from '../erc20.js';
3
- import { send7702, sendEach, tronModule } from './batch.js';
3
+ import { sendByMode, tronModule } from './batch.js';
4
4
  import { WriteRpc } from './rpc.js';
5
5
  import { emptyOutcome, sendJobs, toWriteResult } from './send.js';
6
6
  import { resolveSigner } from './signer.js';
@@ -53,9 +53,15 @@ export async function batchTransfer(provider, from, recipients, options = {}) {
53
53
  }
54
54
  const rpc = await WriteRpc.from(provider);
55
55
  const signer = await resolveSigner(from);
56
- const planned = await plan(provider, signer.address, recipients, options);
57
56
  const mode = options.mode ?? 'disperse';
58
- if (mode === 'tx' || mode === '7702') {
57
+ // 4337 的 SimpleAccount:资产在账户地址里,不是 owner 的地址
58
+ let holder = signer.address;
59
+ if (mode === '4337' && (options.smartAccount?.account ?? 'simple') === 'simple') {
60
+ const { getSimpleAccountAddress } = await import('../smartAccount/account.js');
61
+ holder = await getSimpleAccountAddress(rpc, signer.address, options.smartAccount?.entryPoint ?? '0.7', options.smartAccount?.salt, options.smartAccount?.factory);
62
+ }
63
+ const planned = await plan(provider, holder, recipients, options);
64
+ if (mode !== 'disperse') {
59
65
  return sendDirect(rpc, signer, planned, mode, options);
60
66
  }
61
67
  return sendDisperse(rpc, provider, signer, planned, options);
@@ -123,7 +129,7 @@ function toTransferResult(p, result, via) {
123
129
  approvals: [],
124
130
  };
125
131
  }
126
- /** 'tx' / '7702':直接转账 */
132
+ /** 'tx' / '7702' / '4337' / '5792':直接转账 */
127
133
  async function sendDirect(rpc, signer, planned, mode, options) {
128
134
  const calls = planned.map((p) => transferCall(signer, p));
129
135
  const callOptions = {
@@ -132,7 +138,7 @@ async function sendDirect(rpc, signer, planned, mode, options) {
132
138
  continueOnError: true,
133
139
  onUpdate: options.onUpdate && ((r) => options.onUpdate?.(toTransferResult(planned[r.index], r, mode))),
134
140
  };
135
- const results = mode === '7702' ? await send7702(rpc, calls, callOptions) : await sendEach(rpc, calls, callOptions);
141
+ const results = await sendByMode(rpc, calls, callOptions);
136
142
  return results.map((r, i) => toTransferResult(planned[i], r, mode));
137
143
  }
138
144
  /** 预估 / 执行时合约 revert(换成逐笔发送可能成功,或至少能定位到是哪个收款项) */
@@ -233,7 +239,7 @@ async function sendDisperse(rpc, provider, signer, planned, options) {
233
239
  if (direct.length && !options.signal?.aborted) {
234
240
  direct.sort((a, b) => a.index - b.index);
235
241
  const calls = direct.map((p) => transferCall(signer, p));
236
- await sendEach(rpc, calls, {
242
+ await sendByMode(rpc, calls, {
237
243
  ...options,
238
244
  mode: 'tx',
239
245
  continueOnError: true,
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/write/transfer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/write/transfer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w3lib/evm-batch-call",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Batched EVM/Tron contract reads via Multicall3 with deployless fallback, native balances, RPC failover, auto-batching and staticCall simulation; batch transfer, collect and contract calls (Disperse / EIP-7702). ethcall compatible.",
5
5
  "keywords": [
6
6
  "ethers",
@@ -36,6 +36,14 @@
36
36
  "types": "./dist/subpaths/liquidity.d.ts",
37
37
  "import": "./dist/subpaths/liquidity.js"
38
38
  },
39
+ "./rewards": {
40
+ "types": "./dist/subpaths/rewards.d.ts",
41
+ "import": "./dist/subpaths/rewards.js"
42
+ },
43
+ "./dividends": {
44
+ "types": "./dist/subpaths/dividends.d.ts",
45
+ "import": "./dist/subpaths/dividends.js"
46
+ },
39
47
  "./approvals": {
40
48
  "types": "./dist/subpaths/approvals.d.ts",
41
49
  "import": "./dist/subpaths/approvals.js"
@@ -64,6 +72,22 @@
64
72
  "types": "./dist/subpaths/swap.d.ts",
65
73
  "import": "./dist/subpaths/swap.js"
66
74
  },
75
+ "./permit": {
76
+ "types": "./dist/subpaths/permit.d.ts",
77
+ "import": "./dist/subpaths/permit.js"
78
+ },
79
+ "./smart-account": {
80
+ "types": "./dist/subpaths/smart-account.d.ts",
81
+ "import": "./dist/subpaths/smart-account.js"
82
+ },
83
+ "./history": {
84
+ "types": "./dist/subpaths/history.d.ts",
85
+ "import": "./dist/subpaths/history.js"
86
+ },
87
+ "./simulate": {
88
+ "types": "./dist/subpaths/simulate.d.ts",
89
+ "import": "./dist/subpaths/simulate.js"
90
+ },
67
91
  "./write": {
68
92
  "types": "./dist/subpaths/write.d.ts",
69
93
  "import": "./dist/subpaths/write.js"
@@ -109,6 +133,16 @@
109
133
  "test:live:lp": "LIVE=1 vitest run test/lp-live.test.ts",
110
134
  "test:live:liquidity": "LIVE=1 vitest run test/liquidity-tron-live.test.ts",
111
135
  "test:fork": "vitest run test/liquidity-fork.test.ts",
136
+ "test:live:simulate": "LIVE=1 vitest run test/simulate-live.test.ts",
137
+ "test:live:history": "LIVE=1 vitest run test/history-live.test.ts",
138
+ "test:live:smart-account": "LIVE=1 vitest run test/smart-account-live.test.ts",
139
+ "test:live:rewards": "LIVE=1 vitest run test/rewards-live.test.ts",
140
+ "test:live:dividends": "LIVE=1 vitest run test/dividends-live.test.ts",
141
+ "test:fork:simulate": "vitest run test/simulate-fork.test.ts",
142
+ "test:fork:smart-account": "vitest run test/smart-account-fork.test.ts",
143
+ "test:fork:permit": "vitest run test/permit-fork.test.ts",
144
+ "test:fork:rewards": "vitest run test/rewards-fork.test.ts",
145
+ "test:fork:dividends": "vitest run test/dividends-fork.test.ts",
112
146
  "build:contracts": "node scripts/build-contracts.mjs",
113
147
  "check:rpc": "node scripts/check-rpc-nodes.mjs",
114
148
  "demo": "vite demo",
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Flap(flap.sh,BNB Chain 发币平台)的分红:持有带分红的 Flap 税收代币(FlapTaxToken)的地址按持仓比例分到税收,
3
+ * 分红放在每个代币自己的 Dividend 合约里,持有人(或任何人替持有人)调用 withdrawDividendsFor 领取。
4
+ *
5
+ * 核实过的合约(BSC 主网,2026-10 在主网分叉上实测):
6
+ * - 代币:`dividendContract()` 返回它的 Dividend 合约(Tax Token V3 总是部署;V2 只在 dividendBps > 0 时部署)
7
+ * - Dividend 合约(EIP-1167 克隆,实现 0xd67447C2…5905,Sourcify / BscScan 上未验证源码,函数靠官方文档 + 链上调用核对):
8
+ * `dividendToken()`、`weth()`、`minimumShareBalance()`、`withdrawableDividends(address)`、`withdrawnDividends(address)`、
9
+ * `withdrawDividendsFor(address)`(任何人可调,款项直接到持有人)
10
+ * - 官方 TaxTokenHelper(0x53841c73…8346)的 `getDividendInfo(token, user) → (claimed, pending)` 与上面两个函数结果一致(测试里交叉核对)
11
+ *
12
+ * 只有一种合约形态,所以只有一个适配器(flap);识别不了的代币(没有 dividendContract() 或 Dividend 合约缺函数)放进 unsupported,
13
+ * 不猜函数。
14
+ */
15
+ import { Interface, getAddress } from 'ethers'
16
+
17
+ import { NATIVE_TOKEN, formatUnits } from './erc20.js'
18
+ import type { Provider } from './provider.js'
19
+ import { runLogScan, type LogScanProgress } from './scan.js'
20
+ import type { PriceSource } from './price.js'
21
+ import { isTronChain } from './tron.js'
22
+ import type { BatchCallOptions } from './write/batch.js'
23
+ import type { WriteResult } from './write/send.js'
24
+ import type { SignerInput } from './write/signer.js'
25
+
26
+ /** 支持的链:目前只有 BSC(Flap 在 Base、X Layer 等链上也有部署,但没有核实过,不开放) */
27
+ export const FLAP_DIVIDEND_CHAINS: Readonly<Record<number, { portal: string; taxTokenHelper: string; swapRegistry: string }>> = {
28
+ 56: {
29
+ portal: '0xe2cE6ab80874Fa9Fa2aAE65D277Dd6B8e65C9De0',
30
+ taxTokenHelper: '0x53841c73217735F37BC1775538b03b23feFD8346',
31
+ swapRegistry: '0x644A8f560138418bAD4EdEFC7c17878a3c2fBEB6',
32
+ },
33
+ }
34
+
35
+ /** Flap 代币地址的靓号后缀(Portal 创建时用):税收代币是 7777,普通代币是 8888(实测也有 8888 的代币带分红合约);发现持仓时只收这类地址 */
36
+ export const FLAP_TOKEN_SUFFIXES: readonly string[] = ['7777', '8888']
37
+
38
+ const TOKEN_ABI = [
39
+ 'function dividendContract() view returns (address)',
40
+ 'function balanceOf(address) view returns (uint256)',
41
+ 'function symbol() view returns (string)',
42
+ 'function decimals() view returns (uint8)',
43
+ ]
44
+ const DIVIDEND_ABI = [
45
+ 'function dividendToken() view returns (address)',
46
+ 'function weth() view returns (address)',
47
+ 'function minimumShareBalance() view returns (uint256)',
48
+ 'function withdrawableDividends(address) view returns (uint256)',
49
+ 'function withdrawnDividends(address) view returns (uint256)',
50
+ ]
51
+ const ERC20_META_ABI = ['function symbol() view returns (string)', 'function decimals() view returns (uint8)']
52
+ const claimInterface = new Interface(['function withdrawDividendsFor(address user)'])
53
+ const ZERO = '0x0000000000000000000000000000000000000000'
54
+ const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
55
+
56
+ /** 一次最多检查的代币数(防止传入或发现的列表无限大) */
57
+ const MAX_TOKENS = 200
58
+
59
+ export interface DividendItem {
60
+ /** 持有人 */
61
+ owner: string
62
+ /** 带分红的 Flap 代币 */
63
+ token: string
64
+ symbol: string | null
65
+ decimals: number
66
+ /** 持有人当前的代币余额(可以是 0:卖掉后之前累计的分红仍可领取) */
67
+ balance: string
68
+ /** 这个代币的 Dividend 合约(领取的目标) */
69
+ dividendContract: string
70
+ /** Dividend 合约里配置的分红代币地址(WBNB 也是这个地址) */
71
+ dividendToken: string
72
+ /** 实际收到的资产:'native'(分红代币是 WBNB 时领取会解包成 BNB)或分红代币地址 */
73
+ asset: 'native' | string
74
+ assetSymbol: string | null
75
+ assetDecimals: number
76
+ /** 分红资产的 decimals 读不到(节点出错等):assetDecimals 按 18 估,claimableFormatted 可能不准,usd 固定为 null */
77
+ decimalsUnknown?: boolean
78
+ /** 当前可领取的数量(asset 的最小单位),领取时就是收到的数量 */
79
+ claimable: string
80
+ claimableFormatted: string
81
+ /** 已经领取过的累计数量 */
82
+ claimed: string
83
+ claimedFormatted: string
84
+ /** 可领取部分的美元价值;没开价格或没有价格时为 null */
85
+ usd: number | null
86
+ /** 持有人要持有至少这么多代币才会继续累计新的分红(已累计的不受影响) */
87
+ minimumShareBalance: string
88
+ /** 当前余额是否达到 minimumShareBalance(false 时新的分红不再累计,但 claimable 仍可领取) */
89
+ accruing: boolean
90
+ /** 适配器名称 */
91
+ adapter: 'flap'
92
+ }
93
+
94
+ export interface DividendUnsupported {
95
+ token: string
96
+ reason: string
97
+ }
98
+
99
+ export interface DividendScanOptions {
100
+ /** 收哪些后缀的代币地址,默认 FLAP_TOKEN_SUFFIXES */
101
+ suffixes?: readonly string[]
102
+ /** 起点区块(含);不传时往回扫 lookbackBlocks 个区块 */
103
+ fromBlock?: number
104
+ /** 不传 fromBlock 时往回扫多少个区块,默认 5000 */
105
+ lookbackBlocks?: number
106
+ /** 上次的进度(结果的 scan.progress),传了就接着扫 */
107
+ progress?: LogScanProgress
108
+ /** 单次 getLogs 的最大区块范围,默认 1000;节点有上限时自动缩小 */
109
+ blockRange?: number
110
+ /** 这次最多发多少个 getLogs,默认 10 */
111
+ maxRequests?: number
112
+ /** 这次最多花多少毫秒,默认 10000 */
113
+ timeBudget?: number
114
+ signal?: AbortSignal
115
+ }
116
+
117
+ export interface DividendsOptions {
118
+ /** 要检查的代币(Flap 代币地址)。可以和 discover 一起用 */
119
+ tokens?: readonly string[]
120
+ /** 从持有人收到过的 Transfer 事件里发现 Flap 代币(只收靓号后缀 7777 / 8888 的地址,再逐个核对;发现的代币里没有分红合约的不报告),true 用默认值 */
121
+ discover?: boolean | DividendScanOptions
122
+ /** 查分红资产的美元价格:true(默认)用 DefiLlama + 链上池子,也可以传自己的 PriceSource,false 不查 */
123
+ prices?: boolean | PriceSource
124
+ fetch?: typeof fetch
125
+ /** 包含没有可领取分红的代币(默认 false,只返回 claimable > 0 的) */
126
+ includeZero?: boolean
127
+ }
128
+
129
+ export interface DividendsResult {
130
+ items: DividendItem[]
131
+ /** 检查过但识别不了的代币(不是税收代币、没有分红合约、合约函数不符) */
132
+ unsupported: DividendUnsupported[]
133
+ /** discover 的扫描状态:cursor 是已扫到的区块,progress 可以存下来下次接着扫 */
134
+ scan?: { cursor: number; progress: LogScanProgress | null; tokens: string[] }
135
+ /** 查价格出错时的信息(这时 usd 都是 null) */
136
+ priceError?: string
137
+ }
138
+
139
+ function assertChain(chainId: number): void {
140
+ if (isTronChain(chainId) || !FLAP_DIVIDEND_CHAINS[chainId]) {
141
+ throw new Error(`Flap dividends are only supported on BNB Chain (56), got chain ${chainId}`)
142
+ }
143
+ }
144
+
145
+ /** 发现持有人收到过的 Flap 税收代币(只发现,不核对有没有分红:把 tokens 交给 dividends) */
146
+ export async function scanDividendTokens(provider: Provider, owner: string, options: DividendScanOptions = {}): Promise<{ tokens: string[]; cursor: number; progress: LogScanProgress | null }> {
147
+ assertChain(await provider.getChainId())
148
+ const ownerTopic = `0x${getAddress(owner).slice(2).toLowerCase().padStart(64, '0')}`
149
+ const lookback = Math.max(0, Math.floor(options.lookbackBlocks ?? 5000))
150
+ const suffixes = (options.suffixes ?? FLAP_TOKEN_SUFFIXES).map((x) => x.toLowerCase())
151
+ const progress = await runLogScan({
152
+ provider,
153
+ saved: options.progress,
154
+ initialCursor: (target) => (options.fromBlock !== undefined ? options.fromBlock - 1 : target - lookback),
155
+ filter: { topics: [TRANSFER_TOPIC, null, ownerTopic] },
156
+ // 只收 ERC20 的 Transfer(3 个 topic)里靓号后缀的合约
157
+ collect: (log) => (log.topics.length === 3 && suffixes.some((s) => log.address.toLowerCase().endsWith(s)) ? log.address.toLowerCase() : null),
158
+ maxRange: Math.max(1, Math.floor(options.blockRange ?? 1000)),
159
+ maxRequests: Math.max(1, Math.floor(options.maxRequests ?? 10)),
160
+ timeBudget: options.timeBudget ?? 10_000,
161
+ confirmations: 0,
162
+ ...(options.signal ? { signal: options.signal } : {}),
163
+ })
164
+ return { tokens: (progress?.items ?? []).map((a) => getAddress(a)), cursor: progress?.cursor ?? -1, progress }
165
+ }
166
+
167
+ /**
168
+ * 查持有人在 Flap 代币上的分红:余额、可领取数量、已领取数量、分红资产和美元价值。
169
+ * 代币来自 tokens 和 discover(扫描收到过的 Transfer),每个代币都在链上核对(dividendContract() + Dividend 合约的函数),
170
+ * 核对不过的放进 unsupported。不发送交易
171
+ */
172
+ export async function dividends(provider: Provider, owner: string, options: DividendsOptions = {}): Promise<DividendsResult> {
173
+ const chainId = await provider.getChainId()
174
+ assertChain(chainId)
175
+ const holder = getAddress(owner)
176
+
177
+ let scan: DividendsResult['scan']
178
+ const found = new Map<string, string>()
179
+ const explicit = new Set<string>()
180
+ for (const t of options.tokens ?? []) {
181
+ found.set(getAddress(t).toLowerCase(), getAddress(t))
182
+ explicit.add(getAddress(t).toLowerCase())
183
+ }
184
+ if (options.discover) {
185
+ const r = await scanDividendTokens(provider, holder, options.discover === true ? {} : options.discover)
186
+ scan = { cursor: r.cursor, progress: r.progress, tokens: r.tokens }
187
+ for (const t of r.tokens) found.set(t.toLowerCase(), t)
188
+ }
189
+ const tokens = [...found.values()]
190
+ if (tokens.length > MAX_TOKENS) throw new Error(`Too many tokens (${tokens.length}), at most ${MAX_TOKENS} per call`)
191
+ const result: DividendsResult = { items: [], unsupported: [], ...(scan ? { scan } : {}) }
192
+ if (!tokens.length) return result
193
+
194
+ // 第一步:代币本身(余额、精度、Dividend 合约地址)
195
+ const stage1 = await provider.tryAll(tokens.flatMap((t) => [provider.contract(t, TOKEN_ABI).dividendContract(), provider.contract(t, TOKEN_ABI).balanceOf(holder), provider.contract(t, TOKEN_ABI).symbol(), provider.contract(t, TOKEN_ABI).decimals()]))
196
+ const valid: Array<{ token: string; dividend: string; balance: bigint; symbol: string | null; decimals: number }> = []
197
+ tokens.forEach((token, i) => {
198
+ const [dividend, balance, symbol, decimals] = stage1.slice(i * 4, i * 4 + 4) as [string | null, bigint | null, string | null, bigint | null]
199
+ if (dividend === null || dividend === ZERO) {
200
+ // 发现来的代币大多不是分红代币(普通 8888 代币等),只报告用户明确传入的
201
+ if (explicit.has(token.toLowerCase())) result.unsupported.push({ token, reason: dividend === null ? 'no dividendContract() (not a Flap tax token V2/V3)' : 'token has no dividend contract' })
202
+ } else if (balance === null || decimals === null) {
203
+ result.unsupported.push({ token, reason: 'not an ERC20 token' })
204
+ } else {
205
+ valid.push({ token, dividend, balance, symbol: typeof symbol === 'string' ? symbol : null, decimals: Number(decimals) })
206
+ }
207
+ })
208
+
209
+ // 第二步:Dividend 合约(分红代币、可领取、已领取、最低持仓)
210
+ const stage2 = valid.length
211
+ ? await provider.tryAll(valid.flatMap((v) => {
212
+ const d = provider.contract(v.dividend, DIVIDEND_ABI)
213
+ return [d.dividendToken(), d.weth(), d.withdrawableDividends(holder), d.withdrawnDividends(holder), d.minimumShareBalance()]
214
+ }))
215
+ : []
216
+ const rows: Array<{ v: (typeof valid)[number]; dividendToken: string; weth: string | null; claimable: bigint; claimed: bigint; min: bigint }> = []
217
+ valid.forEach((v, i) => {
218
+ const [dividendToken, weth, claimable, claimed, min] = stage2.slice(i * 5, i * 5 + 5) as [string | null, string | null, bigint | null, bigint | null, bigint | null]
219
+ if (dividendToken === null || claimable === null || claimed === null || min === null) {
220
+ result.unsupported.push({ token: v.token, reason: 'dividend contract does not expose the expected functions (unknown generation)' })
221
+ } else {
222
+ rows.push({ v, dividendToken, weth, claimable, claimed, min })
223
+ }
224
+ })
225
+
226
+ // 第三步:分红资产的 symbol / decimals(WBNB 作为 BNB 领取:按主币处理)
227
+ const isNative = (r: (typeof rows)[number]) => r.dividendToken === ZERO || (r.weth !== null && r.dividendToken.toLowerCase() === r.weth.toLowerCase())
228
+ const assetTokens = [...new Set(rows.filter((r) => !isNative(r)).map((r) => r.dividendToken))]
229
+ const meta = new Map<string, { symbol: string | null; decimals: number; known: boolean }>()
230
+ if (assetTokens.length) {
231
+ const res = await provider.tryAll(assetTokens.flatMap((a) => [provider.contract(a, ERC20_META_ABI).symbol(), provider.contract(a, ERC20_META_ABI).decimals()]))
232
+ assetTokens.forEach((a, i) => meta.set(a, { symbol: typeof res[i * 2] === 'string' ? (res[i * 2] as string) : null, decimals: res[i * 2 + 1] === null ? 18 : Number(res[i * 2 + 1]), known: res[i * 2 + 1] !== null }))
233
+ }
234
+ const nativeMeta = { symbol: 'BNB', decimals: 18, known: true }
235
+
236
+ const items: DividendItem[] = rows.map((r) => {
237
+ const native = isNative(r)
238
+ const m = native ? nativeMeta : (meta.get(r.dividendToken) ?? { symbol: null, decimals: 18, known: false })
239
+ return {
240
+ owner: holder,
241
+ token: r.v.token,
242
+ symbol: r.v.symbol,
243
+ decimals: r.v.decimals,
244
+ balance: r.v.balance.toString(),
245
+ dividendContract: getAddress(r.v.dividend),
246
+ dividendToken: getAddress(r.dividendToken),
247
+ asset: native ? 'native' : getAddress(r.dividendToken),
248
+ assetSymbol: m.symbol,
249
+ assetDecimals: m.decimals,
250
+ ...(m.known ? {} : { decimalsUnknown: true }),
251
+ claimable: r.claimable.toString(),
252
+ claimableFormatted: formatUnits(r.claimable, m.decimals),
253
+ claimed: r.claimed.toString(),
254
+ claimedFormatted: formatUnits(r.claimed, m.decimals),
255
+ usd: null,
256
+ minimumShareBalance: r.min.toString(),
257
+ accruing: r.v.balance >= r.min && r.v.balance > 0n,
258
+ adapter: 'flap',
259
+ }
260
+ })
261
+ const shown = options.includeZero ? items : items.filter((i) => BigInt(i.claimable) > 0n)
262
+
263
+ if (options.prices !== false && shown.length) {
264
+ try {
265
+ const { tokenPrices } = await import('./price.js')
266
+ const assets = [...new Set(shown.map((i) => (i.asset === 'native' ? NATIVE_TOKEN : i.asset)))]
267
+ const prices = await tokenPrices(provider, assets, { ...(typeof options.prices === 'object' ? { sources: [options.prices] } : {}), ...(options.fetch ? { fetch: options.fetch } : {}) })
268
+ const byAsset = new Map(prices.map((p) => [p.token.toLowerCase(), p.price]))
269
+ for (const i of shown) {
270
+ if (i.decimalsUnknown) continue // 精度未知,换算不出可信的美元价值
271
+ const price = byAsset.get((i.asset === 'native' ? NATIVE_TOKEN : i.asset).toLowerCase())
272
+ i.usd = price === null || price === undefined ? null : Number(i.claimableFormatted) * price
273
+ }
274
+ } catch (err) {
275
+ result.priceError = err instanceof Error ? err.message : String(err)
276
+ }
277
+ }
278
+ result.items = shown
279
+ return result
280
+ }
281
+
282
+ // ---------------------------------------------------------------------------
283
+ // 领取
284
+ // ---------------------------------------------------------------------------
285
+
286
+ export interface ClaimDividendTx {
287
+ to: string
288
+ data: string
289
+ value: '0'
290
+ item: DividendItem
291
+ }
292
+
293
+ /**
294
+ * 领取分红要发的交易(不签名):每个代币一笔 `withdrawDividendsFor(owner)`,发给它的 Dividend 合约,款项直接到 owner。
295
+ * 只包含 claimable > 0 的项。只校验 owner / dividendContract 是合法地址,不连链:items 来自调用方,
296
+ * 要确认 dividendContract 确实是代币自己的 Dividend 合约,用 claimDividends(发送前会在链上核对)
297
+ */
298
+ export function buildClaimDividends(items: readonly DividendItem[]): ClaimDividendTx[] {
299
+ return items
300
+ .filter((item) => BigInt(item.claimable) > 0n)
301
+ .map((item) => {
302
+ if (item.adapter !== 'flap') throw new Error(`Unsupported dividend adapter for ${item.token}`)
303
+ let to: string
304
+ let owner: string
305
+ try {
306
+ to = getAddress(item.dividendContract)
307
+ owner = getAddress(item.owner)
308
+ } catch {
309
+ throw new Error(`Invalid dividendContract / owner address for ${item.token}`)
310
+ }
311
+ return { to, data: claimInterface.encodeFunctionData('withdrawDividendsFor', [owner]), value: '0' as const, item }
312
+ })
313
+ }
314
+
315
+ export interface ClaimDividendsOptions extends BatchCallOptions {
316
+ /** 发送前先用 /simulate 模拟每一笔(claimable 只是查询时的快照,可能已经变了),会 revert 的不发(结果 status 为 'skipped',error 是原因)。默认 true,false 不模拟;dryRun 只预估 gas */
317
+ simulate?: boolean
318
+ }
319
+
320
+ export interface ClaimDividendResult extends WriteResult {
321
+ item: DividendItem
322
+ }
323
+
324
+ /**
325
+ * 领取分红:构建(同 buildClaimDividends)后用 from 签名发送,钱包和选项同 batchCall
326
+ * (mode: '7702' / '4337' / '5792' 时合成一笔原子交易)。任何人都可以替持有人领取,款项直接到 item.owner,所以 from 不必是持有人(如代付 gas)。
327
+ *
328
+ * ```ts
329
+ * const { items } = await getDividends(user, { chainId: 56, discover: true })
330
+ * await claimDividends(provider, key, items, { mode: '7702' })
331
+ * ```
332
+ */
333
+ export async function claimDividends(provider: Provider, from: SignerInput, items: readonly DividendItem[], options: ClaimDividendsOptions = {}): Promise<ClaimDividendResult[]> {
334
+ assertChain(await provider.getChainId())
335
+ const { simulate: preCheck = true, ...sendOptions } = options
336
+ const txs = buildClaimDividends(items)
337
+ if (!txs.length) return []
338
+ const skipped = new Map<number, string>()
339
+ // 核对 items 里的 dividendContract 确实是代币自己的 Dividend 合约(items 来自调用方,不能直接信)
340
+ const onChain = await provider.tryAll<string>(txs.map((tx) => provider.contract(tx.item.token, TOKEN_ABI).dividendContract()))
341
+ onChain.forEach((d, i) => {
342
+ if (d === null || (txs[i] as ClaimDividendTx).to.toLowerCase() !== d.toLowerCase()) {
343
+ skipped.set(i, `dividendContract mismatch: ${(txs[i] as ClaimDividendTx).to} is not the dividend contract of ${(txs[i] as ClaimDividendTx).item.token}`)
344
+ }
345
+ })
346
+ if (preCheck) {
347
+ const { simulate } = await import('./simulate.js')
348
+ const sims = await Promise.all(txs.map((tx, i): Promise<{ success: boolean; error?: string }> => skipped.has(i) ? Promise.resolve({ success: true }) : simulate(provider, { to: tx.to, data: tx.data, from: tx.item.owner }, { usd: false, risk: false }).catch((err: unknown) => ({ success: false, error: err instanceof Error ? err.message : String(err) }))))
349
+ sims.forEach((s, i) => !s.success && skipped.set(i, s.error ?? 'simulation failed'))
350
+ }
351
+ const send = txs.map((tx, i) => ({ tx, i })).filter(({ i }) => !skipped.has(i))
352
+ const { batchCall } = await import('./write/batch.js')
353
+ const sent = send.length ? await batchCall(provider, send.map(({ tx }) => ({ from, to: tx.to, data: tx.data })), { continueOnError: true, ...sendOptions }) : []
354
+ const sentBy = new Map(send.map(({ i }, k) => [i, sent[k] as WriteResult]))
355
+ return txs.map((tx, i) => {
356
+ const r = sentBy.get(i)
357
+ if (r) return { ...r, index: i, item: tx.item }
358
+ return { index: i, from: tx.item.owner, to: tx.to, status: 'skipped', hash: null, nonce: null, gasLimit: null, gasUsed: null, fee: null, blockNumber: null, error: skipped.get(i) ?? null, item: tx.item }
359
+ })
360
+ }