four-flap-meme-sdk 2.2.2 → 2.2.4

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