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,687 +1 @@
1
- /**
2
- * PancakeSwap 官方 Router 交易模块
3
- *
4
- * ✅ 使用官方 PancakeSwap V2/V3 Router(非代理合约)
5
- * - V2 Router: 0x10ED43C718714eb63d5aA57B78B54704E256024E
6
- * - V3 Router: 0x13f4EA83D0bd40E75C8222255bc855a974568Dd4
7
- * - V3 Quoter: 0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997
8
- */
9
- import { ethers, Wallet, JsonRpcProvider, Contract, Interface } from 'ethers';
10
- import { NonceManager, getOptimizedGasPrice, getDeadline, encodeV3Path, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../utils/bundle-helpers.js';
11
- import { ADDRESSES, BLOCKRAZOR_BUILDER_EOA } from '../../utils/constants.js';
12
- import { MULTICALL3_ABI, V2_ROUTER_ABI, V3_ROUTER02_ABI, V3_QUOTER_ABI, ERC20_ABI } from '../../shared/abis/common.js';
13
- import { getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, calculateBatchProfit, getProfitRecipient, getBribeAmount } from './config.js';
14
- // ==================== 常量 ====================
15
- const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
16
- const WBNB_ADDRESS = ADDRESSES.BSC.WBNB;
17
- const DEFAULT_GAS_LIMIT = 800000;
18
- // ✅ PancakeSwap 官方合约地址
19
- const PANCAKE_V2_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV2Router;
20
- const PANCAKE_V3_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV3Router;
21
- const PANCAKE_V3_QUOTER_ADDRESS = ADDRESSES.BSC.PancakeV3Quoter;
22
- // ==================== ABI 别名(从公共模块导入)====================
23
- // ✅ 使用公共 ABI:V2_ROUTER_ABI, V3_ROUTER02_ABI (as V3_ROUTER_ABI), V3_QUOTER_ABI, ERC20_ABI, MULTICALL3_ABI
24
- const V3_ROUTER_ABI = V3_ROUTER02_ABI;
25
- // ==================== 辅助函数 ====================
26
- /**
27
- * 获取 Gas Limit
28
- */
29
- function getGasLimit(config, defaultGas = DEFAULT_GAS_LIMIT) {
30
- if (config.gasLimit !== undefined) {
31
- return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
32
- }
33
- const multiplier = config.gasLimitMultiplier ?? 1.0;
34
- const calculatedGas = Math.ceil(defaultGas * multiplier);
35
- return BigInt(calculatedGas);
36
- }
37
- /**
38
- * 查询代币 decimals
39
- */
40
- async function getTokenDecimals(tokenAddress, provider) {
41
- try {
42
- const token = new Contract(tokenAddress, ERC20_ABI, provider);
43
- const decimals = await token.decimals();
44
- return Number(decimals);
45
- }
46
- catch {
47
- return 18;
48
- }
49
- }
50
- /**
51
- * 判断是否需要发送 BNB
52
- */
53
- function needSendBNB(routeType, params) {
54
- if (routeType === 'v2' && params.v2Path && params.v2Path[0].toLowerCase() === WBNB_ADDRESS.toLowerCase()) {
55
- return true;
56
- }
57
- if (routeType === 'v3-single' && params.v3TokenIn && params.v3TokenIn.toLowerCase() === WBNB_ADDRESS.toLowerCase()) {
58
- return true;
59
- }
60
- if (routeType === 'v3-multi' && params.v3ExactTokenIn && params.v3ExactTokenIn.toLowerCase() === WBNB_ADDRESS.toLowerCase()) {
61
- return true;
62
- }
63
- return false;
64
- }
65
- // ✅ getDeadline 从 bundle-helpers.js 导入
66
- /**
67
- * ✅ 构建 V2 交易(使用官方 Router)
68
- */
69
- async function buildV2Transactions(routers, wallets, amountsWei, minOuts, path, isBuy, needBNB) {
70
- const deadline = getDeadline();
71
- return Promise.all(routers.map(async (router, i) => {
72
- if (isBuy && needBNB) {
73
- // ✅ 买入:BNB → Token,使用 swapExactETHForTokensSupportingFeeOnTransferTokens
74
- return router.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(minOuts[i], // amountOutMin
75
- path, // path
76
- wallets[i].address, // to
77
- deadline, // deadline
78
- { value: amountsWei[i] } // 发送的 BNB
79
- );
80
- }
81
- else {
82
- // ✅ 卖出:Token → BNB,使用 swapExactTokensForETHSupportingFeeOnTransferTokens
83
- return router.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(amountsWei[i], // amountIn
84
- minOuts[i], // amountOutMin
85
- path, // path
86
- wallets[i].address, // to
87
- deadline // deadline
88
- );
89
- }
90
- }));
91
- }
92
- /**
93
- * ✅ 构建 V3 单跳交易(使用官方 SwapRouter02 + multicall)
94
- */
95
- async function buildV3SingleTransactions(routers, wallets, tokenIn, tokenOut, fee, amountsWei, minOuts, isBuy, needBNB) {
96
- const deadline = getDeadline();
97
- const v3RouterIface = new Interface(V3_ROUTER_ABI);
98
- return Promise.all(routers.map(async (router, i) => {
99
- const isTokenOutWBNB = tokenOut.toLowerCase() === WBNB_ADDRESS.toLowerCase();
100
- // ✅ 构建 exactInputSingle calldata
101
- const exactInputSingleData = v3RouterIface.encodeFunctionData('exactInputSingle', [{
102
- tokenIn: tokenIn,
103
- tokenOut: tokenOut,
104
- fee: fee,
105
- recipient: isTokenOutWBNB ? PANCAKE_V3_ROUTER_ADDRESS : wallets[i].address, // 如果输出是 WBNB,先发给 Router
106
- amountIn: amountsWei[i],
107
- amountOutMinimum: minOuts[i],
108
- sqrtPriceLimitX96: 0n
109
- }]);
110
- if (isBuy && needBNB) {
111
- // ✅ 买入:BNB → Token,只需要 exactInputSingle
112
- // 通过 multicall 包装,传入 deadline 和 ETH value
113
- return router.multicall.populateTransaction(deadline, [exactInputSingleData], { value: amountsWei[i] });
114
- }
115
- else if (!isBuy && isTokenOutWBNB) {
116
- // ✅ 卖出:Token → WBNB → BNB,需要 exactInputSingle + unwrapWETH9
117
- const unwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [
118
- minOuts[i], // amountMinimum
119
- wallets[i].address // recipient
120
- ]);
121
- return router.multicall.populateTransaction(deadline, [exactInputSingleData, unwrapData]);
122
- }
123
- else {
124
- // ✅ Token → Token,只需要 exactInputSingle
125
- return router.multicall.populateTransaction(deadline, [exactInputSingleData]);
126
- }
127
- }));
128
- }
129
- /**
130
- * ✅ 构建 V3 多跳交易(使用官方 SwapRouter02 的 exactInput)
131
- *
132
- * @param routers - V3 Router 合约数组
133
- * @param wallets - 钱包数组
134
- * @param tokens - 代币路径 [tokenIn, tokenMid1, ..., tokenOut]
135
- * @param fees - 费率路径 [fee0, fee1, ...]
136
- * @param amountsWei - 每个钱包的输入金额
137
- * @param minOuts - 最小输出金额
138
- * @param isBuy - 是否为买入操作
139
- * @param needBNB - 是否需要发送 BNB
140
- */
141
- async function buildV3MultiHopTransactions(routers, wallets, tokens, fees, amountsWei, minOuts, isBuy, needBNB) {
142
- if (!tokens || tokens.length < 2) {
143
- throw new Error('V3 多跳需要至少 2 个代币(v3Tokens)');
144
- }
145
- if (!fees || fees.length !== tokens.length - 1) {
146
- throw new Error(`V3 多跳费率数量 (${fees?.length || 0}) 必须等于代币数量 - 1 (${tokens.length - 1})(v3Fees)`);
147
- }
148
- const deadline = getDeadline();
149
- const v3RouterIface = new Interface(V3_ROUTER_ABI);
150
- // 编码正向 path(用于买入:BNB → Token)
151
- const forwardPath = encodeV3Path(tokens, fees);
152
- // 编码反向 path(用于卖出:Token → BNB)
153
- const reversedTokens = [...tokens].reverse();
154
- const reversedFees = [...fees].reverse();
155
- const reversePath = encodeV3Path(reversedTokens, reversedFees);
156
- const tokenOut = tokens[tokens.length - 1];
157
- const isTokenOutWBNB = tokenOut.toLowerCase() === WBNB_ADDRESS.toLowerCase();
158
- return Promise.all(routers.map(async (router, i) => {
159
- if (isBuy && needBNB) {
160
- // ✅ 买入:BNB → ... → Token
161
- const swapData = v3RouterIface.encodeFunctionData('exactInput', [{
162
- path: forwardPath,
163
- recipient: wallets[i].address,
164
- amountIn: amountsWei[i],
165
- amountOutMinimum: minOuts[i]
166
- }]);
167
- return router.multicall.populateTransaction(deadline, [swapData], { value: amountsWei[i] });
168
- }
169
- else if (!isBuy) {
170
- // ✅ 卖出:Token → ... → BNB
171
- const swapData = v3RouterIface.encodeFunctionData('exactInput', [{
172
- path: reversePath,
173
- recipient: isTokenOutWBNB ? PANCAKE_V3_ROUTER_ADDRESS : wallets[i].address,
174
- amountIn: amountsWei[i],
175
- amountOutMinimum: minOuts[i]
176
- }]);
177
- if (isTokenOutWBNB) {
178
- // 需要 unwrapWETH9
179
- const unwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [
180
- minOuts[i],
181
- wallets[i].address
182
- ]);
183
- return router.multicall.populateTransaction(deadline, [swapData, unwrapData]);
184
- }
185
- return router.multicall.populateTransaction(deadline, [swapData]);
186
- }
187
- else {
188
- // Token → Token(不需要 BNB)
189
- const swapData = v3RouterIface.encodeFunctionData('exactInput', [{
190
- path: forwardPath,
191
- recipient: wallets[i].address,
192
- amountIn: amountsWei[i],
193
- amountOutMinimum: minOuts[i]
194
- }]);
195
- return router.multicall.populateTransaction(deadline, [swapData]);
196
- }
197
- }));
198
- }
199
- /**
200
- * ✅ 使用 Multicall3 批量获取 V2 报价
201
- */
202
- async function batchGetV2Quotes(provider, amountsWei, v2Path) {
203
- if (amountsWei.length === 0)
204
- return [];
205
- if (amountsWei.length === 1) {
206
- try {
207
- const v2Router = new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, provider);
208
- const amounts = await v2Router.getAmountsOut(amountsWei[0], v2Path);
209
- return [amounts[amounts.length - 1]];
210
- }
211
- catch {
212
- return [0n];
213
- }
214
- }
215
- try {
216
- const v2RouterIface = new Interface(V2_ROUTER_ABI);
217
- const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
218
- const calls = amountsWei.map(amount => ({
219
- target: PANCAKE_V2_ROUTER_ADDRESS,
220
- allowFailure: true,
221
- callData: v2RouterIface.encodeFunctionData('getAmountsOut', [amount, v2Path])
222
- }));
223
- const results = await multicall.aggregate3.staticCall(calls);
224
- return results.map((r) => {
225
- if (r.success && r.returnData && r.returnData !== '0x') {
226
- try {
227
- const decoded = v2RouterIface.decodeFunctionResult('getAmountsOut', r.returnData);
228
- const amounts = decoded[0];
229
- return amounts[amounts.length - 1];
230
- }
231
- catch {
232
- return 0n;
233
- }
234
- }
235
- return 0n;
236
- });
237
- }
238
- catch {
239
- return await Promise.all(amountsWei.map(async (amount) => {
240
- try {
241
- const v2Router = new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, provider);
242
- const amounts = await v2Router.getAmountsOut(amount, v2Path);
243
- return amounts[amounts.length - 1];
244
- }
245
- catch {
246
- return 0n;
247
- }
248
- }));
249
- }
250
- }
251
- /**
252
- * 根据 routeType 获取授权目标地址
253
- */
254
- function getApprovalTarget(routeType) {
255
- if (routeType === 'v2') {
256
- return PANCAKE_V2_ROUTER_ADDRESS;
257
- }
258
- // V3 路由授权给 V3 Router
259
- return PANCAKE_V3_ROUTER_ADDRESS;
260
- }
261
- // ==================== 主要导出函数 ====================
262
- /**
263
- * ✅ 授权代币给 PancakeSwap Router(根据 routeType 选择 V2/V3)
264
- */
265
- export async function approveFourPancakeProxy(params) {
266
- const { privateKey, tokenAddress, amount, rpcUrl, routeType } = params;
267
- // 根据 routeType 选择授权目标
268
- const approvalTarget = getApprovalTarget(routeType || 'v2');
269
- const provider = new JsonRpcProvider(rpcUrl);
270
- const wallet = new Wallet(privateKey, provider);
271
- const token = new Contract(tokenAddress, ERC20_ABI, wallet);
272
- const decimals = await getTokenDecimals(tokenAddress, provider);
273
- const currentAllowance = await token.allowance(wallet.address, approvalTarget);
274
- const amountBigInt = amount === 'max' ? ethers.MaxUint256 : ethers.parseUnits(amount, decimals);
275
- if (currentAllowance >= amountBigInt) {
276
- return { txHash: '', approved: true };
277
- }
278
- const tx = await token.approve(approvalTarget, amountBigInt);
279
- const receipt = await tx.wait();
280
- return {
281
- txHash: receipt.hash,
282
- approved: receipt.status === 1
283
- };
284
- }
285
- /**
286
- * ✅ 批量授权代币给 PancakeSwap Router
287
- */
288
- export async function approveFourPancakeProxyBatch(params) {
289
- const { privateKeys, tokenAddress, amounts, config, routeType } = params;
290
- if (privateKeys.length === 0 || amounts.length !== privateKeys.length) {
291
- throw new Error('Private key count and amount count must match');
292
- }
293
- // 根据 routeType 选择授权目标
294
- const approvalTarget = getApprovalTarget(routeType || 'v2');
295
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
296
- chainId: 56,
297
- name: 'BSC'
298
- });
299
- const gasPrice = await getOptimizedGasPrice(provider, getGasPriceConfig(config));
300
- const decimals = await getTokenDecimals(tokenAddress, provider);
301
- const wallets = privateKeys.map(k => new Wallet(k, provider));
302
- const amountsBigInt = amounts.map(a => a === 'max' ? ethers.MaxUint256 : ethers.parseUnits(a, decimals));
303
- // 检查现有授权
304
- const tokens = wallets.map(w => new Contract(tokenAddress, ERC20_ABI, w));
305
- const allowances = await Promise.all(tokens.map((token, i) => token.allowance(wallets[i].address, approvalTarget)));
306
- // 只授权不足的
307
- const needApproval = wallets.filter((_, i) => allowances[i] < amountsBigInt[i]);
308
- const needApprovalAmounts = amountsBigInt.filter((amount, i) => allowances[i] < amount);
309
- if (needApproval.length === 0) {
310
- return {
311
- success: true,
312
- approvedCount: 0,
313
- signedTransactions: [],
314
- message: '所有钱包已授权'
315
- };
316
- }
317
- // 构建授权交易
318
- const needApprovalTokens = needApproval.map(w => new Contract(tokenAddress, ERC20_ABI, w));
319
- const unsignedApprovals = await Promise.all(needApprovalTokens.map((token, i) => token.approve.populateTransaction(approvalTarget, needApprovalAmounts[i])));
320
- const finalGasLimit = getGasLimit(config);
321
- const nonceManager = new NonceManager(provider);
322
- const nonces = await Promise.all(needApproval.map(w => nonceManager.getNextNonce(w)));
323
- const txType = getTxType(config);
324
- const signedTxs = await Promise.all(unsignedApprovals.map((unsigned, i) => needApproval[i].signTransaction({
325
- ...unsigned,
326
- from: needApproval[i].address,
327
- nonce: nonces[i],
328
- gasLimit: finalGasLimit,
329
- gasPrice,
330
- chainId: 56,
331
- type: txType
332
- })));
333
- nonceManager.clearTemp();
334
- // 广播交易
335
- const txHashes = [];
336
- const errors = [];
337
- for (let i = 0; i < signedTxs.length; i++) {
338
- try {
339
- const tx = await provider.broadcastTransaction(signedTxs[i]);
340
- txHashes.push(tx.hash);
341
- }
342
- catch (error) {
343
- const msg = error instanceof Error ? error.message : String(error);
344
- errors.push(`钱包 ${i} 授权失败: ${msg}`);
345
- }
346
- }
347
- const successCount = txHashes.length;
348
- if (successCount > 0) {
349
- return {
350
- success: true,
351
- approvedCount: successCount,
352
- signedTransactions: signedTxs,
353
- txHashes,
354
- message: `授权成功,共 ${successCount} 个钱包${errors.length > 0 ? `,${errors.length} 个失败` : ''}`
355
- };
356
- }
357
- else {
358
- return {
359
- success: false,
360
- approvedCount: 0,
361
- signedTransactions: signedTxs,
362
- txHashes: [],
363
- message: `授权失败: ${errors.join('; ')}`
364
- };
365
- }
366
- }
367
- /**
368
- * ✅ 使用 PancakeSwap 官方 Router 批量购买代币
369
- */
370
- export async function fourPancakeProxyBatchBuyMerkle(params) {
371
- const { privateKeys, buyAmounts, tokenAddress, routeType, config } = params;
372
- if (privateKeys.length === 0 || buyAmounts.length !== privateKeys.length) {
373
- throw new Error('Private key count and buy amount count must match');
374
- }
375
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
376
- chainId: 56,
377
- name: 'BSC'
378
- });
379
- const txType = getTxType(config);
380
- const buyers = privateKeys.map(k => new Wallet(k, provider));
381
- const originalAmountsWei = buyAmounts.map(a => ethers.parseEther(a));
382
- const extractProfit = shouldExtractProfit(config);
383
- const { totalProfit, remainingAmounts } = calculateBatchProfit(originalAmountsWei, config);
384
- const actualAmountsWei = remainingAmounts;
385
- const finalGasLimit = getGasLimit(config);
386
- const nonceManager = new NonceManager(provider);
387
- const bribeAmount = getBribeAmount(config);
388
- const needBribeTx = bribeAmount > 0n;
389
- const [gasPrice, tokenDecimals] = await Promise.all([
390
- getOptimizedGasPrice(provider, getGasPriceConfig(config)),
391
- getTokenDecimals(tokenAddress, provider)
392
- ]);
393
- // 计算 nonce 分配
394
- const needProfitTx = extractProfit && totalProfit > 0n;
395
- let buyer0NeedCount = 1;
396
- if (needBribeTx)
397
- buyer0NeedCount++;
398
- if (needProfitTx)
399
- buyer0NeedCount++;
400
- const buyer0Nonces = await nonceManager.getNextNonceBatch(buyers[0], buyer0NeedCount);
401
- let otherNonces = [];
402
- if (buyers.length > 1) {
403
- otherNonces = await nonceManager.getNextNoncesForWallets(buyers.slice(1));
404
- }
405
- let buyer0NonceIdx = 0;
406
- const bribeNonce = needBribeTx ? buyer0Nonces[buyer0NonceIdx++] : undefined;
407
- const buyer0BuyNonce = buyer0Nonces[buyer0NonceIdx++];
408
- const profitNonce = needProfitTx ? buyer0Nonces[buyer0NonceIdx] : undefined;
409
- const nonces = [buyer0BuyNonce, ...otherNonces];
410
- // 计算 minOutputAmounts
411
- let minOuts;
412
- if (params.minOutputAmounts && params.minOutputAmounts.length === buyers.length) {
413
- minOuts = params.minOutputAmounts.map(m => typeof m === 'string' ? ethers.parseUnits(m, tokenDecimals) : m);
414
- }
415
- else {
416
- minOuts = new Array(buyers.length).fill(0n);
417
- }
418
- const needBNB = needSendBNB(routeType, params);
419
- // ✅ 使用官方 Router
420
- let routers;
421
- let unsignedBuys;
422
- if (routeType === 'v2') {
423
- if (!params.v2Path || params.v2Path.length < 2) {
424
- throw new Error('v2Path is required for V2 routing');
425
- }
426
- routers = buyers.map(w => new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, w));
427
- unsignedBuys = await buildV2Transactions(routers, buyers, actualAmountsWei, minOuts, params.v2Path, true, needBNB);
428
- }
429
- else if (routeType === 'v3-single') {
430
- if (!params.v3TokenIn || !params.v3Fee) {
431
- throw new Error('v3TokenIn and v3Fee are required for V3 single-hop');
432
- }
433
- routers = buyers.map(w => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
434
- unsignedBuys = await buildV3SingleTransactions(routers, buyers, params.v3TokenIn, tokenAddress, params.v3Fee, actualAmountsWei, minOuts, true, needBNB);
435
- }
436
- else if (routeType === 'v3-multi') {
437
- // ✅ V3 多跳:需要 v3Tokens 和 v3Fees 参数
438
- if (!params.v3Tokens || params.v3Tokens.length < 2) {
439
- throw new Error('v3Tokens(至少 2 个代币)是 V3 多跳必需的');
440
- }
441
- if (!params.v3Fees || params.v3Fees.length !== params.v3Tokens.length - 1) {
442
- throw new Error(`v3Fees 长度必须等于 v3Tokens 长度 - 1`);
443
- }
444
- routers = buyers.map(w => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
445
- unsignedBuys = await buildV3MultiHopTransactions(routers, buyers, params.v3Tokens, params.v3Fees, actualAmountsWei, minOuts, true, needBNB);
446
- }
447
- else {
448
- throw new Error(`Unsupported routeType: ${routeType}`);
449
- }
450
- // 签名交易
451
- const signPromises = [];
452
- // 贿赂交易
453
- if (needBribeTx && bribeNonce !== undefined) {
454
- signPromises.push(buyers[0].signTransaction({
455
- to: BLOCKRAZOR_BUILDER_EOA,
456
- value: bribeAmount,
457
- nonce: bribeNonce,
458
- gasPrice,
459
- gasLimit: 21000n,
460
- chainId: 56,
461
- type: txType
462
- }));
463
- }
464
- // 买入交易
465
- unsignedBuys.forEach((unsigned, i) => {
466
- signPromises.push(buyers[i].signTransaction({
467
- ...unsigned,
468
- from: buyers[i].address,
469
- nonce: nonces[i],
470
- gasLimit: finalGasLimit,
471
- gasPrice,
472
- chainId: 56,
473
- type: txType,
474
- value: unsigned.value
475
- }));
476
- });
477
- const signedTxs = await Promise.all(signPromises);
478
- // 利润多跳转账(强制 2 跳中转)
479
- let profitHopWallets;
480
- if (extractProfit && totalProfit > 0n && profitNonce !== undefined) {
481
- const profitHopResult = await buildProfitHopTransactions({
482
- provider,
483
- payerWallet: buyers[0],
484
- profitAmount: totalProfit,
485
- profitRecipient: getProfitRecipient(),
486
- hopCount: PROFIT_HOP_COUNT,
487
- gasPrice,
488
- chainId: 56,
489
- txType,
490
- startNonce: profitNonce
491
- });
492
- signedTxs.push(...profitHopResult.signedTransactions);
493
- profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
494
- }
495
- nonceManager.clearTemp();
496
- return {
497
- signedTransactions: signedTxs,
498
- profitHopWallets // ✅ 返回利润多跳钱包
499
- };
500
- }
501
- /**
502
- * ✅ 使用 PancakeSwap 官方 Router 批量卖出代币
503
- */
504
- export async function fourPancakeProxyBatchSellMerkle(params) {
505
- const { privateKeys, sellAmounts, tokenAddress, routeType, config } = params;
506
- if (privateKeys.length === 0 || sellAmounts.length !== privateKeys.length) {
507
- throw new Error('Private key count and sell amount count must match');
508
- }
509
- const provider = new ethers.JsonRpcProvider(config.rpcUrl, {
510
- chainId: 56,
511
- name: 'BSC'
512
- });
513
- const txType = getTxType(config);
514
- const sellers = privateKeys.map(k => new Wallet(k, provider));
515
- const finalGasLimit = getGasLimit(config);
516
- const nonceManager = new NonceManager(provider);
517
- const extractProfit = shouldExtractProfit(config);
518
- const bribeAmount = getBribeAmount(config);
519
- const needBribeTx = bribeAmount > 0n;
520
- const [gasPrice, tokenDecimals] = await Promise.all([
521
- getOptimizedGasPrice(provider, getGasPriceConfig(config)),
522
- getTokenDecimals(tokenAddress, provider)
523
- ]);
524
- const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, tokenDecimals));
525
- // 获取报价
526
- let quotedOutputs;
527
- if (routeType === 'v2' && params.v2Path && params.v2Path.length >= 2) {
528
- quotedOutputs = await batchGetV2Quotes(provider, amountsWei, params.v2Path);
529
- }
530
- else if (routeType === 'v3-single') {
531
- quotedOutputs = await Promise.all(amountsWei.map(async (amount) => {
532
- try {
533
- const quoter = new Contract(PANCAKE_V3_QUOTER_ADDRESS, V3_QUOTER_ABI, provider);
534
- const result = await quoter.quoteExactInputSingle.staticCall({
535
- tokenIn: tokenAddress,
536
- tokenOut: params.v3TokenOut,
537
- amountIn: amount,
538
- fee: params.v3Fee,
539
- sqrtPriceLimitX96: 0
540
- });
541
- return result[0];
542
- }
543
- catch {
544
- return 0n;
545
- }
546
- }));
547
- }
548
- else if (routeType === 'v3-multi' && params.v2Path && params.v2Path.length >= 2) {
549
- quotedOutputs = await batchGetV2Quotes(provider, amountsWei, params.v2Path);
550
- }
551
- else {
552
- quotedOutputs = new Array(amountsWei.length).fill(0n);
553
- }
554
- const minOuts = new Array(sellers.length).fill(0n);
555
- // 计算利润
556
- let totalProfit = 0n;
557
- let maxRevenueIndex = 0;
558
- let maxRevenue = 0n;
559
- if (extractProfit && quotedOutputs.length > 0) {
560
- for (let i = 0; i < sellers.length; i++) {
561
- if (quotedOutputs[i] > 0n) {
562
- const { profit } = calculateProfit(quotedOutputs[i], config);
563
- totalProfit += profit;
564
- if (quotedOutputs[i] > maxRevenue) {
565
- maxRevenue = quotedOutputs[i];
566
- maxRevenueIndex = i;
567
- }
568
- }
569
- }
570
- }
571
- // 分配 nonces
572
- const needProfitTx = extractProfit && totalProfit > 0n && maxRevenue > 0n;
573
- let nonces;
574
- let bribeNonce;
575
- let profitNonce;
576
- if (needBribeTx || needProfitTx) {
577
- let maxRevenueNonceCount = 1;
578
- if (needBribeTx)
579
- maxRevenueNonceCount++;
580
- if (needProfitTx)
581
- maxRevenueNonceCount++;
582
- const maxRevenueNonces = await nonceManager.getNextNonceBatch(sellers[maxRevenueIndex], maxRevenueNonceCount);
583
- const otherSellers = sellers.filter((_, i) => i !== maxRevenueIndex);
584
- const otherNonces = otherSellers.length > 0
585
- ? await nonceManager.getNextNoncesForWallets(otherSellers)
586
- : [];
587
- let maxRevenueNonceIdx = 0;
588
- bribeNonce = needBribeTx ? maxRevenueNonces[maxRevenueNonceIdx++] : undefined;
589
- const maxRevenueSellNonce = maxRevenueNonces[maxRevenueNonceIdx++];
590
- profitNonce = needProfitTx ? maxRevenueNonces[maxRevenueNonceIdx] : undefined;
591
- nonces = [];
592
- let otherIdx = 0;
593
- for (let i = 0; i < sellers.length; i++) {
594
- if (i === maxRevenueIndex) {
595
- nonces.push(maxRevenueSellNonce);
596
- }
597
- else {
598
- nonces.push(otherNonces[otherIdx++]);
599
- }
600
- }
601
- }
602
- else {
603
- nonces = await nonceManager.getNextNoncesForWallets(sellers);
604
- }
605
- // ✅ 使用官方 Router 构建卖出交易
606
- const needBNB = false;
607
- let routers;
608
- let unsignedSells;
609
- if (routeType === 'v2') {
610
- if (!params.v2Path || params.v2Path.length < 2) {
611
- throw new Error('v2Path is required for V2 routing');
612
- }
613
- routers = sellers.map(w => new Contract(PANCAKE_V2_ROUTER_ADDRESS, V2_ROUTER_ABI, w));
614
- unsignedSells = await buildV2Transactions(routers, sellers, amountsWei, minOuts, params.v2Path, false, needBNB);
615
- }
616
- else if (routeType === 'v3-single') {
617
- if (!params.v3TokenOut || !params.v3Fee) {
618
- throw new Error('v3TokenOut and v3Fee are required for V3 single-hop');
619
- }
620
- routers = sellers.map(w => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
621
- unsignedSells = await buildV3SingleTransactions(routers, sellers, tokenAddress, params.v3TokenOut, params.v3Fee, amountsWei, minOuts, false, needBNB);
622
- }
623
- else if (routeType === 'v3-multi') {
624
- // ✅ V3 多跳:需要 v3Tokens 和 v3Fees 参数
625
- if (!params.v3Tokens || params.v3Tokens.length < 2) {
626
- throw new Error('v3Tokens(至少 2 个代币)是 V3 多跳必需的');
627
- }
628
- if (!params.v3Fees || params.v3Fees.length !== params.v3Tokens.length - 1) {
629
- throw new Error(`v3Fees 长度必须等于 v3Tokens 长度 - 1`);
630
- }
631
- routers = sellers.map(w => new Contract(PANCAKE_V3_ROUTER_ADDRESS, V3_ROUTER_ABI, w));
632
- unsignedSells = await buildV3MultiHopTransactions(routers, sellers, params.v3Tokens, params.v3Fees, amountsWei, minOuts, false, needBNB);
633
- }
634
- else {
635
- throw new Error(`Unsupported routeType: ${routeType}`);
636
- }
637
- // 签名交易
638
- const signPromises = [];
639
- // 贿赂交易
640
- if (needBribeTx && bribeNonce !== undefined) {
641
- signPromises.push(sellers[maxRevenueIndex].signTransaction({
642
- to: BLOCKRAZOR_BUILDER_EOA,
643
- value: bribeAmount,
644
- nonce: bribeNonce,
645
- gasPrice,
646
- gasLimit: 21000n,
647
- chainId: 56,
648
- type: txType
649
- }));
650
- }
651
- // 卖出交易
652
- unsignedSells.forEach((unsigned, i) => {
653
- signPromises.push(sellers[i].signTransaction({
654
- ...unsigned,
655
- from: sellers[i].address,
656
- nonce: nonces[i],
657
- gasLimit: finalGasLimit,
658
- gasPrice,
659
- chainId: 56,
660
- type: txType,
661
- value: unsigned.value
662
- }));
663
- });
664
- const signedTxs = await Promise.all(signPromises);
665
- // 利润多跳转账(强制 2 跳中转)
666
- let profitHopWallets;
667
- if (extractProfit && totalProfit > 0n && profitNonce !== undefined) {
668
- const profitHopResult = await buildProfitHopTransactions({
669
- provider,
670
- payerWallet: sellers[maxRevenueIndex],
671
- profitAmount: totalProfit,
672
- profitRecipient: getProfitRecipient(),
673
- hopCount: PROFIT_HOP_COUNT,
674
- gasPrice,
675
- chainId: 56,
676
- txType,
677
- startNonce: profitNonce
678
- });
679
- signedTxs.push(...profitHopResult.signedTransactions);
680
- profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
681
- }
682
- nonceManager.clearTemp();
683
- return {
684
- signedTransactions: signedTxs,
685
- profitHopWallets // ✅ 返回利润多跳钱包
686
- };
687
- }
1
+ export { fourPancakeProxyBatchBuyMerkle, fourPancakeProxyBatchSellMerkle, approveFourPancakeProxy, approveFourPancakeProxyBatch, } from '../../bundle-core/four-meme/pancake-proxy.js';