four-flap-meme-sdk 1.9.49 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. package/README.en.md +41 -6
  2. package/README.md +31 -0
  3. package/README.zh-CN.md +41 -6
  4. package/dist/abis/common.js +74 -68
  5. package/dist/abis/flap/vault.js +9 -7
  6. package/dist/abis/index.d.ts +3 -4
  7. package/dist/abis/index.js +3 -4
  8. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  9. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  10. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
  11. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  12. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
  13. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  14. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  15. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  16. package/dist/bundle-core/config-helpers.d.ts +36 -0
  17. package/dist/bundle-core/config-helpers.js +57 -0
  18. package/dist/bundle-core/errors.d.ts +50 -0
  19. package/dist/bundle-core/errors.js +34 -0
  20. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  21. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  22. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  23. package/dist/bundle-core/four-meme/core-helpers.js +40 -0
  24. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  25. package/dist/bundle-core/four-meme/core.js +515 -0
  26. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  27. package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
  28. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  29. package/dist/bundle-core/four-meme/private.js +465 -0
  30. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  31. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  32. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  33. package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
  34. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  35. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  36. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  37. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  38. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
  39. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  40. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  41. package/dist/bundle-core/four-meme/swap.js +505 -0
  42. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  43. package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
  44. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  45. package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
  46. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  47. package/dist/bundle-core/four-meme/types/index.js +1 -0
  48. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  49. package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
  50. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  51. package/dist/bundle-core/four-meme/types.js +1 -0
  52. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  53. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  54. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  55. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  56. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  57. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  58. package/dist/bundle-core/index.d.ts +8 -0
  59. package/dist/bundle-core/index.js +8 -0
  60. package/dist/bundle-core/internal.d.ts +21 -0
  61. package/dist/bundle-core/internal.js +182 -0
  62. package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
  63. package/dist/bundle-core/sign-context-helpers.js +67 -0
  64. package/dist/bundle-core/submit.d.ts +293 -0
  65. package/dist/bundle-core/submit.js +727 -0
  66. package/dist/bundle-core/types/index.d.ts +8 -0
  67. package/dist/bundle-core/types/index.js +1 -0
  68. package/dist/bundle-core/types.d.ts +1 -0
  69. package/dist/bundle-core/types.js +1 -0
  70. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  71. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -116
  72. package/dist/chains/bsc/four/config.d.ts +5 -70
  73. package/dist/chains/bsc/four/config.js +2 -115
  74. package/dist/chains/bsc/four/core.d.ts +1 -4
  75. package/dist/chains/bsc/four/core.js +1 -589
  76. package/dist/chains/bsc/four/disperse.d.ts +12 -0
  77. package/dist/chains/bsc/four/disperse.js +470 -0
  78. package/dist/chains/bsc/four/index.d.ts +6 -6
  79. package/dist/chains/bsc/four/index.js +6 -6
  80. package/dist/chains/bsc/four/internal.d.ts +2 -50
  81. package/dist/chains/bsc/four/internal.js +2 -237
  82. package/dist/chains/bsc/four/pairwise.d.ts +7 -0
  83. package/dist/chains/bsc/four/pairwise.js +308 -0
  84. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  85. package/dist/chains/bsc/four/pancake-proxy.js +1 -688
  86. package/dist/chains/bsc/four/private.d.ts +1 -27
  87. package/dist/chains/bsc/four/private.js +1 -477
  88. package/dist/chains/bsc/four/submit.d.ts +2 -315
  89. package/dist/chains/bsc/four/submit.js +2 -746
  90. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  91. package/dist/chains/bsc/four/swap-buy-first.js +2 -506
  92. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  93. package/dist/chains/bsc/four/swap-internal.js +1 -18
  94. package/dist/chains/bsc/four/swap.d.ts +2 -144
  95. package/dist/chains/bsc/four/swap.js +2 -760
  96. package/dist/chains/bsc/four/sweep.d.ts +13 -0
  97. package/dist/chains/bsc/four/sweep.js +788 -0
  98. package/dist/chains/bsc/four/types.d.ts +1 -476
  99. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  100. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  101. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  102. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  103. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  104. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  105. package/dist/chains/bsc/four/utils.d.ts +5 -18
  106. package/dist/chains/bsc/four/utils.js +5 -1534
  107. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
  108. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
  109. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  110. package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -207
  111. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  112. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
  113. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  114. package/dist/chains/bsc/pancake/bundle-swap.js +111 -686
  115. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  116. package/dist/chains/bsc/pancake/index.js +1 -3
  117. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  118. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  119. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  120. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  121. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  122. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  123. package/dist/chains/eni/batch-router/transfer.js +54 -23
  124. package/dist/chains/eni/batch-router/utils.js +32 -6
  125. package/dist/chains/eni/bundler/sign.js +4 -4
  126. package/dist/chains/eni/bundler/submit.js +1 -4
  127. package/dist/chains/eni/constants.js +1 -1
  128. package/dist/chains/eni/index.d.ts +1 -1
  129. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  130. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  131. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  132. package/dist/chains/eni/platforms/daoaas/meta.js +8 -4
  133. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
  134. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  135. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  136. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  137. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  138. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -47
  139. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  140. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  141. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  142. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  143. package/dist/chains/eni/platforms/iro/index.js +4 -4
  144. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  145. package/dist/chains/eni/platforms/iro/token.js +107 -31
  146. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  147. package/dist/chains/eni/submit.js +5 -13
  148. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  149. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
  150. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  151. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  152. package/dist/chains/xlayer/eip7702/bundle-create.js +93 -56
  153. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  154. package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
  155. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  156. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
  157. package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
  158. package/dist/chains/xlayer/eip7702/constants.js +3 -21
  159. package/dist/chains/xlayer/eip7702/index.d.ts +27 -46
  160. package/dist/chains/xlayer/eip7702/index.js +27 -81
  161. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
  162. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
  163. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  164. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +58 -291
  165. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  166. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
  167. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  168. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  169. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  170. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
  171. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  172. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  173. package/dist/chains/xlayer/eip7702/volume.js +83 -158
  174. package/dist/chains/xlayer/eoa/constants.js +1 -1
  175. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  176. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  177. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  178. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  179. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +64 -276
  180. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  181. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
  182. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  183. package/dist/chains/xlayer/eoa/index.js +8 -23
  184. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  185. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  186. package/dist/chains/xlayer/eoa/types-core.d.ts +363 -0
  187. package/dist/chains/xlayer/eoa/types-core.js +53 -0
  188. package/dist/chains/xlayer/eoa/types-create.d.ts +413 -0
  189. package/dist/chains/xlayer/eoa/types-create.js +9 -0
  190. package/dist/chains/xlayer/eoa/types-volume.d.ts +209 -0
  191. package/dist/chains/xlayer/eoa/types-volume.js +13 -0
  192. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  193. package/dist/chains/xlayer/eoa/types.js +1 -3
  194. package/dist/contracts/helper3.d.ts +20 -17
  195. package/dist/contracts/helper3.js +56 -20
  196. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  197. package/dist/contracts/tm-bundle-helpers.js +72 -0
  198. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  199. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -117
  200. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
  201. package/dist/contracts/tm-bundle-merkle/config.js +2 -115
  202. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  203. package/dist/contracts/tm-bundle-merkle/core.js +1 -588
  204. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  205. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  206. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -50
  207. package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
  208. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  209. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
  210. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  211. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  212. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  213. package/dist/contracts/tm-bundle-merkle/submit.js +3 -919
  214. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  215. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
  216. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  217. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  218. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  219. package/dist/contracts/tm-bundle-merkle/swap.js +2 -757
  220. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  221. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  222. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  223. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  224. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  225. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  226. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  227. package/dist/contracts/tm-bundle-merkle/utils.d.ts +5 -6
  228. package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
  229. package/dist/contracts/tm-bundle.d.ts +3 -51
  230. package/dist/contracts/tm-bundle.js +102 -142
  231. package/dist/contracts/tm.d.ts +3 -2
  232. package/dist/contracts/tm.js +36 -32
  233. package/dist/contracts/tm1.js +9 -4
  234. package/dist/contracts/tm2.js +9 -4
  235. package/dist/dex/direct-router-helpers.d.ts +264 -0
  236. package/dist/dex/direct-router-helpers.js +539 -0
  237. package/dist/dex/direct-router.d.ts +3 -125
  238. package/dist/dex/direct-router.js +237 -652
  239. package/dist/dex/types.d.ts +81 -0
  240. package/dist/dex/types.js +1 -0
  241. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  242. package/dist/exports/root-bundle-and-tooling.js +30 -0
  243. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  244. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  245. package/dist/exports/root-foundations.d.ts +35 -0
  246. package/dist/exports/root-foundations.js +70 -0
  247. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  248. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  249. package/dist/flows/create.d.ts +2 -2
  250. package/dist/flows/create.js +6 -6
  251. package/dist/flows/index.d.ts +1 -0
  252. package/dist/flows/index.js +1 -0
  253. package/dist/index.d.ts +20 -91
  254. package/dist/index.js +20 -215
  255. package/dist/shared/abis/common.d.ts +2 -83
  256. package/dist/shared/abis/common.js +2 -252
  257. package/dist/shared/abis/index.d.ts +5 -6
  258. package/dist/shared/abis/index.js +5 -7
  259. package/dist/shared/clients/blockrazor.js +41 -24
  260. package/dist/shared/clients/club48.js +30 -26
  261. package/dist/shared/clients/emitservice.js +2 -0
  262. package/dist/shared/clients/four.js +23 -18
  263. package/dist/shared/clients/index.d.ts +8 -0
  264. package/dist/shared/clients/index.js +8 -0
  265. package/dist/shared/clients/merkle.js +26 -30
  266. package/dist/shared/constants/addresses.d.ts +1 -1
  267. package/dist/shared/constants/addresses.js +11 -2
  268. package/dist/shared/constants/chains.d.ts +1 -1
  269. package/dist/shared/constants/chains.js +1 -1
  270. package/dist/shared/constants/gas.d.ts +1 -1
  271. package/dist/shared/constants/gas.js +2 -6
  272. package/dist/shared/constants/index.d.ts +1 -0
  273. package/dist/shared/constants/index.js +1 -0
  274. package/dist/shared/constants/quote.d.ts +30 -0
  275. package/dist/shared/constants/quote.js +37 -0
  276. package/dist/shared/flap/__tests__/curve.test.js +3 -3
  277. package/dist/shared/flap/abi.js +1 -1
  278. package/dist/shared/flap/constants.d.ts +1 -1
  279. package/dist/shared/flap/constants.js +2 -2
  280. package/dist/shared/flap/curve.js +3 -0
  281. package/dist/shared/flap/errors.d.ts +1 -4
  282. package/dist/shared/flap/errors.js +21 -3
  283. package/dist/shared/flap/index.d.ts +2 -2
  284. package/dist/shared/flap/index.js +2 -2
  285. package/dist/shared/flap/meta.d.ts +16 -18
  286. package/dist/shared/flap/meta.js +14 -26
  287. package/dist/shared/flap/permit.js +6 -5
  288. package/dist/shared/flap/pinata.d.ts +9 -2
  289. package/dist/shared/flap/pinata.js +20 -18
  290. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  291. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  292. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  293. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  294. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  295. package/dist/shared/flap/portal-bundle-merkle/core.js +66 -156
  296. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
  297. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
  298. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  299. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  300. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  301. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  302. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  303. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  304. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  305. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
  306. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  307. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  308. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
  309. package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
  310. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +73 -3
  311. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +100 -0
  312. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +133 -0
  313. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  314. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  315. package/dist/shared/flap/portal-bundle.js +54 -42
  316. package/dist/shared/flap/portal.js +32 -10
  317. package/dist/shared/flap/vanity.js +4 -7
  318. package/dist/shared/flap/vault.d.ts +1 -1
  319. package/dist/shared/flap/vault.js +54 -48
  320. package/dist/shared/flap 2/__tests__/curve.test.d.ts +1 -0
  321. package/dist/shared/flap 2/portal-bundle-merkle/types.js +1 -0
  322. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  323. package/dist/shared/foundation/dex/v3-path.js +35 -0
  324. package/dist/shared/foundation/gas/bundle-gas.d.ts +39 -0
  325. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  326. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  327. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  328. package/dist/shared/foundation/index.d.ts +13 -0
  329. package/dist/shared/foundation/index.js +12 -0
  330. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  331. package/dist/shared/foundation/nonce/nonce-manager.js +180 -0
  332. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  333. package/dist/shared/foundation/normalize-unknown.js +29 -0
  334. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  335. package/dist/shared/foundation/sdk-logger.js +12 -0
  336. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  337. package/dist/shared/foundation/tx/build-request.js +25 -0
  338. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  339. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  340. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  341. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  342. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  343. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  344. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  345. package/dist/shared/foundation/types/erc20.js +1 -0
  346. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  347. package/dist/shared/foundation/types/holders-maker.js +1 -0
  348. package/dist/shared/foundation/types/index.d.ts +7 -0
  349. package/dist/shared/foundation/types/index.js +1 -0
  350. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  351. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  352. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  353. package/dist/shared/foundation/types/multicall.js +1 -0
  354. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  355. package/dist/shared/foundation/types/private-sale.js +1 -0
  356. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  357. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  358. package/dist/shared/four/tax-token.d.ts +1 -1
  359. package/dist/shared/four/tax-token.js +27 -7
  360. package/dist/shared/index.d.ts +4 -0
  361. package/dist/shared/index.js +4 -0
  362. package/dist/types/distribute.d.ts +72 -0
  363. package/dist/types/distribute.js +1 -0
  364. package/dist/types 2/errors.d.ts +27 -0
  365. package/dist/types 2/errors.js +34 -0
  366. package/dist/utils/airdrop-sweep-types.d.ts +1 -0
  367. package/dist/utils/airdrop-sweep-types.js +1 -0
  368. package/dist/utils/airdrop-sweep.d.ts +4 -76
  369. package/dist/utils/airdrop-sweep.js +38 -52
  370. package/dist/utils/bundle-helpers.d.ts +9 -243
  371. package/dist/utils/bundle-helpers.js +10 -584
  372. package/dist/utils/constants.d.ts +5 -61
  373. package/dist/utils/constants.js +5 -80
  374. package/dist/utils/contract-factory.d.ts +2 -4
  375. package/dist/utils/contract-factory.js +25 -18
  376. package/dist/utils/erc20-types.d.ts +1 -0
  377. package/dist/utils/erc20-types.js +1 -0
  378. package/dist/utils/erc20.d.ts +8 -90
  379. package/dist/utils/erc20.js +94 -153
  380. package/dist/utils/errors.d.ts +10 -22
  381. package/dist/utils/errors.js +61 -79
  382. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  383. package/dist/utils/holders-maker/addresses.js +15 -0
  384. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  385. package/dist/utils/holders-maker/buy-tx.js +278 -0
  386. package/dist/utils/holders-maker/constants.d.ts +6 -0
  387. package/dist/utils/holders-maker/constants.js +7 -0
  388. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  389. package/dist/utils/holders-maker/disperse.js +90 -0
  390. package/dist/utils/holders-maker/routing.d.ts +4 -0
  391. package/dist/utils/holders-maker/routing.js +45 -0
  392. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  393. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  394. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  395. package/dist/utils/holders-maker-helpers.js +9 -0
  396. package/dist/utils/holders-maker-types.d.ts +1 -0
  397. package/dist/utils/holders-maker-types.js +1 -0
  398. package/dist/utils/holders-maker.d.ts +2 -138
  399. package/dist/utils/holders-maker.js +23 -651
  400. package/dist/utils/hop-chains.d.ts +35 -0
  401. package/dist/utils/hop-chains.js +215 -0
  402. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  403. package/dist/utils/lp-inspect-helpers.js +109 -0
  404. package/dist/utils/lp-inspect-types.d.ts +1 -0
  405. package/dist/utils/lp-inspect-types.js +1 -0
  406. package/dist/utils/lp-inspect.d.ts +2 -112
  407. package/dist/utils/lp-inspect.js +63 -195
  408. package/dist/utils/mpcExclusive.d.ts +2 -5
  409. package/dist/utils/mpcExclusive.js +4 -3
  410. package/dist/utils/private-sale-types.d.ts +1 -0
  411. package/dist/utils/private-sale-types.js +1 -0
  412. package/dist/utils/private-sale.d.ts +2 -58
  413. package/dist/utils/private-sale.js +2 -7
  414. package/dist/utils/provider-factory.d.ts +4 -0
  415. package/dist/utils/provider-factory.js +10 -0
  416. package/dist/utils/quote-helpers-types.d.ts +1 -0
  417. package/dist/utils/quote-helpers-types.js +1 -0
  418. package/dist/utils/quote-helpers.d.ts +4 -45
  419. package/dist/utils/quote-helpers.js +15 -65
  420. package/dist/utils/stealth-transfer.d.ts +2 -28
  421. package/dist/utils/stealth-transfer.js +30 -14
  422. package/dist/utils/swap-helpers.d.ts +0 -3
  423. package/dist/utils/swap-helpers.js +6 -9
  424. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  425. package/dist/utils/types/airdrop-sweep.js +1 -0
  426. package/dist/utils/types/contract-factory.d.ts +1 -0
  427. package/dist/utils/types/contract-factory.js +1 -0
  428. package/dist/utils/types/erc20.d.ts +1 -0
  429. package/dist/utils/types/erc20.js +1 -0
  430. package/dist/utils/types/errors.d.ts +1 -0
  431. package/dist/utils/types/errors.js +1 -0
  432. package/dist/utils/types/holders-maker.d.ts +1 -0
  433. package/dist/utils/types/holders-maker.js +1 -0
  434. package/dist/utils/types/hop-chains.d.ts +8 -0
  435. package/dist/utils/types/hop-chains.js +1 -0
  436. package/dist/utils/types/index.d.ts +13 -0
  437. package/dist/utils/types/index.js +1 -0
  438. package/dist/utils/types/lp-inspect.d.ts +1 -0
  439. package/dist/utils/types/lp-inspect.js +1 -0
  440. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  441. package/dist/utils/types/mpc-exclusive.js +1 -0
  442. package/dist/utils/types/private-sale.d.ts +1 -0
  443. package/dist/utils/types/private-sale.js +1 -0
  444. package/dist/utils/types/quote-helpers.d.ts +1 -0
  445. package/dist/utils/types/quote-helpers.js +1 -0
  446. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  447. package/dist/utils/types/stealth-transfer.js +1 -0
  448. package/dist/utils/types/wallet.d.ts +25 -0
  449. package/dist/utils/types/wallet.js +1 -0
  450. package/dist/utils/wallet.d.ts +2 -25
  451. package/dist/utils/wallet.js +9 -10
  452. package/package.json +55 -2
  453. package/src/abis/contracts/TaxToken.json +969 -0
  454. package/src/abis/contracts/TokenManager.json +836 -0
  455. package/src/abis/contracts/TokenManager2.json +136 -0
  456. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  457. /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
  458. /package/dist/{shared 2/flap/portal-bundle-merkle/types.js → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
  459. /package/dist/{shared 2/abis → shared/abis 2}/TaxToken.json +0 -0
  460. /package/dist/{shared 2/abis → shared/abis 2}/TokenManager.json +0 -0
  461. /package/dist/{shared 2/abis → shared/abis 2}/TokenManager2.json +0 -0
  462. /package/dist/{shared 2/abis → shared/abis 2}/TokenManagerHelper3.json +0 -0
  463. /package/dist/{shared 2/abis → shared/abis 2}/common.d.ts +0 -0
  464. /package/dist/{shared 2/abis → shared/abis 2}/common.js +0 -0
  465. /package/dist/{shared 2/abis → shared/abis 2}/index.d.ts +0 -0
  466. /package/dist/{shared 2/abis → shared/abis 2}/index.js +0 -0
  467. /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.d.ts +0 -0
  468. /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.js +0 -0
  469. /package/dist/{shared 2/clients → shared/clients 2}/club48.d.ts +0 -0
  470. /package/dist/{shared 2/clients → shared/clients 2}/club48.js +0 -0
  471. /package/dist/{shared 2/clients → shared/clients 2}/emitservice.d.ts +0 -0
  472. /package/dist/{shared 2/clients → shared/clients 2}/emitservice.js +0 -0
  473. /package/dist/{shared 2/clients → shared/clients 2}/four.d.ts +0 -0
  474. /package/dist/{shared 2/clients → shared/clients 2}/four.js +0 -0
  475. /package/dist/{shared 2/clients → shared/clients 2}/merkle.d.ts +0 -0
  476. /package/dist/{shared 2/clients → shared/clients 2}/merkle.js +0 -0
  477. /package/dist/{shared 2/flap → shared/flap 2}/__tests__/curve.test.js +0 -0
  478. /package/dist/{shared 2/flap → shared/flap 2}/abi.d.ts +0 -0
  479. /package/dist/{shared 2/flap → shared/flap 2}/abi.js +0 -0
  480. /package/dist/{shared 2/flap → shared/flap 2}/constants.d.ts +0 -0
  481. /package/dist/{shared 2/flap → shared/flap 2}/constants.js +0 -0
  482. /package/dist/{shared 2/flap → shared/flap 2}/curve.d.ts +0 -0
  483. /package/dist/{shared 2/flap → shared/flap 2}/curve.js +0 -0
  484. /package/dist/{shared 2/flap → shared/flap 2}/errors.d.ts +0 -0
  485. /package/dist/{shared 2/flap → shared/flap 2}/errors.js +0 -0
  486. /package/dist/{shared 2/flap → shared/flap 2}/index.d.ts +0 -0
  487. /package/dist/{shared 2/flap → shared/flap 2}/index.js +0 -0
  488. /package/dist/{shared 2/flap → shared/flap 2}/ipfs.d.ts +0 -0
  489. /package/dist/{shared 2/flap → shared/flap 2}/ipfs.js +0 -0
  490. /package/dist/{shared 2/flap → shared/flap 2}/meta.d.ts +0 -0
  491. /package/dist/{shared 2/flap → shared/flap 2}/meta.js +0 -0
  492. /package/dist/{shared 2/flap → shared/flap 2}/permit.d.ts +0 -0
  493. /package/dist/{shared 2/flap → shared/flap 2}/permit.js +0 -0
  494. /package/dist/{shared 2/flap → shared/flap 2}/pinata.d.ts +0 -0
  495. /package/dist/{shared 2/flap → shared/flap 2}/pinata.js +0 -0
  496. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.d.ts +0 -0
  497. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.js +0 -0
  498. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.d.ts +0 -0
  499. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.js +0 -0
  500. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.d.ts +0 -0
  501. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.js +0 -0
  502. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.d.ts +0 -0
  503. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.js +0 -0
  504. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.d.ts +0 -0
  505. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.js +0 -0
  506. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.d.ts +0 -0
  507. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.js +0 -0
  508. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.d.ts +0 -0
  509. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.js +0 -0
  510. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.d.ts +0 -0
  511. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.js +0 -0
  512. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.d.ts +0 -0
  513. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.js +0 -0
  514. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/types.d.ts +0 -0
  515. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.d.ts +0 -0
  516. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.js +0 -0
  517. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.d.ts +0 -0
  518. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.js +0 -0
  519. /package/dist/{shared 2/flap → shared/flap 2}/portal.d.ts +0 -0
  520. /package/dist/{shared 2/flap → shared/flap 2}/portal.js +0 -0
  521. /package/dist/{shared 2/flap → shared/flap 2}/vanity.d.ts +0 -0
  522. /package/dist/{shared 2/flap → shared/flap 2}/vanity.js +0 -0
  523. /package/dist/{shared 2/flap → shared/flap 2}/vault.d.ts +0 -0
  524. /package/dist/{shared 2/flap → shared/flap 2}/vault.js +0 -0
  525. /package/dist/{shared 2/four → shared/four 2}/index.d.ts +0 -0
  526. /package/dist/{shared 2/four → shared/four 2}/index.js +0 -0
  527. /package/dist/{shared 2/four → shared/four 2}/tax-token.d.ts +0 -0
  528. /package/dist/{shared 2/four → shared/four 2}/tax-token.js +0 -0
  529. /package/dist/{shared 2/index.d.ts → shared/index 2.js} +0 -0
  530. /package/dist/{shared 2/index.js → shared/index.d 2.ts} +0 -0
@@ -1,65 +1,2 @@
1
- /**
2
- * Flap Protocol 内盘捆绑换手(Merkle Bundle)- 先买后卖
3
- *
4
- * 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
5
- */
6
- import { CommonBundleConfig } from '../../../utils/bundle-helpers.js';
7
- import { FlapSignConfig } from './config.js';
8
- import type { GeneratedWallet } from '../../../utils/wallet.js';
9
- export type FlapChain = 'bsc' | 'xlayer' | 'base';
10
- export type UserType = 'v0' | 'v1';
11
- export interface FlapBuyFirstSignConfig extends FlapSignConfig {
12
- reserveGasETH?: number;
13
- skipQuoteOnError?: boolean;
14
- userType?: UserType;
15
- }
16
- export interface FlapBuyFirstConfig extends CommonBundleConfig {
17
- apiKey: string;
18
- customRpcUrl?: string;
19
- bundleBlockOffset?: number;
20
- reserveGasETH?: number;
21
- skipQuoteOnError?: boolean;
22
- waitForConfirmation?: boolean;
23
- waitTimeoutMs?: number;
24
- }
25
- export interface FlapBundleBuyFirstSignParams {
26
- chain: FlapChain;
27
- buyerPrivateKey?: string;
28
- buyerPrivateKeys?: string[];
29
- sellerPrivateKey?: string;
30
- sellerPrivateKeys?: string[];
31
- tokenAddress: string;
32
- buyerFunds?: string;
33
- buyerFundsPercentage?: number;
34
- config: FlapBuyFirstSignConfig;
35
- quoteToken?: string;
36
- quoteTokenDecimals?: number;
37
- buyCount?: number;
38
- sellCount?: number;
39
- }
40
- export interface FlapBundleBuyFirstParams {
41
- chain: FlapChain;
42
- buyerPrivateKey: string;
43
- sellerPrivateKey: string;
44
- tokenAddress: string;
45
- buyerFunds?: string;
46
- buyerFundsPercentage?: number;
47
- config: FlapBuyFirstConfig;
48
- }
49
- /** ✅ Flap BuyFirst 结果(简化版) */
50
- export type FlapBuyFirstResult = {
51
- signedTransactions: string[];
52
- profitHopWallets?: GeneratedWallet[];
53
- metadata?: {
54
- buyerAddress: string;
55
- sellerAddress: string;
56
- buyAmount: string;
57
- sellAmount: string;
58
- profitAmount?: string;
59
- buyCount?: number;
60
- sellCount?: number;
61
- buyAmounts?: string[];
62
- sellAmounts?: string[];
63
- };
64
- };
1
+ import { FlapBundleBuyFirstSignParams, FlapBuyFirstResult } from './swap-buy-first-helpers.js';
65
2
  export declare function flapBundleBuyFirstMerkle(params: FlapBundleBuyFirstSignParams): Promise<FlapBuyFirstResult>;
@@ -1,117 +1,20 @@
1
1
  /**
2
- * Flap Protocol 内盘捆绑换手(Merkle Bundle)- 先买后卖
3
- *
4
- * 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
2
+ * swap-buy-first - 主函数
5
3
  */
6
4
  import { ethers, Contract, Wallet } from 'ethers';
7
- import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
5
+ import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
8
6
  import { FLAP_PORTAL_ADDRESSES } from '../constants.js';
9
- import { PROFIT_CONFIG, ADDRESSES, ZERO_ADDRESS } from '../../../utils/constants.js';
10
- import { GAS_LIMITS, CHAINS } from '../../constants/index.js';
11
- import { ERC20_BALANCE_ABI, V2_ROUTER_QUOTE_ABI } from '../../abis/common.js';
12
- import { getGasPriceConfig, getTxType, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, PORTAL_ABI } from './config.js';
13
- // ==================== 链常量 ====================
14
- const BSC_PANCAKE_V2_ROUTER = ADDRESSES.BSC.PancakeV2Router;
15
- const BSC_WBNB = ADDRESSES.BSC.WBNB;
16
- const MONAD_PANCAKE_V2_ROUTER = '0xb1bc24c34e88f7d43d5923034e3a14b24daacff9';
17
- const MONAD_WMON = ADDRESSES.MONAD.WMON;
18
- const ROUTER_ABI = V2_ROUTER_QUOTE_ABI;
19
- /**
20
- * 获取 ERC20 代币 → 原生代币的报价
21
- * @param provider - Provider 实例
22
- * @param tokenAddress - ERC20 代币地址
23
- * @param tokenAmount - 代币数量(wei)
24
- * @param chainId - 链 ID(56=BSC, 143=Monad)
25
- * @returns 等值的原生代币数量(wei),失败返回 0n
26
- */
27
- async function getTokenToNativeQuote(provider, tokenAddress, tokenAmount, chainId) {
28
- if (tokenAmount <= 0n)
29
- return 0n;
30
- try {
31
- if (chainId === CHAINS.BSC.chainId) {
32
- // BSC: 使用 PancakeSwap V2 Router
33
- const router = new Contract(BSC_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
34
- const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, BSC_WBNB]);
35
- return amounts[1];
36
- }
37
- if (chainId === CHAINS.MONAD.chainId) {
38
- // ✅ Monad: 使用 PancakeSwap V2 Router
39
- const router = new Contract(MONAD_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
40
- const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, MONAD_WMON]);
41
- return amounts[1];
42
- }
43
- // ✅ Base (8453) / XLayer (196) 等链暂不支持 V2 报价,返回 0
44
- return 0n;
45
- }
46
- catch {
47
- // 报价失败返回 0(可能是流动性不足或路径不存在)
48
- return 0n;
49
- }
50
- }
51
- /**
52
- * 获取 Gas Limit(支持 FlapAnyConfig)
53
- */
54
- function getGasLimit(config, defaultGas = 800000) {
55
- if (config.gasLimit !== undefined) {
56
- return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
57
- }
58
- const multiplier = config.gasLimitMultiplier ?? 1.0;
59
- return BigInt(Math.ceil(defaultGas * multiplier));
60
- }
61
- // ==================== 多笔买卖常量 ====================
62
- /** 最大 Bundle 签名数 */
63
- const MAX_BUNDLE_SIGNATURES = 50;
64
- /** 贿赂交易数 */
65
- const BRIBE_TX_COUNT = 1;
66
- /** 利润中转交易数(支付者 1 笔 + 中转钱包 PROFIT_HOP_COUNT 笔 + 最终接收 1 笔) */
67
- const PROFIT_TX_COUNT = PROFIT_HOP_COUNT + 2; // 2 + 2 = 4
68
- /** 最大买卖交易数 */
69
- const MAX_SWAP_TX_COUNT = MAX_BUNDLE_SIGNATURES - BRIBE_TX_COUNT - PROFIT_TX_COUNT; // 50 - 1 - 4 = 45
70
- /**
71
- * 根据 userType 获取每笔交易的利润率
72
- */
73
- function getProfitRatePerTxBps(userType) {
74
- if (userType === 'v1') {
75
- return PROFIT_CONFIG.RATE_BPS_V1_DOUBLE;
76
- }
77
- return PROFIT_CONFIG.RATE_BPS_V0_DOUBLE; // v0 或默认
78
- }
79
- /**
80
- * 验证买卖笔数
81
- */
82
- function validateSwapCounts(buyCount, sellCount) {
83
- if (buyCount < 1) {
84
- throw new Error(`买入笔数必须至少为 1,当前为 ${buyCount}`);
85
- }
86
- if (sellCount < 1) {
87
- throw new Error(`卖出笔数必须至少为 1,当前为 ${sellCount}`);
88
- }
89
- const totalSwaps = buyCount + sellCount;
90
- if (totalSwaps > MAX_SWAP_TX_COUNT) {
91
- throw new Error(`买卖笔数总和 (${totalSwaps}) 超出限制 (${MAX_SWAP_TX_COUNT}),` +
92
- `最大签名数为 ${MAX_BUNDLE_SIGNATURES}(${BRIBE_TX_COUNT} 贿赂 + ${PROFIT_TX_COUNT} 利润 + ${MAX_SWAP_TX_COUNT} 买卖)`);
93
- }
94
- }
95
- function getChainId(chain) {
96
- switch (chain) {
97
- case 'bsc': return 56;
98
- case 'xlayer': return 196;
99
- case 'base': return 8453;
100
- }
101
- }
102
- function getNativeTokenName(chain) {
103
- switch (chain) {
104
- case 'bsc': return 'BNB';
105
- case 'xlayer': return 'OKB';
106
- case 'base': return 'ETH';
107
- }
108
- }
109
- // 使用公共工具的 getGasLimit,移除本地重复实现
7
+ import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
8
+ import { GAS_LIMITS } from '../../constants/index.js';
9
+ import { ERC20_BALANCE_ABI } from '../../abis/common.js';
10
+ import { getGasPriceConfig, getTxType, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, PORTAL_ABI, } from './config.js';
11
+ import { createSignProvider } from '../../../bundle-core/sign-context-helpers.js';
12
+ import { buildTransactionRequest } from '../../foundation/tx/build-request.js';
13
+ import { getChainId, getGasLimit, getNativeTokenName, getProfitRatePerTxBps, getTokenToNativeQuote, validateSwapCounts, } from './swap-buy-first-helpers.js';
110
14
  export async function flapBundleBuyFirstMerkle(params) {
111
- const { chain, buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, tokenAddress, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals, buyCount: _buyCount, sellCount: _sellCount } = params;
15
+ const { chain, buyerPrivateKey, buyerPrivateKeys, sellerPrivateKey, sellerPrivateKeys, tokenAddress, buyerFunds, buyerFundsPercentage, config, quoteToken, quoteTokenDecimals, buyCount: _buyCount, sellCount: _sellCount, } = params;
112
16
  // ✅ 判断是否为多钱包模式
113
- const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) ||
114
- !!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
17
+ const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) || !!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
115
18
  const buyCount = _buyCount ?? 1;
116
19
  const sellCount = _sellCount ?? 1;
117
20
  // ✅ 多钱包模式:使用单独的处理逻辑
@@ -124,7 +27,7 @@ export async function flapBundleBuyFirstMerkle(params) {
124
27
  buyerFunds,
125
28
  config,
126
29
  quoteToken,
127
- quoteTokenDecimals
30
+ quoteTokenDecimals,
128
31
  });
129
32
  }
130
33
  // ✅ 单钱包模式(向后兼容)
@@ -158,11 +61,11 @@ export async function flapBundleBuyFirstMerkle(params) {
158
61
  useNativeToken,
159
62
  quoteToken,
160
63
  quoteTokenDecimals,
161
- provider: chainContext.provider
64
+ provider: chainContext.provider,
162
65
  }),
163
- getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config))
66
+ getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config)),
164
67
  ]);
165
- const { buyerFundsWei, buyerBalance } = buyerFundsResult;
68
+ const { buyerFundsWei } = buyerFundsResult;
166
69
  const priorityFee = gasPrice / 10n === 0n ? 1n : gasPrice / 10n;
167
70
  // ✅ 获取报价
168
71
  const quoteResult = await quoteBuyerOutput({
@@ -171,7 +74,7 @@ export async function flapBundleBuyFirstMerkle(params) {
171
74
  buyerFundsWei,
172
75
  provider: chainContext.provider,
173
76
  skipQuoteOnError: config.skipQuoteOnError,
174
- inputToken // ✅ 传递输入代币
77
+ inputToken, // ✅ 传递输入代币
175
78
  });
176
79
  const sellAmountWei = quoteResult.sellAmountWei;
177
80
  // ✅ 验证卖方余额
@@ -180,7 +83,7 @@ export async function flapBundleBuyFirstMerkle(params) {
180
83
  provider: chainContext.provider,
181
84
  seller,
182
85
  sellAmountWei,
183
- skipBalanceCheck: sameAddress
86
+ skipBalanceCheck: sameAddress,
184
87
  });
185
88
  const portalBuyer = new Contract(chainContext.portalAddress, PORTAL_ABI, buyer);
186
89
  const portalSeller = new Contract(chainContext.portalAddress, PORTAL_ABI, seller);
@@ -188,24 +91,24 @@ export async function flapBundleBuyFirstMerkle(params) {
188
91
  const buyAmountsWei = splitAmount(buyerFundsWei, buyCount);
189
92
  const sellAmountsWei = splitAmount(sellAmountWei, sellCount);
190
93
  // ✅ 第三批并行 - 构建多笔买入和卖出交易、estimatedSellFunds
191
- const buyUnsignedPromises = buyAmountsWei.map(amount => portalBuyer.swapExactInput.populateTransaction({
94
+ const buyUnsignedPromises = buyAmountsWei.map((amount) => portalBuyer.swapExactInput.populateTransaction({
192
95
  inputToken,
193
96
  outputToken: tokenAddress,
194
97
  inputAmount: amount,
195
98
  minOutputAmount: 0n,
196
- permitData: '0x'
99
+ permitData: '0x',
197
100
  }, useNativeToken ? { value: amount } : {}));
198
- const sellUnsignedPromises = sellAmountsWei.map(amount => portalSeller.swapExactInput.populateTransaction({
101
+ const sellUnsignedPromises = sellAmountsWei.map((amount) => portalSeller.swapExactInput.populateTransaction({
199
102
  inputToken: tokenAddress,
200
103
  outputToken,
201
104
  inputAmount: amount,
202
105
  minOutputAmount: 0,
203
- permitData: '0x'
106
+ permitData: '0x',
204
107
  }));
205
108
  const [buyUnsignedArray, sellUnsignedArray, estimatedSellFunds] = await Promise.all([
206
109
  Promise.all(buyUnsignedPromises),
207
110
  Promise.all(sellUnsignedPromises),
208
- estimateSellFunds(portalSeller, tokenAddress, sellAmountWei, outputToken)
111
+ estimateSellFunds(portalSeller, tokenAddress, sellAmountWei, outputToken),
209
112
  ]);
210
113
  // ✅ 获取贿赂金额
211
114
  const bribeAmount = getBribeAmount(config);
@@ -219,7 +122,7 @@ export async function flapBundleBuyFirstMerkle(params) {
219
122
  extractProfit: true,
220
123
  needBribeTx,
221
124
  sameAddress,
222
- nonceManager
125
+ nonceManager,
223
126
  });
224
127
  // ✅ 修复:基于卖出收益估算利润(使用动态利润比例)
225
128
  const profitBase = estimatedSellFunds > 0n ? estimatedSellFunds : buyerFundsWei;
@@ -239,7 +142,7 @@ export async function flapBundleBuyFirstMerkle(params) {
239
142
  priorityFee,
240
143
  chainId: chainContext.chainId,
241
144
  txType,
242
- value: useNativeToken ? buyAmountsWei[i] : 0n
145
+ value: useNativeToken ? buyAmountsWei[i] : 0n,
243
146
  }));
244
147
  // ✅ 构建多笔卖出交易
245
148
  const sellTxs = sellUnsignedArray.map((unsigned, i) => buildTransactionRequest(unsigned, {
@@ -250,7 +153,7 @@ export async function flapBundleBuyFirstMerkle(params) {
250
153
  priorityFee,
251
154
  chainId: chainContext.chainId,
252
155
  txType,
253
- value: 0n
156
+ value: 0n,
254
157
  }));
255
158
  // ✅ 贿赂交易放在首位
256
159
  let bribeTx = null;
@@ -262,13 +165,13 @@ export async function flapBundleBuyFirstMerkle(params) {
262
165
  gasPrice,
263
166
  gasLimit: GAS_LIMITS.BRIBE,
264
167
  chainId: chainContext.chainId,
265
- type: txType
168
+ type: txType,
266
169
  });
267
170
  }
268
171
  // ✅ 并行签名所有买入和卖出交易
269
172
  const [signedBuys, signedSells] = await Promise.all([
270
- Promise.all(buyTxs.map(tx => buyer.signTransaction(tx))),
271
- Promise.all(sellTxs.map(tx => seller.signTransaction(tx)))
173
+ Promise.all(buyTxs.map((tx) => buyer.signTransaction(tx))),
174
+ Promise.all(sellTxs.map((tx) => seller.signTransaction(tx))),
272
175
  ]);
273
176
  nonceManager.clearTemp();
274
177
  // ✅ 组装顺序:贿赂 → 买入(多笔) → 卖出(多笔)
@@ -284,7 +187,7 @@ export async function flapBundleBuyFirstMerkle(params) {
284
187
  profitNonce: multiNoncePlan.profitNonce,
285
188
  gasPrice,
286
189
  chainId: chainContext.chainId,
287
- txType
190
+ txType,
288
191
  });
289
192
  let profitHopWallets;
290
193
  if (profitResult) {
@@ -304,14 +207,14 @@ export async function flapBundleBuyFirstMerkle(params) {
304
207
  buyCount,
305
208
  sellCount,
306
209
  // ✅ 返回每笔交易的具体金额(随机分配后的数组)
307
- buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
308
- sellAmounts: sellAmountsWei.map(amt => ethers.formatUnits(amt, sellerInfo.decimals))
309
- }
210
+ buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
211
+ sellAmounts: sellAmountsWei.map((amt) => ethers.formatUnits(amt, sellerInfo.decimals)),
212
+ },
310
213
  };
311
214
  }
312
215
  // ✅ 使用公共模块中的 ERC20_BALANCE_ABI
313
216
  const ERC20_BALANCE_OF_ABI = ERC20_BALANCE_ABI;
314
- async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGasEth, nativeToken, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider }) {
217
+ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, reserveGasEth, nativeToken, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider, }) {
315
218
  const reserveGas = ethers.parseEther((reserveGasEth || 0.0005).toString());
316
219
  // ✅ 根据是否使用原生代币获取不同的余额
317
220
  let buyerBalance;
@@ -333,9 +236,7 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
333
236
  else if (buyerFundsPercentage !== undefined) {
334
237
  const pct = Math.max(0, Math.min(100, buyerFundsPercentage));
335
238
  // ✅ 原生代币需要预留 Gas,ERC20 不需要
336
- const spendable = useNativeToken
337
- ? (buyerBalance > reserveGas ? buyerBalance - reserveGas : 0n)
338
- : buyerBalance;
239
+ const spendable = useNativeToken ? (buyerBalance > reserveGas ? buyerBalance - reserveGas : 0n) : buyerBalance;
339
240
  buyerFundsWei = (spendable * BigInt(Math.floor(pct * 100))) / 10000n;
340
241
  }
341
242
  else {
@@ -363,15 +264,15 @@ async function calculateBuyerFunds({ buyer, buyerFunds, buyerFundsPercentage, re
363
264
  }
364
265
  return { buyerFundsWei, buyerBalance };
365
266
  }
366
- async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, provider, skipQuoteOnError, inputToken = ZERO_ADDRESS // ✅ 默认使用原生代币
267
+ async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, provider, skipQuoteOnError, inputToken = ZERO_ADDRESS, // ✅ 默认使用原生代币
367
268
  }) {
368
- let quotedToken = 0n;
269
+ let quotedToken;
369
270
  const portal = new Contract(portalAddress, PORTAL_ABI, provider);
370
271
  try {
371
272
  quotedToken = await portal.quoteExactInput.staticCall({
372
273
  inputToken, // ✅ 使用动态输入代币
373
274
  outputToken: tokenAddress,
374
- inputAmount: buyerFundsWei
275
+ inputAmount: buyerFundsWei,
375
276
  });
376
277
  }
377
278
  catch (error) {
@@ -388,46 +289,26 @@ async function quoteBuyerOutput({ portalAddress, tokenAddress, buyerFundsWei, pr
388
289
  }
389
290
  return { quotedToken, sellAmountWei };
390
291
  }
391
- async function ensureSellerBalance({ tokenAddress, provider, seller, sellAmountWei, skipBalanceCheck }) {
292
+ async function ensureSellerBalance({ tokenAddress, provider, seller, sellAmountWei, skipBalanceCheck, }) {
392
293
  const erc20 = new Contract(tokenAddress, ERC20_BALANCE_ABI, provider);
393
- const [sellerTokenBal, decimals] = await Promise.all([
394
- erc20.balanceOf(seller.address),
395
- erc20.decimals()
396
- ]);
294
+ const [sellerTokenBal, decimals] = await Promise.all([erc20.balanceOf(seller.address), erc20.decimals()]);
397
295
  if (!skipBalanceCheck && sellerTokenBal < sellAmountWei) {
398
296
  throw new Error(`卖方代币余额不足: 需要 ${ethers.formatUnits(sellAmountWei, decimals)},实际 ${ethers.formatUnits(sellerTokenBal, decimals)}`);
399
297
  }
400
298
  return { decimals };
401
299
  }
402
- async function estimateSellFunds(portal, tokenAddress, sellAmountWei, outputToken = ZERO_ADDRESS // ✅ 新增:输出代币地址
403
- ) {
300
+ async function estimateSellFunds(portal, tokenAddress, sellAmountWei, outputToken = ZERO_ADDRESS) {
404
301
  try {
405
302
  return await portal.quoteExactInput.staticCall({
406
303
  inputToken: tokenAddress,
407
304
  outputToken, // ✅ 使用动态输出代币
408
- inputAmount: sellAmountWei
305
+ inputAmount: sellAmountWei,
409
306
  });
410
307
  }
411
308
  catch {
412
309
  return 0n;
413
310
  }
414
311
  }
415
- /**
416
- * 根据 userType 获取利润率(基点)
417
- */
418
- function getProfitRateBps(userType) {
419
- if (userType === 'v1') {
420
- return PROFIT_CONFIG.RATE_BPS_V1; // 0.05%
421
- }
422
- return PROFIT_CONFIG.RATE_BPS_V0; // v0 或默认 0.06%
423
- }
424
- function calculateProfitAmount(expectedFunds, userType) {
425
- if (expectedFunds <= 0n) {
426
- return 0n;
427
- }
428
- const rateBps = getProfitRateBps(userType);
429
- return (expectedFunds * BigInt(rateBps)) / 10000n;
430
- }
431
312
  /**
432
313
  * 计算多笔交易的利润金额
433
314
  * @param expectedFunds - 预期收益
@@ -479,48 +360,13 @@ function splitAmount(totalAmount, count) {
479
360
  }
480
361
  return amounts;
481
362
  }
482
- /**
483
- * ✅ 规划 nonce
484
- * 交易顺序:贿赂 → 买入 → 卖出 → 利润
485
- */
486
- async function planNonces({ buyer, seller, extractProfit, needBribeTx, sameAddress, nonceManager }) {
487
- if (sameAddress) {
488
- // 同一地址:贿赂(可选) + 买入 + 卖出 + 利润(可选)
489
- const txCount = countTruthy([needBribeTx, true, true, extractProfit]);
490
- const nonces = await nonceManager.getNextNonceBatch(buyer, txCount);
491
- let idx = 0;
492
- const bribeNonce = needBribeTx ? nonces[idx++] : undefined;
493
- const buyerNonce = nonces[idx++];
494
- const sellerNonce = nonces[idx++];
495
- const profitNonce = extractProfit ? nonces[idx] : undefined;
496
- return { buyerNonce, sellerNonce, bribeNonce, profitNonce };
497
- }
498
- if (needBribeTx || extractProfit) {
499
- // 卖方需要多个 nonce:贿赂(可选) + 卖出 + 利润(可选)
500
- const sellerTxCount = countTruthy([needBribeTx, true, extractProfit]);
501
- // ✅ 并行获取 buyer 和 seller 的 nonce
502
- const [sellerNonces, buyerNonces] = await Promise.all([
503
- nonceManager.getNextNonceBatch(seller, sellerTxCount),
504
- nonceManager.getNextNoncesForWallets([buyer])
505
- ]);
506
- let idx = 0;
507
- const bribeNonce = needBribeTx ? sellerNonces[idx++] : undefined;
508
- const sellerNonce = sellerNonces[idx++];
509
- const profitNonce = extractProfit ? sellerNonces[idx] : undefined;
510
- const buyerNonce = buyerNonces[0];
511
- return { buyerNonce, sellerNonce, bribeNonce, profitNonce };
512
- }
513
- // ✅ 使用 getNextNoncesForWallets 批量获取
514
- const nonces = await nonceManager.getNextNoncesForWallets([buyer, seller]);
515
- return { buyerNonce: nonces[0], sellerNonce: nonces[1] };
516
- }
517
363
  /**
518
364
  * ✅ 规划多笔交易 nonce
519
365
  * 交易顺序:贿赂 → 买入(多笔) → 卖出(多笔) → 利润
520
366
  *
521
367
  * 利润中转需要 PROFIT_HOP_COUNT + 1 个 nonce(支付者→跳1→跳2→利润地址)
522
368
  */
523
- async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProfit, needBribeTx, sameAddress, nonceManager }) {
369
+ async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProfit, needBribeTx, sameAddress, nonceManager, }) {
524
370
  // 利润中转交易数(支付者只需要 1 个 nonce,中转钱包的 nonce 由 buildProfitHopTransactions 内部处理)
525
371
  const profitNonceCount = extractProfit ? 1 : 0;
526
372
  if (sameAddress) {
@@ -544,7 +390,7 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProf
544
390
  const sellerTxCount = bribeTxCount + sellCount + profitNonceCount;
545
391
  const [buyerNonces, sellerNoncesAll] = await Promise.all([
546
392
  nonceManager.getNextNonceBatch(buyer, buyCount),
547
- nonceManager.getNextNonceBatch(seller, sellerTxCount)
393
+ nonceManager.getNextNonceBatch(seller, sellerTxCount),
548
394
  ]);
549
395
  let idx = 0;
550
396
  const bribeNonce = needBribeTx ? sellerNoncesAll[idx++] : undefined;
@@ -553,31 +399,10 @@ async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProf
553
399
  const profitNonce = extractProfit ? sellerNoncesAll[idx] : undefined;
554
400
  return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
555
401
  }
556
- function buildTransactionRequest(unsigned, { from, nonce, gasLimit, gasPrice, priorityFee, chainId, txType, value }) {
557
- const tx = {
558
- ...unsigned,
559
- from,
560
- nonce,
561
- gasLimit,
562
- chainId,
563
- type: txType
564
- };
565
- if (value !== undefined) {
566
- tx.value = value;
567
- }
568
- if (txType === 2) {
569
- tx.maxFeePerGas = gasPrice;
570
- tx.maxPriorityFeePerGas = priorityFee;
571
- }
572
- else {
573
- tx.gasPrice = gasPrice;
574
- }
575
- return tx;
576
- }
577
402
  /**
578
403
  * 构建利润多跳转账交易(强制 2 跳中转)
579
404
  */
580
- async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType }) {
405
+ async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType, }) {
581
406
  if (profitNonce === undefined || profitAmount === 0n) {
582
407
  return null;
583
408
  }
@@ -590,13 +415,10 @@ async function buildProfitTransaction({ provider, seller, profitAmount, profitNo
590
415
  gasPrice,
591
416
  chainId,
592
417
  txType,
593
- startNonce: profitNonce
418
+ startNonce: profitNonce,
594
419
  });
595
420
  return { signedTransactions: profitHopResult.signedTransactions, hopWallets: profitHopResult.hopWallets };
596
421
  }
597
- function countTruthy(values) {
598
- return values.filter(Boolean).length;
599
- }
600
422
  // ✅ Provider 缓存(复用连接,减少初始化开销)
601
423
  const providerCache = new Map();
602
424
  const PROVIDER_CACHE_TTL_MS = 60 * 1000; // 60秒缓存
@@ -613,10 +435,7 @@ function createChainContext(chain, rpcUrl) {
613
435
  provider = cached.provider;
614
436
  }
615
437
  else {
616
- provider = new ethers.JsonRpcProvider(rpcUrl, {
617
- chainId,
618
- name: chain.toUpperCase()
619
- });
438
+ provider = createSignProvider(rpcUrl, chainId, chain.toUpperCase());
620
439
  providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
621
440
  }
622
441
  return { chainId, nativeToken, portalAddress, provider };
@@ -629,7 +448,7 @@ function createChainContext(chain, rpcUrl) {
629
448
  * - ✅ 优化:最大化并行操作
630
449
  */
631
450
  async function flapBundleBuyFirstMultiWallet(params) {
632
- const { chain, buyerPrivateKeys, sellerPrivateKeys, tokenAddress, buyerFunds, config, quoteToken, quoteTokenDecimals = 18 } = params;
451
+ const { chain, buyerPrivateKeys, sellerPrivateKeys, tokenAddress, buyerFunds, config, quoteToken, quoteTokenDecimals = 18, } = params;
633
452
  const buyCount = buyerPrivateKeys.length;
634
453
  const sellCount = sellerPrivateKeys.length;
635
454
  if (buyCount === 0)
@@ -644,8 +463,8 @@ async function flapBundleBuyFirstMultiWallet(params) {
644
463
  const chainContext = createChainContext(chain, config.rpcUrl);
645
464
  const nonceManager = new NonceManager(chainContext.provider);
646
465
  // 创建所有钱包实例
647
- const buyers = buyerPrivateKeys.map(pk => new Wallet(pk, chainContext.provider));
648
- const sellers = sellerPrivateKeys.map(pk => new Wallet(pk, chainContext.provider));
466
+ const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, chainContext.provider));
467
+ const sellers = sellerPrivateKeys.map((pk) => new Wallet(pk, chainContext.provider));
649
468
  // 使用第一个卖方作为主卖方(支付贿赂和利润)
650
469
  const mainSeller = sellers[0];
651
470
  // ✅ 判断是否使用原生代币
@@ -671,7 +490,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
671
490
  const allWallets = [...sellers, ...buyers];
672
491
  const uniqueWallets = allWallets.filter((w, i) => {
673
492
  const addr = w.address.toLowerCase();
674
- const firstIdx = allWallets.findIndex(x => x.address.toLowerCase() === addr);
493
+ const firstIdx = allWallets.findIndex((x) => x.address.toLowerCase() === addr);
675
494
  return firstIdx === i;
676
495
  });
677
496
  const erc20 = new Contract(tokenAddress, ERC20_BALANCE_ABI, chainContext.provider);
@@ -682,11 +501,11 @@ async function flapBundleBuyFirstMultiWallet(params) {
682
501
  buyerFundsWei: totalFundsWei,
683
502
  provider: chainContext.provider,
684
503
  skipQuoteOnError: config.skipQuoteOnError,
685
- inputToken
504
+ inputToken,
686
505
  }),
687
506
  getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config)),
688
507
  erc20.decimals(),
689
- nonceManager.getNextNoncesForWallets(uniqueWallets)
508
+ nonceManager.getNextNoncesForWallets(uniqueWallets),
690
509
  ]);
691
510
  // 构建 nonces Map
692
511
  const noncesMap = new Map();
@@ -723,19 +542,19 @@ async function flapBundleBuyFirstMultiWallet(params) {
723
542
  gasPrice,
724
543
  gasLimit: GAS_LIMITS.BRIBE,
725
544
  chainId: chainContext.chainId,
726
- type: txType
545
+ type: txType,
727
546
  });
728
547
  }
729
548
  // 2. 预分配所有 nonces(同步操作,避免竞态)
730
549
  const buyerNonces = [];
731
550
  const sellerNonces = [];
732
- buyers.forEach(buyer => {
551
+ buyers.forEach((buyer) => {
733
552
  const addr = buyer.address.toLowerCase();
734
553
  const nonce = noncesMap.get(addr);
735
554
  buyerNonces.push(nonce);
736
555
  noncesMap.set(addr, nonce + 1);
737
556
  });
738
- sellers.forEach(seller => {
557
+ sellers.forEach((seller) => {
739
558
  const addr = seller.address.toLowerCase();
740
559
  const nonce = noncesMap.get(addr);
741
560
  sellerNonces.push(nonce);
@@ -749,7 +568,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
749
568
  outputToken: tokenAddress,
750
569
  inputAmount: buyAmountsWei[i],
751
570
  minOutputAmount: 0n,
752
- permitData: '0x'
571
+ permitData: '0x',
753
572
  }, useNativeToken ? { value: buyAmountsWei[i] } : {});
754
573
  return buyer.signTransaction(buildTransactionRequest(unsigned, {
755
574
  from: buyer.address,
@@ -759,7 +578,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
759
578
  priorityFee,
760
579
  chainId: chainContext.chainId,
761
580
  txType,
762
- value: useNativeToken ? buyAmountsWei[i] : 0n
581
+ value: useNativeToken ? buyAmountsWei[i] : 0n,
763
582
  }));
764
583
  });
765
584
  // 4. 并行构建所有卖出交易
@@ -770,7 +589,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
770
589
  outputToken,
771
590
  inputAmount: sellAmountsWei[i],
772
591
  minOutputAmount: 0n,
773
- permitData: '0x'
592
+ permitData: '0x',
774
593
  });
775
594
  return seller.signTransaction(buildTransactionRequest(unsigned, {
776
595
  from: seller.address,
@@ -780,14 +599,14 @@ async function flapBundleBuyFirstMultiWallet(params) {
780
599
  priorityFee,
781
600
  chainId: chainContext.chainId,
782
601
  txType,
783
- value: 0n
602
+ value: 0n,
784
603
  }));
785
604
  });
786
605
  // ✅ 并行签名所有交易(贿赂 + 买入 + 卖出)
787
606
  const [bribeTx, signedBuys, signedSells] = await Promise.all([
788
607
  bribeTxPromise,
789
608
  Promise.all(buyTxPromises),
790
- Promise.all(sellTxPromises)
609
+ Promise.all(sellTxPromises),
791
610
  ]);
792
611
  // 组装交易顺序:贿赂 → 买入 → 卖出
793
612
  if (bribeTx)
@@ -805,7 +624,7 @@ async function flapBundleBuyFirstMultiWallet(params) {
805
624
  profitNonce,
806
625
  gasPrice,
807
626
  chainId: chainContext.chainId,
808
- txType
627
+ txType,
809
628
  });
810
629
  if (profitResult) {
811
630
  allTransactions.push(...profitResult.signedTransactions);
@@ -817,15 +636,15 @@ async function flapBundleBuyFirstMultiWallet(params) {
817
636
  signedTransactions: allTransactions,
818
637
  profitHopWallets,
819
638
  metadata: {
820
- buyerAddress: buyers.map(b => b.address).join(','),
821
- sellerAddress: sellers.map(s => s.address).join(','),
639
+ buyerAddress: buyers.map((b) => b.address).join(','),
640
+ sellerAddress: sellers.map((s) => s.address).join(','),
822
641
  buyAmount: ethers.formatEther(totalFundsWei),
823
642
  sellAmount: ethers.formatUnits(quoteResult.sellAmountWei, decimals),
824
643
  profitAmount: nativeProfitAmount > 0n ? ethers.formatEther(nativeProfitAmount) : undefined,
825
644
  buyCount,
826
645
  sellCount,
827
- buyAmounts: buyAmountsWei.map(amt => ethers.formatEther(amt)),
828
- sellAmounts: sellAmountsWei.map(amt => ethers.formatUnits(amt, decimals))
829
- }
646
+ buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
647
+ sellAmounts: sellAmountsWei.map((amt) => ethers.formatUnits(amt, decimals)),
648
+ },
830
649
  };
831
650
  }