four-flap-meme-sdk 1.9.49 → 2.1.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 (567) hide show
  1. package/README.en.md +41 -6
  2. package/README.md +31 -0
  3. package/README.zh-CN.md +41 -6
  4. package/dist/__tests__/subpath-exports.test.js +34 -0
  5. package/dist/abis/common.js +74 -68
  6. package/dist/abis/flap/vault.js +9 -7
  7. package/dist/abis/index.d.ts +3 -4
  8. package/dist/abis/index.js +3 -4
  9. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  10. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  11. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  12. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  13. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  14. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  15. package/dist/bundle-core/config-helpers.d.ts +36 -0
  16. package/dist/bundle-core/config-helpers.js +57 -0
  17. package/dist/bundle-core/errors.d.ts +50 -0
  18. package/dist/bundle-core/errors.js +34 -0
  19. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  20. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  21. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  22. package/dist/bundle-core/four-meme/core-helpers.js +40 -0
  23. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  24. package/dist/bundle-core/four-meme/core.js +515 -0
  25. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  26. package/dist/{shared 2/flap/portal-bundle-merkle/pancake-proxy.js → bundle-core/four-meme/pancake-proxy.js} +277 -299
  27. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  28. package/dist/bundle-core/four-meme/private.js +465 -0
  29. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  30. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  31. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  32. package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
  33. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  34. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  35. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  36. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  37. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
  38. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  39. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  40. package/dist/{chains/bsc/four/swap/index.js → bundle-core/four-meme/swap.js} +84 -408
  41. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  42. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  43. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  44. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  45. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  46. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  47. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  48. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  49. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  50. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  51. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  52. package/dist/bundle-core/index.d.ts +8 -0
  53. package/dist/bundle-core/index.js +8 -0
  54. package/dist/bundle-core/internal.d.ts +21 -0
  55. package/dist/bundle-core/internal.js +182 -0
  56. package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
  57. package/dist/bundle-core/sign-context-helpers.js +67 -0
  58. package/dist/bundle-core/submit.d.ts +293 -0
  59. package/dist/bundle-core/submit.js +727 -0
  60. package/dist/bundle-core/types/index.d.ts +8 -0
  61. package/dist/bundle-core/types.d.ts +1 -0
  62. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  63. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -116
  64. package/dist/chains/bsc/four/config.d.ts +5 -70
  65. package/dist/chains/bsc/four/config.js +2 -115
  66. package/dist/chains/bsc/four/core.d.ts +1 -4
  67. package/dist/chains/bsc/four/core.js +1 -589
  68. package/dist/chains/bsc/four/index.d.ts +6 -6
  69. package/dist/chains/bsc/four/index.js +6 -6
  70. package/dist/chains/bsc/four/internal.d.ts +2 -50
  71. package/dist/chains/bsc/four/internal.js +2 -237
  72. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  73. package/dist/chains/bsc/four/pancake-proxy.js +1 -688
  74. package/dist/chains/bsc/four/private.d.ts +1 -27
  75. package/dist/chains/bsc/four/private.js +1 -477
  76. package/dist/chains/bsc/four/submit.d.ts +2 -315
  77. package/dist/chains/bsc/four/submit.js +2 -746
  78. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  79. package/dist/chains/bsc/four/swap-buy-first.js +2 -506
  80. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  81. package/dist/chains/bsc/four/swap-internal.js +1 -18
  82. package/dist/chains/bsc/four/swap.d.ts +2 -144
  83. package/dist/chains/bsc/four/swap.js +2 -760
  84. package/dist/chains/bsc/four/types.d.ts +1 -476
  85. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  86. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  87. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  88. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  89. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  90. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  91. package/dist/chains/bsc/four/utils.d.ts +5 -18
  92. package/dist/chains/bsc/four/utils.js +5 -1534
  93. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
  94. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
  95. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  96. package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -207
  97. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  98. package/dist/chains/bsc/pancake/{bundle-swap/helpers.js → bundle-swap-helpers.js} +63 -70
  99. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  100. package/dist/chains/bsc/pancake/bundle-swap.js +111 -686
  101. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  102. package/dist/chains/bsc/pancake/index.js +1 -3
  103. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  104. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  105. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  106. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  107. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  108. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  109. package/dist/chains/eni/batch-router/transfer.js +54 -23
  110. package/dist/chains/eni/batch-router/utils.js +32 -6
  111. package/dist/chains/eni/bundler/sign.js +4 -4
  112. package/dist/chains/eni/bundler/submit.js +1 -4
  113. package/dist/chains/eni/constants.js +1 -1
  114. package/dist/chains/eni/index.d.ts +1 -1
  115. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  116. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  117. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  118. package/dist/chains/eni/platforms/daoaas/meta.js +8 -4
  119. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
  120. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  121. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  122. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  123. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  124. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -47
  125. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  126. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  127. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  128. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  129. package/dist/chains/eni/platforms/iro/index.js +4 -4
  130. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  131. package/dist/chains/eni/platforms/iro/token.js +107 -31
  132. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  133. package/dist/chains/eni/submit.js +5 -13
  134. package/dist/chains/index.d.ts +13 -0
  135. package/dist/chains/index.js +13 -0
  136. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  137. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
  138. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  139. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  140. package/dist/chains/xlayer/eip7702/bundle-create.js +93 -56
  141. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  142. package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
  143. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  144. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
  145. package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
  146. package/dist/chains/xlayer/eip7702/constants.js +3 -21
  147. package/dist/chains/xlayer/eip7702/index.d.ts +29 -46
  148. package/dist/chains/xlayer/eip7702/index.js +27 -81
  149. package/dist/chains/xlayer/eip7702/{multi-hop-transfer/types.d.ts → multi-hop-transfer-helpers.d.ts} +17 -23
  150. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  151. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +58 -291
  152. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  153. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
  154. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  155. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  156. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  157. package/dist/chains/xlayer/eip7702/{volume/types.d.ts → volume-helpers.d.ts} +41 -17
  158. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  159. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  160. package/dist/chains/xlayer/eip7702/volume.js +83 -158
  161. package/dist/chains/xlayer/eoa/constants.js +1 -1
  162. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  163. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  164. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  165. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  166. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +64 -276
  167. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  168. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
  169. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  170. package/dist/chains/xlayer/eoa/index.js +8 -23
  171. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  172. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  173. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  174. package/dist/chains/xlayer/eoa/types.js +1 -3
  175. package/dist/contracts/helper3.d.ts +20 -17
  176. package/dist/contracts/helper3.js +56 -20
  177. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  178. package/dist/contracts/tm-bundle-helpers.js +72 -0
  179. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  180. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -117
  181. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
  182. package/dist/contracts/tm-bundle-merkle/config.js +2 -115
  183. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  184. package/dist/contracts/tm-bundle-merkle/core.js +1 -588
  185. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  186. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  187. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -50
  188. package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
  189. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  190. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
  191. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  192. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  193. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  194. package/dist/contracts/tm-bundle-merkle/submit.js +3 -919
  195. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  196. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
  197. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  198. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  199. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  200. package/dist/contracts/tm-bundle-merkle/swap.js +2 -757
  201. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  202. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  203. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  204. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  205. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  206. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  207. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  208. package/dist/contracts/tm-bundle-merkle/utils.d.ts +5 -6
  209. package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
  210. package/dist/contracts/tm-bundle.d.ts +3 -51
  211. package/dist/contracts/tm-bundle.js +102 -142
  212. package/dist/contracts/tm.d.ts +3 -2
  213. package/dist/contracts/tm.js +36 -32
  214. package/dist/contracts/tm1.js +9 -4
  215. package/dist/contracts/tm2.js +9 -4
  216. package/dist/dex/direct-router-helpers.d.ts +264 -0
  217. package/dist/dex/direct-router-helpers.js +539 -0
  218. package/dist/dex/direct-router.d.ts +3 -125
  219. package/dist/dex/direct-router.js +237 -652
  220. package/dist/dex/{direct-router/types.d.ts → types.d.ts} +1 -1
  221. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  222. package/dist/exports/root-bundle-and-tooling.js +30 -0
  223. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  224. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  225. package/dist/exports/root-foundations.d.ts +35 -0
  226. package/dist/exports/root-foundations.js +70 -0
  227. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  228. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  229. package/dist/flap/index.d.ts +10 -0
  230. package/dist/flap/index.js +8 -0
  231. package/dist/flows/create.d.ts +2 -2
  232. package/dist/flows/create.js +6 -6
  233. package/dist/flows/index.d.ts +1 -0
  234. package/dist/flows/index.js +1 -0
  235. package/dist/index.d.ts +20 -91
  236. package/dist/index.js +20 -215
  237. package/dist/shared/abis/common.d.ts +2 -83
  238. package/dist/shared/abis/common.js +2 -252
  239. package/dist/shared/abis/index.d.ts +5 -6
  240. package/dist/shared/abis/index.js +5 -7
  241. package/dist/shared/clients/blockrazor.js +41 -24
  242. package/dist/shared/clients/club48.js +30 -26
  243. package/dist/shared/clients/emitservice.js +2 -0
  244. package/dist/shared/clients/four.js +23 -18
  245. package/dist/shared/clients/index.d.ts +8 -0
  246. package/dist/shared/clients/index.js +8 -0
  247. package/dist/shared/clients/merkle.js +26 -30
  248. package/dist/shared/constants/addresses.d.ts +1 -1
  249. package/dist/shared/constants/addresses.js +11 -2
  250. package/dist/shared/constants/chains.d.ts +1 -1
  251. package/dist/shared/constants/chains.js +1 -1
  252. package/dist/shared/constants/gas.d.ts +1 -1
  253. package/dist/shared/constants/gas.js +2 -6
  254. package/dist/shared/constants/index.d.ts +3 -0
  255. package/dist/shared/constants/index.js +1 -0
  256. package/dist/shared/constants/quote.d.ts +30 -0
  257. package/dist/shared/constants/quote.js +37 -0
  258. package/dist/shared/flap/abi.js +1 -1
  259. package/dist/shared/flap/constants.d.ts +1 -1
  260. package/dist/shared/flap/constants.js +2 -2
  261. package/dist/shared/flap/curve.js +3 -0
  262. package/dist/shared/flap/errors.d.ts +1 -4
  263. package/dist/shared/flap/errors.js +21 -3
  264. package/dist/shared/flap/index.d.ts +2 -2
  265. package/dist/shared/flap/index.js +2 -2
  266. package/dist/shared/flap/meta.d.ts +16 -18
  267. package/dist/shared/flap/meta.js +14 -26
  268. package/dist/shared/flap/permit.js +6 -5
  269. package/dist/shared/flap/pinata.d.ts +9 -2
  270. package/dist/shared/flap/pinata.js +20 -18
  271. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  272. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  273. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  274. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  275. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  276. package/dist/shared/flap/portal-bundle-merkle/core.js +66 -156
  277. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
  278. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
  279. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  280. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  281. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  282. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  283. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  284. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  285. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  286. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
  287. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  288. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  289. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
  290. package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
  291. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +73 -3
  292. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  293. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  294. package/dist/shared/flap/portal-bundle.js +54 -42
  295. package/dist/shared/flap/portal.js +32 -10
  296. package/dist/shared/flap/vanity.js +4 -7
  297. package/dist/shared/flap/vault.d.ts +1 -1
  298. package/dist/shared/flap/vault.js +54 -48
  299. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  300. package/dist/shared/foundation/dex/v3-path.js +35 -0
  301. package/dist/shared/foundation/gas/bundle-gas.d.ts +39 -0
  302. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  303. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  304. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  305. package/dist/shared/foundation/index.d.ts +13 -0
  306. package/dist/shared/foundation/index.js +12 -0
  307. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  308. package/dist/shared/foundation/nonce/nonce-manager.js +180 -0
  309. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  310. package/dist/shared/foundation/normalize-unknown.js +29 -0
  311. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  312. package/dist/shared/foundation/sdk-logger.js +12 -0
  313. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  314. package/dist/shared/foundation/tx/build-request.js +25 -0
  315. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  316. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  317. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  318. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  319. package/dist/{utils/erc20/types.d.ts → shared/foundation/types/erc20.d.ts} +7 -19
  320. package/dist/{utils/holders-maker/types.d.ts → shared/foundation/types/holders-maker.d.ts} +4 -12
  321. package/dist/shared/foundation/types/index.d.ts +7 -0
  322. package/dist/{utils/lp-inspect/types.d.ts → shared/foundation/types/lp-inspect.d.ts} +4 -2
  323. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  324. package/dist/shared/foundation/types/multicall.js +1 -0
  325. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  326. package/dist/shared/foundation/types/private-sale.js +1 -0
  327. package/dist/{utils/quote-helpers/types.d.ts → shared/foundation/types/quote-helpers.d.ts} +1 -0
  328. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  329. package/dist/shared/four/tax-token.d.ts +1 -1
  330. package/dist/shared/four/tax-token.js +27 -7
  331. package/dist/shared/index.d.ts +6 -0
  332. package/dist/shared/index.js +4 -0
  333. package/dist/utils/airdrop-sweep.d.ts +4 -76
  334. package/dist/utils/airdrop-sweep.js +38 -52
  335. package/dist/utils/bundle-helpers.d.ts +9 -243
  336. package/dist/utils/bundle-helpers.js +10 -584
  337. package/dist/utils/constants.d.ts +5 -61
  338. package/dist/utils/constants.js +5 -80
  339. package/dist/utils/contract-factory.d.ts +2 -4
  340. package/dist/utils/contract-factory.js +25 -18
  341. package/dist/utils/erc20.d.ts +8 -90
  342. package/dist/utils/erc20.js +94 -153
  343. package/dist/utils/errors.d.ts +10 -22
  344. package/dist/utils/errors.js +61 -79
  345. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  346. package/dist/utils/holders-maker/addresses.js +15 -0
  347. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  348. package/dist/utils/holders-maker/buy-tx.js +278 -0
  349. package/dist/utils/holders-maker/constants.d.ts +6 -0
  350. package/dist/utils/holders-maker/constants.js +7 -0
  351. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  352. package/dist/utils/holders-maker/disperse.js +90 -0
  353. package/dist/utils/holders-maker/routing.d.ts +4 -0
  354. package/dist/utils/holders-maker/routing.js +45 -0
  355. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  356. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  357. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  358. package/dist/utils/holders-maker-helpers.js +9 -0
  359. package/dist/utils/holders-maker.d.ts +2 -138
  360. package/dist/utils/holders-maker.js +23 -651
  361. package/dist/utils/hop-chains.d.ts +35 -0
  362. package/dist/utils/hop-chains.js +215 -0
  363. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  364. package/dist/utils/lp-inspect-helpers.js +109 -0
  365. package/dist/utils/lp-inspect.d.ts +2 -112
  366. package/dist/utils/lp-inspect.js +63 -195
  367. package/dist/utils/mpcExclusive.d.ts +2 -5
  368. package/dist/utils/mpcExclusive.js +4 -3
  369. package/dist/utils/private-sale.d.ts +2 -58
  370. package/dist/utils/private-sale.js +2 -7
  371. package/dist/utils/provider-factory.d.ts +4 -0
  372. package/dist/utils/provider-factory.js +10 -0
  373. package/dist/utils/quote-helpers.d.ts +4 -45
  374. package/dist/utils/quote-helpers.js +15 -65
  375. package/dist/utils/stealth-transfer.d.ts +2 -28
  376. package/dist/utils/stealth-transfer.js +30 -14
  377. package/dist/utils/swap-helpers.d.ts +0 -3
  378. package/dist/utils/swap-helpers.js +6 -9
  379. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  380. package/dist/utils/types/airdrop-sweep.js +1 -0
  381. package/dist/utils/types/contract-factory.d.ts +1 -0
  382. package/dist/utils/types/contract-factory.js +1 -0
  383. package/dist/utils/types/erc20.d.ts +1 -0
  384. package/dist/utils/types/erc20.js +1 -0
  385. package/dist/utils/types/errors.d.ts +1 -0
  386. package/dist/utils/types/errors.js +1 -0
  387. package/dist/utils/types/holders-maker.d.ts +1 -0
  388. package/dist/utils/types/holders-maker.js +1 -0
  389. package/dist/utils/types/hop-chains.d.ts +8 -0
  390. package/dist/utils/types/hop-chains.js +1 -0
  391. package/dist/utils/types/index.d.ts +13 -0
  392. package/dist/utils/types/index.js +1 -0
  393. package/dist/utils/types/lp-inspect.d.ts +1 -0
  394. package/dist/utils/types/lp-inspect.js +1 -0
  395. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  396. package/dist/utils/types/mpc-exclusive.js +1 -0
  397. package/dist/utils/types/private-sale.d.ts +1 -0
  398. package/dist/utils/types/private-sale.js +1 -0
  399. package/dist/utils/types/quote-helpers.d.ts +1 -0
  400. package/dist/utils/types/quote-helpers.js +1 -0
  401. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  402. package/dist/utils/types/stealth-transfer.js +1 -0
  403. package/dist/utils/types/wallet.d.ts +25 -0
  404. package/dist/utils/types/wallet.js +1 -0
  405. package/dist/utils/wallet.d.ts +2 -25
  406. package/dist/utils/wallet.js +9 -10
  407. package/package.json +120 -2
  408. package/src/abis/contracts/TaxToken.json +969 -0
  409. package/src/abis/contracts/TokenManager.json +836 -0
  410. package/src/abis/contracts/TokenManager2.json +136 -0
  411. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  412. package/dist/chains/bsc/four/submit/blockrazor.d.ts +0 -18
  413. package/dist/chains/bsc/four/submit/blockrazor.js +0 -86
  414. package/dist/chains/bsc/four/submit/direct.d.ts +0 -66
  415. package/dist/chains/bsc/four/submit/direct.js +0 -452
  416. package/dist/chains/bsc/four/submit/helpers.d.ts +0 -18
  417. package/dist/chains/bsc/four/submit/helpers.js +0 -57
  418. package/dist/chains/bsc/four/submit/index.d.ts +0 -12
  419. package/dist/chains/bsc/four/submit/index.js +0 -11
  420. package/dist/chains/bsc/four/submit/merkle.d.ts +0 -18
  421. package/dist/chains/bsc/four/submit/merkle.js +0 -74
  422. package/dist/chains/bsc/four/submit/types.d.ts +0 -143
  423. package/dist/chains/bsc/four/swap/index.d.ts +0 -32
  424. package/dist/chains/bsc/four/swap/types.d.ts +0 -70
  425. package/dist/chains/bsc/four/utils/index.d.ts +0 -20
  426. package/dist/chains/bsc/four/utils/index.js +0 -1558
  427. package/dist/chains/bsc/pancake/bundle-buy-first/index.d.ts +0 -8
  428. package/dist/chains/bsc/pancake/bundle-buy-first/index.js +0 -907
  429. package/dist/chains/bsc/pancake/bundle-buy-first/types.d.ts +0 -73
  430. package/dist/chains/bsc/pancake/bundle-swap/helpers.d.ts +0 -102
  431. package/dist/chains/bsc/pancake/bundle-swap/index.d.ts +0 -50
  432. package/dist/chains/bsc/pancake/bundle-swap/index.js +0 -1066
  433. package/dist/chains/bsc/pancake/bundle-swap/types.d.ts +0 -202
  434. package/dist/chains/bsc/pancake/bundle-swap/types.js +0 -3
  435. package/dist/chains/xlayer/eip7702/bundle-swap/index.d.ts +0 -72
  436. package/dist/chains/xlayer/eip7702/bundle-swap/index.js +0 -921
  437. package/dist/chains/xlayer/eip7702/bundle-swap/types.d.ts +0 -65
  438. package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.d.ts +0 -128
  439. package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.js +0 -857
  440. package/dist/chains/xlayer/eip7702/volume/index.d.ts +0 -96
  441. package/dist/chains/xlayer/eip7702/volume/index.js +0 -793
  442. package/dist/dex/direct-router/index.d.ts +0 -70
  443. package/dist/dex/direct-router/index.js +0 -1410
  444. package/dist/shared/abis/TaxToken.json +0 -969
  445. package/dist/shared/abis/TokenManager.json +0 -836
  446. package/dist/shared/abis/TokenManager2.json +0 -136
  447. package/dist/shared/abis/TokenManagerHelper3.json +0 -993
  448. package/dist/shared/flap/__tests__/curve.test.js +0 -85
  449. package/dist/shared/flap/portal/index.d.ts +0 -12
  450. package/dist/shared/flap/portal/index.js +0 -11
  451. package/dist/shared/flap/portal/portal.d.ts +0 -47
  452. package/dist/shared/flap/portal/portal.js +0 -218
  453. package/dist/shared/flap/portal/types.d.ts +0 -227
  454. package/dist/shared/flap/portal/types.js +0 -80
  455. package/dist/shared/flap/portal/writer.d.ts +0 -121
  456. package/dist/shared/flap/portal/writer.js +0 -265
  457. package/dist/shared/flap/portal-bundle-merkle/core/index.d.ts +0 -18
  458. package/dist/shared/flap/portal-bundle-merkle/core/index.js +0 -938
  459. package/dist/shared/flap/portal-bundle-merkle/swap/index.d.ts +0 -42
  460. package/dist/shared/flap/portal-bundle-merkle/swap/index.js +0 -1448
  461. package/dist/shared/flap/portal-bundle-merkle/swap/types.d.ts +0 -84
  462. package/dist/shared/flap/portal-bundle-merkle/utils/index.d.ts +0 -17
  463. package/dist/shared/flap/portal-bundle-merkle/utils/index.js +0 -1024
  464. package/dist/shared/flap/portal-bundle-merkle/utils/types.d.ts +0 -16
  465. package/dist/shared 2/abis/TaxToken.json +0 -105
  466. package/dist/shared 2/abis/TokenManager.json +0 -836
  467. package/dist/shared 2/abis/TokenManager2.json +0 -60
  468. package/dist/shared 2/abis/TokenManagerHelper3.json +0 -993
  469. package/dist/shared 2/abis/common.d.ts +0 -85
  470. package/dist/shared 2/abis/common.js +0 -254
  471. package/dist/shared 2/abis/index.d.ts +0 -8
  472. package/dist/shared 2/abis/index.js +0 -8
  473. package/dist/shared 2/clients/blockrazor.d.ts +0 -314
  474. package/dist/shared 2/clients/blockrazor.js +0 -596
  475. package/dist/shared 2/clients/club48.d.ts +0 -154
  476. package/dist/shared 2/clients/club48.js +0 -331
  477. package/dist/shared 2/clients/emitservice.d.ts +0 -47
  478. package/dist/shared 2/clients/emitservice.js +0 -44
  479. package/dist/shared 2/clients/four.d.ts +0 -132
  480. package/dist/shared 2/clients/four.js +0 -281
  481. package/dist/shared 2/clients/merkle.d.ts +0 -210
  482. package/dist/shared 2/clients/merkle.js +0 -400
  483. package/dist/shared 2/flap/__tests__/curve.test.js +0 -85
  484. package/dist/shared 2/flap/abi.d.ts +0 -4
  485. package/dist/shared 2/flap/abi.js +0 -4
  486. package/dist/shared 2/flap/constants.d.ts +0 -128
  487. package/dist/shared 2/flap/constants.js +0 -143
  488. package/dist/shared 2/flap/curve.d.ts +0 -33
  489. package/dist/shared 2/flap/curve.js +0 -84
  490. package/dist/shared 2/flap/errors.d.ts +0 -37
  491. package/dist/shared 2/flap/errors.js +0 -114
  492. package/dist/shared 2/flap/index.d.ts +0 -22
  493. package/dist/shared 2/flap/index.js +0 -33
  494. package/dist/shared 2/flap/ipfs.d.ts +0 -21
  495. package/dist/shared 2/flap/ipfs.js +0 -38
  496. package/dist/shared 2/flap/meta.d.ts +0 -30
  497. package/dist/shared 2/flap/meta.js +0 -195
  498. package/dist/shared 2/flap/permit.d.ts +0 -16
  499. package/dist/shared 2/flap/permit.js +0 -67
  500. package/dist/shared 2/flap/pinata.d.ts +0 -40
  501. package/dist/shared 2/flap/pinata.js +0 -106
  502. package/dist/shared 2/flap/portal-bundle-merkle/config.d.ts +0 -79
  503. package/dist/shared 2/flap/portal-bundle-merkle/config.js +0 -133
  504. package/dist/shared 2/flap/portal-bundle-merkle/core.d.ts +0 -18
  505. package/dist/shared 2/flap/portal-bundle-merkle/core.js +0 -938
  506. package/dist/shared 2/flap/portal-bundle-merkle/create-to-dex.d.ts +0 -125
  507. package/dist/shared 2/flap/portal-bundle-merkle/create-to-dex.js +0 -665
  508. package/dist/shared 2/flap/portal-bundle-merkle/curve-to-dex.d.ts +0 -88
  509. package/dist/shared 2/flap/portal-bundle-merkle/curve-to-dex.js +0 -446
  510. package/dist/shared 2/flap/portal-bundle-merkle/index.d.ts +0 -14
  511. package/dist/shared 2/flap/portal-bundle-merkle/index.js +0 -26
  512. package/dist/shared 2/flap/portal-bundle-merkle/pancake-proxy.d.ts +0 -28
  513. package/dist/shared 2/flap/portal-bundle-merkle/private.d.ts +0 -17
  514. package/dist/shared 2/flap/portal-bundle-merkle/private.js +0 -549
  515. package/dist/shared 2/flap/portal-bundle-merkle/swap-buy-first.d.ts +0 -65
  516. package/dist/shared 2/flap/portal-bundle-merkle/swap-buy-first.js +0 -831
  517. package/dist/shared 2/flap/portal-bundle-merkle/swap.d.ts +0 -201
  518. package/dist/shared 2/flap/portal-bundle-merkle/swap.js +0 -1359
  519. package/dist/shared 2/flap/portal-bundle-merkle/types.d.ts +0 -358
  520. package/dist/shared 2/flap/portal-bundle-merkle/utils.d.ts +0 -89
  521. package/dist/shared 2/flap/portal-bundle-merkle/utils.js +0 -963
  522. package/dist/shared 2/flap/portal-bundle.d.ts +0 -119
  523. package/dist/shared 2/flap/portal-bundle.js +0 -584
  524. package/dist/shared 2/flap/portal.d.ts +0 -392
  525. package/dist/shared 2/flap/portal.js +0 -559
  526. package/dist/shared 2/flap/vanity.d.ts +0 -48
  527. package/dist/shared 2/flap/vanity.js +0 -110
  528. package/dist/shared 2/flap/vault.d.ts +0 -240
  529. package/dist/shared 2/flap/vault.js +0 -366
  530. package/dist/shared 2/four/index.d.ts +0 -7
  531. package/dist/shared 2/four/index.js +0 -22
  532. package/dist/shared 2/four/tax-token.d.ts +0 -176
  533. package/dist/shared 2/four/tax-token.js +0 -302
  534. package/dist/shared 2/index.d.ts +0 -10
  535. package/dist/shared 2/index.js +0 -10
  536. package/dist/utils/__tests__/errors.test.js +0 -76
  537. package/dist/utils/erc20/index.d.ts +0 -242
  538. package/dist/utils/erc20/index.js +0 -645
  539. package/dist/utils/holders-maker/helpers.d.ts +0 -43
  540. package/dist/utils/holders-maker/helpers.js +0 -371
  541. package/dist/utils/holders-maker/index.d.ts +0 -26
  542. package/dist/utils/holders-maker/index.js +0 -218
  543. package/dist/utils/holders-maker/types.js +0 -4
  544. package/dist/utils/lp-inspect/index.d.ts +0 -44
  545. package/dist/utils/lp-inspect/index.js +0 -937
  546. package/dist/utils/quote-helpers/index.d.ts +0 -107
  547. package/dist/utils/quote-helpers/index.js +0 -346
  548. /package/dist/{chains/bsc/four/submit/types.js → __tests__/subpath-exports.test.d.ts} +0 -0
  549. /package/dist/{chains/bsc/four/swap/types.js → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
  550. /package/dist/{chains/bsc/four/utils/types.d.ts → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
  551. /package/dist/{chains/bsc/four/utils/types.js → bundle-core/__tests__/sign-context-helpers.test.d.ts} +0 -0
  552. /package/dist/{chains/bsc/pancake/bundle-buy-first/types.js → bundle-core/__tests__/sign-fixture.test.d.ts} +0 -0
  553. /package/dist/{chains/xlayer/eip7702/multi-hop-transfer/types.js → bundle-core/four-meme/types/buy-first.js} +0 -0
  554. /package/dist/{chains/xlayer/eip7702/volume/types.js → bundle-core/four-meme/types/core-flow.js} +0 -0
  555. /package/dist/{dex/direct-router/types.js → bundle-core/four-meme/types/index.js} +0 -0
  556. /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/four-meme/types/swap-internal.js} +0 -0
  557. /package/dist/{chains/xlayer/eip7702/bundle-swap → bundle-core/four-meme}/types.js +0 -0
  558. /package/dist/{shared/flap/__tests__/curve.test.d.ts → bundle-core/types/index.js} +0 -0
  559. /package/dist/{shared 2/flap/portal-bundle-merkle → bundle-core}/types.js +0 -0
  560. /package/dist/{shared/flap/portal-bundle-merkle/core/types.d.ts → chains/xlayer/eip7702/multi-hop-transfer-helpers.js} +0 -0
  561. /package/dist/{shared/flap/portal-bundle-merkle/core → dex}/types.js +0 -0
  562. /package/dist/shared/{flap/portal-bundle-merkle/swap/types.js → foundation/tx/wallet-sign-patch.d.ts} +0 -0
  563. /package/dist/shared/{flap/portal-bundle-merkle/utils/types.js → foundation/types/airdrop-sweep.js} +0 -0
  564. /package/dist/{utils/__tests__/errors.test.d.ts → shared/foundation/types/erc20.js} +0 -0
  565. /package/dist/{utils/erc20/types.js → shared/foundation/types/holders-maker.js} +0 -0
  566. /package/dist/{utils/lp-inspect/types.js → shared/foundation/types/index.js} +0 -0
  567. /package/dist/{utils/quote-helpers/types.js → shared/foundation/types/lp-inspect.js} +0 -0
@@ -1,759 +1,4 @@
1
1
  /**
2
- * Four.meme 内盘捆绑换手(Merkle Bundle)
3
- *
4
- * 功能:钱包A卖出代币 → 钱包B买入相同数量 → 原子执行
2
+ * TM-Merkle Four.meme 内盘捆绑换手 — 实现见 bundle-core/four-meme/
5
3
  */
6
- import { ethers, Contract, Wallet } from 'ethers';
7
- import { calculateSellAmount } from '../../utils/swap-helpers.js';
8
- import { NonceManager, getOptimizedGasPrice, getGasLimit, getGasPriceConfig, getTxType, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../utils/bundle-helpers.js';
9
- import { ADDRESSES, PROFIT_CONFIG, BLOCKRAZOR_BUILDER_EOA } from '../../utils/constants.js';
10
- /**
11
- * 根据 userType 计算利润率
12
- */
13
- function getProfitRateBps(userType) {
14
- if (userType === 'v0') {
15
- return PROFIT_CONFIG.RATE_BPS_V0; // 0.06%
16
- }
17
- else if (userType === 'v1') {
18
- return PROFIT_CONFIG.RATE_BPS_V1; // 0.05%
19
- }
20
- return PROFIT_CONFIG.RATE_BPS_V0; // 默认 0.06%
21
- }
22
- import { TM_ABI, HELPER3_ABI, TM_ADDRESS } from './swap-internal.js';
23
- import { getBribeAmount, getProfitRecipient } from './config.js';
24
- import { generateWallets } from '../../utils/wallet.js';
25
- // ==================== 多跳转账常量 ====================
26
- const NATIVE_TRANSFER_GAS_LIMIT = 21055n;
27
- /**
28
- * 生成分发多跳路径
29
- */
30
- function generateDisperseHopPaths(targetAddresses, hopCount, provider) {
31
- if (hopCount <= 0) {
32
- return targetAddresses.map(addr => ({
33
- targetAddress: addr,
34
- hopWallets: [],
35
- hopWalletsInfo: []
36
- }));
37
- }
38
- return targetAddresses.map(targetAddress => {
39
- const hopWalletsInfo = generateWallets(hopCount);
40
- const hopWallets = hopWalletsInfo.map(w => new Wallet(w.privateKey, provider));
41
- return { targetAddress, hopWallets, hopWalletsInfo };
42
- });
43
- }
44
- /**
45
- * 构建原生代币多跳转账链
46
- */
47
- async function buildNativeHopChain(payer, path, finalAmount, gasPrice, chainId, txType, payerNonce) {
48
- const signedTxs = [];
49
- const hopCount = path.hopWallets.length;
50
- if (hopCount === 0) {
51
- const tx = {
52
- to: path.targetAddress,
53
- value: finalAmount,
54
- nonce: payerNonce,
55
- gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
56
- gasPrice,
57
- chainId,
58
- type: txType
59
- };
60
- signedTxs.push(await payer.signTransaction(tx));
61
- return signedTxs;
62
- }
63
- const hopGasCost = NATIVE_TRANSFER_GAS_LIMIT * gasPrice;
64
- // 计算每跳需要的金额
65
- const amountsPerHop = [];
66
- for (let i = 0; i < hopCount; i++) {
67
- const remainingHops = hopCount - i;
68
- amountsPerHop.push(finalAmount + hopGasCost * BigInt(remainingHops));
69
- }
70
- // payer → hop1
71
- signedTxs.push(await payer.signTransaction({
72
- to: path.hopWallets[0].address,
73
- value: amountsPerHop[0],
74
- nonce: payerNonce,
75
- gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
76
- gasPrice,
77
- chainId,
78
- type: txType
79
- }));
80
- // hop1 → hop2 → ... → target
81
- for (let i = 0; i < hopCount; i++) {
82
- const fromWallet = path.hopWallets[i];
83
- const toAddress = i === hopCount - 1 ? path.targetAddress : path.hopWallets[i + 1].address;
84
- const amount = i === hopCount - 1 ? finalAmount : amountsPerHop[i + 1];
85
- signedTxs.push(await fromWallet.signTransaction({
86
- to: toAddress,
87
- value: amount,
88
- nonce: 0,
89
- gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
90
- gasPrice,
91
- chainId,
92
- type: txType
93
- }));
94
- }
95
- return signedTxs;
96
- }
97
- /**
98
- * Four内盘捆绑换手
99
- */
100
- export async function fourBundleSwapMerkle(params) {
101
- const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKey, tokenAddress, config, startNonces // ✅ 可选:前端预获取的 nonces
102
- } = params;
103
- const chainIdNum = config.chainId ?? 56;
104
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
105
- chainId: chainIdNum,
106
- name: 'BSC'
107
- });
108
- const seller = new Wallet(sellerPrivateKey, provider);
109
- const buyer = new Wallet(buyerPrivateKey, provider);
110
- const nonceManager = new NonceManager(provider);
111
- // ✅ 创建适配的配置对象
112
- const bundleConfig = {
113
- minGasPriceGwei: config.minGasPriceGwei,
114
- maxGasPriceGwei: config.maxGasPriceGwei,
115
- gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
116
- gasLimitMultiplier: config.gasLimitMultiplier,
117
- txType: config.txType,
118
- chainId: config.chainId
119
- };
120
- const finalGasLimit = getGasLimit(bundleConfig);
121
- const txType = getTxType(bundleConfig);
122
- // ✅ 优化:第一批并行 - calculateSellAmount、gasPrice
123
- const [sellAmountResult, gasPrice] = await Promise.all([
124
- calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
125
- getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
126
- ]);
127
- const { amount: sellAmountWei, decimals } = sellAmountResult;
128
- // ✅ 优化:第二批并行 - sellQuote、allowance、buyerBalance
129
- const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
130
- const erc20Contract = new Contract(tokenAddress, ['function allowance(address,address) view returns (uint256)'], provider);
131
- const [sellQuote, currentAllowance, buyerBalance] = await Promise.all([
132
- helper3.trySell(tokenAddress, sellAmountWei),
133
- erc20Contract.allowance(seller.address, TM_ADDRESS),
134
- provider.getBalance(buyer.address)
135
- ]);
136
- const sellerWillGetBNB = sellQuote.funds;
137
- const buyerFunds = sellerWillGetBNB;
138
- // 验证买方余额
139
- const reserveGas = ethers.parseEther((config.reserveGasBNB || 0.0005).toString());
140
- const requiredBalance = buyerFunds + reserveGas;
141
- if (buyerBalance < requiredBalance) {
142
- throw new Error(`买方余额不足:\n` +
143
- ` - 需要: ${ethers.formatEther(requiredBalance)} BNB\n` +
144
- ` - 实际: ${ethers.formatEther(buyerBalance)} BNB`);
145
- }
146
- // 检查是否需要授权
147
- const APPROVAL_THRESHOLD = ethers.parseUnits('1000000000', decimals);
148
- const needApproval = currentAllowance < APPROVAL_THRESHOLD;
149
- // 利润配置
150
- const extractProfit = true;
151
- const profitRateBps = getProfitRateBps(config.userType);
152
- const profitAmount = extractProfit && sellerWillGetBNB > 0n
153
- ? (sellerWillGetBNB * BigInt(profitRateBps)) / 10000n
154
- : 0n;
155
- // ✅ 获取贿赂金额
156
- const bribeAmount = getBribeAmount(config);
157
- const needBribeTx = bribeAmount > 0n;
158
- // ✅ 优化:第三批并行 - 构建交易、获取 nonces
159
- const tmSeller = new Contract(TM_ADDRESS, TM_ABI, seller);
160
- const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
161
- // 计算需要的 nonce 数量
162
- let sellerNonceCount = 1; // 卖出交易
163
- if (needBribeTx)
164
- sellerNonceCount++; // 贿赂交易
165
- if (needApproval)
166
- sellerNonceCount++; // 授权交易
167
- if (extractProfit)
168
- sellerNonceCount++; // 利润交易
169
- // ✅ 优化:使用批量 nonce 获取(JSON-RPC 批量请求)
170
- // 如果前端传入了 startNonces,直接使用;否则从链上获取
171
- const [sellUnsigned, buyUnsigned, noncesResult] = await Promise.all([
172
- tmSeller.sellToken.populateTransaction(0n, tokenAddress, sellAmountWei, 0n),
173
- tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, buyerFunds, 0n, { value: buyerFunds }),
174
- (async () => {
175
- // ✅ 如果前端传入了 startNonces,直接使用(性能优化)
176
- if (startNonces && startNonces.length >= 2) {
177
- const sellerNonces = Array.from({ length: sellerNonceCount }, (_, i) => startNonces[0] + i);
178
- const buyerNonce = startNonces[1];
179
- return { sellerNonces, buyerNonce };
180
- }
181
- // 否则从链上获取
182
- const initialNonces = await nonceManager.getNextNoncesForWallets([seller, buyer]);
183
- const sellerNonces = Array.from({ length: sellerNonceCount }, (_, i) => initialNonces[0] + i);
184
- const buyerNonce = initialNonces[1];
185
- return { sellerNonces, buyerNonce };
186
- })()
187
- ]);
188
- const { sellerNonces, buyerNonce } = noncesResult;
189
- // 分配 nonces
190
- let idx = 0;
191
- let bribeNonce;
192
- let approvalNonce;
193
- if (needBribeTx)
194
- bribeNonce = sellerNonces[idx++];
195
- if (needApproval)
196
- approvalNonce = sellerNonces[idx++];
197
- const sellerNonce = sellerNonces[idx++];
198
- const profitNonce = extractProfit ? sellerNonces[idx] : undefined;
199
- // ✅ 并行签名所有交易
200
- const signPromises = [];
201
- // ✅ 贿赂交易放在首位
202
- if (needBribeTx && bribeNonce !== undefined) {
203
- signPromises.push(seller.signTransaction({
204
- to: BLOCKRAZOR_BUILDER_EOA,
205
- value: bribeAmount,
206
- nonce: bribeNonce,
207
- gasPrice,
208
- gasLimit: 21000n,
209
- chainId: chainIdNum,
210
- type: txType
211
- }));
212
- }
213
- // 授权交易
214
- if (needApproval && approvalNonce !== undefined) {
215
- const approveInterface = new ethers.Interface(['function approve(address,uint256) returns (bool)']);
216
- const approveData = approveInterface.encodeFunctionData('approve', [TM_ADDRESS, ethers.MaxUint256]);
217
- signPromises.push(seller.signTransaction({
218
- to: tokenAddress,
219
- data: approveData,
220
- value: 0n,
221
- nonce: approvalNonce,
222
- gasLimit: 80000n,
223
- gasPrice,
224
- chainId: chainIdNum,
225
- type: txType
226
- }));
227
- }
228
- // 卖出和买入交易
229
- signPromises.push(seller.signTransaction({
230
- ...sellUnsigned,
231
- from: seller.address,
232
- nonce: sellerNonce,
233
- gasLimit: finalGasLimit,
234
- gasPrice,
235
- chainId: chainIdNum,
236
- type: txType
237
- }), buyer.signTransaction({
238
- ...buyUnsigned,
239
- from: buyer.address,
240
- nonce: buyerNonce,
241
- gasLimit: finalGasLimit,
242
- gasPrice,
243
- chainId: chainIdNum,
244
- type: txType,
245
- value: buyerFunds
246
- }));
247
- const signedTxs = await Promise.all(signPromises);
248
- // 解析签名结果
249
- let signIdx = 0;
250
- let bribeTx = null;
251
- let approvalTx = null;
252
- if (needBribeTx) {
253
- bribeTx = signedTxs[signIdx];
254
- signIdx = signIdx + 1;
255
- }
256
- if (needApproval) {
257
- approvalTx = signedTxs[signIdx];
258
- signIdx = signIdx + 1;
259
- }
260
- const signedSell = signedTxs[signIdx];
261
- signIdx = signIdx + 1;
262
- const signedBuy = signedTxs[signIdx];
263
- nonceManager.clearTemp();
264
- // ✅ 组装交易列表:贿赂 → 授权 → 卖出 → 买入
265
- const allTransactions = [];
266
- if (bribeTx)
267
- allTransactions.push(bribeTx);
268
- if (approvalTx)
269
- allTransactions.push(approvalTx);
270
- allTransactions.push(signedSell, signedBuy);
271
- // ✅ 利润多跳转账(强制 2 跳中转)
272
- let profitHopWallets;
273
- if (extractProfit && profitAmount > 0n && profitNonce !== undefined) {
274
- const profitHopResult = await buildProfitHopTransactions({
275
- provider,
276
- payerWallet: seller,
277
- profitAmount: profitAmount,
278
- profitRecipient: getProfitRecipient(),
279
- hopCount: PROFIT_HOP_COUNT,
280
- gasPrice,
281
- chainId: chainIdNum,
282
- txType,
283
- startNonce: profitNonce
284
- });
285
- allTransactions.push(...profitHopResult.signedTransactions);
286
- profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
287
- }
288
- return {
289
- signedTransactions: allTransactions,
290
- profitHopWallets, // ✅ 导出利润多跳钱包
291
- metadata: {
292
- sellerAddress: seller.address,
293
- buyerAddress: buyer.address,
294
- sellAmount: ethers.formatUnits(sellAmountWei, decimals),
295
- buyAmount: ethers.formatEther(buyerFunds),
296
- hasApproval: !!approvalTx,
297
- profitAmount: extractProfit ? ethers.formatEther(profitAmount) : undefined
298
- }
299
- };
300
- }
301
- /**
302
- * Four 内盘批量换手(一卖多买)
303
- *
304
- * 功能:主钱包一次卖出 → 多个子钱包同时买入 → 在同一个区块中完成
305
- * 限制:最多 24 个买方(服务器限制 25 笔交易,包含 1 笔利润交易)
306
- */
307
- export async function fourBatchSwapMerkle(params) {
308
- const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, tokenAddress, config, startNonces // ✅ 可选:前端预获取的 nonces
309
- } = params;
310
- // ✅ 校验买方数量(最多 24 个)
311
- const MAX_BUYERS = 24;
312
- if (buyerPrivateKeys.length === 0) {
313
- throw new Error('至少需要一个买方钱包');
314
- }
315
- if (buyerPrivateKeys.length > MAX_BUYERS) {
316
- throw new Error(`买方钱包数量超过限制: ${buyerPrivateKeys.length} > ${MAX_BUYERS}`);
317
- }
318
- const chainIdNum = config.chainId ?? 56;
319
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
320
- chainId: chainIdNum,
321
- name: 'BSC'
322
- });
323
- const seller = new Wallet(sellerPrivateKey, provider);
324
- const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, provider));
325
- const nonceManager = new NonceManager(provider);
326
- // 创建适配的配置对象
327
- const bundleConfig = {
328
- minGasPriceGwei: config.minGasPriceGwei,
329
- maxGasPriceGwei: config.maxGasPriceGwei,
330
- gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
331
- gasLimitMultiplier: config.gasLimitMultiplier,
332
- txType: config.txType,
333
- chainId: config.chainId
334
- };
335
- const finalGasLimit = getGasLimit(bundleConfig);
336
- const txType = getTxType(bundleConfig);
337
- // ✅ 并行获取:卖出数量、gasPrice
338
- const [sellAmountResult, gasPrice] = await Promise.all([
339
- calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
340
- getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
341
- ]);
342
- const { amount: sellAmountWei, decimals } = sellAmountResult;
343
- // ✅ 并行获取:sellQuote、allowance、所有买方余额
344
- const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
345
- const erc20Contract = new Contract(tokenAddress, ['function allowance(address,address) view returns (uint256)'], provider);
346
- const [sellQuote, currentAllowance, ...buyerBalances] = await Promise.all([
347
- helper3.trySell(tokenAddress, sellAmountWei),
348
- erc20Contract.allowance(seller.address, TM_ADDRESS),
349
- ...buyers.map(buyer => provider.getBalance(buyer.address))
350
- ]);
351
- const totalBuyerFunds = sellQuote.funds;
352
- // ✅ 计算每个买方的买入金额(按比例分配)
353
- let buyAmountsWei;
354
- if (params.buyerRatios && params.buyerRatios.length === buyers.length) {
355
- // 按比例分配
356
- buyAmountsWei = params.buyerRatios.map((ratio, _index) => {
357
- const amount = (totalBuyerFunds * BigInt(Math.round(ratio * 10000))) / 10000n;
358
- return amount;
359
- });
360
- }
361
- else {
362
- // 平均分配
363
- const amountPerBuyer = totalBuyerFunds / BigInt(buyers.length);
364
- buyAmountsWei = buyers.map(() => amountPerBuyer);
365
- }
366
- // ✅ 验证所有买方余额
367
- const reserveGas = ethers.parseEther((config.reserveGasBNB || 0.0005).toString());
368
- buyers.forEach((buyer, i) => {
369
- const required = buyAmountsWei[i] + reserveGas;
370
- if (buyerBalances[i] < required) {
371
- throw new Error(`买方 ${i + 1} 余额不足: 需要 ${ethers.formatEther(required)} BNB, 实际 ${ethers.formatEther(buyerBalances[i])} BNB`);
372
- }
373
- });
374
- // 检查是否需要授权
375
- const APPROVAL_THRESHOLD = ethers.parseUnits('1000000000', decimals);
376
- const needApproval = currentAllowance < APPROVAL_THRESHOLD;
377
- // 利润配置
378
- const profitRateBps = getProfitRateBps(config.userType);
379
- const profitAmount = totalBuyerFunds > 0n
380
- ? (totalBuyerFunds * BigInt(profitRateBps)) / 10000n
381
- : 0n;
382
- // ✅ 获取贿赂金额
383
- const bribeAmount = getBribeAmount(config);
384
- const needBribeTx = bribeAmount > 0n;
385
- // ✅ 并行构建所有交易
386
- const tmSeller = new Contract(TM_ADDRESS, TM_ABI, seller);
387
- const [sellUnsigned, ...buyUnsignedList] = await Promise.all([
388
- // 卖出交易
389
- tmSeller.sellToken.populateTransaction(0n, tokenAddress, sellAmountWei, 0n),
390
- // 所有买入交易
391
- ...buyers.map((buyer, i) => {
392
- const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
393
- const buyAmount = buyAmountsWei[i];
394
- return tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, buyAmount, 0n, { value: buyAmount });
395
- })
396
- ]);
397
- // ✅ 计算 nonce
398
- // seller 需要的 nonce 数量
399
- let sellerNonceCount = 1; // 卖出交易
400
- if (needBribeTx)
401
- sellerNonceCount++; // 贿赂交易
402
- if (needApproval)
403
- sellerNonceCount++; // 授权交易
404
- sellerNonceCount++; // 利润交易
405
- // ✅ 如果前端传入了 startNonces,直接使用(性能优化)
406
- // 否则从链上获取
407
- const allWallets = [seller, ...buyers];
408
- const initialNonces = startNonces && startNonces.length >= allWallets.length
409
- ? startNonces
410
- : await nonceManager.getNextNoncesForWallets(allWallets);
411
- // 分配 seller nonces
412
- const sellerNonces = Array.from({ length: sellerNonceCount }, (_, i) => initialNonces[0] + i);
413
- let idx = 0;
414
- let bribeNonce;
415
- let approvalNonce;
416
- if (needBribeTx)
417
- bribeNonce = sellerNonces[idx++];
418
- if (needApproval)
419
- approvalNonce = sellerNonces[idx++];
420
- const sellerNonce = sellerNonces[idx++];
421
- const profitNonce = sellerNonces[idx];
422
- // buyer nonces
423
- const buyerNonces = initialNonces.slice(1);
424
- // ✅ 并行签名所有交易
425
- const signPromises = [];
426
- // ✅ 贿赂交易放在首位
427
- if (needBribeTx && bribeNonce !== undefined) {
428
- signPromises.push(seller.signTransaction({
429
- to: BLOCKRAZOR_BUILDER_EOA,
430
- value: bribeAmount,
431
- nonce: bribeNonce,
432
- gasPrice,
433
- gasLimit: 21000n,
434
- chainId: chainIdNum,
435
- type: txType
436
- }));
437
- }
438
- // 授权交易
439
- if (needApproval && approvalNonce !== undefined) {
440
- const approveInterface = new ethers.Interface(['function approve(address,uint256) returns (bool)']);
441
- const approveData = approveInterface.encodeFunctionData('approve', [TM_ADDRESS, ethers.MaxUint256]);
442
- signPromises.push(seller.signTransaction({
443
- to: tokenAddress,
444
- data: approveData,
445
- value: 0n,
446
- nonce: approvalNonce,
447
- gasLimit: 80000n,
448
- gasPrice,
449
- chainId: chainIdNum,
450
- type: txType
451
- }));
452
- }
453
- // 卖出交易
454
- signPromises.push(seller.signTransaction({
455
- ...sellUnsigned,
456
- from: seller.address,
457
- nonce: sellerNonce,
458
- gasLimit: finalGasLimit,
459
- gasPrice,
460
- chainId: chainIdNum,
461
- type: txType
462
- }));
463
- // 所有买入交易
464
- buyers.forEach((buyer, i) => {
465
- signPromises.push(buyer.signTransaction({
466
- ...buyUnsignedList[i],
467
- from: buyer.address,
468
- nonce: buyerNonces[i],
469
- gasLimit: finalGasLimit,
470
- gasPrice,
471
- chainId: chainIdNum,
472
- type: txType,
473
- value: buyAmountsWei[i]
474
- }));
475
- });
476
- const signedTxs = await Promise.all(signPromises);
477
- // 解析签名结果
478
- let signIdx = 0;
479
- let bribeTx = null;
480
- let approvalTx = null;
481
- if (needBribeTx)
482
- bribeTx = signedTxs[signIdx++];
483
- if (needApproval)
484
- approvalTx = signedTxs[signIdx++];
485
- const signedSell = signedTxs[signIdx++];
486
- const signedBuys = signedTxs.slice(signIdx, signIdx + buyers.length);
487
- nonceManager.clearTemp();
488
- // ✅ 按顺序组装交易数组:贿赂 → 授权 → 卖出 → 买入
489
- const signedTransactions = [];
490
- if (bribeTx)
491
- signedTransactions.push(bribeTx);
492
- if (approvalTx)
493
- signedTransactions.push(approvalTx);
494
- signedTransactions.push(signedSell);
495
- signedTransactions.push(...signedBuys);
496
- // ✅ 利润多跳转账(强制 2 跳中转)
497
- let profitHopWallets;
498
- if (profitAmount > 0n) {
499
- const profitHopResult = await buildProfitHopTransactions({
500
- provider,
501
- payerWallet: seller,
502
- profitAmount: profitAmount,
503
- profitRecipient: getProfitRecipient(),
504
- hopCount: PROFIT_HOP_COUNT,
505
- gasPrice,
506
- chainId: chainIdNum,
507
- txType,
508
- startNonce: profitNonce
509
- });
510
- signedTransactions.push(...profitHopResult.signedTransactions);
511
- profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
512
- }
513
- return {
514
- signedTransactions,
515
- profitHopWallets, // ✅ 导出利润多跳钱包
516
- metadata: {
517
- sellerAddress: seller.address,
518
- buyerAddresses: buyers.map(b => b.address),
519
- sellAmount: ethers.formatUnits(sellAmountWei, decimals),
520
- buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
521
- hasApproval: !!approvalTx,
522
- profitAmount: ethers.formatEther(profitAmount)
523
- }
524
- };
525
- }
526
- /**
527
- * Four 内盘快捷批量换手(资金利用率模式)
528
- *
529
- * 流程:[贿赂] → [卖出] → [转账多跳...] → [买入1, 买入2, ...] → [利润]
530
- *
531
- * 特点:
532
- * - 子钱包不需要预先有 BNB
533
- * - 资金来自主钱包卖出代币所得
534
- * - 提升资金利用率
535
- * - ✅ 支持转账多跳,隐藏资金流向
536
- *
537
- * 限制:根据多跳数动态计算最大买方数量
538
- */
539
- export async function fourQuickBatchSwapMerkle(params) {
540
- const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, buyerRatios, buyerAmounts, tokenAddress, config, disperseHopCount = 0, // ✅ 转账多跳数(默认0=直接转账)
541
- startNonces // ✅ 可选:前端预获取的 nonces
542
- } = params;
543
- // ✅ 动态计算最大买方数量(根据多跳数)
544
- // 固定开销: 贿赂(1) + 卖出(1) + 利润多跳(PROFIT_HOP_COUNT + 1)
545
- // 转账(N*(H+1)) + 买入(N) = N*(H+2)
546
- const fixedOverhead = 1 + 1 + PROFIT_HOP_COUNT + 1;
547
- const maxTxs = 50 - fixedOverhead;
548
- let MAX_BUYERS = Math.floor(maxTxs / (disperseHopCount + 2));
549
- MAX_BUYERS = Math.max(1, MAX_BUYERS);
550
- if (buyerPrivateKeys.length === 0) {
551
- throw new Error('至少需要一个买方钱包');
552
- }
553
- if (buyerPrivateKeys.length > MAX_BUYERS) {
554
- throw new Error(`资金利用率模式(${disperseHopCount}跳)买方钱包数量超过限制: ${buyerPrivateKeys.length} > ${MAX_BUYERS}`);
555
- }
556
- // ✅ 校验分配模式
557
- if (!buyerRatios && !buyerAmounts) {
558
- throw new Error('必须提供 buyerRatios 或 buyerAmounts');
559
- }
560
- if (buyerRatios && buyerRatios.length !== buyerPrivateKeys.length) {
561
- throw new Error(`buyerRatios 长度 (${buyerRatios.length}) 与 buyerPrivateKeys 长度 (${buyerPrivateKeys.length}) 不匹配`);
562
- }
563
- if (buyerAmounts && buyerAmounts.length !== buyerPrivateKeys.length) {
564
- throw new Error(`buyerAmounts 长度 (${buyerAmounts.length}) 与 buyerPrivateKeys 长度 (${buyerPrivateKeys.length}) 不匹配`);
565
- }
566
- const chainIdNum = config.chainId ?? 56;
567
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
568
- chainId: chainIdNum,
569
- name: 'BSC'
570
- });
571
- const seller = new Wallet(sellerPrivateKey, provider);
572
- const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, provider));
573
- const nonceManager = new NonceManager(provider);
574
- // 创建适配的配置对象
575
- const bundleConfig = {
576
- minGasPriceGwei: config.minGasPriceGwei,
577
- maxGasPriceGwei: config.maxGasPriceGwei,
578
- gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
579
- gasLimitMultiplier: config.gasLimitMultiplier,
580
- txType: config.txType,
581
- chainId: config.chainId
582
- };
583
- const finalGasLimit = getGasLimit(bundleConfig);
584
- const txType = getTxType(bundleConfig);
585
- // ✅ 并行获取:卖出数量、gasPrice
586
- const [sellAmountResult, gasPrice] = await Promise.all([
587
- calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
588
- getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
589
- ]);
590
- const { amount: sellAmountWei, decimals } = sellAmountResult;
591
- // ✅ 获取卖出报价
592
- const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
593
- const sellQuote = await helper3.trySell(tokenAddress, sellAmountWei);
594
- const estimatedBNBOut = sellQuote.funds;
595
- // ✅ 计算利润(根据 userType 动态调整)
596
- const profitRateBps = getProfitRateBps(config.userType);
597
- const profitAmount = estimatedBNBOut > 0n
598
- ? (estimatedBNBOut * BigInt(profitRateBps)) / 10000n
599
- : 0n;
600
- const distributableAmount = estimatedBNBOut - profitAmount;
601
- // ✅ 计算每个买方分到的金额
602
- let transferAmountsWei;
603
- if (buyerAmounts && buyerAmounts.length === buyers.length) {
604
- // 数量模式
605
- transferAmountsWei = buyerAmounts.map(amt => ethers.parseEther(amt));
606
- const totalTransfer = transferAmountsWei.reduce((a, b) => a + b, 0n);
607
- if (totalTransfer > distributableAmount) {
608
- throw new Error(`指定的买入总金额超过可分配金额 (${ethers.formatEther(distributableAmount)} BNB)`);
609
- }
610
- }
611
- else if (buyerRatios && buyerRatios.length === buyers.length) {
612
- // 比例模式
613
- transferAmountsWei = buyerRatios.map(ratio => {
614
- return (distributableAmount * BigInt(Math.round(ratio * 10000))) / 10000n;
615
- });
616
- }
617
- else {
618
- throw new Error('必须提供 buyerRatios 或 buyerAmounts');
619
- }
620
- // ✅ 获取贿赂金额
621
- const bribeAmount = getBribeAmount(config);
622
- // ✅ 验证主钱包余额
623
- const sellerBalance = await seller.provider.getBalance(seller.address);
624
- // 主钱包只需要支付:贿赂 + Gas(卖出后有 BNB 可用于转账和利润)
625
- const sellerGasCost = gasPrice * (21000n + finalGasLimit + 21000n * BigInt(buyers.length) + 21000n);
626
- const sellerRequired = bribeAmount + sellerGasCost;
627
- if (sellerBalance < sellerRequired) {
628
- throw new Error(`主钱包 BNB 余额不足: 需要约 ${ethers.formatEther(sellerRequired)} BNB (贿赂: ${ethers.formatEther(bribeAmount)}, Gas: ${ethers.formatEther(sellerGasCost)}), 实际 ${ethers.formatEther(sellerBalance)} BNB`);
629
- }
630
- // ==================== 规划 Nonce ====================
631
- // ✅ 如果前端传入了 startNonces,直接使用(性能优化)
632
- let sellerNonce = startNonces && startNonces.length > 0
633
- ? startNonces[0]
634
- : await nonceManager.getNextNonce(seller);
635
- // ==================== 1. 贿赂交易 ====================
636
- let bribeTx = null;
637
- if (bribeAmount > 0n) {
638
- bribeTx = await seller.signTransaction({
639
- to: BLOCKRAZOR_BUILDER_EOA,
640
- value: bribeAmount,
641
- nonce: sellerNonce++,
642
- gasPrice,
643
- gasLimit: 21000n,
644
- chainId: chainIdNum,
645
- type: txType
646
- });
647
- }
648
- // ==================== 2. 卖出交易 ====================
649
- const tmSeller = new Contract(TM_ADDRESS, TM_ABI, seller);
650
- const sellUnsigned = await tmSeller.sellToken.populateTransaction(0n, tokenAddress, sellAmountWei, 0n);
651
- const signedSell = await seller.signTransaction({
652
- ...sellUnsigned,
653
- from: seller.address,
654
- nonce: sellerNonce++,
655
- gasLimit: finalGasLimit,
656
- gasPrice,
657
- chainId: chainIdNum,
658
- type: txType
659
- });
660
- // ==================== 3. 转账交易(支持多跳)====================
661
- const reserveGas = ethers.parseEther((config.reserveGasBNB || 0.0005).toString());
662
- const buyerGasCost = gasPrice * finalGasLimit;
663
- // ✅ 生成多跳路径
664
- const hopPaths = generateDisperseHopPaths(buyers.map(b => b.address), disperseHopCount, provider);
665
- // 收集所有中间钱包信息
666
- const allHopWallets = [];
667
- hopPaths.forEach(path => {
668
- allHopWallets.push(...path.hopWalletsInfo);
669
- });
670
- let transferTxs;
671
- if (disperseHopCount === 0) {
672
- // ✅ 无多跳:直接转账
673
- const transferNonces = buyers.map((_, i) => sellerNonce + i);
674
- sellerNonce += buyers.length;
675
- transferTxs = await Promise.all(buyers.map((buyer, i) => {
676
- const transferValue = transferAmountsWei[i] + reserveGas + buyerGasCost;
677
- return seller.signTransaction({
678
- to: buyer.address,
679
- value: transferValue,
680
- nonce: transferNonces[i],
681
- gasPrice,
682
- gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
683
- chainId: chainIdNum,
684
- type: txType
685
- });
686
- }));
687
- }
688
- else {
689
- // ✅ 有多跳:构建多跳转账链
690
- // ✅ 修复:payer 每次只发送 1 笔交易(到第一个hop钱包),hop钱包用自己的nonce=0
691
- const hopChains = await Promise.all(hopPaths.map((path, i) => {
692
- const finalAmount = transferAmountsWei[i] + reserveGas + buyerGasCost;
693
- const payerNonce = sellerNonce + i; // ✅ payer 每个 buyer 只用 1 个 nonce
694
- return buildNativeHopChain(seller, path, finalAmount, gasPrice, chainIdNum, txType, payerNonce);
695
- }));
696
- transferTxs = hopChains.flat();
697
- sellerNonce += buyers.length; // ✅ payer 只增加 buyers.length 个 nonce
698
- }
699
- // ==================== 4. 买入交易 ====================
700
- // ✅ 如果前端传入了 startNonces,使用 buyer 部分(从索引 1 开始)
701
- const buyerNonces = startNonces && startNonces.length > 1
702
- ? startNonces.slice(1)
703
- : await Promise.all(buyers.map(buyer => nonceManager.getNextNonce(buyer)));
704
- const signedBuys = await Promise.all(buyers.map(async (buyer, i) => {
705
- const buyAmount = transferAmountsWei[i];
706
- const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
707
- const buyUnsigned = await tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, buyAmount, 0n, { value: buyAmount });
708
- return buyer.signTransaction({
709
- ...buyUnsigned,
710
- from: buyer.address,
711
- nonce: buyerNonces[i],
712
- gasLimit: finalGasLimit,
713
- gasPrice,
714
- chainId: chainIdNum,
715
- type: txType,
716
- value: buyAmount
717
- });
718
- }));
719
- nonceManager.clearTemp();
720
- // ==================== 组装交易数组 ====================
721
- const signedTransactions = [];
722
- if (bribeTx)
723
- signedTransactions.push(bribeTx);
724
- signedTransactions.push(signedSell);
725
- signedTransactions.push(...transferTxs);
726
- signedTransactions.push(...signedBuys);
727
- // ==================== 5. 利润多跳转账(强制 2 跳中转)====================
728
- let profitHopWallets;
729
- if (profitAmount > 0n) {
730
- const profitHopResult = await buildProfitHopTransactions({
731
- provider,
732
- payerWallet: seller,
733
- profitAmount: profitAmount,
734
- profitRecipient: getProfitRecipient(),
735
- hopCount: PROFIT_HOP_COUNT,
736
- gasPrice,
737
- chainId: chainIdNum,
738
- txType,
739
- startNonce: sellerNonce++
740
- });
741
- signedTransactions.push(...profitHopResult.signedTransactions);
742
- profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
743
- // 多跳交易已签名
744
- }
745
- return {
746
- signedTransactions,
747
- disperseHopWallets: allHopWallets.length > 0 ? allHopWallets : undefined, // ✅ 返回转账多跳钱包
748
- profitHopWallets, // ✅ 返回利润多跳钱包
749
- metadata: {
750
- sellerAddress: seller.address,
751
- buyerAddresses: buyers.map(b => b.address),
752
- sellAmount: ethers.formatUnits(sellAmountWei, decimals),
753
- estimatedBNBOut: ethers.formatEther(estimatedBNBOut),
754
- transferAmounts: transferAmountsWei.map(amt => ethers.formatEther(amt)),
755
- profitAmount: profitAmount > 0n ? ethers.formatEther(profitAmount) : undefined,
756
- disperseHopCount: disperseHopCount > 0 ? disperseHopCount : undefined // ✅ 返回多跳数
757
- }
758
- };
759
- }
4
+ export { fourBundleSwapMerkle, fourBatchSwapMerkle, fourQuickBatchSwapMerkle, } from '../../bundle-core/four-meme/swap.js';