four-flap-meme-sdk 2.2.2 → 2.2.4

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 (472) hide show
  1. package/README.en.md +41 -6
  2. package/README.md +31 -0
  3. package/README.zh-CN.md +41 -6
  4. package/dist/__tests__/subpath-exports.test.d.ts +1 -0
  5. package/dist/__tests__/subpath-exports.test.js +64 -0
  6. package/dist/abis/common.d.ts +85 -0
  7. package/dist/abis/common.js +264 -0
  8. package/dist/abis/contracts/TaxToken.json +969 -0
  9. package/dist/abis/contracts/TokenManager2.json +136 -0
  10. package/dist/abis/contracts/index.d.ts +5 -0
  11. package/dist/abis/contracts/index.js +5 -0
  12. package/dist/abis/flap/index.d.ts +3 -0
  13. package/dist/abis/flap/index.js +3 -0
  14. package/dist/abis/flap/portal-events.d.ts +6 -0
  15. package/dist/abis/flap/portal-events.js +17 -0
  16. package/dist/abis/flap/portal.d.ts +6 -0
  17. package/dist/abis/flap/portal.js +37 -0
  18. package/dist/abis/flap/vault.d.ts +171 -0
  19. package/dist/abis/flap/vault.js +91 -0
  20. package/dist/abis/index.d.ts +8 -0
  21. package/dist/abis/index.js +11 -0
  22. package/dist/bundle-core/__tests__/config-helpers.test.d.ts +1 -0
  23. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  24. package/dist/bundle-core/__tests__/facade-parity.test.d.ts +1 -0
  25. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  26. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
  27. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  28. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
  29. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  30. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  31. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  32. package/dist/bundle-core/config-helpers.d.ts +36 -0
  33. package/dist/bundle-core/config-helpers.js +57 -0
  34. package/dist/bundle-core/errors.d.ts +50 -0
  35. package/dist/bundle-core/errors.js +35 -0
  36. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  37. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  38. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  39. package/dist/bundle-core/four-meme/core-helpers.js +40 -0
  40. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  41. package/dist/bundle-core/four-meme/core.js +515 -0
  42. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  43. package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
  44. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  45. package/dist/bundle-core/four-meme/private.js +465 -0
  46. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  47. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  48. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  49. package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
  50. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  51. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  52. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  53. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  54. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
  55. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  56. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  57. package/dist/bundle-core/four-meme/swap.js +505 -0
  58. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  59. package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
  60. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  61. package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
  62. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  63. package/dist/bundle-core/four-meme/types/index.js +1 -0
  64. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  65. package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
  66. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  67. package/dist/bundle-core/four-meme/types.js +1 -0
  68. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  69. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  70. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  71. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  72. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  73. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  74. package/dist/bundle-core/index.d.ts +8 -0
  75. package/dist/bundle-core/index.js +8 -0
  76. package/dist/bundle-core/internal.d.ts +21 -0
  77. package/dist/bundle-core/internal.js +182 -0
  78. package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
  79. package/dist/bundle-core/sign-context-helpers.js +67 -0
  80. package/dist/bundle-core/submit.d.ts +293 -0
  81. package/dist/bundle-core/submit.js +727 -0
  82. package/dist/bundle-core/types/index.d.ts +8 -0
  83. package/dist/bundle-core/types/index.js +1 -0
  84. package/dist/bundle-core/types.d.ts +1 -0
  85. package/dist/bundle-core/types.js +1 -0
  86. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  87. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -113
  88. package/dist/chains/bsc/four/config.d.ts +5 -67
  89. package/dist/chains/bsc/four/config.js +2 -114
  90. package/dist/chains/bsc/four/core.d.ts +1 -4
  91. package/dist/chains/bsc/four/core.js +1 -592
  92. package/dist/chains/bsc/four/index.d.ts +6 -6
  93. package/dist/chains/bsc/four/index.js +6 -6
  94. package/dist/chains/bsc/four/internal.d.ts +2 -46
  95. package/dist/chains/bsc/four/internal.js +2 -239
  96. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  97. package/dist/chains/bsc/four/pancake-proxy.js +1 -687
  98. package/dist/chains/bsc/four/private.d.ts +1 -27
  99. package/dist/chains/bsc/four/private.js +1 -477
  100. package/dist/chains/bsc/four/submit.d.ts +2 -315
  101. package/dist/chains/bsc/four/submit.js +2 -752
  102. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  103. package/dist/chains/bsc/four/swap-buy-first.js +2 -507
  104. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  105. package/dist/chains/bsc/four/swap-internal.js +1 -18
  106. package/dist/chains/bsc/four/swap.d.ts +2 -144
  107. package/dist/chains/bsc/four/swap.js +2 -766
  108. package/dist/chains/bsc/four/types.d.ts +1 -476
  109. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  110. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  111. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  112. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  113. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  114. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  115. package/dist/chains/bsc/four/utils.d.ts +5 -18
  116. package/dist/chains/bsc/four/utils.js +5 -1552
  117. package/dist/chains/bsc/iro.d.ts +5 -0
  118. package/dist/chains/bsc/iro.js +4 -0
  119. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
  120. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
  121. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  122. package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -212
  123. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  124. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
  125. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  126. package/dist/chains/bsc/pancake/bundle-swap.js +114 -726
  127. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  128. package/dist/chains/bsc/pancake/index.js +1 -3
  129. package/dist/chains/bsc/platforms/iro/factory.d.ts +2 -2
  130. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  131. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  132. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  133. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  134. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  135. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  136. package/dist/chains/eni/batch-router/transfer.js +55 -25
  137. package/dist/chains/eni/batch-router/utils.js +32 -6
  138. package/dist/chains/eni/bundler/sign.js +5 -6
  139. package/dist/chains/eni/bundler/submit.js +1 -4
  140. package/dist/chains/eni/constants.js +1 -1
  141. package/dist/chains/eni/flat-aliases.d.ts +10 -0
  142. package/dist/chains/eni/flat-aliases.js +8 -0
  143. package/dist/chains/eni/index.d.ts +2 -1
  144. package/dist/chains/eni/index.js +1 -0
  145. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  146. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  147. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  148. package/dist/chains/eni/platforms/daoaas/meta.js +9 -6
  149. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -44
  150. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  151. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  152. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  153. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  154. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -46
  155. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  156. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  157. package/dist/chains/eni/platforms/iro/factory.d.ts +2 -2
  158. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  159. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  160. package/dist/chains/eni/platforms/iro/index.js +4 -4
  161. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  162. package/dist/chains/eni/platforms/iro/token.js +107 -31
  163. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  164. package/dist/chains/eni/submit.d.ts +43 -0
  165. package/dist/chains/eni/submit.js +286 -0
  166. package/dist/chains/index.d.ts +13 -0
  167. package/dist/chains/index.js +13 -0
  168. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  169. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -21
  170. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  171. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  172. package/dist/chains/xlayer/eip7702/bundle-create.js +93 -59
  173. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  174. package/dist/chains/xlayer/eip7702/bundle-sell.js +29 -111
  175. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  176. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -245
  177. package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
  178. package/dist/chains/xlayer/eip7702/constants.js +3 -21
  179. package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
  180. package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
  181. package/dist/chains/xlayer/eip7702/index.d.ts +28 -46
  182. package/dist/chains/xlayer/eip7702/index.js +28 -81
  183. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
  184. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
  185. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  186. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +63 -307
  187. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  188. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
  189. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  190. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  191. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  192. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
  193. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  194. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  195. package/dist/chains/xlayer/eip7702/volume.js +89 -164
  196. package/dist/chains/xlayer/eoa/constants.js +1 -1
  197. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  198. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  199. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  200. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  201. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +66 -299
  202. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  203. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +18 -23
  204. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  205. package/dist/chains/xlayer/eoa/index.js +8 -23
  206. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  207. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  208. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  209. package/dist/chains/xlayer/eoa/types.js +1 -3
  210. package/dist/chains/xlayer/index.d.ts +3 -2
  211. package/dist/chains/xlayer/index.js +4 -7
  212. package/dist/contracts/helper3.d.ts +20 -5
  213. package/dist/contracts/helper3.js +56 -20
  214. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  215. package/dist/contracts/tm-bundle-helpers.js +72 -0
  216. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  217. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -113
  218. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -67
  219. package/dist/contracts/tm-bundle-merkle/config.js +2 -114
  220. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  221. package/dist/contracts/tm-bundle-merkle/core.js +1 -591
  222. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  223. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  224. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -46
  225. package/dist/contracts/tm-bundle-merkle/internal.js +2 -238
  226. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  227. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -686
  228. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  229. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  230. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  231. package/dist/contracts/tm-bundle-merkle/submit.js +3 -928
  232. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  233. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -506
  234. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  235. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  236. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  237. package/dist/contracts/tm-bundle-merkle/swap.js +2 -764
  238. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  239. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  240. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  241. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  242. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  243. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  244. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  245. package/dist/contracts/tm-bundle-merkle/utils.d.ts +6 -18
  246. package/dist/contracts/tm-bundle-merkle/utils.js +6 -1501
  247. package/dist/contracts/tm-bundle.d.ts +3 -51
  248. package/dist/contracts/tm-bundle.js +108 -177
  249. package/dist/contracts/tm.d.ts +3 -2
  250. package/dist/contracts/tm.js +37 -32
  251. package/dist/contracts/tm1.js +9 -4
  252. package/dist/contracts/tm2.js +9 -4
  253. package/dist/dex/direct-router-helpers.d.ts +264 -0
  254. package/dist/dex/direct-router-helpers.js +539 -0
  255. package/dist/dex/direct-router.d.ts +3 -125
  256. package/dist/dex/direct-router.js +237 -666
  257. package/dist/dex/types.d.ts +81 -0
  258. package/dist/dex/types.js +1 -0
  259. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  260. package/dist/exports/root-bundle-and-tooling.js +30 -0
  261. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  262. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  263. package/dist/exports/root-foundations.d.ts +35 -0
  264. package/dist/exports/root-foundations.js +70 -0
  265. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  266. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  267. package/dist/flap/index.d.ts +10 -0
  268. package/dist/flap/index.js +8 -0
  269. package/dist/flows/create.d.ts +2 -1
  270. package/dist/flows/create.js +6 -6
  271. package/dist/flows/index.d.ts +1 -0
  272. package/dist/flows/index.js +1 -0
  273. package/dist/index.d.ts +20 -85
  274. package/dist/index.js +20 -215
  275. package/dist/merkle/index.d.ts +12 -0
  276. package/dist/merkle/index.js +11 -0
  277. package/dist/shared/abis/common.d.ts +2 -83
  278. package/dist/shared/abis/common.js +2 -252
  279. package/dist/shared/abis/index.d.ts +5 -6
  280. package/dist/shared/abis/index.js +5 -7
  281. package/dist/shared/clients/blockrazor.js +39 -25
  282. package/dist/shared/clients/club48.d.ts +2 -2
  283. package/dist/shared/clients/club48.js +34 -29
  284. package/dist/shared/clients/emitservice.js +2 -0
  285. package/dist/shared/clients/four.d.ts +21 -6
  286. package/dist/shared/clients/four.js +29 -24
  287. package/dist/shared/clients/index.d.ts +8 -0
  288. package/dist/shared/clients/index.js +8 -0
  289. package/dist/shared/clients/merkle.js +27 -34
  290. package/dist/shared/constants/addresses.d.ts +1 -1
  291. package/dist/shared/constants/addresses.js +11 -2
  292. package/dist/shared/constants/chains.d.ts +1 -1
  293. package/dist/shared/constants/chains.js +1 -1
  294. package/dist/shared/constants/gas.d.ts +1 -1
  295. package/dist/shared/constants/gas.js +2 -6
  296. package/dist/shared/constants/index.d.ts +3 -0
  297. package/dist/shared/constants/index.js +1 -0
  298. package/dist/shared/constants/quote.d.ts +30 -0
  299. package/dist/shared/constants/quote.js +37 -0
  300. package/dist/shared/flap/abi.js +1 -1
  301. package/dist/shared/flap/constants.d.ts +1 -2
  302. package/dist/shared/flap/constants.js +2 -3
  303. package/dist/shared/flap/curve.js +3 -0
  304. package/dist/shared/flap/errors.d.ts +1 -4
  305. package/dist/shared/flap/errors.js +20 -1
  306. package/dist/shared/flap/index.d.ts +5 -4
  307. package/dist/shared/flap/index.js +5 -4
  308. package/dist/shared/flap/meta.d.ts +22 -18
  309. package/dist/shared/flap/meta.js +12 -17
  310. package/dist/shared/flap/permit.js +5 -2
  311. package/dist/shared/flap/pinata.d.ts +22 -6
  312. package/dist/shared/flap/pinata.js +21 -26
  313. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  314. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  315. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  316. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  317. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  318. package/dist/shared/flap/portal-bundle-merkle/core.js +96 -277
  319. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +7 -2
  320. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +107 -206
  321. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
  322. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  323. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  324. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  325. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  326. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  327. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  328. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  329. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
  330. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  331. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  332. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
  333. package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
  334. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +88 -9
  335. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  336. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  337. package/dist/shared/flap/portal-bundle.js +55 -56
  338. package/dist/shared/flap/portal-create-token.d.ts +80 -0
  339. package/dist/shared/flap/portal-create-token.js +257 -0
  340. package/dist/shared/flap/portal.d.ts +14 -3
  341. package/dist/shared/flap/portal.js +50 -25
  342. package/dist/shared/flap/vanity.d.ts +1 -5
  343. package/dist/shared/flap/vanity.js +6 -17
  344. package/dist/shared/flap/vault.d.ts +17 -124
  345. package/dist/shared/flap/vault.js +67 -148
  346. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  347. package/dist/shared/foundation/dex/v3-path.js +35 -0
  348. package/dist/shared/foundation/gas/bundle-gas.d.ts +49 -0
  349. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  350. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  351. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  352. package/dist/shared/foundation/index.d.ts +13 -0
  353. package/dist/shared/foundation/index.js +12 -0
  354. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  355. package/dist/shared/foundation/nonce/nonce-manager.js +183 -0
  356. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  357. package/dist/shared/foundation/normalize-unknown.js +29 -0
  358. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  359. package/dist/shared/foundation/sdk-logger.js +12 -0
  360. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  361. package/dist/shared/foundation/tx/build-request.js +25 -0
  362. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  363. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  364. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  365. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  366. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  367. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  368. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  369. package/dist/shared/foundation/types/erc20.js +1 -0
  370. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  371. package/dist/shared/foundation/types/holders-maker.js +1 -0
  372. package/dist/shared/foundation/types/index.d.ts +7 -0
  373. package/dist/shared/foundation/types/index.js +1 -0
  374. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  375. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  376. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  377. package/dist/shared/foundation/types/multicall.js +1 -0
  378. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  379. package/dist/shared/foundation/types/private-sale.js +1 -0
  380. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  381. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  382. package/dist/shared/four/tax-token.d.ts +1 -1
  383. package/dist/shared/four/tax-token.js +27 -7
  384. package/dist/shared/index.d.ts +6 -0
  385. package/dist/shared/index.js +4 -0
  386. package/dist/types/errors.d.ts +27 -0
  387. package/dist/types/errors.js +34 -0
  388. package/dist/utils/airdrop-sweep.d.ts +4 -76
  389. package/dist/utils/airdrop-sweep.js +42 -55
  390. package/dist/utils/bundle-helpers.d.ts +9 -243
  391. package/dist/utils/bundle-helpers.js +10 -584
  392. package/dist/utils/constants.d.ts +5 -61
  393. package/dist/utils/constants.js +5 -80
  394. package/dist/utils/contract-factory.d.ts +2 -4
  395. package/dist/utils/contract-factory.js +25 -18
  396. package/dist/utils/erc20.d.ts +7 -89
  397. package/dist/utils/erc20.js +94 -125
  398. package/dist/utils/errors.d.ts +12 -1
  399. package/dist/utils/errors.js +60 -1
  400. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  401. package/dist/utils/holders-maker/addresses.js +15 -0
  402. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  403. package/dist/utils/holders-maker/buy-tx.js +278 -0
  404. package/dist/utils/holders-maker/constants.d.ts +6 -0
  405. package/dist/utils/holders-maker/constants.js +7 -0
  406. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  407. package/dist/utils/holders-maker/disperse.js +90 -0
  408. package/dist/utils/holders-maker/routing.d.ts +4 -0
  409. package/dist/utils/holders-maker/routing.js +45 -0
  410. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  411. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  412. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  413. package/dist/utils/holders-maker-helpers.js +9 -0
  414. package/dist/utils/holders-maker.d.ts +2 -138
  415. package/dist/utils/holders-maker.js +26 -661
  416. package/dist/utils/hop-chains.d.ts +35 -0
  417. package/dist/utils/hop-chains.js +215 -0
  418. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  419. package/dist/utils/lp-inspect-helpers.js +109 -0
  420. package/dist/utils/lp-inspect.d.ts +2 -112
  421. package/dist/utils/lp-inspect.js +73 -223
  422. package/dist/utils/mpcExclusive.d.ts +2 -5
  423. package/dist/utils/mpcExclusive.js +4 -3
  424. package/dist/utils/private-sale.d.ts +2 -58
  425. package/dist/utils/private-sale.js +4 -15
  426. package/dist/utils/provider-factory.d.ts +4 -0
  427. package/dist/utils/provider-factory.js +10 -0
  428. package/dist/utils/quote-helpers.d.ts +4 -45
  429. package/dist/utils/quote-helpers.js +17 -74
  430. package/dist/utils/stealth-transfer.d.ts +2 -28
  431. package/dist/utils/stealth-transfer.js +31 -15
  432. package/dist/utils/swap-helpers.d.ts +2 -15
  433. package/dist/utils/swap-helpers.js +6 -11
  434. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  435. package/dist/utils/types/airdrop-sweep.js +1 -0
  436. package/dist/utils/types/contract-factory.d.ts +1 -0
  437. package/dist/utils/types/contract-factory.js +1 -0
  438. package/dist/utils/types/erc20.d.ts +1 -0
  439. package/dist/utils/types/erc20.js +1 -0
  440. package/dist/utils/types/errors.d.ts +1 -0
  441. package/dist/utils/types/errors.js +1 -0
  442. package/dist/utils/types/holders-maker.d.ts +1 -0
  443. package/dist/utils/types/holders-maker.js +1 -0
  444. package/dist/utils/types/hop-chains.d.ts +8 -0
  445. package/dist/utils/types/hop-chains.js +1 -0
  446. package/dist/utils/types/index.d.ts +13 -0
  447. package/dist/utils/types/index.js +1 -0
  448. package/dist/utils/types/lp-inspect.d.ts +1 -0
  449. package/dist/utils/types/lp-inspect.js +1 -0
  450. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  451. package/dist/utils/types/mpc-exclusive.js +1 -0
  452. package/dist/utils/types/private-sale.d.ts +1 -0
  453. package/dist/utils/types/private-sale.js +1 -0
  454. package/dist/utils/types/quote-helpers.d.ts +1 -0
  455. package/dist/utils/types/quote-helpers.js +1 -0
  456. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  457. package/dist/utils/types/stealth-transfer.js +1 -0
  458. package/dist/utils/types/wallet.d.ts +25 -0
  459. package/dist/utils/types/wallet.js +1 -0
  460. package/dist/utils/wallet.d.ts +2 -25
  461. package/dist/utils/wallet.js +13 -10
  462. package/dist/vanity/index.d.ts +5 -0
  463. package/dist/vanity/index.js +5 -0
  464. package/package.json +160 -4
  465. package/src/abis/contracts/TaxToken.json +969 -0
  466. package/src/abis/contracts/TokenManager.json +836 -0
  467. package/src/abis/contracts/TokenManager2.json +136 -0
  468. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  469. package/dist/shared/abis/TaxToken.json +0 -105
  470. package/dist/shared/abis/TokenManager2.json +0 -60
  471. /package/dist/{shared/abis → abis/contracts}/TokenManager.json +0 -0
  472. /package/dist/{shared/abis → abis/contracts}/TokenManagerHelper3.json +0 -0
@@ -1,92 +1,29 @@
1
- import { ethers, Wallet, Contract, Interface } from 'ethers';
2
- import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT } from '../../../utils/bundle-helpers.js';
3
- import { ADDRESSES, ZERO_ADDRESS } from '../../../utils/constants.js';
4
- import { GAS_LIMITS, CHAINS } from '../../constants/index.js';
5
- import { MULTICALL3_ABI, V2_ROUTER_QUOTE_ABI } from '../../abis/common.js';
6
- import { FLAP_PORTAL_ADDRESSES, FLAP_ORIGINAL_PORTAL_ADDRESSES } from '../constants.js';
7
- import { buildNewTokenV6WithVaultParams, VAULT_PORTAL_ADDRESSES, VAULT_PORTAL_ABI } from '../vault.js';
8
- import { CHAIN_ID_MAP, PORTAL_ABI, getErrorMessage, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA } from './config.js';
9
- // ✅ 常量
10
- const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
11
- // ==================== ERC20 → 原生代币报价 ====================
12
- // BSC 链常量
13
- const BSC_PANCAKE_V2_ROUTER = ADDRESSES.BSC.PancakeV2Router;
14
- const BSC_WBNB = ADDRESSES.BSC.WBNB;
15
- // ✅ Monad 链常量
16
- const MONAD_PANCAKE_V2_ROUTER = '0xb1bc24c34e88f7d43d5923034e3a14b24daacff9';
17
- const MONAD_WMON = ADDRESSES.MONAD.WMON;
18
- // ✅ XLAYER 链常量(PotatoSwap V2)
19
- const XLAYER_POTATOSWAP_V2_ROUTER = ADDRESSES.XLAYER.PotatoSwapV2Router;
20
- const XLAYER_WOKB = ADDRESSES.XLAYER.WOKB;
21
- // ✅ Base 链常量(Uniswap V3 SwapRouter02)
22
- const BASE_WETH = ADDRESSES.BASE.WETH;
23
- const ROUTER_ABI = V2_ROUTER_QUOTE_ABI;
24
- /**
25
- * 获取 ERC20 代币 → 原生代币的报价
26
- * @param provider - Provider 实例
27
- * @param tokenAddress - ERC20 代币地址
28
- * @param tokenAmount - 代币数量(wei)
29
- * @param chainId - 链 ID(56=BSC, 143=Monad)
30
- * @returns 等值的原生代币数量(wei),失败返回 0n
31
- */
32
- async function getTokenToNativeQuote(provider, tokenAddress, tokenAmount, chainId) {
33
- if (tokenAmount <= 0n)
34
- return 0n;
35
- try {
36
- if (chainId === CHAINS.BSC.chainId) {
37
- // BSC: 使用 PancakeSwap V2 Router
38
- const router = new Contract(BSC_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
39
- const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, BSC_WBNB]);
40
- return amounts[1];
41
- }
42
- if (chainId === CHAINS.MONAD.chainId) {
43
- // ✅ Monad: 使用 PancakeSwap V2 Router
44
- const router = new Contract(MONAD_PANCAKE_V2_ROUTER, ROUTER_ABI, provider);
45
- const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, MONAD_WMON]);
46
- return amounts[1];
47
- }
48
- if (chainId === CHAINS.XLAYER.chainId) {
49
- // ✅ XLAYER: 使用 PotatoSwap V2 Router(USDT0 → WOKB)
50
- const router = new Contract(XLAYER_POTATOSWAP_V2_ROUTER, ROUTER_ABI, provider);
51
- const amounts = await router.getAmountsOut(tokenAmount, [tokenAddress, XLAYER_WOKB]);
52
- return amounts[1];
53
- }
54
- if (chainId === CHAINS.BASE.chainId) {
55
- // ✅ Base: 目前大部分 Flap 交易使用 ETH(原生代币),ERC20 报价暂不支持
56
- // Base 主力 DEX 是 Uniswap V3,V2 Router 流动性有限,暂返回 0
57
- // TODO: 后续可接入 Uniswap V3 QuoterV2 进行精确报价
58
- return 0n;
59
- }
60
- // 其他链暂不支持报价,返回 0
61
- return 0n;
62
- }
63
- catch {
64
- // 报价失败返回 0(可能是流动性不足或路径不存在)
65
- return 0n;
66
- }
67
- }
68
1
  /**
69
- * 获取 Gas Limit
70
- * 优先使用 config.gasLimit,否则使用默认值 * multiplier
71
- *
72
- * ✅ ethers v6 最佳实践:直接使用 bigint 类型
2
+ * core - 主函数
73
3
  */
74
- function getGasLimit(config, defaultGas = 800000) {
75
- // 优先使用前端传入的 gasLimit
76
- if (config.gasLimit !== undefined) {
77
- // 如果已经是 bigint,直接返回;否则转换
78
- return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
79
- }
80
- // 使用默认值 * multiplier
81
- const multiplier = config.gasLimitMultiplier ?? 1.0;
82
- const calculatedGas = Math.ceil(defaultGas * multiplier);
83
- // JavaScript 原生 BigInt 转换(ethers v6 兼容)
84
- return BigInt(calculatedGas);
4
+ import { ethers, Wallet, Contract, Interface } from 'ethers';
5
+ import { NonceManager, getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, } from '../../../utils/bundle-helpers.js';
6
+ import { ZERO_ADDRESS } from '../../../shared/constants/index.js';
7
+ import { GAS_LIMITS } from '../../constants/index.js';
8
+ import { MULTICALL3_ABI } from '../../abis/common.js';
9
+ import { FLAP_PORTAL_ADDRESSES, FLAP_ORIGINAL_PORTAL_ADDRESSES } from '../constants.js';
10
+ import { normalizeTaxLaunchConfig, populateCreateTokenTransaction, } from '../portal-create-token.js';
11
+ import { CHAIN_ID_MAP, PORTAL_ABI, getErrorMessage, getTxType, getGasPriceConfig, shouldExtractProfit, calculateProfit, getProfitRecipient, getBribeAmount, BLOCKRAZOR_BUILDER_EOA, } from './config.js';
12
+ import { MigratorType } from '../portal.js';
13
+ import { MULTICALL3_ADDRESS, getGasLimit, getTokenToNativeQuote } from './core-helpers.js';
14
+ function resolveCreateTokenLaunchFlags(params) {
15
+ const normalizedTax = normalizeTaxLaunchConfig(params.taxV2Config, params.taxRate);
16
+ const isTaxLaunch = !!normalizedTax || (params.taxRate ?? 0) > 0;
17
+ const hasVault = !!normalizedTax?.vaultConfig && normalizedTax.vaultConfig.vaultType !== 'none';
18
+ const useV4Portal = !isTaxLaunch &&
19
+ !hasVault &&
20
+ (params.lpFeeProfile !== undefined || params.dexId !== undefined);
21
+ const useClInfinityLaunch = !isTaxLaunch &&
22
+ !hasVault &&
23
+ !useV4Portal &&
24
+ params.migratorType === MigratorType.PCS_INFINITY_CL_MIGRATOR;
25
+ return { normalizedTax, isTaxLaunch, hasVault, useV4Portal, useClInfinityLaunch };
85
26
  }
86
- /**
87
- * Flap Protocol: 创建代币 + 捆绑购买(仅签名版本 - 不依赖 Merkle)
88
- * ✅ 精简版:只负责签名交易,不提交到 Merkle
89
- */
90
27
  export async function createTokenWithBundleBuyMerkle(params) {
91
28
  const { chain, privateKeys, buyAmounts, tokenInfo, tokenAddress, config } = params;
92
29
  if (privateKeys.length === 0) {
@@ -102,136 +39,30 @@ export async function createTokenWithBundleBuyMerkle(params) {
102
39
  const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
103
40
  const originalPortalAddr = FLAP_ORIGINAL_PORTAL_ADDRESSES[chain];
104
41
  const portal = new ethers.Contract(originalPortalAddr, PORTAL_ABI, devWallet);
105
- // 判断使用哪个版本的 newToken
106
- // V5: 提供了 taxV2Config 且 taxRate > 0(Tax Token V2 高级税收分配)
107
- // V4: 提供了 dexId 或 lpFeeProfile(支持 DEX 选择和 LP 费率配置)
108
- // V3: 提供了 extensionID(支持扩展数据)
109
- // V2: 默认
110
- const useV5 = params.taxV2Config !== undefined && (params.taxRate ?? 0) > 0;
111
- const useV4 = !useV5 && (params.dexId !== undefined || params.lpFeeProfile !== undefined);
112
- const useV3 = !useV5 && !useV4 && !!params.extensionID;
113
- // ✅ 优化:并行获取 gasPrice、devWallet nonce 和 createTx
114
- let createTxPromise;
115
- if (useV5) {
116
- // V5: Tax Token V2 高级税收分配
117
- const tv2 = params.taxV2Config;
118
- const dist = tv2.distribution;
119
- const total = dist.mktBps + dist.deflationBps + dist.dividendBps + dist.lpBps;
120
- if (total !== 10000) {
121
- throw new Error(`Tax distribution must sum to 10000 (100%), got ${total}`);
122
- }
123
- // ✅ 判断是否使用金库模式(VaultPortal.newTokenV6WithVault + TOKEN_TAXED_V3)
124
- const hasVault = tv2.vaultConfig && tv2.vaultConfig.vaultType !== 'none';
125
- if (hasVault) {
126
- // ✅ 金库模式:通过 VaultPortal.newTokenV6WithVault 创建代币
127
- const vaultPortalAddr = VAULT_PORTAL_ADDRESSES[chain];
128
- if (!vaultPortalAddr) {
129
- throw new Error(`链 "${chain}" 不支持 Tax Vault 金库功能`);
130
- }
131
- const vaultPortal = new ethers.Contract(vaultPortalAddr, VAULT_PORTAL_ABI, devWallet);
132
- const v6Params = buildNewTokenV6WithVaultParams({
133
- tokenInfo,
134
- taxV2: tv2,
135
- chain,
136
- salt: params.salt ?? ('0x' + '00'.repeat(32)),
137
- taxRate: params.taxRate ?? 0,
138
- buyTaxRate: params.buyTaxRate,
139
- sellTaxRate: params.sellTaxRate,
140
- dexThresh: params.dexThresh,
141
- migratorType: params.migratorType,
142
- quoteToken: params.quoteToken,
143
- quoteAmt: 0n,
144
- dexId: params.dexId,
145
- lpFeeProfile: params.lpFeeProfile,
146
- });
147
- createTxPromise = vaultPortal.newTokenV6WithVault.populateTransaction(v6Params);
148
- }
149
- else {
150
- // 标准 V5: Portal.newTokenV5(无金库)
151
- createTxPromise = portal.newTokenV5.populateTransaction({
152
- name: tokenInfo.name,
153
- symbol: tokenInfo.symbol,
154
- meta: tokenInfo.meta,
155
- dexThresh: (params.dexThresh ?? 1) & 0xff,
156
- salt: params.salt ?? '0x' + '00'.repeat(32),
157
- taxRate: (params.taxRate ?? 0) & 0xffff,
158
- migratorType: (params.migratorType ?? 0) & 0xff,
159
- quoteToken: params.quoteToken || ZERO_ADDRESS,
160
- quoteAmt: 0n,
161
- beneficiary: devWallet.address,
162
- permitData: '0x',
163
- extensionID: params.extensionID ?? '0x' + '00'.repeat(32),
164
- extensionData: params.extensionData ?? '0x',
165
- dexId: (params.dexId ?? 0) & 0xff,
166
- lpFeeProfile: (params.lpFeeProfile ?? 0) & 0xff,
167
- taxDuration: BigInt(tv2.taxDuration),
168
- antiFarmerDuration: BigInt(tv2.antiFarmerDuration),
169
- mktBps: dist.mktBps,
170
- deflationBps: dist.deflationBps,
171
- dividendBps: dist.dividendBps,
172
- lpBps: dist.lpBps,
173
- minimumShareBalance: BigInt(dist.minimumShareBalance ?? 10000) * (10n ** 18n),
174
- });
175
- }
176
- }
177
- else if (useV4) {
178
- // V4: 支持 DEX ID 和 LP 费率配置
179
- createTxPromise = portal.newTokenV4.populateTransaction({
180
- name: tokenInfo.name,
181
- symbol: tokenInfo.symbol,
182
- meta: tokenInfo.meta,
183
- dexThresh: (params.dexThresh ?? 1) & 0xff,
184
- salt: params.salt ?? '0x' + '00'.repeat(32),
185
- taxRate: (params.taxRate ?? 0) & 0xffff,
186
- migratorType: (params.migratorType ?? 0) & 0xff,
187
- quoteToken: params.quoteToken || ZERO_ADDRESS,
188
- quoteAmt: 0n,
189
- beneficiary: devWallet.address,
190
- permitData: '0x',
191
- extensionID: params.extensionID ?? '0x' + '00'.repeat(32),
192
- extensionData: params.extensionData ?? '0x',
193
- dexId: (params.dexId ?? 0) & 0xff,
194
- lpFeeProfile: (params.lpFeeProfile ?? 0) & 0xff
195
- });
196
- }
197
- else if (useV3) {
198
- // V3: 支持扩展数据
199
- createTxPromise = portal.newTokenV3.populateTransaction({
200
- name: tokenInfo.name,
201
- symbol: tokenInfo.symbol,
202
- meta: tokenInfo.meta,
203
- dexThresh: (params.dexThresh ?? 1) & 0xff,
204
- salt: params.salt ?? '0x' + '00'.repeat(32),
205
- taxRate: (params.taxRate ?? 0) & 0xffff,
206
- migratorType: (params.migratorType ?? 0) & 0xff,
207
- quoteToken: params.quoteToken || ZERO_ADDRESS,
208
- quoteAmt: 0n,
209
- beneficiary: devWallet.address,
210
- permitData: '0x',
211
- extensionID: params.extensionID,
212
- extensionData: params.extensionData ?? '0x'
213
- });
214
- }
215
- else {
216
- // V2: 基础版本
217
- createTxPromise = portal.newTokenV2.populateTransaction({
218
- name: tokenInfo.name,
219
- symbol: tokenInfo.symbol,
220
- meta: tokenInfo.meta,
221
- dexThresh: (params.dexThresh ?? 1) & 0xff,
222
- salt: params.salt ?? '0x' + '00'.repeat(32),
223
- taxRate: (params.taxRate ?? 0) & 0xffff,
224
- migratorType: (params.migratorType ?? 0) & 0xff,
225
- quoteToken: params.quoteToken || ZERO_ADDRESS,
226
- quoteAmt: 0n,
227
- beneficiary: devWallet.address,
228
- permitData: '0x'
229
- });
230
- }
42
+ const { normalizedTax, useV4Portal, useClInfinityLaunch } = resolveCreateTokenLaunchFlags(params);
43
+ const createTxPromise = populateCreateTokenTransaction({
44
+ chain,
45
+ devWallet,
46
+ originalPortal: portal,
47
+ tokenInfo,
48
+ quoteToken: params.quoteToken || ZERO_ADDRESS,
49
+ beneficiary: devWallet.address,
50
+ dexThresh: params.dexThresh,
51
+ salt: params.salt,
52
+ migratorType: params.migratorType,
53
+ taxRate: params.taxRate,
54
+ dexId: params.dexId,
55
+ lpFeeProfile: params.lpFeeProfile,
56
+ extensionID: params.extensionID,
57
+ extensionData: params.extensionData,
58
+ useV4Portal,
59
+ useClInfinityLaunch,
60
+ taxConfig: normalizedTax,
61
+ });
231
62
  const [gasPrice, createTxUnsigned, devNonce] = await Promise.all([
232
63
  resolveGasPrice(provider, config),
233
64
  createTxPromise,
234
- nonceManager.getNextNonce(devWallet)
65
+ nonceManager.getNextNonce(devWallet),
235
66
  ]);
236
67
  const createTxRequest = {
237
68
  ...createTxUnsigned,
@@ -240,12 +71,13 @@ export async function createTokenWithBundleBuyMerkle(params) {
240
71
  gasLimit: getGasLimit(config),
241
72
  gasPrice,
242
73
  chainId,
243
- type: getTxType(config)
74
+ type: getTxType(config),
244
75
  };
245
76
  const signedCreateTx = await devWallet.signTransaction(createTxRequest);
246
77
  signedTxs.push(signedCreateTx);
247
78
  const buyers = createWallets(privateKeys.slice(1), provider);
248
- const extractProfit = shouldExtractProfit(config);
79
+ // 发币+捆绑买:默认不刮利润,避免跟买缩水与 Dev 钱包多 3 笔多跳导致 BlockRazor 模拟失败
80
+ const extractProfit = config.extractProfitOnLaunch === true ? shouldExtractProfit(config) : false;
249
81
  const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
250
82
  const maxFundsIndex = findMaxIndex(originalAmounts);
251
83
  const gasLimits = buildGasLimitList(buyers.length, config);
@@ -258,13 +90,13 @@ export async function createTokenWithBundleBuyMerkle(params) {
258
90
  if (!useNativeToken && params.quoteTokenDecimals !== undefined && params.quoteTokenDecimals !== 18) {
259
91
  const decimalsDiff = 18 - params.quoteTokenDecimals;
260
92
  const divisor = BigInt(10 ** decimalsDiff);
261
- adjustedFundsList = fundsList.map(amount => amount / divisor);
93
+ adjustedFundsList = fundsList.map((amount) => amount / divisor);
262
94
  profitTokenAmount = totalProfit / divisor;
263
95
  }
264
96
  // ✅ 优化:并行获取 unsignedBuys 和 buyerNonces
265
97
  const [unsignedBuys, buyerNonces] = await Promise.all([
266
98
  populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, adjustedFundsList, inputToken, useNativeToken),
267
- allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager)
99
+ allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager),
268
100
  ]);
269
101
  // ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
270
102
  const bribeAmount = getBribeAmount(config);
@@ -279,7 +111,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
279
111
  gasPrice,
280
112
  gasLimit: GAS_LIMITS.BRIBE,
281
113
  chainId,
282
- type: getTxType(config)
114
+ type: getTxType(config),
283
115
  });
284
116
  bribeTxs.push(bribeTx);
285
117
  // 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
@@ -294,7 +126,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
294
126
  chainId,
295
127
  config,
296
128
  fundsList: adjustedFundsList, // ✅ 使用调整后的金额
297
- useNativeToken // ✅ 传递是否使用原生代币
129
+ useNativeToken, // ✅ 传递是否使用原生代币
298
130
  });
299
131
  // ✅ 利润多跳转账(强制 2 跳中转)
300
132
  const profitTxs = [];
@@ -315,7 +147,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
315
147
  gasPrice,
316
148
  chainId,
317
149
  txType: getTxType(config),
318
- startNonce: profitNonce
150
+ startNonce: profitNonce,
319
151
  });
320
152
  profitTxs.push(...profitHopResult.signedTransactions);
321
153
  profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
@@ -327,7 +159,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
327
159
  signedTransactions: [...bribeTxs, ...signedTxs, ...signedBuys, ...profitTxs],
328
160
  tokenAddress,
329
161
  profitHopWallets, // ✅ 返回利润多跳钱包
330
- metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length)
162
+ metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length),
331
163
  };
332
164
  }
333
165
  /**
@@ -342,9 +174,8 @@ export async function batchBuyWithBundleMerkle(params) {
342
174
  }
343
175
  const { provider, chainId } = createChainContext(chain, config.rpcUrl);
344
176
  const nonceManager = new NonceManager(provider);
345
- const signedTxs = [];
346
177
  const buyers = createWallets(privateKeys, provider);
347
- const extractProfit = shouldExtractProfit(config);
178
+ const extractProfit = shouldExtractProfit();
348
179
  const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
349
180
  const maxFundsIndex = findMaxIndex(originalAmounts);
350
181
  const gasLimits = buildGasLimitList(buyers.length, config);
@@ -362,7 +193,7 @@ export async function batchBuyWithBundleMerkle(params) {
362
193
  // 转为 USDC (6位) = 100000 (0.1 USDC)
363
194
  const decimalsDiff = 18 - quoteTokenDecimals;
364
195
  const divisor = BigInt(10 ** decimalsDiff);
365
- adjustedFundsList = fundsList.map(amount => amount / divisor);
196
+ adjustedFundsList = fundsList.map((amount) => amount / divisor);
366
197
  profitTokenAmount = totalProfit / divisor;
367
198
  }
368
199
  // ✅ ERC20 购买:获取代币利润等值的原生代币(BNB)报价
@@ -379,10 +210,8 @@ export async function batchBuyWithBundleMerkle(params) {
379
210
  populateBuyTransactionsWithQuote(buyers, FLAP_PORTAL_ADDRESSES[chain], tokenAddress, adjustedFundsList, inputToken, useNativeToken),
380
211
  presetNonces && presetNonces.length === buyers.length
381
212
  ? adjustNoncesForProfit(presetNonces) // ✅ 调整 nonces 避免冲突
382
- : allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager)
213
+ : allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager),
383
214
  ]);
384
- if (presetNonces) {
385
- }
386
215
  // ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
387
216
  const bribeAmount = getBribeAmount(config);
388
217
  const bribeTxs = [];
@@ -395,7 +224,7 @@ export async function batchBuyWithBundleMerkle(params) {
395
224
  gasPrice,
396
225
  gasLimit: GAS_LIMITS.BRIBE,
397
226
  chainId,
398
- type: getTxType(config)
227
+ type: getTxType(config),
399
228
  });
400
229
  bribeTxs.push(bribeTx);
401
230
  // 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
@@ -410,20 +239,18 @@ export async function batchBuyWithBundleMerkle(params) {
410
239
  chainId,
411
240
  config,
412
241
  fundsList: adjustedFundsList, // ✅ 使用调整后的金额
413
- useNativeToken // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
242
+ useNativeToken, // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
414
243
  });
415
244
  // ✅ 利润多跳转账
416
245
  const profitTxs = [];
417
246
  let profitHopWallets;
418
247
  // ✅ 检查是否使用分布式利润模式
419
- const profitMode = config.profitMode || 'single';
420
- console.log('🔧 [SDK batchBuyWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', buyers.length);
248
+ const profitMode = config.profitMode ?? 'single';
421
249
  if (extractProfit && nativeProfitAmount > 0n) {
422
250
  if (profitMode === 'distributed') {
423
251
  // ✅ 分布式模式:每个钱包独立扣除自己的利润,每个都有独立的多跳
424
252
  // 最多支持 12 个钱包(12 交易 + 36 多跳 + 1 贿赂 = 49 笔)
425
253
  const MAX_DISTRIBUTED_WALLETS = 12;
426
- console.log('🔧 [SDK] 使用分布式利润模式,钱包数:', buyers.length);
427
254
  if (buyers.length > MAX_DISTRIBUTED_WALLETS) {
428
255
  throw new Error(`分布式利润模式最多支持 ${MAX_DISTRIBUTED_WALLETS} 个钱包,当前 ${buyers.length} 个`);
429
256
  }
@@ -433,9 +260,7 @@ export async function batchBuyWithBundleMerkle(params) {
433
260
  for (let i = 0; i < buyers.length; i++) {
434
261
  const walletOriginalAmount = originalAmounts[i];
435
262
  // 按比例计算该钱包应承担的利润
436
- const walletProfit = totalBuyAmount > 0n
437
- ? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount
438
- : 0n;
263
+ const walletProfit = totalBuyAmount > 0n ? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount : 0n;
439
264
  perWalletProfits.push(walletProfit);
440
265
  }
441
266
  // 为每个钱包生成独立的利润多跳交易
@@ -452,7 +277,7 @@ export async function batchBuyWithBundleMerkle(params) {
452
277
  gasPrice,
453
278
  chainId,
454
279
  txType: getTxType(config),
455
- startNonce: profitNonce
280
+ startNonce: profitNonce,
456
281
  });
457
282
  profitTxs.push(...profitHopResult.signedTransactions);
458
283
  if (profitHopResult.hopWallets) {
@@ -474,7 +299,7 @@ export async function batchBuyWithBundleMerkle(params) {
474
299
  gasPrice,
475
300
  chainId,
476
301
  txType: getTxType(config),
477
- startNonce: profitNonce
302
+ startNonce: profitNonce,
478
303
  });
479
304
  profitTxs.push(...profitHopResult.signedTransactions);
480
305
  profitHopWallets = profitHopResult.hopWallets;
@@ -489,7 +314,7 @@ export async function batchBuyWithBundleMerkle(params) {
489
314
  metadata: {
490
315
  ...buildProfitMetadata(extractProfit, totalBuyAmount, nativeProfitAmount, buyers.length),
491
316
  profitMode, // ✅ 返回使用的利润模式
492
- }
317
+ },
493
318
  };
494
319
  }
495
320
  /**
@@ -504,23 +329,22 @@ export async function batchSellWithBundleMerkle(params) {
504
329
  }
505
330
  const { provider, chainId } = createChainContext(chain, config.rpcUrl);
506
331
  const nonceManager = new NonceManager(provider);
507
- const signedTxs = [];
508
332
  const wallets = createWallets(privateKeys, provider);
509
- const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, 18));
333
+ const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, 18));
510
334
  const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
511
335
  const readOnlyPortal = new ethers.Contract(portalAddr, PORTAL_ABI, provider);
512
336
  const gasLimits = buildGasLimitList(wallets.length, config);
513
- const portals = wallets.map(w => new ethers.Contract(portalAddr, PORTAL_ABI, w));
337
+ const portals = wallets.map((w) => new ethers.Contract(portalAddr, PORTAL_ABI, w));
514
338
  // ✅ 确定 outputToken:如果传入了 quoteToken 且非零地址,则使用它;否则使用零地址(原生代币)
515
339
  const outputToken = quoteToken && quoteToken !== ZERO_ADDRESS ? quoteToken : ZERO_ADDRESS;
516
340
  const useNativeOutput = outputToken === ZERO_ADDRESS;
517
341
  // ✅ 优化:如果前端传入了 nonces,直接使用(跳过 RPC 调用)
518
342
  const presetNonces = config.nonces;
519
- const extractProfit = shouldExtractProfit(config);
343
+ const extractProfit = shouldExtractProfit();
520
344
  // ✅ 并行执行 gasPrice 和 quoteSellOutputs(Multicall3)
521
345
  const [gasPrice, quotedOutputs] = await Promise.all([
522
346
  resolveGasPrice(provider, config),
523
- quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken)
347
+ quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken),
524
348
  ]);
525
349
  // ✅ 计算利润和 maxRevenueIndex(用于 nonce 分配)
526
350
  let totalTokenProfit = 0n;
@@ -530,7 +354,7 @@ export async function batchSellWithBundleMerkle(params) {
530
354
  for (let i = 0; i < wallets.length; i++) {
531
355
  const quoted = quotedOutputs[i];
532
356
  if (quoted > 0n) {
533
- const { profit } = calculateProfit(quoted, config);
357
+ const { profit } = calculateProfit(quoted);
534
358
  totalTokenProfit += profit;
535
359
  if (quoted > maxRevenue) {
536
360
  maxRevenue = quoted;
@@ -562,9 +386,7 @@ export async function batchSellWithBundleMerkle(params) {
562
386
  const maxRevenueNonces = await nonceManager.getNextNonceBatch(wallets[maxRevenueIndex], maxRevenueNonceCount);
563
387
  // 其他钱包各需要 1 个 nonce
564
388
  const otherWallets = wallets.filter((_, i) => i !== maxRevenueIndex);
565
- const otherNonces = otherWallets.length > 0
566
- ? await nonceManager.getNextNoncesForWallets(otherWallets)
567
- : [];
389
+ const otherNonces = otherWallets.length > 0 ? await nonceManager.getNextNoncesForWallets(otherWallets) : [];
568
390
  // 组装最终的 nonces 数组(保持原顺序)
569
391
  nonces = [];
570
392
  let otherIdx = 0;
@@ -595,7 +417,7 @@ export async function batchSellWithBundleMerkle(params) {
595
417
  outputToken, // ✅ 使用动态 outputToken
596
418
  inputAmount: amountsWei[i],
597
419
  minOutputAmount: minOuts[i],
598
- permitData: '0x'
420
+ permitData: '0x',
599
421
  })));
600
422
  // ✅ 贿赂交易放在首位
601
423
  const bribeTxs = [];
@@ -607,7 +429,7 @@ export async function batchSellWithBundleMerkle(params) {
607
429
  gasPrice,
608
430
  gasLimit: GAS_LIMITS.BRIBE,
609
431
  chainId,
610
- type: getTxType(config)
432
+ type: getTxType(config),
611
433
  });
612
434
  bribeTxs.push(bribeTx);
613
435
  }
@@ -621,14 +443,13 @@ export async function batchSellWithBundleMerkle(params) {
621
443
  gasPrice,
622
444
  chainId,
623
445
  type: getTxType(config),
624
- value: 0n // ✅ 卖出交易不发送原生代币
446
+ value: 0n, // ✅ 卖出交易不发送原生代币
625
447
  })));
626
448
  // ✅ 利润多跳转账
627
449
  const profitTxs = [];
628
450
  let profitHopWallets;
629
451
  // ✅ 检查是否使用分布式利润模式
630
- const profitMode = config.profitMode || 'single';
631
- console.log('🔧 [SDK batchSellWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', wallets.length);
452
+ const profitMode = config.profitMode ?? 'single';
632
453
  if (needProfitTx) {
633
454
  // ERC20 输出时:获取代币利润等值的原生代币(BNB)报价
634
455
  let totalNativeProfitAmount = totalTokenProfit;
@@ -662,7 +483,7 @@ export async function batchSellWithBundleMerkle(params) {
662
483
  gasPrice,
663
484
  chainId,
664
485
  txType: getTxType(config),
665
- startNonce: walletProfitNonce
486
+ startNonce: walletProfitNonce,
666
487
  });
667
488
  profitTxs.push(...profitHopResult.signedTransactions);
668
489
  if (profitHopResult.hopWallets) {
@@ -684,7 +505,7 @@ export async function batchSellWithBundleMerkle(params) {
684
505
  gasPrice,
685
506
  chainId,
686
507
  txType: getTxType(config),
687
- startNonce: profitNonce
508
+ startNonce: profitNonce,
688
509
  });
689
510
  profitTxs.push(...profitHopResult.signedTransactions);
690
511
  profitHopWallets = profitHopResult.hopWallets;
@@ -700,7 +521,7 @@ export async function batchSellWithBundleMerkle(params) {
700
521
  metadata: {
701
522
  profitMode, // ✅ 返回使用的利润模式
702
523
  totalProfit: totalTokenProfit.toString(),
703
- }
524
+ },
704
525
  };
705
526
  }
706
527
  // ✅ Provider 缓存(复用连接,减少初始化开销)
@@ -721,29 +542,27 @@ function createChainContext(chain, rpcUrl) {
721
542
  return { chainId, provider };
722
543
  }
723
544
  async function resolveGasPrice(provider, config) {
724
- // 优化:如果前端传入了 gasPrice,直接使用(跳过 RPC 调用)
725
- if (config.gasPrice !== undefined) {
726
- const gasPrice = config.gasPrice;
727
- return gasPrice;
545
+ if ('gasPrice' in config && config.gasPrice !== undefined) {
546
+ return config.gasPrice;
728
547
  }
729
548
  return await getOptimizedGasPrice(provider, getGasPriceConfig(config));
730
549
  }
731
550
  function createWallets(privateKeys, provider) {
732
- return privateKeys.map(key => new Wallet(key, provider));
551
+ return privateKeys.map((key) => new Wallet(key, provider));
733
552
  }
734
553
  function analyzeBuyFunds(buyAmounts, config, extractProfit) {
735
554
  const result = {
736
555
  fundsList: [],
737
556
  originalAmounts: [],
738
557
  totalBuyAmount: 0n,
739
- totalProfit: 0n
558
+ totalProfit: 0n,
740
559
  };
741
- buyAmounts.forEach(amount => {
560
+ buyAmounts.forEach((amount) => {
742
561
  const originalAmount = ethers.parseEther(amount);
743
562
  result.originalAmounts.push(originalAmount);
744
563
  result.totalBuyAmount += originalAmount;
745
564
  if (extractProfit) {
746
- const { remaining, profit } = calculateProfit(originalAmount, config);
565
+ const { remaining, profit } = calculateProfit(originalAmount);
747
566
  result.totalProfit += profit;
748
567
  result.fundsList.push(remaining);
749
568
  }
@@ -772,13 +591,13 @@ function findMaxIndex(values) {
772
591
  * 当 inputToken 为非零地址(如 USDC)时,value 为 0
773
592
  */
774
593
  async function populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, fundsList, inputToken, useNativeToken) {
775
- const portals = buyers.map(wallet => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
594
+ const portals = buyers.map((wallet) => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
776
595
  return await Promise.all(portals.map((portal, i) => portal.swapExactInput.populateTransaction({
777
596
  inputToken,
778
597
  outputToken: tokenAddress,
779
598
  inputAmount: fundsList[i],
780
599
  minOutputAmount: 0n,
781
- permitData: '0x'
600
+ permitData: '0x',
782
601
  },
783
602
  // ✅ 如果使用原生代币,value 为购买金额;否则为 0
784
603
  useNativeToken ? { value: fundsList[i] } : {})));
@@ -815,9 +634,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
815
634
  const maxIndexNonces = await nonceManager.getNextNonceBatch(buyers[maxIndex], 2);
816
635
  // 其他钱包各需要 1 个 nonce
817
636
  const otherBuyers = buyers.filter((_, i) => i !== maxIndex);
818
- const otherNonces = otherBuyers.length > 0
819
- ? await nonceManager.getNextNoncesForWallets(otherBuyers)
820
- : [];
637
+ const otherNonces = otherBuyers.length > 0 ? await nonceManager.getNextNoncesForWallets(otherBuyers) : [];
821
638
  // 组装最终的 nonces 数组(保持原顺序)
822
639
  const nonces = [];
823
640
  let otherIdx = 0;
@@ -831,7 +648,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
831
648
  }
832
649
  return nonces;
833
650
  }
834
- async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true // ✅ 默认使用原生代币
651
+ async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true, // ✅ 默认使用原生代币
835
652
  }) {
836
653
  return await Promise.all(unsignedBuys.map((unsigned, i) => buyers[i].signTransaction({
837
654
  ...unsigned,
@@ -841,7 +658,7 @@ async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, ga
841
658
  gasPrice,
842
659
  chainId,
843
660
  type: getTxType(config),
844
- value: useNativeToken ? fundsList[i] : 0n // ✅ 非原生代币时 value 为 0
661
+ value: useNativeToken ? fundsList[i] : 0n, // ✅ 非原生代币时 value 为 0
845
662
  })));
846
663
  }
847
664
  function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCount) {
@@ -852,7 +669,7 @@ function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCo
852
669
  totalBuyAmount: ethers.formatEther(totalBuyAmount),
853
670
  profitAmount: ethers.formatEther(totalProfit),
854
671
  profitRecipient: getProfitRecipient(),
855
- buyerCount
672
+ buyerCount,
856
673
  };
857
674
  }
858
675
  /**
@@ -868,7 +685,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
868
685
  const result = await portal.quoteExactInput.staticCall({
869
686
  inputToken: tokenAddress,
870
687
  outputToken,
871
- inputAmount: amountsWei[0]
688
+ inputAmount: amountsWei[0],
872
689
  });
873
690
  return [result];
874
691
  }
@@ -881,14 +698,16 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
881
698
  const portalIface = new Interface(PORTAL_ABI);
882
699
  const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
883
700
  // 构建批量调用
884
- const calls = amountsWei.map(amount => ({
701
+ const calls = amountsWei.map((amount) => ({
885
702
  target: portalAddress,
886
703
  allowFailure: true, // 允许单个失败
887
- callData: portalIface.encodeFunctionData('quoteExactInput', [{
704
+ callData: portalIface.encodeFunctionData('quoteExactInput', [
705
+ {
888
706
  inputToken: tokenAddress,
889
707
  outputToken,
890
- inputAmount: amount
891
- }])
708
+ inputAmount: amount,
709
+ },
710
+ ]),
892
711
  }));
893
712
  try {
894
713
  const results = await multicall.aggregate3.staticCall(calls);
@@ -912,7 +731,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
912
731
  return await portal.quoteExactInput.staticCall({
913
732
  inputToken: tokenAddress,
914
733
  outputToken,
915
- inputAmount: amount
734
+ inputAmount: amount,
916
735
  });
917
736
  }
918
737
  catch {