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
@@ -1,92 +1,52 @@
1
+ /**
2
+ * core - 主函数
3
+ */
1
4
  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';
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';
6
9
  import { FLAP_PORTAL_ADDRESSES, FLAP_ORIGINAL_PORTAL_ADDRESSES } from '../constants.js';
7
- import { populateCreateTokenTransaction, resolveCreateTokenLaunchFlags, } from '../portal-create-token.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;
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
+ import { SdkError } from '../../../utils/errors.js';
15
+ import { SdkErrorCode } from '../../../types/errors.js';
16
+ function validateQuoteTokenDecimals(decimals, source) {
17
+ if (decimals === undefined)
18
+ return undefined;
19
+ if (!Number.isInteger(decimals) || decimals < 0 || decimals > 18) {
20
+ throw new SdkError(SdkErrorCode.INVALID_AMOUNT, `${source}: quoteTokenDecimals 必须是 0-18 的整数,收到 ${String(decimals)}`);
21
+ }
22
+ return decimals;
23
+ }
24
+ function resolveCreateTokenLaunchFlags(params) {
25
+ const normalizedTax = normalizeTaxLaunchConfig(params.taxV2Config, params.taxRate);
26
+ const isTaxLaunch = !!normalizedTax || (params.taxRate ?? 0) > 0;
27
+ const hasVault = !!normalizedTax?.vaultConfig && normalizedTax.vaultConfig.vaultType !== 'none';
28
+ const useV7Portal = !isTaxLaunch &&
29
+ !hasVault &&
30
+ (params.lpFeeProfile !== undefined ||
31
+ params.dexId !== undefined ||
32
+ params.migratorType === MigratorType.PCS_INFINITY_CL_MIGRATOR);
33
+ return { normalizedTax, isTaxLaunch, hasVault, useV7Portal };
34
+ }
24
35
  /**
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
36
+ * 无捆绑钱包、仅 Dev 自跟买、原生报价Flap 文档方式 A(create 内 quoteAmt + msg.value)
31
37
  */
32
- async function getTokenToNativeQuote(provider, tokenAddress, tokenAmount, chainId) {
33
- if (tokenAmount <= 0n)
34
- return 0n;
38
+ function canUseLaunchMethodA(privateKeys, buyAmounts, devAddress, useNativeToken) {
39
+ if (!useNativeToken || buyAmounts.length !== 1 || privateKeys.length !== 2) {
40
+ return false;
41
+ }
35
42
  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;
43
+ const buyerAddr = new Wallet(privateKeys[1]).address;
44
+ return buyerAddr.toLowerCase() === devAddress.toLowerCase();
62
45
  }
63
46
  catch {
64
- // 报价失败返回 0(可能是流动性不足或路径不存在)
65
- return 0n;
47
+ return false;
66
48
  }
67
49
  }
68
- /**
69
- * 获取 Gas Limit
70
- * 优先使用 config.gasLimit,否则使用默认值 * multiplier
71
- *
72
- * ✅ ethers v6 最佳实践:直接使用 bigint 类型
73
- */
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);
85
- }
86
- /**
87
- * Flap Protocol: 创建代币 + 捆绑购买(仅签名版本 - 不依赖 Merkle)
88
- * ✅ 精简版:只负责签名交易,不提交到 Merkle
89
- */
90
50
  export async function createTokenWithBundleBuyMerkle(params) {
91
51
  const { chain, privateKeys, buyAmounts, tokenInfo, tokenAddress, config } = params;
92
52
  if (privateKeys.length === 0) {
@@ -103,6 +63,16 @@ export async function createTokenWithBundleBuyMerkle(params) {
103
63
  const originalPortalAddr = FLAP_ORIGINAL_PORTAL_ADDRESSES[chain];
104
64
  const portal = new ethers.Contract(originalPortalAddr, PORTAL_ABI, devWallet);
105
65
  const { normalizedTax, useV7Portal } = resolveCreateTokenLaunchFlags(params);
66
+ const inputToken = params.quoteToken && params.quoteToken !== ZERO_ADDRESS ? params.quoteToken : ZERO_ADDRESS;
67
+ const useNativeToken = inputToken === ZERO_ADDRESS;
68
+ const extractProfit = config.extractProfitOnLaunch === false ? false : shouldExtractProfit(config);
69
+ const useMethodA = canUseLaunchMethodA(privateKeys, buyAmounts, devWallet.address, useNativeToken);
70
+ let methodAQuoteAmt = 0n;
71
+ let methodABuyMeta;
72
+ if (useMethodA) {
73
+ methodABuyMeta = analyzeBuyFunds(buyAmounts, config, extractProfit);
74
+ methodAQuoteAmt = methodABuyMeta.fundsList[0] ?? 0n;
75
+ }
106
76
  const createTxPromise = populateCreateTokenTransaction({
107
77
  chain,
108
78
  devWallet,
@@ -114,20 +84,18 @@ export async function createTokenWithBundleBuyMerkle(params) {
114
84
  salt: params.salt,
115
85
  migratorType: params.migratorType,
116
86
  taxRate: params.taxRate,
117
- buyTaxRate: params.buyTaxRate,
118
- sellTaxRate: params.sellTaxRate,
119
87
  dexId: params.dexId,
120
88
  lpFeeProfile: params.lpFeeProfile,
121
89
  extensionID: params.extensionID,
122
90
  extensionData: params.extensionData,
123
91
  useV7Portal,
124
92
  taxConfig: normalizedTax,
125
- initialQuoteAmt: 0n,
93
+ initialQuoteAmt: useMethodA ? methodAQuoteAmt : 0n,
126
94
  });
127
95
  const [gasPrice, createTxUnsigned, devNonce] = await Promise.all([
128
96
  resolveGasPrice(provider, config),
129
97
  createTxPromise,
130
- nonceManager.getNextNonce(devWallet)
98
+ nonceManager.getNextNonce(devWallet),
131
99
  ]);
132
100
  const createTxRequest = {
133
101
  ...createTxUnsigned,
@@ -136,36 +104,75 @@ export async function createTokenWithBundleBuyMerkle(params) {
136
104
  gasLimit: getGasLimit(config),
137
105
  gasPrice,
138
106
  chainId,
139
- type: getTxType(config)
107
+ type: getTxType(config),
108
+ value: useMethodA ? methodAQuoteAmt : 0n,
140
109
  };
141
110
  const signedCreateTx = await devWallet.signTransaction(createTxRequest);
142
111
  signedTxs.push(signedCreateTx);
112
+ if (useMethodA && methodABuyMeta) {
113
+ const { totalBuyAmount, totalProfit } = methodABuyMeta;
114
+ const bribeAmount = getBribeAmount(config);
115
+ const bribeTxs = [];
116
+ let nextDevNonce = devNonce + 1;
117
+ if (bribeAmount > 0n) {
118
+ const bribeTx = await devWallet.signTransaction({
119
+ to: BLOCKRAZOR_BUILDER_EOA,
120
+ value: bribeAmount,
121
+ nonce: nextDevNonce,
122
+ gasPrice,
123
+ gasLimit: GAS_LIMITS.BRIBE,
124
+ chainId,
125
+ type: getTxType(config),
126
+ });
127
+ bribeTxs.push(bribeTx);
128
+ nextDevNonce += 1;
129
+ }
130
+ const profitTxs = [];
131
+ let profitHopWallets;
132
+ if (extractProfit && totalProfit > 0n) {
133
+ const profitHopResult = await buildProfitHopTransactions({
134
+ provider,
135
+ payerWallet: devWallet,
136
+ profitAmount: totalProfit,
137
+ profitRecipient: getProfitRecipient(),
138
+ hopCount: PROFIT_HOP_COUNT,
139
+ gasPrice,
140
+ chainId,
141
+ txType: getTxType(config),
142
+ startNonce: nextDevNonce,
143
+ });
144
+ profitTxs.push(...profitHopResult.signedTransactions);
145
+ profitHopWallets = profitHopResult.hopWallets;
146
+ }
147
+ nonceManager.clearTemp();
148
+ return {
149
+ signedTransactions: [...bribeTxs, ...signedTxs, ...profitTxs],
150
+ tokenAddress,
151
+ profitHopWallets,
152
+ metadata: {
153
+ ...buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, 0),
154
+ launchMethod: 'quoteAmt',
155
+ },
156
+ };
157
+ }
143
158
  const buyers = createWallets(privateKeys.slice(1), provider);
144
- const extractProfit = shouldExtractProfit(config);
145
159
  const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
146
160
  const maxFundsIndex = findMaxIndex(originalAmounts);
147
161
  const gasLimits = buildGasLimitList(buyers.length, config);
148
- // 支持 quoteToken:如果传入了 quoteToken 且非零地址,则使用它
149
- const inputToken = params.quoteToken && params.quoteToken !== ZERO_ADDRESS ? params.quoteToken : ZERO_ADDRESS;
150
- const useNativeToken = inputToken === ZERO_ADDRESS;
162
+ const validatedCreateQuoteDecimals = validateQuoteTokenDecimals(params.quoteTokenDecimals, 'createTokenWithBundleBuyMerkle');
151
163
  // ✅ 如果使用非原生代币(如 USDC),需要根据精度转换金额
152
164
  let adjustedFundsList = fundsList;
153
165
  let profitTokenAmount = totalProfit;
154
- if (!useNativeToken && params.quoteTokenDecimals !== undefined && params.quoteTokenDecimals !== 18) {
155
- const decimalsDiff = 18 - params.quoteTokenDecimals;
166
+ if (!useNativeToken && validatedCreateQuoteDecimals !== undefined && validatedCreateQuoteDecimals !== 18) {
167
+ const decimalsDiff = 18 - validatedCreateQuoteDecimals;
156
168
  const divisor = BigInt(10 ** decimalsDiff);
157
- adjustedFundsList = fundsList.map(amount => amount / divisor);
169
+ adjustedFundsList = fundsList.map((amount) => amount / divisor);
158
170
  profitTokenAmount = totalProfit / divisor;
159
171
  }
160
172
  // ✅ 优化:并行获取 unsignedBuys 和 buyerNonces
161
- // TOKEN_V3_PERMIT / newTokenV7 内盘买入须 swapExactInputV3(与 create-to-dex 一致)
162
- const usePortalSwapV3 = useV7Portal ||
163
- (params.lpFeeProfile !== undefined && !normalizedTax) ||
164
- (!!params.extensionID &&
165
- params.extensionID !== '0x' + '00'.repeat(32));
166
173
  const [unsignedBuys, buyerNonces] = await Promise.all([
167
- populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, adjustedFundsList, inputToken, useNativeToken, usePortalSwapV3, params.extensionData ?? '0x'),
168
- allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager)
174
+ populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, adjustedFundsList, inputToken, useNativeToken),
175
+ allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, useNativeToken ? totalProfit : profitTokenAmount, nonceManager),
169
176
  ]);
170
177
  // ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
171
178
  const bribeAmount = getBribeAmount(config);
@@ -180,7 +187,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
180
187
  gasPrice,
181
188
  gasLimit: GAS_LIMITS.BRIBE,
182
189
  chainId,
183
- type: getTxType(config)
190
+ type: getTxType(config),
184
191
  });
185
192
  bribeTxs.push(bribeTx);
186
193
  // 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
@@ -195,7 +202,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
195
202
  chainId,
196
203
  config,
197
204
  fundsList: adjustedFundsList, // ✅ 使用调整后的金额
198
- useNativeToken // ✅ 传递是否使用原生代币
205
+ useNativeToken, // ✅ 传递是否使用原生代币
199
206
  });
200
207
  // ✅ 利润多跳转账(强制 2 跳中转)
201
208
  const profitTxs = [];
@@ -216,7 +223,7 @@ export async function createTokenWithBundleBuyMerkle(params) {
216
223
  gasPrice,
217
224
  chainId,
218
225
  txType: getTxType(config),
219
- startNonce: profitNonce
226
+ startNonce: profitNonce,
220
227
  });
221
228
  profitTxs.push(...profitHopResult.signedTransactions);
222
229
  profitHopWallets = profitHopResult.hopWallets; // ✅ 收集利润多跳钱包
@@ -228,7 +235,10 @@ export async function createTokenWithBundleBuyMerkle(params) {
228
235
  signedTransactions: [...bribeTxs, ...signedTxs, ...signedBuys, ...profitTxs],
229
236
  tokenAddress,
230
237
  profitHopWallets, // ✅ 返回利润多跳钱包
231
- metadata: buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length)
238
+ metadata: {
239
+ ...buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyers.length),
240
+ launchMethod: 'swapExactInput',
241
+ },
232
242
  };
233
243
  }
234
244
  /**
@@ -243,9 +253,8 @@ export async function batchBuyWithBundleMerkle(params) {
243
253
  }
244
254
  const { provider, chainId } = createChainContext(chain, config.rpcUrl);
245
255
  const nonceManager = new NonceManager(provider);
246
- const signedTxs = [];
247
256
  const buyers = createWallets(privateKeys, provider);
248
- const extractProfit = shouldExtractProfit(config);
257
+ const extractProfit = shouldExtractProfit();
249
258
  const { fundsList, originalAmounts, totalBuyAmount, totalProfit } = analyzeBuyFunds(buyAmounts, config, extractProfit);
250
259
  const maxFundsIndex = findMaxIndex(originalAmounts);
251
260
  const gasLimits = buildGasLimitList(buyers.length, config);
@@ -253,17 +262,18 @@ export async function batchBuyWithBundleMerkle(params) {
253
262
  const inputToken = quoteToken && quoteToken !== ZERO_ADDRESS ? quoteToken : ZERO_ADDRESS;
254
263
  // ✅ 如果使用非原生代币,则 value 应为 0(不发送原生代币)
255
264
  const useNativeToken = inputToken === ZERO_ADDRESS;
265
+ const validatedBatchQuoteDecimals = validateQuoteTokenDecimals(quoteTokenDecimals, 'batchBuyWithBundleMerkle');
256
266
  // ✅ 如果使用非原生代币(如 USDC),需要根据精度转换金额
257
267
  // buyAmounts 是按 18 位精度传入的,需要转换为目标代币精度
258
268
  let adjustedFundsList = fundsList;
259
269
  let profitTokenAmount = totalProfit;
260
- if (!useNativeToken && quoteTokenDecimals !== undefined && quoteTokenDecimals !== 18) {
270
+ if (!useNativeToken && validatedBatchQuoteDecimals !== undefined && validatedBatchQuoteDecimals !== 18) {
261
271
  // 从 18 位精度转换为目标精度
262
272
  // 例如:0.1 ETH (18位) = 100000000000000000 wei
263
273
  // 转为 USDC (6位) = 100000 (0.1 USDC)
264
- const decimalsDiff = 18 - quoteTokenDecimals;
274
+ const decimalsDiff = 18 - validatedBatchQuoteDecimals;
265
275
  const divisor = BigInt(10 ** decimalsDiff);
266
- adjustedFundsList = fundsList.map(amount => amount / divisor);
276
+ adjustedFundsList = fundsList.map((amount) => amount / divisor);
267
277
  profitTokenAmount = totalProfit / divisor;
268
278
  }
269
279
  // ✅ ERC20 购买:获取代币利润等值的原生代币(BNB)报价
@@ -280,10 +290,8 @@ export async function batchBuyWithBundleMerkle(params) {
280
290
  populateBuyTransactionsWithQuote(buyers, FLAP_PORTAL_ADDRESSES[chain], tokenAddress, adjustedFundsList, inputToken, useNativeToken),
281
291
  presetNonces && presetNonces.length === buyers.length
282
292
  ? adjustNoncesForProfit(presetNonces) // ✅ 调整 nonces 避免冲突
283
- : allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager)
293
+ : allocateBuyerNonces(buyers, extractProfit, maxFundsIndex, nativeProfitAmount, nonceManager),
284
294
  ]);
285
- if (presetNonces) {
286
- }
287
295
  // ✅ 贿赂交易放在首位(提高 BlockRazor 打包优先级)
288
296
  const bribeAmount = getBribeAmount(config);
289
297
  const bribeTxs = [];
@@ -296,7 +304,7 @@ export async function batchBuyWithBundleMerkle(params) {
296
304
  gasPrice,
297
305
  gasLimit: GAS_LIMITS.BRIBE,
298
306
  chainId,
299
- type: getTxType(config)
307
+ type: getTxType(config),
300
308
  });
301
309
  bribeTxs.push(bribeTx);
302
310
  // 调整 maxFundsIndex 钱包的 nonce(买入交易 +1)
@@ -311,20 +319,18 @@ export async function batchBuyWithBundleMerkle(params) {
311
319
  chainId,
312
320
  config,
313
321
  fundsList: adjustedFundsList, // ✅ 使用调整后的金额
314
- useNativeToken // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
322
+ useNativeToken, // ✅ USDT 购买时 value=0,BNB 购买时 value=金额
315
323
  });
316
324
  // ✅ 利润多跳转账
317
325
  const profitTxs = [];
318
326
  let profitHopWallets;
319
327
  // ✅ 检查是否使用分布式利润模式
320
- const profitMode = config.profitMode || 'single';
321
- console.log('🔧 [SDK batchBuyWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', buyers.length);
328
+ const profitMode = config.profitMode ?? 'single';
322
329
  if (extractProfit && nativeProfitAmount > 0n) {
323
330
  if (profitMode === 'distributed') {
324
331
  // ✅ 分布式模式:每个钱包独立扣除自己的利润,每个都有独立的多跳
325
332
  // 最多支持 12 个钱包(12 交易 + 36 多跳 + 1 贿赂 = 49 笔)
326
333
  const MAX_DISTRIBUTED_WALLETS = 12;
327
- console.log('🔧 [SDK] 使用分布式利润模式,钱包数:', buyers.length);
328
334
  if (buyers.length > MAX_DISTRIBUTED_WALLETS) {
329
335
  throw new Error(`分布式利润模式最多支持 ${MAX_DISTRIBUTED_WALLETS} 个钱包,当前 ${buyers.length} 个`);
330
336
  }
@@ -334,9 +340,7 @@ export async function batchBuyWithBundleMerkle(params) {
334
340
  for (let i = 0; i < buyers.length; i++) {
335
341
  const walletOriginalAmount = originalAmounts[i];
336
342
  // 按比例计算该钱包应承担的利润
337
- const walletProfit = totalBuyAmount > 0n
338
- ? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount
339
- : 0n;
343
+ const walletProfit = totalBuyAmount > 0n ? (nativeProfitAmount * walletOriginalAmount) / totalBuyAmount : 0n;
340
344
  perWalletProfits.push(walletProfit);
341
345
  }
342
346
  // 为每个钱包生成独立的利润多跳交易
@@ -353,7 +357,7 @@ export async function batchBuyWithBundleMerkle(params) {
353
357
  gasPrice,
354
358
  chainId,
355
359
  txType: getTxType(config),
356
- startNonce: profitNonce
360
+ startNonce: profitNonce,
357
361
  });
358
362
  profitTxs.push(...profitHopResult.signedTransactions);
359
363
  if (profitHopResult.hopWallets) {
@@ -375,7 +379,7 @@ export async function batchBuyWithBundleMerkle(params) {
375
379
  gasPrice,
376
380
  chainId,
377
381
  txType: getTxType(config),
378
- startNonce: profitNonce
382
+ startNonce: profitNonce,
379
383
  });
380
384
  profitTxs.push(...profitHopResult.signedTransactions);
381
385
  profitHopWallets = profitHopResult.hopWallets;
@@ -390,7 +394,7 @@ export async function batchBuyWithBundleMerkle(params) {
390
394
  metadata: {
391
395
  ...buildProfitMetadata(extractProfit, totalBuyAmount, nativeProfitAmount, buyers.length),
392
396
  profitMode, // ✅ 返回使用的利润模式
393
- }
397
+ },
394
398
  };
395
399
  }
396
400
  /**
@@ -405,23 +409,22 @@ export async function batchSellWithBundleMerkle(params) {
405
409
  }
406
410
  const { provider, chainId } = createChainContext(chain, config.rpcUrl);
407
411
  const nonceManager = new NonceManager(provider);
408
- const signedTxs = [];
409
412
  const wallets = createWallets(privateKeys, provider);
410
- const amountsWei = sellAmounts.map(a => ethers.parseUnits(a, 18));
413
+ const amountsWei = sellAmounts.map((a) => ethers.parseUnits(a, 18));
411
414
  const portalAddr = FLAP_PORTAL_ADDRESSES[chain];
412
415
  const readOnlyPortal = new ethers.Contract(portalAddr, PORTAL_ABI, provider);
413
416
  const gasLimits = buildGasLimitList(wallets.length, config);
414
- const portals = wallets.map(w => new ethers.Contract(portalAddr, PORTAL_ABI, w));
417
+ const portals = wallets.map((w) => new ethers.Contract(portalAddr, PORTAL_ABI, w));
415
418
  // ✅ 确定 outputToken:如果传入了 quoteToken 且非零地址,则使用它;否则使用零地址(原生代币)
416
419
  const outputToken = quoteToken && quoteToken !== ZERO_ADDRESS ? quoteToken : ZERO_ADDRESS;
417
420
  const useNativeOutput = outputToken === ZERO_ADDRESS;
418
421
  // ✅ 优化:如果前端传入了 nonces,直接使用(跳过 RPC 调用)
419
422
  const presetNonces = config.nonces;
420
- const extractProfit = shouldExtractProfit(config);
423
+ const extractProfit = shouldExtractProfit();
421
424
  // ✅ 并行执行 gasPrice 和 quoteSellOutputs(Multicall3)
422
425
  const [gasPrice, quotedOutputs] = await Promise.all([
423
426
  resolveGasPrice(provider, config),
424
- quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken)
427
+ quoteSellOutputsWithQuote(readOnlyPortal, tokenAddress, amountsWei, outputToken),
425
428
  ]);
426
429
  // ✅ 计算利润和 maxRevenueIndex(用于 nonce 分配)
427
430
  let totalTokenProfit = 0n;
@@ -431,7 +434,7 @@ export async function batchSellWithBundleMerkle(params) {
431
434
  for (let i = 0; i < wallets.length; i++) {
432
435
  const quoted = quotedOutputs[i];
433
436
  if (quoted > 0n) {
434
- const { profit } = calculateProfit(quoted, config);
437
+ const { profit } = calculateProfit(quoted);
435
438
  totalTokenProfit += profit;
436
439
  if (quoted > maxRevenue) {
437
440
  maxRevenue = quoted;
@@ -463,9 +466,7 @@ export async function batchSellWithBundleMerkle(params) {
463
466
  const maxRevenueNonces = await nonceManager.getNextNonceBatch(wallets[maxRevenueIndex], maxRevenueNonceCount);
464
467
  // 其他钱包各需要 1 个 nonce
465
468
  const otherWallets = wallets.filter((_, i) => i !== maxRevenueIndex);
466
- const otherNonces = otherWallets.length > 0
467
- ? await nonceManager.getNextNoncesForWallets(otherWallets)
468
- : [];
469
+ const otherNonces = otherWallets.length > 0 ? await nonceManager.getNextNoncesForWallets(otherWallets) : [];
469
470
  // 组装最终的 nonces 数组(保持原顺序)
470
471
  nonces = [];
471
472
  let otherIdx = 0;
@@ -496,7 +497,7 @@ export async function batchSellWithBundleMerkle(params) {
496
497
  outputToken, // ✅ 使用动态 outputToken
497
498
  inputAmount: amountsWei[i],
498
499
  minOutputAmount: minOuts[i],
499
- permitData: '0x'
500
+ permitData: '0x',
500
501
  })));
501
502
  // ✅ 贿赂交易放在首位
502
503
  const bribeTxs = [];
@@ -508,7 +509,7 @@ export async function batchSellWithBundleMerkle(params) {
508
509
  gasPrice,
509
510
  gasLimit: GAS_LIMITS.BRIBE,
510
511
  chainId,
511
- type: getTxType(config)
512
+ type: getTxType(config),
512
513
  });
513
514
  bribeTxs.push(bribeTx);
514
515
  }
@@ -522,14 +523,13 @@ export async function batchSellWithBundleMerkle(params) {
522
523
  gasPrice,
523
524
  chainId,
524
525
  type: getTxType(config),
525
- value: 0n // ✅ 卖出交易不发送原生代币
526
+ value: 0n, // ✅ 卖出交易不发送原生代币
526
527
  })));
527
528
  // ✅ 利润多跳转账
528
529
  const profitTxs = [];
529
530
  let profitHopWallets;
530
531
  // ✅ 检查是否使用分布式利润模式
531
- const profitMode = config.profitMode || 'single';
532
- console.log('🔧 [SDK batchSellWithBundleMerkle] config.profitMode:', config.profitMode, '-> resolved:', profitMode, 'wallets:', wallets.length);
532
+ const profitMode = config.profitMode ?? 'single';
533
533
  if (needProfitTx) {
534
534
  // ERC20 输出时:获取代币利润等值的原生代币(BNB)报价
535
535
  let totalNativeProfitAmount = totalTokenProfit;
@@ -563,7 +563,7 @@ export async function batchSellWithBundleMerkle(params) {
563
563
  gasPrice,
564
564
  chainId,
565
565
  txType: getTxType(config),
566
- startNonce: walletProfitNonce
566
+ startNonce: walletProfitNonce,
567
567
  });
568
568
  profitTxs.push(...profitHopResult.signedTransactions);
569
569
  if (profitHopResult.hopWallets) {
@@ -585,7 +585,7 @@ export async function batchSellWithBundleMerkle(params) {
585
585
  gasPrice,
586
586
  chainId,
587
587
  txType: getTxType(config),
588
- startNonce: profitNonce
588
+ startNonce: profitNonce,
589
589
  });
590
590
  profitTxs.push(...profitHopResult.signedTransactions);
591
591
  profitHopWallets = profitHopResult.hopWallets;
@@ -601,7 +601,7 @@ export async function batchSellWithBundleMerkle(params) {
601
601
  metadata: {
602
602
  profitMode, // ✅ 返回使用的利润模式
603
603
  totalProfit: totalTokenProfit.toString(),
604
- }
604
+ },
605
605
  };
606
606
  }
607
607
  // ✅ Provider 缓存(复用连接,减少初始化开销)
@@ -622,29 +622,27 @@ function createChainContext(chain, rpcUrl) {
622
622
  return { chainId, provider };
623
623
  }
624
624
  async function resolveGasPrice(provider, config) {
625
- // 优化:如果前端传入了 gasPrice,直接使用(跳过 RPC 调用)
626
- if (config.gasPrice !== undefined) {
627
- const gasPrice = config.gasPrice;
628
- return gasPrice;
625
+ if ('gasPrice' in config && config.gasPrice !== undefined) {
626
+ return config.gasPrice;
629
627
  }
630
628
  return await getOptimizedGasPrice(provider, getGasPriceConfig(config));
631
629
  }
632
630
  function createWallets(privateKeys, provider) {
633
- return privateKeys.map(key => new Wallet(key, provider));
631
+ return privateKeys.map((key) => new Wallet(key, provider));
634
632
  }
635
633
  function analyzeBuyFunds(buyAmounts, config, extractProfit) {
636
634
  const result = {
637
635
  fundsList: [],
638
636
  originalAmounts: [],
639
637
  totalBuyAmount: 0n,
640
- totalProfit: 0n
638
+ totalProfit: 0n,
641
639
  };
642
- buyAmounts.forEach(amount => {
640
+ buyAmounts.forEach((amount) => {
643
641
  const originalAmount = ethers.parseEther(amount);
644
642
  result.originalAmounts.push(originalAmount);
645
643
  result.totalBuyAmount += originalAmount;
646
644
  if (extractProfit) {
647
- const { remaining, profit } = calculateProfit(originalAmount, config);
645
+ const { remaining, profit } = calculateProfit(originalAmount);
648
646
  result.totalProfit += profit;
649
647
  result.fundsList.push(remaining);
650
648
  }
@@ -672,22 +670,17 @@ function findMaxIndex(values) {
672
670
  * ✅ 支持 quoteToken 的买入交易构建
673
671
  * 当 inputToken 为非零地址(如 USDC)时,value 为 0
674
672
  */
675
- async function populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, fundsList, inputToken, useNativeToken, usePortalSwapV3 = false, extensionData = '0x') {
676
- const portals = buyers.map(wallet => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
677
- return await Promise.all(portals.map((portal, i) => {
678
- const swapParams = {
679
- inputToken,
680
- outputToken: tokenAddress,
681
- inputAmount: fundsList[i],
682
- minOutputAmount: 0n,
683
- permitData: '0x',
684
- };
685
- const overrides = useNativeToken ? { value: fundsList[i] } : {};
686
- if (usePortalSwapV3) {
687
- return portal.swapExactInputV3.populateTransaction({ ...swapParams, extensionData: extensionData ?? '0x' }, overrides);
688
- }
689
- return portal.swapExactInput.populateTransaction(swapParams, overrides);
690
- }));
673
+ async function populateBuyTransactionsWithQuote(buyers, portalAddr, tokenAddress, fundsList, inputToken, useNativeToken) {
674
+ const portals = buyers.map((wallet) => new ethers.Contract(portalAddr, PORTAL_ABI, wallet));
675
+ return await Promise.all(portals.map((portal, i) => portal.swapExactInput.populateTransaction({
676
+ inputToken,
677
+ outputToken: tokenAddress,
678
+ inputAmount: fundsList[i],
679
+ minOutputAmount: 0n,
680
+ permitData: '0x',
681
+ },
682
+ // ✅ 如果使用原生代币,value 为购买金额;否则为 0
683
+ useNativeToken ? { value: fundsList[i] } : {})));
691
684
  }
692
685
  function buildGasLimitList(length, config) {
693
686
  const gasLimit = getGasLimit(config);
@@ -721,9 +714,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
721
714
  const maxIndexNonces = await nonceManager.getNextNonceBatch(buyers[maxIndex], 2);
722
715
  // 其他钱包各需要 1 个 nonce
723
716
  const otherBuyers = buyers.filter((_, i) => i !== maxIndex);
724
- const otherNonces = otherBuyers.length > 0
725
- ? await nonceManager.getNextNoncesForWallets(otherBuyers)
726
- : [];
717
+ const otherNonces = otherBuyers.length > 0 ? await nonceManager.getNextNoncesForWallets(otherBuyers) : [];
727
718
  // 组装最终的 nonces 数组(保持原顺序)
728
719
  const nonces = [];
729
720
  let otherIdx = 0;
@@ -737,7 +728,7 @@ async function allocateBuyerNonces(buyers, extractProfit, maxIndex, totalProfit,
737
728
  }
738
729
  return nonces;
739
730
  }
740
- async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true // ✅ 默认使用原生代币
731
+ async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, gasPrice, chainId, config, fundsList, useNativeToken = true, // ✅ 默认使用原生代币
741
732
  }) {
742
733
  return await Promise.all(unsignedBuys.map((unsigned, i) => buyers[i].signTransaction({
743
734
  ...unsigned,
@@ -747,7 +738,7 @@ async function signBuyTransactions({ unsignedBuys, buyers, nonces, gasLimits, ga
747
738
  gasPrice,
748
739
  chainId,
749
740
  type: getTxType(config),
750
- value: useNativeToken ? fundsList[i] : 0n // ✅ 非原生代币时 value 为 0
741
+ value: useNativeToken ? fundsList[i] : 0n, // ✅ 非原生代币时 value 为 0
751
742
  })));
752
743
  }
753
744
  function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCount) {
@@ -758,7 +749,7 @@ function buildProfitMetadata(extractProfit, totalBuyAmount, totalProfit, buyerCo
758
749
  totalBuyAmount: ethers.formatEther(totalBuyAmount),
759
750
  profitAmount: ethers.formatEther(totalProfit),
760
751
  profitRecipient: getProfitRecipient(),
761
- buyerCount
752
+ buyerCount,
762
753
  };
763
754
  }
764
755
  /**
@@ -774,7 +765,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
774
765
  const result = await portal.quoteExactInput.staticCall({
775
766
  inputToken: tokenAddress,
776
767
  outputToken,
777
- inputAmount: amountsWei[0]
768
+ inputAmount: amountsWei[0],
778
769
  });
779
770
  return [result];
780
771
  }
@@ -787,14 +778,16 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
787
778
  const portalIface = new Interface(PORTAL_ABI);
788
779
  const multicall = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
789
780
  // 构建批量调用
790
- const calls = amountsWei.map(amount => ({
781
+ const calls = amountsWei.map((amount) => ({
791
782
  target: portalAddress,
792
783
  allowFailure: true, // 允许单个失败
793
- callData: portalIface.encodeFunctionData('quoteExactInput', [{
784
+ callData: portalIface.encodeFunctionData('quoteExactInput', [
785
+ {
794
786
  inputToken: tokenAddress,
795
787
  outputToken,
796
- inputAmount: amount
797
- }])
788
+ inputAmount: amount,
789
+ },
790
+ ]),
798
791
  }));
799
792
  try {
800
793
  const results = await multicall.aggregate3.staticCall(calls);
@@ -818,7 +811,7 @@ async function quoteSellOutputsWithQuote(portal, tokenAddress, amountsWei, outpu
818
811
  return await portal.quoteExactInput.staticCall({
819
812
  inputToken: tokenAddress,
820
813
  outputToken,
821
- inputAmount: amount
814
+ inputAmount: amount,
822
815
  });
823
816
  }
824
817
  catch {