four-flap-meme-sdk 1.9.49 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. package/README.en.md +41 -6
  2. package/README.md +31 -0
  3. package/README.zh-CN.md +41 -6
  4. package/dist/abis/common.js +74 -68
  5. package/dist/abis/flap/vault.js +9 -7
  6. package/dist/abis/index.d.ts +3 -4
  7. package/dist/abis/index.js +3 -4
  8. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  9. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  10. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
  11. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  12. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
  13. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  14. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  15. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  16. package/dist/bundle-core/config-helpers.d.ts +36 -0
  17. package/dist/bundle-core/config-helpers.js +57 -0
  18. package/dist/bundle-core/errors.d.ts +50 -0
  19. package/dist/bundle-core/errors.js +34 -0
  20. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  21. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  22. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  23. package/dist/bundle-core/four-meme/core-helpers.js +40 -0
  24. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  25. package/dist/bundle-core/four-meme/core.js +515 -0
  26. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  27. package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
  28. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  29. package/dist/bundle-core/four-meme/private.js +465 -0
  30. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  31. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  32. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  33. package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
  34. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  35. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  36. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  37. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  38. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
  39. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  40. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  41. package/dist/bundle-core/four-meme/swap.js +505 -0
  42. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  43. package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
  44. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  45. package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
  46. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  47. package/dist/bundle-core/four-meme/types/index.js +1 -0
  48. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  49. package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
  50. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  51. package/dist/bundle-core/four-meme/types.js +1 -0
  52. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  53. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  54. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  55. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  56. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  57. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  58. package/dist/bundle-core/index.d.ts +8 -0
  59. package/dist/bundle-core/index.js +8 -0
  60. package/dist/bundle-core/internal.d.ts +21 -0
  61. package/dist/bundle-core/internal.js +182 -0
  62. package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
  63. package/dist/bundle-core/sign-context-helpers.js +67 -0
  64. package/dist/bundle-core/submit.d.ts +293 -0
  65. package/dist/bundle-core/submit.js +727 -0
  66. package/dist/bundle-core/types/index.d.ts +8 -0
  67. package/dist/bundle-core/types/index.js +1 -0
  68. package/dist/bundle-core/types.d.ts +1 -0
  69. package/dist/bundle-core/types.js +1 -0
  70. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  71. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -116
  72. package/dist/chains/bsc/four/config.d.ts +5 -70
  73. package/dist/chains/bsc/four/config.js +2 -115
  74. package/dist/chains/bsc/four/core.d.ts +1 -4
  75. package/dist/chains/bsc/four/core.js +1 -589
  76. package/dist/chains/bsc/four/disperse.d.ts +12 -0
  77. package/dist/chains/bsc/four/disperse.js +470 -0
  78. package/dist/chains/bsc/four/index.d.ts +6 -6
  79. package/dist/chains/bsc/four/index.js +6 -6
  80. package/dist/chains/bsc/four/internal.d.ts +2 -50
  81. package/dist/chains/bsc/four/internal.js +2 -237
  82. package/dist/chains/bsc/four/pairwise.d.ts +7 -0
  83. package/dist/chains/bsc/four/pairwise.js +308 -0
  84. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  85. package/dist/chains/bsc/four/pancake-proxy.js +1 -688
  86. package/dist/chains/bsc/four/private.d.ts +1 -27
  87. package/dist/chains/bsc/four/private.js +1 -477
  88. package/dist/chains/bsc/four/submit.d.ts +2 -315
  89. package/dist/chains/bsc/four/submit.js +2 -746
  90. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  91. package/dist/chains/bsc/four/swap-buy-first.js +2 -506
  92. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  93. package/dist/chains/bsc/four/swap-internal.js +1 -18
  94. package/dist/chains/bsc/four/swap.d.ts +2 -144
  95. package/dist/chains/bsc/four/swap.js +2 -760
  96. package/dist/chains/bsc/four/sweep.d.ts +13 -0
  97. package/dist/chains/bsc/four/sweep.js +788 -0
  98. package/dist/chains/bsc/four/types.d.ts +1 -476
  99. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  100. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  101. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  102. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  103. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  104. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  105. package/dist/chains/bsc/four/utils.d.ts +5 -18
  106. package/dist/chains/bsc/four/utils.js +5 -1534
  107. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
  108. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
  109. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  110. package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -207
  111. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  112. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
  113. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  114. package/dist/chains/bsc/pancake/bundle-swap.js +111 -686
  115. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  116. package/dist/chains/bsc/pancake/index.js +1 -3
  117. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  118. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  119. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  120. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  121. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  122. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  123. package/dist/chains/eni/batch-router/transfer.js +54 -23
  124. package/dist/chains/eni/batch-router/utils.js +32 -6
  125. package/dist/chains/eni/bundler/sign.js +4 -4
  126. package/dist/chains/eni/bundler/submit.js +1 -4
  127. package/dist/chains/eni/constants.js +1 -1
  128. package/dist/chains/eni/index.d.ts +1 -1
  129. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  130. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  131. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  132. package/dist/chains/eni/platforms/daoaas/meta.js +8 -4
  133. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
  134. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  135. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  136. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  137. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  138. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -47
  139. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  140. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  141. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  142. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  143. package/dist/chains/eni/platforms/iro/index.js +4 -4
  144. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  145. package/dist/chains/eni/platforms/iro/token.js +107 -31
  146. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  147. package/dist/chains/eni/submit.js +5 -13
  148. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  149. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
  150. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  151. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  152. package/dist/chains/xlayer/eip7702/bundle-create.js +93 -56
  153. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  154. package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
  155. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  156. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
  157. package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
  158. package/dist/chains/xlayer/eip7702/constants.js +3 -21
  159. package/dist/chains/xlayer/eip7702/index.d.ts +27 -46
  160. package/dist/chains/xlayer/eip7702/index.js +27 -81
  161. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
  162. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
  163. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  164. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +58 -291
  165. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  166. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
  167. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  168. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  169. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  170. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
  171. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  172. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  173. package/dist/chains/xlayer/eip7702/volume.js +83 -158
  174. package/dist/chains/xlayer/eoa/constants.js +1 -1
  175. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  176. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  177. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  178. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  179. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +64 -276
  180. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  181. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
  182. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  183. package/dist/chains/xlayer/eoa/index.js +8 -23
  184. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  185. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  186. package/dist/chains/xlayer/eoa/types-core.d.ts +363 -0
  187. package/dist/chains/xlayer/eoa/types-core.js +53 -0
  188. package/dist/chains/xlayer/eoa/types-create.d.ts +413 -0
  189. package/dist/chains/xlayer/eoa/types-create.js +9 -0
  190. package/dist/chains/xlayer/eoa/types-volume.d.ts +209 -0
  191. package/dist/chains/xlayer/eoa/types-volume.js +13 -0
  192. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  193. package/dist/chains/xlayer/eoa/types.js +1 -3
  194. package/dist/contracts/helper3.d.ts +20 -17
  195. package/dist/contracts/helper3.js +56 -20
  196. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  197. package/dist/contracts/tm-bundle-helpers.js +72 -0
  198. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  199. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -117
  200. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
  201. package/dist/contracts/tm-bundle-merkle/config.js +2 -115
  202. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  203. package/dist/contracts/tm-bundle-merkle/core.js +1 -588
  204. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  205. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  206. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -50
  207. package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
  208. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  209. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
  210. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  211. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  212. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  213. package/dist/contracts/tm-bundle-merkle/submit.js +3 -919
  214. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  215. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
  216. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  217. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  218. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  219. package/dist/contracts/tm-bundle-merkle/swap.js +2 -757
  220. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  221. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  222. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  223. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  224. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  225. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  226. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  227. package/dist/contracts/tm-bundle-merkle/utils.d.ts +5 -6
  228. package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
  229. package/dist/contracts/tm-bundle.d.ts +3 -51
  230. package/dist/contracts/tm-bundle.js +102 -142
  231. package/dist/contracts/tm.d.ts +3 -2
  232. package/dist/contracts/tm.js +36 -32
  233. package/dist/contracts/tm1.js +9 -4
  234. package/dist/contracts/tm2.js +9 -4
  235. package/dist/dex/direct-router-helpers.d.ts +264 -0
  236. package/dist/dex/direct-router-helpers.js +539 -0
  237. package/dist/dex/direct-router.d.ts +3 -125
  238. package/dist/dex/direct-router.js +237 -652
  239. package/dist/dex/types.d.ts +81 -0
  240. package/dist/dex/types.js +1 -0
  241. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  242. package/dist/exports/root-bundle-and-tooling.js +30 -0
  243. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  244. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  245. package/dist/exports/root-foundations.d.ts +35 -0
  246. package/dist/exports/root-foundations.js +70 -0
  247. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  248. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  249. package/dist/flows/create.d.ts +2 -2
  250. package/dist/flows/create.js +6 -6
  251. package/dist/flows/index.d.ts +1 -0
  252. package/dist/flows/index.js +1 -0
  253. package/dist/index.d.ts +20 -91
  254. package/dist/index.js +20 -215
  255. package/dist/shared/abis/common.d.ts +2 -83
  256. package/dist/shared/abis/common.js +2 -252
  257. package/dist/shared/abis/index.d.ts +5 -6
  258. package/dist/shared/abis/index.js +5 -7
  259. package/dist/shared/clients/blockrazor.js +41 -24
  260. package/dist/shared/clients/club48.js +30 -26
  261. package/dist/shared/clients/emitservice.js +2 -0
  262. package/dist/shared/clients/four.js +23 -18
  263. package/dist/shared/clients/index.d.ts +8 -0
  264. package/dist/shared/clients/index.js +8 -0
  265. package/dist/shared/clients/merkle.js +26 -30
  266. package/dist/shared/constants/addresses.d.ts +1 -1
  267. package/dist/shared/constants/addresses.js +11 -2
  268. package/dist/shared/constants/chains.d.ts +1 -1
  269. package/dist/shared/constants/chains.js +1 -1
  270. package/dist/shared/constants/gas.d.ts +1 -1
  271. package/dist/shared/constants/gas.js +2 -6
  272. package/dist/shared/constants/index.d.ts +1 -0
  273. package/dist/shared/constants/index.js +1 -0
  274. package/dist/shared/constants/quote.d.ts +30 -0
  275. package/dist/shared/constants/quote.js +37 -0
  276. package/dist/shared/flap/__tests__/curve.test.js +3 -3
  277. package/dist/shared/flap/abi.js +1 -1
  278. package/dist/shared/flap/constants.d.ts +1 -1
  279. package/dist/shared/flap/constants.js +2 -2
  280. package/dist/shared/flap/curve.js +3 -0
  281. package/dist/shared/flap/errors.d.ts +1 -4
  282. package/dist/shared/flap/errors.js +21 -3
  283. package/dist/shared/flap/index.d.ts +2 -2
  284. package/dist/shared/flap/index.js +2 -2
  285. package/dist/shared/flap/meta.d.ts +16 -18
  286. package/dist/shared/flap/meta.js +14 -26
  287. package/dist/shared/flap/permit.js +6 -5
  288. package/dist/shared/flap/pinata.d.ts +9 -2
  289. package/dist/shared/flap/pinata.js +20 -18
  290. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  291. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  292. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  293. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  294. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  295. package/dist/shared/flap/portal-bundle-merkle/core.js +66 -156
  296. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
  297. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
  298. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  299. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  300. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  301. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  302. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  303. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  304. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  305. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
  306. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  307. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  308. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
  309. package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
  310. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +73 -3
  311. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +100 -0
  312. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +133 -0
  313. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  314. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  315. package/dist/shared/flap/portal-bundle.js +54 -42
  316. package/dist/shared/flap/portal.js +32 -10
  317. package/dist/shared/flap/vanity.js +4 -7
  318. package/dist/shared/flap/vault.d.ts +1 -1
  319. package/dist/shared/flap/vault.js +54 -48
  320. package/dist/shared/flap 2/__tests__/curve.test.d.ts +1 -0
  321. package/dist/shared/flap 2/portal-bundle-merkle/types.js +1 -0
  322. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  323. package/dist/shared/foundation/dex/v3-path.js +35 -0
  324. package/dist/shared/foundation/gas/bundle-gas.d.ts +39 -0
  325. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  326. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  327. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  328. package/dist/shared/foundation/index.d.ts +13 -0
  329. package/dist/shared/foundation/index.js +12 -0
  330. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  331. package/dist/shared/foundation/nonce/nonce-manager.js +180 -0
  332. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  333. package/dist/shared/foundation/normalize-unknown.js +29 -0
  334. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  335. package/dist/shared/foundation/sdk-logger.js +12 -0
  336. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  337. package/dist/shared/foundation/tx/build-request.js +25 -0
  338. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  339. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  340. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  341. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  342. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  343. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  344. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  345. package/dist/shared/foundation/types/erc20.js +1 -0
  346. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  347. package/dist/shared/foundation/types/holders-maker.js +1 -0
  348. package/dist/shared/foundation/types/index.d.ts +7 -0
  349. package/dist/shared/foundation/types/index.js +1 -0
  350. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  351. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  352. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  353. package/dist/shared/foundation/types/multicall.js +1 -0
  354. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  355. package/dist/shared/foundation/types/private-sale.js +1 -0
  356. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  357. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  358. package/dist/shared/four/tax-token.d.ts +1 -1
  359. package/dist/shared/four/tax-token.js +27 -7
  360. package/dist/shared/index.d.ts +4 -0
  361. package/dist/shared/index.js +4 -0
  362. package/dist/types/distribute.d.ts +72 -0
  363. package/dist/types/distribute.js +1 -0
  364. package/dist/types 2/errors.d.ts +27 -0
  365. package/dist/types 2/errors.js +34 -0
  366. package/dist/utils/airdrop-sweep-types.d.ts +1 -0
  367. package/dist/utils/airdrop-sweep-types.js +1 -0
  368. package/dist/utils/airdrop-sweep.d.ts +4 -76
  369. package/dist/utils/airdrop-sweep.js +38 -52
  370. package/dist/utils/bundle-helpers.d.ts +9 -243
  371. package/dist/utils/bundle-helpers.js +10 -584
  372. package/dist/utils/constants.d.ts +5 -61
  373. package/dist/utils/constants.js +5 -80
  374. package/dist/utils/contract-factory.d.ts +2 -4
  375. package/dist/utils/contract-factory.js +25 -18
  376. package/dist/utils/erc20-types.d.ts +1 -0
  377. package/dist/utils/erc20-types.js +1 -0
  378. package/dist/utils/erc20.d.ts +8 -90
  379. package/dist/utils/erc20.js +94 -153
  380. package/dist/utils/errors.d.ts +10 -22
  381. package/dist/utils/errors.js +61 -79
  382. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  383. package/dist/utils/holders-maker/addresses.js +15 -0
  384. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  385. package/dist/utils/holders-maker/buy-tx.js +278 -0
  386. package/dist/utils/holders-maker/constants.d.ts +6 -0
  387. package/dist/utils/holders-maker/constants.js +7 -0
  388. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  389. package/dist/utils/holders-maker/disperse.js +90 -0
  390. package/dist/utils/holders-maker/routing.d.ts +4 -0
  391. package/dist/utils/holders-maker/routing.js +45 -0
  392. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  393. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  394. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  395. package/dist/utils/holders-maker-helpers.js +9 -0
  396. package/dist/utils/holders-maker-types.d.ts +1 -0
  397. package/dist/utils/holders-maker-types.js +1 -0
  398. package/dist/utils/holders-maker.d.ts +2 -138
  399. package/dist/utils/holders-maker.js +23 -651
  400. package/dist/utils/hop-chains.d.ts +35 -0
  401. package/dist/utils/hop-chains.js +215 -0
  402. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  403. package/dist/utils/lp-inspect-helpers.js +109 -0
  404. package/dist/utils/lp-inspect-types.d.ts +1 -0
  405. package/dist/utils/lp-inspect-types.js +1 -0
  406. package/dist/utils/lp-inspect.d.ts +2 -112
  407. package/dist/utils/lp-inspect.js +63 -195
  408. package/dist/utils/mpcExclusive.d.ts +2 -5
  409. package/dist/utils/mpcExclusive.js +4 -3
  410. package/dist/utils/private-sale-types.d.ts +1 -0
  411. package/dist/utils/private-sale-types.js +1 -0
  412. package/dist/utils/private-sale.d.ts +2 -58
  413. package/dist/utils/private-sale.js +2 -7
  414. package/dist/utils/provider-factory.d.ts +4 -0
  415. package/dist/utils/provider-factory.js +10 -0
  416. package/dist/utils/quote-helpers-types.d.ts +1 -0
  417. package/dist/utils/quote-helpers-types.js +1 -0
  418. package/dist/utils/quote-helpers.d.ts +4 -45
  419. package/dist/utils/quote-helpers.js +15 -65
  420. package/dist/utils/stealth-transfer.d.ts +2 -28
  421. package/dist/utils/stealth-transfer.js +30 -14
  422. package/dist/utils/swap-helpers.d.ts +0 -3
  423. package/dist/utils/swap-helpers.js +6 -9
  424. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  425. package/dist/utils/types/airdrop-sweep.js +1 -0
  426. package/dist/utils/types/contract-factory.d.ts +1 -0
  427. package/dist/utils/types/contract-factory.js +1 -0
  428. package/dist/utils/types/erc20.d.ts +1 -0
  429. package/dist/utils/types/erc20.js +1 -0
  430. package/dist/utils/types/errors.d.ts +1 -0
  431. package/dist/utils/types/errors.js +1 -0
  432. package/dist/utils/types/holders-maker.d.ts +1 -0
  433. package/dist/utils/types/holders-maker.js +1 -0
  434. package/dist/utils/types/hop-chains.d.ts +8 -0
  435. package/dist/utils/types/hop-chains.js +1 -0
  436. package/dist/utils/types/index.d.ts +13 -0
  437. package/dist/utils/types/index.js +1 -0
  438. package/dist/utils/types/lp-inspect.d.ts +1 -0
  439. package/dist/utils/types/lp-inspect.js +1 -0
  440. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  441. package/dist/utils/types/mpc-exclusive.js +1 -0
  442. package/dist/utils/types/private-sale.d.ts +1 -0
  443. package/dist/utils/types/private-sale.js +1 -0
  444. package/dist/utils/types/quote-helpers.d.ts +1 -0
  445. package/dist/utils/types/quote-helpers.js +1 -0
  446. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  447. package/dist/utils/types/stealth-transfer.js +1 -0
  448. package/dist/utils/types/wallet.d.ts +25 -0
  449. package/dist/utils/types/wallet.js +1 -0
  450. package/dist/utils/wallet.d.ts +2 -25
  451. package/dist/utils/wallet.js +9 -10
  452. package/package.json +55 -2
  453. package/src/abis/contracts/TaxToken.json +969 -0
  454. package/src/abis/contracts/TokenManager.json +836 -0
  455. package/src/abis/contracts/TokenManager2.json +136 -0
  456. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  457. /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
  458. /package/dist/{shared 2/flap/portal-bundle-merkle/types.js → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
  459. /package/dist/{shared 2/abis → shared/abis 2}/TaxToken.json +0 -0
  460. /package/dist/{shared 2/abis → shared/abis 2}/TokenManager.json +0 -0
  461. /package/dist/{shared 2/abis → shared/abis 2}/TokenManager2.json +0 -0
  462. /package/dist/{shared 2/abis → shared/abis 2}/TokenManagerHelper3.json +0 -0
  463. /package/dist/{shared 2/abis → shared/abis 2}/common.d.ts +0 -0
  464. /package/dist/{shared 2/abis → shared/abis 2}/common.js +0 -0
  465. /package/dist/{shared 2/abis → shared/abis 2}/index.d.ts +0 -0
  466. /package/dist/{shared 2/abis → shared/abis 2}/index.js +0 -0
  467. /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.d.ts +0 -0
  468. /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.js +0 -0
  469. /package/dist/{shared 2/clients → shared/clients 2}/club48.d.ts +0 -0
  470. /package/dist/{shared 2/clients → shared/clients 2}/club48.js +0 -0
  471. /package/dist/{shared 2/clients → shared/clients 2}/emitservice.d.ts +0 -0
  472. /package/dist/{shared 2/clients → shared/clients 2}/emitservice.js +0 -0
  473. /package/dist/{shared 2/clients → shared/clients 2}/four.d.ts +0 -0
  474. /package/dist/{shared 2/clients → shared/clients 2}/four.js +0 -0
  475. /package/dist/{shared 2/clients → shared/clients 2}/merkle.d.ts +0 -0
  476. /package/dist/{shared 2/clients → shared/clients 2}/merkle.js +0 -0
  477. /package/dist/{shared 2/flap → shared/flap 2}/__tests__/curve.test.js +0 -0
  478. /package/dist/{shared 2/flap → shared/flap 2}/abi.d.ts +0 -0
  479. /package/dist/{shared 2/flap → shared/flap 2}/abi.js +0 -0
  480. /package/dist/{shared 2/flap → shared/flap 2}/constants.d.ts +0 -0
  481. /package/dist/{shared 2/flap → shared/flap 2}/constants.js +0 -0
  482. /package/dist/{shared 2/flap → shared/flap 2}/curve.d.ts +0 -0
  483. /package/dist/{shared 2/flap → shared/flap 2}/curve.js +0 -0
  484. /package/dist/{shared 2/flap → shared/flap 2}/errors.d.ts +0 -0
  485. /package/dist/{shared 2/flap → shared/flap 2}/errors.js +0 -0
  486. /package/dist/{shared 2/flap → shared/flap 2}/index.d.ts +0 -0
  487. /package/dist/{shared 2/flap → shared/flap 2}/index.js +0 -0
  488. /package/dist/{shared 2/flap → shared/flap 2}/ipfs.d.ts +0 -0
  489. /package/dist/{shared 2/flap → shared/flap 2}/ipfs.js +0 -0
  490. /package/dist/{shared 2/flap → shared/flap 2}/meta.d.ts +0 -0
  491. /package/dist/{shared 2/flap → shared/flap 2}/meta.js +0 -0
  492. /package/dist/{shared 2/flap → shared/flap 2}/permit.d.ts +0 -0
  493. /package/dist/{shared 2/flap → shared/flap 2}/permit.js +0 -0
  494. /package/dist/{shared 2/flap → shared/flap 2}/pinata.d.ts +0 -0
  495. /package/dist/{shared 2/flap → shared/flap 2}/pinata.js +0 -0
  496. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.d.ts +0 -0
  497. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.js +0 -0
  498. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.d.ts +0 -0
  499. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.js +0 -0
  500. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.d.ts +0 -0
  501. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.js +0 -0
  502. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.d.ts +0 -0
  503. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.js +0 -0
  504. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.d.ts +0 -0
  505. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.js +0 -0
  506. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.d.ts +0 -0
  507. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.js +0 -0
  508. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.d.ts +0 -0
  509. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.js +0 -0
  510. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.d.ts +0 -0
  511. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.js +0 -0
  512. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.d.ts +0 -0
  513. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.js +0 -0
  514. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/types.d.ts +0 -0
  515. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.d.ts +0 -0
  516. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.js +0 -0
  517. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.d.ts +0 -0
  518. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.js +0 -0
  519. /package/dist/{shared 2/flap → shared/flap 2}/portal.d.ts +0 -0
  520. /package/dist/{shared 2/flap → shared/flap 2}/portal.js +0 -0
  521. /package/dist/{shared 2/flap → shared/flap 2}/vanity.d.ts +0 -0
  522. /package/dist/{shared 2/flap → shared/flap 2}/vanity.js +0 -0
  523. /package/dist/{shared 2/flap → shared/flap 2}/vault.d.ts +0 -0
  524. /package/dist/{shared 2/flap → shared/flap 2}/vault.js +0 -0
  525. /package/dist/{shared 2/four → shared/four 2}/index.d.ts +0 -0
  526. /package/dist/{shared 2/four → shared/four 2}/index.js +0 -0
  527. /package/dist/{shared 2/four → shared/four 2}/tax-token.d.ts +0 -0
  528. /package/dist/{shared 2/four → shared/four 2}/tax-token.js +0 -0
  529. /package/dist/{shared 2/index.d.ts → shared/index 2.js} +0 -0
  530. /package/dist/{shared 2/index.js → shared/index.d 2.ts} +0 -0
@@ -1,127 +1,18 @@
1
1
  /**
2
- * PancakeSwap V2/V3 通用捆绑换手(Merkle Bundle)- 先买后卖
3
- *
4
- * 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
2
+ * bundle-buy-first - 主函数
5
3
  */
6
4
  import { ethers, Contract, Wallet } from 'ethers';
7
- import { NonceManager, getDeadline, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
8
- import { ADDRESSES, PROFIT_CONFIG, BLOCKRAZOR_BUILDER_EOA, ZERO_ADDRESS } from '../../../utils/constants.js';
9
- import { GAS_LIMITS } from '../../../shared/constants/index.js';
5
+ import { createSignProvider } from '../../../bundle-core/sign-context-helpers.js';
6
+ import { NonceManager, getDeadline, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
7
+ import { BLOCKRAZOR_BUILDER_EOA, ZERO_ADDRESS } from '../../../shared/constants/index.js';
8
+ import { GAS_LIMITS, getProfitRecipient } from '../../../shared/constants/index.js';
10
9
  import { quoteV2, quoteV3, getTokenToNativeQuote } from '../../../utils/quote-helpers.js';
11
- import { V2_ROUTER_ABI, V3_ROUTER02_ABI, ERC20_BALANCE_ABI } from '../../../shared/abis/common.js';
12
- /**
13
- * 获取 Gas Limit
14
- */
15
- function getGasLimit(config, defaultGas = 800000) {
16
- if (config.gasLimit !== undefined) {
17
- return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
18
- }
19
- const multiplier = config.gasLimitMultiplier ?? 1.0;
20
- const calculatedGas = Math.ceil(defaultGas * multiplier);
21
- return BigInt(calculatedGas);
22
- }
23
- async function getGasPrice(provider, config) {
24
- const feeData = await provider.getFeeData();
25
- let gasPrice = feeData.gasPrice || ethers.parseUnits('3', 'gwei');
26
- if (config.minGasPriceGwei) {
27
- const minGas = ethers.parseUnits(config.minGasPriceGwei.toString(), 'gwei');
28
- if (gasPrice < minGas)
29
- gasPrice = minGas;
30
- }
31
- if (config.maxGasPriceGwei) {
32
- const maxGas = ethers.parseUnits(config.maxGasPriceGwei.toString(), 'gwei');
33
- if (gasPrice > maxGas)
34
- gasPrice = maxGas;
35
- }
36
- return gasPrice;
37
- }
38
- // ✅ ABI 别名(从公共模块导入)
39
- const PANCAKE_V2_ROUTER_ABI = V2_ROUTER_ABI;
40
- const PANCAKE_V3_ROUTER_ABI = V3_ROUTER02_ABI;
41
- const ERC20_BALANCE_OF_ABI = ERC20_BALANCE_ABI;
42
- // ✅ 使用官方 PancakeSwap Router 地址
43
- const PANCAKE_V2_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV2Router;
44
- const PANCAKE_V3_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV3Router;
45
- // 常量
46
- const FLAT_FEE = 0n;
47
- // ==================== 多笔买卖常量 ====================
48
- /** 最大 Bundle 签名数 */
49
- const MAX_BUNDLE_SIGNATURES = 50;
50
- /** 贿赂交易数 */
51
- const BRIBE_TX_COUNT = 1;
52
- /** 利润中转交易数(支付者 1 笔 + 中转钱包 PROFIT_HOP_COUNT 笔 + 最终接收 1 笔) */
53
- const PROFIT_TX_COUNT = PROFIT_HOP_COUNT + 2; // 2 + 2 = 4
54
- /** 最大买卖交易数 */
55
- const MAX_SWAP_TX_COUNT = MAX_BUNDLE_SIGNATURES - BRIBE_TX_COUNT - PROFIT_TX_COUNT; // 50 - 1 - 4 = 45
56
- /**
57
- * 根据 userType 获取每笔交易的利润率
58
- */
59
- function getProfitRatePerTxBps(userType) {
60
- if (userType === 'v1') {
61
- return PROFIT_CONFIG.RATE_BPS_V1_DOUBLE;
62
- }
63
- return PROFIT_CONFIG.RATE_BPS_V0_DOUBLE; // v0 或默认
64
- }
65
- /**
66
- * 验证买卖笔数
67
- */
68
- function validateSwapCounts(buyCount, sellCount) {
69
- if (buyCount < 1) {
70
- throw new Error(`买入笔数必须至少为 1,当前为 ${buyCount}`);
71
- }
72
- if (sellCount < 1) {
73
- throw new Error(`卖出笔数必须至少为 1,当前为 ${sellCount}`);
74
- }
75
- const totalSwaps = buyCount + sellCount;
76
- if (totalSwaps > MAX_SWAP_TX_COUNT) {
77
- throw new Error(`买卖笔数总和 (${totalSwaps}) 超出限制 (${MAX_SWAP_TX_COUNT}),` +
78
- `最大签名数为 ${MAX_BUNDLE_SIGNATURES}(${BRIBE_TX_COUNT} 贿赂 + ${PROFIT_TX_COUNT} 利润 + ${MAX_SWAP_TX_COUNT} 买卖)`);
79
- }
80
- }
81
- /**
82
- * ✅ 将金额随机拆分成多份(更自然,不像机器人)
83
- * 每份金额在平均值的 50%-150% 之间随机浮动
84
- */
85
- function splitAmount(totalAmount, count) {
86
- if (count <= 0) {
87
- throw new Error('拆分份数必须大于 0');
88
- }
89
- if (count === 1) {
90
- return [totalAmount];
91
- }
92
- // 生成随机权重(0.5 - 1.5 之间)
93
- const weights = [];
94
- for (let i = 0; i < count; i++) {
95
- // 随机值在 0.5 - 1.5 之间,使每份金额有 ±50% 的浮动
96
- weights.push(0.5 + Math.random());
97
- }
98
- // 计算权重总和
99
- const totalWeight = weights.reduce((a, b) => a + b, 0);
100
- // 根据权重分配金额
101
- const amounts = [];
102
- let allocated = 0n;
103
- for (let i = 0; i < count - 1; i++) {
104
- // 按权重比例分配
105
- const ratio = weights[i] / totalWeight;
106
- const amount = BigInt(Math.floor(Number(totalAmount) * ratio));
107
- amounts.push(amount);
108
- allocated += amount;
109
- }
110
- // 最后一份分配剩余的全部(确保总和精确)
111
- amounts.push(totalAmount - allocated);
112
- // 随机打乱顺序(让大小金额交错出现)
113
- for (let i = amounts.length - 1; i > 0; i--) {
114
- const j = Math.floor(Math.random() * (i + 1));
115
- [amounts[i], amounts[j]] = [amounts[j], amounts[i]];
116
- }
117
- return amounts;
118
- }
10
+ import { ERC20_BALANCE_OF_ABI, FLAT_FEE, PANCAKE_V2_ROUTER_ABI, PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, PANCAKE_V3_ROUTER_ADDRESS, getGasLimit, getGasPrice, getProfitRatePerTxBps, splitAmount, validateSwapCounts, } from './bundle-buy-first-helpers.js';
119
11
  export async function pancakeBundleBuyFirstMerkle(params) {
120
- const { buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, tokenAddress, routeParams, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals = 18, buyCount: _buyCount, sellCount: _sellCount, taxRateBps = 0 // ✅ 税率(基点),用于计算实际可卖出代币数量
12
+ const { buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, routeParams, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals = 18, buyCount: _buyCount, sellCount: _sellCount, taxRateBps = 0, // ✅ 税率(基点),用于计算实际可卖出代币数量
121
13
  } = params;
122
14
  // ✅ 判断是否为多钱包模式
123
- const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) ||
124
- !!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
15
+ const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) || !!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
125
16
  // ✅ 多钱包模式:buyCount/sellCount 代表钱包数量
126
17
  // 单钱包模式(向后兼容):buyCount/sellCount 代表同一钱包执行的交易笔数
127
18
  const buyCount = _buyCount ?? 1;
@@ -131,13 +22,12 @@ export async function pancakeBundleBuyFirstMerkle(params) {
131
22
  return await pancakeBundleBuyFirstMultiWallet({
132
23
  buyerPrivateKeys: buyerPrivateKeys || (buyerPrivateKey ? [buyerPrivateKey] : []),
133
24
  sellerPrivateKeys: sellerPrivateKeys || (sellerPrivateKey ? [sellerPrivateKey] : []),
134
- tokenAddress,
135
25
  routeParams,
136
26
  buyerFunds,
137
27
  config,
138
28
  quoteToken,
139
29
  quoteTokenDecimals,
140
- taxRateBps // ✅ 传递税率
30
+ taxRateBps, // ✅ 传递税率
141
31
  });
142
32
  }
143
33
  // ✅ 单钱包模式(向后兼容):验证买卖笔数
@@ -162,13 +52,13 @@ export async function pancakeBundleBuyFirstMerkle(params) {
162
52
  useNativeToken,
163
53
  quoteToken,
164
54
  quoteTokenDecimals,
165
- provider: context.provider
55
+ provider: context.provider,
166
56
  });
167
57
  const quoteResult = await quoteTokenOutput({
168
58
  routeParams,
169
59
  buyerFundsWei: buyerFundsInfo.buyerFundsWei,
170
60
  provider: context.provider,
171
- v2RouterOverride: config.v2RouterAddress
61
+ v2RouterOverride: config.v2RouterAddress,
172
62
  });
173
63
  // ✅ 拆分买入和卖出金额
174
64
  const buyAmountsWei = splitAmount(buyerFundsInfo.buyerFundsWei, buyCount);
@@ -187,9 +77,8 @@ export async function pancakeBundleBuyFirstMerkle(params) {
187
77
  sellAmountsWei,
188
78
  buyer,
189
79
  seller,
190
- tokenAddress,
191
80
  useNativeToken,
192
- v2RouterAddress: config.v2RouterAddress
81
+ v2RouterAddress: config.v2RouterAddress,
193
82
  });
194
83
  const finalGasLimit = getGasLimit(config);
195
84
  const gasPrice = await getGasPrice(context.provider, config);
@@ -208,9 +97,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
208
97
  // ERC20→BNB 转换完成
209
98
  }
210
99
  // ✅ 获取贿赂金额
211
- const bribeAmount = config.bribeAmount && config.bribeAmount > 0
212
- ? ethers.parseEther(String(config.bribeAmount))
213
- : 0n;
100
+ const bribeAmount = config.bribeAmount && config.bribeAmount > 0 ? ethers.parseEther(String(config.bribeAmount)) : 0n;
214
101
  const needBribeTx = bribeAmount > 0n;
215
102
  // ✅ 规划多笔交易 nonce(忽略 startNonces,使用新的多笔规划)
216
103
  const multiNoncePlan = await planMultiNonces({
@@ -221,7 +108,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
221
108
  sameAddress,
222
109
  extractProfit: profitAmount > 0n,
223
110
  needBribeTx,
224
- nonceManager
111
+ nonceManager,
225
112
  });
226
113
  // ✅ 贿赂交易放在首位(由卖方发送,与利润交易同一钱包)
227
114
  let bribeTx = null;
@@ -233,7 +120,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
233
120
  gasPrice,
234
121
  gasLimit: GAS_LIMITS.BRIBE,
235
122
  chainId: context.chainId,
236
- type: txType
123
+ type: txType,
237
124
  });
238
125
  }
239
126
  // ✅ 并行签名所有买入交易
@@ -244,7 +131,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
244
131
  gasLimit: finalGasLimit,
245
132
  gasPrice,
246
133
  chainId: context.chainId,
247
- type: txType
134
+ type: txType,
248
135
  })));
249
136
  // ✅ 并行签名所有卖出交易
250
137
  const signedSells = await Promise.all(swapUnsignedArray.sellUnsignedArray.map((unsigned, i) => seller.signTransaction({
@@ -254,7 +141,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
254
141
  gasLimit: finalGasLimit,
255
142
  gasPrice,
256
143
  chainId: context.chainId,
257
- type: txType
144
+ type: txType,
258
145
  })));
259
146
  nonceManager.clearTemp();
260
147
  validateFinalBalances({
@@ -267,7 +154,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
267
154
  useNativeToken,
268
155
  quoteTokenDecimals,
269
156
  provider: context.provider,
270
- buyerAddress: buyer.address
157
+ buyerAddress: buyer.address,
271
158
  });
272
159
  // ✅ 组装顺序:贿赂 → 买入(多笔) → 卖出(多笔)(与 Flap 一致)
273
160
  const allTransactions = [];
@@ -282,7 +169,7 @@ export async function pancakeBundleBuyFirstMerkle(params) {
282
169
  profitNonce: multiNoncePlan.profitNonce,
283
170
  gasPrice,
284
171
  chainId: context.chainId,
285
- txType
172
+ txType,
286
173
  });
287
174
  let profitHopWallets;
288
175
  if (profitResult) {
@@ -304,22 +191,17 @@ export async function pancakeBundleBuyFirstMerkle(params) {
304
191
  buyCount,
305
192
  sellCount,
306
193
  // ✅ 返回每笔交易的具体金额(随机分配后的数组)
307
- buyAmounts: buyAmountsWei.map(amt => useNativeToken
308
- ? ethers.formatEther(amt)
309
- : ethers.formatUnits(amt, quoteTokenDecimals)),
310
- sellAmounts: sellAmountsWei.map(amt => amt.toString())
311
- }
194
+ buyAmounts: buyAmountsWei.map((amt) => useNativeToken ? ethers.formatEther(amt) : ethers.formatUnits(amt, quoteTokenDecimals)),
195
+ sellAmounts: sellAmountsWei.map((amt) => amt.toString()),
196
+ },
312
197
  };
313
198
  }
314
199
  function createPancakeContext(config) {
315
200
  const chainId = config.chainId ?? 56;
316
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
317
- chainId,
318
- name: 'BSC'
319
- });
201
+ const provider = createSignProvider(config.rpcUrl, chainId, 'BSC');
320
202
  return { chainId, provider };
321
203
  }
322
- async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGas, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider }) {
204
+ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGas, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider, }) {
323
205
  const reserveGasWei = ethers.parseEther((reserveGas ?? 0.0005).toString());
324
206
  // ✅ 根据是否使用原生代币获取不同的余额
325
207
  let buyerBalance;
@@ -342,7 +224,9 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
342
224
  const pct = Math.max(0, Math.min(100, buyerFundsPercentage));
343
225
  // ✅ 原生代币需要预留 Gas,ERC20 不需要
344
226
  const spendable = useNativeToken
345
- ? (buyerBalance > reserveGasWei ? buyerBalance - reserveGasWei : 0n)
227
+ ? buyerBalance > reserveGasWei
228
+ ? buyerBalance - reserveGasWei
229
+ : 0n
346
230
  : buyerBalance;
347
231
  buyerFundsWei = (spendable * BigInt(Math.floor(pct * 100))) / 10000n;
348
232
  }
@@ -374,7 +258,7 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
374
258
  /**
375
259
  * ✅ 使用 quote-helpers 统一报价
376
260
  */
377
- async function quoteTokenOutput({ routeParams, buyerFundsWei, provider, v2RouterOverride }) {
261
+ async function quoteTokenOutput({ routeParams, buyerFundsWei, provider, v2RouterOverride, }) {
378
262
  // V2 路由
379
263
  if (routeParams.routeType === 'v2') {
380
264
  const { v2Path } = routeParams;
@@ -411,7 +295,7 @@ async function quoteTokenOutput({ routeParams, buyerFundsWei, provider, v2Router
411
295
  /**
412
296
  * ✅ 构建多笔买入和卖出交易
413
297
  */
414
- async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmountsWei, buyer, seller, useNativeToken = true, v2RouterAddress }) {
298
+ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmountsWei, buyer, seller, useNativeToken = true, v2RouterAddress, }) {
415
299
  const deadline = getDeadline();
416
300
  if (routeParams.routeType === 'v2') {
417
301
  const { v2Path } = routeParams;
@@ -422,17 +306,17 @@ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmo
422
306
  // ✅ 根据是否使用原生代币选择不同的函数
423
307
  if (useNativeToken) {
424
308
  // BNB 池子:使用 swapExactETHForTokens / swapExactTokensForETH
425
- const buyUnsignedArray = await Promise.all(buyAmountsWei.map(amount => {
309
+ const buyUnsignedArray = await Promise.all(buyAmountsWei.map((amount) => {
426
310
  const buyValue = amount + FLAT_FEE;
427
311
  return v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, v2Path, buyer.address, deadline, { value: buyValue });
428
312
  }));
429
- const sellUnsignedArray = await Promise.all(sellAmountsWei.map(amount => v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, reversePath, seller.address, deadline)));
313
+ const sellUnsignedArray = await Promise.all(sellAmountsWei.map((amount) => v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, reversePath, seller.address, deadline)));
430
314
  return { buyUnsignedArray, sellUnsignedArray };
431
315
  }
432
316
  else {
433
317
  // ✅ ERC20 池子(如 USDT):使用 swapExactTokensForTokens
434
- const buyUnsignedArray = await Promise.all(buyAmountsWei.map(amount => v2RouterBuyer.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, v2Path, buyer.address, deadline)));
435
- const sellUnsignedArray = await Promise.all(sellAmountsWei.map(amount => v2RouterSeller.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, reversePath, seller.address, deadline)));
318
+ const buyUnsignedArray = await Promise.all(buyAmountsWei.map((amount) => v2RouterBuyer.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, v2Path, buyer.address, deadline)));
319
+ const sellUnsignedArray = await Promise.all(sellAmountsWei.map((amount) => v2RouterSeller.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(amount, 0n, reversePath, seller.address, deadline)));
436
320
  return { buyUnsignedArray, sellUnsignedArray };
437
321
  }
438
322
  }
@@ -442,32 +326,36 @@ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmo
442
326
  const v3RouterBuyer = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, buyer);
443
327
  const v3RouterSeller = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, seller);
444
328
  // 构建多笔买入交易(ERC20 模式 value = 0,因为通过代币授权支付)
445
- const buyUnsignedArray = await Promise.all(buyAmountsWei.map(amount => {
329
+ const buyUnsignedArray = await Promise.all(buyAmountsWei.map((amount) => {
446
330
  const buyValue = useNativeToken ? amount + FLAT_FEE : 0n;
447
- const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [{
331
+ const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
332
+ {
448
333
  tokenIn: v3TokenIn,
449
334
  tokenOut: v3TokenOut,
450
335
  fee: v3Fee,
451
336
  recipient: buyer.address,
452
337
  amountIn: amount,
453
338
  amountOutMinimum: 0n,
454
- sqrtPriceLimitX96: 0n
455
- }]);
339
+ sqrtPriceLimitX96: 0n,
340
+ },
341
+ ]);
456
342
  return v3RouterBuyer.multicall.populateTransaction(deadline, [buySwapData], { value: buyValue });
457
343
  }));
458
344
  // ✅ 根据是否使用原生代币构建不同的卖出交易
459
345
  if (useNativeToken) {
460
346
  // BNB 池子:卖出后 unwrap WBNB 为 BNB
461
- const sellUnsignedArray = await Promise.all(sellAmountsWei.map(amount => {
462
- const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [{
347
+ const sellUnsignedArray = await Promise.all(sellAmountsWei.map((amount) => {
348
+ const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
349
+ {
463
350
  tokenIn: v3TokenOut,
464
351
  tokenOut: v3TokenIn,
465
352
  fee: v3Fee,
466
353
  recipient: PANCAKE_V3_ROUTER_ADDRESS,
467
354
  amountIn: amount,
468
355
  amountOutMinimum: 0n,
469
- sqrtPriceLimitX96: 0n
470
- }]);
356
+ sqrtPriceLimitX96: 0n,
357
+ },
358
+ ]);
471
359
  const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
472
360
  return v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
473
361
  }));
@@ -475,16 +363,18 @@ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmo
475
363
  }
476
364
  else {
477
365
  // ✅ ERC20 池子:卖出后直接获得 ERC20
478
- const sellUnsignedArray = await Promise.all(sellAmountsWei.map(amount => {
479
- const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [{
366
+ const sellUnsignedArray = await Promise.all(sellAmountsWei.map((amount) => {
367
+ const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
368
+ {
480
369
  tokenIn: v3TokenOut,
481
370
  tokenOut: v3TokenIn,
482
371
  fee: v3Fee,
483
372
  recipient: seller.address, // 直接发送到卖方地址
484
373
  amountIn: amount,
485
374
  amountOutMinimum: 0n,
486
- sqrtPriceLimitX96: 0n
487
- }]);
375
+ sqrtPriceLimitX96: 0n,
376
+ },
377
+ ]);
488
378
  return v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData]);
489
379
  }));
490
380
  return { buyUnsignedArray, sellUnsignedArray };
@@ -496,7 +386,7 @@ async function buildMultiRouteTransactions({ routeParams, buyAmountsWei, sellAmo
496
386
  * ✅ 规划多笔交易 nonce(与 Flap 一致)
497
387
  * 交易顺序:贿赂 → 买入(多笔) → 卖出(多笔) → 利润
498
388
  */
499
- async function planMultiNonces({ buyer, seller, buyCount, sellCount, sameAddress, extractProfit, needBribeTx, nonceManager }) {
389
+ async function planMultiNonces({ buyer, seller, buyCount, sellCount, sameAddress, extractProfit, needBribeTx, nonceManager, }) {
500
390
  const profitNonceCount = extractProfit ? 1 : 0;
501
391
  if (sameAddress) {
502
392
  // 同一地址:贿赂(可选) + 买入(多笔) + 卖出(多笔) + 利润(可选)
@@ -508,8 +398,7 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, sameAddress
508
398
  const buyerNonces = nonces.slice(idx, idx + buyCount);
509
399
  idx += buyCount;
510
400
  const sellerNonces = nonces.slice(idx, idx + sellCount);
511
- idx += sellCount;
512
- const profitNonce = extractProfit ? nonces[idx] : undefined;
401
+ const profitNonce = extractProfit ? nonces[idx + sellCount] : undefined;
513
402
  return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
514
403
  }
515
404
  // 不同地址
@@ -519,19 +408,18 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, sameAddress
519
408
  const sellerTxCount = bribeTxCount + sellCount + profitNonceCount;
520
409
  const [buyerNonces, sellerNoncesAll] = await Promise.all([
521
410
  nonceManager.getNextNonceBatch(buyer, buyCount),
522
- nonceManager.getNextNonceBatch(seller, sellerTxCount)
411
+ nonceManager.getNextNonceBatch(seller, sellerTxCount),
523
412
  ]);
524
413
  let idx = 0;
525
414
  const bribeNonce = needBribeTx ? sellerNoncesAll[idx++] : undefined;
526
415
  const sellerNonces = sellerNoncesAll.slice(idx, idx + sellCount);
527
- idx += sellCount;
528
- const profitNonce = extractProfit ? sellerNoncesAll[idx] : undefined;
416
+ const profitNonce = extractProfit ? sellerNoncesAll[idx + sellCount] : undefined;
529
417
  return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
530
418
  }
531
419
  /**
532
420
  * 构建利润多跳转账交易(强制 2 跳中转)
533
421
  */
534
- async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType }) {
422
+ async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType, }) {
535
423
  if (profitNonce === undefined || profitAmount === 0n) {
536
424
  return null;
537
425
  }
@@ -539,16 +427,16 @@ async function buildProfitTransaction({ provider, seller, profitAmount, profitNo
539
427
  provider,
540
428
  payerWallet: seller,
541
429
  profitAmount,
542
- profitRecipient: PROFIT_CONFIG.RECIPIENT,
430
+ profitRecipient: getProfitRecipient(),
543
431
  hopCount: PROFIT_HOP_COUNT,
544
432
  gasPrice,
545
433
  chainId,
546
434
  txType,
547
- startNonce: profitNonce
435
+ startNonce: profitNonce,
548
436
  });
549
437
  return { signedTransactions: profitHopResult.signedTransactions, hopWallets: profitHopResult.hopWallets };
550
438
  }
551
- async function validateFinalBalances({ sameAddress, buyerFundsWei, buyerBalance, reserveGas, gasLimit, gasPrice, useNativeToken = true, quoteTokenDecimals = 18, provider, buyerAddress }) {
439
+ async function validateFinalBalances({ sameAddress, buyerFundsWei, buyerBalance, reserveGas, gasLimit, gasPrice, useNativeToken = true, quoteTokenDecimals = 18, provider, buyerAddress, }) {
552
440
  const gasCost = gasLimit * gasPrice;
553
441
  if (sameAddress) {
554
442
  // 同一地址:需要足够的余额支付两笔交易
@@ -592,7 +480,7 @@ async function validateFinalBalances({ sameAddress, buyerFundsWei, buyerBalance,
592
480
  * - ✅ 优化:最大化并行操作
593
481
  */
594
482
  async function pancakeBundleBuyFirstMultiWallet(params) {
595
- const { buyerPrivateKeys, sellerPrivateKeys, routeParams, buyerFunds, config, quoteToken, quoteTokenDecimals = 18, taxRateBps = 0 // ✅ 税率(基点)
483
+ const { buyerPrivateKeys, sellerPrivateKeys, routeParams, buyerFunds, config, quoteToken, quoteTokenDecimals = 18, taxRateBps = 0, // ✅ 税率(基点)
596
484
  } = params;
597
485
  const buyCount = buyerPrivateKeys.length;
598
486
  const sellCount = sellerPrivateKeys.length;
@@ -610,8 +498,8 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
610
498
  const context = createPancakeContext(config);
611
499
  const nonceManager = new NonceManager(context.provider);
612
500
  // 创建所有钱包实例
613
- const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, context.provider));
614
- const sellers = sellerPrivateKeys.map(pk => new Wallet(pk, context.provider));
501
+ const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
502
+ const sellers = sellerPrivateKeys.map((pk) => new Wallet(pk, context.provider));
615
503
  // 使用第一个卖方作为主卖方(支付贿赂和利润)
616
504
  const mainSeller = sellers[0];
617
505
  // ✅ 计算总交易金额
@@ -630,16 +518,14 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
630
518
  const finalGasLimit = getGasLimit(config);
631
519
  const txType = config.txType ?? 0;
632
520
  const deadline = BigInt(getDeadline());
633
- const bribeAmount = config.bribeAmount && config.bribeAmount > 0
634
- ? ethers.parseEther(String(config.bribeAmount))
635
- : 0n;
521
+ const bribeAmount = config.bribeAmount && config.bribeAmount > 0 ? ethers.parseEther(String(config.bribeAmount)) : 0n;
636
522
  const needBribeTx = bribeAmount > 0n;
637
523
  // ✅ 第一批并行:报价 + Gas价格 + 所有钱包 nonces
638
524
  // 预先计算所有唯一钱包地址(去重)
639
525
  const allWallets = [...sellers, ...buyers];
640
526
  const uniqueWallets = allWallets.filter((w, i) => {
641
527
  const addr = w.address.toLowerCase();
642
- const firstIdx = allWallets.findIndex(x => x.address.toLowerCase() === addr);
528
+ const firstIdx = allWallets.findIndex((x) => x.address.toLowerCase() === addr);
643
529
  return firstIdx === i;
644
530
  });
645
531
  const [quoteResult, gasPrice, noncesArray] = await Promise.all([
@@ -647,10 +533,10 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
647
533
  routeParams,
648
534
  buyerFundsWei: totalFundsWei,
649
535
  provider: context.provider,
650
- v2RouterOverride: config.v2RouterAddress
536
+ v2RouterOverride: config.v2RouterAddress,
651
537
  }),
652
538
  getGasPrice(context.provider, config),
653
- nonceManager.getNextNoncesForWallets(uniqueWallets)
539
+ nonceManager.getNextNoncesForWallets(uniqueWallets),
654
540
  ]);
655
541
  // 构建 nonces Map
656
542
  const noncesMap = new Map();
@@ -692,19 +578,19 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
692
578
  gasPrice,
693
579
  gasLimit: GAS_LIMITS.BRIBE,
694
580
  chainId: context.chainId,
695
- type: txType
581
+ type: txType,
696
582
  });
697
583
  }
698
584
  // 2. 预分配所有 nonces(同步操作,避免竞态)
699
585
  const buyerNonces = [];
700
586
  const sellerNonces = [];
701
- buyers.forEach(buyer => {
587
+ buyers.forEach((buyer) => {
702
588
  const addr = buyer.address.toLowerCase();
703
589
  const nonce = noncesMap.get(addr);
704
590
  buyerNonces.push(nonce);
705
591
  noncesMap.set(addr, nonce + 1);
706
592
  });
707
- sellers.forEach(seller => {
593
+ sellers.forEach((seller) => {
708
594
  const addr = seller.address.toLowerCase();
709
595
  const nonce = noncesMap.get(addr);
710
596
  sellerNonces.push(nonce);
@@ -718,7 +604,7 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
718
604
  buyer,
719
605
  useNativeToken,
720
606
  deadline,
721
- v2RouterAddress: config.v2RouterAddress
607
+ v2RouterAddress: config.v2RouterAddress,
722
608
  });
723
609
  return buyer.signTransaction({
724
610
  ...unsigned,
@@ -727,7 +613,7 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
727
613
  gasLimit: finalGasLimit,
728
614
  gasPrice,
729
615
  chainId: context.chainId,
730
- type: txType
616
+ type: txType,
731
617
  });
732
618
  });
733
619
  // 4. 并行构建所有卖出交易
@@ -738,7 +624,7 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
738
624
  seller,
739
625
  useNativeToken,
740
626
  deadline,
741
- v2RouterAddress: config.v2RouterAddress
627
+ v2RouterAddress: config.v2RouterAddress,
742
628
  });
743
629
  return seller.signTransaction({
744
630
  ...unsigned,
@@ -747,14 +633,14 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
747
633
  gasLimit: finalGasLimit,
748
634
  gasPrice,
749
635
  chainId: context.chainId,
750
- type: txType
636
+ type: txType,
751
637
  });
752
638
  });
753
639
  // ✅ 并行签名所有交易(贿赂 + 买入 + 卖出)
754
640
  const [bribeTx, signedBuys, signedSells] = await Promise.all([
755
641
  bribeTxPromise,
756
642
  Promise.all(buyTxPromises),
757
- Promise.all(sellTxPromises)
643
+ Promise.all(sellTxPromises),
758
644
  ]);
759
645
  // 组装交易顺序:贿赂 → 买入 → 卖出
760
646
  if (bribeTx)
@@ -772,7 +658,7 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
772
658
  profitNonce,
773
659
  gasPrice,
774
660
  chainId: context.chainId,
775
- txType
661
+ txType,
776
662
  });
777
663
  if (profitResult) {
778
664
  allTransactions.push(...profitResult.signedTransactions);
@@ -784,8 +670,8 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
784
670
  signedTransactions: allTransactions,
785
671
  profitHopWallets,
786
672
  metadata: {
787
- buyerAddress: buyers.map(b => b.address).join(','),
788
- sellerAddress: sellers.map(s => s.address).join(','),
673
+ buyerAddress: buyers.map((b) => b.address).join(','),
674
+ sellerAddress: sellers.map((s) => s.address).join(','),
789
675
  buyAmount: useNativeToken
790
676
  ? ethers.formatEther(totalFundsWei)
791
677
  : ethers.formatUnits(totalFundsWei, quoteTokenDecimals),
@@ -793,15 +679,13 @@ async function pancakeBundleBuyFirstMultiWallet(params) {
793
679
  profitAmount: profitAmount > 0n ? ethers.formatEther(profitAmount) : undefined,
794
680
  buyCount,
795
681
  sellCount,
796
- buyAmounts: buyAmountsWei.map(amt => useNativeToken
797
- ? ethers.formatEther(amt)
798
- : ethers.formatUnits(amt, quoteTokenDecimals)),
799
- sellAmounts: sellAmountsWei.map(amt => amt.toString())
800
- }
682
+ buyAmounts: buyAmountsWei.map((amt) => useNativeToken ? ethers.formatEther(amt) : ethers.formatUnits(amt, quoteTokenDecimals)),
683
+ sellAmounts: sellAmountsWei.map((amt) => amt.toString()),
684
+ },
801
685
  };
802
686
  }
803
687
  // ✅ 构建单笔买入交易
804
- async function buildSingleBuyTx({ routeParams, buyAmount, buyer, useNativeToken, deadline, v2RouterAddress }) {
688
+ async function buildSingleBuyTx({ routeParams, buyAmount, buyer, useNativeToken, deadline, v2RouterAddress, }) {
805
689
  if (routeParams.routeType === 'v2') {
806
690
  const { v2Path } = routeParams;
807
691
  const v2Router = new Contract(v2RouterAddress || PANCAKE_V2_ROUTER_ADDRESS, PANCAKE_V2_ROUTER_ABI, buyer);
@@ -817,21 +701,23 @@ async function buildSingleBuyTx({ routeParams, buyAmount, buyer, useNativeToken,
817
701
  const v3RouterIface = new ethers.Interface(PANCAKE_V3_ROUTER_ABI);
818
702
  const v3Router = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, buyer);
819
703
  const buyValue = useNativeToken ? buyAmount : 0n;
820
- const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [{
704
+ const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
705
+ {
821
706
  tokenIn: v3TokenIn,
822
707
  tokenOut: v3TokenOut,
823
708
  fee: v3Fee,
824
709
  recipient: buyer.address,
825
710
  amountIn: buyAmount,
826
711
  amountOutMinimum: 0n,
827
- sqrtPriceLimitX96: 0n
828
- }]);
712
+ sqrtPriceLimitX96: 0n,
713
+ },
714
+ ]);
829
715
  return await v3Router.multicall.populateTransaction(deadline, [buySwapData], { value: buyValue });
830
716
  }
831
717
  throw new Error('V3 多跳路由暂不支持');
832
718
  }
833
719
  // ✅ 构建单笔卖出交易
834
- async function buildSingleSellTx({ routeParams, sellAmount, seller, useNativeToken, deadline, v2RouterAddress }) {
720
+ async function buildSingleSellTx({ routeParams, sellAmount, seller, useNativeToken, deadline, v2RouterAddress, }) {
835
721
  if (routeParams.routeType === 'v2') {
836
722
  const { v2Path } = routeParams;
837
723
  const reversePath = [...v2Path].reverse();
@@ -848,28 +734,32 @@ async function buildSingleSellTx({ routeParams, sellAmount, seller, useNativeTok
848
734
  const v3RouterIface = new ethers.Interface(PANCAKE_V3_ROUTER_ABI);
849
735
  const v3Router = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, seller);
850
736
  if (useNativeToken) {
851
- const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [{
737
+ const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
738
+ {
852
739
  tokenIn: v3TokenOut,
853
740
  tokenOut: v3TokenIn,
854
741
  fee: v3Fee,
855
742
  recipient: PANCAKE_V3_ROUTER_ADDRESS,
856
743
  amountIn: sellAmount,
857
744
  amountOutMinimum: 0n,
858
- sqrtPriceLimitX96: 0n
859
- }]);
745
+ sqrtPriceLimitX96: 0n,
746
+ },
747
+ ]);
860
748
  const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
861
749
  return await v3Router.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
862
750
  }
863
751
  else {
864
- const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [{
752
+ const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
753
+ {
865
754
  tokenIn: v3TokenOut,
866
755
  tokenOut: v3TokenIn,
867
756
  fee: v3Fee,
868
757
  recipient: seller.address,
869
758
  amountIn: sellAmount,
870
759
  amountOutMinimum: 0n,
871
- sqrtPriceLimitX96: 0n
872
- }]);
760
+ sqrtPriceLimitX96: 0n,
761
+ },
762
+ ]);
873
763
  return await v3Router.multicall.populateTransaction(deadline, [sellSwapData]);
874
764
  }
875
765
  }