four-flap-meme-sdk 2.2.19 → 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 (493) 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/pcs-infinity-cl.js +18 -54
  453. package/dist/utils/private-sale.d.ts +2 -58
  454. package/dist/utils/private-sale.js +4 -15
  455. package/dist/utils/provider-factory.d.ts +4 -0
  456. package/dist/utils/provider-factory.js +10 -0
  457. package/dist/utils/quote-helpers.d.ts +4 -45
  458. package/dist/utils/quote-helpers.js +17 -74
  459. package/dist/utils/stealth-transfer.d.ts +2 -28
  460. package/dist/utils/stealth-transfer.js +39 -19
  461. package/dist/utils/swap-helpers.d.ts +2 -15
  462. package/dist/utils/swap-helpers.js +6 -11
  463. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  464. package/dist/utils/types/airdrop-sweep.js +1 -0
  465. package/dist/utils/types/contract-factory.d.ts +1 -0
  466. package/dist/utils/types/contract-factory.js +1 -0
  467. package/dist/utils/types/erc20.d.ts +1 -0
  468. package/dist/utils/types/erc20.js +1 -0
  469. package/dist/utils/types/errors.d.ts +1 -0
  470. package/dist/utils/types/errors.js +1 -0
  471. package/dist/utils/types/holders-maker.d.ts +1 -0
  472. package/dist/utils/types/holders-maker.js +1 -0
  473. package/dist/utils/types/hop-chains.d.ts +8 -0
  474. package/dist/utils/types/hop-chains.js +1 -0
  475. package/dist/utils/types/index.d.ts +13 -0
  476. package/dist/utils/types/index.js +1 -0
  477. package/dist/utils/types/lp-inspect.d.ts +1 -0
  478. package/dist/utils/types/lp-inspect.js +1 -0
  479. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  480. package/dist/utils/types/mpc-exclusive.js +1 -0
  481. package/dist/utils/types/private-sale.d.ts +1 -0
  482. package/dist/utils/types/private-sale.js +1 -0
  483. package/dist/utils/types/quote-helpers.d.ts +1 -0
  484. package/dist/utils/types/quote-helpers.js +1 -0
  485. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  486. package/dist/utils/types/stealth-transfer.js +1 -0
  487. package/dist/utils/types/wallet.d.ts +25 -0
  488. package/dist/utils/types/wallet.js +1 -0
  489. package/dist/utils/wallet.d.ts +4 -25
  490. package/dist/utils/wallet.js +27 -22
  491. package/dist/vanity/index.d.ts +5 -0
  492. package/dist/vanity/index.js +5 -0
  493. package/package.json +100 -2
@@ -0,0 +1,182 @@
1
+ import { ethers, Contract } from 'ethers';
2
+ import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
3
+ import { FLAP_PORTAL_ADDRESSES } from '../constants.js';
4
+ import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
5
+ import { ERC20_ALLOWANCE_ABI } from '../../abis/common.js';
6
+ import { getGasPriceConfig, getTxType, getProfitRecipient, PORTAL_ABI } from './config.js';
7
+ import { getProfitRateBps as getSharedProfitRateBps } from '../../constants/index.js';
8
+ import { getErrorMessageFromUnknown } from '../../foundation/index.js';
9
+ import { createSignProvider } from '../../../bundle-core/sign-context-helpers.js';
10
+ import { APPROVE_INTERFACE, ERC20_BALANCE_OF_ABI, getChainId, getNativeTokenName, } from './swap-helpers.js';
11
+ const providerCache = new Map();
12
+ const PROVIDER_CACHE_TTL_MS = 60 * 1000;
13
+ export function createChainContext(chain, config) {
14
+ const chainId = config.chainId ?? getChainId(chain);
15
+ const nativeToken = getNativeTokenName(chain);
16
+ const portalAddress = FLAP_PORTAL_ADDRESSES[chain.toUpperCase()];
17
+ const cacheKey = `${chain}-${config.rpcUrl}`;
18
+ const now = Date.now();
19
+ const cached = providerCache.get(cacheKey);
20
+ let provider;
21
+ if (cached && cached.expireAt > now) {
22
+ provider = cached.provider;
23
+ }
24
+ else {
25
+ provider = createSignProvider(config.rpcUrl, chainId, chain.toUpperCase());
26
+ providerCache.set(cacheKey, { provider, expireAt: now + PROVIDER_CACHE_TTL_MS });
27
+ }
28
+ return { chainId, nativeToken, portalAddress, provider };
29
+ }
30
+ export async function buildApprovalTransaction({ tokenAddress, seller, provider, decimals, portalAddress, chainId, config, }) {
31
+ const erc20 = new Contract(tokenAddress, ERC20_ALLOWANCE_ABI, provider);
32
+ const currentAllowance = await erc20.allowance(seller.address, portalAddress);
33
+ const threshold = ethers.parseUnits('1000000000', decimals);
34
+ if (currentAllowance >= threshold) {
35
+ return null;
36
+ }
37
+ const nonceManager = new NonceManager(provider);
38
+ const approvalNonce = await nonceManager.getNextNonce(seller);
39
+ const gasPrice = await getOptimizedGasPrice(provider, getGasPriceConfig(config));
40
+ const txType = getTxType(config);
41
+ return await seller.signTransaction({
42
+ to: tokenAddress,
43
+ data: APPROVE_INTERFACE.encodeFunctionData('approve', [portalAddress, ethers.MaxUint256]),
44
+ value: 0n,
45
+ nonce: approvalNonce,
46
+ gasLimit: 80000n,
47
+ gasPrice,
48
+ chainId,
49
+ type: txType,
50
+ });
51
+ }
52
+ export async function quoteSellOutput({ portalAddress, tokenAddress, sellAmountWei, provider, skipQuoteOnError, outputToken = ZERO_ADDRESS, }) {
53
+ const portal = new Contract(portalAddress, PORTAL_ABI, provider);
54
+ try {
55
+ const quotedNative = await portal.quoteExactInput.staticCall({
56
+ inputToken: tokenAddress,
57
+ outputToken,
58
+ inputAmount: sellAmountWei,
59
+ });
60
+ return { quotedNative, minOutNative: 0n };
61
+ }
62
+ catch (err) {
63
+ if (skipQuoteOnError ?? true) {
64
+ return { quotedNative: 0n, minOutNative: 0n };
65
+ }
66
+ throw new Error(`卖出报价失败: ${getErrorMessageFromUnknown(err)}`);
67
+ }
68
+ }
69
+ export async function calculateBuyerNeed({ buyer, quotedNative, reserveGasEth, nativeToken, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider, }) {
70
+ const reserveGas = ethers.parseEther((reserveGasEth || 0.0005).toString());
71
+ let buyerBalance;
72
+ if (useNativeToken) {
73
+ buyerBalance = await buyer.provider.getBalance(buyer.address);
74
+ }
75
+ else {
76
+ const erc20 = new Contract(quoteToken, ERC20_BALANCE_OF_ABI, provider || buyer.provider);
77
+ buyerBalance = await erc20.balanceOf(buyer.address);
78
+ }
79
+ const estimatedBuyerNeed = quotedNative;
80
+ const buyerNeedTotal = useNativeToken ? estimatedBuyerNeed + reserveGas : estimatedBuyerNeed;
81
+ if (buyerBalance < buyerNeedTotal) {
82
+ if (useNativeToken) {
83
+ throw new Error(`买方余额不足:\n` +
84
+ ` - 需要: ${ethers.formatEther(buyerNeedTotal)} ${nativeToken}\n` +
85
+ ` - 实际: ${ethers.formatEther(buyerBalance)} ${nativeToken}`);
86
+ }
87
+ else {
88
+ throw new Error(`买方代币余额不足:\n` +
89
+ ` - 需要: ${ethers.formatUnits(buyerNeedTotal, quoteTokenDecimals)}\n` +
90
+ ` - 实际: ${ethers.formatUnits(buyerBalance, quoteTokenDecimals)}`);
91
+ }
92
+ }
93
+ const maxBuyerValue = estimatedBuyerNeed > 0n ? estimatedBuyerNeed : useNativeToken ? buyerBalance - reserveGas : buyerBalance;
94
+ return { reserveGas, buyerBalance, buyerNeedTotal, maxBuyerValue };
95
+ }
96
+ export async function validateBalances({ buyerAddress, portalGasCost, provider, chainContext, seller, useNativeToken, }) {
97
+ const sellerBalance = await provider.getBalance(seller.address);
98
+ if (!useNativeToken) {
99
+ const buyerBnbBalance = await provider.getBalance(buyerAddress);
100
+ const buyerGasCost = portalGasCost;
101
+ if (buyerBnbBalance < buyerGasCost) {
102
+ throw new Error(`买方 BNB 余额不足 (用于支付 Gas):\n` +
103
+ ` - 需要: ${ethers.formatEther(buyerGasCost)} ${chainContext.nativeToken}\n` +
104
+ ` - 实际: ${ethers.formatEther(buyerBnbBalance)} ${chainContext.nativeToken}`);
105
+ }
106
+ }
107
+ if (sellerBalance < portalGasCost) {
108
+ throw new Error(`卖方余额不足: 需要 ${ethers.formatEther(portalGasCost)} ${chainContext.nativeToken} (Gas),实际 ${ethers.formatEther(sellerBalance)} ${chainContext.nativeToken}`);
109
+ }
110
+ }
111
+ export function buildNoncePlan(startNonces, approvalExists, extractProfit, needBribeTx) {
112
+ let sellerNonce = startNonces[0];
113
+ const buyerNonce = startNonces[1];
114
+ let bribeNonce;
115
+ let profitNonce;
116
+ if (needBribeTx)
117
+ bribeNonce = sellerNonce++;
118
+ if (approvalExists)
119
+ sellerNonce++;
120
+ const sellNonce = sellerNonce++;
121
+ if (extractProfit)
122
+ profitNonce = sellerNonce;
123
+ return { sellerNonce: sellNonce, buyerNonce, bribeNonce, profitNonce };
124
+ }
125
+ export async function planNonces({ seller, buyer, approvalExists, extractProfit, needBribeTx, nonceManager, }) {
126
+ if (needBribeTx || approvalExists || extractProfit) {
127
+ const sellerTxCount = countTruthy([needBribeTx, approvalExists, true, extractProfit]);
128
+ const [sellerNonces, buyerNonces] = await Promise.all([
129
+ nonceManager.getNextNonceBatch(seller, sellerTxCount),
130
+ nonceManager.getNextNoncesForWallets([buyer]),
131
+ ]);
132
+ let idx = 0;
133
+ const bribeNonce = needBribeTx ? sellerNonces[idx++] : undefined;
134
+ if (approvalExists)
135
+ idx++;
136
+ const sellerNonce = sellerNonces[idx++];
137
+ const profitNonce = extractProfit ? sellerNonces[idx] : undefined;
138
+ const buyerNonce = buyerNonces[0];
139
+ return { sellerNonce, buyerNonce, bribeNonce, profitNonce };
140
+ }
141
+ const nonces = await nonceManager.getNextNoncesForWallets([seller, buyer]);
142
+ return { sellerNonce: nonces[0], buyerNonce: nonces[1] };
143
+ }
144
+ export async function buildProfitTransaction({ provider, seller, profitAmount, profitNonce, gasPrice, chainId, txType, }) {
145
+ if (!profitNonce || profitAmount === 0n) {
146
+ return null;
147
+ }
148
+ const profitHopResult = await buildProfitHopTransactions({
149
+ provider,
150
+ payerWallet: seller,
151
+ profitAmount,
152
+ profitRecipient: getProfitRecipient(),
153
+ hopCount: PROFIT_HOP_COUNT,
154
+ gasPrice,
155
+ chainId,
156
+ txType,
157
+ startNonce: profitNonce,
158
+ });
159
+ return {
160
+ signedTransactions: profitHopResult.signedTransactions,
161
+ hopWallets: profitHopResult.hopWallets,
162
+ };
163
+ }
164
+ function getProfitRateBps(userType) {
165
+ if (userType === 'v0') {
166
+ return getSharedProfitRateBps('v0Single');
167
+ }
168
+ else if (userType === 'v1') {
169
+ return getSharedProfitRateBps('v1Single');
170
+ }
171
+ return getSharedProfitRateBps('v0Single');
172
+ }
173
+ export function calculateProfitAmount(quotedNative, userType) {
174
+ if (quotedNative <= 0n) {
175
+ return 0n;
176
+ }
177
+ const rateBps = getProfitRateBps(userType);
178
+ return (quotedNative * BigInt(rateBps)) / 10000n;
179
+ }
180
+ function countTruthy(values) {
181
+ return values.filter(Boolean).length;
182
+ }
@@ -0,0 +1,16 @@
1
+ import type { FlapQuickBatchSwapSignParams, FlapQuickBatchSwapResult } from './swap-types.js';
2
+ /**
3
+ * Flap 内盘快捷批量换手(资金利用率模式)
4
+ *
5
+ * 流程:[贿赂] → [卖出] → [转账多跳...] → [买入1, 买入2, ...] → [利润]
6
+ *
7
+ * 特点:
8
+ * - 子钱包不需要预先有余额
9
+ * - 资金来自主钱包卖出代币所得
10
+ * - 提升资金利用率
11
+ * - 支持原生代币(BNB/OKB/ETH)和 ERC20(如 USDT)两种模式
12
+ * - ✅ 支持转账多跳,隐藏资金流向
13
+ *
14
+ * 限制:根据多跳数动态计算最大买方数量
15
+ */
16
+ export declare function flapQuickBatchSwapMerkle(params: FlapQuickBatchSwapSignParams): Promise<FlapQuickBatchSwapResult>;
@@ -0,0 +1,327 @@
1
+ /**
2
+ * swap-quick-batch - 快捷批量换手(资金利用率模式)
3
+ */
4
+ import { ethers, Contract, Wallet } from 'ethers';
5
+ import { calculateSellAmount } from '../../../utils/swap-helpers.js';
6
+ import { NonceManager, getOptimizedGasPrice, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
7
+ import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
8
+ import { ERC20_ABI } from '../../abis/common.js';
9
+ import { getGasPriceConfig, getTxType, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, PORTAL_ABI, } from './config.js';
10
+ import { buildTransactionRequest } from '../../foundation/tx/build-request.js';
11
+ import { GAS_LIMITS } from '../../constants/index.js';
12
+ import { BRIBE_GAS_LIMIT, NATIVE_TRANSFER_GAS_LIMIT, buildBNBHopChainForERC20, buildERC20HopChain, buildNativeHopChain, generateDisperseHopPaths, getGasLimit, getTokenToNativeQuote, } from './swap-helpers.js';
13
+ import { buildProfitTransaction, calculateProfitAmount, createChainContext, quoteSellOutput, } from './swap-planning.js';
14
+ /**
15
+ * Flap 内盘快捷批量换手(资金利用率模式)
16
+ *
17
+ * 流程:[贿赂] → [卖出] → [转账多跳...] → [买入1, 买入2, ...] → [利润]
18
+ *
19
+ * 特点:
20
+ * - 子钱包不需要预先有余额
21
+ * - 资金来自主钱包卖出代币所得
22
+ * - 提升资金利用率
23
+ * - 支持原生代币(BNB/OKB/ETH)和 ERC20(如 USDT)两种模式
24
+ * - ✅ 支持转账多跳,隐藏资金流向
25
+ *
26
+ * 限制:根据多跳数动态计算最大买方数量
27
+ */
28
+ export async function flapQuickBatchSwapMerkle(params) {
29
+ const { chain, sellerPrivateKey, sellAmount, sellPercentage, buyerPrivateKeys, buyerRatios, buyerAmounts, tokenAddress, config, quoteToken, quoteTokenDecimals = 18, disperseHopCount = 0, // ✅ 转账多跳数(默认0=直接转账)
30
+ startNonces, // ✅ 可选:前端预获取的 nonces
31
+ } = params;
32
+ // ✅ 判断是否使用原生代币
33
+ const useNativeToken = !quoteToken || quoteToken === ZERO_ADDRESS;
34
+ // ✅ 动态计算最大买方数量(根据多跳数)
35
+ // 固定开销: 贿赂(1) + 卖出(1) + 利润多跳(PROFIT_HOP_COUNT + 1)
36
+ const fixedOverhead = 1 + 1 + PROFIT_HOP_COUNT + 1;
37
+ const maxTxs = 50 - fixedOverhead;
38
+ let MAX_BUYERS;
39
+ if (useNativeToken) {
40
+ // 原生代币模式: N*(H+2) <= maxTxs
41
+ MAX_BUYERS = Math.floor(maxTxs / (disperseHopCount + 2));
42
+ }
43
+ else {
44
+ // ERC20 模式: N*(2H+3) <= maxTxs
45
+ MAX_BUYERS = Math.floor(maxTxs / (2 * disperseHopCount + 3));
46
+ }
47
+ MAX_BUYERS = Math.max(1, MAX_BUYERS);
48
+ if (buyerPrivateKeys.length === 0) {
49
+ throw new Error('至少需要一个买方钱包');
50
+ }
51
+ if (buyerPrivateKeys.length > MAX_BUYERS) {
52
+ const mode = useNativeToken ? '原生代币' : 'ERC20';
53
+ throw new Error(`资金利用率模式(${mode}, ${disperseHopCount}跳)买方钱包数量超过限制: ${buyerPrivateKeys.length} > ${MAX_BUYERS}`);
54
+ }
55
+ // ✅ 校验分配模式
56
+ if (!buyerRatios && !buyerAmounts) {
57
+ throw new Error('必须提供 buyerRatios 或 buyerAmounts');
58
+ }
59
+ if (buyerRatios && buyerRatios.length !== buyerPrivateKeys.length) {
60
+ throw new Error(`buyerRatios 长度 (${buyerRatios.length}) 与 buyerPrivateKeys 长度 (${buyerPrivateKeys.length}) 不匹配`);
61
+ }
62
+ if (buyerAmounts && buyerAmounts.length !== buyerPrivateKeys.length) {
63
+ throw new Error(`buyerAmounts 长度 (${buyerAmounts.length}) 与 buyerPrivateKeys 长度 (${buyerPrivateKeys.length}) 不匹配`);
64
+ }
65
+ const outputToken = useNativeToken ? ZERO_ADDRESS : quoteToken;
66
+ const ERC20_TRANSFER_GAS = GAS_LIMITS.ERC20_TRANSFER;
67
+ const chainContext = createChainContext(chain, config);
68
+ const seller = new Wallet(sellerPrivateKey, chainContext.provider);
69
+ const buyers = buyerPrivateKeys.map((pk) => new Wallet(pk, chainContext.provider));
70
+ const nonceManager = new NonceManager(chainContext.provider);
71
+ const finalGasLimit = getGasLimit(config);
72
+ const txType = getTxType(config);
73
+ // ✅ 并行获取:卖出数量、gasPrice
74
+ const [sellAmountResult, gasPrice] = await Promise.all([
75
+ calculateSellAmount(chainContext.provider, tokenAddress, seller.address, sellAmount, sellPercentage),
76
+ getOptimizedGasPrice(chainContext.provider, getGasPriceConfig(config)),
77
+ ]);
78
+ const { amount: sellAmountWei, decimals } = sellAmountResult;
79
+ const priorityFee = gasPrice / 10n === 0n ? 1n : gasPrice / 10n;
80
+ // ✅ 获取卖出报价
81
+ const quote = await quoteSellOutput({
82
+ portalAddress: chainContext.portalAddress,
83
+ tokenAddress,
84
+ sellAmountWei,
85
+ provider: chainContext.provider,
86
+ skipQuoteOnError: config.skipQuoteOnError,
87
+ outputToken,
88
+ });
89
+ const estimatedOutput = quote.quotedNative;
90
+ // ✅ 计算利润(根据 userType 动态调整)
91
+ const tokenProfitAmount = calculateProfitAmount(estimatedOutput, config.userType);
92
+ let nativeProfitAmount = tokenProfitAmount;
93
+ if (!useNativeToken && tokenProfitAmount > 0n) {
94
+ // ERC20 模式:将代币利润转换为等值原生代币
95
+ nativeProfitAmount = await getTokenToNativeQuote(chainContext.provider, quoteToken, tokenProfitAmount, chainContext.chainId);
96
+ }
97
+ const distributableAmount = useNativeToken ? estimatedOutput - tokenProfitAmount : estimatedOutput; // ERC20 模式利润从原生代币扣
98
+ // ✅ 计算每个买方分到的金额
99
+ let transferAmountsWei;
100
+ if (buyerAmounts && buyerAmounts.length === buyers.length) {
101
+ // 数量模式
102
+ transferAmountsWei = buyerAmounts.map((amt) => useNativeToken ? ethers.parseEther(amt) : ethers.parseUnits(amt, quoteTokenDecimals));
103
+ const totalTransfer = transferAmountsWei.reduce((a, b) => a + b, 0n);
104
+ if (totalTransfer > distributableAmount) {
105
+ const formatted = useNativeToken
106
+ ? ethers.formatEther(distributableAmount)
107
+ : ethers.formatUnits(distributableAmount, quoteTokenDecimals);
108
+ throw new Error(`指定的买入总金额超过可分配金额 (${formatted})`);
109
+ }
110
+ }
111
+ else if (buyerRatios && buyerRatios.length === buyers.length) {
112
+ // 比例模式
113
+ transferAmountsWei = buyerRatios.map((ratio) => {
114
+ return (distributableAmount * BigInt(Math.round(ratio * 10000))) / 10000n;
115
+ });
116
+ }
117
+ else {
118
+ throw new Error('必须提供 buyerRatios 或 buyerAmounts');
119
+ }
120
+ // ✅ 获取贿赂金额
121
+ const bribeAmount = getBribeAmount(config);
122
+ // ✅ 验证主钱包余额
123
+ const sellerBalance = await seller.provider.getBalance(seller.address);
124
+ let sellerGasCost;
125
+ let sellerRequired;
126
+ if (useNativeToken) {
127
+ // 原生代币模式:贿赂 + Gas(卖出 + 转账 + 利润)
128
+ sellerGasCost =
129
+ gasPrice * (BRIBE_GAS_LIMIT + finalGasLimit + BRIBE_GAS_LIMIT * BigInt(buyers.length) + BRIBE_GAS_LIMIT);
130
+ sellerRequired = bribeAmount + sellerGasCost;
131
+ }
132
+ else {
133
+ // ERC20 模式:贿赂 + Gas(卖出 + ERC20转账 + 利润)
134
+ sellerGasCost =
135
+ gasPrice * (BRIBE_GAS_LIMIT + finalGasLimit + ERC20_TRANSFER_GAS * BigInt(buyers.length) + BRIBE_GAS_LIMIT);
136
+ sellerRequired = bribeAmount + sellerGasCost;
137
+ }
138
+ if (sellerBalance < sellerRequired) {
139
+ throw new Error(`主钱包 ${chainContext.nativeToken} 余额不足: 需要约 ${ethers.formatEther(sellerRequired)} (贿赂: ${ethers.formatEther(bribeAmount)}, Gas: ${ethers.formatEther(sellerGasCost)}), 实际 ${ethers.formatEther(sellerBalance)}`);
140
+ }
141
+ // ==================== 规划 Nonce ====================
142
+ // ✅ 如果前端传入了 startNonces,直接使用(性能优化)
143
+ let sellerNonce = startNonces && startNonces.length > 0 ? startNonces[0] : await nonceManager.getNextNonce(seller);
144
+ // ==================== 1. 贿赂交易 ====================
145
+ let bribeTx = null;
146
+ if (bribeAmount > 0n) {
147
+ bribeTx = await seller.signTransaction({
148
+ to: BLOCKRAZOR_BUILDER_EOA,
149
+ value: bribeAmount,
150
+ nonce: sellerNonce++,
151
+ gasPrice,
152
+ gasLimit: BRIBE_GAS_LIMIT,
153
+ chainId: chainContext.chainId,
154
+ type: txType,
155
+ });
156
+ }
157
+ // ==================== 2. 卖出交易 ====================
158
+ const portalSeller = new Contract(chainContext.portalAddress, PORTAL_ABI, seller);
159
+ const sellUnsigned = await portalSeller.swapExactInput.populateTransaction({
160
+ inputToken: tokenAddress,
161
+ outputToken,
162
+ inputAmount: sellAmountWei,
163
+ minOutputAmount: 0,
164
+ permitData: '0x',
165
+ });
166
+ const sellTx = buildTransactionRequest(sellUnsigned, {
167
+ from: seller.address,
168
+ nonce: sellerNonce++,
169
+ gasLimit: finalGasLimit,
170
+ gasPrice,
171
+ priorityFee,
172
+ chainId: chainContext.chainId,
173
+ txType,
174
+ value: 0n,
175
+ });
176
+ const signedSell = await seller.signTransaction(sellTx);
177
+ // ==================== 3. 转账交易(支持多跳)====================
178
+ const reserveGas = ethers.parseEther((config.reserveGasETH || 0.0005).toString());
179
+ const buyerGasCost = gasPrice * finalGasLimit;
180
+ // ✅ 生成多跳路径
181
+ const hopPaths = generateDisperseHopPaths(buyers.map((b) => b.address), disperseHopCount, chainContext.provider);
182
+ // 收集所有中间钱包信息
183
+ const allHopWallets = [];
184
+ hopPaths.forEach((path) => {
185
+ allHopWallets.push(...path.hopWalletsInfo);
186
+ });
187
+ let transferTxs;
188
+ if (disperseHopCount === 0) {
189
+ // ✅ 无多跳:直接转账
190
+ const transferNonces = buyers.map((_, i) => sellerNonce + i);
191
+ sellerNonce += buyers.length;
192
+ if (useNativeToken) {
193
+ transferTxs = await Promise.all(buyers.map((buyer, i) => {
194
+ const transferValue = transferAmountsWei[i] + reserveGas + buyerGasCost;
195
+ return seller.signTransaction({
196
+ to: buyer.address,
197
+ value: transferValue,
198
+ nonce: transferNonces[i],
199
+ gasPrice,
200
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
201
+ chainId: chainContext.chainId,
202
+ type: txType,
203
+ });
204
+ }));
205
+ }
206
+ else {
207
+ const erc20Interface = new ethers.Interface(ERC20_ABI);
208
+ transferTxs = await Promise.all(buyers.map((buyer, i) => {
209
+ const transferData = erc20Interface.encodeFunctionData('transfer', [buyer.address, transferAmountsWei[i]]);
210
+ return seller.signTransaction({
211
+ to: quoteToken,
212
+ data: transferData,
213
+ value: 0n,
214
+ nonce: transferNonces[i],
215
+ gasPrice,
216
+ gasLimit: ERC20_TRANSFER_GAS,
217
+ chainId: chainContext.chainId,
218
+ type: txType,
219
+ });
220
+ }));
221
+ }
222
+ }
223
+ else {
224
+ // ✅ 有多跳:构建多跳转账链
225
+ if (useNativeToken) {
226
+ // 原生代币多跳转账
227
+ // ✅ 修复:payer 每次只发送 1 笔交易(到第一个hop钱包),hop钱包用自己的nonce=0
228
+ const hopChains = await Promise.all(hopPaths.map((path, i) => {
229
+ const finalAmount = transferAmountsWei[i] + reserveGas + buyerGasCost;
230
+ const payerNonce = sellerNonce + i; // ✅ payer 每个 buyer 只用 1 个 nonce
231
+ return buildNativeHopChain(seller, path, finalAmount, gasPrice, chainContext.chainId, txType, payerNonce);
232
+ }));
233
+ transferTxs = hopChains.flat();
234
+ sellerNonce += buyers.length; // ✅ payer 只增加 buyers.length 个 nonce
235
+ }
236
+ else {
237
+ // ERC20 多跳转账:先转 BNB(给中间钱包 gas),再转 ERC20
238
+ // ✅ 修复:payer 每次只发送 1 笔交易(到第一个hop钱包),hop钱包用自己的nonce=0/1
239
+ // 1. 构建 BNB 多跳链
240
+ const bnbHopChains = await Promise.all(hopPaths.map((path, i) => {
241
+ const finalGasAmount = buyerGasCost;
242
+ const payerNonce = sellerNonce + i; // ✅ payer 每个 buyer 只用 1 个 nonce
243
+ return buildBNBHopChainForERC20(seller, path, finalGasAmount, gasPrice, chainContext.chainId, txType, payerNonce);
244
+ }));
245
+ const bnbTxs = bnbHopChains.flat();
246
+ sellerNonce += buyers.length; // ✅ payer 只增加 buyers.length 个 nonce
247
+ // 2. 构建 ERC20 多跳链
248
+ const erc20HopChains = await Promise.all(hopPaths.map((path, i) => {
249
+ const payerNonce = sellerNonce + i; // ✅ payer 每个 buyer 只用 1 个 nonce
250
+ return buildERC20HopChain(seller, path, quoteToken, transferAmountsWei[i], gasPrice, chainContext.chainId, txType, payerNonce);
251
+ }));
252
+ const erc20Txs = erc20HopChains.flat();
253
+ sellerNonce += buyers.length; // ✅ payer 只增加 buyers.length 个 nonce
254
+ transferTxs = [...bnbTxs, ...erc20Txs];
255
+ }
256
+ }
257
+ // ==================== 4. 买入交易 ====================
258
+ // ✅ 如果前端传入了 startNonces,使用 buyer 部分(从索引 1 开始)
259
+ const buyerNonces = startNonces && startNonces.length > 1
260
+ ? startNonces.slice(1)
261
+ : await Promise.all(buyers.map((buyer) => nonceManager.getNextNonce(buyer)));
262
+ const signedBuys = await Promise.all(buyers.map(async (buyer, i) => {
263
+ const buyAmount = transferAmountsWei[i];
264
+ const portalBuyer = new Contract(chainContext.portalAddress, PORTAL_ABI, buyer);
265
+ const buyUnsigned = await portalBuyer.swapExactInput.populateTransaction({
266
+ inputToken: outputToken,
267
+ outputToken: tokenAddress,
268
+ inputAmount: buyAmount,
269
+ minOutputAmount: 0,
270
+ permitData: '0x',
271
+ }, useNativeToken ? { value: buyAmount } : {});
272
+ const buyTx = buildTransactionRequest(buyUnsigned, {
273
+ from: buyer.address,
274
+ nonce: buyerNonces[i],
275
+ gasLimit: finalGasLimit,
276
+ gasPrice,
277
+ priorityFee,
278
+ chainId: chainContext.chainId,
279
+ txType,
280
+ value: useNativeToken ? buyAmount : 0n,
281
+ });
282
+ return buyer.signTransaction(buyTx);
283
+ }));
284
+ nonceManager.clearTemp();
285
+ // ==================== 组装交易数组 ====================
286
+ const signedTransactions = [];
287
+ if (bribeTx)
288
+ signedTransactions.push(bribeTx);
289
+ signedTransactions.push(signedSell);
290
+ signedTransactions.push(...transferTxs);
291
+ signedTransactions.push(...signedBuys);
292
+ // ==================== 5. 利润多跳转账(强制 2 跳中转)====================
293
+ let profitHopWallets;
294
+ if (nativeProfitAmount > 0n) {
295
+ const profitResult = await buildProfitTransaction({
296
+ provider: chainContext.provider,
297
+ seller,
298
+ profitAmount: nativeProfitAmount,
299
+ profitNonce: sellerNonce++,
300
+ gasPrice,
301
+ chainId: chainContext.chainId,
302
+ txType,
303
+ });
304
+ if (profitResult) {
305
+ signedTransactions.push(...profitResult.signedTransactions);
306
+ profitHopWallets = profitResult.hopWallets; // ✅ 收集利润多跳钱包
307
+ }
308
+ // 多跳交易已签名
309
+ }
310
+ return {
311
+ signedTransactions,
312
+ disperseHopWallets: allHopWallets.length > 0 ? allHopWallets : undefined, // ✅ 返回转账多跳钱包
313
+ profitHopWallets, // ✅ 返回利润多跳钱包
314
+ metadata: {
315
+ sellerAddress: seller.address,
316
+ buyerAddresses: buyers.map((b) => b.address),
317
+ sellAmount: ethers.formatUnits(sellAmountWei, decimals),
318
+ estimatedOutput: useNativeToken
319
+ ? ethers.formatEther(estimatedOutput)
320
+ : ethers.formatUnits(estimatedOutput, quoteTokenDecimals),
321
+ transferAmounts: transferAmountsWei.map((amt) => useNativeToken ? ethers.formatEther(amt) : ethers.formatUnits(amt, quoteTokenDecimals)),
322
+ profitAmount: nativeProfitAmount > 0n ? ethers.formatEther(nativeProfitAmount) : undefined,
323
+ useNativeToken,
324
+ disperseHopCount: disperseHopCount > 0 ? disperseHopCount : undefined, // ✅ 返回多跳数
325
+ },
326
+ };
327
+ }
@@ -0,0 +1,2 @@
1
+ import { FlapBundleSwapSignParams, FlapSwapResult } from './swap-helpers.js';
2
+ export declare function flapBundleSwapMerkle(params: FlapBundleSwapSignParams): Promise<FlapSwapResult>;