four-flap-meme-sdk 1.9.49 → 2.0.0

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 (530) 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/abis/common.js +74 -68
  5. package/dist/abis/flap/vault.js +9 -7
  6. package/dist/abis/index.d.ts +3 -4
  7. package/dist/abis/index.js +3 -4
  8. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  9. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  10. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
  11. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  12. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
  13. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  14. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  15. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  16. package/dist/bundle-core/config-helpers.d.ts +36 -0
  17. package/dist/bundle-core/config-helpers.js +57 -0
  18. package/dist/bundle-core/errors.d.ts +50 -0
  19. package/dist/bundle-core/errors.js +34 -0
  20. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  21. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  22. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  23. package/dist/bundle-core/four-meme/core-helpers.js +40 -0
  24. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  25. package/dist/bundle-core/four-meme/core.js +515 -0
  26. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  27. package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
  28. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  29. package/dist/bundle-core/four-meme/private.js +465 -0
  30. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  31. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  32. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  33. package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
  34. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  35. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  36. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  37. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  38. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
  39. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  40. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  41. package/dist/bundle-core/four-meme/swap.js +505 -0
  42. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  43. package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
  44. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  45. package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
  46. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  47. package/dist/bundle-core/four-meme/types/index.js +1 -0
  48. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  49. package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
  50. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  51. package/dist/bundle-core/four-meme/types.js +1 -0
  52. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  53. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  54. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  55. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  56. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  57. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  58. package/dist/bundle-core/index.d.ts +8 -0
  59. package/dist/bundle-core/index.js +8 -0
  60. package/dist/bundle-core/internal.d.ts +21 -0
  61. package/dist/bundle-core/internal.js +182 -0
  62. package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
  63. package/dist/bundle-core/sign-context-helpers.js +67 -0
  64. package/dist/bundle-core/submit.d.ts +293 -0
  65. package/dist/bundle-core/submit.js +727 -0
  66. package/dist/bundle-core/types/index.d.ts +8 -0
  67. package/dist/bundle-core/types/index.js +1 -0
  68. package/dist/bundle-core/types.d.ts +1 -0
  69. package/dist/bundle-core/types.js +1 -0
  70. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  71. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -116
  72. package/dist/chains/bsc/four/config.d.ts +5 -70
  73. package/dist/chains/bsc/four/config.js +2 -115
  74. package/dist/chains/bsc/four/core.d.ts +1 -4
  75. package/dist/chains/bsc/four/core.js +1 -589
  76. package/dist/chains/bsc/four/disperse.d.ts +12 -0
  77. package/dist/chains/bsc/four/disperse.js +470 -0
  78. package/dist/chains/bsc/four/index.d.ts +6 -6
  79. package/dist/chains/bsc/four/index.js +6 -6
  80. package/dist/chains/bsc/four/internal.d.ts +2 -50
  81. package/dist/chains/bsc/four/internal.js +2 -237
  82. package/dist/chains/bsc/four/pairwise.d.ts +7 -0
  83. package/dist/chains/bsc/four/pairwise.js +308 -0
  84. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  85. package/dist/chains/bsc/four/pancake-proxy.js +1 -688
  86. package/dist/chains/bsc/four/private.d.ts +1 -27
  87. package/dist/chains/bsc/four/private.js +1 -477
  88. package/dist/chains/bsc/four/submit.d.ts +2 -315
  89. package/dist/chains/bsc/four/submit.js +2 -746
  90. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  91. package/dist/chains/bsc/four/swap-buy-first.js +2 -506
  92. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  93. package/dist/chains/bsc/four/swap-internal.js +1 -18
  94. package/dist/chains/bsc/four/swap.d.ts +2 -144
  95. package/dist/chains/bsc/four/swap.js +2 -760
  96. package/dist/chains/bsc/four/sweep.d.ts +13 -0
  97. package/dist/chains/bsc/four/sweep.js +788 -0
  98. package/dist/chains/bsc/four/types.d.ts +1 -476
  99. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  100. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  101. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  102. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  103. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  104. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  105. package/dist/chains/bsc/four/utils.d.ts +5 -18
  106. package/dist/chains/bsc/four/utils.js +5 -1534
  107. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
  108. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
  109. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  110. package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -207
  111. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  112. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
  113. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  114. package/dist/chains/bsc/pancake/bundle-swap.js +111 -686
  115. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  116. package/dist/chains/bsc/pancake/index.js +1 -3
  117. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  118. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  119. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  120. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  121. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  122. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  123. package/dist/chains/eni/batch-router/transfer.js +54 -23
  124. package/dist/chains/eni/batch-router/utils.js +32 -6
  125. package/dist/chains/eni/bundler/sign.js +4 -4
  126. package/dist/chains/eni/bundler/submit.js +1 -4
  127. package/dist/chains/eni/constants.js +1 -1
  128. package/dist/chains/eni/index.d.ts +1 -1
  129. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  130. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  131. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  132. package/dist/chains/eni/platforms/daoaas/meta.js +8 -4
  133. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
  134. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  135. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  136. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  137. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  138. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -47
  139. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  140. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  141. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  142. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  143. package/dist/chains/eni/platforms/iro/index.js +4 -4
  144. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  145. package/dist/chains/eni/platforms/iro/token.js +107 -31
  146. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  147. package/dist/chains/eni/submit.js +5 -13
  148. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  149. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
  150. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  151. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  152. package/dist/chains/xlayer/eip7702/bundle-create.js +93 -56
  153. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  154. package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
  155. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  156. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
  157. package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
  158. package/dist/chains/xlayer/eip7702/constants.js +3 -21
  159. package/dist/chains/xlayer/eip7702/index.d.ts +27 -46
  160. package/dist/chains/xlayer/eip7702/index.js +27 -81
  161. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
  162. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
  163. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  164. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +58 -291
  165. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  166. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
  167. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  168. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  169. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  170. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
  171. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  172. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  173. package/dist/chains/xlayer/eip7702/volume.js +83 -158
  174. package/dist/chains/xlayer/eoa/constants.js +1 -1
  175. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  176. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  177. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  178. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  179. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +64 -276
  180. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  181. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
  182. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  183. package/dist/chains/xlayer/eoa/index.js +8 -23
  184. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  185. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  186. package/dist/chains/xlayer/eoa/types-core.d.ts +363 -0
  187. package/dist/chains/xlayer/eoa/types-core.js +53 -0
  188. package/dist/chains/xlayer/eoa/types-create.d.ts +413 -0
  189. package/dist/chains/xlayer/eoa/types-create.js +9 -0
  190. package/dist/chains/xlayer/eoa/types-volume.d.ts +209 -0
  191. package/dist/chains/xlayer/eoa/types-volume.js +13 -0
  192. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  193. package/dist/chains/xlayer/eoa/types.js +1 -3
  194. package/dist/contracts/helper3.d.ts +20 -17
  195. package/dist/contracts/helper3.js +56 -20
  196. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  197. package/dist/contracts/tm-bundle-helpers.js +72 -0
  198. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  199. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -117
  200. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
  201. package/dist/contracts/tm-bundle-merkle/config.js +2 -115
  202. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  203. package/dist/contracts/tm-bundle-merkle/core.js +1 -588
  204. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  205. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  206. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -50
  207. package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
  208. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  209. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
  210. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  211. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  212. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  213. package/dist/contracts/tm-bundle-merkle/submit.js +3 -919
  214. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  215. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
  216. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  217. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  218. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  219. package/dist/contracts/tm-bundle-merkle/swap.js +2 -757
  220. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  221. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  222. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  223. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  224. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  225. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  226. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  227. package/dist/contracts/tm-bundle-merkle/utils.d.ts +5 -6
  228. package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
  229. package/dist/contracts/tm-bundle.d.ts +3 -51
  230. package/dist/contracts/tm-bundle.js +102 -142
  231. package/dist/contracts/tm.d.ts +3 -2
  232. package/dist/contracts/tm.js +36 -32
  233. package/dist/contracts/tm1.js +9 -4
  234. package/dist/contracts/tm2.js +9 -4
  235. package/dist/dex/direct-router-helpers.d.ts +264 -0
  236. package/dist/dex/direct-router-helpers.js +539 -0
  237. package/dist/dex/direct-router.d.ts +3 -125
  238. package/dist/dex/direct-router.js +237 -652
  239. package/dist/dex/types.d.ts +81 -0
  240. package/dist/dex/types.js +1 -0
  241. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  242. package/dist/exports/root-bundle-and-tooling.js +30 -0
  243. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  244. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  245. package/dist/exports/root-foundations.d.ts +35 -0
  246. package/dist/exports/root-foundations.js +70 -0
  247. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  248. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  249. package/dist/flows/create.d.ts +2 -2
  250. package/dist/flows/create.js +6 -6
  251. package/dist/flows/index.d.ts +1 -0
  252. package/dist/flows/index.js +1 -0
  253. package/dist/index.d.ts +20 -91
  254. package/dist/index.js +20 -215
  255. package/dist/shared/abis/common.d.ts +2 -83
  256. package/dist/shared/abis/common.js +2 -252
  257. package/dist/shared/abis/index.d.ts +5 -6
  258. package/dist/shared/abis/index.js +5 -7
  259. package/dist/shared/clients/blockrazor.js +41 -24
  260. package/dist/shared/clients/club48.js +30 -26
  261. package/dist/shared/clients/emitservice.js +2 -0
  262. package/dist/shared/clients/four.js +23 -18
  263. package/dist/shared/clients/index.d.ts +8 -0
  264. package/dist/shared/clients/index.js +8 -0
  265. package/dist/shared/clients/merkle.js +26 -30
  266. package/dist/shared/constants/addresses.d.ts +1 -1
  267. package/dist/shared/constants/addresses.js +11 -2
  268. package/dist/shared/constants/chains.d.ts +1 -1
  269. package/dist/shared/constants/chains.js +1 -1
  270. package/dist/shared/constants/gas.d.ts +1 -1
  271. package/dist/shared/constants/gas.js +2 -6
  272. package/dist/shared/constants/index.d.ts +1 -0
  273. package/dist/shared/constants/index.js +1 -0
  274. package/dist/shared/constants/quote.d.ts +30 -0
  275. package/dist/shared/constants/quote.js +37 -0
  276. package/dist/shared/flap/__tests__/curve.test.js +3 -3
  277. package/dist/shared/flap/abi.js +1 -1
  278. package/dist/shared/flap/constants.d.ts +1 -1
  279. package/dist/shared/flap/constants.js +2 -2
  280. package/dist/shared/flap/curve.js +3 -0
  281. package/dist/shared/flap/errors.d.ts +1 -4
  282. package/dist/shared/flap/errors.js +21 -3
  283. package/dist/shared/flap/index.d.ts +2 -2
  284. package/dist/shared/flap/index.js +2 -2
  285. package/dist/shared/flap/meta.d.ts +16 -18
  286. package/dist/shared/flap/meta.js +14 -26
  287. package/dist/shared/flap/permit.js +6 -5
  288. package/dist/shared/flap/pinata.d.ts +9 -2
  289. package/dist/shared/flap/pinata.js +20 -18
  290. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  291. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  292. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  293. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  294. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  295. package/dist/shared/flap/portal-bundle-merkle/core.js +66 -156
  296. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
  297. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
  298. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  299. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  300. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  301. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  302. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  303. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  304. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  305. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
  306. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  307. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  308. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
  309. package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
  310. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +73 -3
  311. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +100 -0
  312. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +133 -0
  313. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  314. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  315. package/dist/shared/flap/portal-bundle.js +54 -42
  316. package/dist/shared/flap/portal.js +32 -10
  317. package/dist/shared/flap/vanity.js +4 -7
  318. package/dist/shared/flap/vault.d.ts +1 -1
  319. package/dist/shared/flap/vault.js +54 -48
  320. package/dist/shared/flap 2/__tests__/curve.test.d.ts +1 -0
  321. package/dist/shared/flap 2/portal-bundle-merkle/types.js +1 -0
  322. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  323. package/dist/shared/foundation/dex/v3-path.js +35 -0
  324. package/dist/shared/foundation/gas/bundle-gas.d.ts +39 -0
  325. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  326. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  327. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  328. package/dist/shared/foundation/index.d.ts +13 -0
  329. package/dist/shared/foundation/index.js +12 -0
  330. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  331. package/dist/shared/foundation/nonce/nonce-manager.js +180 -0
  332. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  333. package/dist/shared/foundation/normalize-unknown.js +29 -0
  334. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  335. package/dist/shared/foundation/sdk-logger.js +12 -0
  336. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  337. package/dist/shared/foundation/tx/build-request.js +25 -0
  338. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  339. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  340. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  341. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  342. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  343. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  344. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  345. package/dist/shared/foundation/types/erc20.js +1 -0
  346. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  347. package/dist/shared/foundation/types/holders-maker.js +1 -0
  348. package/dist/shared/foundation/types/index.d.ts +7 -0
  349. package/dist/shared/foundation/types/index.js +1 -0
  350. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  351. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  352. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  353. package/dist/shared/foundation/types/multicall.js +1 -0
  354. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  355. package/dist/shared/foundation/types/private-sale.js +1 -0
  356. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  357. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  358. package/dist/shared/four/tax-token.d.ts +1 -1
  359. package/dist/shared/four/tax-token.js +27 -7
  360. package/dist/shared/index.d.ts +4 -0
  361. package/dist/shared/index.js +4 -0
  362. package/dist/types/distribute.d.ts +72 -0
  363. package/dist/types/distribute.js +1 -0
  364. package/dist/types 2/errors.d.ts +27 -0
  365. package/dist/types 2/errors.js +34 -0
  366. package/dist/utils/airdrop-sweep-types.d.ts +1 -0
  367. package/dist/utils/airdrop-sweep-types.js +1 -0
  368. package/dist/utils/airdrop-sweep.d.ts +4 -76
  369. package/dist/utils/airdrop-sweep.js +38 -52
  370. package/dist/utils/bundle-helpers.d.ts +9 -243
  371. package/dist/utils/bundle-helpers.js +10 -584
  372. package/dist/utils/constants.d.ts +5 -61
  373. package/dist/utils/constants.js +5 -80
  374. package/dist/utils/contract-factory.d.ts +2 -4
  375. package/dist/utils/contract-factory.js +25 -18
  376. package/dist/utils/erc20-types.d.ts +1 -0
  377. package/dist/utils/erc20-types.js +1 -0
  378. package/dist/utils/erc20.d.ts +8 -90
  379. package/dist/utils/erc20.js +94 -153
  380. package/dist/utils/errors.d.ts +10 -22
  381. package/dist/utils/errors.js +61 -79
  382. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  383. package/dist/utils/holders-maker/addresses.js +15 -0
  384. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  385. package/dist/utils/holders-maker/buy-tx.js +278 -0
  386. package/dist/utils/holders-maker/constants.d.ts +6 -0
  387. package/dist/utils/holders-maker/constants.js +7 -0
  388. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  389. package/dist/utils/holders-maker/disperse.js +90 -0
  390. package/dist/utils/holders-maker/routing.d.ts +4 -0
  391. package/dist/utils/holders-maker/routing.js +45 -0
  392. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  393. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  394. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  395. package/dist/utils/holders-maker-helpers.js +9 -0
  396. package/dist/utils/holders-maker-types.d.ts +1 -0
  397. package/dist/utils/holders-maker-types.js +1 -0
  398. package/dist/utils/holders-maker.d.ts +2 -138
  399. package/dist/utils/holders-maker.js +23 -651
  400. package/dist/utils/hop-chains.d.ts +35 -0
  401. package/dist/utils/hop-chains.js +215 -0
  402. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  403. package/dist/utils/lp-inspect-helpers.js +109 -0
  404. package/dist/utils/lp-inspect-types.d.ts +1 -0
  405. package/dist/utils/lp-inspect-types.js +1 -0
  406. package/dist/utils/lp-inspect.d.ts +2 -112
  407. package/dist/utils/lp-inspect.js +63 -195
  408. package/dist/utils/mpcExclusive.d.ts +2 -5
  409. package/dist/utils/mpcExclusive.js +4 -3
  410. package/dist/utils/private-sale-types.d.ts +1 -0
  411. package/dist/utils/private-sale-types.js +1 -0
  412. package/dist/utils/private-sale.d.ts +2 -58
  413. package/dist/utils/private-sale.js +2 -7
  414. package/dist/utils/provider-factory.d.ts +4 -0
  415. package/dist/utils/provider-factory.js +10 -0
  416. package/dist/utils/quote-helpers-types.d.ts +1 -0
  417. package/dist/utils/quote-helpers-types.js +1 -0
  418. package/dist/utils/quote-helpers.d.ts +4 -45
  419. package/dist/utils/quote-helpers.js +15 -65
  420. package/dist/utils/stealth-transfer.d.ts +2 -28
  421. package/dist/utils/stealth-transfer.js +30 -14
  422. package/dist/utils/swap-helpers.d.ts +0 -3
  423. package/dist/utils/swap-helpers.js +6 -9
  424. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  425. package/dist/utils/types/airdrop-sweep.js +1 -0
  426. package/dist/utils/types/contract-factory.d.ts +1 -0
  427. package/dist/utils/types/contract-factory.js +1 -0
  428. package/dist/utils/types/erc20.d.ts +1 -0
  429. package/dist/utils/types/erc20.js +1 -0
  430. package/dist/utils/types/errors.d.ts +1 -0
  431. package/dist/utils/types/errors.js +1 -0
  432. package/dist/utils/types/holders-maker.d.ts +1 -0
  433. package/dist/utils/types/holders-maker.js +1 -0
  434. package/dist/utils/types/hop-chains.d.ts +8 -0
  435. package/dist/utils/types/hop-chains.js +1 -0
  436. package/dist/utils/types/index.d.ts +13 -0
  437. package/dist/utils/types/index.js +1 -0
  438. package/dist/utils/types/lp-inspect.d.ts +1 -0
  439. package/dist/utils/types/lp-inspect.js +1 -0
  440. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  441. package/dist/utils/types/mpc-exclusive.js +1 -0
  442. package/dist/utils/types/private-sale.d.ts +1 -0
  443. package/dist/utils/types/private-sale.js +1 -0
  444. package/dist/utils/types/quote-helpers.d.ts +1 -0
  445. package/dist/utils/types/quote-helpers.js +1 -0
  446. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  447. package/dist/utils/types/stealth-transfer.js +1 -0
  448. package/dist/utils/types/wallet.d.ts +25 -0
  449. package/dist/utils/types/wallet.js +1 -0
  450. package/dist/utils/wallet.d.ts +2 -25
  451. package/dist/utils/wallet.js +9 -10
  452. package/package.json +55 -2
  453. package/src/abis/contracts/TaxToken.json +969 -0
  454. package/src/abis/contracts/TokenManager.json +836 -0
  455. package/src/abis/contracts/TokenManager2.json +136 -0
  456. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  457. /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
  458. /package/dist/{shared 2/flap/portal-bundle-merkle/types.js → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
  459. /package/dist/{shared 2/abis → shared/abis 2}/TaxToken.json +0 -0
  460. /package/dist/{shared 2/abis → shared/abis 2}/TokenManager.json +0 -0
  461. /package/dist/{shared 2/abis → shared/abis 2}/TokenManager2.json +0 -0
  462. /package/dist/{shared 2/abis → shared/abis 2}/TokenManagerHelper3.json +0 -0
  463. /package/dist/{shared 2/abis → shared/abis 2}/common.d.ts +0 -0
  464. /package/dist/{shared 2/abis → shared/abis 2}/common.js +0 -0
  465. /package/dist/{shared 2/abis → shared/abis 2}/index.d.ts +0 -0
  466. /package/dist/{shared 2/abis → shared/abis 2}/index.js +0 -0
  467. /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.d.ts +0 -0
  468. /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.js +0 -0
  469. /package/dist/{shared 2/clients → shared/clients 2}/club48.d.ts +0 -0
  470. /package/dist/{shared 2/clients → shared/clients 2}/club48.js +0 -0
  471. /package/dist/{shared 2/clients → shared/clients 2}/emitservice.d.ts +0 -0
  472. /package/dist/{shared 2/clients → shared/clients 2}/emitservice.js +0 -0
  473. /package/dist/{shared 2/clients → shared/clients 2}/four.d.ts +0 -0
  474. /package/dist/{shared 2/clients → shared/clients 2}/four.js +0 -0
  475. /package/dist/{shared 2/clients → shared/clients 2}/merkle.d.ts +0 -0
  476. /package/dist/{shared 2/clients → shared/clients 2}/merkle.js +0 -0
  477. /package/dist/{shared 2/flap → shared/flap 2}/__tests__/curve.test.js +0 -0
  478. /package/dist/{shared 2/flap → shared/flap 2}/abi.d.ts +0 -0
  479. /package/dist/{shared 2/flap → shared/flap 2}/abi.js +0 -0
  480. /package/dist/{shared 2/flap → shared/flap 2}/constants.d.ts +0 -0
  481. /package/dist/{shared 2/flap → shared/flap 2}/constants.js +0 -0
  482. /package/dist/{shared 2/flap → shared/flap 2}/curve.d.ts +0 -0
  483. /package/dist/{shared 2/flap → shared/flap 2}/curve.js +0 -0
  484. /package/dist/{shared 2/flap → shared/flap 2}/errors.d.ts +0 -0
  485. /package/dist/{shared 2/flap → shared/flap 2}/errors.js +0 -0
  486. /package/dist/{shared 2/flap → shared/flap 2}/index.d.ts +0 -0
  487. /package/dist/{shared 2/flap → shared/flap 2}/index.js +0 -0
  488. /package/dist/{shared 2/flap → shared/flap 2}/ipfs.d.ts +0 -0
  489. /package/dist/{shared 2/flap → shared/flap 2}/ipfs.js +0 -0
  490. /package/dist/{shared 2/flap → shared/flap 2}/meta.d.ts +0 -0
  491. /package/dist/{shared 2/flap → shared/flap 2}/meta.js +0 -0
  492. /package/dist/{shared 2/flap → shared/flap 2}/permit.d.ts +0 -0
  493. /package/dist/{shared 2/flap → shared/flap 2}/permit.js +0 -0
  494. /package/dist/{shared 2/flap → shared/flap 2}/pinata.d.ts +0 -0
  495. /package/dist/{shared 2/flap → shared/flap 2}/pinata.js +0 -0
  496. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.d.ts +0 -0
  497. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.js +0 -0
  498. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.d.ts +0 -0
  499. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.js +0 -0
  500. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.d.ts +0 -0
  501. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.js +0 -0
  502. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.d.ts +0 -0
  503. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.js +0 -0
  504. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.d.ts +0 -0
  505. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.js +0 -0
  506. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.d.ts +0 -0
  507. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.js +0 -0
  508. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.d.ts +0 -0
  509. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.js +0 -0
  510. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.d.ts +0 -0
  511. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.js +0 -0
  512. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.d.ts +0 -0
  513. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.js +0 -0
  514. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/types.d.ts +0 -0
  515. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.d.ts +0 -0
  516. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.js +0 -0
  517. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.d.ts +0 -0
  518. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.js +0 -0
  519. /package/dist/{shared 2/flap → shared/flap 2}/portal.d.ts +0 -0
  520. /package/dist/{shared 2/flap → shared/flap 2}/portal.js +0 -0
  521. /package/dist/{shared 2/flap → shared/flap 2}/vanity.d.ts +0 -0
  522. /package/dist/{shared 2/flap → shared/flap 2}/vanity.js +0 -0
  523. /package/dist/{shared 2/flap → shared/flap 2}/vault.d.ts +0 -0
  524. /package/dist/{shared 2/flap → shared/flap 2}/vault.js +0 -0
  525. /package/dist/{shared 2/four → shared/four 2}/index.d.ts +0 -0
  526. /package/dist/{shared 2/four → shared/four 2}/index.js +0 -0
  527. /package/dist/{shared 2/four → shared/four 2}/tax-token.d.ts +0 -0
  528. /package/dist/{shared 2/four → shared/four 2}/tax-token.js +0 -0
  529. /package/dist/{shared 2/index.d.ts → shared/index 2.js} +0 -0
  530. /package/dist/{shared 2/index.js → shared/index.d 2.ts} +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,20 +23,15 @@ async function validateContractAddress(provider, address, label) {
22
23
  }
23
24
  }
24
25
  catch (error) {
25
- if (error instanceof Error ? error.message : String(error).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
- const errMsg = error instanceof Error ? error instanceof Error ? error.message : String(error) : String(error);
29
- const errCode = error.code;
30
- // 如果是 checksum 错误,提供更友好的提示
31
- if (errMsg.includes('bad address checksum') || errCode === 'INVALID_ARGUMENT') {
32
- const formatErr = new Error(`❌ ${label} 地址格式错误,请使用正确的 checksum 格式: ${address}`);
33
- Object.assign(formatErr, { cause: error });
34
- throw formatErr;
30
+ const code = error !== null && typeof error === 'object' && 'code' in error ? error.code : undefined;
31
+ if (msg.includes('bad address checksum') || code === 'INVALID_ARGUMENT') {
32
+ throw new Error(`❌ ${label} 地址格式错误,请使用正确的 checksum 格式: ${address}`);
35
33
  }
36
- const verifyErr = new Error(`❌ 无法验证 ${label} 地址 ${address}: ${errMsg}`);
37
- Object.assign(verifyErr, { cause: error });
38
- throw verifyErr;
34
+ throw new Error(`❌ 无法验证 ${label} 地址 ${address}: ${msg}`);
39
35
  }
40
36
  }
41
37
  /**
@@ -55,10 +51,7 @@ async function ensureAllowance(rpcUrl, privateKey, token, owner, spender, requir
55
51
  current = await erc20.allowance(owner, spender);
56
52
  }
57
53
  catch (error) {
58
- const msg2 = error instanceof Error ? error instanceof Error ? error.message : String(error) : String(error);
59
- const allowErr = new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${msg2}`);
60
- Object.assign(allowErr, { cause: error });
61
- throw allowErr;
54
+ throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${getErrorMessageFromUnknown(error)}`);
62
55
  }
63
56
  if (current >= required) {
64
57
  return {
@@ -76,30 +69,17 @@ async function ensureAllowance(rpcUrl, privateKey, token, owner, spender, requir
76
69
  txReceipt: receipt,
77
70
  };
78
71
  }
79
- /**
80
- * 检查代币授权状态 - Four.meme V1(只读,不发送交易)
81
- * @returns 是否已授权足够的额度
82
- */
83
- export async function checkSellApprovalV1(chain, rpcUrl, token, owner, amount) {
84
- const proxyAddresses = {
85
- BSC: ADDRESSES.BSC.TokenManagerV1, // FourMeme 代理合约 V1 (BSC)
86
- BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
87
- ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
88
- };
72
+ async function checkAllowanceForSpender(rpcUrl, token, owner, amount, spender, spenderLabel) {
89
73
  const provider = new JsonRpcProvider(rpcUrl);
90
- // ✅ 验证 token 和代理合约地址
91
74
  await validateContractAddress(provider, token, 'Token');
92
- await validateContractAddress(provider, proxyAddresses[chain], `Four.meme V1 Proxy (${chain})`);
75
+ await validateContractAddress(provider, spender, spenderLabel);
93
76
  const erc20 = new Contract(token, ERC20_ABI, provider);
94
77
  let current;
95
78
  try {
96
- current = await erc20.allowance(owner, proxyAddresses[chain]);
79
+ current = await erc20.allowance(owner, spender);
97
80
  }
98
81
  catch (error) {
99
- const msg = error instanceof Error ? error.message : String(error);
100
- const e = new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${msg}`);
101
- Object.assign(e, { cause: error });
102
- throw e;
82
+ throw new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${getErrorMessageFromUnknown(error)}`);
103
83
  }
104
84
  return {
105
85
  isApproved: current >= amount,
@@ -107,64 +87,42 @@ export async function checkSellApprovalV1(chain, rpcUrl, token, owner, amount) {
107
87
  requiredAllowance: amount,
108
88
  };
109
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
+ }
110
109
  /**
111
110
  * 确保代币已授权给 Four.meme V1 代理合约
112
- * 用于 Four.meme V1 代币的卖出操作
113
- * @returns 授权结果,包含是否已授权、当前额度、交易回执等信息
114
111
  */
115
112
  export async function ensureSellApprovalV1(chain, rpcUrl, privateKey, token, owner, amount) {
116
- // 授权给 FourMeme 代理合约 V1(收费版)
117
- const proxyAddresses = {
118
- BSC: ADDRESSES.BSC.TokenManagerV1, // FourMeme 代理合约 V1 (BSC)
119
- BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
120
- ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
121
- };
122
- return await ensureAllowance(rpcUrl, privateKey, token, owner, proxyAddresses[chain], amount);
113
+ return ensureAllowance(rpcUrl, privateKey, token, owner, FOUR_MEME_V1_PROXY[chain], amount);
123
114
  }
124
115
  /**
125
116
  * 检查代币授权状态 - Four.meme V2(只读,不发送交易)
126
- * @returns 是否已授权足够的额度
127
117
  */
128
118
  export async function checkSellApprovalV2(chain, rpcUrl, token, owner, amount) {
129
- const proxyAddresses = {
130
- BSC: ADDRESSES.BSC.TokenManagerV2, // FourMeme 代理合约 V2 (BSC)
131
- BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
132
- ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
133
- };
134
- const provider = new JsonRpcProvider(rpcUrl);
135
- // ✅ 验证 token 和代理合约地址
136
- await validateContractAddress(provider, token, 'Token');
137
- await validateContractAddress(provider, proxyAddresses[chain], `Four.meme V2 Proxy (${chain})`);
138
- const erc20 = new Contract(token, ERC20_ABI, provider);
139
- let current;
140
- try {
141
- current = await erc20.allowance(owner, proxyAddresses[chain]);
142
- }
143
- catch (error) {
144
- const msg = error instanceof Error ? error.message : String(error);
145
- const e = new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${msg}`);
146
- Object.assign(e, { cause: error });
147
- throw e;
148
- }
149
- return {
150
- isApproved: current >= amount,
151
- currentAllowance: current,
152
- requiredAllowance: amount,
153
- };
119
+ return checkSellApprovalForProxy(chain, rpcUrl, token, owner, amount, FOUR_MEME_V2_PROXY[chain], `Four.meme V2 Proxy (${chain})`);
154
120
  }
155
121
  /**
156
122
  * 确保代币已授权给 Four.meme V2 代理合约
157
- * 用于 Four.meme V2 代币的卖出操作
158
- * @returns 授权结果,包含是否已授权、当前额度、交易回执等信息
159
123
  */
160
124
  export async function ensureSellApprovalV2(chain, rpcUrl, privateKey, token, owner, amount) {
161
- // 授权给 FourMeme 代理合约 V2(收费版)
162
- const proxyAddresses = {
163
- BSC: ADDRESSES.BSC.TokenManagerV2, // FourMeme 代理合约 V2 (BSC)
164
- BASE: ADDRESSES.BASE.TokenManagerHelper3, // FourMeme 代理合约 (BASE)
165
- ARBITRUM_ONE: ADDRESSES.ARBITRUM_ONE.TokenManagerHelper3, // FourMeme 代理合约 (ARBITRUM)
166
- };
167
- return await ensureAllowance(rpcUrl, privateKey, token, owner, proxyAddresses[chain], amount);
125
+ return ensureAllowance(rpcUrl, privateKey, token, owner, FOUR_MEME_V2_PROXY[chain], amount);
168
126
  }
169
127
  /**
170
128
  * 检查代币授权状态 - Four.meme(通用,默认使用 V2)
@@ -186,32 +144,13 @@ export async function ensureSellApproval(chain, rpcUrl, privateKey, token, owner
186
144
  */
187
145
  export async function checkFlapSellApproval(chain, rpcUrl, token, owner, amount) {
188
146
  const proxyAddresses = {
189
- BSC: ADDRESSES.BSC.FlapPortal, // Flap Portal 代理合约 (BSC)
190
- BASE: ADDRESSES.BASE.FlapPortal, // Flap Portal 代理合约 (BASE)
191
- XLAYER: ADDRESSES.XLAYER.FlapPortal, // Flap Portal 代理合约 (XLAYER)
192
- MORPH: ADDRESSES.MORPH.FlapPortal, // Flap Portal 代理合约 (MORPH)
193
- MONAD: ADDRESSES.MONAD.FlapPortal, // Flap Portal 代理合约 (MONAD)
194
- };
195
- const provider = new JsonRpcProvider(rpcUrl);
196
- // ✅ 验证 token 和代理合约地址
197
- await validateContractAddress(provider, token, 'Token');
198
- await validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`);
199
- const erc20 = new Contract(token, ERC20_ABI, provider);
200
- let current;
201
- try {
202
- current = await erc20.allowance(owner, proxyAddresses[chain]);
203
- }
204
- catch (error) {
205
- const msg = error instanceof Error ? error.message : String(error);
206
- const e = new Error(`❌ 调用 allowance 失败(Token 可能不是 ERC20): ${msg}`);
207
- Object.assign(e, { cause: error });
208
- throw e;
209
- }
210
- return {
211
- isApproved: current >= amount,
212
- currentAllowance: current,
213
- 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,
214
152
  };
153
+ return checkAllowanceForSpender(rpcUrl, token, owner, amount, proxyAddresses[chain], `Flap Portal (${chain})`);
215
154
  }
216
155
  /**
217
156
  * 确保代币已授权给 Flap Protocol 代理合约
@@ -263,7 +202,7 @@ export async function checkFlapSellApprovalBatch(chain, rpcUrl, token, owners, r
263
202
  // ✅ 并行验证 token 和代理合约地址
264
203
  await Promise.all([
265
204
  validateContractAddress(provider, token, 'Token'),
266
- validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`)
205
+ validateContractAddress(provider, proxyAddresses[chain], `Flap Portal (${chain})`),
267
206
  ]);
268
207
  // ✅ 使用 batchCheckAllowances 批量查询(Multicall3)
269
208
  const allowances = await batchCheckAllowances(provider, token, owners, proxyAddresses[chain]);
@@ -271,7 +210,7 @@ export async function checkFlapSellApprovalBatch(chain, rpcUrl, token, owners, r
271
210
  owner,
272
211
  isApproved: allowances[i] >= required,
273
212
  currentAllowance: allowances[i],
274
- requiredAllowance: required
213
+ requiredAllowance: required,
275
214
  }));
276
215
  }
277
216
  /**
@@ -288,15 +227,15 @@ export async function batchCheckAllowances(provider, tokenAddress, owners, spend
288
227
  const multicall3 = new Contract(multicall3Address, MULTICALL3_ABI, provider);
289
228
  // 编码 allowance(owner, spender) 调用数据
290
229
  const erc20Interface = new Contract(tokenAddress, ERC20_ABI, provider).interface;
291
- const calls = owners.map(owner => ({
230
+ const calls = owners.map((owner) => ({
292
231
  target: tokenAddress,
293
232
  allowFailure: true,
294
- callData: erc20Interface.encodeFunctionData('allowance', [owner, spender])
233
+ callData: erc20Interface.encodeFunctionData('allowance', [owner, spender]),
295
234
  }));
296
235
  // 批量调用
297
236
  const results = await multicall3.aggregate3(calls);
298
237
  // 解析结果
299
- return results.map((result, _index) => {
238
+ return results.map((result) => {
300
239
  if (!result.success) {
301
240
  return 0n;
302
241
  }
@@ -408,10 +347,7 @@ export async function checkAllowanceRaw(rpcUrl, tokenAddress, ownerAddress, spen
408
347
  return allowance;
409
348
  }
410
349
  catch (error) {
411
- const qMsg = error instanceof Error ? error.message : String(error);
412
- const qErr = new Error(`❌ 查询授权额度失败: ${qMsg}`);
413
- Object.assign(qErr, { cause: error });
414
- throw qErr;
350
+ throw new Error(`❌ 查询授权额度失败: ${getErrorMessageFromUnknown(error)}`);
415
351
  }
416
352
  }
417
353
  /**
@@ -459,18 +395,15 @@ export async function approveTokenRaw(rpcUrl, privateKey, tokenAddress, spenderA
459
395
  currentAllowance = await erc20.allowance(ownerAddress, normalizedSpender);
460
396
  }
461
397
  catch (error) {
462
- const qMsg = error instanceof Error ? error.message : String(error);
463
- const qErr = new Error(`❌ 查询授权额度失败: ${qMsg}`);
464
- Object.assign(qErr, { cause: error });
465
- throw qErr;
398
+ throw new Error(`❌ 查询授权额度失败: ${getErrorMessageFromUnknown(error)}`);
466
399
  }
467
400
  // 如果已经授权足够,直接返回
468
401
  // ✅ max 授权:使用阈值判断,避免每次消耗一点 allowance 都重新授权
469
- if (isMax ? (currentAllowance >= MAX_APPROVAL_THRESHOLD) : (currentAllowance >= requiredAmount)) {
402
+ if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
470
403
  return {
471
404
  alreadyApproved: true,
472
405
  currentAllowance,
473
- requiredAllowance: requiredAmount
406
+ requiredAllowance: requiredAmount,
474
407
  };
475
408
  }
476
409
  // 发送授权交易
@@ -481,14 +414,11 @@ export async function approveTokenRaw(rpcUrl, privateKey, tokenAddress, spenderA
481
414
  alreadyApproved: false,
482
415
  currentAllowance,
483
416
  requiredAllowance: requiredAmount,
484
- txReceipt: receipt
417
+ txReceipt: receipt,
485
418
  };
486
419
  }
487
420
  catch (error) {
488
- const aMsg = error instanceof Error ? error.message : String(error);
489
- const aErr = new Error(`❌ 授权交易失败: ${aMsg}`);
490
- Object.assign(aErr, { cause: error });
491
- throw aErr;
421
+ throw new Error(`❌ 授权交易失败: ${getErrorMessageFromUnknown(error)}`);
492
422
  }
493
423
  }
494
424
  /**
@@ -519,7 +449,7 @@ export async function checkAllowanceBatchRaw(rpcUrl, tokenAddress, ownerAddresse
519
449
  const provider = new JsonRpcProvider(rpcUrl);
520
450
  // ✅ 规范化地址(转为小写,避免 checksum 错误)
521
451
  const normalizedToken = tokenAddress.toLowerCase();
522
- const normalizedOwners = ownerAddresses.map(addr => addr.toLowerCase());
452
+ const normalizedOwners = ownerAddresses.map((addr) => addr.toLowerCase());
523
453
  const normalizedSpender = spenderAddress.toLowerCase();
524
454
  // 验证地址
525
455
  await validateContractAddress(provider, normalizedToken, 'Token');
@@ -527,12 +457,26 @@ export async function checkAllowanceBatchRaw(rpcUrl, tokenAddress, ownerAddresse
527
457
  return batchCheckAllowances(provider, normalizedToken, normalizedOwners, normalizedSpender);
528
458
  }
529
459
  export async function approveTokenBatch(params) {
530
- 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;
531
461
  const spenderAddress = resolveSpenderAddress(chain, platform);
532
- 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 });
533
477
  }
534
478
  export async function approveTokenBatchRaw(params) {
535
- 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;
536
480
  if (privateKeys.length === 0 || amounts.length !== privateKeys.length) {
537
481
  throw new Error('❌ 私钥数量和授权数量必须匹配');
538
482
  }
@@ -546,12 +490,10 @@ export async function approveTokenBatchRaw(params) {
546
490
  await validateContractAddress(provider, normalizedSpender, 'Spender');
547
491
  }
548
492
  // ✅ 优化:批量创建钱包和合约实例
549
- const wallets = privateKeys.map(key => new Wallet(key, provider));
550
- const ownerAddresses = wallets.map(w => w.address);
551
- const isMaxApprovals = amounts.map(a => a === 'max');
552
- const requiredAmounts = amounts.map(amount => amount === 'max'
553
- ? MAX_UINT256
554
- : 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));
555
497
  // ==================== signOnly=true:只签名不提交 ====================
556
498
  if (signOnly) {
557
499
  // ✅ 使用 NonceManager 管理 nonce(和买卖交易一样)
@@ -560,7 +502,9 @@ export async function approveTokenBatchRaw(params) {
560
502
  const [currentAllowances, nonces, fetchedGasPrice] = await Promise.all([
561
503
  batchCheckAllowances(provider, normalizedToken, ownerAddresses, normalizedSpender),
562
504
  nonceManager.getNextNoncesForWallets(wallets), // ✅ 使用 NonceManager 批量获取 nonce
563
- 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')),
564
508
  ]);
565
509
  const finalGasPrice = fetchedGasPrice;
566
510
  const finalGasLimit = BigInt(gasLimit || 100000);
@@ -574,13 +518,13 @@ export async function approveTokenBatchRaw(params) {
574
518
  const isMax = isMaxApprovals[i];
575
519
  // 如果已经授权足够,跳过
576
520
  // ✅ max 授权:使用阈值判断(与 BSC 一致)
577
- if (isMax ? (currentAllowance >= MAX_APPROVAL_THRESHOLD) : (currentAllowance >= requiredAmount)) {
521
+ if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
578
522
  return {
579
523
  owner: ownerAddress,
580
524
  alreadyApproved: true,
581
525
  currentAllowance,
582
526
  requiredAllowance: requiredAmount,
583
- signedTx: undefined
527
+ signedTx: undefined,
584
528
  };
585
529
  }
586
530
  // 构建并签名交易
@@ -592,28 +536,26 @@ export async function approveTokenBatchRaw(params) {
592
536
  gasLimit: finalGasLimit,
593
537
  gasPrice: finalGasPrice,
594
538
  chainId,
595
- type: 0 // Legacy 交易
539
+ type: 0, // Legacy 交易
596
540
  });
597
541
  return {
598
542
  owner: ownerAddress,
599
543
  alreadyApproved: false,
600
544
  currentAllowance,
601
545
  requiredAllowance: requiredAmount,
602
- signedTx
546
+ signedTx,
603
547
  };
604
548
  });
605
549
  const results = await Promise.all(signPromises);
606
550
  // ✅ 提取所有签名交易(过滤掉已授权的)
607
- const signedTransactions = results
608
- .filter(r => !r.alreadyApproved && r.signedTx)
609
- .map(r => r.signedTx);
610
- const alreadyApprovedCount = results.filter(r => r.alreadyApproved).length;
611
- 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;
612
554
  return {
613
555
  signedTransactions,
614
556
  results,
615
557
  needApproveCount,
616
- alreadyApprovedCount
558
+ alreadyApprovedCount,
617
559
  };
618
560
  }
619
561
  // ==================== signOnly=false(默认):直接发送交易 ====================
@@ -628,12 +570,12 @@ export async function approveTokenBatchRaw(params) {
628
570
  try {
629
571
  // 如果已经授权足够,跳过
630
572
  // ✅ max 授权:使用阈值判断(与 BSC 一致)
631
- if (isMax ? (currentAllowance >= MAX_APPROVAL_THRESHOLD) : (currentAllowance >= requiredAmount)) {
573
+ if (isMax ? currentAllowance >= MAX_APPROVAL_THRESHOLD : currentAllowance >= requiredAmount) {
632
574
  return {
633
575
  owner: ownerAddress,
634
576
  alreadyApproved: true,
635
577
  currentAllowance,
636
- requiredAllowance: requiredAmount
578
+ requiredAllowance: requiredAmount,
637
579
  };
638
580
  }
639
581
  // 发送授权交易
@@ -645,29 +587,28 @@ export async function approveTokenBatchRaw(params) {
645
587
  alreadyApproved: false,
646
588
  currentAllowance,
647
589
  requiredAllowance: requiredAmount,
648
- txHash: receipt.hash
590
+ txHash: receipt.hash,
649
591
  };
650
592
  }
651
593
  catch (error) {
652
- const msg = error instanceof Error ? error.message : String(error);
653
594
  return {
654
595
  owner: ownerAddress,
655
596
  alreadyApproved: false,
656
597
  currentAllowance,
657
598
  requiredAllowance: requiredAmount,
658
- error: msg,
599
+ error: getErrorMessageFromUnknown(error),
659
600
  };
660
601
  }
661
602
  });
662
603
  // ✅ 优化:并行等待所有授权交易完成
663
604
  const results = await Promise.all(approvalPromises);
664
605
  // 统计结果
665
- const approvedCount = results.filter(r => !r.alreadyApproved && !r.error).length;
666
- 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;
667
608
  // ✅ 只要没有错误,就算成功(包括所有钱包都已授权的情况)
668
609
  return {
669
610
  success: errorCount === 0,
670
611
  approvedCount,
671
- results
612
+ results,
672
613
  };
673
614
  }
@@ -1,28 +1,16 @@
1
- /**
2
- * 统一 SDK 错误处理
3
- *
4
- * 提供 SdkError 类和 parseSdkError 函数,作为所有错误类型的统一入口。
5
- * parseFourError 作为向后兼容的包装器。
6
- */
7
1
  import { SdkErrorCode } from '../types/errors.js';
2
+ import type { FourErrorCode } from './types/errors.js';
8
3
  export { SdkErrorCode } from '../types/errors.js';
9
- /**
10
- * SDK 统一错误类
11
- */
12
- export declare class SdkError extends Error {
13
- readonly code: SdkErrorCode;
14
- readonly cause?: unknown | undefined;
15
- constructor(code: SdkErrorCode, message: string, cause?: unknown | undefined);
16
- }
17
- /**
18
- * 统一错误解析入口
19
- */
20
- export declare function parseSdkError(error: unknown): SdkError;
21
- export type FourErrorCode = 'GW' | 'ZA' | 'TO' | 'Slippage' | 'More BNB' | 'FR' | 'SO';
22
- /**
23
- * @deprecated 使用 parseSdkError 替代
24
- */
4
+ export type { FourErrorCode } from './types/errors.js';
25
5
  export declare function parseFourError(err: unknown): {
26
6
  code?: FourErrorCode;
27
7
  message: string;
28
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,78 +1,7 @@
1
- /**
2
- * 统一 SDK 错误处理
3
- *
4
- * 提供 SdkError 类和 parseSdkError 函数,作为所有错误类型的统一入口。
5
- * parseFourError 作为向后兼容的包装器。
6
- */
1
+ import { getErrorMessageFromUnknown } from '../shared/foundation/normalize-unknown.js';
7
2
  import { SdkErrorCode } from '../types/errors.js';
8
3
  export { SdkErrorCode } from '../types/errors.js';
9
- /**
10
- * SDK 统一错误类
11
- */
12
- export class SdkError extends Error {
13
- constructor(code, message, cause) {
14
- super(message);
15
- this.code = code;
16
- this.cause = cause;
17
- this.name = 'SdkError';
18
- }
19
- }
20
- /**
21
- * 统一错误解析入口
22
- */
23
- export function parseSdkError(error) {
24
- if (error instanceof SdkError)
25
- return error;
26
- const errObj = error;
27
- const rawMsg = errObj?.reason ||
28
- errObj?.message ||
29
- errObj?.data?.message ||
30
- String(error ?? '');
31
- const msg = String(rawMsg);
32
- const msgLower = msg.toLowerCase();
33
- // ---- Four.meme 错误模式 ----
34
- if (msg.includes('GW'))
35
- return new SdkError(SdkErrorCode.FOUR_GWEI_PRECISION, 'Amount precision is not aligned to GWEI', error);
36
- if (msg.includes('ZA'))
37
- return new SdkError(SdkErrorCode.FOUR_ZERO_ADDRESS, "The 'to' address should not be address(0)", error);
38
- if (msg.includes('TO'))
39
- return new SdkError(SdkErrorCode.INVALID_TOKEN, 'The to address should not be set to the PancakePair address', error);
40
- if (msg.includes('Slippage'))
41
- return new SdkError(SdkErrorCode.FOUR_SLIPPAGE, 'Slippage exceeded limit', error);
42
- if (msg.includes('More BNB'))
43
- return new SdkError(SdkErrorCode.FOUR_INSUFFICIENT_FUNDS, 'Insufficient BNB sent in msg.value', error);
44
- if (msg.includes('FR'))
45
- return new SdkError(SdkErrorCode.FOUR_FEE_TOO_HIGH, 'Fee rate exceeds 5%', error);
46
- if (msg.includes('SO'))
47
- return new SdkError(SdkErrorCode.FOUR_ORDER_TOO_SMALL, 'Order amount is too small', error);
48
- // ---- Flap Protocol 错误模式 ----
49
- if (msgLower.includes('token already exists') || msgLower.includes('already created'))
50
- return new SdkError(SdkErrorCode.TOKEN_ALREADY_EXISTS, 'Token already exists', error);
51
- if (msgLower.includes('token not found') || msgLower.includes('invalid token'))
52
- return new SdkError(SdkErrorCode.TOKEN_NOT_FOUND, 'Token not found', error);
53
- if (msgLower.includes('not tradable') || msgLower.includes('trading disabled'))
54
- return new SdkError(SdkErrorCode.TOKEN_NOT_TRADABLE, 'Token is not tradable', error);
55
- if (msgLower.includes('already on dex') || msgLower.includes('already migrated'))
56
- return new SdkError(SdkErrorCode.ALREADY_ON_DEX, 'Token already on DEX', error);
57
- if (msgLower.includes('insufficient balance') || msgLower.includes('insufficient funds'))
58
- return new SdkError(SdkErrorCode.INSUFFICIENT_BALANCE, 'Insufficient balance', error);
59
- if (msgLower.includes('slippage') || msgLower.includes('min output'))
60
- return new SdkError(SdkErrorCode.SLIPPAGE_EXCEEDED, 'Slippage exceeded', error);
61
- if (msgLower.includes('invalid amount') || msgLower.includes('amount too small'))
62
- return new SdkError(SdkErrorCode.INVALID_AMOUNT, 'Invalid amount', error);
63
- if (msgLower.includes('invalid quote token') || msgLower.includes('quote token not supported'))
64
- return new SdkError(SdkErrorCode.INVALID_QUOTE_TOKEN, 'Invalid quote token', error);
65
- if (msgLower.includes('tax rate') && msgLower.includes('too high'))
66
- return new SdkError(SdkErrorCode.TAX_RATE_TOO_HIGH, 'Tax rate too high', error);
67
- if (msgLower.includes('permit expired') || msgLower.includes('deadline'))
68
- return new SdkError(SdkErrorCode.PERMIT_EXPIRED, 'Permit expired', error);
69
- if (msgLower.includes('permit') && (msgLower.includes('invalid') || msgLower.includes('signature')))
70
- return new SdkError(SdkErrorCode.PERMIT_INVALID, 'Invalid permit signature', error);
71
- if (msgLower.includes('user rejected') || msgLower.includes('user denied'))
72
- return new SdkError(SdkErrorCode.TRANSACTION_FAILED, 'Transaction was rejected by user', error);
73
- return new SdkError(SdkErrorCode.UNKNOWN_ERROR, msg.slice(0, 300), error);
74
- }
75
- const FOUR_MESSAGES = {
4
+ const MESSAGES = {
76
5
  GW: 'Amount precision is not aligned to GWEI',
77
6
  ZA: "The 'to' address should not be address(0)",
78
7
  TO: 'The to address should not be set to the PancakePair address',
@@ -81,13 +10,66 @@ const FOUR_MESSAGES = {
81
10
  FR: 'Fee rate exceeds 5%',
82
11
  SO: 'Order amount is too small',
83
12
  };
84
- /**
85
- * @deprecated 使用 parseSdkError 替代
86
- */
87
13
  export function parseFourError(err) {
88
- const raw = String(err?.message ?? err);
89
- const found = Object.keys(FOUR_MESSAGES).find((k) => raw.includes(k));
14
+ const raw = getErrorMessageFromUnknown(err);
15
+ const found = Object.keys(MESSAGES).find((k) => raw.includes(k));
90
16
  if (found)
91
- return { code: found, message: FOUR_MESSAGES[found] };
17
+ return { code: found, message: MESSAGES[found] };
92
18
  return { message: raw };
93
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
+ }