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,159 +1,34 @@
1
1
  /**
2
2
  * Four.meme 内盘捆绑换手(Merkle Bundle)
3
- *
4
- * 功能:钱包A卖出代币 → 钱包B买入相同数量 → 原子执行
5
3
  */
6
4
  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
- import { GAS_LIMITS } from '../../../../shared/constants/index.js';
11
- /**
12
- * 根据 userType 计算利润率
13
- */
14
- function getProfitRateBps(userType) {
15
- if (userType === 'v0') {
16
- return PROFIT_CONFIG.RATE_BPS_V0; // 0.06%
17
- }
18
- else if (userType === 'v1') {
19
- return PROFIT_CONFIG.RATE_BPS_V1; // 0.05%
20
- }
21
- return PROFIT_CONFIG.RATE_BPS_V0; // 默认 0.06%
22
- }
23
- import { TM_ABI, HELPER3_ABI, TM_ADDRESS } from '../swap-internal.js';
24
- import { getBribeAmount, getProfitRecipient } from '../config.js';
25
- import { generateWallets } from '../../../../utils/wallet.js';
26
- // ==================== 多跳转账常量(使用统一常量) ====================
27
- const NATIVE_TRANSFER_GAS_LIMIT = GAS_LIMITS.NATIVE_TRANSFER;
28
- const BRIBE_GAS_LIMIT = GAS_LIMITS.BRIBE;
29
- hopWallets: Wallet[];
30
- hopWalletsInfo: GeneratedWallet[];
31
- ;
32
- /**
33
- * 生成分发多跳路径
34
- */
35
- function generateDisperseHopPaths(targetAddresses, hopCount, provider) {
36
- if (hopCount <= 0) {
37
- return targetAddresses.map(addr => ({
38
- targetAddress: addr,
39
- hopWallets: [],
40
- hopWalletsInfo: []
41
- }));
42
- }
43
- return targetAddresses.map(targetAddress => {
44
- const hopWalletsInfo = generateWallets(hopCount);
45
- const hopWallets = hopWalletsInfo.map(w => new Wallet(w.privateKey, provider));
46
- return { targetAddress, hopWallets, hopWalletsInfo };
47
- });
48
- }
49
- /**
50
- * 构建原生代币多跳转账链
51
- */
52
- async function buildNativeHopChain(payer, path, finalAmount, gasPrice, chainId, txType, payerNonce) {
53
- const signedTxs = [];
54
- const hopCount = path.hopWallets.length;
55
- if (hopCount === 0) {
56
- const tx = {
57
- to: path.targetAddress,
58
- value: finalAmount,
59
- nonce: payerNonce,
60
- gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
61
- gasPrice,
62
- chainId,
63
- type: txType
64
- };
65
- signedTxs.push(await payer.signTransaction(tx));
66
- return signedTxs;
67
- }
68
- const hopGasCost = NATIVE_TRANSFER_GAS_LIMIT * gasPrice;
69
- // 计算每跳需要的金额
70
- const amountsPerHop = [];
71
- for (let i = 0; i < hopCount; i++) {
72
- const remainingHops = hopCount - i;
73
- amountsPerHop.push(finalAmount + hopGasCost * BigInt(remainingHops));
74
- }
75
- // payer → hop1
76
- signedTxs.push(await payer.signTransaction({
77
- to: path.hopWallets[0].address,
78
- value: amountsPerHop[0],
79
- nonce: payerNonce,
80
- gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
81
- gasPrice,
82
- chainId,
83
- type: txType
84
- }));
85
- // hop1 → hop2 → ... → target
86
- for (let i = 0; i < hopCount; i++) {
87
- const fromWallet = path.hopWallets[i];
88
- const toAddress = i === hopCount - 1 ? path.targetAddress : path.hopWallets[i + 1].address;
89
- const amount = i === hopCount - 1 ? finalAmount : amountsPerHop[i + 1];
90
- signedTxs.push(await fromWallet.signTransaction({
91
- to: toAddress,
92
- value: amount,
93
- nonce: 0,
94
- gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
95
- gasPrice,
96
- chainId,
97
- type: txType
98
- }));
99
- }
100
- return signedTxs;
101
- }
102
- // ✅ 用户类型(影响利润率)
103
- // ✅ 简化的签名配置
104
- // ✅ Merkle 配置(保留兼容)
105
- // ✅ 签名参数(不依赖 Merkle)
106
- // ✅ Merkle 参数(保留兼容)
107
- profitHopWallets ? : GeneratedWallet[]; // ✅ 利润多跳中间钱包
108
- metadata ? : {
109
- sellerAddress: string,
110
- buyerAddress: string,
111
- sellAmount: string,
112
- buyAmount: string,
113
- hasApproval: boolean, // 是否包含授权交易
114
- profitAmount: string
115
- };
116
- ;
5
+ import { countSellerNonceSlots, createFourSwapGasContext, fetchFourSwapSellQuoteAndAllowance, fetchFourSwapSellQuoteAllowanceAndBalances, getFourSwapProfitRateBps, needsTmTokenApproval, planSellerNonces, quoteFourSwapSellFunds, signTmMaxApprovalTx, } from './swap-sign-helpers.js';
6
+ import { generateDisperseHopPaths, buildNativeHopChain, NATIVE_TRANSFER_GAS_LIMIT } from './swap-hop-helpers.js';
7
+ import { signBribeTransaction } from '../sign-context-helpers.js';
8
+ import { calculateSellAmount } from '../../utils/swap-helpers.js';
9
+ import { NonceManager, getOptimizedGasPrice, getGasPriceConfig, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../utils/bundle-helpers.js';
10
+ import { getBribeAmount, getProfitRecipient } from '../config-helpers.js';
11
+ import { TM_ABI, TM_ADDRESS } from './swap-internal.js';
117
12
  /**
118
13
  * Four内盘捆绑换手
119
14
  */
120
15
  export async function fourBundleSwapMerkle(params) {
121
- const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKey, tokenAddress, config, startNonces // ✅ 可选:前端预获取的 nonces
16
+ const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKey, tokenAddress, config, startNonces, // ✅ 可选:前端预获取的 nonces
122
17
  } = params;
123
- const chainIdNum = config.chainId ?? 56;
124
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
125
- chainId: chainIdNum,
126
- name: 'BSC'
127
- });
18
+ const { chainIdNum, provider, bundleConfig, finalGasLimit, txType } = createFourSwapGasContext(config);
128
19
  const seller = new Wallet(sellerPrivateKey, provider);
129
20
  const buyer = new Wallet(buyerPrivateKey, provider);
130
21
  const nonceManager = new NonceManager(provider);
131
- // ✅ 创建适配的配置对象
132
- const bundleConfig = {
133
- minGasPriceGwei: config.minGasPriceGwei,
134
- maxGasPriceGwei: config.maxGasPriceGwei,
135
- gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
136
- gasLimitMultiplier: config.gasLimitMultiplier,
137
- txType: config.txType,
138
- chainId: config.chainId
139
- };
140
- const finalGasLimit = getGasLimit(bundleConfig);
141
- const txType = getTxType(bundleConfig);
142
22
  // ✅ 优化:第一批并行 - calculateSellAmount、gasPrice
143
23
  const [sellAmountResult, gasPrice] = await Promise.all([
144
24
  calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
145
- getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
25
+ getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig)),
146
26
  ]);
147
27
  const { amount: sellAmountWei, decimals } = sellAmountResult;
148
- // 优化:第二批并行 - sellQuote、allowancebuyerBalance
149
- const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
150
- const erc20Contract = new Contract(tokenAddress, ['function allowance(address,address) view returns (uint256)'], provider);
151
- const [sellQuote, currentAllowance, buyerBalance] = await Promise.all([
152
- helper3.trySell(tokenAddress, sellAmountWei),
153
- erc20Contract.allowance(seller.address, TM_ADDRESS),
154
- provider.getBalance(buyer.address)
28
+ const [{ sellFunds: sellerWillGetBNB, allowance: currentAllowance }, buyerBalance] = await Promise.all([
29
+ fetchFourSwapSellQuoteAndAllowance(provider, tokenAddress, seller.address, sellAmountWei),
30
+ provider.getBalance(buyer.address),
155
31
  ]);
156
- const sellerWillGetBNB = sellQuote.funds;
157
32
  const buyerFunds = sellerWillGetBNB;
158
33
  // 验证买方余额
159
34
  const reserveGas = ethers.parseEther((config.reserveGasBNB || 0.0005).toString());
@@ -164,28 +39,18 @@ export async function fourBundleSwapMerkle(params) {
164
39
  ` - 实际: ${ethers.formatEther(buyerBalance)} BNB`);
165
40
  }
166
41
  // 检查是否需要授权
167
- const APPROVAL_THRESHOLD = ethers.parseUnits('1000000000', decimals);
168
- const needApproval = currentAllowance < APPROVAL_THRESHOLD;
42
+ const needApproval = needsTmTokenApproval(currentAllowance, decimals);
169
43
  // 利润配置
170
44
  const extractProfit = true;
171
- const profitRateBps = getProfitRateBps(config.userType);
172
- const profitAmount = extractProfit && sellerWillGetBNB > 0n
173
- ? (sellerWillGetBNB * BigInt(profitRateBps)) / 10000n
174
- : 0n;
45
+ const profitRateBps = getFourSwapProfitRateBps(config.userType);
46
+ const profitAmount = extractProfit && sellerWillGetBNB > 0n ? (sellerWillGetBNB * BigInt(profitRateBps)) / 10000n : 0n;
175
47
  // ✅ 获取贿赂金额
176
48
  const bribeAmount = getBribeAmount(config);
177
49
  const needBribeTx = bribeAmount > 0n;
178
50
  // ✅ 优化:第三批并行 - 构建交易、获取 nonces
179
51
  const tmSeller = new Contract(TM_ADDRESS, TM_ABI, seller);
180
52
  const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
181
- // 计算需要的 nonce 数量
182
- let sellerNonceCount = 1; // 卖出交易
183
- if (needBribeTx)
184
- sellerNonceCount++; // 贿赂交易
185
- if (needApproval)
186
- sellerNonceCount++; // 授权交易
187
- if (extractProfit)
188
- sellerNonceCount++; // 利润交易
53
+ const sellerNonceCount = countSellerNonceSlots(needBribeTx, needApproval, extractProfit);
189
54
  // ✅ 优化:使用批量 nonce 获取(JSON-RPC 批量请求)
190
55
  // 如果前端传入了 startNonces,直接使用;否则从链上获取
191
56
  const [sellUnsigned, buyUnsigned, noncesResult] = await Promise.all([
@@ -203,57 +68,25 @@ export async function fourBundleSwapMerkle(params) {
203
68
  const sellerNonces = Array.from({ length: sellerNonceCount }, (_, i) => initialNonces[0] + i);
204
69
  const buyerNonce = initialNonces[1];
205
70
  return { sellerNonces, buyerNonce };
206
- })()
71
+ })(),
207
72
  ]);
208
73
  const { sellerNonces, buyerNonce } = noncesResult;
209
- // 分配 nonces
210
- let idx = 0;
211
- let bribeNonce;
212
- let approvalNonce;
213
- if (needBribeTx)
214
- bribeNonce = sellerNonces[idx++];
215
- if (needApproval)
216
- approvalNonce = sellerNonces[idx++];
217
- const sellerNonce = sellerNonces[idx++];
218
- const profitNonce = extractProfit ? sellerNonces[idx] : undefined;
219
- // ✅ 并行签名所有交易
74
+ const noncePlan = planSellerNonces(sellerNonces, needBribeTx, needApproval, extractProfit);
220
75
  const signPromises = [];
221
- // 贿赂交易放在首位
222
- if (needBribeTx && bribeNonce !== undefined) {
223
- signPromises.push(seller.signTransaction({
224
- to: BLOCKRAZOR_BUILDER_EOA,
225
- value: bribeAmount,
226
- nonce: bribeNonce,
227
- gasPrice,
228
- gasLimit: BRIBE_GAS_LIMIT,
229
- chainId: chainIdNum,
230
- type: txType
231
- }));
76
+ if (needBribeTx && noncePlan.bribeNonce !== undefined) {
77
+ signPromises.push(signBribeTransaction(seller, bribeAmount, noncePlan.bribeNonce, gasPrice, chainIdNum, txType));
232
78
  }
233
- // 授权交易
234
- if (needApproval && approvalNonce !== undefined) {
235
- const approveInterface = new ethers.Interface(['function approve(address,uint256) returns (bool)']);
236
- const approveData = approveInterface.encodeFunctionData('approve', [TM_ADDRESS, ethers.MaxUint256]);
237
- signPromises.push(seller.signTransaction({
238
- to: tokenAddress,
239
- data: approveData,
240
- value: 0n,
241
- nonce: approvalNonce,
242
- gasLimit: 80000n,
243
- gasPrice,
244
- chainId: chainIdNum,
245
- type: txType
246
- }));
79
+ if (needApproval && noncePlan.approvalNonce !== undefined) {
80
+ signPromises.push(signTmMaxApprovalTx(seller, tokenAddress, noncePlan.approvalNonce, gasPrice, chainIdNum, txType));
247
81
  }
248
- // 卖出和买入交易
249
82
  signPromises.push(seller.signTransaction({
250
83
  ...sellUnsigned,
251
84
  from: seller.address,
252
- nonce: sellerNonce,
85
+ nonce: noncePlan.sellerNonce,
253
86
  gasLimit: finalGasLimit,
254
87
  gasPrice,
255
88
  chainId: chainIdNum,
256
- type: txType
89
+ type: txType,
257
90
  }), buyer.signTransaction({
258
91
  ...buyUnsigned,
259
92
  from: buyer.address,
@@ -262,10 +95,9 @@ export async function fourBundleSwapMerkle(params) {
262
95
  gasPrice,
263
96
  chainId: chainIdNum,
264
97
  type: txType,
265
- value: buyerFunds
98
+ value: buyerFunds,
266
99
  }));
267
100
  const signedTxs = await Promise.all(signPromises);
268
- // 解析签名结果
269
101
  let signIdx = 0;
270
102
  let bribeTx = null;
271
103
  let approvalTx = null;
@@ -274,7 +106,8 @@ export async function fourBundleSwapMerkle(params) {
274
106
  if (needApproval)
275
107
  approvalTx = signedTxs[signIdx++];
276
108
  const signedSell = signedTxs[signIdx++];
277
- const signedBuy = signedTxs[signIdx++];
109
+ const signedBuy = signedTxs[signIdx];
110
+ const profitNonce = noncePlan.profitNonce;
278
111
  nonceManager.clearTemp();
279
112
  // ✅ 组装交易列表:贿赂 → 授权 → 卖出 → 买入
280
113
  const allTransactions = [];
@@ -295,7 +128,7 @@ export async function fourBundleSwapMerkle(params) {
295
128
  gasPrice,
296
129
  chainId: chainIdNum,
297
130
  txType,
298
- startNonce: profitNonce
131
+ startNonce: profitNonce,
299
132
  });
300
133
  allTransactions.push(...profitHopResult.signedTransactions);
301
134
  profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
@@ -309,37 +142,16 @@ export async function fourBundleSwapMerkle(params) {
309
142
  sellAmount: ethers.formatUnits(sellAmountWei, decimals),
310
143
  buyAmount: ethers.formatEther(buyerFunds),
311
144
  hasApproval: !!approvalTx,
312
- profitAmount: extractProfit ? ethers.formatEther(profitAmount) : undefined
313
- }
145
+ profitAmount: extractProfit ? ethers.formatEther(profitAmount) : undefined,
146
+ },
314
147
  };
315
148
  }
316
149
  // ==================== 批量换手(一卖多买)====================
317
- sellAmount ? : string; // 卖出数量
318
- sellPercentage ? : number; // 卖出比例(0-100)
319
- buyerPrivateKeys: string[]; // 买方私钥数组(子钱包)
320
- buyerRatios ? : number[]; // 每个买方的分配比例(如 [0.3, 0.5, 0.2])
321
- tokenAddress: string; // 代币地址
322
- config: FourSwapSignConfig; // 配置
323
- // ✅ 可选:前端预获取的 nonces(性能优化)
324
- // 顺序:[sellerNonce, buyer1Nonce, buyer2Nonce, ...]
325
- startNonces ? : number[];
326
- profitHopWallets ? : GeneratedWallet[]; // ✅ 利润多跳中间钱包
327
- metadata ? : {
328
- sellerAddress: string,
329
- buyerAddresses: string[],
330
- sellAmount: string,
331
- buyAmounts: string[],
332
- hasApproval: boolean,
333
- profitAmount: string
334
- };
335
150
  /**
336
151
  * Four 内盘批量换手(一卖多买)
337
- *
338
- * 功能:主钱包一次卖出 → 多个子钱包同时买入 → 在同一个区块中完成
339
- * 限制:最多 24 个买方(服务器限制 25 笔交易,包含 1 笔利润交易)
340
152
  */
341
153
  export async function fourBatchSwapMerkle(params) {
342
- const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, tokenAddress, config, startNonces // ✅ 可选:前端预获取的 nonces
154
+ const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, tokenAddress, config, startNonces, // ✅ 可选:前端预获取的 nonces
343
155
  } = params;
344
156
  // ✅ 校验买方数量(最多 24 个)
345
157
  const MAX_BUYERS = 24;
@@ -349,45 +161,22 @@ export async function fourBatchSwapMerkle(params) {
349
161
  if (buyerPrivateKeys.length > MAX_BUYERS) {
350
162
  throw new Error(`买方钱包数量超过限制: ${buyerPrivateKeys.length} > ${MAX_BUYERS}`);
351
163
  }
352
- const chainIdNum = config.chainId ?? 56;
353
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
354
- chainId: chainIdNum,
355
- name: 'BSC'
356
- });
164
+ const { chainIdNum, provider, bundleConfig, finalGasLimit, txType } = createFourSwapGasContext(config);
357
165
  const seller = new Wallet(sellerPrivateKey, provider);
358
- const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, provider));
166
+ const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, provider));
359
167
  const nonceManager = new NonceManager(provider);
360
- // 创建适配的配置对象
361
- const bundleConfig = {
362
- minGasPriceGwei: config.minGasPriceGwei,
363
- maxGasPriceGwei: config.maxGasPriceGwei,
364
- gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
365
- gasLimitMultiplier: config.gasLimitMultiplier,
366
- txType: config.txType,
367
- chainId: config.chainId
368
- };
369
- const finalGasLimit = getGasLimit(bundleConfig);
370
- const txType = getTxType(bundleConfig);
371
168
  // ✅ 并行获取:卖出数量、gasPrice
372
169
  const [sellAmountResult, gasPrice] = await Promise.all([
373
170
  calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
374
- getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
171
+ getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig)),
375
172
  ]);
376
173
  const { amount: sellAmountWei, decimals } = sellAmountResult;
377
- // 并行获取:sellQuote、allowance、所有买方余额
378
- const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
379
- const erc20Contract = new Contract(tokenAddress, ['function allowance(address,address) view returns (uint256)'], provider);
380
- const [sellQuote, currentAllowance, ...buyerBalances] = await Promise.all([
381
- helper3.trySell(tokenAddress, sellAmountWei),
382
- erc20Contract.allowance(seller.address, TM_ADDRESS),
383
- ...buyers.map(buyer => provider.getBalance(buyer.address))
384
- ]);
385
- const totalBuyerFunds = sellQuote.funds;
174
+ const { sellFunds: totalBuyerFunds, allowance: currentAllowance, buyerBalances, } = await fetchFourSwapSellQuoteAllowanceAndBalances(provider, tokenAddress, seller.address, sellAmountWei, buyers.map((b) => b.address));
386
175
  // ✅ 计算每个买方的买入金额(按比例分配)
387
176
  let buyAmountsWei;
388
177
  if (params.buyerRatios && params.buyerRatios.length === buyers.length) {
389
178
  // 按比例分配
390
- buyAmountsWei = params.buyerRatios.map((ratio, index) => {
179
+ buyAmountsWei = params.buyerRatios.map((ratio) => {
391
180
  const amount = (totalBuyerFunds * BigInt(Math.round(ratio * 10000))) / 10000n;
392
181
  return amount;
393
182
  });
@@ -406,13 +195,10 @@ export async function fourBatchSwapMerkle(params) {
406
195
  }
407
196
  });
408
197
  // 检查是否需要授权
409
- const APPROVAL_THRESHOLD = ethers.parseUnits('1000000000', decimals);
410
- const needApproval = currentAllowance < APPROVAL_THRESHOLD;
198
+ const needApproval = needsTmTokenApproval(currentAllowance, decimals);
411
199
  // 利润配置
412
- const profitRateBps = getProfitRateBps(config.userType);
413
- const profitAmount = totalBuyerFunds > 0n
414
- ? (totalBuyerFunds * BigInt(profitRateBps)) / 10000n
415
- : 0n;
200
+ const profitRateBps = getFourSwapProfitRateBps(config.userType);
201
+ const profitAmount = totalBuyerFunds > 0n ? (totalBuyerFunds * BigInt(profitRateBps)) / 10000n : 0n;
416
202
  // ✅ 获取贿赂金额
417
203
  const bribeAmount = getBribeAmount(config);
418
204
  const needBribeTx = bribeAmount > 0n;
@@ -425,17 +211,12 @@ export async function fourBatchSwapMerkle(params) {
425
211
  ...buyers.map((buyer, i) => {
426
212
  const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
427
213
  const buyAmount = buyAmountsWei[i];
428
- return tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, buyAmount, 0n, { value: buyAmount });
429
- })
214
+ return tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, buyAmount, 0n, {
215
+ value: buyAmount,
216
+ });
217
+ }),
430
218
  ]);
431
- // 计算 nonce
432
- // seller 需要的 nonce 数量
433
- let sellerNonceCount = 1; // 卖出交易
434
- if (needBribeTx)
435
- sellerNonceCount++; // 贿赂交易
436
- if (needApproval)
437
- sellerNonceCount++; // 授权交易
438
- sellerNonceCount++; // 利润交易
219
+ const sellerNonceCount = countSellerNonceSlots(needBribeTx, needApproval, true);
439
220
  // ✅ 如果前端传入了 startNonces,直接使用(性能优化)
440
221
  // 否则从链上获取
441
222
  const allWallets = [seller, ...buyers];
@@ -444,55 +225,24 @@ export async function fourBatchSwapMerkle(params) {
444
225
  : await nonceManager.getNextNoncesForWallets(allWallets);
445
226
  // 分配 seller nonces
446
227
  const sellerNonces = Array.from({ length: sellerNonceCount }, (_, i) => initialNonces[0] + i);
447
- let idx = 0;
448
- let bribeNonce;
449
- let approvalNonce;
450
- if (needBribeTx)
451
- bribeNonce = sellerNonces[idx++];
452
- if (needApproval)
453
- approvalNonce = sellerNonces[idx++];
454
- const sellerNonce = sellerNonces[idx++];
455
- const profitNonce = sellerNonces[idx];
456
- // buyer nonces
228
+ const noncePlan = planSellerNonces(sellerNonces, needBribeTx, needApproval, true);
229
+ const profitNonce = noncePlan.profitNonce;
457
230
  const buyerNonces = initialNonces.slice(1);
458
- // ✅ 并行签名所有交易
459
231
  const signPromises = [];
460
- // 贿赂交易放在首位
461
- if (needBribeTx && bribeNonce !== undefined) {
462
- signPromises.push(seller.signTransaction({
463
- to: BLOCKRAZOR_BUILDER_EOA,
464
- value: bribeAmount,
465
- nonce: bribeNonce,
466
- gasPrice,
467
- gasLimit: BRIBE_GAS_LIMIT,
468
- chainId: chainIdNum,
469
- type: txType
470
- }));
232
+ if (needBribeTx && noncePlan.bribeNonce !== undefined) {
233
+ signPromises.push(signBribeTransaction(seller, bribeAmount, noncePlan.bribeNonce, gasPrice, chainIdNum, txType));
471
234
  }
472
- // 授权交易
473
- if (needApproval && approvalNonce !== undefined) {
474
- const approveInterface = new ethers.Interface(['function approve(address,uint256) returns (bool)']);
475
- const approveData = approveInterface.encodeFunctionData('approve', [TM_ADDRESS, ethers.MaxUint256]);
476
- signPromises.push(seller.signTransaction({
477
- to: tokenAddress,
478
- data: approveData,
479
- value: 0n,
480
- nonce: approvalNonce,
481
- gasLimit: 80000n,
482
- gasPrice,
483
- chainId: chainIdNum,
484
- type: txType
485
- }));
235
+ if (needApproval && noncePlan.approvalNonce !== undefined) {
236
+ signPromises.push(signTmMaxApprovalTx(seller, tokenAddress, noncePlan.approvalNonce, gasPrice, chainIdNum, txType));
486
237
  }
487
- // 卖出交易
488
238
  signPromises.push(seller.signTransaction({
489
239
  ...sellUnsigned,
490
240
  from: seller.address,
491
- nonce: sellerNonce,
241
+ nonce: noncePlan.sellerNonce,
492
242
  gasLimit: finalGasLimit,
493
243
  gasPrice,
494
244
  chainId: chainIdNum,
495
- type: txType
245
+ type: txType,
496
246
  }));
497
247
  // 所有买入交易
498
248
  buyers.forEach((buyer, i) => {
@@ -504,7 +254,7 @@ export async function fourBatchSwapMerkle(params) {
504
254
  gasPrice,
505
255
  chainId: chainIdNum,
506
256
  type: txType,
507
- value: buyAmountsWei[i]
257
+ value: buyAmountsWei[i],
508
258
  }));
509
259
  });
510
260
  const signedTxs = await Promise.all(signPromises);
@@ -539,7 +289,7 @@ export async function fourBatchSwapMerkle(params) {
539
289
  gasPrice,
540
290
  chainId: chainIdNum,
541
291
  txType,
542
- startNonce: profitNonce
292
+ startNonce: profitNonce,
543
293
  });
544
294
  signedTransactions.push(...profitHopResult.signedTransactions);
545
295
  profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
@@ -549,54 +299,21 @@ export async function fourBatchSwapMerkle(params) {
549
299
  profitHopWallets, // ✅ 导出利润多跳钱包
550
300
  metadata: {
551
301
  sellerAddress: seller.address,
552
- buyerAddresses: buyers.map(b => b.address),
302
+ buyerAddresses: buyers.map((b) => b.address),
553
303
  sellAmount: ethers.formatUnits(sellAmountWei, decimals),
554
- buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
304
+ buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
555
305
  hasApproval: !!approvalTx,
556
- profitAmount: ethers.formatEther(profitAmount)
557
- }
306
+ profitAmount: ethers.formatEther(profitAmount),
307
+ },
558
308
  };
559
309
  }
560
310
  // ==================== 快捷批量换手(资金利用率模式)====================
561
- sellAmount ? : string; // 卖出数量
562
- sellPercentage ? : number; // 卖出比例(0-100)
563
- buyerPrivateKeys: string[]; // 买方私钥数组(子钱包)
564
- buyerRatios ? : number[]; // 每个买方的分配比例(如 [0.3, 0.5, 0.2])
565
- buyerAmounts ? : string[]; // 每个买方的固定金额(BNB)
566
- tokenAddress: string; // 代币地址
567
- config: FourSwapSignConfig; // 配置
568
- // ✅ 转账多跳配置(可选)
569
- disperseHopCount ? : number; // 转账多跳数(0=直接转账,1=1跳,2=2跳...)
570
- // ✅ 可选:前端预获取的 nonces(性能优化)
571
- // 顺序:[sellerNonce, buyer1Nonce, buyer2Nonce, ...]
572
- startNonces ? : number[];
573
- disperseHopWallets ? : GeneratedWallet[]; // ✅ 转账多跳中间钱包
574
- profitHopWallets ? : GeneratedWallet[]; // ✅ 利润多跳中间钱包
575
- metadata ? : {
576
- sellerAddress: string,
577
- buyerAddresses: string[],
578
- sellAmount: string,
579
- estimatedBNBOut: string,
580
- transferAmounts: string[],
581
- profitAmount: string,
582
- disperseHopCount: number
583
- };
584
311
  /**
585
312
  * Four 内盘快捷批量换手(资金利用率模式)
586
- *
587
- * 流程:[贿赂] → [卖出] → [转账多跳...] → [买入1, 买入2, ...] → [利润]
588
- *
589
- * 特点:
590
- * - 子钱包不需要预先有 BNB
591
- * - 资金来自主钱包卖出代币所得
592
- * - 提升资金利用率
593
- * - ✅ 支持转账多跳,隐藏资金流向
594
- *
595
- * 限制:根据多跳数动态计算最大买方数量
596
313
  */
597
314
  export async function fourQuickBatchSwapMerkle(params) {
598
315
  const { sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, buyerRatios, buyerAmounts, tokenAddress, config, disperseHopCount = 0, // ✅ 转账多跳数(默认0=直接转账)
599
- startNonces // ✅ 可选:前端预获取的 nonces
316
+ startNonces, // ✅ 可选:前端预获取的 nonces
600
317
  } = params;
601
318
  // ✅ 动态计算最大买方数量(根据多跳数)
602
319
  // 固定开销: 贿赂(1) + 卖出(1) + 利润多跳(PROFIT_HOP_COUNT + 1)
@@ -605,7 +322,6 @@ export async function fourQuickBatchSwapMerkle(params) {
605
322
  const maxTxs = 50 - fixedOverhead;
606
323
  let MAX_BUYERS = Math.floor(maxTxs / (disperseHopCount + 2));
607
324
  MAX_BUYERS = Math.max(1, MAX_BUYERS);
608
- console.log(`[fourQuickBatchSwapMerkle] 多跳数: ${disperseHopCount}, 最大买方数: ${MAX_BUYERS}`);
609
325
  if (buyerPrivateKeys.length === 0) {
610
326
  throw new Error('至少需要一个买方钱包');
611
327
  }
@@ -622,48 +338,26 @@ export async function fourQuickBatchSwapMerkle(params) {
622
338
  if (buyerAmounts && buyerAmounts.length !== buyerPrivateKeys.length) {
623
339
  throw new Error(`buyerAmounts 长度 (${buyerAmounts.length}) 与 buyerPrivateKeys 长度 (${buyerPrivateKeys.length}) 不匹配`);
624
340
  }
625
- const chainIdNum = config.chainId ?? 56;
626
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
627
- chainId: chainIdNum,
628
- name: 'BSC'
629
- });
341
+ const { chainIdNum, provider, bundleConfig, finalGasLimit, txType } = createFourSwapGasContext(config);
630
342
  const seller = new Wallet(sellerPrivateKey, provider);
631
- const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, provider));
343
+ const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, provider));
632
344
  const nonceManager = new NonceManager(provider);
633
- // 创建适配的配置对象
634
- const bundleConfig = {
635
- minGasPriceGwei: config.minGasPriceGwei,
636
- maxGasPriceGwei: config.maxGasPriceGwei,
637
- gasLimit: typeof config.gasLimit === 'bigint' ? Number(config.gasLimit) : config.gasLimit,
638
- gasLimitMultiplier: config.gasLimitMultiplier,
639
- txType: config.txType,
640
- chainId: config.chainId
641
- };
642
- const finalGasLimit = getGasLimit(bundleConfig);
643
- const txType = getTxType(bundleConfig);
644
345
  // ✅ 并行获取:卖出数量、gasPrice
645
346
  const [sellAmountResult, gasPrice] = await Promise.all([
646
347
  calculateSellAmount(provider, tokenAddress, seller.address, sellAmount, sellPercentage),
647
- getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig))
348
+ getOptimizedGasPrice(provider, getGasPriceConfig(bundleConfig)),
648
349
  ]);
649
350
  const { amount: sellAmountWei, decimals } = sellAmountResult;
650
- // 获取卖出报价
651
- const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
652
- const sellQuote = await helper3.trySell(tokenAddress, sellAmountWei);
653
- const estimatedBNBOut = sellQuote.funds;
654
- console.log(`[fourQuickBatchSwapMerkle] 卖出数量: ${ethers.formatUnits(sellAmountWei, decimals)}`);
655
- console.log(`[fourQuickBatchSwapMerkle] 预估卖出所得: ${ethers.formatEther(estimatedBNBOut)} BNB`);
351
+ const estimatedBNBOut = await quoteFourSwapSellFunds(provider, tokenAddress, sellAmountWei);
656
352
  // ✅ 计算利润(根据 userType 动态调整)
657
- const profitRateBps = getProfitRateBps(config.userType);
658
- const profitAmount = estimatedBNBOut > 0n
659
- ? (estimatedBNBOut * BigInt(profitRateBps)) / 10000n
660
- : 0n;
353
+ const profitRateBps = getFourSwapProfitRateBps(config.userType);
354
+ const profitAmount = estimatedBNBOut > 0n ? (estimatedBNBOut * BigInt(profitRateBps)) / 10000n : 0n;
661
355
  const distributableAmount = estimatedBNBOut - profitAmount;
662
356
  // ✅ 计算每个买方分到的金额
663
357
  let transferAmountsWei;
664
358
  if (buyerAmounts && buyerAmounts.length === buyers.length) {
665
359
  // 数量模式
666
- transferAmountsWei = buyerAmounts.map(amt => ethers.parseEther(amt));
360
+ transferAmountsWei = buyerAmounts.map((amt) => ethers.parseEther(amt));
667
361
  const totalTransfer = transferAmountsWei.reduce((a, b) => a + b, 0n);
668
362
  if (totalTransfer > distributableAmount) {
669
363
  throw new Error(`指定的买入总金额超过可分配金额 (${ethers.formatEther(distributableAmount)} BNB)`);
@@ -671,7 +365,7 @@ export async function fourQuickBatchSwapMerkle(params) {
671
365
  }
672
366
  else if (buyerRatios && buyerRatios.length === buyers.length) {
673
367
  // 比例模式
674
- transferAmountsWei = buyerRatios.map(ratio => {
368
+ transferAmountsWei = buyerRatios.map((ratio) => {
675
369
  return (distributableAmount * BigInt(Math.round(ratio * 10000))) / 10000n;
676
370
  });
677
371
  }
@@ -683,29 +377,19 @@ export async function fourQuickBatchSwapMerkle(params) {
683
377
  // ✅ 验证主钱包余额
684
378
  const sellerBalance = await seller.provider.getBalance(seller.address);
685
379
  // 主钱包只需要支付:贿赂 + Gas(卖出后有 BNB 可用于转账和利润)
686
- const sellerGasCost = gasPrice * (GAS_LIMITS.BRIBE + finalGasLimit + GAS_LIMITS.BRIBE * BigInt(buyers.length) + GAS_LIMITS.BRIBE);
380
+ const sellerGasCost = gasPrice * (21000n + finalGasLimit + 21000n * BigInt(buyers.length) + 21000n);
687
381
  const sellerRequired = bribeAmount + sellerGasCost;
688
382
  if (sellerBalance < sellerRequired) {
689
383
  throw new Error(`主钱包 BNB 余额不足: 需要约 ${ethers.formatEther(sellerRequired)} BNB (贿赂: ${ethers.formatEther(bribeAmount)}, Gas: ${ethers.formatEther(sellerGasCost)}), 实际 ${ethers.formatEther(sellerBalance)} BNB`);
690
384
  }
691
385
  // ==================== 规划 Nonce ====================
692
386
  // ✅ 如果前端传入了 startNonces,直接使用(性能优化)
693
- let sellerNonce = startNonces && startNonces.length > 0
694
- ? startNonces[0]
695
- : await nonceManager.getNextNonce(seller);
387
+ let sellerNonce = startNonces && startNonces.length > 0 ? startNonces[0] : await nonceManager.getNextNonce(seller);
696
388
  // ==================== 1. 贿赂交易 ====================
697
389
  let bribeTx = null;
698
390
  if (bribeAmount > 0n) {
699
- bribeTx = await seller.signTransaction({
700
- to: BLOCKRAZOR_BUILDER_EOA,
701
- value: bribeAmount,
702
- nonce: sellerNonce++,
703
- gasPrice,
704
- gasLimit: BRIBE_GAS_LIMIT,
705
- chainId: chainIdNum,
706
- type: txType
707
- });
708
- console.log(`[fourQuickBatchSwapMerkle] 贿赂交易已签名`);
391
+ bribeTx = await signBribeTransaction(seller, bribeAmount, sellerNonce, gasPrice, chainIdNum, txType);
392
+ sellerNonce++;
709
393
  }
710
394
  // ==================== 2. 卖出交易 ====================
711
395
  const tmSeller = new Contract(TM_ADDRESS, TM_ABI, seller);
@@ -717,20 +401,19 @@ export async function fourQuickBatchSwapMerkle(params) {
717
401
  gasLimit: finalGasLimit,
718
402
  gasPrice,
719
403
  chainId: chainIdNum,
720
- type: txType
404
+ type: txType,
721
405
  });
722
- console.log(`[fourQuickBatchSwapMerkle] 卖出交易已签名`);
723
406
  // ==================== 3. 转账交易(支持多跳)====================
724
407
  const reserveGas = ethers.parseEther((config.reserveGasBNB || 0.0005).toString());
725
408
  const buyerGasCost = gasPrice * finalGasLimit;
726
409
  // ✅ 生成多跳路径
727
- const hopPaths = generateDisperseHopPaths(buyers.map(b => b.address), disperseHopCount, provider);
410
+ const hopPaths = generateDisperseHopPaths(buyers.map((b) => b.address), disperseHopCount, provider);
728
411
  // 收集所有中间钱包信息
729
412
  const allHopWallets = [];
730
- hopPaths.forEach(path => {
413
+ hopPaths.forEach((path) => {
731
414
  allHopWallets.push(...path.hopWalletsInfo);
732
415
  });
733
- let transferTxs = [];
416
+ let transferTxs;
734
417
  if (disperseHopCount === 0) {
735
418
  // ✅ 无多跳:直接转账
736
419
  const transferNonces = buyers.map((_, i) => sellerNonce + i);
@@ -744,7 +427,7 @@ export async function fourQuickBatchSwapMerkle(params) {
744
427
  gasPrice,
745
428
  gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
746
429
  chainId: chainIdNum,
747
- type: txType
430
+ type: txType,
748
431
  });
749
432
  }));
750
433
  }
@@ -759,12 +442,11 @@ export async function fourQuickBatchSwapMerkle(params) {
759
442
  transferTxs = hopChains.flat();
760
443
  sellerNonce += buyers.length; // ✅ payer 只增加 buyers.length 个 nonce
761
444
  }
762
- console.log(`[fourQuickBatchSwapMerkle] ${transferTxs.length} 笔转账交易已签名 (多跳数=${disperseHopCount})`);
763
445
  // ==================== 4. 买入交易 ====================
764
446
  // ✅ 如果前端传入了 startNonces,使用 buyer 部分(从索引 1 开始)
765
447
  const buyerNonces = startNonces && startNonces.length > 1
766
448
  ? startNonces.slice(1)
767
- : await Promise.all(buyers.map(buyer => nonceManager.getNextNonce(buyer)));
449
+ : await Promise.all(buyers.map((buyer) => nonceManager.getNextNonce(buyer)));
768
450
  const signedBuys = await Promise.all(buyers.map(async (buyer, i) => {
769
451
  const buyAmount = transferAmountsWei[i];
770
452
  const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
@@ -777,10 +459,9 @@ export async function fourQuickBatchSwapMerkle(params) {
777
459
  gasPrice,
778
460
  chainId: chainIdNum,
779
461
  type: txType,
780
- value: buyAmount
462
+ value: buyAmount,
781
463
  });
782
464
  }));
783
- console.log(`[fourQuickBatchSwapMerkle] ${signedBuys.length} 笔买入交易已签名`);
784
465
  nonceManager.clearTemp();
785
466
  // ==================== 组装交易数组 ====================
786
467
  const signedTransactions = [];
@@ -801,29 +482,24 @@ export async function fourQuickBatchSwapMerkle(params) {
801
482
  gasPrice,
802
483
  chainId: chainIdNum,
803
484
  txType,
804
- startNonce: sellerNonce++
485
+ startNonce: sellerNonce++,
805
486
  });
806
487
  signedTransactions.push(...profitHopResult.signedTransactions);
807
488
  profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
808
489
  // 多跳交易已签名
809
490
  }
810
- console.log(`[fourQuickBatchSwapMerkle] 交易组装完成: ${signedTransactions.length} 笔`);
811
- console.log(` - 贿赂: ${bribeTx ? 1 : 0}`);
812
- console.log(` - 卖出: 1`);
813
- console.log(` - 转账: ${transferTxs.length}`);
814
- console.log(` - 买入: ${signedBuys.length}`);
815
491
  return {
816
492
  signedTransactions,
817
493
  disperseHopWallets: allHopWallets.length > 0 ? allHopWallets : undefined, // ✅ 返回转账多跳钱包
818
494
  profitHopWallets, // ✅ 返回利润多跳钱包
819
495
  metadata: {
820
496
  sellerAddress: seller.address,
821
- buyerAddresses: buyers.map(b => b.address),
497
+ buyerAddresses: buyers.map((b) => b.address),
822
498
  sellAmount: ethers.formatUnits(sellAmountWei, decimals),
823
499
  estimatedBNBOut: ethers.formatEther(estimatedBNBOut),
824
- transferAmounts: transferAmountsWei.map(amt => ethers.formatEther(amt)),
500
+ transferAmounts: transferAmountsWei.map((amt) => ethers.formatEther(amt)),
825
501
  profitAmount: profitAmount > 0n ? ethers.formatEther(profitAmount) : undefined,
826
- disperseHopCount: disperseHopCount > 0 ? disperseHopCount : undefined // ✅ 返回多跳数
827
- }
502
+ disperseHopCount: disperseHopCount > 0 ? disperseHopCount : undefined, // ✅ 返回多跳数
503
+ },
828
504
  };
829
505
  }