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