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,565 @@
1
+ import { ethers, Wallet, Contract } from 'ethers';
2
+ import { generateWallets } from '../../../utils/wallet.js';
3
+ import { V2_ROUTER_ABI, V3_ROUTER02_ABI, ERC20_BALANCE_ABI, ERC20_ABI } from '../../../abis/common.js';
4
+ import { createSignProvider } from '../../../bundle-core/sign-context-helpers.js';
5
+ import { quoteV2, quoteV3 } from '../../../utils/quote-helpers.js';
6
+ import { GAS_LIMITS, CHAINS } from '../../../shared/constants/index.js';
7
+ import { getDeadline } from '../../../utils/bundle-helpers.js';
8
+ import { ADDRESSES } from '../../../shared/constants/index.js';
9
+ // ==================== 多跳转账常量(使用统一常量) ====================
10
+ export const NATIVE_TRANSFER_GAS_LIMIT = GAS_LIMITS.NATIVE_TRANSFER;
11
+ export const ERC20_TRANSFER_GAS_LIMIT_HOP = GAS_LIMITS.ERC20_TRANSFER;
12
+ export const BRIBE_GAS_LIMIT = GAS_LIMITS.BRIBE;
13
+ /**
14
+ * 生成分发多跳路径
15
+ */
16
+ export function generateDisperseHopPaths(targetAddresses, hopCount, provider) {
17
+ if (hopCount <= 0) {
18
+ return targetAddresses.map((addr) => ({
19
+ targetAddress: addr,
20
+ hopWallets: [],
21
+ hopWalletsInfo: [],
22
+ }));
23
+ }
24
+ return targetAddresses.map((targetAddress) => {
25
+ const hopWalletsInfo = generateWallets(hopCount);
26
+ const hopWallets = hopWalletsInfo.map((w) => new Wallet(w.privateKey, provider));
27
+ return { targetAddress, hopWallets, hopWalletsInfo };
28
+ });
29
+ }
30
+ /**
31
+ * 构建原生代币多跳转账链
32
+ */
33
+ export async function buildNativeHopChain(payer, path, finalAmount, gasPrice, chainId, txType, payerNonce) {
34
+ const signedTxs = [];
35
+ const hopCount = path.hopWallets.length;
36
+ if (hopCount === 0) {
37
+ const tx = {
38
+ to: path.targetAddress,
39
+ value: finalAmount,
40
+ nonce: payerNonce,
41
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
42
+ chainId,
43
+ type: txType,
44
+ };
45
+ if (txType === 2) {
46
+ tx.maxFeePerGas = gasPrice;
47
+ tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
48
+ }
49
+ else {
50
+ tx.gasPrice = gasPrice;
51
+ }
52
+ signedTxs.push(await payer.signTransaction(tx));
53
+ return signedTxs;
54
+ }
55
+ const hopGasCost = NATIVE_TRANSFER_GAS_LIMIT * gasPrice;
56
+ // 计算每跳需要的金额
57
+ const amountsPerHop = [];
58
+ for (let i = 0; i < hopCount; i++) {
59
+ const remainingHops = hopCount - i;
60
+ amountsPerHop.push(finalAmount + hopGasCost * BigInt(remainingHops));
61
+ }
62
+ // payer → hop1
63
+ const firstTx = {
64
+ to: path.hopWallets[0].address,
65
+ value: amountsPerHop[0],
66
+ nonce: payerNonce,
67
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
68
+ chainId,
69
+ type: txType,
70
+ };
71
+ if (txType === 2) {
72
+ firstTx.maxFeePerGas = gasPrice;
73
+ firstTx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
74
+ }
75
+ else {
76
+ firstTx.gasPrice = gasPrice;
77
+ }
78
+ signedTxs.push(await payer.signTransaction(firstTx));
79
+ // hop1 → hop2 → ... → target
80
+ for (let i = 0; i < hopCount; i++) {
81
+ const fromWallet = path.hopWallets[i];
82
+ const toAddress = i === hopCount - 1 ? path.targetAddress : path.hopWallets[i + 1].address;
83
+ const amount = i === hopCount - 1 ? finalAmount : amountsPerHop[i + 1];
84
+ const tx = {
85
+ to: toAddress,
86
+ value: amount,
87
+ nonce: 0,
88
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
89
+ chainId,
90
+ type: txType,
91
+ };
92
+ if (txType === 2) {
93
+ tx.maxFeePerGas = gasPrice;
94
+ tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
95
+ }
96
+ else {
97
+ tx.gasPrice = gasPrice;
98
+ }
99
+ signedTxs.push(await fromWallet.signTransaction(tx));
100
+ }
101
+ return signedTxs;
102
+ }
103
+ /**
104
+ * 构建 ERC20 多跳转账链(需要配合 BNB 多跳使用)
105
+ */
106
+ export async function buildERC20HopChain(payer, path, erc20Address, erc20Amount, gasPrice, chainId, txType, payerNonce) {
107
+ const signedTxs = [];
108
+ const hopCount = path.hopWallets.length;
109
+ const erc20Interface = new ethers.Interface(ERC20_ABI);
110
+ if (hopCount === 0) {
111
+ const data = erc20Interface.encodeFunctionData('transfer', [path.targetAddress, erc20Amount]);
112
+ const tx = {
113
+ to: erc20Address,
114
+ data,
115
+ value: 0n,
116
+ nonce: payerNonce,
117
+ gasLimit: ERC20_TRANSFER_GAS_LIMIT_HOP,
118
+ chainId,
119
+ type: txType,
120
+ };
121
+ if (txType === 2) {
122
+ tx.maxFeePerGas = gasPrice;
123
+ tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
124
+ }
125
+ else {
126
+ tx.gasPrice = gasPrice;
127
+ }
128
+ signedTxs.push(await payer.signTransaction(tx));
129
+ return signedTxs;
130
+ }
131
+ // payer → hop1
132
+ const firstData = erc20Interface.encodeFunctionData('transfer', [path.hopWallets[0].address, erc20Amount]);
133
+ const firstTx = {
134
+ to: erc20Address,
135
+ data: firstData,
136
+ value: 0n,
137
+ nonce: payerNonce,
138
+ gasLimit: ERC20_TRANSFER_GAS_LIMIT_HOP,
139
+ chainId,
140
+ type: txType,
141
+ };
142
+ if (txType === 2) {
143
+ firstTx.maxFeePerGas = gasPrice;
144
+ firstTx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
145
+ }
146
+ else {
147
+ firstTx.gasPrice = gasPrice;
148
+ }
149
+ signedTxs.push(await payer.signTransaction(firstTx));
150
+ // hop1 → hop2 → ... → target (nonce=1,nonce=0 用于 BNB 转发)
151
+ for (let i = 0; i < hopCount; i++) {
152
+ const fromWallet = path.hopWallets[i];
153
+ const toAddress = i === hopCount - 1 ? path.targetAddress : path.hopWallets[i + 1].address;
154
+ const data = erc20Interface.encodeFunctionData('transfer', [toAddress, erc20Amount]);
155
+ const tx = {
156
+ to: erc20Address,
157
+ data,
158
+ value: 0n,
159
+ nonce: 1, // nonce=0 已用于 BNB 转发
160
+ gasLimit: ERC20_TRANSFER_GAS_LIMIT_HOP,
161
+ chainId,
162
+ type: txType,
163
+ };
164
+ if (txType === 2) {
165
+ tx.maxFeePerGas = gasPrice;
166
+ tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
167
+ }
168
+ else {
169
+ tx.gasPrice = gasPrice;
170
+ }
171
+ signedTxs.push(await fromWallet.signTransaction(tx));
172
+ }
173
+ return signedTxs;
174
+ }
175
+ /**
176
+ * 构建 BNB 多跳转账链(为 ERC20 中间钱包预留 gas)
177
+ */
178
+ export async function buildBNBHopChainForERC20(payer, path, finalGasAmount, gasPrice, chainId, txType, payerNonce) {
179
+ const signedTxs = [];
180
+ const hopCount = path.hopWallets.length;
181
+ if (hopCount === 0) {
182
+ // 无多跳时不需要转 gas
183
+ return signedTxs;
184
+ }
185
+ const hopGasCost = NATIVE_TRANSFER_GAS_LIMIT * gasPrice;
186
+ const erc20GasCost = ERC20_TRANSFER_GAS_LIMIT_HOP * gasPrice;
187
+ // 每个中间钱包需要: BNB 转发 gas + ERC20 转发 gas
188
+ const gasPerHop = hopGasCost + erc20GasCost * 2n; // 2倍安全系数
189
+ // 计算每跳需要的金额
190
+ const amountsPerHop = [];
191
+ for (let i = 0; i < hopCount; i++) {
192
+ const remainingHops = hopCount - i;
193
+ amountsPerHop.push(finalGasAmount + gasPerHop * BigInt(remainingHops));
194
+ }
195
+ // payer → hop1
196
+ const firstTx = {
197
+ to: path.hopWallets[0].address,
198
+ value: amountsPerHop[0],
199
+ nonce: payerNonce,
200
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
201
+ chainId,
202
+ type: txType,
203
+ };
204
+ if (txType === 2) {
205
+ firstTx.maxFeePerGas = gasPrice;
206
+ firstTx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
207
+ }
208
+ else {
209
+ firstTx.gasPrice = gasPrice;
210
+ }
211
+ signedTxs.push(await payer.signTransaction(firstTx));
212
+ // hop1 → hop2 → ... → target (nonce=0)
213
+ for (let i = 0; i < hopCount; i++) {
214
+ const fromWallet = path.hopWallets[i];
215
+ const toAddress = i === hopCount - 1 ? path.targetAddress : path.hopWallets[i + 1].address;
216
+ const amount = i === hopCount - 1 ? finalGasAmount : amountsPerHop[i + 1];
217
+ const tx = {
218
+ to: toAddress,
219
+ value: amount,
220
+ nonce: 0,
221
+ gasLimit: NATIVE_TRANSFER_GAS_LIMIT,
222
+ chainId,
223
+ type: txType,
224
+ };
225
+ if (txType === 2) {
226
+ tx.maxFeePerGas = gasPrice;
227
+ tx.maxPriorityFeePerGas = gasPrice / 10n || 1n;
228
+ }
229
+ else {
230
+ tx.gasPrice = gasPrice;
231
+ }
232
+ signedTxs.push(await fromWallet.signTransaction(tx));
233
+ }
234
+ return signedTxs;
235
+ }
236
+ // ==================== 工具函数 ====================
237
+ export function createPancakeContext(config) {
238
+ const chainId = config.chainId ?? CHAINS.BSC.chainId;
239
+ const provider = createSignProvider(config.rpcUrl, chainId);
240
+ return { chainId, provider };
241
+ }
242
+ export async function quoteSellOutput({ routeParams, sellAmountWei, provider, v2RouterAddress, }) {
243
+ if (routeParams.routeType === 'v2') {
244
+ const { v2Path } = routeParams;
245
+ const tokenIn = v2Path[0];
246
+ const tokenOut = v2Path[v2Path.length - 1];
247
+ const result = await quoteV2(provider, tokenIn, tokenOut, sellAmountWei, 'BSC', v2RouterAddress);
248
+ if (result.amountOut > 0n) {
249
+ return { estimatedBNBOut: result.amountOut };
250
+ }
251
+ throw new Error('V2 报价失败: 所有路径均无效');
252
+ }
253
+ // ==================== V3 单跳报价 ====================
254
+ if (routeParams.routeType === 'v3-single') {
255
+ const params = routeParams;
256
+ const result = await quoteV3(provider, params.v3TokenIn, params.v3TokenOut, sellAmountWei, 'BSC', params.v3Fee);
257
+ if (result.amountOut > 0n) {
258
+ return { estimatedBNBOut: result.amountOut };
259
+ }
260
+ // ❌ V3 报价失败时不再 fallback 到 V2,因为价格可能差异很大
261
+ throw new Error(`V3 单跳报价失败: tokenIn=${params.v3TokenIn}, tokenOut=${params.v3TokenOut}, fee=${params.v3Fee}`);
262
+ }
263
+ // ==================== V3 多跳报价 ====================
264
+ if (routeParams.routeType === 'v3-multi') {
265
+ const params = routeParams;
266
+ if (params.v3LpAddresses && params.v3LpAddresses.length > 0) {
267
+ const tokenIn = params.v3ExactTokenIn;
268
+ const WBNB = ADDRESSES.BSC.WBNB;
269
+ const result = await quoteV3(provider, tokenIn, WBNB, sellAmountWei, 'BSC');
270
+ if (result.amountOut > 0n) {
271
+ return { estimatedBNBOut: result.amountOut };
272
+ }
273
+ }
274
+ // ❌ V3 多跳报价失败时不再 fallback 到 V2,因为价格可能差异很大
275
+ throw new Error(`V3 多跳报价失败: LPs=${params.v3LpAddresses?.join(', ')}, tokenIn=${params.v3ExactTokenIn}`);
276
+ }
277
+ throw new Error(`不支持的路由类型: ${routeParams.routeType}`);
278
+ }
279
+ export async function buildSwapTransactions({ routeParams, sellAmountWei, buyAmountBNB, buyer, seller, tokenAddress, useNativeToken = true, v2RouterAddress, }) {
280
+ void tokenAddress;
281
+ const deadline = getDeadline();
282
+ const buyValue = useNativeToken ? buyAmountBNB + FLAT_FEE : 0n;
283
+ if (routeParams.routeType === 'v2') {
284
+ const { v2Path } = routeParams;
285
+ const reversePath = [...v2Path].reverse();
286
+ const routerAddr = v2RouterAddress || PANCAKE_V2_ROUTER_ADDRESS;
287
+ const v2RouterSeller = new Contract(routerAddr, PANCAKE_V2_ROUTER_ABI, seller);
288
+ const v2RouterBuyer = new Contract(routerAddr, PANCAKE_V2_ROUTER_ABI, buyer);
289
+ let sellUnsigned;
290
+ let buyUnsigned;
291
+ if (useNativeToken) {
292
+ // ✅ 原生代币模式(BNB)
293
+ // 卖出:Token → WBNB → BNB
294
+ sellUnsigned = await v2RouterSeller.swapExactTokensForETHSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
295
+ // 买入:BNB → WBNB → Token
296
+ buyUnsigned = await v2RouterBuyer.swapExactETHForTokensSupportingFeeOnTransferTokens.populateTransaction(0n, reversePath, buyer.address, deadline, { value: buyValue });
297
+ }
298
+ else {
299
+ // ✅ ERC20 模式(如 USDT)
300
+ // 卖出:Token → USDT
301
+ sellUnsigned = await v2RouterSeller.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(sellAmountWei, 0n, v2Path, seller.address, deadline);
302
+ // 买入:USDT → Token
303
+ buyUnsigned = await v2RouterBuyer.swapExactTokensForTokensSupportingFeeOnTransferTokens.populateTransaction(buyAmountBNB, // USDT 数量
304
+ 0n, reversePath, buyer.address, deadline);
305
+ }
306
+ return { sellUnsigned, buyUnsigned };
307
+ }
308
+ if (routeParams.routeType === 'v3-single') {
309
+ const { v3TokenIn, v3TokenOut, v3Fee } = routeParams;
310
+ const v3RouterIface = new ethers.Interface(PANCAKE_V3_ROUTER_ABI);
311
+ const v3RouterSeller = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, seller);
312
+ const v3RouterBuyer = new Contract(PANCAKE_V3_ROUTER_ADDRESS, PANCAKE_V3_ROUTER_ABI, buyer);
313
+ // 卖出:Token → WBNB,需要 unwrapWETH9
314
+ const sellSwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
315
+ {
316
+ tokenIn: v3TokenIn,
317
+ tokenOut: v3TokenOut,
318
+ fee: v3Fee,
319
+ recipient: PANCAKE_V3_ROUTER_ADDRESS, // 先发给 Router
320
+ amountIn: sellAmountWei,
321
+ amountOutMinimum: 0n,
322
+ sqrtPriceLimitX96: 0n,
323
+ },
324
+ ]);
325
+ const sellUnwrapData = v3RouterIface.encodeFunctionData('unwrapWETH9', [0n, seller.address]);
326
+ const sellUnsigned = await v3RouterSeller.multicall.populateTransaction(deadline, [sellSwapData, sellUnwrapData]);
327
+ // 买入:WBNB → Token
328
+ const buySwapData = v3RouterIface.encodeFunctionData('exactInputSingle', [
329
+ {
330
+ tokenIn: v3TokenOut,
331
+ tokenOut: v3TokenIn,
332
+ fee: v3Fee,
333
+ recipient: buyer.address,
334
+ amountIn: buyAmountBNB,
335
+ amountOutMinimum: 0n,
336
+ sqrtPriceLimitX96: 0n,
337
+ },
338
+ ]);
339
+ const buyUnsigned = await v3RouterBuyer.multicall.populateTransaction(deadline, [buySwapData], { value: buyValue });
340
+ return { sellUnsigned, buyUnsigned };
341
+ }
342
+ // V3 多跳暂不支持官方合约
343
+ throw new Error('V3 多跳路由暂不支持官方合约,请使用 V2 路由或 V3 单跳');
344
+ }
345
+ export async function calculateBuyerBudget({ buyer, quotedBNBOut, reserveGasBNB, useNativeToken = true, quoteToken, quoteTokenDecimals = 18, provider, }) {
346
+ const reserveGas = ethers.parseEther((reserveGasBNB ?? 0.0005).toString());
347
+ // ✅ 已移除滑点保护:直接使用报价金额
348
+ const buyAmountBNB = quotedBNBOut;
349
+ // ✅ 根据是否使用原生代币获取不同的余额
350
+ let buyerBalance;
351
+ if (useNativeToken) {
352
+ buyerBalance = await buyer.provider.getBalance(buyer.address);
353
+ const requiredBalance = buyAmountBNB + FLAT_FEE + reserveGas;
354
+ if (buyerBalance < requiredBalance) {
355
+ throw new Error(`买方余额不足: 需要 ${ethers.formatEther(requiredBalance)} BNB, 实际 ${ethers.formatEther(buyerBalance)} BNB`);
356
+ }
357
+ return { buyerBalance, reserveGas, requiredBalance, buyAmountBNB, useNativeToken };
358
+ }
359
+ else {
360
+ // ERC20 代币余额
361
+ const erc20 = new Contract(quoteToken, ERC20_BALANCE_OF_ABI, provider || buyer.provider);
362
+ buyerBalance = await erc20.balanceOf(buyer.address);
363
+ const requiredBalance = buyAmountBNB + FLAT_FEE; // ERC20 不需要预留 Gas 在代币余额中
364
+ if (buyerBalance < requiredBalance) {
365
+ throw new Error(`买方代币余额不足: 需要 ${ethers.formatUnits(requiredBalance, quoteTokenDecimals)}, 实际 ${ethers.formatUnits(buyerBalance, quoteTokenDecimals)}`);
366
+ }
367
+ // ✅ ERC20 购买时,还需要检查买方是否有足够 BNB 支付 Gas
368
+ const buyerBnbBalance = await buyer.provider.getBalance(buyer.address);
369
+ if (buyerBnbBalance < reserveGas) {
370
+ throw new Error(`买方 BNB 余额不足 (用于支付 Gas): 需要 ${ethers.formatEther(reserveGas)} BNB, 实际 ${ethers.formatEther(buyerBnbBalance)} BNB`);
371
+ }
372
+ return { buyerBalance, reserveGas, requiredBalance, buyAmountBNB, useNativeToken };
373
+ }
374
+ }
375
+ /**
376
+ * ✅ 从前端传入的 startNonces 构建 NoncePlan(用于性能优化)
377
+ * 顺序:[sellerBaseNonce, buyerNonce]
378
+ */
379
+ export function buildNoncePlanFromNonces(startNonces, sameAddress, approvalExists, profitNeeded, needBribeTx) {
380
+ if (sameAddress) {
381
+ let idx = 0;
382
+ const bribeNonce = needBribeTx ? startNonces[0] + idx++ : undefined;
383
+ if (approvalExists)
384
+ idx++;
385
+ const sellerNonce = startNonces[0] + idx++;
386
+ const buyerNonce = startNonces[0] + idx++;
387
+ const profitNonce = profitNeeded ? startNonces[0] + idx : undefined;
388
+ return { sellerNonce, buyerNonce, bribeNonce, profitNonce };
389
+ }
390
+ let sellerIdx = 0;
391
+ const bribeNonce = needBribeTx ? startNonces[0] + sellerIdx++ : undefined;
392
+ if (approvalExists)
393
+ sellerIdx++;
394
+ const sellerNonce = startNonces[0] + sellerIdx++;
395
+ const profitNonce = profitNeeded ? startNonces[0] + sellerIdx : undefined;
396
+ const buyerNonce = startNonces[1];
397
+ return { sellerNonce, buyerNonce, bribeNonce, profitNonce };
398
+ }
399
+ /**
400
+ * ✅ 规划 nonce
401
+ * 交易顺序:贿赂 → 授权 → 卖出 → 买入 → 利润
402
+ * 贿赂和利润由卖方发送
403
+ */
404
+ export async function planNonces({ seller, buyer, sameAddress, approvalExists, profitNeeded, needBribeTx, nonceManager, }) {
405
+ if (sameAddress) {
406
+ // 同一地址:贿赂(可选) + 授权(可选) + 卖出 + 买入 + 利润(可选)
407
+ const txCount = countTruthy([needBribeTx, approvalExists, true, true, profitNeeded]);
408
+ const nonces = await nonceManager.getNextNonceBatch(buyer, txCount);
409
+ let idx = 0;
410
+ const bribeNonce = needBribeTx ? nonces[idx++] : undefined;
411
+ if (approvalExists)
412
+ idx++;
413
+ const sellerNonce = nonces[idx++];
414
+ const buyerNonce = nonces[idx++];
415
+ const profitNonce = profitNeeded ? nonces[idx] : undefined;
416
+ return { sellerNonce, buyerNonce, bribeNonce, profitNonce };
417
+ }
418
+ if (needBribeTx || approvalExists || profitNeeded) {
419
+ // 卖方需要多个 nonce:贿赂(可选) + 授权(可选) + 卖出 + 利润(可选)
420
+ const sellerTxCount = countTruthy([needBribeTx, approvalExists, true, profitNeeded]);
421
+ // ✅ 并行获取 seller 和 buyer 的 nonce
422
+ const [sellerNonces, buyerNonce] = await Promise.all([
423
+ nonceManager.getNextNonceBatch(seller, sellerTxCount),
424
+ nonceManager.getNextNonce(buyer),
425
+ ]);
426
+ let idx = 0;
427
+ const bribeNonce = needBribeTx ? sellerNonces[idx++] : undefined;
428
+ if (approvalExists)
429
+ idx++;
430
+ const sellerNonce = sellerNonces[idx++];
431
+ const profitNonce = profitNeeded ? sellerNonces[idx] : undefined;
432
+ return { sellerNonce, buyerNonce, bribeNonce, profitNonce };
433
+ }
434
+ // ✅ 并行获取 seller 和 buyer 的 nonce
435
+ const [sellerNonce, buyerNonce] = await Promise.all([
436
+ nonceManager.getNextNonce(seller),
437
+ nonceManager.getNextNonce(buyer),
438
+ ]);
439
+ return { sellerNonce, buyerNonce };
440
+ }
441
+ /**
442
+ * 根据 userType 计算利润率
443
+ */
444
+ export function getProfitRateBps(userType) {
445
+ if (userType === 'v0') {
446
+ return 4; // 0.06%
447
+ }
448
+ else if (userType === 'v1') {
449
+ return 5; // 0.05%
450
+ }
451
+ return 4; // 默认 0.06%
452
+ }
453
+ export function calculateProfitAmount(estimatedBNBOut, userType) {
454
+ if (estimatedBNBOut <= 0n) {
455
+ return 0n;
456
+ }
457
+ const rateBps = getProfitRateBps(userType);
458
+ return (estimatedBNBOut * BigInt(rateBps)) / 10000n;
459
+ }
460
+ /**
461
+ * ✅ 获取 ERC20 代币 → 原生代币(BNB)的报价
462
+ * 用于将 ERC20 利润转换为 BNB
463
+ * 使用共享的报价函数
464
+ */
465
+ export async function getERC20ToNativeQuote(provider, tokenAddress, tokenAmount, version = 'v2', fee) {
466
+ if (tokenAmount <= 0n)
467
+ return 0n;
468
+ const tokenLower = tokenAddress.toLowerCase();
469
+ const wbnbLower = WBNB_ADDRESS.toLowerCase();
470
+ // 如果代币本身就是 WBNB,直接返回
471
+ if (tokenLower === wbnbLower) {
472
+ return tokenAmount;
473
+ }
474
+ // 使用共享的报价函数
475
+ if (version === 'v3') {
476
+ const result = await quoteV3(provider, tokenAddress, WBNB_ADDRESS, tokenAmount, 'BSC', fee);
477
+ if (result.amountOut > 0n) {
478
+ return result.amountOut;
479
+ }
480
+ return 0n;
481
+ }
482
+ const result = await quoteV2(provider, tokenAddress, WBNB_ADDRESS, tokenAmount, 'BSC');
483
+ return result.amountOut > 0n ? result.amountOut : 0n;
484
+ }
485
+ export async function validateFinalBalances({ sameAddress, buyerBalance, buyAmountBNB, reserveGas, gasLimit, gasPrice, useNativeToken = true, quoteTokenDecimals = 18, provider, buyerAddress, }) {
486
+ const gasCost = gasLimit * gasPrice;
487
+ if (sameAddress) {
488
+ // 同一地址:需要足够的余额支付两笔交易
489
+ if (useNativeToken) {
490
+ const requiredCombined = buyAmountBNB + FLAT_FEE * 2n + gasCost * 2n;
491
+ if (buyerBalance < requiredCombined) {
492
+ throw new Error(`账户余额不足:\n - 需要: ${ethers.formatEther(requiredCombined)} BNB(含两笔Gas与两笔手续费)\n - 实际: ${ethers.formatEther(buyerBalance)} BNB`);
493
+ }
494
+ }
495
+ else {
496
+ // ERC20:检查代币余额 + BNB Gas 余额
497
+ const requiredToken = buyAmountBNB + FLAT_FEE * 2n;
498
+ if (buyerBalance < requiredToken) {
499
+ throw new Error(`账户代币余额不足:\n - 需要: ${ethers.formatUnits(requiredToken, quoteTokenDecimals)}\n - 实际: ${ethers.formatUnits(buyerBalance, quoteTokenDecimals)}`);
500
+ }
501
+ // 检查 BNB Gas
502
+ if (provider && buyerAddress) {
503
+ const bnbBalance = await provider.getBalance(buyerAddress);
504
+ const requiredGas = gasCost * 2n;
505
+ if (bnbBalance < requiredGas) {
506
+ throw new Error(`账户 BNB 余额不足 (用于支付 Gas):\n - 需要: ${ethers.formatEther(requiredGas)} BNB\n - 实际: ${ethers.formatEther(bnbBalance)} BNB`);
507
+ }
508
+ }
509
+ }
510
+ return;
511
+ }
512
+ // 不同地址
513
+ if (useNativeToken) {
514
+ const requiredBuyer = buyAmountBNB + FLAT_FEE + reserveGas;
515
+ if (buyerBalance < requiredBuyer) {
516
+ throw new Error(`买方余额不足:\n - 需要: ${ethers.formatEther(requiredBuyer)} BNB\n - 实际: ${ethers.formatEther(buyerBalance)} BNB`);
517
+ }
518
+ }
519
+ // ERC20 余额已在 calculateBuyerBudget 中检查过
520
+ }
521
+ export function countTruthy(values) {
522
+ return values.filter(Boolean).length;
523
+ }
524
+ /**
525
+ * 获取 Gas Limit
526
+ */
527
+ export function getGasLimit(config, defaultGas = 800000) {
528
+ if (config.gasLimit !== undefined) {
529
+ return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
530
+ }
531
+ const multiplier = config.gasLimitMultiplier ?? 1.0;
532
+ const calculatedGas = Math.ceil(defaultGas * multiplier);
533
+ return BigInt(calculatedGas);
534
+ }
535
+ export async function getGasPrice(provider, config) {
536
+ const feeData = await provider.getFeeData();
537
+ let gasPrice = feeData.gasPrice || ethers.parseUnits('3', 'gwei');
538
+ if (config.minGasPriceGwei) {
539
+ const minGas = ethers.parseUnits(config.minGasPriceGwei.toString(), 'gwei');
540
+ if (gasPrice < minGas)
541
+ gasPrice = minGas;
542
+ }
543
+ if (config.maxGasPriceGwei) {
544
+ const maxGas = ethers.parseUnits(config.maxGasPriceGwei.toString(), 'gwei');
545
+ if (gasPrice > maxGas)
546
+ gasPrice = maxGas;
547
+ }
548
+ return gasPrice;
549
+ }
550
+ // ✅ ABI 别名(从公共模块导入)
551
+ export const PANCAKE_V2_ROUTER_ABI = V2_ROUTER_ABI;
552
+ export const PANCAKE_V3_ROUTER_ABI = V3_ROUTER02_ABI;
553
+ export const ERC20_BALANCE_OF_ABI = ERC20_BALANCE_ABI;
554
+ // ✅ 使用官方 PancakeSwap Router 地址
555
+ export const PANCAKE_V2_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV2Router;
556
+ export const PANCAKE_V3_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV3Router;
557
+ // 常量
558
+ export const FLAT_FEE = 0n;
559
+ export const WBNB_ADDRESS = ADDRESSES.BSC.WBNB;
560
+ export { ZERO_ADDRESS } from '../../../shared/constants/index.js';
561
+ // ✅ ERC20_BALANCE_OF_ABI 已在文件开头定义
562
+ /**
563
+ * PancakeSwap捆绑换手(V2/V3通用)
564
+ * ✅ 支持 quoteToken:传入 USDT 等地址时,卖出得到该代币,买入使用该代币
565
+ */
@@ -1,83 +1,5 @@
1
- import { CommonBundleConfig } from '../../../utils/bundle-helpers.js';
2
1
  import { type GeneratedWallet } from '../../../utils/wallet.js';
3
- export type UserType = 'v0' | 'v1';
4
- export interface PancakeSwapSignConfig {
5
- rpcUrl: string;
6
- gasLimit?: number | bigint;
7
- gasLimitMultiplier?: number;
8
- minGasPriceGwei?: number;
9
- maxGasPriceGwei?: number;
10
- txType?: 0 | 2;
11
- chainId?: number;
12
- reserveGasBNB?: number;
13
- userType?: UserType;
14
- bribeAmount?: number;
15
- v2RouterAddress?: string;
16
- }
17
- export type SwapRouteType = 'v2' | 'v3-single' | 'v3-multi';
18
- export interface PancakeSwapConfig extends CommonBundleConfig {
19
- apiKey: string;
20
- customRpcUrl?: string;
21
- bundleBlockOffset?: number;
22
- reserveGasBNB?: number;
23
- waitForConfirmation?: boolean;
24
- waitTimeoutMs?: number;
25
- }
26
- export interface V2RouteParams {
27
- routeType: 'v2';
28
- v2Path: string[];
29
- }
30
- export interface V3SingleRouteParams {
31
- routeType: 'v3-single';
32
- v3TokenIn: string;
33
- v3TokenOut: string;
34
- v3Fee: number;
35
- v2Path?: string[];
36
- }
37
- export interface V3MultiRouteParams {
38
- routeType: 'v3-multi';
39
- v3LpAddresses: string[];
40
- v3ExactTokenIn: string;
41
- v2Path?: string[];
42
- }
43
- export type RouteParams = V2RouteParams | V3SingleRouteParams | V3MultiRouteParams;
44
- export interface PancakeBundleSwapSignParams {
45
- sellerPrivateKey: string;
46
- sellAmount?: string;
47
- sellPercentage?: number;
48
- buyerPrivateKey: string;
49
- tokenAddress: string;
50
- routeParams: RouteParams;
51
- config: PancakeSwapSignConfig;
52
- quoteToken?: string;
53
- quoteTokenDecimals?: number;
54
- startNonces?: number[];
55
- }
56
- export interface PancakeBundleSwapParams {
57
- sellerPrivateKey: string;
58
- sellAmount?: string;
59
- sellPercentage?: number;
60
- buyerPrivateKey: string;
61
- tokenAddress: string;
62
- routeParams: RouteParams;
63
- config: PancakeSwapConfig;
64
- }
65
- /** ✅ Pancake Swap 结果(简化版) */
66
- export type PancakeSwapResult = {
67
- signedTransactions: string[];
68
- profitHopWallets?: GeneratedWallet[];
69
- metadata?: {
70
- sellerAddress: string;
71
- buyerAddress: string;
72
- sellAmount: string;
73
- buyAmount: string;
74
- profitAmount?: string;
75
- };
76
- };
77
- /**
78
- * PancakeSwap捆绑换手(V2/V3通用)
79
- * ✅ 支持 quoteToken:传入 USDT 等地址时,卖出得到该代币,买入使用该代币
80
- */
2
+ import { PancakeBundleSwapSignParams, PancakeSwapResult, PancakeSwapSignConfig, RouteParams } from './bundle-swap-helpers.js';
81
3
  export declare function pancakeBundleSwapMerkle(params: PancakeBundleSwapSignParams): Promise<PancakeSwapResult>;
82
4
  /**
83
5
  * 批量换手参数(一卖多买)