four-flap-meme-sdk 2.2.0 → 2.2.2

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 (467) hide show
  1. package/README.en.md +6 -41
  2. package/README.md +0 -31
  3. package/README.zh-CN.md +6 -41
  4. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +26 -1
  5. package/dist/chains/bsc/four/approve-tokenmanager.js +113 -1
  6. package/dist/chains/bsc/four/config.d.ts +67 -5
  7. package/dist/chains/bsc/four/config.js +114 -2
  8. package/dist/chains/bsc/four/core.d.ts +4 -1
  9. package/dist/chains/bsc/four/core.js +592 -1
  10. package/dist/chains/bsc/four/index.d.ts +6 -6
  11. package/dist/chains/bsc/four/index.js +6 -6
  12. package/dist/chains/bsc/four/internal.d.ts +46 -2
  13. package/dist/chains/bsc/four/internal.js +239 -2
  14. package/dist/chains/bsc/four/pancake-proxy.d.ts +28 -1
  15. package/dist/chains/bsc/four/pancake-proxy.js +687 -1
  16. package/dist/chains/bsc/four/private.d.ts +27 -1
  17. package/dist/chains/bsc/four/private.js +477 -1
  18. package/dist/chains/bsc/four/submit.d.ts +315 -2
  19. package/dist/chains/bsc/four/submit.js +752 -2
  20. package/dist/chains/bsc/four/swap-buy-first.d.ts +55 -2
  21. package/dist/chains/bsc/four/swap-buy-first.js +507 -2
  22. package/dist/chains/bsc/four/swap-internal.d.ts +3 -1
  23. package/dist/chains/bsc/four/swap-internal.js +18 -1
  24. package/dist/chains/bsc/four/swap.d.ts +144 -2
  25. package/dist/chains/bsc/four/swap.js +766 -2
  26. package/dist/chains/bsc/four/types.d.ts +476 -1
  27. package/dist/chains/bsc/four/utils.d.ts +18 -5
  28. package/dist/chains/bsc/four/utils.js +1552 -5
  29. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +91 -1
  30. package/dist/chains/bsc/pancake/bundle-buy-first.js +212 -97
  31. package/dist/chains/bsc/pancake/bundle-swap.d.ts +79 -1
  32. package/dist/chains/bsc/pancake/bundle-swap.js +726 -114
  33. package/dist/chains/bsc/pancake/index.d.ts +2 -4
  34. package/dist/chains/bsc/pancake/index.js +3 -1
  35. package/dist/chains/bsc/platforms/iro/factory.js +1 -3
  36. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  37. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  38. package/dist/chains/bsc/platforms/iro/pool.js +10 -31
  39. package/dist/chains/bsc/platforms/iro/token.js +1 -4
  40. package/dist/chains/eni/batch-router/bundle-approve.js +3 -4
  41. package/dist/chains/eni/batch-router/transfer.js +25 -55
  42. package/dist/chains/eni/batch-router/utils.js +6 -32
  43. package/dist/chains/eni/bundler/sign.js +4 -4
  44. package/dist/chains/eni/bundler/submit.js +4 -1
  45. package/dist/chains/eni/constants.js +1 -1
  46. package/dist/chains/eni/index.d.ts +1 -2
  47. package/dist/chains/eni/index.js +0 -1
  48. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  49. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  50. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  51. package/dist/chains/eni/platforms/daoaas/meta.js +4 -8
  52. package/dist/chains/eni/platforms/daoaas/portal-direct.js +44 -28
  53. package/dist/chains/eni/platforms/daoaas/portal.js +6 -10
  54. package/dist/chains/eni/platforms/dswap/liquidity.js +26 -58
  55. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  56. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  57. package/dist/chains/eni/platforms/fair-launch/launcher.js +46 -87
  58. package/dist/chains/eni/platforms/fair-launch/pool.js +1 -4
  59. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  60. package/dist/chains/eni/platforms/iro/factory.js +1 -3
  61. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  62. package/dist/chains/eni/platforms/iro/index.js +4 -4
  63. package/dist/chains/eni/platforms/iro/pool.js +26 -90
  64. package/dist/chains/eni/platforms/iro/token.js +31 -107
  65. package/dist/chains/eni/platforms/iro/whitelist.js +18 -6
  66. package/dist/chains/index.d.ts +0 -13
  67. package/dist/chains/index.js +0 -13
  68. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +26 -2
  69. package/dist/chains/xlayer/eip7702/bundle-approve.js +21 -11
  70. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +6 -2
  71. package/dist/chains/xlayer/eip7702/bundle-buy.js +51 -13
  72. package/dist/chains/xlayer/eip7702/bundle-create.js +59 -93
  73. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +6 -2
  74. package/dist/chains/xlayer/eip7702/bundle-sell.js +97 -26
  75. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +65 -3
  76. package/dist/chains/xlayer/eip7702/bundle-swap.js +245 -51
  77. package/dist/chains/xlayer/eip7702/constants.d.ts +16 -1
  78. package/dist/chains/xlayer/eip7702/constants.js +21 -3
  79. package/dist/chains/xlayer/eip7702/index.d.ts +46 -28
  80. package/dist/chains/xlayer/eip7702/index.js +81 -28
  81. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +203 -2
  82. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +301 -58
  83. package/dist/chains/xlayer/eip7702/types.d.ts +0 -88
  84. package/dist/chains/xlayer/eip7702/utils.d.ts +3 -0
  85. package/dist/chains/xlayer/eip7702/utils.js +28 -23
  86. package/dist/chains/xlayer/eip7702/volume.d.ts +184 -6
  87. package/dist/chains/xlayer/eip7702/volume.js +158 -83
  88. package/dist/chains/xlayer/eoa/constants.js +1 -1
  89. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  90. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +95 -1
  91. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +299 -66
  92. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  93. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +23 -18
  94. package/dist/chains/xlayer/eoa/index.d.ts +6 -10
  95. package/dist/chains/xlayer/eoa/index.js +23 -8
  96. package/dist/chains/xlayer/eoa/portal-ops.js +2 -7
  97. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  98. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  99. package/dist/chains/xlayer/eoa/types.js +3 -1
  100. package/dist/chains/xlayer/index.d.ts +2 -3
  101. package/dist/chains/xlayer/index.js +7 -4
  102. package/dist/contracts/helper3.d.ts +5 -20
  103. package/dist/contracts/helper3.js +20 -56
  104. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +26 -1
  105. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +113 -1
  106. package/dist/contracts/tm-bundle-merkle/config.d.ts +67 -5
  107. package/dist/contracts/tm-bundle-merkle/config.js +114 -2
  108. package/dist/contracts/tm-bundle-merkle/core.d.ts +4 -1
  109. package/dist/contracts/tm-bundle-merkle/core.js +591 -1
  110. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  111. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  112. package/dist/contracts/tm-bundle-merkle/internal.d.ts +46 -2
  113. package/dist/contracts/tm-bundle-merkle/internal.js +238 -2
  114. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +28 -1
  115. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +686 -1
  116. package/dist/contracts/tm-bundle-merkle/private.d.ts +27 -1
  117. package/dist/contracts/tm-bundle-merkle/private.js +476 -1
  118. package/dist/contracts/tm-bundle-merkle/submit.d.ts +314 -3
  119. package/dist/contracts/tm-bundle-merkle/submit.js +928 -3
  120. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +55 -2
  121. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +506 -2
  122. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +3 -1
  123. package/dist/contracts/tm-bundle-merkle/swap-internal.js +18 -1
  124. package/dist/contracts/tm-bundle-merkle/swap.d.ts +144 -2
  125. package/dist/contracts/tm-bundle-merkle/swap.js +764 -2
  126. package/dist/contracts/tm-bundle-merkle/types.d.ts +476 -1
  127. package/dist/contracts/tm-bundle-merkle/utils.d.ts +18 -6
  128. package/dist/contracts/tm-bundle-merkle/utils.js +1501 -6
  129. package/dist/contracts/tm-bundle.d.ts +51 -3
  130. package/dist/contracts/tm-bundle.js +177 -108
  131. package/dist/contracts/tm.d.ts +2 -3
  132. package/dist/contracts/tm.js +32 -37
  133. package/dist/contracts/tm1.js +4 -9
  134. package/dist/contracts/tm2.js +4 -9
  135. package/dist/dex/direct-router.d.ts +125 -3
  136. package/dist/dex/direct-router.js +666 -237
  137. package/dist/flows/create.d.ts +1 -2
  138. package/dist/flows/create.js +6 -6
  139. package/dist/index.d.ts +85 -20
  140. package/dist/index.js +215 -20
  141. package/dist/shared/abis/TaxToken.json +105 -0
  142. package/dist/shared/abis/TokenManager2.json +60 -0
  143. package/dist/shared/abis/common.d.ts +83 -2
  144. package/dist/shared/abis/common.js +252 -2
  145. package/dist/shared/abis/index.d.ts +6 -5
  146. package/dist/shared/abis/index.js +7 -5
  147. package/dist/shared/clients/blockrazor.js +25 -39
  148. package/dist/shared/clients/club48.d.ts +2 -2
  149. package/dist/shared/clients/club48.js +29 -34
  150. package/dist/shared/clients/emitservice.js +0 -2
  151. package/dist/shared/clients/four.d.ts +5 -5
  152. package/dist/shared/clients/four.js +17 -21
  153. package/dist/shared/clients/merkle.js +34 -27
  154. package/dist/shared/constants/addresses.d.ts +1 -1
  155. package/dist/shared/constants/addresses.js +2 -11
  156. package/dist/shared/constants/chains.d.ts +1 -1
  157. package/dist/shared/constants/chains.js +1 -1
  158. package/dist/shared/constants/gas.d.ts +1 -1
  159. package/dist/shared/constants/gas.js +6 -2
  160. package/dist/shared/constants/index.d.ts +0 -3
  161. package/dist/shared/constants/index.js +0 -1
  162. package/dist/shared/flap/abi.js +1 -1
  163. package/dist/shared/flap/constants.d.ts +2 -1
  164. package/dist/shared/flap/constants.js +3 -2
  165. package/dist/shared/flap/curve.js +0 -3
  166. package/dist/shared/flap/errors.d.ts +4 -1
  167. package/dist/shared/flap/errors.js +1 -20
  168. package/dist/shared/flap/index.d.ts +3 -3
  169. package/dist/shared/flap/index.js +3 -3
  170. package/dist/shared/flap/meta.d.ts +18 -16
  171. package/dist/shared/flap/meta.js +17 -12
  172. package/dist/shared/flap/permit.js +2 -5
  173. package/dist/shared/flap/pinata.d.ts +4 -11
  174. package/dist/shared/flap/pinata.js +16 -21
  175. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +72 -3
  176. package/dist/shared/flap/portal-bundle-merkle/config.js +124 -4
  177. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +4 -0
  178. package/dist/shared/flap/portal-bundle-merkle/core.js +172 -92
  179. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +99 -106
  180. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +92 -100
  181. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +7 -11
  182. package/dist/shared/flap/portal-bundle-merkle/index.js +7 -4
  183. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +68 -71
  184. package/dist/shared/flap/portal-bundle-merkle/private.js +114 -61
  185. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +64 -1
  186. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +247 -66
  187. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +71 -2
  188. package/dist/shared/flap/portal-bundle-merkle/swap.js +410 -103
  189. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +7 -73
  190. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +80 -1
  191. package/dist/shared/flap/portal-bundle-merkle/utils.js +265 -145
  192. package/dist/shared/flap/portal-bundle.js +56 -55
  193. package/dist/shared/flap/portal.d.ts +3 -1
  194. package/dist/shared/flap/portal.js +25 -32
  195. package/dist/shared/flap/vanity.d.ts +5 -1
  196. package/dist/shared/flap/vanity.js +17 -6
  197. package/dist/shared/flap/vault.d.ts +124 -17
  198. package/dist/shared/flap/vault.js +148 -67
  199. package/dist/shared/four/tax-token.d.ts +1 -1
  200. package/dist/shared/four/tax-token.js +7 -27
  201. package/dist/shared/index.d.ts +0 -6
  202. package/dist/shared/index.js +0 -4
  203. package/dist/utils/airdrop-sweep.d.ts +76 -4
  204. package/dist/utils/airdrop-sweep.js +54 -40
  205. package/dist/utils/bundle-helpers.d.ts +243 -9
  206. package/dist/utils/bundle-helpers.js +584 -10
  207. package/dist/utils/constants.d.ts +61 -5
  208. package/dist/utils/constants.js +80 -5
  209. package/dist/utils/contract-factory.d.ts +4 -2
  210. package/dist/utils/contract-factory.js +18 -25
  211. package/dist/utils/erc20.d.ts +89 -7
  212. package/dist/utils/erc20.js +125 -94
  213. package/dist/utils/errors.d.ts +1 -12
  214. package/dist/utils/errors.js +1 -60
  215. package/dist/utils/holders-maker.d.ts +138 -2
  216. package/dist/utils/holders-maker.js +661 -26
  217. package/dist/utils/lp-inspect.d.ts +112 -2
  218. package/dist/utils/lp-inspect.js +223 -73
  219. package/dist/utils/mpcExclusive.d.ts +5 -2
  220. package/dist/utils/mpcExclusive.js +3 -4
  221. package/dist/utils/private-sale.d.ts +58 -2
  222. package/dist/utils/private-sale.js +15 -4
  223. package/dist/utils/provider-factory.d.ts +0 -4
  224. package/dist/utils/provider-factory.js +0 -10
  225. package/dist/utils/quote-helpers.d.ts +45 -4
  226. package/dist/utils/quote-helpers.js +74 -17
  227. package/dist/utils/stealth-transfer.d.ts +28 -2
  228. package/dist/utils/stealth-transfer.js +15 -31
  229. package/dist/utils/swap-helpers.d.ts +15 -2
  230. package/dist/utils/swap-helpers.js +10 -5
  231. package/dist/utils/wallet.d.ts +25 -2
  232. package/dist/utils/wallet.js +8 -9
  233. package/package.json +4 -159
  234. package/dist/__tests__/subpath-exports.test.d.ts +0 -1
  235. package/dist/__tests__/subpath-exports.test.js +0 -64
  236. package/dist/abis/common.d.ts +0 -85
  237. package/dist/abis/common.js +0 -260
  238. package/dist/abis/contracts/TaxToken.json +0 -969
  239. package/dist/abis/contracts/TokenManager2.json +0 -136
  240. package/dist/abis/contracts/index.d.ts +0 -5
  241. package/dist/abis/contracts/index.js +0 -5
  242. package/dist/abis/flap/index.d.ts +0 -3
  243. package/dist/abis/flap/index.js +0 -3
  244. package/dist/abis/flap/portal-events.d.ts +0 -6
  245. package/dist/abis/flap/portal-events.js +0 -17
  246. package/dist/abis/flap/portal.d.ts +0 -6
  247. package/dist/abis/flap/portal.js +0 -37
  248. package/dist/abis/flap/vault.d.ts +0 -171
  249. package/dist/abis/flap/vault.js +0 -91
  250. package/dist/abis/index.d.ts +0 -8
  251. package/dist/abis/index.js +0 -11
  252. package/dist/bundle-core/__tests__/config-helpers.test.d.ts +0 -1
  253. package/dist/bundle-core/__tests__/config-helpers.test.js +0 -28
  254. package/dist/bundle-core/__tests__/facade-parity.test.d.ts +0 -1
  255. package/dist/bundle-core/__tests__/facade-parity.test.js +0 -33
  256. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +0 -1
  257. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +0 -60
  258. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +0 -1
  259. package/dist/bundle-core/__tests__/sign-fixture.test.js +0 -220
  260. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +0 -10
  261. package/dist/bundle-core/__tests__/sign-fixtures.js +0 -16
  262. package/dist/bundle-core/config-helpers.d.ts +0 -36
  263. package/dist/bundle-core/config-helpers.js +0 -57
  264. package/dist/bundle-core/errors.d.ts +0 -50
  265. package/dist/bundle-core/errors.js +0 -34
  266. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +0 -7
  267. package/dist/bundle-core/four-meme/approve-tokenmanager.js +0 -99
  268. package/dist/bundle-core/four-meme/core-helpers.d.ts +0 -8
  269. package/dist/bundle-core/four-meme/core-helpers.js +0 -40
  270. package/dist/bundle-core/four-meme/core.d.ts +0 -4
  271. package/dist/bundle-core/four-meme/core.js +0 -515
  272. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +0 -28
  273. package/dist/bundle-core/four-meme/pancake-proxy.js +0 -679
  274. package/dist/bundle-core/four-meme/private.d.ts +0 -27
  275. package/dist/bundle-core/four-meme/private.js +0 -465
  276. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +0 -2
  277. package/dist/bundle-core/four-meme/sign-context-helpers.js +0 -2
  278. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +0 -8
  279. package/dist/bundle-core/four-meme/swap-buy-first.js +0 -493
  280. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +0 -6
  281. package/dist/bundle-core/four-meme/swap-hop-helpers.js +0 -63
  282. package/dist/bundle-core/four-meme/swap-internal.d.ts +0 -3
  283. package/dist/bundle-core/four-meme/swap-internal.js +0 -18
  284. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +0 -27
  285. package/dist/bundle-core/four-meme/swap-sign-helpers.js +0 -105
  286. package/dist/bundle-core/four-meme/swap.d.ts +0 -17
  287. package/dist/bundle-core/four-meme/swap.js +0 -505
  288. package/dist/bundle-core/four-meme/types/buy-first.d.ts +0 -50
  289. package/dist/bundle-core/four-meme/types/buy-first.js +0 -1
  290. package/dist/bundle-core/four-meme/types/core-flow.d.ts +0 -63
  291. package/dist/bundle-core/four-meme/types/core-flow.js +0 -1
  292. package/dist/bundle-core/four-meme/types/index.d.ts +0 -600
  293. package/dist/bundle-core/four-meme/types/index.js +0 -1
  294. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +0 -19
  295. package/dist/bundle-core/four-meme/types/swap-internal.js +0 -1
  296. package/dist/bundle-core/four-meme/types.d.ts +0 -1
  297. package/dist/bundle-core/four-meme/types.js +0 -1
  298. package/dist/bundle-core/four-meme/utils-disperse.d.ts +0 -7
  299. package/dist/bundle-core/four-meme/utils-disperse.js +0 -396
  300. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +0 -8
  301. package/dist/bundle-core/four-meme/utils-pairwise.js +0 -328
  302. package/dist/bundle-core/four-meme/utils-sweep.d.ts +0 -8
  303. package/dist/bundle-core/four-meme/utils-sweep.js +0 -744
  304. package/dist/bundle-core/index.d.ts +0 -8
  305. package/dist/bundle-core/index.js +0 -8
  306. package/dist/bundle-core/internal.d.ts +0 -21
  307. package/dist/bundle-core/internal.js +0 -182
  308. package/dist/bundle-core/sign-context-helpers.d.ts +0 -25
  309. package/dist/bundle-core/sign-context-helpers.js +0 -67
  310. package/dist/bundle-core/submit.d.ts +0 -293
  311. package/dist/bundle-core/submit.js +0 -727
  312. package/dist/bundle-core/types/index.d.ts +0 -8
  313. package/dist/bundle-core/types/index.js +0 -1
  314. package/dist/bundle-core/types.d.ts +0 -1
  315. package/dist/bundle-core/types.js +0 -1
  316. package/dist/chains/bsc/four/utils-disperse.d.ts +0 -1
  317. package/dist/chains/bsc/four/utils-disperse.js +0 -1
  318. package/dist/chains/bsc/four/utils-pairwise.d.ts +0 -1
  319. package/dist/chains/bsc/four/utils-pairwise.js +0 -1
  320. package/dist/chains/bsc/four/utils-sweep.d.ts +0 -1
  321. package/dist/chains/bsc/four/utils-sweep.js +0 -1
  322. package/dist/chains/bsc/iro.d.ts +0 -5
  323. package/dist/chains/bsc/iro.js +0 -4
  324. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +0 -159
  325. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +0 -117
  326. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +0 -241
  327. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +0 -565
  328. package/dist/chains/eni/flat-aliases.d.ts +0 -10
  329. package/dist/chains/eni/flat-aliases.js +0 -8
  330. package/dist/chains/eni/submit.d.ts +0 -43
  331. package/dist/chains/eni/submit.js +0 -286
  332. package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +0 -13
  333. package/dist/chains/xlayer/eip7702/flat-aliases.js +0 -10
  334. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +0 -79
  335. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +0 -1
  336. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +0 -26
  337. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +0 -57
  338. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +0 -148
  339. package/dist/chains/xlayer/eip7702/volume-helpers.js +0 -48
  340. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +0 -126
  341. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +0 -228
  342. package/dist/contracts/tm-bundle-helpers.d.ts +0 -88
  343. package/dist/contracts/tm-bundle-helpers.js +0 -72
  344. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +0 -1
  345. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +0 -1
  346. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +0 -1
  347. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +0 -1
  348. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +0 -1
  349. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +0 -1
  350. package/dist/dex/direct-router-helpers.d.ts +0 -264
  351. package/dist/dex/direct-router-helpers.js +0 -539
  352. package/dist/dex/types.d.ts +0 -81
  353. package/dist/dex/types.js +0 -1
  354. package/dist/exports/root-bundle-and-tooling.d.ts +0 -27
  355. package/dist/exports/root-bundle-and-tooling.js +0 -30
  356. package/dist/exports/root-eni-and-bsc-iro.d.ts +0 -26
  357. package/dist/exports/root-eni-and-bsc-iro.js +0 -66
  358. package/dist/exports/root-foundations.d.ts +0 -35
  359. package/dist/exports/root-foundations.js +0 -70
  360. package/dist/exports/root-swap-dex-and-xlayer.d.ts +0 -30
  361. package/dist/exports/root-swap-dex-and-xlayer.js +0 -78
  362. package/dist/flap/index.d.ts +0 -10
  363. package/dist/flap/index.js +0 -8
  364. package/dist/flows/index.d.ts +0 -1
  365. package/dist/flows/index.js +0 -1
  366. package/dist/merkle/index.d.ts +0 -12
  367. package/dist/merkle/index.js +0 -11
  368. package/dist/shared/clients/index.d.ts +0 -8
  369. package/dist/shared/clients/index.js +0 -8
  370. package/dist/shared/constants/quote.d.ts +0 -30
  371. package/dist/shared/constants/quote.js +0 -37
  372. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +0 -32
  373. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +0 -83
  374. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +0 -125
  375. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +0 -113
  376. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +0 -149
  377. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +0 -259
  378. package/dist/shared/foundation/dex/v3-path.d.ts +0 -6
  379. package/dist/shared/foundation/dex/v3-path.js +0 -35
  380. package/dist/shared/foundation/gas/bundle-gas.d.ts +0 -39
  381. package/dist/shared/foundation/gas/bundle-gas.js +0 -93
  382. package/dist/shared/foundation/gas/profit-hop.d.ts +0 -20
  383. package/dist/shared/foundation/gas/profit-hop.js +0 -72
  384. package/dist/shared/foundation/index.d.ts +0 -13
  385. package/dist/shared/foundation/index.js +0 -12
  386. package/dist/shared/foundation/nonce/nonce-manager.d.ts +0 -17
  387. package/dist/shared/foundation/nonce/nonce-manager.js +0 -180
  388. package/dist/shared/foundation/normalize-unknown.d.ts +0 -9
  389. package/dist/shared/foundation/normalize-unknown.js +0 -29
  390. package/dist/shared/foundation/sdk-logger.d.ts +0 -13
  391. package/dist/shared/foundation/sdk-logger.js +0 -12
  392. package/dist/shared/foundation/tx/build-request.d.ts +0 -17
  393. package/dist/shared/foundation/tx/build-request.js +0 -25
  394. package/dist/shared/foundation/tx/sign-batch.d.ts +0 -5
  395. package/dist/shared/foundation/tx/sign-batch.js +0 -26
  396. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +0 -1
  397. package/dist/shared/foundation/tx/wallet-sign-patch.js +0 -18
  398. package/dist/shared/foundation/types/airdrop-sweep.d.ts +0 -79
  399. package/dist/shared/foundation/types/airdrop-sweep.js +0 -1
  400. package/dist/shared/foundation/types/erc20.d.ts +0 -65
  401. package/dist/shared/foundation/types/erc20.js +0 -1
  402. package/dist/shared/foundation/types/holders-maker.d.ts +0 -64
  403. package/dist/shared/foundation/types/holders-maker.js +0 -1
  404. package/dist/shared/foundation/types/index.d.ts +0 -7
  405. package/dist/shared/foundation/types/index.js +0 -1
  406. package/dist/shared/foundation/types/lp-inspect.d.ts +0 -102
  407. package/dist/shared/foundation/types/lp-inspect.js +0 -1
  408. package/dist/shared/foundation/types/multicall.d.ts +0 -5
  409. package/dist/shared/foundation/types/multicall.js +0 -1
  410. package/dist/shared/foundation/types/private-sale.d.ts +0 -35
  411. package/dist/shared/foundation/types/private-sale.js +0 -1
  412. package/dist/shared/foundation/types/quote-helpers.d.ts +0 -17
  413. package/dist/shared/foundation/types/quote-helpers.js +0 -1
  414. package/dist/types/errors.d.ts +0 -27
  415. package/dist/types/errors.js +0 -34
  416. package/dist/utils/holders-maker/addresses.d.ts +0 -12
  417. package/dist/utils/holders-maker/addresses.js +0 -15
  418. package/dist/utils/holders-maker/buy-tx.d.ts +0 -44
  419. package/dist/utils/holders-maker/buy-tx.js +0 -278
  420. package/dist/utils/holders-maker/constants.d.ts +0 -6
  421. package/dist/utils/holders-maker/constants.js +0 -7
  422. package/dist/utils/holders-maker/disperse.d.ts +0 -18
  423. package/dist/utils/holders-maker/disperse.js +0 -90
  424. package/dist/utils/holders-maker/routing.d.ts +0 -4
  425. package/dist/utils/holders-maker/routing.js +0 -45
  426. package/dist/utils/holders-maker/transfer-tx.d.ts +0 -4
  427. package/dist/utils/holders-maker/transfer-tx.js +0 -67
  428. package/dist/utils/holders-maker-helpers.d.ts +0 -9
  429. package/dist/utils/holders-maker-helpers.js +0 -9
  430. package/dist/utils/hop-chains.d.ts +0 -35
  431. package/dist/utils/hop-chains.js +0 -215
  432. package/dist/utils/lp-inspect-helpers.d.ts +0 -9
  433. package/dist/utils/lp-inspect-helpers.js +0 -109
  434. package/dist/utils/types/airdrop-sweep.d.ts +0 -1
  435. package/dist/utils/types/airdrop-sweep.js +0 -1
  436. package/dist/utils/types/contract-factory.d.ts +0 -1
  437. package/dist/utils/types/contract-factory.js +0 -1
  438. package/dist/utils/types/erc20.d.ts +0 -1
  439. package/dist/utils/types/erc20.js +0 -1
  440. package/dist/utils/types/errors.d.ts +0 -1
  441. package/dist/utils/types/errors.js +0 -1
  442. package/dist/utils/types/holders-maker.d.ts +0 -1
  443. package/dist/utils/types/holders-maker.js +0 -1
  444. package/dist/utils/types/hop-chains.d.ts +0 -8
  445. package/dist/utils/types/hop-chains.js +0 -1
  446. package/dist/utils/types/index.d.ts +0 -13
  447. package/dist/utils/types/index.js +0 -1
  448. package/dist/utils/types/lp-inspect.d.ts +0 -1
  449. package/dist/utils/types/lp-inspect.js +0 -1
  450. package/dist/utils/types/mpc-exclusive.d.ts +0 -5
  451. package/dist/utils/types/mpc-exclusive.js +0 -1
  452. package/dist/utils/types/private-sale.d.ts +0 -1
  453. package/dist/utils/types/private-sale.js +0 -1
  454. package/dist/utils/types/quote-helpers.d.ts +0 -1
  455. package/dist/utils/types/quote-helpers.js +0 -1
  456. package/dist/utils/types/stealth-transfer.d.ts +0 -44
  457. package/dist/utils/types/stealth-transfer.js +0 -1
  458. package/dist/utils/types/wallet.d.ts +0 -25
  459. package/dist/utils/types/wallet.js +0 -1
  460. package/dist/vanity/index.d.ts +0 -5
  461. package/dist/vanity/index.js +0 -5
  462. package/src/abis/contracts/TaxToken.json +0 -969
  463. package/src/abis/contracts/TokenManager.json +0 -836
  464. package/src/abis/contracts/TokenManager2.json +0 -136
  465. package/src/abis/contracts/TokenManagerHelper3.json +0 -993
  466. /package/dist/{abis/contracts → shared/abis}/TokenManager.json +0 -0
  467. /package/dist/{abis/contracts → shared/abis}/TokenManagerHelper3.json +0 -0
@@ -1,28 +1,103 @@
1
1
  /**
2
- * multi-hop-transfer - 主函数
2
+ * EIP-7702 转账功能
3
+ *
4
+ * 支持三种模式:
5
+ * 1. 分散 (disperse): 一对多分发资金
6
+ * 2. 归集 (sweep): 多对一收集资金
7
+ * 3. 多对多 (pairwise): sender[i] → receiver[i] 一一对应转账
8
+ *
9
+ * 所有模式都支持:
10
+ * - 原生 OKB 转账
11
+ * - ERC20 代币转账
12
+ * - 可选的多跳混淆
13
+ *
14
+ * 只生成签名,由调用方决定如何提交
3
15
  */
4
16
  import { ethers, Contract } from 'ethers';
5
- import { createWallet, signAuthorizationsWithNonces, batchGetNonces, buildEIP7702TransactionSync } from './utils.js';
6
- import { ERC20_ABI, XLAYER_CHAIN_ID } from './constants.js';
17
+ import { getCachedProvider, createWallet, signAuthorizationsWithNonces, batchGetNonces, buildEIP7702TransactionSync, generateRandomWallets, getProfitRecipient, } from './utils.js';
18
+ import { UNIFIED_DELEGATE_ADDRESS, UNIFIED_DELEGATE_ABI, ERC20_ABI, XLAYER_CHAIN_ID, } from './constants.js';
7
19
  import { calculateTransferFee } from '../../../shared/constants/index.js';
8
- import { createEip7702DelegateContext, generateHopWalletMatrix, isNativeTransferToken, normalizePairwiseAmounts, parseTransferAmountsWei, resolveDispersePayerWallets, resolveListPayerWallet, } from './transfer-context-helpers.js';
20
+ /**
21
+ * 分散资金 - 一对多分发
22
+ *
23
+ * 支持:原生 OKB / ERC20 代币 + 可选多跳
24
+ *
25
+ * 流程(无多跳):主钱包 → 多个接收者
26
+ * 流程(有多跳):主钱包 → hop1 → hop2 → ... → 分发给接收者
27
+ *
28
+ * @example
29
+ * // 原生 OKB 直接分发
30
+ * const result = await disperse({
31
+ * mainPrivateKey: '0x...',
32
+ * recipients: ['0xAAA', '0xBBB', '0xCCC'],
33
+ * amounts: ['0.1', '0.2', '0.3'],
34
+ * });
35
+ *
36
+ * @example
37
+ * // 原生 OKB 多跳分发
38
+ * const result = await disperse({
39
+ * mainPrivateKey: '0x...',
40
+ * recipients: ['0xAAA', '0xBBB'],
41
+ * amounts: ['0.5', '0.5'],
42
+ * hopCount: 2,
43
+ * });
44
+ *
45
+ * @example
46
+ * // ERC20 代币分发
47
+ * const result = await disperse({
48
+ * mainPrivateKey: '0x...',
49
+ * recipients: ['0xAAA', '0xBBB'],
50
+ * amounts: ['100', '200'],
51
+ * tokenAddress: '0xTOKEN...',
52
+ * tokenDecimals: 18,
53
+ * hopCount: 2,
54
+ * });
55
+ */
9
56
  export async function disperse(params) {
10
57
  const { mainPrivateKey, payerPrivateKey, recipients, amounts, tokenAddress, tokenDecimals = 18, hopCount = 0, userType, config, } = params;
11
58
  if (recipients.length !== amounts.length) {
12
59
  throw new Error('recipients 和 amounts 长度必须相同');
13
60
  }
14
- const { provider, delegateAddress, delegateInterface, profitRecipient } = createEip7702DelegateContext(config);
15
- const { mainWallet, payerWallet, txSender } = resolveDispersePayerWallets(mainPrivateKey, payerPrivateKey, provider);
16
- const isNative = isNativeTransferToken(tokenAddress);
17
- const { allHopWalletInfos, allHopWallets } = generateHopWalletMatrix(recipients.length, hopCount, provider);
18
- const amountsWei = parseTransferAmountsWei(amounts, isNative, tokenDecimals);
61
+ const provider = getCachedProvider(config?.rpcUrl);
62
+ const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
63
+ const delegateInterface = new ethers.Interface(UNIFIED_DELEGATE_ABI);
64
+ // mainWallet: 资金来源(Token/OKB 从这里转出)
65
+ const mainWallet = createWallet(mainPrivateKey, provider);
66
+ const isNative = !tokenAddress;
67
+ const profitRecipient = getProfitRecipient(config);
68
+ // ✅ 支持单独的 Payer 钱包(用于支付 gas)
69
+ const hasSeparatePayer = payerPrivateKey && payerPrivateKey !== mainPrivateKey;
70
+ const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
71
+ const txSender = payerWallet ?? mainWallet; // 交易发起者
72
+ console.log(`[disperse] 资金钱包: ${mainWallet.address}`);
73
+ console.log(`[disperse] Gas Payer: ${txSender.address}${hasSeparatePayer ? ' (独立 Payer)' : ''}`);
74
+ // ✅ 为每个接收者生成独立的中间钱包链
75
+ // 每个接收者有自己的 hopCount 个中间钱包
76
+ const allHopWalletInfos = [];
77
+ const allHopWallets = [];
78
+ for (let i = 0; i < recipients.length; i++) {
79
+ if (hopCount > 0) {
80
+ const hopInfos = generateRandomWallets(hopCount);
81
+ allHopWalletInfos.push(hopInfos);
82
+ allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
83
+ }
84
+ else {
85
+ allHopWalletInfos.push([]);
86
+ allHopWallets.push([]);
87
+ }
88
+ }
89
+ // 解析金额
90
+ const amountsWei = amounts.map(amt => isNative ? ethers.parseEther(amt) : ethers.parseUnits(amt, tokenDecimals));
19
91
  const totalAmount = amountsWei.reduce((sum, amt) => sum + amt, 0n);
20
92
  // ✅ 按地址数量收取固定费用(原生 OKB)
21
93
  const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, recipients.length);
94
+ console.log(`[disperse] 按地址收费: ${recipients.length} 个地址 × ${ethers.formatEther(calculateTransferFee(XLAYER_CHAIN_ID, 1))} = ${ethers.formatEther(profitAmountOkb)} OKB`);
22
95
  // ========================================
23
96
  // 并行获取数据
24
97
  // ========================================
25
- const addressesToGetNonces = payerWallet ? [payerWallet.address, mainWallet.address] : [mainWallet.address];
98
+ const addressesToGetNonces = payerWallet
99
+ ? [payerWallet.address, mainWallet.address]
100
+ : [mainWallet.address];
26
101
  const [allNoncesResult, feeData] = await Promise.all([
27
102
  batchGetNonces(addressesToGetNonces, provider),
28
103
  provider.getFeeData(),
@@ -41,7 +116,8 @@ export async function disperse(params) {
41
116
  allNonces.push(0);
42
117
  }
43
118
  }
44
- const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0);
119
+ const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0 // txSender(Payer 或 mainWallet)是交易发起者
120
+ );
45
121
  // ========================================
46
122
  // 同步构建调用
47
123
  // ========================================
@@ -79,7 +155,11 @@ export async function disperse(params) {
79
155
  target: mainWallet.address,
80
156
  allowFailure: false,
81
157
  value: 0n,
82
- callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, recipient, amtWei]),
158
+ callData: delegateInterface.encodeFunctionData('executeTransfer', [
159
+ tokenAddress,
160
+ recipient,
161
+ amtWei,
162
+ ]),
83
163
  });
84
164
  }
85
165
  }
@@ -132,7 +212,11 @@ export async function disperse(params) {
132
212
  target: mainWallet.address,
133
213
  allowFailure: false,
134
214
  value: 0n,
135
- callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, firstHop.address, amtWei]),
215
+ callData: delegateInterface.encodeFunctionData('executeTransfer', [
216
+ tokenAddress,
217
+ firstHop.address,
218
+ amtWei,
219
+ ]),
136
220
  });
137
221
  // 中间钱包之间转账
138
222
  for (let j = 0; j < hopWallets.length - 1; j++) {
@@ -151,7 +235,10 @@ export async function disperse(params) {
151
235
  target: lastHop.address,
152
236
  allowFailure: false,
153
237
  value: 0n,
154
- callData: delegateInterface.encodeFunctionData('executeTransferAll', [tokenAddress, recipient]),
238
+ callData: delegateInterface.encodeFunctionData('executeTransferAll', [
239
+ tokenAddress,
240
+ recipient,
241
+ ]),
155
242
  });
156
243
  }
157
244
  }
@@ -166,13 +253,14 @@ export async function disperse(params) {
166
253
  value: 0n,
167
254
  callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
168
255
  });
256
+ console.log(`[disperse] 已添加利润转账调用: ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
169
257
  }
170
258
  // ========================================
171
259
  // 构建交易
172
260
  // ========================================
173
261
  // ✅ Payer 模式下 value 为 0(资金从 mainWallet 转出,不是 Payer)
174
262
  // 无 Payer 时,原生币分发需要传递 value(资金从 txSender 转出)
175
- const totalValue = isNative && !payerWallet ? totalAmount : 0n;
263
+ const totalValue = (isNative && !payerWallet) ? totalAmount : 0n;
176
264
  const signedTransaction = buildEIP7702TransactionSync(txSender, // ✅ 使用 txSender(Payer 或 mainWallet)发起交易
177
265
  authorizations, calls, totalValue, payerNonce, // ✅ 使用 txSender 的 nonce
178
266
  feeData, config);
@@ -194,44 +282,95 @@ export async function disperse(params) {
194
282
  },
195
283
  };
196
284
  }
197
- // ========================================
198
- // 归集 (Sweep) - 多对一
199
- // ========================================
285
+ /**
286
+ * 归集资金 - 多对一收集
287
+ *
288
+ * 支持:原生 OKB / ERC20 代币 + 可选多跳
289
+ *
290
+ * 流程(无多跳):多个源钱包 → 目标地址
291
+ * 流程(有多跳):多个源钱包 → hop1 → hop2 → ... → 目标地址
292
+ *
293
+ * @example
294
+ * // 原生 OKB 直接归集
295
+ * const result = await sweep({
296
+ * targetAddress: '0xTARGET',
297
+ * sourcePrivateKeys: ['0x...', '0x...'],
298
+ * });
299
+ *
300
+ * @example
301
+ * // 原生 OKB 多跳归集
302
+ * const result = await sweep({
303
+ * targetAddress: '0xTARGET',
304
+ * sourcePrivateKeys: ['0x...', '0x...'],
305
+ * hopCount: 2,
306
+ * });
307
+ *
308
+ * @example
309
+ * // ERC20 代币归集
310
+ * const result = await sweep({
311
+ * targetAddress: '0xTARGET',
312
+ * sourcePrivateKeys: ['0x...', '0x...'],
313
+ * tokenAddress: '0xTOKEN...',
314
+ * tokenDecimals: 18,
315
+ * hopCount: 2,
316
+ * });
317
+ */
200
318
  export async function sweep(params) {
201
319
  const { targetAddress, sourcePrivateKeys, payerPrivateKey, tokenAddress, tokenDecimals = 18, hopCount = 0, reserveGas = true, percent = 100, userType, config, } = params;
202
- const { provider, delegateAddress, delegateInterface, profitRecipient } = createEip7702DelegateContext(config);
203
- const sourceWallets = sourcePrivateKeys.map((pk) => createWallet(pk, provider));
204
- const isNative = isNativeTransferToken(tokenAddress);
205
- const { allHopWalletInfos, allHopWallets } = generateHopWalletMatrix(sourceWallets.length, hopCount, provider);
206
- const { payerWallet } = resolveListPayerWallet(sourcePrivateKeys, payerPrivateKey, provider);
320
+ const provider = getCachedProvider(config?.rpcUrl);
321
+ const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
322
+ const delegateInterface = new ethers.Interface(UNIFIED_DELEGATE_ABI);
323
+ const sourceWallets = sourcePrivateKeys.map(pk => createWallet(pk, provider));
324
+ const isNative = !tokenAddress;
325
+ const profitRecipient = getProfitRecipient(config);
326
+ // ✅ 为每个源钱包生成独立的中间钱包链
327
+ const allHopWalletInfos = [];
328
+ const allHopWallets = [];
329
+ for (let i = 0; i < sourceWallets.length; i++) {
330
+ if (hopCount > 0) {
331
+ const hopInfos = generateRandomWallets(hopCount);
332
+ allHopWalletInfos.push(hopInfos);
333
+ allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
334
+ }
335
+ else {
336
+ allHopWalletInfos.push([]);
337
+ allHopWallets.push([]);
338
+ }
339
+ }
340
+ // ✅ 支持单独的 Payer 钱包(用于支付 gas)
341
+ const hasSeparatePayer = payerPrivateKey && !sourcePrivateKeys.includes(payerPrivateKey);
342
+ const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
207
343
  const mainWallet = payerWallet ?? sourceWallets[0];
208
344
  // ========================================
209
345
  // 并行获取数据
210
346
  // ========================================
211
- const sourceAddresses = sourceWallets.map((w) => w.address);
212
- const addressesToGetNonces = payerWallet ? [payerWallet.address, ...sourceAddresses] : sourceAddresses;
213
- const parallelPromises = [batchGetNonces(addressesToGetNonces, provider), provider.getFeeData()];
347
+ const sourceAddresses = sourceWallets.map(w => w.address);
348
+ const addressesToGetNonces = payerWallet
349
+ ? [payerWallet.address, ...sourceAddresses]
350
+ : sourceAddresses;
351
+ const parallelPromises = [
352
+ batchGetNonces(addressesToGetNonces, provider),
353
+ provider.getFeeData(),
354
+ ];
214
355
  if (isNative) {
215
- parallelPromises.push(Promise.all(sourceWallets.map((w) => provider.getBalance(w.address))));
356
+ parallelPromises.push(Promise.all(sourceWallets.map(w => provider.getBalance(w.address))));
216
357
  }
217
358
  else {
218
- if (!tokenAddress)
219
- throw new Error('tokenAddress is required for ERC20 sweep');
220
359
  const tokenContract = new Contract(tokenAddress, ERC20_ABI, provider);
221
- parallelPromises.push(Promise.all(sourceWallets.map((w) => tokenContract.balanceOf(w.address))));
360
+ parallelPromises.push(Promise.all(sourceWallets.map(w => tokenContract.balanceOf(w.address))));
222
361
  }
223
362
  const results = await Promise.all(parallelPromises);
224
363
  const allNoncesResult = results[0];
225
364
  const payerNonce = payerWallet ? allNoncesResult[0] : allNoncesResult[0];
226
365
  const nonces = payerWallet ? allNoncesResult.slice(1) : allNoncesResult;
227
366
  const feeData = results[1];
228
- const balances = results[2].map((b) => typeof b === 'bigint' ? b : BigInt(b.toString()));
367
+ const balances = results[2].map(b => typeof b === 'bigint' ? b : BigInt(b.toString()));
229
368
  // 计算转账金额
230
369
  // ✅ 修复:当 percent=100 时,不预留 gas,归集全部余额
231
370
  const isFullSweep = percent >= 100;
232
- const gasReserve = reserveGas && isNative && !isFullSweep ? ethers.parseEther('0.001') : 0n;
371
+ const gasReserve = (reserveGas && isNative && !isFullSweep) ? ethers.parseEther('0.001') : 0n;
233
372
  const percentBigInt = BigInt(Math.min(100, Math.max(1, percent)));
234
- const transferAmounts = balances.map((b) => {
373
+ const transferAmounts = balances.map(b => {
235
374
  if (isFullSweep) {
236
375
  // 100% 归集:使用全部余额
237
376
  return b;
@@ -242,6 +381,7 @@ export async function sweep(params) {
242
381
  const totalAmount = transferAmounts.reduce((sum, amt) => sum + amt, 0n);
243
382
  // ✅ 按地址数量收取固定费用(原生 OKB)
244
383
  const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, sourceWallets.length);
384
+ console.log(`[sweep] 按地址收费: ${sourceWallets.length} 个地址 × ${ethers.formatEther(calculateTransferFee(XLAYER_CHAIN_ID, 1))} = ${ethers.formatEther(profitAmountOkb)} OKB`);
245
385
  // ✅ 找出归集金额最大的钱包(用于支付 OKB 利润)
246
386
  let maxSweepIndex = -1;
247
387
  let maxSweepAmount = 0n;
@@ -262,7 +402,7 @@ export async function sweep(params) {
262
402
  if (amount <= 0n)
263
403
  continue;
264
404
  // ✅ 使用 Payer 时所有源钱包都用自己的余额(value: 0n)
265
- const callValue = payerWallet || i > 0 ? 0n : amount;
405
+ const callValue = (payerWallet || i > 0) ? 0n : amount;
266
406
  if (hopCount === 0 || hopWallets.length === 0) {
267
407
  // ========================================
268
408
  // 直接归集:源钱包 → 目标地址
@@ -275,6 +415,7 @@ export async function sweep(params) {
275
415
  value: 0n,
276
416
  callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
277
417
  });
418
+ console.log(`[sweep] 钱包 ${i} 转利润: ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
278
419
  }
279
420
  if (isNative) {
280
421
  // ✅ 原生 OKB 归集
@@ -291,7 +432,11 @@ export async function sweep(params) {
291
432
  target: sourceWallet.address,
292
433
  allowFailure: false,
293
434
  value: 0n,
294
- callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, targetAddress, amount]),
435
+ callData: delegateInterface.encodeFunctionData('executeTransfer', [
436
+ tokenAddress,
437
+ targetAddress,
438
+ amount,
439
+ ]),
295
440
  });
296
441
  }
297
442
  }
@@ -309,6 +454,7 @@ export async function sweep(params) {
309
454
  value: 0n,
310
455
  callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
311
456
  });
457
+ console.log(`[sweep] 钱包 ${i} 转利润(多跳): ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
312
458
  }
313
459
  if (isNative) {
314
460
  // 源钱包 → 第一个中间钱包
@@ -343,7 +489,11 @@ export async function sweep(params) {
343
489
  target: sourceWallet.address,
344
490
  allowFailure: false,
345
491
  value: 0n,
346
- callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, firstHop.address, amount]),
492
+ callData: delegateInterface.encodeFunctionData('executeTransfer', [
493
+ tokenAddress,
494
+ firstHop.address,
495
+ amount,
496
+ ]),
347
497
  });
348
498
  // 中间钱包之间转账
349
499
  for (let j = 0; j < hopWallets.length - 1; j++) {
@@ -362,7 +512,10 @@ export async function sweep(params) {
362
512
  target: lastHop.address,
363
513
  allowFailure: false,
364
514
  value: 0n,
365
- callData: delegateInterface.encodeFunctionData('executeTransferAll', [tokenAddress, targetAddress]),
515
+ callData: delegateInterface.encodeFunctionData('executeTransferAll', [
516
+ tokenAddress,
517
+ targetAddress,
518
+ ]),
366
519
  });
367
520
  }
368
521
  }
@@ -385,12 +538,13 @@ export async function sweep(params) {
385
538
  allNonces.push(0);
386
539
  }
387
540
  }
388
- const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0);
541
+ const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0 // mainWallet 是交易发起者
542
+ );
389
543
  // ========================================
390
544
  // 同步构建交易
391
545
  // ========================================
392
546
  // ✅ Payer 模式下 value 为 0(资金来自源钱包)
393
- const totalValue = isNative && !payerWallet ? transferAmounts[0] : 0n;
547
+ const totalValue = (isNative && !payerWallet) ? transferAmounts[0] : 0n;
394
548
  const signedTransaction = buildEIP7702TransactionSync(mainWallet, authorizations, calls, totalValue, payerWallet ? payerNonce : nonces[0], feeData, config);
395
549
  // ✅ 返回所有中间钱包(扁平化)
396
550
  const flatHopWallets = allHopWalletInfos.flat();
@@ -410,9 +564,41 @@ export async function sweep(params) {
410
564
  },
411
565
  };
412
566
  }
413
- // ========================================
414
- // 多对多 (Pairwise) - sender[i] → receiver[i]
415
- // ========================================
567
+ /**
568
+ * 多对多转账 - sender[i] → receiver[i] 一一对应
569
+ *
570
+ * 支持:原生 OKB / ERC20 代币 + 可选多跳
571
+ *
572
+ * 每对都有独立的多跳链:sender → hop1 → hop2 → ... → receiver
573
+ *
574
+ * @example
575
+ * // 原生 OKB 多对多(直接转账)
576
+ * const result = await pairwiseTransfer({
577
+ * senderPrivateKeys: ['0xA...', '0xB...', '0xC...'],
578
+ * receiverAddresses: ['0x111', '0x222', '0x333'],
579
+ * amount: '0.1',
580
+ * });
581
+ *
582
+ * @example
583
+ * // 原生 OKB 多对多(带多跳)
584
+ * const result = await pairwiseTransfer({
585
+ * senderPrivateKeys: ['0xA...', '0xB...'],
586
+ * receiverAddresses: ['0x111', '0x222'],
587
+ * amounts: ['0.1', '0.2'],
588
+ * hopCount: 2, // A → hop1 → hop2 → 111, B → hop3 → hop4 → 222
589
+ * });
590
+ *
591
+ * @example
592
+ * // ERC20 多对多(带多跳)
593
+ * const result = await pairwiseTransfer({
594
+ * senderPrivateKeys: ['0xA...', '0xB...'],
595
+ * receiverAddresses: ['0x111', '0x222'],
596
+ * amount: '100',
597
+ * tokenAddress: '0xTOKEN...',
598
+ * tokenDecimals: 18,
599
+ * hopCount: 2,
600
+ * });
601
+ */
416
602
  export async function pairwiseTransfer(params) {
417
603
  const { senderPrivateKeys, receiverAddresses, payerPrivateKey, amount, amounts, tokenAddress, tokenDecimals = 18, hopCount = 0, userType, config, } = params;
418
604
  // 验证参数
@@ -423,24 +609,59 @@ export async function pairwiseTransfer(params) {
423
609
  if (pairCount === 0) {
424
610
  throw new Error('至少需要一对发送者/接收者');
425
611
  }
426
- const normalizedAmounts = normalizePairwiseAmounts(pairCount, amount, amounts);
427
- const { provider, delegateAddress, delegateInterface, profitRecipient } = createEip7702DelegateContext(config);
428
- const isNative = isNativeTransferToken(tokenAddress);
429
- const senderWallets = senderPrivateKeys.map((pk) => createWallet(pk, provider));
430
- const { payerWallet } = resolveListPayerWallet(senderPrivateKeys, payerPrivateKey, provider);
612
+ // 解析金额
613
+ const normalizedAmounts = (() => {
614
+ if (amounts && amounts.length > 0) {
615
+ if (amounts.length !== pairCount) {
616
+ throw new Error(`amounts 长度 (${amounts.length}) 必须与对数 (${pairCount}) 相同`);
617
+ }
618
+ return amounts;
619
+ }
620
+ if (amount !== undefined && amount.trim().length > 0) {
621
+ return new Array(pairCount).fill(amount);
622
+ }
623
+ throw new Error('必须提供 amount 或 amounts');
624
+ })();
625
+ const provider = getCachedProvider(config?.rpcUrl);
626
+ const delegateAddress = (config?.delegateAddress && config.delegateAddress.trim()) || UNIFIED_DELEGATE_ADDRESS;
627
+ const delegateInterface = new ethers.Interface(UNIFIED_DELEGATE_ABI);
628
+ const isNative = !tokenAddress;
629
+ const profitRecipient = getProfitRecipient(config);
630
+ // 创建钱包
631
+ const senderWallets = senderPrivateKeys.map(pk => createWallet(pk, provider));
632
+ // ✅ 支持单独的 Payer 钱包(用于支付 gas)
633
+ const hasSeparatePayer = payerPrivateKey && !senderPrivateKeys.includes(payerPrivateKey);
634
+ const payerWallet = hasSeparatePayer ? createWallet(payerPrivateKey, provider) : null;
431
635
  const mainWallet = payerWallet ?? senderWallets[0];
432
- const { allHopWalletInfos, allHopWallets } = generateHopWalletMatrix(pairCount, hopCount, provider);
433
- const amountsWei = parseTransferAmountsWei(normalizedAmounts, isNative, tokenDecimals);
636
+ // 为每对生成独立的中间钱包链
637
+ const allHopWalletInfos = [];
638
+ const allHopWallets = [];
639
+ for (let i = 0; i < pairCount; i++) {
640
+ if (hopCount > 0) {
641
+ const hopInfos = generateRandomWallets(hopCount);
642
+ allHopWalletInfos.push(hopInfos);
643
+ allHopWallets.push(hopInfos.map(info => createWallet(info.privateKey, provider)));
644
+ }
645
+ else {
646
+ allHopWalletInfos.push([]);
647
+ allHopWallets.push([]);
648
+ }
649
+ }
650
+ // 解析金额为 Wei
651
+ const amountsWei = normalizedAmounts.map(amt => isNative ? ethers.parseEther(amt) : ethers.parseUnits(amt, tokenDecimals));
434
652
  const totalAmount = amountsWei.reduce((sum, amt) => sum + amt, 0n);
435
653
  // ✅ 按地址数量收取固定费用(原生 OKB)
436
654
  const profitAmountOkb = calculateTransferFee(XLAYER_CHAIN_ID, pairCount);
655
+ console.log(`[pairwiseTransfer] 按地址收费: ${pairCount} 个地址 × ${ethers.formatEther(calculateTransferFee(XLAYER_CHAIN_ID, 1))} = ${ethers.formatEther(profitAmountOkb)} OKB`);
437
656
  // ✅ 使用第一个发送者支付 OKB 利润
438
657
  const maxTransferIndex = 0;
439
658
  // ========================================
440
659
  // 并行获取数据
441
660
  // ========================================
442
- const senderAddresses = senderWallets.map((w) => w.address);
443
- const addressesToGetNonces = payerWallet ? [payerWallet.address, ...senderAddresses] : senderAddresses;
661
+ const senderAddresses = senderWallets.map(w => w.address);
662
+ const addressesToGetNonces = payerWallet
663
+ ? [payerWallet.address, ...senderAddresses]
664
+ : senderAddresses;
444
665
  const [allNoncesResult, feeData] = await Promise.all([
445
666
  batchGetNonces(addressesToGetNonces, provider),
446
667
  provider.getFeeData(),
@@ -472,8 +693,10 @@ export async function pairwiseTransfer(params) {
472
693
  value: 0n,
473
694
  callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
474
695
  });
696
+ console.log(`[pairwiseTransfer] 发送者 ${i} 转利润: ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
475
697
  }
476
698
  if (isNative) {
699
+ // ✅ 使用 transferAmount 转移指定金额(而不是 transferTo 全额)
477
700
  calls.push({
478
701
  target: senderWallet.address,
479
702
  allowFailure: false,
@@ -487,7 +710,11 @@ export async function pairwiseTransfer(params) {
487
710
  target: senderWallet.address,
488
711
  allowFailure: false,
489
712
  value: 0n,
490
- callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, receiver, amtWei]),
713
+ callData: delegateInterface.encodeFunctionData('executeTransfer', [
714
+ tokenAddress,
715
+ receiver,
716
+ amtWei,
717
+ ]),
491
718
  });
492
719
  }
493
720
  }
@@ -505,15 +732,18 @@ export async function pairwiseTransfer(params) {
505
732
  value: 0n,
506
733
  callData: delegateInterface.encodeFunctionData('transferAmount', [profitRecipient, profitAmountOkb]),
507
734
  });
735
+ console.log(`[pairwiseTransfer] 发送者 ${i} 转利润(多跳): ${ethers.formatEther(profitAmountOkb)} OKB → ${profitRecipient}`);
508
736
  }
509
737
  if (isNative) {
510
738
  // 原生 OKB 多跳
739
+ // ✅ sender → 第一个中间钱包(使用 transferAmount 转移指定金额)
511
740
  calls.push({
512
741
  target: senderWallet.address,
513
742
  allowFailure: false,
514
743
  value: shouldPassValue ? amtWei : 0n,
515
744
  callData: delegateInterface.encodeFunctionData('transferAmount', [firstHop.address, amtWei]),
516
745
  });
746
+ // 中间钱包之间转账(使用 transferTo,因为中间钱包只有这笔钱)
517
747
  for (let j = 0; j < hopWallets.length - 1; j++) {
518
748
  calls.push({
519
749
  target: hopWallets[j].address,
@@ -522,6 +752,7 @@ export async function pairwiseTransfer(params) {
522
752
  callData: delegateInterface.encodeFunctionData('transferTo', [hopWallets[j + 1].address]),
523
753
  });
524
754
  }
755
+ // 最后一个中间钱包 → receiver(使用 transferTo 转移全部)
525
756
  calls.push({
526
757
  target: lastHop.address,
527
758
  allowFailure: false,
@@ -536,7 +767,11 @@ export async function pairwiseTransfer(params) {
536
767
  target: senderWallet.address,
537
768
  allowFailure: false,
538
769
  value: 0n,
539
- callData: delegateInterface.encodeFunctionData('executeTransfer', [tokenAddress, firstHop.address, amtWei]),
770
+ callData: delegateInterface.encodeFunctionData('executeTransfer', [
771
+ tokenAddress,
772
+ firstHop.address,
773
+ amtWei,
774
+ ]),
540
775
  });
541
776
  // 中间钱包之间转账
542
777
  for (let j = 0; j < hopWallets.length - 1; j++) {
@@ -555,7 +790,10 @@ export async function pairwiseTransfer(params) {
555
790
  target: lastHop.address,
556
791
  allowFailure: false,
557
792
  value: 0n,
558
- callData: delegateInterface.encodeFunctionData('executeTransferAll', [tokenAddress, receiver]),
793
+ callData: delegateInterface.encodeFunctionData('executeTransferAll', [
794
+ tokenAddress,
795
+ receiver,
796
+ ]),
559
797
  });
560
798
  }
561
799
  }
@@ -564,20 +802,25 @@ export async function pairwiseTransfer(params) {
564
802
  // 同步签署授权(已有 nonce)
565
803
  // ========================================
566
804
  // ✅ 如果有单独的 Payer,需要为 Payer 也生成授权
567
- const allWallets = payerWallet ? [payerWallet, ...senderWallets] : [...senderWallets];
568
- const allNonces = payerWallet ? [payerNonce, ...nonces] : [...nonces];
805
+ const allWallets = payerWallet
806
+ ? [payerWallet, ...senderWallets]
807
+ : [...senderWallets];
808
+ const allNonces = payerWallet
809
+ ? [payerNonce, ...nonces]
810
+ : [...nonces];
569
811
  for (const hopWallets of allHopWallets) {
570
812
  for (const hopWallet of hopWallets) {
571
813
  allWallets.push(hopWallet);
572
814
  allNonces.push(0);
573
815
  }
574
816
  }
575
- const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0);
817
+ const authorizations = signAuthorizationsWithNonces(allWallets, allNonces, delegateAddress, 0 // mainWallet(可能是 Payer 或第一个发送者钱包)是交易发起者
818
+ );
576
819
  // ========================================
577
820
  // 同步构建交易
578
821
  // ========================================
579
822
  // ✅ Payer 模式下 value 为 0(资金来自发送者钱包)
580
- const totalValue = isNative && !payerWallet ? totalAmount : 0n;
823
+ const totalValue = (isNative && !payerWallet) ? totalAmount : 0n;
581
824
  const signedTransaction = buildEIP7702TransactionSync(mainWallet, authorizations, calls, totalValue, payerWallet ? payerNonce : nonces[0], feeData, config);
582
825
  return {
583
826
  signedTransaction,