four-flap-meme-sdk 2.2.18 → 2.2.20

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