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,180 +1,32 @@
1
- import { ethers, Wallet } from 'ethers';
2
- import { getOptimizedGasPrice, NonceManager, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
3
- import { ADDRESSES } from '../../../utils/constants.js';
4
- import { GAS_LIMITS, PROFIT_CONFIG, calculateTransferFee } from '../../constants/index.js';
5
- import { MULTICALL3_ABI, ERC20_BALANCE_ABI } from '../../abis/common.js';
6
- import { getTxType, getGasPriceConfig, shouldExtractProfit, getProfitRecipient } from './config.js';
7
- // ==================== 链配置 ====================
8
- const CHAIN_ID_MAP = {
9
- 'BSC': 56,
10
- 'MONAD': 143,
11
- 'XLAYER': 196
12
- };
13
- // ==================== 链常量 ====================
14
- // ✅ 使用公共模块
15
- const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
16
- // ==================== 内部辅助函数 ====================
17
- const decimalsCache = new Map();
18
- async function getErc20Decimals(provider, token) {
19
- const network = await provider.getNetwork();
20
- const key = `${network.chainId}_${token.toLowerCase()}`;
21
- if (decimalsCache.has(key))
22
- return decimalsCache.get(key);
23
- try {
24
- const erc20 = new ethers.Contract(token, ['function decimals() view returns (uint8)'], provider);
25
- const d = await erc20.decimals();
26
- if (!Number.isFinite(d) || d < 0 || d > 36)
27
- return 18;
28
- decimalsCache.set(key, d);
29
- return d;
30
- }
31
- catch {
32
- return 18;
33
- }
34
- }
35
- /**
36
- * ✅ 生成多跳中间钱包(返回完整钱包信息:地址 + 私钥)
37
- */
38
- function generateHopWallets(recipientCount, hopCount) {
39
- const hopCounts = Array.isArray(hopCount) ? hopCount : new Array(recipientCount).fill(hopCount);
40
- if (hopCounts.every(h => h <= 0))
41
- return null;
42
- const result = [];
43
- for (let i = 0; i < recipientCount; i++) {
44
- const chain = [];
45
- for (let j = 0; j < hopCounts[i]; j++) {
46
- const wallet = Wallet.createRandom();
47
- chain.push({
48
- address: wallet.address,
49
- privateKey: wallet.privateKey
50
- });
51
- }
52
- result.push(chain);
53
- }
54
- return result;
55
- }
56
- function normalizeAmounts(recipients, amount, amounts) {
57
- if (amounts && amounts.length > 0) {
58
- if (amounts.length !== recipients.length) {
59
- throw new Error(`amounts length (${amounts.length}) must match recipients length (${recipients.length})`);
60
- }
61
- return amounts;
62
- }
63
- if (amount !== undefined && amount.trim().length > 0) {
64
- return new Array(recipients.length).fill(amount);
65
- }
66
- throw new Error('Either amount or amounts must be provided');
67
- }
68
- async function batchGetBalances(provider, addresses, tokenAddress) {
69
- if (addresses.length === 0)
70
- return [];
71
- if (!tokenAddress) {
72
- return Promise.all(addresses.map(addr => provider.getBalance(addr).catch(() => 0n)));
73
- }
74
- else {
75
- // ✅ 使用公共模块
76
- const multicall = new ethers.Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
77
- const iface = new ethers.Interface(ERC20_BALANCE_ABI);
78
- const calls = addresses.map(addr => ({
79
- target: tokenAddress,
80
- allowFailure: true,
81
- callData: iface.encodeFunctionData('balanceOf', [addr])
82
- }));
83
- try {
84
- const results = await multicall.aggregate3(calls);
85
- return results.map((result) => {
86
- if (result.success) {
87
- return iface.decodeFunctionResult('balanceOf', result.returnData)[0];
88
- }
89
- return 0n;
90
- });
91
- }
92
- catch {
93
- const fallbackCalls = addresses.map(addr => provider
94
- .call({ to: tokenAddress, data: iface.encodeFunctionData('balanceOf', [addr]) })
95
- .then(raw => iface.decodeFunctionResult('balanceOf', raw)[0])
96
- .catch(() => 0n));
97
- return Promise.all(fallbackCalls);
98
- }
99
- }
100
- }
101
- /**
102
- * 计算 Gas Limit
103
- * - 原生代币转账:21000 gas(固定)
104
- * - ERC20 标准 transfer:约 45000-55000 gas,使用 55000 作为安全值
105
- *
106
- * ✅ 优化:降低 ERC20 gas limit,减少中转钱包 BNB 残留
107
- */
108
- function calculateGasLimit(config, isNative, hasHops, _hopCount = 0) {
109
- if (config.gasLimit !== undefined) {
110
- return BigInt(config.gasLimit);
111
- }
112
- // ✅ 原生代币: 21000, ERC20 标准 transfer: 48000(USDT 最低约 46815)
113
- const baseGas = isNative ? 21000 : 48000;
114
- // ✅ 多跳时每个中转钱包只执行一笔 transfer,使用较小的安全系数
115
- const multiplier = config.gasLimitMultiplier ?? 1.1;
116
- return BigInt(Math.ceil(baseGas * multiplier));
117
- }
118
- function isNativeTokenAddress(tokenAddress) {
119
- if (!tokenAddress)
120
- return true;
121
- const v = tokenAddress.trim().toLowerCase();
122
- if (!v)
123
- return true;
124
- if (v === 'native')
125
- return true;
126
- if (v === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')
127
- return true;
128
- return false;
129
- }
130
- // ==================== 分散函数 ====================
131
1
  /**
132
- * Flap Protocol: 分散(仅签名版本)
133
- * ✅ 支持利润提取(按地址数量收取固定费用)
134
- * ✅ 支持多跳
135
- * ✅ 支持 Multicall3 批量获取余额
2
+ * utils - 主函数
136
3
  */
4
+ import { ethers, Wallet } from 'ethers';
5
+ import { getOptimizedGasPrice, NonceManager, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
6
+ import { GAS_LIMITS, calculateTransferFee } from '../../constants/index.js';
7
+ import { CHAIN_ID_MAP, getTxType, getGasPriceConfig, shouldExtractProfit, getProfitRecipient } from './config.js';
8
+ import { batchGetBalances, calculateGasLimit, generateHopWallets, getErc20Decimals, isNativeTokenAddress, normalizeAmounts, } from '../../../bundle-core/internal.js';
9
+ import { createSignProvider, createSignWallet, normalizeItemsOrRecipientsAmounts, resolveHopCountInput, resolveProvidedHops, } from '../../../bundle-core/sign-context-helpers.js';
137
10
  export async function flapDisperseWithBundleMerkle(params) {
138
- const { chain, fromPrivateKey, recipients, amount, amounts, tokenAddress, tokenDecimals, hopCount = 0, hopPrivateKeys, items, config, startNonce } = params;
11
+ const { chain, fromPrivateKey, recipients, amount, amounts, tokenAddress, tokenDecimals, hopCount = 0, hopPrivateKeys, items, config, startNonce, } = params;
139
12
  if (!recipients || recipients.length === 0) {
140
13
  return { signedTransactions: [], hopWallets: undefined };
141
14
  }
142
15
  const chainIdNum = CHAIN_ID_MAP[chain] ?? 56;
143
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, { chainId: chainIdNum, name: chain });
144
- const mainWallet = new Wallet(fromPrivateKey, provider);
16
+ const provider = createSignProvider(config.rpcUrl, chainIdNum, chain);
17
+ const mainWallet = createSignWallet(fromPrivateKey, provider);
145
18
  const isNative = isNativeTokenAddress(tokenAddress);
146
19
  const txType = getTxType(config);
147
- // 预处理数据
148
- const normalizedAmounts = items && items.length > 0
149
- ? items.map(it => (typeof it.amount === 'bigint' ? it.amount.toString() : String(it.amount)))
150
- : normalizeAmounts(recipients, amount, amounts);
151
- const providedHops = (() => {
152
- if (hopPrivateKeys && hopPrivateKeys.length > 0) {
153
- if (hopPrivateKeys.length !== recipients.length) {
154
- throw new Error(`hopPrivateKeys length (${hopPrivateKeys.length}) must match recipients length (${recipients.length})`);
155
- }
156
- return hopPrivateKeys.every(h => h.length === 0) ? null : hopPrivateKeys;
157
- }
158
- if (items && items.length > 0) {
159
- const hops = items.map(it => it.hopPrivateKeys ?? []);
160
- return hops.every(h => h.length === 0) ? null : hops;
161
- }
162
- return null;
163
- })();
164
- const hopCountInput = (() => {
165
- if (items && items.length > 0) {
166
- const baseArray = Array.isArray(hopCount) ? hopCount : new Array(recipients.length).fill(hopCount);
167
- return items.map((it, i) => (typeof it.hopCount === 'number' ? it.hopCount : (baseArray[i] ?? 0)));
168
- }
169
- return hopCount;
170
- })();
20
+ const normalizedAmounts = normalizeItemsOrRecipientsAmounts(recipients, items, amount, amounts, normalizeAmounts);
21
+ const providedHops = resolveProvidedHops(recipients.length, hopPrivateKeys, items);
22
+ const hopCountInput = resolveHopCountInput(recipients.length, hopCount, items);
171
23
  const preparedHops = providedHops ?? generateHopWallets(recipients.length, hopCountInput);
172
24
  const hasHops = preparedHops !== null;
173
- const maxHopCount = hasHops ? Math.max(...preparedHops.map(h => h.length)) : 0;
25
+ const maxHopCount = hasHops ? Math.max(...preparedHops.map((h) => h.length)) : 0;
174
26
  const finalGasLimit = calculateGasLimit(config, isNative, hasHops, maxHopCount);
175
27
  const nativeGasLimit = GAS_LIMITS.BRIBE;
176
28
  const signedTxs = [];
177
- const extractProfit = shouldExtractProfit(config);
29
+ const extractProfit = shouldExtractProfit();
178
30
  const profitAddr = getProfitRecipient();
179
31
  let totalProfit = 0n;
180
32
  let totalAmountBeforeProfit = 0n;
@@ -188,12 +40,11 @@ export async function flapDisperseWithBundleMerkle(params) {
188
40
  getOptimizedGasPrice(provider, getGasPriceConfig(config)),
189
41
  startNonce !== undefined
190
42
  ? Promise.resolve(Array.from({ length: totalTxCount }, (_, i) => startNonce + i))
191
- : nonceManager.getNextNonceBatch(mainWallet, totalTxCount)
43
+ : nonceManager.getNextNonceBatch(mainWallet, totalTxCount),
192
44
  ]);
193
45
  // ✅ 按地址数量收取固定费用(原生代币)
194
46
  if (extractProfit) {
195
47
  totalProfit = calculateTransferFee(chainIdNum, recipients.length);
196
- console.log(`[flap disperse] 利润按地址数量收取: ${ethers.formatEther(totalProfit)} 原生币 (${recipients.length} 地址)`);
197
48
  }
198
49
  if (isNative) {
199
50
  const txDataList = recipients.map((to, i) => {
@@ -209,7 +60,7 @@ export async function flapDisperseWithBundleMerkle(params) {
209
60
  gasPrice,
210
61
  gasLimit: nativeGasLimit,
211
62
  chainId: chainIdNum,
212
- type: txType
63
+ type: txType,
213
64
  }));
214
65
  signedTxs.push(...(await Promise.all(txPromises)));
215
66
  }
@@ -231,7 +82,7 @@ export async function flapDisperseWithBundleMerkle(params) {
231
82
  gasPrice,
232
83
  gasLimit: finalGasLimit,
233
84
  chainId: chainIdNum,
234
- type: txType
85
+ type: txType,
235
86
  }));
236
87
  signedTxs.push(...(await Promise.all(txPromises)));
237
88
  }
@@ -246,7 +97,7 @@ export async function flapDisperseWithBundleMerkle(params) {
246
97
  gasPrice,
247
98
  chainId: chainIdNum,
248
99
  txType,
249
- startNonce: nonces[recipients.length]
100
+ startNonce: nonces[recipients.length],
250
101
  });
251
102
  signedTxs.push(...profitHopResult.signedTransactions);
252
103
  profitHopWallets = profitHopResult.hopWallets;
@@ -256,7 +107,9 @@ export async function flapDisperseWithBundleMerkle(params) {
256
107
  // ========== 有多跳:构建跳转链 ==========
257
108
  const [gasPrice, decimals] = await Promise.all([
258
109
  getOptimizedGasPrice(provider, getGasPriceConfig(config)),
259
- isNative ? Promise.resolve(18) : Promise.resolve(tokenDecimals ?? await getErc20Decimals(provider, tokenAddress))
110
+ isNative
111
+ ? Promise.resolve(18)
112
+ : Promise.resolve(tokenDecimals ?? (await getErc20Decimals(provider, tokenAddress))),
260
113
  ]);
261
114
  const iface = isNative ? null : new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
262
115
  const gasFeePerHop = finalGasLimit * gasPrice;
@@ -267,7 +120,7 @@ export async function flapDisperseWithBundleMerkle(params) {
267
120
  mainWalletNonceCount += 1;
268
121
  }
269
122
  else {
270
- const nonceNeed = isNative ? 1 : (hopChain.length + 1);
123
+ const nonceNeed = isNative ? 1 : hopChain.length + 1;
271
124
  mainWalletNonceCount += nonceNeed;
272
125
  }
273
126
  }
@@ -281,7 +134,6 @@ export async function flapDisperseWithBundleMerkle(params) {
281
134
  // ✅ 按地址数量收取固定费用(原生代币)
282
135
  if (extractProfit) {
283
136
  totalProfit = calculateTransferFee(chainIdNum, recipients.length);
284
- console.log(`[flap disperse hops] 利润按地址数量收取: ${ethers.formatEther(totalProfit)} 原生币 (${recipients.length} 地址)`);
285
137
  }
286
138
  for (let i = 0; i < recipients.length; i++) {
287
139
  const finalRecipient = recipients[i];
@@ -297,27 +149,55 @@ export async function flapDisperseWithBundleMerkle(params) {
297
149
  if (isNative) {
298
150
  txsToSign.push({
299
151
  wallet: mainWallet,
300
- tx: { to: finalRecipient, value: amountWei, nonce, gasPrice, gasLimit: nativeGasLimit, chainId: chainIdNum, type: txType }
152
+ tx: {
153
+ to: finalRecipient,
154
+ value: amountWei,
155
+ nonce,
156
+ gasPrice,
157
+ gasLimit: nativeGasLimit,
158
+ chainId: chainIdNum,
159
+ type: txType,
160
+ },
301
161
  });
302
162
  }
303
163
  else {
304
164
  const data = iface.encodeFunctionData('transfer', [finalRecipient, amountWei]);
305
165
  txsToSign.push({
306
166
  wallet: mainWallet,
307
- tx: { to: tokenAddress, data, value: 0n, nonce, gasPrice, gasLimit: finalGasLimit, chainId: chainIdNum, type: txType }
167
+ tx: {
168
+ to: tokenAddress,
169
+ data,
170
+ value: 0n,
171
+ nonce,
172
+ gasPrice,
173
+ gasLimit: finalGasLimit,
174
+ chainId: chainIdNum,
175
+ type: txType,
176
+ },
308
177
  });
309
178
  }
310
179
  continue;
311
180
  }
312
181
  // ✅ 支持 string 和 GeneratedWallet 两种类型
313
- const fullChain = [mainWallet, ...hopChain.map(w => new Wallet(typeof w === 'string' ? w : w.privateKey, provider))];
314
- const addresses = [...fullChain.map(w => w.address), finalRecipient];
182
+ const fullChain = [
183
+ mainWallet,
184
+ ...hopChain.map((w) => new Wallet(typeof w === 'string' ? w : w.privateKey, provider)),
185
+ ];
186
+ const addresses = [...fullChain.map((w) => w.address), finalRecipient];
315
187
  if (!isNative) {
316
188
  for (let j = 0; j < hopChain.length; j++) {
317
189
  const nonce = allMainNonces[mainNonceIdx++];
318
190
  txsToSign.push({
319
191
  wallet: mainWallet,
320
- tx: { to: fullChain[j + 1].address, value: gasFeePerHop, nonce, gasPrice, gasLimit: nativeGasLimit, chainId: chainIdNum, type: txType }
192
+ tx: {
193
+ to: fullChain[j + 1].address,
194
+ value: gasFeePerHop,
195
+ nonce,
196
+ gasPrice,
197
+ gasLimit: nativeGasLimit,
198
+ chainId: chainIdNum,
199
+ type: txType,
200
+ },
321
201
  });
322
202
  }
323
203
  }
@@ -331,14 +211,31 @@ export async function flapDisperseWithBundleMerkle(params) {
331
211
  const transferValue = amountWei + additionalGas;
332
212
  txsToSign.push({
333
213
  wallet: fromWallet,
334
- tx: { to: toAddress, value: transferValue, nonce, gasPrice, gasLimit: finalGasLimit, chainId: chainIdNum, type: txType }
214
+ tx: {
215
+ to: toAddress,
216
+ value: transferValue,
217
+ nonce,
218
+ gasPrice,
219
+ gasLimit: finalGasLimit,
220
+ chainId: chainIdNum,
221
+ type: txType,
222
+ },
335
223
  });
336
224
  }
337
225
  else {
338
226
  const data = iface.encodeFunctionData('transfer', [toAddress, amountWei]);
339
227
  txsToSign.push({
340
228
  wallet: fromWallet,
341
- tx: { to: tokenAddress, data, value: 0n, nonce, gasPrice, gasLimit: finalGasLimit, chainId: chainIdNum, type: txType }
229
+ tx: {
230
+ to: tokenAddress,
231
+ data,
232
+ value: 0n,
233
+ nonce,
234
+ gasPrice,
235
+ gasLimit: finalGasLimit,
236
+ chainId: chainIdNum,
237
+ type: txType,
238
+ },
342
239
  });
343
240
  }
344
241
  }
@@ -347,7 +244,7 @@ export async function flapDisperseWithBundleMerkle(params) {
347
244
  signedTxs.push(...signedTxsResult);
348
245
  // ✅ 利润多跳转账(固定费用,原生代币)
349
246
  if (extractProfit && totalProfit > 0n) {
350
- const profitNonce = allMainNonces[mainNonceIdx++];
247
+ const profitNonce = allMainNonces[mainNonceIdx];
351
248
  const profitHopResult = await buildProfitHopTransactions({
352
249
  provider,
353
250
  payerWallet: mainWallet,
@@ -357,7 +254,7 @@ export async function flapDisperseWithBundleMerkle(params) {
357
254
  gasPrice,
358
255
  chainId: chainIdNum,
359
256
  txType,
360
- startNonce: profitNonce
257
+ startNonce: profitNonce,
361
258
  });
362
259
  signedTxs.push(...profitHopResult.signedTransactions);
363
260
  profitHopWallets = profitHopResult.hopWallets;
@@ -367,14 +264,16 @@ export async function flapDisperseWithBundleMerkle(params) {
367
264
  signedTransactions: signedTxs,
368
265
  hopWallets: preparedHops || undefined,
369
266
  profitHopWallets, // ✅ 返回利润多跳钱包
370
- metadata: extractProfit ? {
371
- totalAmount: ethers.formatEther(totalAmountBeforeProfit),
372
- profitAmount: ethers.formatEther(totalProfit),
373
- profitRecipient: profitAddr,
374
- recipientCount: recipients.length,
375
- isNative,
376
- tokenAddress: isNative ? undefined : tokenAddress
377
- } : undefined
267
+ metadata: extractProfit
268
+ ? {
269
+ totalAmount: ethers.formatEther(totalAmountBeforeProfit),
270
+ profitAmount: ethers.formatEther(totalProfit),
271
+ profitRecipient: profitAddr,
272
+ recipientCount: recipients.length,
273
+ isNative,
274
+ tokenAddress: isNative ? undefined : tokenAddress,
275
+ }
276
+ : undefined,
378
277
  };
379
278
  }
380
279
  // ==================== 归集函数 ====================
@@ -386,71 +285,50 @@ export async function flapDisperseWithBundleMerkle(params) {
386
285
  * ✅ 支持 Multicall3 批量获取余额
387
286
  */
388
287
  export async function flapSweepWithBundleMerkle(params) {
389
- const { chain, sourcePrivateKeys, target, ratioPct, ratios, amount, amounts, tokenAddress, tokenDecimals, skipIfInsufficient = true, hopCount = 0, hopPrivateKeys, sources, config } = params;
288
+ const { chain, sourcePrivateKeys, target, ratioPct, ratios, amount, amounts, tokenAddress, tokenDecimals, skipIfInsufficient = true, hopCount = 0, hopPrivateKeys, sources, config, } = params;
390
289
  if (!sourcePrivateKeys || sourcePrivateKeys.length === 0) {
391
290
  return { signedTransactions: [], hopWallets: undefined };
392
291
  }
393
292
  const chainIdNum = CHAIN_ID_MAP[chain] ?? 56;
394
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, { chainId: chainIdNum, name: chain });
293
+ const provider = createSignProvider(config.rpcUrl, chainIdNum, chain);
395
294
  const isNative = isNativeTokenAddress(tokenAddress);
396
295
  const txType = getTxType(config);
397
- const clamp = (n) => (typeof n === 'number' && Number.isFinite(n)
398
- ? Math.max(0, Math.min(100, Math.floor(n)))
399
- : undefined);
296
+ const clamp = (n) => typeof n === 'number' && Number.isFinite(n) ? Math.max(0, Math.min(100, Math.floor(n))) : undefined;
400
297
  const ratio = clamp(ratioPct);
401
298
  const actualKeys = (() => {
402
299
  if (sources && sources.length > 0)
403
- return sources.map(s => s.privateKey);
300
+ return sources.map((s) => s.privateKey);
404
301
  return sourcePrivateKeys;
405
302
  })();
406
- const providedHops = (() => {
407
- if (hopPrivateKeys && hopPrivateKeys.length > 0) {
408
- if (hopPrivateKeys.length !== actualKeys.length) {
409
- throw new Error(`hopPrivateKeys length (${hopPrivateKeys.length}) must match sourcePrivateKeys length (${actualKeys.length})`);
410
- }
411
- return hopPrivateKeys.every(h => h.length === 0) ? null : hopPrivateKeys;
412
- }
413
- if (sources && sources.length > 0) {
414
- const hops = sources.map(s => s.hopPrivateKeys ?? []);
415
- return hops.every(h => h.length === 0) ? null : hops;
416
- }
417
- return null;
418
- })();
419
- const hopCountInput = (() => {
420
- if (sources && sources.length > 0) {
421
- const baseArray = Array.isArray(hopCount) ? hopCount : new Array(actualKeys.length).fill(hopCount);
422
- return sources.map((s, i) => (typeof s.hopCount === 'number' ? s.hopCount : (baseArray[i] ?? 0)));
423
- }
424
- return hopCount;
425
- })();
303
+ const providedHops = resolveProvidedHops(actualKeys.length, hopPrivateKeys, sources);
304
+ const hopCountInput = resolveHopCountInput(actualKeys.length, hopCount, sources);
426
305
  const preparedHops = providedHops ?? generateHopWallets(actualKeys.length, hopCountInput);
427
306
  const hasHops = preparedHops !== null;
428
- const maxHopCount = hasHops ? Math.max(...preparedHops.map(h => h.length)) : 0;
307
+ const maxHopCount = hasHops ? Math.max(...preparedHops.map((h) => h.length)) : 0;
429
308
  const finalGasLimit = calculateGasLimit(config, isNative, hasHops, maxHopCount);
430
309
  const nativeGasLimit = GAS_LIMITS.BRIBE;
431
310
  const signedTxs = [];
432
- const extractProfit = shouldExtractProfit(config);
311
+ const extractProfit = shouldExtractProfit();
433
312
  const profitAddr = getProfitRecipient();
434
313
  let totalProfit = 0n;
435
314
  let totalAmountBeforeProfit = 0n;
436
315
  let profitHopWallets; // ✅ 收集利润多跳钱包
437
316
  if (!preparedHops) {
438
317
  // ========== 无多跳:直接批量归集 ==========
439
- const wallets = actualKeys.map(pk => new Wallet(pk, provider));
440
- const addresses = wallets.map(w => w.address);
318
+ const wallets = actualKeys.map((pk) => new Wallet(pk, provider));
319
+ const addresses = wallets.map((w) => w.address);
441
320
  const nonceManager = new NonceManager(provider);
442
321
  // ✅ 按地址数量收取固定费用(原生代币)
443
322
  if (extractProfit) {
444
323
  totalProfit = calculateTransferFee(chainIdNum, wallets.length);
445
- console.log(`[flap sweep] 利润按地址数量收取: ${ethers.formatEther(totalProfit)} 原生币 (${wallets.length} 地址)`);
446
324
  }
447
325
  if (isNative) {
448
326
  const [gasPrice, balances] = await Promise.all([
449
327
  getOptimizedGasPrice(provider, getGasPriceConfig(config)),
450
- batchGetBalances(provider, addresses)
328
+ batchGetBalances(provider, addresses),
451
329
  ]);
452
330
  const gasCostBase = nativeGasLimit * gasPrice;
453
- const profitTxGas = PROFIT_CONFIG.HOP.GAS_LIMIT * gasPrice * BigInt(PROFIT_HOP_COUNT + 1);
331
+ const profitTxGas = GAS_LIMITS.NATIVE_TRANSFER * gasPrice * BigInt(PROFIT_HOP_COUNT + 1);
454
332
  // 第一步:计算所有钱包的归集金额,找出余额最大的钱包
455
333
  const sweepAmounts = [];
456
334
  let maxSweepIndex = -1;
@@ -475,7 +353,7 @@ export async function flapSweepWithBundleMerkle(params) {
475
353
  const gasCost = gasCostBase;
476
354
  if (ratioForI !== undefined) {
477
355
  const want = (bal * BigInt(ratioForI)) / 100n;
478
- const maxSendable = bal > gasCost ? (bal - gasCost) : 0n;
356
+ const maxSendable = bal > gasCost ? bal - gasCost : 0n;
479
357
  toSend = want > maxSendable ? maxSendable : want;
480
358
  }
481
359
  else if (amountStrForI && amountStrForI.trim().length > 0) {
@@ -499,7 +377,7 @@ export async function flapSweepWithBundleMerkle(params) {
499
377
  const payerNeedGas = gasCostBase + profitTxGas;
500
378
  if (payerBalance < payerSweepAmount + payerNeedGas + totalProfit) {
501
379
  // 余额不足支付利润,减少归集金额
502
- const maxPayerSweep = payerBalance > (payerNeedGas + totalProfit) ? payerBalance - payerNeedGas - totalProfit : 0n;
380
+ const maxPayerSweep = payerBalance > payerNeedGas + totalProfit ? payerBalance - payerNeedGas - totalProfit : 0n;
503
381
  sweepAmounts[maxSweepIndex] = maxPayerSweep;
504
382
  totalAmountBeforeProfit = sweepAmounts.reduce((sum, amt) => sum + amt, 0n);
505
383
  }
@@ -512,9 +390,7 @@ export async function flapSweepWithBundleMerkle(params) {
512
390
  payerProfitNonce = nonces[1];
513
391
  }
514
392
  const walletsToSweep = wallets.filter((_, i) => sweepAmounts[i] > 0n && i !== maxSweepIndex);
515
- const nonces = walletsToSweep.length > 0
516
- ? await nonceManager.getNextNoncesForWallets(walletsToSweep)
517
- : [];
393
+ const nonces = walletsToSweep.length > 0 ? await nonceManager.getNextNoncesForWallets(walletsToSweep) : [];
518
394
  let nonceIdx = 0;
519
395
  const txPromises = wallets.map(async (w, i) => {
520
396
  const toSend = sweepAmounts[i];
@@ -535,11 +411,11 @@ export async function flapSweepWithBundleMerkle(params) {
535
411
  gasPrice,
536
412
  gasLimit: nativeGasLimit,
537
413
  chainId: chainIdNum,
538
- type: txType
414
+ type: txType,
539
415
  });
540
416
  return mainTx;
541
417
  });
542
- const allTxs = (await Promise.all(txPromises)).filter(tx => tx !== null);
418
+ const allTxs = (await Promise.all(txPromises)).filter((tx) => tx !== null);
543
419
  signedTxs.push(...allTxs);
544
420
  // ✅ 利润多跳转账(固定费用,原生代币)
545
421
  if (extractProfit && totalProfit > 0n && maxSweepIndex >= 0 && payerProfitNonce !== undefined) {
@@ -553,7 +429,7 @@ export async function flapSweepWithBundleMerkle(params) {
553
429
  gasPrice,
554
430
  chainId: chainIdNum,
555
431
  txType,
556
- startNonce: payerProfitNonce
432
+ startNonce: payerProfitNonce,
557
433
  });
558
434
  signedTxs.push(...profitHopResult.signedTransactions);
559
435
  profitHopWallets = profitHopResult.hopWallets;
@@ -563,12 +439,12 @@ export async function flapSweepWithBundleMerkle(params) {
563
439
  // ERC20 归集
564
440
  const [gasPrice, decimals, balances, nativeBalances] = await Promise.all([
565
441
  getOptimizedGasPrice(provider, getGasPriceConfig(config)),
566
- Promise.resolve(tokenDecimals ?? await getErc20Decimals(provider, tokenAddress)),
442
+ Promise.resolve(tokenDecimals ?? (await getErc20Decimals(provider, tokenAddress))),
567
443
  batchGetBalances(provider, addresses, tokenAddress),
568
- batchGetBalances(provider, addresses)
444
+ batchGetBalances(provider, addresses),
569
445
  ]);
570
446
  const iface = new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
571
- const profitTxGas = PROFIT_CONFIG.HOP.GAS_LIMIT * gasPrice * BigInt(PROFIT_HOP_COUNT + 1);
447
+ const profitTxGas = GAS_LIMITS.NATIVE_TRANSFER * gasPrice * BigInt(PROFIT_HOP_COUNT + 1);
572
448
  const sweepAmounts = [];
573
449
  let maxSweepIndex = -1;
574
450
  let maxSweepAmount = 0n;
@@ -629,9 +505,7 @@ export async function flapSweepWithBundleMerkle(params) {
629
505
  payerProfitNonce = nonces[1];
630
506
  }
631
507
  const walletsToSweepErc20 = wallets.filter((_, i) => sweepAmounts[i] > 0n && i !== maxSweepIndex);
632
- const noncesErc20 = walletsToSweepErc20.length > 0
633
- ? await nonceManager.getNextNoncesForWallets(walletsToSweepErc20)
634
- : [];
508
+ const noncesErc20 = walletsToSweepErc20.length > 0 ? await nonceManager.getNextNoncesForWallets(walletsToSweepErc20) : [];
635
509
  let nonceIdxErc20 = 0;
636
510
  const txPromises = wallets.map(async (w, i) => {
637
511
  const toSend = sweepAmounts[i];
@@ -654,11 +528,11 @@ export async function flapSweepWithBundleMerkle(params) {
654
528
  gasPrice,
655
529
  gasLimit: finalGasLimit,
656
530
  chainId: chainIdNum,
657
- type: txType
531
+ type: txType,
658
532
  });
659
533
  return mainTx;
660
534
  });
661
- const allTxs = (await Promise.all(txPromises)).filter(tx => tx !== null);
535
+ const allTxs = (await Promise.all(txPromises)).filter((tx) => tx !== null);
662
536
  signedTxs.push(...allTxs);
663
537
  // ✅ 利润多跳转账(固定费用,原生代币)
664
538
  if (extractProfit && totalProfit > 0n && maxSweepIndex >= 0 && payerProfitNonce !== undefined) {
@@ -672,7 +546,7 @@ export async function flapSweepWithBundleMerkle(params) {
672
546
  gasPrice,
673
547
  chainId: chainIdNum,
674
548
  txType,
675
- startNonce: payerProfitNonce
549
+ startNonce: payerProfitNonce,
676
550
  });
677
551
  signedTxs.push(...profitHopResult.signedTransactions);
678
552
  profitHopWallets = profitHopResult.hopWallets;
@@ -681,11 +555,10 @@ export async function flapSweepWithBundleMerkle(params) {
681
555
  }
682
556
  else {
683
557
  // ========== 有多跳:构建跳转链归集 ==========
684
- const sourceWallets = actualKeys.map(pk => new Wallet(pk, provider));
558
+ const sourceWallets = actualKeys.map((pk) => new Wallet(pk, provider));
685
559
  // ✅ 按地址数量收取固定费用(原生代币)
686
560
  if (extractProfit) {
687
561
  totalProfit = calculateTransferFee(chainIdNum, sourceWallets.length);
688
- console.log(`[flap sweep hops] 利润按地址数量收取: ${ethers.formatEther(totalProfit)} 原生币 (${sourceWallets.length} 地址)`);
689
562
  }
690
563
  const withHopIndexes = [];
691
564
  const withoutHopIndexes = [];
@@ -697,12 +570,14 @@ export async function flapSweepWithBundleMerkle(params) {
697
570
  withoutHopIndexes.push(i);
698
571
  }
699
572
  }
700
- const sourceAddresses = sourceWallets.map(w => w.address);
573
+ const sourceAddresses = sourceWallets.map((w) => w.address);
701
574
  const [gasPrice, decimals, balances, nativeBalances] = await Promise.all([
702
575
  getOptimizedGasPrice(provider, getGasPriceConfig(config)),
703
- isNative ? Promise.resolve(18) : Promise.resolve(tokenDecimals ?? await getErc20Decimals(provider, tokenAddress)),
576
+ isNative
577
+ ? Promise.resolve(18)
578
+ : Promise.resolve(tokenDecimals ?? (await getErc20Decimals(provider, tokenAddress))),
704
579
  batchGetBalances(provider, sourceAddresses, tokenAddress),
705
- isNative ? Promise.resolve([]) : batchGetBalances(provider, sourceAddresses)
580
+ isNative ? Promise.resolve([]) : batchGetBalances(provider, sourceAddresses),
706
581
  ]);
707
582
  const iface = isNative ? null : new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
708
583
  const gasFeePerHop = finalGasLimit * gasPrice;
@@ -731,7 +606,7 @@ export async function flapSweepWithBundleMerkle(params) {
731
606
  })();
732
607
  if (ratioForI !== undefined) {
733
608
  const want = (bal * BigInt(ratioForI)) / 100n;
734
- const maxSendable = bal > gasCost ? (bal - gasCost) : 0n;
609
+ const maxSendable = bal > gasCost ? bal - gasCost : 0n;
735
610
  toSend = want > maxSendable ? maxSendable : want;
736
611
  }
737
612
  else if (amountStrForI && amountStrForI.trim().length > 0) {
@@ -751,7 +626,7 @@ export async function flapSweepWithBundleMerkle(params) {
751
626
  gasPrice,
752
627
  gasLimit: nativeGasLimit,
753
628
  chainId: chainIdNum,
754
- type: txType
629
+ type: txType,
755
630
  });
756
631
  signedTxs.push(tx);
757
632
  }
@@ -790,7 +665,7 @@ export async function flapSweepWithBundleMerkle(params) {
790
665
  gasPrice,
791
666
  gasLimit: finalGasLimit,
792
667
  chainId: chainIdNum,
793
- type: txType
668
+ type: txType,
794
669
  });
795
670
  signedTxs.push(tx);
796
671
  }
@@ -820,7 +695,7 @@ export async function flapSweepWithBundleMerkle(params) {
820
695
  })();
821
696
  if (ratioForI !== undefined) {
822
697
  const want = (bal * BigInt(ratioForI)) / 100n;
823
- const maxSendable = bal > totalGasCost ? (bal - totalGasCost) : 0n;
698
+ const maxSendable = bal > totalGasCost ? bal - totalGasCost : 0n;
824
699
  toSend = want > maxSendable ? maxSendable : want;
825
700
  }
826
701
  else if (amountStrForI && amountStrForI.trim().length > 0) {
@@ -832,7 +707,7 @@ export async function flapSweepWithBundleMerkle(params) {
832
707
  }
833
708
  else {
834
709
  const nativeBal = nativeBalances[i];
835
- const nativeNeeded = (gasFeePerHop * BigInt(hopChain.length)) + (finalGasLimit * gasPrice);
710
+ const nativeNeeded = gasFeePerHop * BigInt(hopChain.length) + finalGasLimit * gasPrice;
836
711
  if (nativeBal < nativeNeeded && skipIfInsufficient)
837
712
  continue;
838
713
  const ratioForI = (() => {
@@ -863,8 +738,11 @@ export async function flapSweepWithBundleMerkle(params) {
863
738
  sweepAmounts[i] = toSend;
864
739
  totalAmountBeforeProfit += toSend;
865
740
  // ✅ 支持 string 和 GeneratedWallet 两种类型
866
- const fullChain = [sourceWallet, ...hopChain.map(w => new Wallet(typeof w === 'string' ? w : w.privateKey, provider))];
867
- const addresses = [...fullChain.map(w => w.address), target];
741
+ const fullChain = [
742
+ sourceWallet,
743
+ ...hopChain.map((w) => new Wallet(typeof w === 'string' ? w : w.privateKey, provider)),
744
+ ];
745
+ const addresses = [...fullChain.map((w) => w.address), target];
868
746
  if (!isNative) {
869
747
  const gasNonces = await nonceManager.getNextNonceBatch(sourceWallet, hopChain.length);
870
748
  for (let j = 0; j < hopChain.length; j++) {
@@ -875,7 +753,7 @@ export async function flapSweepWithBundleMerkle(params) {
875
753
  gasPrice,
876
754
  gasLimit: nativeGasLimit,
877
755
  chainId: chainIdNum,
878
- type: txType
756
+ type: txType,
879
757
  });
880
758
  signedTxs.push(tx);
881
759
  }
@@ -883,9 +761,7 @@ export async function flapSweepWithBundleMerkle(params) {
883
761
  for (let j = 0; j < addresses.length - 1; j++) {
884
762
  const fromWallet = fullChain[j];
885
763
  const toAddress = addresses[j + 1];
886
- const nonce = j === 0
887
- ? await nonceManager.getNextNonce(sourceWallet)
888
- : 0;
764
+ const nonce = j === 0 ? await nonceManager.getNextNonce(sourceWallet) : 0;
889
765
  if (isNative) {
890
766
  const remainingHops = addresses.length - 2 - j;
891
767
  const additionalGas = gasFeePerHop * BigInt(remainingHops);
@@ -897,7 +773,7 @@ export async function flapSweepWithBundleMerkle(params) {
897
773
  gasPrice,
898
774
  gasLimit: finalGasLimit,
899
775
  chainId: chainIdNum,
900
- type: txType
776
+ type: txType,
901
777
  });
902
778
  signedTxs.push(tx);
903
779
  }
@@ -911,7 +787,7 @@ export async function flapSweepWithBundleMerkle(params) {
911
787
  gasPrice,
912
788
  gasLimit: finalGasLimit,
913
789
  chainId: chainIdNum,
914
- type: txType
790
+ type: txType,
915
791
  });
916
792
  signedTxs.push(tx);
917
793
  }
@@ -940,7 +816,7 @@ export async function flapSweepWithBundleMerkle(params) {
940
816
  gasPrice,
941
817
  chainId: chainIdNum,
942
818
  txType,
943
- startNonce: profitNonce
819
+ startNonce: profitNonce,
944
820
  });
945
821
  signedTxs.push(...profitHopResult.signedTransactions);
946
822
  profitHopWallets = profitHopResult.hopWallets;
@@ -951,13 +827,17 @@ export async function flapSweepWithBundleMerkle(params) {
951
827
  signedTransactions: signedTxs,
952
828
  hopWallets: preparedHops || undefined,
953
829
  profitHopWallets, // ✅ 返回利润多跳钱包
954
- metadata: extractProfit ? {
955
- totalAmount: isNative ? ethers.formatEther(totalAmountBeforeProfit) : ethers.formatUnits(totalAmountBeforeProfit, tokenDecimals ?? 18),
956
- profitAmount: ethers.formatEther(totalProfit),
957
- profitRecipient: profitAddr,
958
- sourceCount: actualKeys.length,
959
- isNative,
960
- tokenAddress: isNative ? undefined : tokenAddress
961
- } : undefined
830
+ metadata: extractProfit
831
+ ? {
832
+ totalAmount: isNative
833
+ ? ethers.formatEther(totalAmountBeforeProfit)
834
+ : ethers.formatUnits(totalAmountBeforeProfit, tokenDecimals ?? 18),
835
+ profitAmount: ethers.formatEther(totalProfit),
836
+ profitRecipient: profitAddr,
837
+ sourceCount: actualKeys.length,
838
+ isNative,
839
+ tokenAddress: isNative ? undefined : tokenAddress,
840
+ }
841
+ : undefined,
962
842
  };
963
843
  }