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,641 +1,16 @@
1
1
  /**
2
- * ============================================================================
3
- * 刷持有人(Holders Maker)
4
- * ============================================================================
5
- * 一键完成:生成钱包 → 分发资金 → 批量买入(同一个 bundle 完成)
6
- * 支持原生代币(BNB/MON)和 ERC20 代币(USDT/USDC)作为购买资金
2
+ * holders-maker - 主函数
7
3
  */
8
- import { ethers, JsonRpcProvider, Wallet, Contract } from 'ethers';
4
+ import { ethers, JsonRpcProvider, Wallet } from 'ethers';
9
5
  import { generateWallets } from './wallet.js';
10
- import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, getDeadline } from './bundle-helpers.js';
11
- import { ADDRESSES, BLOCKRAZOR_BUILDER_EOA } from './constants.js';
12
- import { getProfitRecipient, getProfitRateBps } from '../shared/constants/index.js';
13
- import { GAS_LIMITS } from '../shared/constants/index.js';
14
- import { FLAP_PORTAL_ADDRESSES } from '../shared/flap/constants.js';
15
- import { V2_ROUTER_ABI, V3_ROUTER02_ABI, V3_ROUTER_LEGACY_ABI, ERC20_ABI } from '../shared/abis/common.js';
16
- // Four 内盘 ABI
17
- const FOUR_TM2_ABI = [
18
- 'function buyTokenAMAP(uint256 origin, address token, address to, uint256 funds, uint256 minAmount) payable'
19
- ];
20
- // PancakeSwap Router 地址 (BSC)
21
- const PANCAKE_V2_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV2Router;
22
- const PANCAKE_V3_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV3Router;
23
- const WBNB_ADDRESS = ADDRESSES.BSC.WBNB;
24
- // ERC20 稳定币地址 (BSC)
25
- const USDT_ADDRESS = ADDRESSES.BSC.USDT;
26
- const USDC_ADDRESS = ADDRESSES.BSC.USDC;
27
- // ✅ XLayer Router 地址
28
- const XLAYER_V2_ROUTER_ADDRESS = ADDRESSES.XLAYER.PotatoSwapV2Router;
29
- const XLAYER_V3_ROUTER_ADDRESS = ADDRESSES.XLAYER.PotatoSwapV3Router;
30
- const WOKB_ADDRESS = ADDRESSES.XLAYER.WOKB;
31
- // ✅ ENI Router 地址
32
- const ENI_V2_ROUTER_ADDRESS = ADDRESSES.ENI.DswapV2Router;
33
- const ENI_DAOAAS_PORTAL_ADDRESS = ADDRESSES.ENI.DaoaasPortal;
34
- const WEGAS_ADDRESS = ADDRESSES.ENI.WEGAS;
35
- // ERC20 转账和授权 Gas Limit(使用统一常量)
36
- const ERC20_TRANSFER_GAS_LIMIT = GAS_LIMITS.ERC20_TRANSFER;
37
- const ERC20_APPROVE_GAS_LIMIT = 50000n; // 授权 gas 相对固定
38
- // ============================================================================
39
- // 常量
40
- // ============================================================================
41
- const DEFAULT_GAS_LIMIT = 800000;
42
- const DEFAULT_GAS_PRICE_GWEI = 3;
43
- const GAS_BUFFER_MULTIPLIER = 2; // 2倍 Gas 费安全系数
44
- const NATIVE_TRANSFER_GAS_LIMIT = GAS_LIMITS.NATIVE_TRANSFER;
45
- /**
46
- * 动态计算每批最大钱包数
47
- *
48
- * Bundle 限制 = 50 笔交易
49
- * 固定开销:
50
- * BSC: 贿赂 1 笔 + 利润多跳 (PROFIT_HOP_COUNT + 1) 笔
51
- * XLayer: 利润 1 笔(无贿赂,无多跳)
52
- *
53
- * 原生模式(无分发多跳):
54
- * 每钱包开销 = 分发 1 + 买入 1 = 2
55
- * N ≤ (50 - 固定开销) / 2
56
- *
57
- * 原生模式(有分发多跳 H):
58
- * 每钱包开销 = 分发 (H+1) + 买入 1 = H+2
59
- * N ≤ (50 - 固定开销) / (H+2)
60
- *
61
- * ERC20 模式(无分发多跳):
62
- * 每钱包开销 = 分发BNB 1 + 分发ERC20 1 + 授权 1 + 买入 1 = 4
63
- * N ≤ (50 - 固定开销) / 4
64
- *
65
- * ERC20 模式(有分发多跳 H):
66
- * 每钱包开销 = 分发BNB (H+1) + 分发ERC20 (H+1) + 授权 1 + 买入 1 = 2H+4
67
- * N ≤ (50 - 固定开销) / (2H+4)
68
- */
69
- function calculateMaxWalletsPerBatch(isERC20Mode, disperseHopCount, chain) {
70
- // XLayer/ENI 不需要贿赂和利润多跳
71
- const isSimpleChain = chain === 'XLAYER' || chain === 'ENI';
72
- const fixedOverhead = isSimpleChain ? 1 : (1 + PROFIT_HOP_COUNT + 1); // XLayer/ENI: 利润 1; BSC: 贿赂 + 利润多跳
73
- const maxTxs = 50 - fixedOverhead;
74
- if (isERC20Mode) {
75
- // ERC20: 分发BNB (H+1) + 分发ERC20 (H+1) + 授权 1 + 买入 1
76
- const perWalletTxs = 2 * (disperseHopCount + 1) + 2;
77
- return Math.floor(maxTxs / perWalletTxs);
78
- }
79
- else {
80
- // 原生: 分发 (H+1) + 买入 1
81
- const perWalletTxs = disperseHopCount + 2;
82
- return Math.floor(maxTxs / perWalletTxs);
83
- }
84
- }
85
- // 默认值(无分发多跳)
86
- const DEFAULT_MAX_WALLETS_PER_BATCH_NATIVE = calculateMaxWalletsPerBatch(false, 0);
87
- const DEFAULT_MAX_WALLETS_PER_BATCH_ERC20 = calculateMaxWalletsPerBatch(true, 0);
88
- // ============================================================================
89
- // 辅助函数
90
- // ============================================================================
91
- /**
92
- * 分批数组
93
- */
94
- function chunkArray(arr, size) {
95
- const chunks = [];
96
- for (let i = 0; i < arr.length; i += size) {
97
- chunks.push(arr.slice(i, i + size));
98
- }
99
- return chunks;
100
- }
101
- /**
102
- * 生成分发多跳路径
103
- * @param targetWallets 目标钱包地址列表
104
- * @param hopCount 多跳数量(0=直接转账,1=1个中间钱包,2=2个中间钱包...)
105
- * @param provider Provider 实例
106
- * @returns 每个目标钱包的多跳路径
107
- */
108
- function generateDisperseHopPaths(targetWallets, hopCount, provider) {
109
- if (hopCount <= 0) {
110
- // 无多跳,直接返回空路径
111
- return targetWallets.map(w => ({
112
- targetAddress: w.address,
113
- hopWallets: [],
114
- hopWalletsInfo: []
115
- }));
116
- }
117
- // 为每个目标钱包生成中间钱包
118
- return targetWallets.map(targetWallet => {
119
- const hopWalletsInfo = generateWallets(hopCount);
120
- const hopWallets = hopWalletsInfo.map(w => new Wallet(w.privateKey, provider));
121
- return {
122
- targetAddress: targetWallet.address,
123
- hopWallets,
124
- hopWalletsInfo
125
- };
126
- });
127
- }
128
- /**
129
- * 构建分发多跳交易链(原生代币)
130
- *
131
- * 路径: payer → hop1 → hop2 → ... → target
132
- *
133
- * @param isERC20Mode 是否为 ERC20 模式(中间钱包需要预留 ERC20 转账 gas)
134
- * @returns 签名交易数组
135
- */
136
- async function buildDisperseHopChainNative(payer, path, finalAmount, gasPrice, chainId, txType, payerNonce, isERC20Mode = false) {
137
- const signedTxs = [];
138
- const hopCount = path.hopWallets.length;
139
- if (hopCount === 0) {
140
- // 无多跳,直接转账
141
- const tx = await buildNativeTransferTx(payer, path.targetAddress, finalAmount, payerNonce, gasPrice, chainId, txType);
142
- signedTxs.push(tx);
143
- return { signedTxs, payerNoncesUsed: 1 };
144
- }
145
- // 计算每一跳需要转出的金额(需要预留后续跳的 gas 费)
146
- const hopGasCost = NATIVE_TRANSFER_GAS_LIMIT * gasPrice;
147
- // ERC20 模式下,中间钱包还需要预留 ERC20 转账的 gas
148
- const erc20TransferGasCost = isERC20Mode ? ERC20_TRANSFER_GAS_LIMIT * gasPrice : 0n;
149
- // 从后往前计算每一跳需要的金额
150
- // 原生模式:
151
- // 最后一跳(hopN → target)需要: finalAmount + hopGasCost
152
- // 倒数第二跳需要: finalAmount + 2 * hopGasCost
153
- // ERC20 模式(中间钱包还需要预留 ERC20 转账 gas):
154
- // 每个中间钱包额外需要: erc20TransferGasCost
155
- const amountsPerHop = [];
156
- for (let i = 0; i < hopCount; i++) {
157
- const remainingHops = hopCount - i;
158
- // 中间钱包需要的 BNB = 最终金额 + 后续 BNB 转账 gas + (ERC20模式下) 自己的 ERC20 转账 gas
159
- const amount = finalAmount
160
- + hopGasCost * BigInt(remainingHops)
161
- + (isERC20Mode ? erc20TransferGasCost * BigInt(remainingHops) : 0n);
162
- amountsPerHop.push(amount);
163
- }
164
- // 构建交易链
165
- // 1. payer → hop1 (使用 payer nonce)
166
- const firstTx = await buildNativeTransferTx(payer, path.hopWallets[0].address, amountsPerHop[0], payerNonce, gasPrice, chainId, txType);
167
- signedTxs.push(firstTx);
168
- // 2. hop1 → hop2 → ... → hopN → target (每个中间钱包 nonce=0)
169
- for (let i = 0; i < hopCount; i++) {
170
- const fromWallet = path.hopWallets[i];
171
- const toAddress = i === hopCount - 1
172
- ? path.targetAddress // 最后一跳到目标
173
- : path.hopWallets[i + 1].address; // 中间跳到下一个 hop
174
- // 最后一跳只需转最终金额,中间跳需要预留后续费用
175
- const amount = i === hopCount - 1
176
- ? finalAmount
177
- : amountsPerHop[i + 1];
178
- const tx = await buildNativeTransferTx(fromWallet, toAddress, amount, 0, // 中间钱包都是新生成的,nonce=0
179
- gasPrice, chainId, txType);
180
- signedTxs.push(tx);
181
- }
182
- return { signedTxs, payerNoncesUsed: 1 };
183
- }
184
- /**
185
- * 构建分发多跳交易链(ERC20 代币)
186
- *
187
- * 路径: payer → hop1 → hop2 → ... → target
188
- *
189
- * 注意:ERC20 多跳需要配合 BNB 多跳使用,中间钱包需要先收到 BNB 作为 gas
190
- * BNB 多跳先执行,确保中间钱包有 gas 费后再转发 ERC20
191
- *
192
- * 中间钱包的 nonce 安排:
193
- * - nonce=0: BNB 转发(在 buildDisperseHopChainNative 中完成)
194
- * - nonce=1: ERC20 转发(在本函数中完成)
195
- */
196
- async function buildDisperseHopChainERC20(payer, path, erc20Address, erc20Amount, gasPrice, chainId, txType, payerNonce) {
197
- const signedTxs = [];
198
- const hopCount = path.hopWallets.length;
199
- if (hopCount === 0) {
200
- // 无多跳,直接转账
201
- const tx = await buildERC20TransferTx(payer, erc20Address, path.targetAddress, erc20Amount, payerNonce, gasPrice, chainId, txType);
202
- signedTxs.push(tx);
203
- return { signedTxs, payerNoncesUsed: 1 };
204
- }
205
- // 构建交易链
206
- // payer 发送 ERC20 到 hop1
207
- const firstTx = await buildERC20TransferTx(payer, erc20Address, path.hopWallets[0].address, erc20Amount, payerNonce, gasPrice, chainId, txType);
208
- signedTxs.push(firstTx);
209
- // 每个中间钱包转发 ERC20
210
- // nonce=1(因为 nonce=0 已经用于 BNB 转发)
211
- for (let i = 0; i < hopCount; i++) {
212
- const fromWallet = path.hopWallets[i];
213
- const toAddress = i === hopCount - 1
214
- ? path.targetAddress
215
- : path.hopWallets[i + 1].address;
216
- const tx = await buildERC20TransferTx(fromWallet, erc20Address, toAddress, erc20Amount, 1, // ✅ nonce=1(nonce=0 用于 BNB 转发)
217
- gasPrice, chainId, txType);
218
- signedTxs.push(tx);
219
- }
220
- return { signedTxs, payerNoncesUsed: 1 };
221
- }
222
- /**
223
- * 获取 ERC20 稳定币地址
224
- */
225
- function getBaseTokenAddress(baseToken, chain, customAddress) {
226
- if (customAddress)
227
- return customAddress;
228
- if (chain === 'ENI') {
229
- if (baseToken === 'usdt')
230
- return ADDRESSES.ENI.USDT;
231
- if (baseToken === 'usdc')
232
- return ADDRESSES.ENI.USDC;
233
- }
234
- if (baseToken === 'usdt')
235
- return USDT_ADDRESS;
236
- if (baseToken === 'usdc')
237
- return USDC_ADDRESS;
238
- throw new Error(`未知的基础代币类型: ${baseToken}`);
239
- }
240
- /**
241
- * 获取 Router 地址(用于授权)
242
- */
243
- function getRouterAddress(tradeType, chain, v2RouterOverride) {
244
- if (chain === 'ENI') {
245
- switch (tradeType) {
246
- case 'v2': return v2RouterOverride || ENI_V2_ROUTER_ADDRESS;
247
- case 'daoaas': return ENI_DAOAAS_PORTAL_ADDRESS;
248
- default: throw new Error(`ENI 链不支持交易类型: ${tradeType},仅支持 daoaas/v2`);
249
- }
250
- }
251
- const isXLayer = chain === 'XLAYER';
252
- switch (tradeType) {
253
- case 'v2':
254
- if (v2RouterOverride)
255
- return v2RouterOverride;
256
- return isXLayer ? XLAYER_V2_ROUTER_ADDRESS : PANCAKE_V2_ROUTER_ADDRESS;
257
- case 'v3':
258
- return isXLayer ? XLAYER_V3_ROUTER_ADDRESS : PANCAKE_V3_ROUTER_ADDRESS;
259
- default:
260
- throw new Error(`ERC20 模式不支持交易类型: ${tradeType},仅支持 v2/v3`);
261
- }
262
- }
263
- /**
264
- * 获取包装原生代币地址
265
- */
266
- function getWrappedNativeAddress(chain) {
267
- if (chain === 'ENI')
268
- return WEGAS_ADDRESS;
269
- return chain === 'XLAYER' ? WOKB_ADDRESS : WBNB_ADDRESS;
270
- }
271
- /**
272
- * 构建 ERC20 转账交易
273
- */
274
- async function buildERC20TransferTx(wallet, tokenAddress, to, amount, nonce, gasPrice, chainId, txType) {
275
- const iface = new ethers.Interface(ERC20_ABI);
276
- const data = iface.encodeFunctionData('transfer', [to, amount]);
277
- const tx = {
278
- to: tokenAddress,
279
- data,
280
- value: 0n,
281
- nonce,
282
- gasLimit: ERC20_TRANSFER_GAS_LIMIT,
283
- chainId
284
- };
285
- if (txType === 2) {
286
- tx.maxFeePerGas = gasPrice;
287
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
288
- tx.type = 2;
289
- }
290
- else {
291
- tx.gasPrice = gasPrice;
292
- tx.type = 0;
293
- }
294
- return await wallet.signTransaction(tx);
295
- }
296
- /**
297
- * 构建 ERC20 授权交易
298
- */
299
- async function buildERC20ApproveTx(wallet, tokenAddress, spender, amount, nonce, gasPrice, chainId, txType) {
300
- const iface = new ethers.Interface(ERC20_ABI);
301
- const data = iface.encodeFunctionData('approve', [spender, amount]);
302
- const tx = {
303
- to: tokenAddress,
304
- data,
305
- value: 0n,
306
- nonce,
307
- gasLimit: ERC20_APPROVE_GAS_LIMIT,
308
- chainId
309
- };
310
- if (txType === 2) {
311
- tx.maxFeePerGas = gasPrice;
312
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
313
- tx.type = 2;
314
- }
315
- else {
316
- tx.gasPrice = gasPrice;
317
- tx.type = 0;
318
- }
319
- return await wallet.signTransaction(tx);
320
- }
321
- /**
322
- * 构建原生代币转账交易
323
- */
324
- async function buildNativeTransferTx(wallet, to, amount, nonce, gasPrice, chainId, txType) {
325
- const tx = {
326
- to,
327
- value: amount,
328
- nonce,
329
- gasLimit: GAS_LIMITS.BRIBE,
330
- chainId
331
- };
332
- if (txType === 2) {
333
- tx.maxFeePerGas = gasPrice;
334
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
335
- tx.type = 2;
336
- }
337
- else {
338
- tx.gasPrice = gasPrice;
339
- tx.type = 0;
340
- }
341
- return await wallet.signTransaction(tx);
342
- }
343
- /**
344
- * 构建 Flap 买入交易
345
- * 使用 swapExactInput 方法
346
- */
347
- async function buildFlapBuyTx(wallet, tokenAddress, buyAmount, nonce, gasPrice, gasLimit, chainId, txType, chain) {
348
- const portalAddress = FLAP_PORTAL_ADDRESSES[chain];
349
- // ✅ 使用正确的 Flap Portal ABI
350
- const iface = new ethers.Interface([
351
- 'function swapExactInput((address inputToken,address outputToken,uint256 inputAmount,uint256 minOutputAmount,bytes permitData)) external payable returns (uint256)'
352
- ]);
353
- // ✅ 构建 swapExactInput 参数
354
- // inputToken = 0x0 表示原生代币(BNB)
355
- // outputToken = tokenAddress(要买入的代币)
356
- const data = iface.encodeFunctionData('swapExactInput', [{
357
- inputToken: ethers.ZeroAddress, // 原生代币(BNB)
358
- outputToken: tokenAddress, // 要买入的代币
359
- inputAmount: buyAmount,
360
- minOutputAmount: 0n, // 不设滑点保护
361
- permitData: '0x'
362
- }]);
363
- const tx = {
364
- to: portalAddress,
365
- data,
366
- value: buyAmount,
367
- nonce,
368
- gasLimit: BigInt(gasLimit),
369
- chainId
370
- };
371
- if (txType === 2) {
372
- tx.maxFeePerGas = gasPrice;
373
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
374
- tx.type = 2;
375
- }
376
- else {
377
- tx.gasPrice = gasPrice;
378
- tx.type = 0;
379
- }
380
- return await wallet.signTransaction(tx);
381
- }
382
- /**
383
- * 构建 Four 内盘买入交易
384
- * 使用 buyTokenAMAP 方法
385
- */
386
- async function buildFourBuyTx(wallet, tokenAddress, buyAmount, nonce, gasPrice, gasLimit, chainId, txType) {
387
- const tmAddress = ADDRESSES.BSC.TokenManagerOriginal;
388
- const iface = new ethers.Interface(FOUR_TM2_ABI);
389
- const data = iface.encodeFunctionData('buyTokenAMAP', [
390
- 0n, // origin
391
- tokenAddress, // token
392
- wallet.address, // to(接收者为自己)
393
- buyAmount, // funds
394
- 0n // minAmount(不设滑点保护)
395
- ]);
396
- const tx = {
397
- to: tmAddress,
398
- data,
399
- value: buyAmount,
400
- nonce,
401
- gasLimit: BigInt(gasLimit),
402
- chainId
403
- };
404
- if (txType === 2) {
405
- tx.maxFeePerGas = gasPrice;
406
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
407
- tx.type = 2;
408
- }
409
- else {
410
- tx.gasPrice = gasPrice;
411
- tx.type = 0;
412
- }
413
- return await wallet.signTransaction(tx);
414
- }
415
- /**
416
- * 构建 DAOaaS 内盘买入交易 (ENI 链)
417
- * EGAS → Token (使用 DAOaaS Portal buy)
418
- */
419
- async function buildDaoaasBuyTx(wallet, tokenAddress, buyAmount, nonce, gasPrice, gasLimit, chainId) {
420
- const portalAbi = ['function purchaseToken(address token, uint256 AmountMin) payable'];
421
- const iface = new ethers.Interface(portalAbi);
422
- const data = iface.encodeFunctionData('purchaseToken', [tokenAddress, 0n]);
423
- const tx = {
424
- to: ENI_DAOAAS_PORTAL_ADDRESS,
425
- data,
426
- value: buyAmount,
427
- nonce,
428
- gasLimit: BigInt(gasLimit),
429
- chainId,
430
- type: 2,
431
- maxFeePerGas: gasPrice,
432
- maxPriorityFeePerGas: gasPrice / 10n || 1n,
433
- };
434
- return await wallet.signTransaction(tx);
435
- }
436
- /**
437
- * 构建 V2 买入交易
438
- * BNB/OKB → Token (使用 swapExactETHForTokensSupportingFeeOnTransferTokens)
439
- */
440
- async function buildV2BuyTx(wallet, tokenAddress, buyAmount, nonce, gasPrice, gasLimit, chainId, txType, v2Path, chain, v2RouterOverride) {
441
- const wrappedNative = getWrappedNativeAddress(chain);
442
- const routerAddress = v2RouterOverride || getRouterAddress('v2', chain);
443
- const path = v2Path ? [...v2Path].reverse() : [wrappedNative, tokenAddress];
444
- const deadline = getDeadline();
445
- const v2Router = new Contract(routerAddress, V2_ROUTER_ABI, wallet);
446
- const unsigned = await v2Router.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, // amountOutMin(不设滑点保护)
447
- path, wallet.address, deadline, { value: buyAmount });
448
- const tx = {
449
- ...unsigned,
450
- nonce,
451
- gasLimit: BigInt(gasLimit),
452
- chainId
453
- };
454
- if (txType === 2) {
455
- tx.maxFeePerGas = gasPrice;
456
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
457
- tx.type = 2;
458
- }
459
- else {
460
- tx.gasPrice = gasPrice;
461
- tx.type = 0;
462
- }
463
- return await wallet.signTransaction(tx);
464
- }
465
- /**
466
- * 构建 V3 单跳买入交易
467
- * BNB/OKB → Token (使用 exactInputSingle + multicall)
468
- *
469
- * ✅ 修复:根据链类型选择正确的 Router ABI 版本
470
- * - XLayer/Monad: 旧版 Router(exactInputSingle 包含 deadline,multicall(bytes[]))
471
- * - BSC: 新版 SwapRouter02(exactInputSingle 不含 deadline,multicall(uint256,bytes[]))
472
- */
473
- async function buildV3BuyTx(wallet, tokenAddress, buyAmount, nonce, gasPrice, gasLimit, chainId, txType, v3Fee = 2500, // 默认 0.25% 手续费
474
- chain) {
475
- const deadline = getDeadline();
476
- const wrappedNative = getWrappedNativeAddress(chain);
477
- const routerAddress = chain === 'XLAYER' ? XLAYER_V3_ROUTER_ADDRESS : PANCAKE_V3_ROUTER_ADDRESS;
478
- // ✅ 根据链类型选择正确的 ABI 版本
479
- // XLayer/Monad 使用旧版 Router(exactInputSingle 包含 deadline)
480
- // BSC 使用新版 SwapRouter02(exactInputSingle 不含 deadline)
481
- const useLegacyRouter = chain === 'XLAYER' || chain === 'MONAD';
482
- const v3RouterIface = new ethers.Interface(useLegacyRouter ? V3_ROUTER_LEGACY_ABI : V3_ROUTER02_ABI);
483
- let multicallData;
484
- if (useLegacyRouter) {
485
- // ✅ 旧版 Router:swapParams 包含 deadline,multicall(bytes[])
486
- const swapParams = {
487
- tokenIn: wrappedNative,
488
- tokenOut: tokenAddress,
489
- fee: v3Fee,
490
- recipient: wallet.address,
491
- deadline, // ✅ 旧版包含 deadline
492
- amountIn: buyAmount,
493
- amountOutMinimum: 0n,
494
- sqrtPriceLimitX96: 0n
495
- };
496
- const exactInputSingleData = v3RouterIface.encodeFunctionData('exactInputSingle', [swapParams]);
497
- const refundETHData = v3RouterIface.encodeFunctionData('refundETH', []);
498
- // ✅ 旧版 multicall:只有 bytes[] 参数
499
- multicallData = v3RouterIface.encodeFunctionData('multicall(bytes[])', [
500
- [exactInputSingleData, refundETHData]
501
- ]);
502
- }
503
- else {
504
- // ✅ 新版 SwapRouter02:swapParams 不含 deadline,multicall(uint256,bytes[])
505
- const swapParams = {
506
- tokenIn: wrappedNative,
507
- tokenOut: tokenAddress,
508
- fee: v3Fee,
509
- recipient: wallet.address,
510
- amountIn: buyAmount,
511
- amountOutMinimum: 0n,
512
- sqrtPriceLimitX96: 0n
513
- };
514
- const exactInputSingleData = v3RouterIface.encodeFunctionData('exactInputSingle', [swapParams]);
515
- const refundETHData = v3RouterIface.encodeFunctionData('refundETH', []);
516
- // ✅ 新版 multicall:deadline 作为第一个参数
517
- multicallData = v3RouterIface.encodeFunctionData('multicall(uint256,bytes[])', [
518
- deadline,
519
- [exactInputSingleData, refundETHData]
520
- ]);
521
- }
522
- const tx = {
523
- to: routerAddress,
524
- data: multicallData,
525
- value: buyAmount,
526
- nonce,
527
- gasLimit: BigInt(gasLimit),
528
- chainId
529
- };
530
- if (txType === 2) {
531
- tx.maxFeePerGas = gasPrice;
532
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
533
- tx.type = 2;
534
- }
535
- else {
536
- tx.gasPrice = gasPrice;
537
- tx.type = 0;
538
- }
539
- return await wallet.signTransaction(tx);
540
- }
541
- /**
542
- * 构建 V2 买入交易(ERC20 输入)
543
- * USDT/USDC → Token (使用 swapExactTokensForTokensSupportingFeeOnTransferTokens)
544
- */
545
- async function buildV2BuyTxWithERC20(wallet, tokenAddress, baseTokenAddress, buyAmount, nonce, gasPrice, gasLimit, chainId, txType, v2RouterOverride, chain) {
546
- const path = [baseTokenAddress, tokenAddress];
547
- const deadline = getDeadline();
548
- const routerAddress = v2RouterOverride || getRouterAddress('v2', chain);
549
- const v2Router = new Contract(routerAddress, V2_ROUTER_ABI, wallet);
550
- const unsigned = await v2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(buyAmount, // amountIn
551
- 0n, // amountOutMin(不设滑点保护)
552
- path, wallet.address, deadline);
553
- const tx = {
554
- ...unsigned,
555
- nonce,
556
- gasLimit: BigInt(gasLimit),
557
- chainId
558
- };
559
- if (txType === 2) {
560
- tx.maxFeePerGas = gasPrice;
561
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
562
- tx.type = 2;
563
- }
564
- else {
565
- tx.gasPrice = gasPrice;
566
- tx.type = 0;
567
- }
568
- return await wallet.signTransaction(tx);
569
- }
570
- /**
571
- * 构建 V3 买入交易(ERC20 输入)
572
- * USDT/USDC → Token (使用 exactInputSingle + multicall)
573
- *
574
- * ✅ 修复:使用 ethers.Interface 手动编码 calldata,避免 multicall 重载问题
575
- */
576
- async function buildV3BuyTxWithERC20(wallet, tokenAddress, baseTokenAddress, buyAmount, nonce, gasPrice, gasLimit, chainId, txType, v3Fee = 2500) {
577
- const deadline = getDeadline();
578
- const v3RouterIface = new ethers.Interface(V3_ROUTER02_ABI);
579
- // 构建 exactInputSingle calldata
580
- const swapParams = {
581
- tokenIn: baseTokenAddress,
582
- tokenOut: tokenAddress,
583
- fee: v3Fee,
584
- recipient: wallet.address,
585
- amountIn: buyAmount,
586
- amountOutMinimum: 0n,
587
- sqrtPriceLimitX96: 0n
588
- };
589
- const exactInputSingleData = v3RouterIface.encodeFunctionData('exactInputSingle', [swapParams]);
590
- // ✅ 使用明确的函数签名编码 multicall,避免重载问题
591
- const multicallData = v3RouterIface.encodeFunctionData('multicall(uint256,bytes[])', [
592
- deadline,
593
- [exactInputSingleData]
594
- ]);
595
- const tx = {
596
- to: PANCAKE_V3_ROUTER_ADDRESS,
597
- data: multicallData,
598
- value: 0n,
599
- nonce,
600
- gasLimit: BigInt(gasLimit),
601
- chainId
602
- };
603
- if (txType === 2) {
604
- tx.maxFeePerGas = gasPrice;
605
- tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
606
- tx.type = 2;
607
- }
608
- else {
609
- tx.gasPrice = gasPrice;
610
- tx.type = 0;
611
- }
612
- return await wallet.signTransaction(tx);
613
- }
614
- // ============================================================================
615
- // 主方法
616
- // ============================================================================
617
- /**
618
- * 刷持有人(一个 bundle 完成分发+买入)
619
- *
620
- * 原生代币模式流程(同一个 bundle):
621
- * 1. 贿赂交易
622
- * 2. 分发原生代币(dev → 新钱包)
623
- * 3. 买入交易(新钱包 nonce=0)
624
- * 4. 利润多跳
625
- *
626
- * ERC20 模式流程(同一个 bundle):
627
- * 1. 贿赂交易
628
- * 2. 分发原生代币(gas 费)
629
- * 3. 分发 ERC20 代币(购买资金)
630
- * 4. 授权交易(新钱包 nonce=0)
631
- * 5. 买入交易(新钱包 nonce=1)
632
- * 6. 利润多跳
633
- *
634
- * @returns 包含所有签名交易的结果,由前端提交
635
- */
6
+ import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from './bundle-helpers.js';
7
+ import { BLOCKRAZOR_BUILDER_EOA, getProfitRecipient } from '../shared/constants/index.js';
8
+ import { getProfitRateBps as getSharedProfitRateBps } from '../shared/constants/index.js';
9
+ import { getErrorMessageFromUnknown } from '../shared/foundation/index.js';
10
+ import { DEFAULT_GAS_LIMIT, DEFAULT_GAS_PRICE_GWEI, DEFAULT_MAX_WALLETS_PER_BATCH_ERC20, DEFAULT_MAX_WALLETS_PER_BATCH_NATIVE, GAS_BUFFER_MULTIPLIER, NATIVE_TRANSFER_GAS_LIMIT, buildDaoaasBuyTx, buildDisperseHopChainERC20, buildDisperseHopChainNative, buildERC20ApproveTx, buildFlapBuyTx, buildFourBuyTx, buildNativeTransferTx, buildV2BuyTx, buildV2BuyTxWithERC20, buildV3BuyTx, buildV3BuyTxWithERC20, calculateMaxWalletsPerBatch, chunkArray, generateDisperseHopPaths, getBaseTokenAddress, getRouterAddress, } from './holders-maker-helpers.js';
636
11
  export async function holdersMaker(params) {
637
- const { payerPrivateKey, holdersCount, buyAmountPerHolder, tokenAddress, baseToken = 'native', baseTokenAddress, baseTokenDecimals = 18, config } = params;
638
- const { rpcUrl, chain = 'BSC', chainId: configChainId, tradeType = 'flap', gasLimit = DEFAULT_GAS_LIMIT, gasPriceGwei = DEFAULT_GAS_PRICE_GWEI, bribeAmount = 0.000001, txType: configTxType = 0, disperseHopCount = 0 // ✅ 分发多跳数(默认0=直接转账)
12
+ const { payerPrivateKey, holdersCount, buyAmountPerHolder, tokenAddress, baseToken = 'native', baseTokenAddress, baseTokenDecimals = 18, config, } = params;
13
+ const { rpcUrl, chain = 'BSC', chainId: configChainId, tradeType = 'flap', gasLimit = DEFAULT_GAS_LIMIT, gasPriceGwei = DEFAULT_GAS_PRICE_GWEI, bribeAmount = 0.000001, txType: configTxType = 0, disperseHopCount = 0, // ✅ 分发多跳数(默认0=直接转账)
639
14
  } = config;
640
15
  // ENI 链强制使用 EIP-1559 (type 2)
641
16
  const txType = chain === 'ENI' ? 2 : configTxType;
@@ -647,7 +22,7 @@ export async function holdersMaker(params) {
647
22
  signedTransactions: [],
648
23
  batchResults: [],
649
24
  successBatchCount: 0,
650
- totalBatchCount: 0
25
+ totalBatchCount: 0,
651
26
  };
652
27
  const isERC20Mode = baseToken !== 'native';
653
28
  // ✅ ERC20 模式只支持 v2/v3 外盘
@@ -664,8 +39,7 @@ export async function holdersMaker(params) {
664
39
  // ✅ 根据分发多跳数动态计算每批最大钱包数
665
40
  // XLayer 强制禁用分发多跳(ENI 已支持前端分层广播)
666
41
  const effectiveDisperseHopCount = chain === 'XLAYER' ? 0 : disperseHopCount;
667
- const maxWalletsPerBatch = config.maxWalletsPerBatch ||
668
- calculateMaxWalletsPerBatch(isERC20Mode, effectiveDisperseHopCount, chain);
42
+ const maxWalletsPerBatch = config.maxWalletsPerBatch || calculateMaxWalletsPerBatch(isERC20Mode, effectiveDisperseHopCount, chain);
669
43
  try {
670
44
  // 1. 初始化
671
45
  const provider = new JsonRpcProvider(rpcUrl);
@@ -706,7 +80,7 @@ export async function holdersMaker(params) {
706
80
  const totalBuyAmountForProfit = isERC20Mode
707
81
  ? ethers.parseEther(buyAmountPerHolder) * BigInt(holdersCount) // 按等值 BNB 计算
708
82
  : buyAmountWei * BigInt(holdersCount);
709
- const profitRateBps = getProfitRateBps('normal');
83
+ const profitRateBps = getSharedProfitRateBps('normal');
710
84
  const totalProfit = (totalBuyAmountForProfit * BigInt(profitRateBps)) / 10000n;
711
85
  let profitPerBatch = totalProfit / BigInt(walletBatches.length);
712
86
  if (profitPerBatch > 0n && chain === 'ENI') {
@@ -737,7 +111,7 @@ export async function holdersMaker(params) {
737
111
  // BSC 原生模式(有多跳H): 贿赂 1 + 分发首跳 N + 利润 (PROFIT_HOP_COUNT + 1)
738
112
  // BSC ERC20模式(无多跳): 贿赂 1 + 分发BNB N + 分发ERC20 N + 利润 (PROFIT_HOP_COUNT + 1)
739
113
  const bribeCount = needBribe ? 1 : 0;
740
- const profitCount = needProfitHop ? (PROFIT_HOP_COUNT + 1) : 1; // XLayer 只有 1 笔利润转账
114
+ const profitCount = needProfitHop ? PROFIT_HOP_COUNT + 1 : 1; // XLayer 只有 1 笔利润转账
741
115
  const payerNonceCount = isERC20Mode
742
116
  ? bribeCount + batch.length * 2 + profitCount
743
117
  : bribeCount + batch.length + profitCount;
@@ -754,8 +128,7 @@ export async function holdersMaker(params) {
754
128
  // (2) 分发原生代币(支持多跳)
755
129
  for (let i = 0; i < batch.length; i++) {
756
130
  const path = batchPaths[i];
757
- const { signedTxs: hopTxs } = await buildDisperseHopChainNative(payer, path, transferNativePerWallet, gasPrice, chainId, txType, payerNonces[payerNonceIdx++], isERC20Mode // ✅ ERC20 模式下,中间钱包需要预留 ERC20 转账 gas
758
- );
131
+ const { signedTxs: hopTxs } = await buildDisperseHopChainNative(payer, path, transferNativePerWallet, gasPrice, chainId, txType, payerNonces[payerNonceIdx++], isERC20Mode);
759
132
  signedTxs.push(...hopTxs);
760
133
  }
761
134
  // (3) ERC20 模式:分发 ERC20 代币(支持多跳)
@@ -836,7 +209,7 @@ export async function holdersMaker(params) {
836
209
  gasPrice,
837
210
  chainId,
838
211
  txType,
839
- startNonce: payerNonces[payerNonceIdx]
212
+ startNonce: payerNonces[payerNonceIdx],
840
213
  });
841
214
  signedTxs.push(...profitHopResult.signedTransactions);
842
215
  profitHopWallets = profitHopResult.hopWallets;
@@ -852,16 +225,15 @@ export async function holdersMaker(params) {
852
225
  success: true,
853
226
  signedTransactions: signedTxs,
854
227
  walletCount: batch.length,
855
- profitHopWallets // ✅ 返回利润多跳钱包
228
+ profitHopWallets, // ✅ 返回利润多跳钱包
856
229
  };
857
230
  }
858
231
  catch (error) {
859
- const msg = error instanceof Error ? error.message : String(error);
860
232
  return {
861
233
  batchIndex: batchIdx,
862
234
  success: false,
863
- error: msg,
864
- walletCount: batch.length
235
+ error: getErrorMessageFromUnknown(error),
236
+ walletCount: batch.length,
865
237
  };
866
238
  }
867
239
  });
@@ -883,7 +255,7 @@ export async function holdersMaker(params) {
883
255
  signedTransactions: res.signedTransactions,
884
256
  error: res.error,
885
257
  walletCount: res.walletCount,
886
- disperseHopCount: effectiveDisperseHopCount // ✅ 添加分发多跳数
258
+ disperseHopCount: effectiveDisperseHopCount, // ✅ 添加分发多跳数
887
259
  });
888
260
  }
889
261
  // ✅ 添加利润多跳钱包到结果
@@ -895,7 +267,7 @@ export async function holdersMaker(params) {
895
267
  result.success = result.successBatchCount > 0;
896
268
  }
897
269
  catch (error) {
898
- const msg = error instanceof Error ? error.message : String(error);
270
+ const msg = getErrorMessageFromUnknown(error);
899
271
  result.error = msg;
900
272
  console.error(`[HoldersMaker] 整体失败:`, msg);
901
273
  }
@@ -905,7 +277,7 @@ export async function holdersMaker(params) {
905
277
  * 获取刷持有人预估费用
906
278
  */
907
279
  export function estimateHoldersMakerCost(params) {
908
- const { holdersCount, buyAmountPerHolder, baseToken = 'native', gasLimit = DEFAULT_GAS_LIMIT, gasPriceGwei = DEFAULT_GAS_PRICE_GWEI } = params;
280
+ const { holdersCount, buyAmountPerHolder, baseToken = 'native', gasLimit = DEFAULT_GAS_LIMIT, gasPriceGwei = DEFAULT_GAS_PRICE_GWEI, } = params;
909
281
  const isERC20Mode = baseToken !== 'native';
910
282
  const gasMultiplier = isERC20Mode ? 2 : 1; // ERC20 模式需要授权+购买
911
283
  const gasFeePerWallet = (gasLimit * gasPriceGwei * gasMultiplier) / 1e9;
@@ -922,7 +294,7 @@ export function estimateHoldersMakerCost(params) {
922
294
  totalNativeCost: totalNativeCost.toFixed(6),
923
295
  totalERC20Cost: totalERC20Cost.toFixed(6),
924
296
  gasEstimate: (gasWithBuffer * holdersCount).toFixed(6),
925
- batchCount
297
+ batchCount,
926
298
  };
927
299
  }
928
300
  else {
@@ -932,7 +304,7 @@ export function estimateHoldersMakerCost(params) {
932
304
  return {
933
305
  totalNativeCost: totalNativeCost.toFixed(6),
934
306
  gasEstimate: (gasWithBuffer * holdersCount).toFixed(6),
935
- batchCount
307
+ batchCount,
936
308
  };
937
309
  }
938
310
  }