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
@@ -0,0 +1,456 @@
1
+ /**
2
+ * Four.meme 内盘捆绑换手(Merkle Bundle)- 先买后卖
3
+ *
4
+ * 功能:钱包B先买入代币 → 钱包A卖出相同数量 → 原子执行
5
+ */
6
+ import { ethers, Contract, Wallet } from 'ethers';
7
+ import { createSignProvider } from '../sign-context-helpers.js';
8
+ import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../utils/bundle-helpers.js';
9
+ import { ADDRESSES, BLOCKRAZOR_BUILDER_EOA, CHAINS, getProfitRateBps as getSharedProfitRateBps, } from '../../shared/constants/index.js';
10
+ import { TM_ABI, HELPER3_ABI, TM_ADDRESS } from './swap-internal.js';
11
+ import { getTxType, getGasPriceConfig, getProfitRecipient, getBribeAmount, } from '../config-helpers.js';
12
+ import { trySell } from '../../contracts/tm.js';
13
+ import { splitAmountByWeight as splitAmount } from '../../shared/foundation/amount/split-by-weight.js';
14
+ // ✅ 本地 getGasLimit(FourAnyConfig 支持 bigint gasLimit)
15
+ function getGasLimit(config, defaultGas = 800000) {
16
+ if (config.gasLimit !== undefined) {
17
+ return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
18
+ }
19
+ const multiplier = config.gasLimitMultiplier ?? 1.0;
20
+ return BigInt(Math.ceil(defaultGas * multiplier));
21
+ }
22
+ // ==================== 多笔买卖常量 ====================
23
+ /** 最大 Bundle 签名数 */
24
+ const MAX_BUNDLE_SIGNATURES = 50;
25
+ /** 贿赂交易数 */
26
+ const BRIBE_TX_COUNT = 1;
27
+ /** 利润中转交易数(支付者 1 笔 + 中转钱包 PROFIT_HOP_COUNT 笔 + 最终接收 1 笔) */
28
+ const PROFIT_TX_COUNT = PROFIT_HOP_COUNT + 2; // 2 + 2 = 4
29
+ /** 最大买卖交易数 */
30
+ const MAX_SWAP_TX_COUNT = MAX_BUNDLE_SIGNATURES - BRIBE_TX_COUNT - PROFIT_TX_COUNT; // 50 - 1 - 4 = 45
31
+ /**
32
+ * 根据 userType 获取每笔交易的利润率
33
+ */
34
+ function getProfitRatePerTxBps(userType) {
35
+ if (userType === 'v1') {
36
+ return getSharedProfitRateBps('v1Double');
37
+ }
38
+ return getSharedProfitRateBps('v0Double');
39
+ }
40
+ /**
41
+ * 验证买卖笔数
42
+ */
43
+ function validateSwapCounts(buyCount, sellCount) {
44
+ if (buyCount < 1) {
45
+ throw new Error(`买入笔数必须至少为 1,当前为 ${buyCount}`);
46
+ }
47
+ if (sellCount < 1) {
48
+ throw new Error(`卖出笔数必须至少为 1,当前为 ${sellCount}`);
49
+ }
50
+ const totalSwaps = buyCount + sellCount;
51
+ if (totalSwaps > MAX_SWAP_TX_COUNT) {
52
+ throw new Error(`买卖笔数总和 (${totalSwaps}) 超出限制 (${MAX_SWAP_TX_COUNT}),` +
53
+ `最大签名数为 ${MAX_BUNDLE_SIGNATURES}(${BRIBE_TX_COUNT} 贿赂 + ${PROFIT_TX_COUNT} 利润 + ${MAX_SWAP_TX_COUNT} 买卖)`);
54
+ }
55
+ }
56
+ export async function fourBundleBuyFirstMerkle(params) {
57
+ const { buyerPrivateKey, buyerPrivateKeys, buyerFunds, buyerFundsPercentage, sellerPrivateKey, sellerPrivateKeys, tokenAddress, config, buyCount: _buyCount, sellCount: _sellCount, } = params;
58
+ // ✅ 判断是否为多钱包模式
59
+ const isMultiWalletMode = !!(buyerPrivateKeys && buyerPrivateKeys.length > 0) || !!(sellerPrivateKeys && sellerPrivateKeys.length > 0);
60
+ const buyCount = _buyCount ?? 1;
61
+ const sellCount = _sellCount ?? 1;
62
+ // ✅ 多钱包模式:使用单独的处理逻辑
63
+ if (isMultiWalletMode) {
64
+ return await fourBundleBuyFirstMultiWallet({
65
+ buyerPrivateKeys: buyerPrivateKeys || (buyerPrivateKey ? [buyerPrivateKey] : []),
66
+ sellerPrivateKeys: sellerPrivateKeys || (sellerPrivateKey ? [sellerPrivateKey] : []),
67
+ tokenAddress,
68
+ buyerFunds,
69
+ config,
70
+ });
71
+ }
72
+ // ✅ 单钱包模式(向后兼容)
73
+ if (!buyerPrivateKey || !sellerPrivateKey) {
74
+ throw new Error('单钱包模式需要提供 buyerPrivateKey 和 sellerPrivateKey');
75
+ }
76
+ validateSwapCounts(buyCount, sellCount);
77
+ // ✅ 计算利润比例(根据 userType 动态调整)
78
+ const totalTxCount = buyCount + sellCount;
79
+ const profitRateBps = getProfitRatePerTxBps(config.userType) * totalTxCount;
80
+ const chainIdNum = config.chainId ?? CHAINS.BSC.chainId;
81
+ const provider = createSignProvider(config.rpcUrl, chainIdNum, 'BSC');
82
+ const buyer = new Wallet(buyerPrivateKey, provider);
83
+ const seller = new Wallet(sellerPrivateKey, provider);
84
+ const sameAddress = buyer.address.toLowerCase() === seller.address.toLowerCase();
85
+ const finalGasLimit = getGasLimit(config);
86
+ const txType = getTxType(config);
87
+ const nonceManager = new NonceManager(provider);
88
+ const reserveGas = ethers.parseEther((config.reserveGasBNB || 0.0005).toString());
89
+ // ✅ 优化:第一批并行 - buyerBalance、gasPrice
90
+ const [buyerBalance, gasPrice] = await Promise.all([
91
+ provider.getBalance(buyer.address),
92
+ getOptimizedGasPrice(provider, getGasPriceConfig(config)),
93
+ ]);
94
+ // 计算买方投入资金
95
+ let buyerFundsWei;
96
+ if (buyerFunds !== undefined) {
97
+ buyerFundsWei = ethers.parseEther(String(buyerFunds));
98
+ }
99
+ else if (buyerFundsPercentage !== undefined) {
100
+ const pct = Math.max(0, Math.min(100, buyerFundsPercentage));
101
+ const spendable = buyerBalance > reserveGas ? buyerBalance - reserveGas : 0n;
102
+ buyerFundsWei = (spendable * BigInt(Math.round(pct * 100))) / 10000n;
103
+ }
104
+ else {
105
+ throw new Error('必须提供 buyerFunds 或 buyerFundsPercentage');
106
+ }
107
+ if (buyerFundsWei <= 0n) {
108
+ throw new Error('buyerFunds 需要大于 0');
109
+ }
110
+ // ✅ 优化:第二批并行 - buyQuote、sellerTokenBal、decimals
111
+ const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
112
+ const erc20 = new Contract(tokenAddress, ['function balanceOf(address) view returns (uint256)', 'function decimals() view returns (uint8)'], provider);
113
+ const [buyQuote, sellerTokenBal, decimals] = await Promise.all([
114
+ helper3.tryBuy(tokenAddress, 0n, buyerFundsWei),
115
+ erc20.balanceOf(seller.address),
116
+ erc20.decimals(),
117
+ ]);
118
+ const estimatedTokenAmount = buyQuote.estimatedAmount ?? buyQuote[2];
119
+ if (!estimatedTokenAmount || estimatedTokenAmount <= 0n) {
120
+ throw new Error('报价失败:无法估算可买入的代币数量');
121
+ }
122
+ // ✅ 卖出数量直接使用估算的代币数量(无滑点保护)
123
+ const sellAmountWei = estimatedTokenAmount;
124
+ // 卖方余额检查
125
+ if (!sameAddress && sellerTokenBal < sellAmountWei) {
126
+ throw new Error(`卖方代币余额不足: 需要 ${ethers.formatUnits(sellAmountWei, decimals)},实际 ${ethers.formatUnits(sellerTokenBal, decimals)}`);
127
+ }
128
+ // ✅ 优化:第三批并行 - trySell、构建交易、获取 nonces
129
+ const tmBuyer = new Contract(TM_ADDRESS, TM_ABI, buyer);
130
+ const tmSeller = new Contract(TM_ADDRESS, TM_ABI, seller);
131
+ // ✅ 拆分买入和卖出金额
132
+ const buyAmountsWei = splitAmount(buyerFundsWei, buyCount);
133
+ const sellAmountsWei = splitAmount(sellAmountWei, sellCount);
134
+ // 预先规划 nonces
135
+ const extractProfit = true;
136
+ // ✅ 获取贿赂金额
137
+ const bribeAmount = getBribeAmount(config);
138
+ const needBribeTx = bribeAmount > 0n;
139
+ // ✅ 构建多笔买入和卖出交易
140
+ const buyUnsignedPromises = buyAmountsWei.map((amount) => tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, amount, 0n, { value: amount }));
141
+ const sellUnsignedPromises = sellAmountsWei.map((amount) => tmSeller.sellToken.populateTransaction(0n, tokenAddress, amount, 0n));
142
+ // ✅ 规划多笔交易 nonce(与 Flap 一致,不含授权)
143
+ const multiNoncePlan = await planMultiNonces({
144
+ buyer,
145
+ seller,
146
+ buyCount,
147
+ sellCount,
148
+ extractProfit,
149
+ needBribeTx,
150
+ sameAddress,
151
+ nonceManager,
152
+ });
153
+ const [sellResult, buyUnsignedArray, sellUnsignedArray] = await Promise.all([
154
+ trySell('BSC', config.rpcUrl, tokenAddress, sellAmountWei),
155
+ Promise.all(buyUnsignedPromises),
156
+ Promise.all(sellUnsignedPromises),
157
+ ]);
158
+ const estimatedSellFunds = sellResult.funds;
159
+ const profitAmount = extractProfit ? (estimatedSellFunds * BigInt(profitRateBps)) / 10000n : 0n;
160
+ // ✅ 贿赂交易放在首位
161
+ let bribeTx = null;
162
+ if (needBribeTx && multiNoncePlan.bribeNonce !== undefined) {
163
+ bribeTx = await seller.signTransaction({
164
+ to: BLOCKRAZOR_BUILDER_EOA,
165
+ value: bribeAmount,
166
+ nonce: multiNoncePlan.bribeNonce,
167
+ gasPrice,
168
+ gasLimit: 21000n,
169
+ chainId: BigInt(chainIdNum),
170
+ type: txType,
171
+ });
172
+ }
173
+ // ✅ 并行签名所有买入和卖出交易
174
+ const buySignPromises = buyUnsignedArray.map((unsigned, i) => buyer.signTransaction({
175
+ ...unsigned,
176
+ from: buyer.address,
177
+ nonce: multiNoncePlan.buyerNonces[i],
178
+ gasLimit: finalGasLimit,
179
+ gasPrice,
180
+ chainId: BigInt(chainIdNum),
181
+ type: txType,
182
+ value: buyAmountsWei[i],
183
+ }));
184
+ const sellSignPromises = sellUnsignedArray.map((unsigned, i) => seller.signTransaction({
185
+ ...unsigned,
186
+ from: seller.address,
187
+ nonce: multiNoncePlan.sellerNonces[i],
188
+ gasLimit: finalGasLimit,
189
+ gasPrice,
190
+ chainId: BigInt(chainIdNum),
191
+ type: txType,
192
+ value: 0n,
193
+ }));
194
+ const [signedBuys, signedSells] = await Promise.all([Promise.all(buySignPromises), Promise.all(sellSignPromises)]);
195
+ nonceManager.clearTemp();
196
+ // ✅ 组装交易列表:贿赂 → 买入(多笔) → 卖出(多笔)(与 Flap 一致)
197
+ const allTransactions = [];
198
+ if (bribeTx)
199
+ allTransactions.push(bribeTx);
200
+ allTransactions.push(...signedBuys, ...signedSells);
201
+ // ✅ 利润多跳转账(强制 2 跳中转)
202
+ let profitHopWallets;
203
+ if (extractProfit && profitAmount > 0n && multiNoncePlan.profitNonce !== undefined) {
204
+ const profitHopResult = await buildProfitHopTransactions({
205
+ provider,
206
+ payerWallet: seller,
207
+ profitAmount: profitAmount,
208
+ profitRecipient: getProfitRecipient(),
209
+ hopCount: PROFIT_HOP_COUNT,
210
+ gasPrice,
211
+ chainId: chainIdNum,
212
+ txType,
213
+ startNonce: multiNoncePlan.profitNonce,
214
+ });
215
+ allTransactions.push(...profitHopResult.signedTransactions);
216
+ profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
217
+ }
218
+ return {
219
+ signedTransactions: allTransactions,
220
+ profitHopWallets, // ✅ 返回利润多跳钱包
221
+ metadata: {
222
+ buyerAddress: buyer.address,
223
+ sellerAddress: seller.address,
224
+ buyAmount: ethers.formatEther(buyerFundsWei),
225
+ sellAmount: ethers.formatUnits(sellAmountWei, decimals),
226
+ profitAmount: extractProfit ? ethers.formatEther(profitAmount) : undefined,
227
+ // ✅ 返回多笔买卖信息
228
+ buyCount,
229
+ sellCount,
230
+ // ✅ 返回每笔交易的具体金额(随机分配后的数组)
231
+ buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
232
+ sellAmounts: sellAmountsWei.map((amt) => ethers.formatUnits(amt, decimals)),
233
+ },
234
+ };
235
+ }
236
+ /**
237
+ * ✅ 规划多笔交易 nonce(与 Flap 一致)
238
+ * 交易顺序:贿赂 → 买入(多笔) → 卖出(多笔) → 利润
239
+ */
240
+ async function planMultiNonces({ buyer, seller, buyCount, sellCount, extractProfit, needBribeTx, sameAddress, nonceManager, }) {
241
+ const profitNonceCount = extractProfit ? 1 : 0;
242
+ if (sameAddress) {
243
+ // 同一地址:贿赂(可选) + 买入(多笔) + 卖出(多笔) + 利润(可选)
244
+ const bribeTxCount = needBribeTx ? 1 : 0;
245
+ const totalTxCount = bribeTxCount + buyCount + sellCount + profitNonceCount;
246
+ const nonces = await nonceManager.getNextNonceBatch(buyer, totalTxCount);
247
+ let idx = 0;
248
+ const bribeNonce = needBribeTx ? nonces[idx++] : undefined;
249
+ const buyerNonces = nonces.slice(idx, idx + buyCount);
250
+ idx += buyCount;
251
+ const sellerNonces = nonces.slice(idx, idx + sellCount);
252
+ idx += sellCount;
253
+ const profitNonce = extractProfit ? nonces[idx] : undefined;
254
+ return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
255
+ }
256
+ // 不同地址
257
+ // 买方:buyCount 个 nonce
258
+ // 卖方:贿赂(可选) + sellCount + 利润(可选) 个 nonce
259
+ const bribeTxCount = needBribeTx ? 1 : 0;
260
+ const sellerTxCount = bribeTxCount + sellCount + profitNonceCount;
261
+ const [buyerNonces, sellerNoncesAll] = await Promise.all([
262
+ nonceManager.getNextNonceBatch(buyer, buyCount),
263
+ nonceManager.getNextNonceBatch(seller, sellerTxCount),
264
+ ]);
265
+ let idx = 0;
266
+ const bribeNonce = needBribeTx ? sellerNoncesAll[idx++] : undefined;
267
+ const sellerNonces = sellerNoncesAll.slice(idx, idx + sellCount);
268
+ idx += sellCount;
269
+ const profitNonce = extractProfit ? sellerNoncesAll[idx] : undefined;
270
+ return { buyerNonces, sellerNonces, bribeNonce, profitNonce };
271
+ }
272
+ /**
273
+ * ✅ Four 多钱包捆绑换手
274
+ * - 多个买方钱包执行买入(每个钱包1笔)
275
+ * - 多个卖方钱包执行卖出(每个钱包1笔)
276
+ * - 买入总价值 = 卖出总价值
277
+ * - ✅ 优化:最大化并行操作
278
+ */
279
+ async function fourBundleBuyFirstMultiWallet(params) {
280
+ const { buyerPrivateKeys, sellerPrivateKeys, tokenAddress, buyerFunds, config } = params;
281
+ const buyCount = buyerPrivateKeys.length;
282
+ const sellCount = sellerPrivateKeys.length;
283
+ if (buyCount === 0)
284
+ throw new Error('买方钱包数量不能为0');
285
+ if (sellCount === 0)
286
+ throw new Error('卖方钱包数量不能为0');
287
+ // 验证总交易数不超过限制
288
+ validateSwapCounts(buyCount, sellCount);
289
+ // ✅ 计算利润比例(根据 userType 动态调整)
290
+ const totalTxCount = buyCount + sellCount;
291
+ const profitRateBps = getProfitRatePerTxBps(config.userType) * totalTxCount;
292
+ const chainIdNum = config.chainId ?? CHAINS.BSC.chainId;
293
+ const provider = createSignProvider(config.rpcUrl, chainIdNum, 'BSC');
294
+ const nonceManager = new NonceManager(provider);
295
+ // 创建所有钱包实例
296
+ const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, provider));
297
+ const sellers = sellerPrivateKeys.map((pk) => new Wallet(pk, provider));
298
+ // 使用第一个卖方作为主卖方(支付贿赂和利润)
299
+ const mainSeller = sellers[0];
300
+ // ✅ 计算总交易金额
301
+ if (!buyerFunds) {
302
+ throw new Error('多钱包模式必须提供 buyerFunds(总交易金额)');
303
+ }
304
+ const totalFundsWei = ethers.parseEther(String(buyerFunds));
305
+ if (totalFundsWei <= 0n) {
306
+ throw new Error('交易金额必须大于0');
307
+ }
308
+ const finalGasLimit = getGasLimit(config);
309
+ const txType = getTxType(config);
310
+ const bribeAmount = getBribeAmount(config);
311
+ const needBribeTx = bribeAmount > 0n;
312
+ // ✅ 第一批并行:报价 + Gas价格 + 代币精度
313
+ const helper3 = new Contract(ADDRESSES.BSC.TokenManagerHelper3, HELPER3_ABI, provider);
314
+ const erc20 = new Contract(tokenAddress, ['function decimals() view returns (uint8)'], provider);
315
+ const [buyQuote, gasPrice, decimals] = await Promise.all([
316
+ helper3.tryBuy(tokenAddress, 0n, totalFundsWei),
317
+ getOptimizedGasPrice(provider, getGasPriceConfig(config)),
318
+ erc20.decimals(),
319
+ ]);
320
+ const estimatedTokenAmount = buyQuote.estimatedAmount ?? buyQuote[2];
321
+ if (!estimatedTokenAmount || estimatedTokenAmount <= 0n) {
322
+ throw new Error('报价失败:无法估算可买入的代币数量');
323
+ }
324
+ // ✅ 将总金额平均分配给买方
325
+ const buyAmountsWei = splitAmount(totalFundsWei, buyCount);
326
+ // ✅ 将代币平均分配给卖方
327
+ const sellAmountsWei = splitAmount(estimatedTokenAmount, sellCount);
328
+ // ✅ 第二批并行:估算利润 + 获取所有钱包 nonces
329
+ // 预先计算所有唯一钱包地址(去重)
330
+ const allWallets = [...sellers, ...buyers];
331
+ const uniqueWallets = allWallets.filter((w, i) => {
332
+ const addr = w.address.toLowerCase();
333
+ const firstIdx = allWallets.findIndex((x) => x.address.toLowerCase() === addr);
334
+ return firstIdx === i;
335
+ });
336
+ const [sellResult, noncesArray] = await Promise.all([
337
+ trySell('BSC', config.rpcUrl, tokenAddress, estimatedTokenAmount),
338
+ nonceManager.getNextNoncesForWallets(uniqueWallets),
339
+ ]);
340
+ // 构建 nonces Map
341
+ const noncesMap = new Map();
342
+ uniqueWallets.forEach((wallet, i) => {
343
+ noncesMap.set(wallet.address.toLowerCase(), noncesArray[i]);
344
+ });
345
+ const estimatedSellFunds = sellResult.funds;
346
+ const profitAmount = (estimatedSellFunds * BigInt(profitRateBps)) / 10000n;
347
+ // ✅ 第三批并行:构建并签名所有交易
348
+ const allTransactions = [];
349
+ const tm = new Contract(TM_ADDRESS, TM_ABI, provider);
350
+ // 1. 贿赂交易(由主卖方支付)- 先处理以确定 nonce 偏移
351
+ let bribeTxPromise = null;
352
+ if (needBribeTx) {
353
+ const mainSellerAddr = mainSeller.address.toLowerCase();
354
+ const bribeNonce = noncesMap.get(mainSellerAddr);
355
+ noncesMap.set(mainSellerAddr, bribeNonce + 1);
356
+ bribeTxPromise = mainSeller.signTransaction({
357
+ to: BLOCKRAZOR_BUILDER_EOA,
358
+ value: bribeAmount,
359
+ nonce: bribeNonce,
360
+ gasPrice,
361
+ gasLimit: 21000n,
362
+ chainId: BigInt(chainIdNum),
363
+ type: txType,
364
+ });
365
+ }
366
+ // 2. 预分配所有 nonces(同步操作,避免竞态)
367
+ const buyerNonces = [];
368
+ const sellerNonces = [];
369
+ buyers.forEach((buyer) => {
370
+ const addr = buyer.address.toLowerCase();
371
+ const nonce = noncesMap.get(addr);
372
+ buyerNonces.push(nonce);
373
+ noncesMap.set(addr, nonce + 1);
374
+ });
375
+ sellers.forEach((seller) => {
376
+ const addr = seller.address.toLowerCase();
377
+ const nonce = noncesMap.get(addr);
378
+ sellerNonces.push(nonce);
379
+ noncesMap.set(addr, nonce + 1);
380
+ });
381
+ // 3. 并行构建所有买入交易
382
+ const buyTxPromises = buyers.map(async (buyer, i) => {
383
+ const tmBuyer = tm.connect(buyer);
384
+ const unsigned = await tmBuyer.buyTokenAMAP.populateTransaction(0n, tokenAddress, buyer.address, buyAmountsWei[i], 0n, { value: buyAmountsWei[i] });
385
+ return buyer.signTransaction({
386
+ ...unsigned,
387
+ from: buyer.address,
388
+ nonce: buyerNonces[i],
389
+ gasLimit: finalGasLimit,
390
+ gasPrice,
391
+ chainId: BigInt(chainIdNum),
392
+ type: txType,
393
+ value: buyAmountsWei[i],
394
+ });
395
+ });
396
+ // 4. 并行构建所有卖出交易
397
+ const sellTxPromises = sellers.map(async (seller, i) => {
398
+ const tmSeller = tm.connect(seller);
399
+ const unsigned = await tmSeller.sellToken.populateTransaction(0n, tokenAddress, sellAmountsWei[i], 0n);
400
+ return seller.signTransaction({
401
+ ...unsigned,
402
+ from: seller.address,
403
+ nonce: sellerNonces[i],
404
+ gasLimit: finalGasLimit,
405
+ gasPrice,
406
+ chainId: BigInt(chainIdNum),
407
+ type: txType,
408
+ value: 0n,
409
+ });
410
+ });
411
+ // ✅ 并行签名所有交易(贿赂 + 买入 + 卖出)
412
+ const [bribeTx, signedBuys, signedSells] = await Promise.all([
413
+ bribeTxPromise,
414
+ Promise.all(buyTxPromises),
415
+ Promise.all(sellTxPromises),
416
+ ]);
417
+ // 组装交易顺序:贿赂 → 买入 → 卖出
418
+ if (bribeTx)
419
+ allTransactions.push(bribeTx);
420
+ allTransactions.push(...signedBuys, ...signedSells);
421
+ // 5. 利润多跳转账(由主卖方支付)
422
+ let profitHopWallets;
423
+ if (profitAmount > 0n) {
424
+ const mainSellerAddr = mainSeller.address.toLowerCase();
425
+ const profitNonce = noncesMap.get(mainSellerAddr);
426
+ const profitHopResult = await buildProfitHopTransactions({
427
+ provider,
428
+ payerWallet: mainSeller,
429
+ profitAmount,
430
+ profitRecipient: getProfitRecipient(),
431
+ hopCount: PROFIT_HOP_COUNT,
432
+ gasPrice,
433
+ chainId: chainIdNum,
434
+ txType,
435
+ startNonce: profitNonce,
436
+ });
437
+ allTransactions.push(...profitHopResult.signedTransactions);
438
+ profitHopWallets = profitHopResult.hopWallets;
439
+ }
440
+ nonceManager.clearTemp();
441
+ return {
442
+ signedTransactions: allTransactions,
443
+ profitHopWallets,
444
+ metadata: {
445
+ buyerAddress: buyers.map((b) => b.address).join(','),
446
+ sellerAddress: sellers.map((s) => s.address).join(','),
447
+ buyAmount: ethers.formatEther(totalFundsWei),
448
+ sellAmount: ethers.formatUnits(estimatedTokenAmount, decimals),
449
+ profitAmount: profitAmount > 0n ? ethers.formatEther(profitAmount) : undefined,
450
+ buyCount,
451
+ sellCount,
452
+ buyAmounts: buyAmountsWei.map((amt) => ethers.formatEther(amt)),
453
+ sellAmounts: sellAmountsWei.map((amt) => ethers.formatUnits(amt, decimals)),
454
+ },
455
+ };
456
+ }
@@ -0,0 +1,6 @@
1
+ import { Wallet, type JsonRpcProvider } from 'ethers';
2
+ import type { DisperseHopPath } from './types.js';
3
+ export declare const NATIVE_TRANSFER_GAS_LIMIT = 21055n;
4
+ export type { DisperseHopPath } from './types.js';
5
+ export declare function generateDisperseHopPaths(targetAddresses: string[], hopCount: number, provider: JsonRpcProvider): DisperseHopPath[];
6
+ export declare function buildNativeHopChain(payer: Wallet, path: DisperseHopPath, finalAmount: bigint, gasPrice: bigint, chainId: number, txType: 0 | 2, payerNonce: number): Promise<string[]>;
@@ -0,0 +1,63 @@
1
+ import { Wallet } from 'ethers';
2
+ import { generateWallets } from '../../utils/wallet.js';
3
+ export const NATIVE_TRANSFER_GAS_LIMIT = 21055n;
4
+ export function generateDisperseHopPaths(targetAddresses, hopCount, provider) {
5
+ if (hopCount <= 0) {
6
+ return targetAddresses.map((addr) => ({
7
+ targetAddress: addr,
8
+ hopWallets: [],
9
+ hopWalletsInfo: [],
10
+ }));
11
+ }
12
+ return targetAddresses.map((targetAddress) => {
13
+ const hopWalletsInfo = generateWallets(hopCount);
14
+ const hopWallets = hopWalletsInfo.map((w) => new Wallet(w.privateKey, provider));
15
+ return { targetAddress, hopWallets, hopWalletsInfo };
16
+ });
17
+ }
18
+ export async function buildNativeHopChain(payer, path, finalAmount, gasPrice, chainId, txType, payerNonce) {
19
+ const signedTxs = [];
20
+ const hopCount = path.hopWallets.length;
21
+ if (hopCount === 0) {
22
+ signedTxs.push(await payer.signTransaction({
23
+ to: path.targetAddress,
24
+ value: finalAmount,
25
+ nonce: payerNonce,
26
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
27
+ gasPrice,
28
+ chainId,
29
+ type: txType,
30
+ }));
31
+ return signedTxs;
32
+ }
33
+ const hopGasCost = NATIVE_TRANSFER_GAS_LIMIT * gasPrice;
34
+ const amountsPerHop = [];
35
+ for (let i = 0; i < hopCount; i++) {
36
+ const remainingHops = hopCount - i;
37
+ amountsPerHop.push(finalAmount + hopGasCost * BigInt(remainingHops));
38
+ }
39
+ signedTxs.push(await payer.signTransaction({
40
+ to: path.hopWallets[0].address,
41
+ value: amountsPerHop[0],
42
+ nonce: payerNonce,
43
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
44
+ gasPrice,
45
+ chainId,
46
+ type: txType,
47
+ }));
48
+ for (let i = 0; i < hopCount; i++) {
49
+ const fromWallet = path.hopWallets[i];
50
+ const toAddress = i === hopCount - 1 ? path.targetAddress : path.hopWallets[i + 1].address;
51
+ const amount = i === hopCount - 1 ? finalAmount : amountsPerHop[i + 1];
52
+ signedTxs.push(await fromWallet.signTransaction({
53
+ to: toAddress,
54
+ value: amount,
55
+ nonce: 0,
56
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
57
+ gasPrice,
58
+ chainId,
59
+ type: txType,
60
+ }));
61
+ }
62
+ return signedTxs;
63
+ }
@@ -0,0 +1,3 @@
1
+ export declare const TM_ABI: string[];
2
+ export declare const HELPER3_ABI: string[];
3
+ export declare const TM_ADDRESS: "0x5c952063c7fc8610FFDB798152D69F0B9550762b";
@@ -0,0 +1,18 @@
1
+ // 共享的 Swap 内部常量与 ABI
2
+ // ✅ 从公共模块重新导出
3
+ import { TM2_ABI, HELPER3_ABI as _HELPER3_ABI } from '../../abis/common.js';
4
+ import { ADDRESSES } from '../../shared/constants/index.js';
5
+ // ✅ Four.meme 内盘 ABI(与公共 TM2_ABI 扩展)
6
+ export const TM_ABI = [
7
+ ...TM2_ABI,
8
+ 'function sellToken(uint256 origin, address token, uint256 amount, uint256 minFunds) returns (uint256)',
9
+ 'function buyTokenAMAP(uint256 origin, address token, address to, uint256 funds, uint256 minAmount) payable returns (uint256)',
10
+ ];
11
+ // ✅ Helper3 ABI(与公共 HELPER3_ABI 扩展)
12
+ export const HELPER3_ABI = [
13
+ ..._HELPER3_ABI,
14
+ 'function tryBuy(address token, uint256 amount, uint256 funds) view returns (address tokenManager, address quote, uint256 estimatedAmount, uint256 estimatedCost, uint256 estimatedFee, uint256 amountMsgValue, uint256 amountApproval, uint256 amountFunds)',
15
+ 'function trySell(address token, uint256 amount) view returns (address tokenManager, address quote, uint256 funds, uint256 fee)',
16
+ ];
17
+ // ✅ Four.meme 使用 TokenManagerOriginal(代理合约已移除)
18
+ export const TM_ADDRESS = ADDRESSES.BSC.TokenManagerOriginal;
@@ -0,0 +1,28 @@
1
+ import { Wallet, type JsonRpcProvider } from 'ethers';
2
+ import { type CommonBundleConfig } from '../../utils/bundle-helpers.js';
3
+ import type { FourSwapSignConfig, SellerNoncePlan, UserType } from './types.js';
4
+ export type { SellerNoncePlan } from './types.js';
5
+ export declare function getFourSwapProfitRateBps(userType?: UserType): number;
6
+ export declare function needsTmTokenApproval(currentAllowance: bigint, decimals: number): boolean;
7
+ export declare function countSellerNonceSlots(needBribeTx: boolean, needApproval: boolean, includeProfit: boolean): number;
8
+ export declare function planSellerNonces(sellerNonces: number[], needBribeTx: boolean, needApproval: boolean, extractProfit: boolean): SellerNoncePlan;
9
+ export declare function signTmMaxApprovalTx(seller: Wallet, tokenAddress: string, approvalNonce: number, gasPrice: bigint, chainIdNum: number, txType: 0 | 2): Promise<string>;
10
+ export declare function quoteFourSwapSellFunds(provider: JsonRpcProvider, tokenAddress: string, sellAmountWei: bigint): Promise<bigint>;
11
+ export declare function fetchFourSwapSellQuoteAndAllowance(provider: JsonRpcProvider, tokenAddress: string, sellerAddress: string, sellAmountWei: bigint): Promise<{
12
+ sellFunds: bigint;
13
+ allowance: bigint;
14
+ }>;
15
+ export declare function fetchFourSwapSellQuoteAllowanceAndBalances(provider: JsonRpcProvider, tokenAddress: string, sellerAddress: string, sellAmountWei: bigint, buyerAddresses: string[]): Promise<{
16
+ sellFunds: bigint;
17
+ allowance: bigint;
18
+ buyerBalances: bigint[];
19
+ }>;
20
+ export declare function toCommonBundleConfig(config: FourSwapSignConfig): CommonBundleConfig;
21
+ export type FourSwapGasContext = {
22
+ chainIdNum: number;
23
+ provider: JsonRpcProvider;
24
+ bundleConfig: CommonBundleConfig;
25
+ finalGasLimit: bigint;
26
+ txType: 0 | 2;
27
+ };
28
+ export declare function createFourSwapGasContext(config: FourSwapSignConfig): FourSwapGasContext;