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
@@ -0,0 +1,539 @@
1
+ import { ethers, Contract } from 'ethers';
2
+ import { createProvider } from '../utils/provider-factory.js';
3
+ import { V2_ROUTER_ABI as _V2_ROUTER_ABI, V3_ROUTER02_ABI as _V3_ROUTER02_ABI, V3_ROUTER_LEGACY_ABI as _V3_ROUTER_LEGACY_ABI, SWAP_ROUTER02_V2_ABI as _SWAP_ROUTER02_V2_ABI, } from '../abis/common.js';
4
+ import { ADDRESSES, GAS_LIMITS, getProfitRecipient, getProfitRateBps, ZERO_ADDRESS, BLOCKRAZOR_BUILDER_EOA, } from '../shared/constants/index.js';
5
+ import { getOptimizedGasPrice, buildProfitHopTransactions, PROFIT_HOP_COUNT, getDeadline as bundleGetDeadline, buildGasFields, } from '../utils/bundle-helpers.js';
6
+ /**
7
+ * 直接 Router 交易(不走代理合约)
8
+ *
9
+ * 支持:
10
+ * - BSC: PancakeSwap V2/V3
11
+ * - Monad: PancakeSwap V2, Uniswap V2/V3
12
+ *
13
+ * 收费方式:交易末尾附加利润提取交易(和内盘一致)
14
+ */
15
+ // ============================================================================
16
+ // ✅ 方案 C:Provider 缓存(避免重复创建)
17
+ // ============================================================================
18
+ export const providerCache = new Map();
19
+ export const PROVIDER_CACHE_TTL = 60000; // 60秒后过期
20
+ export const providerCacheTimestamps = new Map();
21
+ /**
22
+ * 获取缓存的 Provider 实例
23
+ * - 根据 rpcUrl + chainId 作为缓存 key
24
+ * - 60秒后自动失效,避免长连接问题
25
+ */
26
+ export function getCachedProvider(rpcUrl, chainId, chainName) {
27
+ const cacheKey = `${rpcUrl}_${chainId}`;
28
+ const now = Date.now();
29
+ // 检查缓存是否存在且未过期
30
+ const cachedProvider = providerCache.get(cacheKey);
31
+ const timestamp = providerCacheTimestamps.get(cacheKey) || 0;
32
+ if (cachedProvider && now - timestamp < PROVIDER_CACHE_TTL) {
33
+ return cachedProvider;
34
+ }
35
+ // ✅ 禁用 ENS: 避免 "network does not support ENS" 错误
36
+ const provider = createProvider(rpcUrl, chainId, chainName);
37
+ providerCache.set(cacheKey, provider);
38
+ providerCacheTimestamps.set(cacheKey, now);
39
+ return provider;
40
+ }
41
+ export const DEFAULT_GAS_LIMIT = 300000;
42
+ export const DEADLINE_MINUTES = 20;
43
+ // ✅ BLOCKRAZOR_BUILDER_EOA 从公共模块导入
44
+ /**
45
+ * 截断小数位数,避免超过代币精度导致 parseUnits 报错
46
+ * 例如:truncateDecimals("21906.025000000000000000", 1) => "21906.0"
47
+ */
48
+ export function truncateDecimals(value, decimals) {
49
+ if (!value || decimals < 0)
50
+ return value;
51
+ const parts = value.split('.');
52
+ if (parts.length === 1)
53
+ return value; // 没有小数点
54
+ const integerPart = parts[0];
55
+ const decimalPart = parts[1];
56
+ if (decimals === 0)
57
+ return integerPart;
58
+ // 截断到指定小数位数
59
+ const truncatedDecimal = decimalPart.slice(0, decimals);
60
+ // 如果截断后没有小数部分,只返回整数部分
61
+ if (!truncatedDecimal || truncatedDecimal === '')
62
+ return integerPart;
63
+ return `${integerPart}.${truncatedDecimal}`;
64
+ }
65
+ /** Router 地址配置 - ✅ 使用公共模块中的地址 */
66
+ export const DIRECT_ROUTERS = {
67
+ BSC: {
68
+ PANCAKESWAP_V2: ADDRESSES.BSC.PancakeV2Router,
69
+ PANCAKESWAP_V3: ADDRESSES.BSC.PancakeV3Router,
70
+ IROSWAP_V2: ADDRESSES.BSC.IroSwapV2Router,
71
+ WBNB: ADDRESSES.BSC.WBNB,
72
+ },
73
+ MONAD: {
74
+ // PancakeSwap
75
+ PANCAKESWAP_V2: '0xB1Bc24c34e88f7D43D5923034E3a14B24DaACfF9',
76
+ PANCAKESWAP_V3: '0x1b81D678ffb9C0263b24A97847620C99d213eB14',
77
+ // Uniswap
78
+ UNISWAP_V2: '0x4b2ab38dbf28d31d467aa8993f6c2585981d6804',
79
+ UNISWAP_V3: '0xd6145b2d3f379919e8cdeda7b97e37c4b2ca9c40',
80
+ // Wrapped Native
81
+ WMON: ADDRESSES.MONAD.WMON,
82
+ },
83
+ // XLayer (PotatoSwap + DYORSwap)
84
+ XLAYER: {
85
+ POTATOSWAP_V2: '0x881fb2f98c13d521009464e7d1cbf16e1b394e8e',
86
+ POTATOSWAP_V3: '0xB45D0149249488333E3F3f9F359807F4b810C1FC',
87
+ DYORSWAP_ROUTER: '0xfb001fbbace32f09cb6d3c449b935183de53ee96',
88
+ DYORSWAP_FACTORY: '0x2CcaDb1e437AA9cDc741574bDa154686B1F04C09',
89
+ V3_ROUTER: '0xBB069e9465BcabC4F488d21e793BDEf0F2d41D41',
90
+ V3_FACTORY: '0xa1415fAe79c4B196d087F02b8aD5a622B8A827E5',
91
+ WOKB: '0xe538905cf8410324e03a5a23c1c177a474d59b2b',
92
+ },
93
+ ENI: {
94
+ DSWAP_V2: ADDRESSES.ENI.DswapV2Router,
95
+ DSWAP_V3: ADDRESSES.ENI.DswapV3Router02,
96
+ IROSWAP_V2: ADDRESSES.ENI.IroSwapV2Router,
97
+ WEGAS: ADDRESSES.ENI.WEGAS,
98
+ },
99
+ };
100
+ /** 链 ID 映射 */
101
+ export const CHAIN_IDS = {
102
+ BSC: 56,
103
+ MONAD: 143,
104
+ XLAYER: 196,
105
+ ENI: 173,
106
+ };
107
+ /** 获取原生包装代币地址 */
108
+ export function getWrappedNative(chain) {
109
+ const chainUpper = chain.toUpperCase();
110
+ if (chainUpper === 'BSC')
111
+ return DIRECT_ROUTERS.BSC.WBNB;
112
+ if (chainUpper === 'MONAD')
113
+ return DIRECT_ROUTERS.MONAD.WMON;
114
+ if (chainUpper === 'XLAYER')
115
+ return DIRECT_ROUTERS.XLAYER.WOKB;
116
+ if (chainUpper === 'ENI')
117
+ return DIRECT_ROUTERS.ENI.WEGAS;
118
+ throw new Error(`Unsupported chain: ${chain}`);
119
+ }
120
+ // ============================================================================
121
+ // ABI - ✅ 使用公共模块
122
+ // ============================================================================
123
+ /** V2 Router ABI */
124
+ export const V2_ROUTER_ABI = _V2_ROUTER_ABI;
125
+ /** SwapRouter02 的 V2 方法 ABI - ✅ 从公共模块导入 */
126
+ export const SWAP_ROUTER02_V2_ABI = _SWAP_ROUTER02_V2_ABI;
127
+ /**
128
+ * DYORSwap SwapRouter02 的 V2 方法
129
+ *
130
+ * ⚠️ 重要:DYORSwap 使用自定义的函数签名,无法通过标准 ABI 编码
131
+ * 必须手动构造 calldata
132
+ *
133
+ * swapExactTokensForTokens selector: 0x3234fe0d
134
+ * unwrapWETH9 selector: 0x7342292e
135
+ * refundETH selector: 0x6d29fcf4
136
+ */
137
+ export const DYORSWAP_SELECTORS = {
138
+ swapExactTokensForTokens: '0x3234fe0d',
139
+ unwrapWETH9: '0x7342292e',
140
+ refundETH: '0x6d29fcf4',
141
+ multicall: '0x5ae401dc',
142
+ };
143
+ /**
144
+ * 手动编码 DYORSwap 的 swapExactTokensForTokens calldata
145
+ *
146
+ * 参数格式 (根据成功交易分析):
147
+ * - amountIn: uint256
148
+ * - amountOutMin: uint256
149
+ * - path: address[] (动态) - offset from start
150
+ * - pools: address[] (动态) - offset from start
151
+ * - to: uint256 (address(2) = 2)
152
+ * - flag: uint256 (1)
153
+ * - factory: address
154
+ *
155
+ * 成功交易的布局:
156
+ * [0] amountIn
157
+ * [1] amountOutMin
158
+ * [2] offset to path = 0xa0 = 160 = 5 * 32 (从参数区域开始)
159
+ * [3] offset to pools = 0xe0 = 224 = 7 * 32
160
+ * [4] to = 2
161
+ * [5] flag = 1
162
+ * [6] factory
163
+ * [7] path.length
164
+ * [8+] path elements
165
+ * [N] pools.length
166
+ * [N+1+] pools elements
167
+ */
168
+ export function encodeDYORSwapExactTokensForTokens(amountIn, amountOutMin, path, pools, to, // 可以是地址 (string) 或 address(2) 这样的特殊值 (bigint)
169
+ flag, factory) {
170
+ const pathOffset = 5n * 32n; // 160
171
+ // poolsOffset = pathOffset + (1 + path.length) * 32 = 160 + 96 = 256?
172
+ // 不对,成功交易是 224 = 160 + 64 = pathOffset + path.length * 32
173
+ const poolsOffset = pathOffset + BigInt(path.length) * 32n; // 160 + 2*32 = 224
174
+ // 手动构建数据
175
+ const pad32 = (hex) => hex.replace('0x', '').padStart(64, '0');
176
+ const toHex = (n) => n.toString(16).padStart(64, '0');
177
+ // 处理 to 参数:可以是地址 (string) 或特殊值 (bigint)
178
+ const toValue = typeof to === 'string' ? pad32(to) : toHex(to);
179
+ let data = DYORSWAP_SELECTORS.swapExactTokensForTokens;
180
+ data += toHex(amountIn);
181
+ data += toHex(amountOutMin);
182
+ data += toHex(pathOffset);
183
+ data += toHex(poolsOffset);
184
+ data += toValue;
185
+ data += toHex(flag);
186
+ data += pad32(factory);
187
+ // path 数据
188
+ data += toHex(BigInt(path.length));
189
+ for (const addr of path) {
190
+ data += pad32(addr);
191
+ }
192
+ // ⚠️ 不包含 pools 数据!成功交易中 pools 是空的
193
+ // poolsOffset 指向的位置没有数据
194
+ return '0x' + data.replace('0x', '');
195
+ }
196
+ /**
197
+ * 手动编码 DYORSwap 的 unwrapWETH9 calldata
198
+ *
199
+ * 参数格式 (根据成功交易分析):
200
+ * - amountMinimum: uint256
201
+ * - recipient: address
202
+ * - pools: bytes (动态) - 包含特殊的 pool 数据
203
+ *
204
+ * 成功交易的布局:
205
+ * [0] amountMinimum
206
+ * [1] recipient
207
+ * [2] offset to pools = 0x60 = 96 = 3 * 32
208
+ * [3] pools 数据 (bytes)
209
+ */
210
+ export function encodeDYORUnwrapWETH9(amountMinimum, recipient, poolsData = '') {
211
+ const pad32 = (hex) => hex.slice(2).padStart(64, '0');
212
+ const toHex = (n) => n.toString(16).padStart(64, '0');
213
+ const poolsOffset = 3n * 32n; // 96
214
+ const poolsBytes = poolsData.startsWith('0x') ? poolsData.slice(2) : poolsData;
215
+ const poolsLength = poolsBytes.length / 2;
216
+ let data = DYORSWAP_SELECTORS.unwrapWETH9;
217
+ data += toHex(amountMinimum);
218
+ data += pad32(recipient);
219
+ data += toHex(poolsOffset);
220
+ data += toHex(BigInt(poolsLength));
221
+ // pools 数据需要 padding 到 32 字节的倍数
222
+ if (poolsBytes.length > 0) {
223
+ const paddedLength = Math.ceil(poolsBytes.length / 64) * 64;
224
+ data += poolsBytes.padEnd(paddedLength, '0');
225
+ }
226
+ return '0x' + data.replace('0x', '');
227
+ }
228
+ /**
229
+ * DYORSwap 的 ETHBack_Dividend 合约地址
230
+ * 这是 refundETH 中使用的固定地址,不是 LP 池地址
231
+ */
232
+ export const DYORSWAP_ETHBACK_DIVIDEND = '0x2e61b0b4410f6fb941d47205191cbb8963d44bcc';
233
+ /**
234
+ * 手动编码 DYORSwap 的 refundETH calldata
235
+ *
236
+ * 根据成功交易分析,refundETH 的格式是:
237
+ * refundETH(bytes pools)
238
+ *
239
+ * 成功交易的 refundETH (0x6d29fcf4):
240
+ * [0] offset to pools = 0x20 = 32
241
+ * [1] pools 数组长度 = 1
242
+ * [2] fee = 30 (0x1e)
243
+ * [3] ETHBack_Dividend 合约地址
244
+ */
245
+ export function encodeDYORRefundETH(fee = 30) {
246
+ const toHex = (n) => n.toString(16).padStart(64, '0');
247
+ const pad32 = (hex) => hex.replace('0x', '').padStart(64, '0');
248
+ // 使用固定的 ETHBack_Dividend 合约地址
249
+ let data = DYORSWAP_SELECTORS.refundETH;
250
+ data += toHex(32n); // offset = 0x20
251
+ data += toHex(1n); // 数组长度 = 1
252
+ data += toHex(BigInt(fee)); // fee = 30
253
+ data += pad32(DYORSWAP_ETHBACK_DIVIDEND); // ETHBack_Dividend 地址
254
+ return '0x' + data.replace('0x', '');
255
+ }
256
+ /**
257
+ * 手动编码 DYORSwap 的 multicall calldata
258
+ *
259
+ * multicall(uint256 deadline, bytes[] data)
260
+ * 这个函数使用标准 ABI 编码
261
+ */
262
+ export function encodeDYORMulticall(deadline, data) {
263
+ const abiCoder = ethers.AbiCoder.defaultAbiCoder();
264
+ // multicall(uint256 deadline, bytes[] data)
265
+ // 确保每个 data 元素都是正确的 hex 格式
266
+ const formattedData = data.map((d) => (d.startsWith('0x') ? d : '0x' + d));
267
+ const encoded = abiCoder.encode(['uint256', 'bytes[]'], [deadline, formattedData]).slice(2);
268
+ return '0x' + DYORSWAP_SELECTORS.multicall.slice(2) + encoded;
269
+ }
270
+ /** V3 SwapRouter02 ABI (PancakeSwap V3, 新版 Uniswap) */
271
+ export const V3_ROUTER02_ABI = _V3_ROUTER02_ABI;
272
+ /** V3 SwapRouter(旧版)ABI (Monad Uniswap V3) */
273
+ export const V3_ROUTER_LEGACY_ABI = _V3_ROUTER_LEGACY_ABI;
274
+ /**
275
+ * 判断是否使用旧版 SwapRouter
276
+ *
277
+ * 旧版特征:
278
+ * - exactInputSingle 包含 deadline 字段
279
+ * - multicall 只有 bytes[] 参数
280
+ *
281
+ * Monad 上的 V3 DEX 都使用旧版:
282
+ * - Uniswap V3: 0xd6145b2d3f379919e8cdeda7b97e37c4b2ca9c40
283
+ * - PancakeSwap V3: 0x1b81D678ffb9C0263b24A97847620C99d213eB14
284
+ *
285
+ * XLayer:
286
+ * - V3 Router (0xBB069e9465BcabC4F488d21e793BDEf0F2d41D41) - 旧版(exactInputSingle 包含 deadline)
287
+ * - SwapRouter02 (0xB45D0149249488333E3F3f9F359807F4b810C1FC) - 新版(V2+V3 混合)
288
+ *
289
+ * BSC PancakeSwap V3 使用新版 SwapRouter02
290
+ */
291
+ export function isLegacySwapRouter(chain, routerAddress) {
292
+ const chainUpper = chain.toUpperCase();
293
+ const routerLower = routerAddress.toLowerCase();
294
+ // ✅ Monad 上的所有 V3 Router 都是旧版
295
+ if (chainUpper === 'MONAD') {
296
+ if (routerLower === DIRECT_ROUTERS.MONAD.UNISWAP_V3.toLowerCase()) {
297
+ return true;
298
+ }
299
+ if (routerLower === DIRECT_ROUTERS.MONAD.PANCAKESWAP_V3.toLowerCase()) {
300
+ return true;
301
+ }
302
+ }
303
+ // ✅ XLayer V3 专用 Router 是旧版(exactInputSingle 包含 deadline)
304
+ if (chainUpper === 'XLAYER') {
305
+ if (routerLower === DIRECT_ROUTERS.XLAYER.V3_ROUTER.toLowerCase()) {
306
+ return true; // V3 Router 是旧版
307
+ }
308
+ // SwapRouter02 是新版
309
+ return false;
310
+ }
311
+ // ✅ BSC PancakeSwap V3 使用新版 SwapRouter02
312
+ return false;
313
+ }
314
+ /** ERC20 ABI - ✅ 从公共模块导入 */
315
+ // ============================================================================
316
+ // 类型定义
317
+ // ============================================================================
318
+ // 工具函数
319
+ // ============================================================================
320
+ // ✅ 使用公共模块的 getDeadline
321
+ export function getDeadline(minutes = DEADLINE_MINUTES) {
322
+ return bundleGetDeadline(minutes);
323
+ }
324
+ export function getGasLimit(config, defaultGas = DEFAULT_GAS_LIMIT) {
325
+ if (config.gasLimit !== undefined) {
326
+ return typeof config.gasLimit === 'bigint' ? config.gasLimit : BigInt(config.gasLimit);
327
+ }
328
+ const multiplier = config.gasLimitMultiplier ?? 1.2;
329
+ return BigInt(Math.ceil(defaultGas * multiplier));
330
+ }
331
+ export async function getGasPrice(provider, config) {
332
+ if (config.gasPrice)
333
+ return config.gasPrice;
334
+ // 转换 Gwei 配置为 Wei
335
+ const gasPriceConfig = {};
336
+ if (config.minGasPriceGwei !== undefined) {
337
+ gasPriceConfig.minGasPrice = ethers.parseUnits(String(config.minGasPriceGwei), 'gwei');
338
+ }
339
+ if (config.maxGasPriceGwei !== undefined) {
340
+ gasPriceConfig.maxGasPrice = ethers.parseUnits(String(config.maxGasPriceGwei), 'gwei');
341
+ }
342
+ return getOptimizedGasPrice(provider, gasPriceConfig);
343
+ }
344
+ export function isNativeToken(quoteToken) {
345
+ return !quoteToken || quoteToken === ZERO_ADDRESS;
346
+ }
347
+ // ============================================================================
348
+ // XLAYER V3 报价(slot0 现货价,纯 V3,不串 V2)
349
+ // - 只用于“利润换算”为原生币,避免 XLAYER 没有 v3Quoter 导致 profit=0
350
+ // - 不改 BSC 的任何配置/逻辑
351
+ // ============================================================================
352
+ export const XLAYER_V3_FACTORY_ABI = [
353
+ 'function getPool(address tokenA, address tokenB, uint24 fee) view returns (address pool)',
354
+ ];
355
+ export const XLAYER_V3_POOL_ABI = [
356
+ 'function slot0() view returns (uint160 sqrtPriceX96,int24 tick,uint16 observationIndex,uint16 observationCardinality,uint16 observationCardinalityNext,uint8 feeProtocol,bool unlocked)',
357
+ 'function token0() view returns (address)',
358
+ 'function token1() view returns (address)',
359
+ ];
360
+ export const V3_FEE_DENOMINATOR = 1000000n; // UniswapV3 fee: X / 1e6
361
+ export async function quoteXLayerV3TokenToNativeBySlot0(params) {
362
+ try {
363
+ const { provider, tokenIn, amountIn, fee } = params;
364
+ if (!tokenIn || amountIn <= 0n)
365
+ return 0n;
366
+ const chainFactory = DIRECT_ROUTERS.XLAYER.V3_FACTORY;
367
+ const wrappedNative = DIRECT_ROUTERS.XLAYER.WOKB;
368
+ if (!chainFactory || !wrappedNative)
369
+ return 0n;
370
+ const tokenInLower = tokenIn.toLowerCase();
371
+ const wrappedLower = wrappedNative.toLowerCase();
372
+ if (tokenInLower === wrappedLower)
373
+ return amountIn;
374
+ const factory = new Contract(chainFactory, XLAYER_V3_FACTORY_ABI, provider);
375
+ const poolAddr = await factory.getPool?.(tokenIn, wrappedNative, fee);
376
+ if (!poolAddr || poolAddr.toLowerCase() === ZERO_ADDRESS.toLowerCase())
377
+ return 0n;
378
+ const pool = new Contract(poolAddr, XLAYER_V3_POOL_ABI, provider);
379
+ const [t0, t1, slot0] = await Promise.all([pool.token0?.(), pool.token1?.(), pool.slot0?.()]);
380
+ if (!t0 || !t1 || !slot0)
381
+ return 0n;
382
+ const sqrtPriceX96 = BigInt(slot0[0]);
383
+ if (sqrtPriceX96 <= 0n)
384
+ return 0n;
385
+ const amountInLessFee = (amountIn * (V3_FEE_DENOMINATOR - BigInt(fee))) / V3_FEE_DENOMINATOR;
386
+ if (amountInLessFee <= 0n)
387
+ return 0n;
388
+ const Q192 = 2n ** 192n;
389
+ const num = sqrtPriceX96 * sqrtPriceX96;
390
+ const t0Lower = String(t0).toLowerCase();
391
+ const t1Lower = String(t1).toLowerCase();
392
+ // sqrtPriceX96 表示 token1/token0 的现货价(raw)
393
+ if (tokenInLower === t0Lower && wrappedLower === t1Lower) {
394
+ return (amountInLessFee * num) / Q192;
395
+ }
396
+ if (tokenInLower === t1Lower && wrappedLower === t0Lower) {
397
+ return (amountInLessFee * Q192) / num;
398
+ }
399
+ return 0n;
400
+ }
401
+ catch {
402
+ return 0n;
403
+ }
404
+ }
405
+ // ✅ getTokenToNativeQuote 函数已移至 ../utils/quote-helpers.ts
406
+ /**
407
+ * ✅ 找到金额最大的钱包索引(和 core.ts 逻辑一致)
408
+ */
409
+ export function findMaxFlowIndex(amounts) {
410
+ if (amounts.length === 0)
411
+ return 0;
412
+ let maxIndex = 0;
413
+ let maxValue = amounts[0];
414
+ for (let i = 1; i < amounts.length; i++) {
415
+ if (amounts[i] > maxValue) {
416
+ maxValue = amounts[i];
417
+ maxIndex = i;
418
+ }
419
+ }
420
+ return maxIndex;
421
+ }
422
+ /** 计算利润金额 */
423
+ export function calculateProfitAmount(totalFlowWei) {
424
+ return (totalFlowWei * BigInt(getProfitRateBps('normal'))) / 10000n;
425
+ }
426
+ /**
427
+ * 构建利润多跳转账交易(强制 2 跳中转)
428
+ */
429
+ export async function buildProfitTransactionWithHops(provider, wallet, profitAmountWei, nonce, gasPrice, chainId, txType = 0, profitRecipient) {
430
+ if (profitAmountWei <= 0n)
431
+ return { signedTransactions: [], hopWallets: undefined };
432
+ const profitHopResult = await buildProfitHopTransactions({
433
+ provider,
434
+ payerWallet: wallet,
435
+ profitAmount: profitAmountWei,
436
+ profitRecipient: profitRecipient || getProfitRecipient(),
437
+ hopCount: PROFIT_HOP_COUNT,
438
+ gasPrice,
439
+ chainId,
440
+ txType,
441
+ startNonce: nonce,
442
+ });
443
+ return { signedTransactions: profitHopResult.signedTransactions, hopWallets: profitHopResult.hopWallets };
444
+ }
445
+ /**
446
+ * 获取贿赂金额(wei)
447
+ * ✅ 仅 BSC 链支持贿赂
448
+ */
449
+ export function getBribeAmount(config, chain) {
450
+ // 只有 BSC 链支持贿赂
451
+ if (chain.toUpperCase() !== 'BSC')
452
+ return 0n;
453
+ const bribeAmount = config.bribeAmount;
454
+ if (typeof bribeAmount !== 'number' || bribeAmount <= 0)
455
+ return 0n;
456
+ // 转换为 wei
457
+ return ethers.parseEther(String(bribeAmount));
458
+ }
459
+ /** 构建贿赂交易(向 BlockRazor Builder EOA 转账 BNB) */
460
+ export async function buildBribeTransaction(wallet, bribeAmountWei, nonce, gasPrice, chainId, txType = 0) {
461
+ const tx = {
462
+ to: BLOCKRAZOR_BUILDER_EOA,
463
+ value: bribeAmountWei,
464
+ nonce,
465
+ gasLimit: GAS_LIMITS.BRIBE,
466
+ ...buildGasFields(txType, gasPrice),
467
+ chainId,
468
+ };
469
+ return wallet.signTransaction(tx);
470
+ }
471
+ // ============================================================================
472
+ // V2 直接交易
473
+ // ============================================================================
474
+ /**
475
+ * 判断是否是 SwapRouter02 (XLayer PotatoSwap V3)
476
+ *
477
+ * SwapRouter02 风格的 Router 使用 multicall 包装 V2 方法:
478
+ * - multicall(uint256 deadline, bytes[] data)
479
+ * - data 内包含 swapExactTokensForTokens 等 V2 方法
480
+ *
481
+ * SwapRouter02 的 V2 方法签名不同:
482
+ * - swapExactTokensForTokens(amountIn, amountOutMin, path[], to) - 没有 deadline
483
+ * - 需要通过 multicall 的 deadline 参数传递 deadline
484
+ *
485
+ * ⚠️ 注意:DYORSwap 虽然也用 multicall,但它的 ABI 完全不同,需要单独处理
486
+ */
487
+ export function isSwapRouter02(chain, routerAddress) {
488
+ const chainUpper = chain.toUpperCase();
489
+ const addrLower = routerAddress.toLowerCase();
490
+ if (chainUpper === 'XLAYER') {
491
+ // ✅ XLayer PotatoSwap SwapRouter02 (V3 风格)
492
+ if (addrLower === DIRECT_ROUTERS.XLAYER.POTATOSWAP_V3.toLowerCase()) {
493
+ return true;
494
+ }
495
+ }
496
+ // ❌ XLayer POTATOSWAP_V2 (0x881fb...) 是标准 V2 Router,不走 SwapRouter02 逻辑
497
+ // ❌ XLayer DYORSWAP_ROUTER 有自己独特的 ABI,不走 SwapRouter02 逻辑
498
+ // ❌ BSC V2 交易使用传统 PancakeSwap V2 Router,不走 SwapRouter02 逻辑
499
+ // ❌ Monad V2 交易使用传统 V2 Router,不走 SwapRouter02 逻辑
500
+ return false;
501
+ }
502
+ /**
503
+ * 判断是否是 DYORSwap Router
504
+ *
505
+ * DYORSwap 使用 multicall,但它的 swapExactTokensForTokens 有特殊的 ABI:
506
+ * - swapExactTokensForTokens(amountIn, amountOutMin, path[], payer, flags, factory, pools)
507
+ * - unwrapWETH9(amountMinimum, recipient, pools)
508
+ */
509
+ export function isDYORSwap(chain, routerAddress) {
510
+ const chainUpper = chain.toUpperCase();
511
+ const addrLower = routerAddress.toLowerCase();
512
+ if (chainUpper === 'XLAYER') {
513
+ if (addrLower === DIRECT_ROUTERS.XLAYER.DYORSWAP_ROUTER.toLowerCase()) {
514
+ return true;
515
+ }
516
+ }
517
+ return false;
518
+ }
519
+ export function filterEniNativeBuyIndices(balances, flowAmounts, gasLimit, gasPrice, profitWei) {
520
+ const maxFlowIdx = findMaxFlowIndex(flowAmounts);
521
+ const profitGasCost = GAS_LIMITS.NATIVE_TRANSFER * gasPrice;
522
+ const validIdx = [];
523
+ for (let i = 0; i < balances.length; i++) {
524
+ let required = flowAmounts[i] + BigInt(gasLimit) * gasPrice;
525
+ if (i === maxFlowIdx && profitWei > 0n) {
526
+ required += profitWei + profitGasCost;
527
+ }
528
+ if (balances[i] < required)
529
+ continue;
530
+ validIdx.push(i);
531
+ }
532
+ if (validIdx.length === 0) {
533
+ throw new Error('[V2 BatchBuy ENI] 所有钱包余额不足(含 swap + gas + 利润费),无法执行');
534
+ }
535
+ return validIdx.length < balances.length ? validIdx : null;
536
+ }
537
+ /**
538
+ * V2 批量买入(直接调用 Router)
539
+ */
@@ -1,126 +1,6 @@
1
- /**
2
- * 直接 Router 交易(不走代理合约)
3
- *
4
- * 支持:
5
- * - BSC: PancakeSwap V2/V3
6
- * - Monad: PancakeSwap V2, Uniswap V2/V3
7
- *
8
- * 收费方式:交易末尾附加利润提取交易(和内盘一致)
9
- */
10
- /** Router 地址配置 - ✅ 使用公共模块中的地址 */
11
- export declare const DIRECT_ROUTERS: {
12
- readonly BSC: {
13
- readonly PANCAKESWAP_V2: "0x10ED43C718714eb63d5aA57B78B54704E256024E";
14
- readonly PANCAKESWAP_V3: "0x13f4EA83D0bd40E75C8222255bc855a974568Dd4";
15
- readonly IROSWAP_V2: "0xe90fb729E458092592a79EdaFefB3404ecb3C463";
16
- readonly WBNB: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c";
17
- };
18
- readonly MONAD: {
19
- readonly PANCAKESWAP_V2: "0xB1Bc24c34e88f7D43D5923034E3a14B24DaACfF9";
20
- readonly PANCAKESWAP_V3: "0x1b81D678ffb9C0263b24A97847620C99d213eB14";
21
- readonly UNISWAP_V2: "0x4b2ab38dbf28d31d467aa8993f6c2585981d6804";
22
- readonly UNISWAP_V3: "0xd6145b2d3f379919e8cdeda7b97e37c4b2ca9c40";
23
- readonly WMON: "0x3bd359c1119da7da1d913d1c4d2b7c461115433a";
24
- };
25
- readonly XLAYER: {
26
- readonly POTATOSWAP_V2: "0x881fb2f98c13d521009464e7d1cbf16e1b394e8e";
27
- readonly POTATOSWAP_V3: "0xB45D0149249488333E3F3f9F359807F4b810C1FC";
28
- readonly DYORSWAP_ROUTER: "0xfb001fbbace32f09cb6d3c449b935183de53ee96";
29
- readonly DYORSWAP_FACTORY: "0x2CcaDb1e437AA9cDc741574bDa154686B1F04C09";
30
- readonly V3_ROUTER: "0xBB069e9465BcabC4F488d21e793BDEf0F2d41D41";
31
- readonly V3_FACTORY: "0xa1415fAe79c4B196d087F02b8aD5a622B8A827E5";
32
- readonly WOKB: "0xe538905cf8410324e03a5a23c1c177a474d59b2b";
33
- };
34
- readonly ENI: {
35
- readonly DSWAP_V2: "0x97ed8be49d9a8b86247090aa41e908e76b8fcf22";
36
- readonly DSWAP_V3: "0xcdE487F5B460a516f31FaC520D4e18BA1C8cda49";
37
- readonly IROSWAP_V2: "0x93b1199fA96f6b9b1f993AA0226eB6076968a9BF";
38
- readonly WEGAS: "0x6d1e851446f4d004ae2a72f9afed85e8829a205e";
39
- };
40
- };
41
- /** ERC20 ABI - ✅ 从公共模块导入 */
42
- export interface DirectRouterSignConfig {
43
- rpcUrl: string;
44
- chainId?: number;
45
- gasLimit?: number | bigint;
46
- gasLimitMultiplier?: number;
47
- gasPrice?: bigint;
48
- minGasPriceGwei?: number;
49
- maxGasPriceGwei?: number;
50
- txType?: 0 | 2;
51
- /** 是否跳过授权检查 */
52
- skipApprovalCheck?: boolean;
53
- /** 滑点(基点),默认 100 = 1% */
54
- slippageBps?: number;
55
- /** BlockRazor 贿赂金额(BNB),仅 BSC 链有效,用于提高 bundle 打包优先级 */
56
- bribeAmount?: number;
57
- /** ✅ 利润模式:'single'(默认,从最大钱包统一扣)或 'distributed'(每个钱包独立扣) */
58
- profitMode?: 'single' | 'distributed';
59
- /** ✅ 是否跳过利润扣除(EOA 普通模式使用) */
60
- skipProfit?: boolean;
61
- }
62
- export interface DirectV2BuyParams {
63
- chain: 'BSC' | 'MONAD' | 'XLAYER' | 'ENI';
64
- privateKeys: string[];
65
- buyAmounts: string[];
66
- tokenAddress: string;
67
- routerAddress: string;
68
- quoteToken?: string;
69
- quoteTokenDecimals?: number;
70
- startNonces?: number[];
71
- config: DirectRouterSignConfig;
72
- }
73
- export interface DirectV2SellParams {
74
- chain: 'BSC' | 'MONAD' | 'XLAYER' | 'ENI';
75
- privateKeys: string[];
76
- sellPercentages?: number[];
77
- sellAmounts?: string[];
78
- startNonces?: number[];
79
- tokenAddress: string;
80
- tokenDecimals?: number;
81
- routerAddress: string;
82
- quoteToken?: string;
83
- config: DirectRouterSignConfig;
84
- }
85
- export interface DirectV3BuyParams {
86
- chain: 'BSC' | 'MONAD' | 'XLAYER' | 'ENI';
87
- privateKeys: string[];
88
- buyAmounts: string[];
89
- tokenAddress: string;
90
- routerAddress: string;
91
- fee: number;
92
- quoteToken?: string;
93
- quoteTokenDecimals?: number;
94
- startNonces?: number[];
95
- config: DirectRouterSignConfig;
96
- }
97
- export interface DirectV3SellParams {
98
- chain: 'BSC' | 'MONAD' | 'XLAYER' | 'ENI';
99
- privateKeys: string[];
100
- sellPercentages?: number[];
101
- sellAmounts?: string[];
102
- tokenAddress: string;
103
- tokenDecimals?: number;
104
- routerAddress: string;
105
- fee: number;
106
- quoteToken?: string;
107
- startNonces?: number[];
108
- config: DirectRouterSignConfig;
109
- }
110
- import type { GeneratedWallet } from '../utils/wallet.js';
111
- export interface DirectRouterResult {
112
- signedTransactions: string[];
113
- profitHopWallets?: GeneratedWallet[];
114
- metadata?: {
115
- profitMode?: 'single' | 'distributed';
116
- profitAmount: string;
117
- profitRecipient: string;
118
- totalFlow: string;
119
- };
120
- }
121
- /**
122
- * V2 批量买入(直接调用 Router)
123
- */
1
+ import type { DirectV2BuyParams, DirectV2SellParams, DirectV3BuyParams, DirectV3SellParams, DirectRouterResult, DexKey, RouterVersion } from './types.js';
2
+ export type { DirectV2BuyParams, DirectV2SellParams, DirectV3BuyParams, DirectV3SellParams, DirectRouterResult, DirectRouterSignConfig, DexKey, RouterVersion, } from './types.js';
3
+ export { DIRECT_ROUTERS } from './direct-router-helpers.js';
124
4
  export declare function directV2BatchBuy(params: DirectV2BuyParams): Promise<DirectRouterResult>;
125
5
  /**
126
6
  * V2 批量卖出(直接调用 Router)
@@ -142,8 +22,6 @@ export declare function directV3BatchBuy(params: DirectV3BuyParams): Promise<Dir
142
22
  * - SwapRouter (旧版 Uniswap V3): exactInputSingle 含 deadline,multicall 不含 deadline
143
23
  */
144
24
  export declare function directV3BatchSell(params: DirectV3SellParams): Promise<DirectRouterResult>;
145
- export type DexKey = 'PANCAKESWAP' | 'UNISWAP' | 'POTATOSWAP' | 'DYORSWAP' | 'IROSWAP';
146
- export type RouterVersion = 'v2' | 'v3';
147
25
  /**
148
26
  * 根据链和 DEX 获取 Router 地址
149
27
  */