four-flap-meme-sdk 2.2.2 → 2.2.3

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 +86 -278
  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 +101 -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 +83 -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 +77 -0
  339. package/dist/shared/flap/portal-create-token.js +214 -0
  340. package/dist/shared/flap/portal.d.ts +14 -3
  341. package/dist/shared/flap/portal.js +50 -25
  342. package/dist/shared/flap/vanity.d.ts +1 -5
  343. package/dist/shared/flap/vanity.js +6 -17
  344. package/dist/shared/flap/vault.d.ts +17 -124
  345. package/dist/shared/flap/vault.js +67 -148
  346. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  347. package/dist/shared/foundation/dex/v3-path.js +35 -0
  348. package/dist/shared/foundation/gas/bundle-gas.d.ts +49 -0
  349. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  350. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  351. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  352. package/dist/shared/foundation/index.d.ts +13 -0
  353. package/dist/shared/foundation/index.js +12 -0
  354. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  355. package/dist/shared/foundation/nonce/nonce-manager.js +183 -0
  356. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  357. package/dist/shared/foundation/normalize-unknown.js +29 -0
  358. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  359. package/dist/shared/foundation/sdk-logger.js +12 -0
  360. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  361. package/dist/shared/foundation/tx/build-request.js +25 -0
  362. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  363. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  364. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  365. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  366. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  367. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  368. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  369. package/dist/shared/foundation/types/erc20.js +1 -0
  370. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  371. package/dist/shared/foundation/types/holders-maker.js +1 -0
  372. package/dist/shared/foundation/types/index.d.ts +7 -0
  373. package/dist/shared/foundation/types/index.js +1 -0
  374. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  375. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  376. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  377. package/dist/shared/foundation/types/multicall.js +1 -0
  378. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  379. package/dist/shared/foundation/types/private-sale.js +1 -0
  380. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  381. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  382. package/dist/shared/four/tax-token.d.ts +1 -1
  383. package/dist/shared/four/tax-token.js +27 -7
  384. package/dist/shared/index.d.ts +6 -0
  385. package/dist/shared/index.js +4 -0
  386. package/dist/types/errors.d.ts +27 -0
  387. package/dist/types/errors.js +34 -0
  388. package/dist/utils/airdrop-sweep.d.ts +4 -76
  389. package/dist/utils/airdrop-sweep.js +42 -55
  390. package/dist/utils/bundle-helpers.d.ts +9 -243
  391. package/dist/utils/bundle-helpers.js +10 -584
  392. package/dist/utils/constants.d.ts +5 -61
  393. package/dist/utils/constants.js +5 -80
  394. package/dist/utils/contract-factory.d.ts +2 -4
  395. package/dist/utils/contract-factory.js +25 -18
  396. package/dist/utils/erc20.d.ts +7 -89
  397. package/dist/utils/erc20.js +94 -125
  398. package/dist/utils/errors.d.ts +12 -1
  399. package/dist/utils/errors.js +60 -1
  400. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  401. package/dist/utils/holders-maker/addresses.js +15 -0
  402. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  403. package/dist/utils/holders-maker/buy-tx.js +278 -0
  404. package/dist/utils/holders-maker/constants.d.ts +6 -0
  405. package/dist/utils/holders-maker/constants.js +7 -0
  406. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  407. package/dist/utils/holders-maker/disperse.js +90 -0
  408. package/dist/utils/holders-maker/routing.d.ts +4 -0
  409. package/dist/utils/holders-maker/routing.js +45 -0
  410. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  411. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  412. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  413. package/dist/utils/holders-maker-helpers.js +9 -0
  414. package/dist/utils/holders-maker.d.ts +2 -138
  415. package/dist/utils/holders-maker.js +26 -661
  416. package/dist/utils/hop-chains.d.ts +35 -0
  417. package/dist/utils/hop-chains.js +215 -0
  418. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  419. package/dist/utils/lp-inspect-helpers.js +109 -0
  420. package/dist/utils/lp-inspect.d.ts +2 -112
  421. package/dist/utils/lp-inspect.js +73 -223
  422. package/dist/utils/mpcExclusive.d.ts +2 -5
  423. package/dist/utils/mpcExclusive.js +4 -3
  424. package/dist/utils/private-sale.d.ts +2 -58
  425. package/dist/utils/private-sale.js +4 -15
  426. package/dist/utils/provider-factory.d.ts +4 -0
  427. package/dist/utils/provider-factory.js +10 -0
  428. package/dist/utils/quote-helpers.d.ts +4 -45
  429. package/dist/utils/quote-helpers.js +17 -74
  430. package/dist/utils/stealth-transfer.d.ts +2 -28
  431. package/dist/utils/stealth-transfer.js +31 -15
  432. package/dist/utils/swap-helpers.d.ts +2 -15
  433. package/dist/utils/swap-helpers.js +6 -11
  434. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  435. package/dist/utils/types/airdrop-sweep.js +1 -0
  436. package/dist/utils/types/contract-factory.d.ts +1 -0
  437. package/dist/utils/types/contract-factory.js +1 -0
  438. package/dist/utils/types/erc20.d.ts +1 -0
  439. package/dist/utils/types/erc20.js +1 -0
  440. package/dist/utils/types/errors.d.ts +1 -0
  441. package/dist/utils/types/errors.js +1 -0
  442. package/dist/utils/types/holders-maker.d.ts +1 -0
  443. package/dist/utils/types/holders-maker.js +1 -0
  444. package/dist/utils/types/hop-chains.d.ts +8 -0
  445. package/dist/utils/types/hop-chains.js +1 -0
  446. package/dist/utils/types/index.d.ts +13 -0
  447. package/dist/utils/types/index.js +1 -0
  448. package/dist/utils/types/lp-inspect.d.ts +1 -0
  449. package/dist/utils/types/lp-inspect.js +1 -0
  450. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  451. package/dist/utils/types/mpc-exclusive.js +1 -0
  452. package/dist/utils/types/private-sale.d.ts +1 -0
  453. package/dist/utils/types/private-sale.js +1 -0
  454. package/dist/utils/types/quote-helpers.d.ts +1 -0
  455. package/dist/utils/types/quote-helpers.js +1 -0
  456. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  457. package/dist/utils/types/stealth-transfer.js +1 -0
  458. package/dist/utils/types/wallet.d.ts +25 -0
  459. package/dist/utils/types/wallet.js +1 -0
  460. package/dist/utils/wallet.d.ts +2 -25
  461. package/dist/utils/wallet.js +13 -10
  462. package/dist/vanity/index.d.ts +5 -0
  463. package/dist/vanity/index.js +5 -0
  464. package/package.json +160 -4
  465. package/src/abis/contracts/TaxToken.json +969 -0
  466. package/src/abis/contracts/TokenManager.json +836 -0
  467. package/src/abis/contracts/TokenManager2.json +136 -0
  468. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  469. package/dist/shared/abis/TaxToken.json +0 -105
  470. package/dist/shared/abis/TokenManager2.json +0 -60
  471. /package/dist/{shared/abis → abis/contracts}/TokenManager.json +0 -0
  472. /package/dist/{shared/abis → abis/contracts}/TokenManagerHelper3.json +0 -0
@@ -1,7 +1,8 @@
1
1
  import { Contract, Wallet, JsonRpcProvider, Interface, parseUnits } from 'ethers';
2
- import { ADDRESSES, ZERO_ADDRESS, getMulticall3Address } from './constants.js';
2
+ import { ADDRESSES, ZERO_ADDRESS, getMulticall3Address } from '../shared/constants/index.js';
3
3
  import { NonceManager } from './bundle-helpers.js';
4
- import { ERC20_ABI, MULTICALL3_ABI } from '../shared/abis/common.js';
4
+ import { ERC20_ABI, MULTICALL3_ABI } from '../abis/common.js';
5
+ import { getErrorMessageFromUnknown } from '../shared/foundation/index.js';
5
6
  // ============================================================================
6
7
  // ✅ Max approval(与 BSC 策略一致:阈值判断,避免频繁重复授权)
7
8
  // ============================================================================
@@ -22,14 +23,15 @@ async function validateContractAddress(provider, address, label) {
22
23
  }
23
24
  }
24
25
  catch (error) {
25
- if (error.message.includes('无效或未部署')) {
26
- throw error;
26
+ const msg = getErrorMessageFromUnknown(error);
27
+ if (msg.includes('无效或未部署')) {
28
+ throw error instanceof Error ? error : new Error(msg);
27
29
  }
28
- // 如果是 checksum 错误,提供更友好的提示
29
- if (error.message.includes('bad address checksum') || error.code === 'INVALID_ARGUMENT') {
30
+ const code = error !== null && typeof error === 'object' && 'code' in error ? error.code : undefined;
31
+ if (msg.includes('bad address checksum') || code === 'INVALID_ARGUMENT') {
30
32
  throw new Error(`❌ ${label} 地址格式错误,请使用正确的 checksum 格式: ${address}`);
31
33
  }
32
- throw new Error(`❌ 无法验证 ${label} 地址 ${address}: ${error.message}`);
34
+ throw new Error(`❌ 无法验证 ${label} 地址 ${address}: ${msg}`);
33
35
  }
34
36
  }
35
37
  /**
@@ -49,7 +51,7 @@ async function ensureAllowance(rpcUrl, privateKey, token, owner, spender, requir
49
51
  current = await erc20.allowance(owner, spender);
50
52
  }
51
53
  catch (error) {
52
- throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${error.message}`);
54
+ throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${getErrorMessageFromUnknown(error)}`);
53
55
  }
54
56
  if (current >= required) {
55
57
  return {
@@ -67,27 +69,17 @@ async function ensureAllowance(rpcUrl, privateKey, token, owner, spender, requir
67
69
  txReceipt: receipt,
68
70
  };
69
71
  }
70
- /**
71
- * 检查代币授权状态 - Four.meme V1(只读,不发送交易)
72
- * @returns 是否已授权足够的额度
73
- */
74
- export async function checkSellApprovalV1(chain, rpcUrl, token, owner, amount) {
75
- const proxyAddresses = {
76
- BSC: ADDRESSES.BSC.TokenManagerV1, // FourMeme 代理合约 V1 (BSC)
77
- BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
78
- ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
79
- };
72
+ async function checkAllowanceForSpender(rpcUrl, token, owner, amount, spender, spenderLabel) {
80
73
  const provider = new JsonRpcProvider(rpcUrl);
81
- // ✅ 验证 token 和代理合约地址
82
74
  await validateContractAddress(provider, token, 'Token');
83
- await validateContractAddress(provider, proxyAddresses[chain], `Four.meme V1 Proxy (${chain})`);
75
+ await validateContractAddress(provider, spender, spenderLabel);
84
76
  const erc20 = new Contract(token, ERC20_ABI, provider);
85
77
  let current;
86
78
  try {
87
- current = await erc20.allowance(owner, proxyAddresses[chain]);
79
+ current = await erc20.allowance(owner, spender);
88
80
  }
89
81
  catch (error) {
90
- throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${error.message}`);
82
+ throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${getErrorMessageFromUnknown(error)}`);
91
83
  }
92
84
  return {
93
85
  isApproved: current >= amount,
@@ -95,61 +87,42 @@ export async function checkSellApprovalV1(chain, rpcUrl, token, owner, amount) {
95
87
  requiredAllowance: amount,
96
88
  };
97
89
  }
90
+ async function checkSellApprovalForProxy(_chain, rpcUrl, token, owner, amount, proxyAddress, proxyLabel) {
91
+ return checkAllowanceForSpender(rpcUrl, token, owner, amount, proxyAddress, proxyLabel);
92
+ }
93
+ const FOUR_MEME_V1_PROXY = {
94
+ BSC: ADDRESSES.BSC.TokenManagerV1,
95
+ BASE: ADDRESSES.BASE.TokenManagerHelper3,
96
+ ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3,
97
+ };
98
+ const FOUR_MEME_V2_PROXY = {
99
+ BSC: ADDRESSES.BSC.TokenManagerV2,
100
+ BASE: ADDRESSES.BASE.TokenManagerHelper3,
101
+ ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3,
102
+ };
103
+ /**
104
+ * 检查代币授权状态 - Four.meme V1(只读,不发送交易)
105
+ */
106
+ export async function checkSellApprovalV1(chain, rpcUrl, token, owner, amount) {
107
+ return checkSellApprovalForProxy(chain, rpcUrl, token, owner, amount, FOUR_MEME_V1_PROXY[chain], `Four.meme V1 Proxy (${chain})`);
108
+ }
98
109
  /**
99
110
  * 确保代币已授权给 Four.meme V1 代理合约
100
- * 用于 Four.meme V1 代币的卖出操作
101
- * @returns 授权结果,包含是否已授权、当前额度、交易回执等信息
102
111
  */
103
112
  export async function ensureSellApprovalV1(chain, rpcUrl, privateKey, token, owner, amount) {
104
- // 授权给 FourMeme 代理合约 V1(收费版)
105
- const proxyAddresses = {
106
- BSC: ADDRESSES.BSC.TokenManagerV1, // FourMeme 代理合约 V1 (BSC)
107
- BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
108
- ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
109
- };
110
- return await ensureAllowance(rpcUrl, privateKey, token, owner, proxyAddresses[chain], amount);
113
+ return ensureAllowance(rpcUrl, privateKey, token, owner, FOUR_MEME_V1_PROXY[chain], amount);
111
114
  }
112
115
  /**
113
116
  * 检查代币授权状态 - Four.meme V2(只读,不发送交易)
114
- * @returns 是否已授权足够的额度
115
117
  */
116
118
  export async function checkSellApprovalV2(chain, rpcUrl, token, owner, amount) {
117
- const proxyAddresses = {
118
- BSC: ADDRESSES.BSC.TokenManagerV2, // FourMeme 代理合约 V2 (BSC)
119
- BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
120
- ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
121
- };
122
- const provider = new JsonRpcProvider(rpcUrl);
123
- // ✅ 验证 token 和代理合约地址
124
- await validateContractAddress(provider, token, 'Token');
125
- await validateContractAddress(provider, proxyAddresses[chain], `Four.meme V2 Proxy (${chain})`);
126
- const erc20 = new Contract(token, ERC20_ABI, provider);
127
- let current;
128
- try {
129
- current = await erc20.allowance(owner, proxyAddresses[chain]);
130
- }
131
- catch (error) {
132
- throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${error.message}`);
133
- }
134
- return {
135
- isApproved: current >= amount,
136
- currentAllowance: current,
137
- requiredAllowance: amount,
138
- };
119
+ return checkSellApprovalForProxy(chain, rpcUrl, token, owner, amount, FOUR_MEME_V2_PROXY[chain], `Four.meme V2 Proxy (${chain})`);
139
120
  }
140
121
  /**
141
122
  * 确保代币已授权给 Four.meme V2 代理合约
142
- * 用于 Four.meme V2 代币的卖出操作
143
- * @returns 授权结果,包含是否已授权、当前额度、交易回执等信息
144
123
  */
145
124
  export async function ensureSellApprovalV2(chain, rpcUrl, privateKey, token, owner, amount) {
146
- // 授权给 FourMeme 代理合约 V2(收费版)
147
- const proxyAddresses = {
148
- BSC: ADDRESSES.BSC.TokenManagerV2, // FourMeme 代理合约 V2 (BSC)
149
- BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
150
- ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
151
- };
152
- return await ensureAllowance(rpcUrl, privateKey, token, owner, proxyAddresses[chain], amount);
125
+ return ensureAllowance(rpcUrl, privateKey, token, owner, FOUR_MEME_V2_PROXY[chain], amount);
153
126
  }
154
127
  /**
155
128
  * 检查代币授权状态 - Four.meme(通用,默认使用 V2)
@@ -171,29 +144,13 @@ export async function ensureSellApproval(chain, rpcUrl, privateKey, token, owner
171
144
  */
172
145
  export async function checkFlapSellApproval(chain, rpcUrl, token, owner, amount) {
173
146
  const proxyAddresses = {
174
- BSC: ADDRESSES.BSC.FlapPortal, // Flap Portal 代理合约 (BSC)
175
- BASE: ADDRESSES.BASE.FlapPortal, // Flap Portal 代理合约 (BASE)
176
- XLAYER: ADDRESSES.XLAYER.FlapPortal, // Flap Portal 代理合约 (XLAYER)
177
- MORPH: ADDRESSES.MORPH.FlapPortal, // Flap Portal 代理合约 (MORPH)
178
- MONAD: ADDRESSES.MONAD.FlapPortal, // Flap Portal 代理合约 (MONAD)
179
- };
180
- const provider = new JsonRpcProvider(rpcUrl);
181
- // ✅ 验证 token 和代理合约地址
182
- await validateContractAddress(provider, token, 'Token');
183
- await validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`);
184
- const erc20 = new Contract(token, ERC20_ABI, provider);
185
- let current;
186
- try {
187
- current = await erc20.allowance(owner, proxyAddresses[chain]);
188
- }
189
- catch (error) {
190
- throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${error.message}`);
191
- }
192
- return {
193
- isApproved: current >= amount,
194
- currentAllowance: current,
195
- requiredAllowance: amount,
147
+ BSC: ADDRESSES.BSC.FlapPortal,
148
+ BASE: ADDRESSES.BASE.FlapPortal,
149
+ XLAYER: ADDRESSES.XLAYER.FlapPortal,
150
+ MORPH: ADDRESSES.MORPH.FlapPortal,
151
+ MONAD: ADDRESSES.MONAD.FlapPortal,
196
152
  };
153
+ return checkAllowanceForSpender(rpcUrl, token, owner, amount, proxyAddresses[chain], `Flap Portal (${chain})`);
197
154
  }
198
155
  /**
199
156
  * 确保代币已授权给 Flap Protocol 代理合约
@@ -245,7 +202,7 @@ export async function checkFlapSellApprovalBatch(chain, rpcUrl, token, owners, r
245
202
  // ✅ 并行验证 token 和代理合约地址
246
203
  await Promise.all([
247
204
  validateContractAddress(provider, token, 'Token'),
248
- validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`)
205
+ validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`),
249
206
  ]);
250
207
  // ✅ 使用 batchCheckAllowances 批量查询(Multicall3)
251
208
  const allowances = await batchCheckAllowances(provider, token, owners, proxyAddresses[chain]);
@@ -253,7 +210,7 @@ export async function checkFlapSellApprovalBatch(chain, rpcUrl, token, owners, r
253
210
  owner,
254
211
  isApproved: allowances[i] >= required,
255
212
  currentAllowance: allowances[i],
256
- requiredAllowance: required
213
+ requiredAllowance: required,
257
214
  }));
258
215
  }
259
216
  /**
@@ -270,15 +227,15 @@ export async function batchCheckAllowances(provider, tokenAddress, owners, spend
270
227
  const multicall3 = new Contract(multicall3Address, MULTICALL3_ABI, provider);
271
228
  // 编码 allowance(owner, spender) 调用数据
272
229
  const erc20Interface = new Contract(tokenAddress, ERC20_ABI, provider).interface;
273
- const calls = owners.map(owner => ({
230
+ const calls = owners.map((owner) => ({
274
231
  target: tokenAddress,
275
232
  allowFailure: true,
276
- callData: erc20Interface.encodeFunctionData('allowance', [owner, spender])
233
+ callData: erc20Interface.encodeFunctionData('allowance', [owner, spender]),
277
234
  }));
278
235
  // 批量调用
279
236
  const results = await multicall3.aggregate3(calls);
280
237
  // 解析结果
281
- return results.map((result, index) => {
238
+ return results.map((result) => {
282
239
  if (!result.success) {
283
240
  return 0n;
284
241
  }
@@ -286,7 +243,7 @@ export async function batchCheckAllowances(provider, tokenAddress, owners, spend
286
243
  const decoded = erc20Interface.decodeFunctionResult('allowance', result.returnData);
287
244
  return decoded[0];
288
245
  }
289
- catch (error) {
246
+ catch {
290
247
  return 0n;
291
248
  }
292
249
  });
@@ -390,7 +347,7 @@ export async function checkAllowanceRaw(rpcUrl, tokenAddress, ownerAddress, spen
390
347
  return allowance;
391
348
  }
392
349
  catch (error) {
393
- throw new Error(`❌ 查询授权额度失败: ${error.message}`);
350
+ throw new Error(`❌ 查询授权额度失败: ${getErrorMessageFromUnknown(error)}`);
394
351
  }
395
352
  }
396
353
  /**
@@ -438,15 +395,15 @@ export async function approveTokenRaw(rpcUrl, privateKey, tokenAddress, spenderA
438
395
  currentAllowance = await erc20.allowance(ownerAddress, normalizedSpender);
439
396
  }
440
397
  catch (error) {
441
- throw new Error(`❌ 查询授权额度失败: ${error.message}`);
398
+ throw new Error(`❌ 查询授权额度失败: ${getErrorMessageFromUnknown(error)}`);
442
399
  }
443
400
  // 如果已经授权足够,直接返回
444
401
  // ✅ max 授权:使用阈值判断,避免每次消耗一点 allowance 都重新授权
445
- if (isMax ? (currentAllowance >= MAX_APPROVAL_THRESHOLD) : (currentAllowance >= requiredAmount)) {
402
+ if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
446
403
  return {
447
404
  alreadyApproved: true,
448
405
  currentAllowance,
449
- requiredAllowance: requiredAmount
406
+ requiredAllowance: requiredAmount,
450
407
  };
451
408
  }
452
409
  // 发送授权交易
@@ -457,11 +414,11 @@ export async function approveTokenRaw(rpcUrl, privateKey, tokenAddress, spenderA
457
414
  alreadyApproved: false,
458
415
  currentAllowance,
459
416
  requiredAllowance: requiredAmount,
460
- txReceipt: receipt
417
+ txReceipt: receipt,
461
418
  };
462
419
  }
463
420
  catch (error) {
464
- throw new Error(`❌ 授权交易失败: ${error.message}`);
421
+ throw new Error(`❌ 授权交易失败: ${getErrorMessageFromUnknown(error)}`);
465
422
  }
466
423
  }
467
424
  /**
@@ -492,7 +449,7 @@ export async function checkAllowanceBatchRaw(rpcUrl, tokenAddress, ownerAddresse
492
449
  const provider = new JsonRpcProvider(rpcUrl);
493
450
  // ✅ 规范化地址(转为小写,避免 checksum 错误)
494
451
  const normalizedToken = tokenAddress.toLowerCase();
495
- const normalizedOwners = ownerAddresses.map(addr => addr.toLowerCase());
452
+ const normalizedOwners = ownerAddresses.map((addr) => addr.toLowerCase());
496
453
  const normalizedSpender = spenderAddress.toLowerCase();
497
454
  // 验证地址
498
455
  await validateContractAddress(provider, normalizedToken, 'Token');
@@ -500,12 +457,26 @@ export async function checkAllowanceBatchRaw(rpcUrl, tokenAddress, ownerAddresse
500
457
  return batchCheckAllowances(provider, normalizedToken, normalizedOwners, normalizedSpender);
501
458
  }
502
459
  export async function approveTokenBatch(params) {
503
- const { chain, platform, rpcUrl, privateKeys, tokenAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId, skipValidation } = params;
460
+ const { chain, platform, rpcUrl, privateKeys, tokenAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId, skipValidation, } = params;
504
461
  const spenderAddress = resolveSpenderAddress(chain, platform);
505
- return approveTokenBatchRaw({ rpcUrl, privateKeys, tokenAddress, spenderAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId, skipValidation });
462
+ const rawParams = {
463
+ rpcUrl,
464
+ privateKeys,
465
+ tokenAddress,
466
+ spenderAddress,
467
+ amounts,
468
+ gasPriceGwei,
469
+ gasLimit,
470
+ chainId,
471
+ skipValidation,
472
+ };
473
+ if (signOnly === true) {
474
+ return approveTokenBatchRaw({ ...rawParams, signOnly: true });
475
+ }
476
+ return approveTokenBatchRaw({ ...rawParams, signOnly: false });
506
477
  }
507
478
  export async function approveTokenBatchRaw(params) {
508
- const { rpcUrl, privateKeys, tokenAddress, spenderAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId = 56, nonceManager: externalNonceManager, skipValidation } = params;
479
+ const { rpcUrl, privateKeys, tokenAddress, spenderAddress, amounts, signOnly, gasPriceGwei, gasLimit, chainId = 56, nonceManager: externalNonceManager, skipValidation, } = params;
509
480
  if (privateKeys.length === 0 || amounts.length !== privateKeys.length) {
510
481
  throw new Error('❌ 私钥数量和授权数量必须匹配');
511
482
  }
@@ -519,12 +490,10 @@ export async function approveTokenBatchRaw(params) {
519
490
  await validateContractAddress(provider, normalizedSpender, 'Spender');
520
491
  }
521
492
  // ✅ 优化:批量创建钱包和合约实例
522
- const wallets = privateKeys.map(key => new Wallet(key, provider));
523
- const ownerAddresses = wallets.map(w => w.address);
524
- const isMaxApprovals = amounts.map(a => a === 'max');
525
- const requiredAmounts = amounts.map(amount => amount === 'max'
526
- ? MAX_UINT256
527
- : amount);
493
+ const wallets = privateKeys.map((key) => new Wallet(key, provider));
494
+ const ownerAddresses = wallets.map((w) => w.address);
495
+ const isMaxApprovals = amounts.map((a) => a === 'max');
496
+ const requiredAmounts = amounts.map((amount) => (amount === 'max' ? MAX_UINT256 : amount));
528
497
  // ==================== signOnly=true:只签名不提交 ====================
529
498
  if (signOnly) {
530
499
  // ✅ 使用 NonceManager 管理 nonce(和买卖交易一样)
@@ -533,7 +502,9 @@ export async function approveTokenBatchRaw(params) {
533
502
  const [currentAllowances, nonces, fetchedGasPrice] = await Promise.all([
534
503
  batchCheckAllowances(provider, normalizedToken, ownerAddresses, normalizedSpender),
535
504
  nonceManager.getNextNoncesForWallets(wallets), // ✅ 使用 NonceManager 批量获取 nonce
536
- gasPriceGwei ? Promise.resolve(parseUnits(gasPriceGwei.toString(), 'gwei')) : provider.getFeeData().then(fee => fee.gasPrice || parseUnits('3', 'gwei'))
505
+ gasPriceGwei
506
+ ? Promise.resolve(parseUnits(gasPriceGwei.toString(), 'gwei'))
507
+ : provider.getFeeData().then((fee) => fee.gasPrice || parseUnits('3', 'gwei')),
537
508
  ]);
538
509
  const finalGasPrice = fetchedGasPrice;
539
510
  const finalGasLimit = BigInt(gasLimit || 100000);
@@ -547,13 +518,13 @@ export async function approveTokenBatchRaw(params) {
547
518
  const isMax = isMaxApprovals[i];
548
519
  // 如果已经授权足够,跳过
549
520
  // ✅ max 授权:使用阈值判断(与 BSC 一致)
550
- if (isMax ? (currentAllowance >= MAX_APPROVAL_THRESHOLD) : (currentAllowance >= requiredAmount)) {
521
+ if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
551
522
  return {
552
523
  owner: ownerAddress,
553
524
  alreadyApproved: true,
554
525
  currentAllowance,
555
526
  requiredAllowance: requiredAmount,
556
- signedTx: undefined
527
+ signedTx: undefined,
557
528
  };
558
529
  }
559
530
  // 构建并签名交易
@@ -565,28 +536,26 @@ export async function approveTokenBatchRaw(params) {
565
536
  gasLimit: finalGasLimit,
566
537
  gasPrice: finalGasPrice,
567
538
  chainId,
568
- type: 0 // Legacy 交易
539
+ type: 0, // Legacy 交易
569
540
  });
570
541
  return {
571
542
  owner: ownerAddress,
572
543
  alreadyApproved: false,
573
544
  currentAllowance,
574
545
  requiredAllowance: requiredAmount,
575
- signedTx
546
+ signedTx,
576
547
  };
577
548
  });
578
549
  const results = await Promise.all(signPromises);
579
550
  // ✅ 提取所有签名交易(过滤掉已授权的)
580
- const signedTransactions = results
581
- .filter(r => !r.alreadyApproved && r.signedTx)
582
- .map(r => r.signedTx);
583
- const alreadyApprovedCount = results.filter(r => r.alreadyApproved).length;
584
- const needApproveCount = results.filter(r => !r.alreadyApproved).length;
551
+ const signedTransactions = results.filter((r) => !r.alreadyApproved && r.signedTx).map((r) => r.signedTx);
552
+ const alreadyApprovedCount = results.filter((r) => r.alreadyApproved).length;
553
+ const needApproveCount = results.filter((r) => !r.alreadyApproved).length;
585
554
  return {
586
555
  signedTransactions,
587
556
  results,
588
557
  needApproveCount,
589
- alreadyApprovedCount
558
+ alreadyApprovedCount,
590
559
  };
591
560
  }
592
561
  // ==================== signOnly=false(默认):直接发送交易 ====================
@@ -601,12 +570,12 @@ export async function approveTokenBatchRaw(params) {
601
570
  try {
602
571
  // 如果已经授权足够,跳过
603
572
  // ✅ max 授权:使用阈值判断(与 BSC 一致)
604
- if (isMax ? (currentAllowance >= MAX_APPROVAL_THRESHOLD) : (currentAllowance >= requiredAmount)) {
573
+ if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
605
574
  return {
606
575
  owner: ownerAddress,
607
576
  alreadyApproved: true,
608
577
  currentAllowance,
609
- requiredAllowance: requiredAmount
578
+ requiredAllowance: requiredAmount,
610
579
  };
611
580
  }
612
581
  // 发送授权交易
@@ -618,7 +587,7 @@ export async function approveTokenBatchRaw(params) {
618
587
  alreadyApproved: false,
619
588
  currentAllowance,
620
589
  requiredAllowance: requiredAmount,
621
- txHash: receipt.hash
590
+ txHash: receipt.hash,
622
591
  };
623
592
  }
624
593
  catch (error) {
@@ -627,19 +596,19 @@ export async function approveTokenBatchRaw(params) {
627
596
  alreadyApproved: false,
628
597
  currentAllowance,
629
598
  requiredAllowance: requiredAmount,
630
- error: error.message
599
+ error: getErrorMessageFromUnknown(error),
631
600
  };
632
601
  }
633
602
  });
634
603
  // ✅ 优化:并行等待所有授权交易完成
635
604
  const results = await Promise.all(approvalPromises);
636
605
  // 统计结果
637
- const approvedCount = results.filter(r => !r.alreadyApproved && !r.error).length;
638
- const errorCount = results.filter(r => r.error).length;
606
+ const approvedCount = results.filter((r) => !r.alreadyApproved && !r.error).length;
607
+ const errorCount = results.filter((r) => r.error).length;
639
608
  // ✅ 只要没有错误,就算成功(包括所有钱包都已授权的情况)
640
609
  return {
641
610
  success: errorCount === 0,
642
611
  approvedCount,
643
- results
612
+ results,
644
613
  };
645
614
  }
@@ -1,5 +1,16 @@
1
- export type FourErrorCode = 'GW' | 'ZA' | 'TO' | 'Slippage' | 'More BNB' | 'FR' | 'SO';
1
+ import { SdkErrorCode } from '../types/errors.js';
2
+ import type { FourErrorCode } from './types/errors.js';
3
+ export { SdkErrorCode } from '../types/errors.js';
4
+ export type { FourErrorCode } from './types/errors.js';
2
5
  export declare function parseFourError(err: unknown): {
3
6
  code?: FourErrorCode;
4
7
  message: string;
5
8
  };
9
+ /** 统一结构化错误(含错误码,便于上层分支处理) */
10
+ export declare class SdkError extends Error {
11
+ readonly code: SdkErrorCode;
12
+ cause?: unknown;
13
+ constructor(code: SdkErrorCode, message: string, cause?: unknown);
14
+ }
15
+ /** 将任意异常归一为 SdkError */
16
+ export declare function parseSdkError(err: unknown): SdkError;
@@ -1,3 +1,6 @@
1
+ import { getErrorMessageFromUnknown } from '../shared/foundation/normalize-unknown.js';
2
+ import { SdkErrorCode } from '../types/errors.js';
3
+ export { SdkErrorCode } from '../types/errors.js';
1
4
  const MESSAGES = {
2
5
  GW: 'Amount precision is not aligned to GWEI',
3
6
  ZA: "The 'to' address should not be address(0)",
@@ -8,9 +11,65 @@ const MESSAGES = {
8
11
  SO: 'Order amount is too small',
9
12
  };
10
13
  export function parseFourError(err) {
11
- const raw = String(err?.message ?? err);
14
+ const raw = getErrorMessageFromUnknown(err);
12
15
  const found = Object.keys(MESSAGES).find((k) => raw.includes(k));
13
16
  if (found)
14
17
  return { code: found, message: MESSAGES[found] };
15
18
  return { message: raw };
16
19
  }
20
+ function mapFourCodeToSdk(code) {
21
+ switch (code) {
22
+ case 'GW':
23
+ return SdkErrorCode.FOUR_GWEI_PRECISION;
24
+ case 'ZA':
25
+ return SdkErrorCode.FOUR_ZERO_ADDRESS;
26
+ case 'TO':
27
+ return SdkErrorCode.FOUR_ZERO_ADDRESS;
28
+ case 'Slippage':
29
+ return SdkErrorCode.FOUR_SLIPPAGE;
30
+ case 'More BNB':
31
+ return SdkErrorCode.FOUR_INSUFFICIENT_FUNDS;
32
+ case 'FR':
33
+ return SdkErrorCode.FOUR_FEE_TOO_HIGH;
34
+ case 'SO':
35
+ return SdkErrorCode.FOUR_ORDER_TOO_SMALL;
36
+ default:
37
+ return SdkErrorCode.UNKNOWN_ERROR;
38
+ }
39
+ }
40
+ /** 统一结构化错误(含错误码,便于上层分支处理) */
41
+ export class SdkError extends Error {
42
+ code;
43
+ constructor(code, message, cause) {
44
+ super(message, cause !== undefined ? { cause } : undefined);
45
+ this.name = 'SdkError';
46
+ this.code = code;
47
+ }
48
+ }
49
+ /** 将任意异常归一为 SdkError */
50
+ export function parseSdkError(err) {
51
+ if (err instanceof SdkError)
52
+ return err;
53
+ if (err === null || err === undefined) {
54
+ return new SdkError(SdkErrorCode.UNKNOWN_ERROR, 'Unknown error');
55
+ }
56
+ const raw = getErrorMessageFromUnknown(err);
57
+ const rawLower = raw.toLowerCase();
58
+ const four = parseFourError(err);
59
+ if (four.code) {
60
+ return new SdkError(mapFourCodeToSdk(four.code), four.message);
61
+ }
62
+ if (rawLower.includes('token already exists')) {
63
+ return new SdkError(SdkErrorCode.TOKEN_ALREADY_EXISTS, raw);
64
+ }
65
+ if (rawLower.includes('slippage')) {
66
+ return new SdkError(SdkErrorCode.SLIPPAGE_EXCEEDED, raw);
67
+ }
68
+ if (rawLower.includes('insufficient funds') || rawLower.includes('insufficient balance')) {
69
+ return new SdkError(SdkErrorCode.INSUFFICIENT_BALANCE, raw);
70
+ }
71
+ if (rawLower.includes('permit expired')) {
72
+ return new SdkError(SdkErrorCode.PERMIT_EXPIRED, raw);
73
+ }
74
+ return new SdkError(SdkErrorCode.UNKNOWN_ERROR, raw);
75
+ }
@@ -0,0 +1,12 @@
1
+ export declare const FOUR_TM2_ABI: string[];
2
+ export declare const PANCAKE_V2_ROUTER_ADDRESS: "0x10ED43C718714eb63d5aA57B78B54704E256024E";
3
+ export declare const PANCAKE_V3_ROUTER_ADDRESS: "0x13f4EA83D0bd40E75C8222255bc855a974568Dd4";
4
+ export declare const WBNB_ADDRESS: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c";
5
+ export declare const USDT_ADDRESS: "0x55d398326f99059fF775485246999027B3197955";
6
+ export declare const USDC_ADDRESS: "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d";
7
+ export declare const XLAYER_V2_ROUTER_ADDRESS: "0x881fb2f98c13d521009464e7d1cbf16e1b394e8e";
8
+ export declare const XLAYER_V3_ROUTER_ADDRESS: "0xBB069e9465BcabC4F488d21e793BDEf0F2d41D41";
9
+ export declare const WOKB_ADDRESS: "0xe538905cf8410324e03a5a23c1c177a474d59b2b";
10
+ export declare const ENI_V2_ROUTER_ADDRESS: "0x97ed8be49d9a8b86247090aa41e908e76b8fcf22";
11
+ export declare const ENI_DAOAAS_PORTAL_ADDRESS: "0x0078341F4CD09D7E6D3125ef6eb4cB2F46CA8310";
12
+ export declare const WEGAS_ADDRESS: "0x6d1e851446f4d004ae2a72f9afed85e8829a205e";
@@ -0,0 +1,15 @@
1
+ import { ADDRESSES } from '../constants.js';
2
+ export const FOUR_TM2_ABI = [
3
+ 'function buyTokenAMAP(uint256 origin, address token, address to, uint256 funds, uint256 minAmount) payable',
4
+ ];
5
+ export const PANCAKE_V2_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV2Router;
6
+ export const PANCAKE_V3_ROUTER_ADDRESS = ADDRESSES.BSC.PancakeV3Router;
7
+ export const WBNB_ADDRESS = ADDRESSES.BSC.WBNB;
8
+ export const USDT_ADDRESS = ADDRESSES.BSC.USDT;
9
+ export const USDC_ADDRESS = ADDRESSES.BSC.USDC;
10
+ export const XLAYER_V2_ROUTER_ADDRESS = ADDRESSES.XLAYER.PotatoSwapV2Router;
11
+ export const XLAYER_V3_ROUTER_ADDRESS = ADDRESSES.XLAYER.PotatoSwapV3Router;
12
+ export const WOKB_ADDRESS = ADDRESSES.XLAYER.WOKB;
13
+ export const ENI_V2_ROUTER_ADDRESS = ADDRESSES.ENI.DswapV2Router;
14
+ export const ENI_DAOAAS_PORTAL_ADDRESS = ADDRESSES.ENI.DaoaasPortal;
15
+ export const WEGAS_ADDRESS = ADDRESSES.ENI.WEGAS;
@@ -0,0 +1,44 @@
1
+ import { Wallet } from 'ethers';
2
+ import type { HoldersMakerChain } from '../../shared/foundation/types/holders-maker.js';
3
+ /**
4
+ * 构建 Flap 买入交易
5
+ * 使用 swapExactInput 方法
6
+ */
7
+ export declare function buildFlapBuyTx(wallet: Wallet, tokenAddress: string, buyAmount: bigint, nonce: number, gasPrice: bigint, gasLimit: number, chainId: number, txType: 0 | 2, chain: HoldersMakerChain): Promise<string>;
8
+ /**
9
+ * 构建 Four 内盘买入交易
10
+ * 使用 buyTokenAMAP 方法
11
+ */
12
+ export declare function buildFourBuyTx(wallet: Wallet, tokenAddress: string, buyAmount: bigint, nonce: number, gasPrice: bigint, gasLimit: number, chainId: number, txType: 0 | 2): Promise<string>;
13
+ /**
14
+ * 构建 DAOaaS 内盘买入交易 (ENI 链)
15
+ * EGAS → Token (使用 DAOaaS Portal buy)
16
+ */
17
+ export declare function buildDaoaasBuyTx(wallet: Wallet, tokenAddress: string, buyAmount: bigint, nonce: number, gasPrice: bigint, gasLimit: number, chainId: number): Promise<string>;
18
+ /**
19
+ * 构建 V2 买入交易
20
+ * BNB/OKB → Token (使用 swapExactETHForTokensSupportingFeeOnTransferTokens)
21
+ */
22
+ export declare function buildV2BuyTx(wallet: Wallet, tokenAddress: string, buyAmount: bigint, nonce: number, gasPrice: bigint, gasLimit: number, chainId: number, txType: 0 | 2, v2Path?: string[], chain?: HoldersMakerChain, v2RouterOverride?: string): Promise<string>;
23
+ /**
24
+ * 构建 V3 单跳买入交易
25
+ * BNB/OKB → Token (使用 exactInputSingle + multicall)
26
+ *
27
+ * ✅ 修复:根据链类型选择正确的 Router ABI 版本
28
+ * - XLayer/Monad: 旧版 Router(exactInputSingle 包含 deadline,multicall(bytes[]))
29
+ * - BSC: 新版 SwapRouter02(exactInputSingle 不含 deadline,multicall(uint256,bytes[]))
30
+ */
31
+ export declare function buildV3BuyTx(wallet: Wallet, tokenAddress: string, buyAmount: bigint, nonce: number, gasPrice: bigint, gasLimit: number, chainId: number, txType: 0 | 2, v3Fee?: number, // 默认 0.25% 手续费
32
+ chain?: HoldersMakerChain): Promise<string>;
33
+ /**
34
+ * 构建 V2 买入交易(ERC20 输入)
35
+ * USDT/USDC → Token (使用 swapExactTokensForTokensSupportingFeeOnTransferTokens)
36
+ */
37
+ export declare function buildV2BuyTxWithERC20(wallet: Wallet, tokenAddress: string, baseTokenAddress: string, buyAmount: bigint, nonce: number, gasPrice: bigint, gasLimit: number, chainId: number, txType: 0 | 2, v2RouterOverride?: string, chain?: HoldersMakerChain): Promise<string>;
38
+ /**
39
+ * 构建 V3 买入交易(ERC20 输入)
40
+ * USDT/USDC → Token (使用 exactInputSingle + multicall)
41
+ *
42
+ * ✅ 修复:使用 ethers.Interface 手动编码 calldata,避免 multicall 重载问题
43
+ */
44
+ export declare function buildV3BuyTxWithERC20(wallet: Wallet, tokenAddress: string, baseTokenAddress: string, buyAmount: bigint, nonce: number, gasPrice: bigint, gasLimit: number, chainId: number, txType: 0 | 2, v3Fee?: number): Promise<string>;