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