four-flap-meme-sdk 2.2.2 → 2.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/README.en.md +41 -6
  2. package/README.md +31 -0
  3. package/README.zh-CN.md +41 -6
  4. package/dist/__tests__/subpath-exports.test.d.ts +1 -0
  5. package/dist/__tests__/subpath-exports.test.js +64 -0
  6. package/dist/abis/common.d.ts +85 -0
  7. package/dist/abis/common.js +264 -0
  8. package/dist/abis/contracts/TaxToken.json +969 -0
  9. package/dist/abis/contracts/TokenManager2.json +136 -0
  10. package/dist/abis/contracts/index.d.ts +5 -0
  11. package/dist/abis/contracts/index.js +5 -0
  12. package/dist/abis/flap/index.d.ts +3 -0
  13. package/dist/abis/flap/index.js +3 -0
  14. package/dist/abis/flap/portal-events.d.ts +6 -0
  15. package/dist/abis/flap/portal-events.js +17 -0
  16. package/dist/abis/flap/portal.d.ts +6 -0
  17. package/dist/abis/flap/portal.js +37 -0
  18. package/dist/abis/flap/vault.d.ts +171 -0
  19. package/dist/abis/flap/vault.js +91 -0
  20. package/dist/abis/index.d.ts +8 -0
  21. package/dist/abis/index.js +11 -0
  22. package/dist/bundle-core/__tests__/config-helpers.test.d.ts +1 -0
  23. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  24. package/dist/bundle-core/__tests__/facade-parity.test.d.ts +1 -0
  25. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  26. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
  27. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  28. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
  29. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  30. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  31. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  32. package/dist/bundle-core/config-helpers.d.ts +36 -0
  33. package/dist/bundle-core/config-helpers.js +57 -0
  34. package/dist/bundle-core/errors.d.ts +50 -0
  35. package/dist/bundle-core/errors.js +35 -0
  36. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  37. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  38. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  39. package/dist/bundle-core/four-meme/core-helpers.js +40 -0
  40. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  41. package/dist/bundle-core/four-meme/core.js +515 -0
  42. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  43. package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
  44. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  45. package/dist/bundle-core/four-meme/private.js +465 -0
  46. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  47. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  48. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  49. package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
  50. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  51. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  52. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  53. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  54. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
  55. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  56. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  57. package/dist/bundle-core/four-meme/swap.js +505 -0
  58. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  59. package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
  60. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  61. package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
  62. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  63. package/dist/bundle-core/four-meme/types/index.js +1 -0
  64. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  65. package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
  66. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  67. package/dist/bundle-core/four-meme/types.js +1 -0
  68. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  69. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  70. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  71. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  72. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  73. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  74. package/dist/bundle-core/index.d.ts +8 -0
  75. package/dist/bundle-core/index.js +8 -0
  76. package/dist/bundle-core/internal.d.ts +21 -0
  77. package/dist/bundle-core/internal.js +182 -0
  78. package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
  79. package/dist/bundle-core/sign-context-helpers.js +67 -0
  80. package/dist/bundle-core/submit.d.ts +293 -0
  81. package/dist/bundle-core/submit.js +727 -0
  82. package/dist/bundle-core/types/index.d.ts +8 -0
  83. package/dist/bundle-core/types/index.js +1 -0
  84. package/dist/bundle-core/types.d.ts +1 -0
  85. package/dist/bundle-core/types.js +1 -0
  86. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  87. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -113
  88. package/dist/chains/bsc/four/config.d.ts +5 -67
  89. package/dist/chains/bsc/four/config.js +2 -114
  90. package/dist/chains/bsc/four/core.d.ts +1 -4
  91. package/dist/chains/bsc/four/core.js +1 -592
  92. package/dist/chains/bsc/four/index.d.ts +6 -6
  93. package/dist/chains/bsc/four/index.js +6 -6
  94. package/dist/chains/bsc/four/internal.d.ts +2 -46
  95. package/dist/chains/bsc/four/internal.js +2 -239
  96. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  97. package/dist/chains/bsc/four/pancake-proxy.js +1 -687
  98. package/dist/chains/bsc/four/private.d.ts +1 -27
  99. package/dist/chains/bsc/four/private.js +1 -477
  100. package/dist/chains/bsc/four/submit.d.ts +2 -315
  101. package/dist/chains/bsc/four/submit.js +2 -752
  102. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  103. package/dist/chains/bsc/four/swap-buy-first.js +2 -507
  104. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  105. package/dist/chains/bsc/four/swap-internal.js +1 -18
  106. package/dist/chains/bsc/four/swap.d.ts +2 -144
  107. package/dist/chains/bsc/four/swap.js +2 -766
  108. package/dist/chains/bsc/four/types.d.ts +1 -476
  109. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  110. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  111. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  112. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  113. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  114. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  115. package/dist/chains/bsc/four/utils.d.ts +5 -18
  116. package/dist/chains/bsc/four/utils.js +5 -1552
  117. package/dist/chains/bsc/iro.d.ts +5 -0
  118. package/dist/chains/bsc/iro.js +4 -0
  119. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
  120. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
  121. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  122. package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -212
  123. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  124. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
  125. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  126. package/dist/chains/bsc/pancake/bundle-swap.js +114 -726
  127. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  128. package/dist/chains/bsc/pancake/index.js +1 -3
  129. package/dist/chains/bsc/platforms/iro/factory.d.ts +2 -2
  130. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  131. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  132. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  133. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  134. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  135. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  136. package/dist/chains/eni/batch-router/transfer.js +55 -25
  137. package/dist/chains/eni/batch-router/utils.js +32 -6
  138. package/dist/chains/eni/bundler/sign.js +5 -6
  139. package/dist/chains/eni/bundler/submit.js +1 -4
  140. package/dist/chains/eni/constants.js +1 -1
  141. package/dist/chains/eni/flat-aliases.d.ts +10 -0
  142. package/dist/chains/eni/flat-aliases.js +8 -0
  143. package/dist/chains/eni/index.d.ts +2 -1
  144. package/dist/chains/eni/index.js +1 -0
  145. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  146. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  147. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  148. package/dist/chains/eni/platforms/daoaas/meta.js +9 -6
  149. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -44
  150. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  151. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  152. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  153. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  154. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -46
  155. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  156. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  157. package/dist/chains/eni/platforms/iro/factory.d.ts +2 -2
  158. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  159. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  160. package/dist/chains/eni/platforms/iro/index.js +4 -4
  161. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  162. package/dist/chains/eni/platforms/iro/token.js +107 -31
  163. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  164. package/dist/chains/eni/submit.d.ts +43 -0
  165. package/dist/chains/eni/submit.js +286 -0
  166. package/dist/chains/index.d.ts +13 -0
  167. package/dist/chains/index.js +13 -0
  168. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  169. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -21
  170. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  171. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  172. package/dist/chains/xlayer/eip7702/bundle-create.js +93 -59
  173. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  174. package/dist/chains/xlayer/eip7702/bundle-sell.js +29 -111
  175. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  176. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -245
  177. package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
  178. package/dist/chains/xlayer/eip7702/constants.js +3 -21
  179. package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
  180. package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
  181. package/dist/chains/xlayer/eip7702/index.d.ts +28 -46
  182. package/dist/chains/xlayer/eip7702/index.js +28 -81
  183. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
  184. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
  185. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  186. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +63 -307
  187. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  188. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
  189. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  190. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  191. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  192. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
  193. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  194. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  195. package/dist/chains/xlayer/eip7702/volume.js +89 -164
  196. package/dist/chains/xlayer/eoa/constants.js +1 -1
  197. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  198. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  199. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  200. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  201. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +66 -299
  202. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  203. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +18 -23
  204. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  205. package/dist/chains/xlayer/eoa/index.js +8 -23
  206. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  207. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  208. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  209. package/dist/chains/xlayer/eoa/types.js +1 -3
  210. package/dist/chains/xlayer/index.d.ts +3 -2
  211. package/dist/chains/xlayer/index.js +4 -7
  212. package/dist/contracts/helper3.d.ts +20 -5
  213. package/dist/contracts/helper3.js +56 -20
  214. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  215. package/dist/contracts/tm-bundle-helpers.js +72 -0
  216. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  217. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -113
  218. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -67
  219. package/dist/contracts/tm-bundle-merkle/config.js +2 -114
  220. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  221. package/dist/contracts/tm-bundle-merkle/core.js +1 -591
  222. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  223. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  224. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -46
  225. package/dist/contracts/tm-bundle-merkle/internal.js +2 -238
  226. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  227. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -686
  228. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  229. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  230. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  231. package/dist/contracts/tm-bundle-merkle/submit.js +3 -928
  232. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  233. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -506
  234. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  235. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  236. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  237. package/dist/contracts/tm-bundle-merkle/swap.js +2 -764
  238. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  239. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  240. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  241. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  242. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  243. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  244. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  245. package/dist/contracts/tm-bundle-merkle/utils.d.ts +6 -18
  246. package/dist/contracts/tm-bundle-merkle/utils.js +6 -1501
  247. package/dist/contracts/tm-bundle.d.ts +3 -51
  248. package/dist/contracts/tm-bundle.js +108 -177
  249. package/dist/contracts/tm.d.ts +3 -2
  250. package/dist/contracts/tm.js +37 -32
  251. package/dist/contracts/tm1.js +9 -4
  252. package/dist/contracts/tm2.js +9 -4
  253. package/dist/dex/direct-router-helpers.d.ts +264 -0
  254. package/dist/dex/direct-router-helpers.js +539 -0
  255. package/dist/dex/direct-router.d.ts +3 -125
  256. package/dist/dex/direct-router.js +237 -666
  257. package/dist/dex/types.d.ts +81 -0
  258. package/dist/dex/types.js +1 -0
  259. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  260. package/dist/exports/root-bundle-and-tooling.js +30 -0
  261. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  262. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  263. package/dist/exports/root-foundations.d.ts +35 -0
  264. package/dist/exports/root-foundations.js +70 -0
  265. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  266. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  267. package/dist/flap/index.d.ts +10 -0
  268. package/dist/flap/index.js +8 -0
  269. package/dist/flows/create.d.ts +2 -1
  270. package/dist/flows/create.js +6 -6
  271. package/dist/flows/index.d.ts +1 -0
  272. package/dist/flows/index.js +1 -0
  273. package/dist/index.d.ts +20 -85
  274. package/dist/index.js +20 -215
  275. package/dist/merkle/index.d.ts +12 -0
  276. package/dist/merkle/index.js +11 -0
  277. package/dist/shared/abis/common.d.ts +2 -83
  278. package/dist/shared/abis/common.js +2 -252
  279. package/dist/shared/abis/index.d.ts +5 -6
  280. package/dist/shared/abis/index.js +5 -7
  281. package/dist/shared/clients/blockrazor.js +39 -25
  282. package/dist/shared/clients/club48.d.ts +2 -2
  283. package/dist/shared/clients/club48.js +34 -29
  284. package/dist/shared/clients/emitservice.js +2 -0
  285. package/dist/shared/clients/four.d.ts +21 -6
  286. package/dist/shared/clients/four.js +29 -24
  287. package/dist/shared/clients/index.d.ts +8 -0
  288. package/dist/shared/clients/index.js +8 -0
  289. package/dist/shared/clients/merkle.js +27 -34
  290. package/dist/shared/constants/addresses.d.ts +1 -1
  291. package/dist/shared/constants/addresses.js +11 -2
  292. package/dist/shared/constants/chains.d.ts +1 -1
  293. package/dist/shared/constants/chains.js +1 -1
  294. package/dist/shared/constants/gas.d.ts +1 -1
  295. package/dist/shared/constants/gas.js +2 -6
  296. package/dist/shared/constants/index.d.ts +3 -0
  297. package/dist/shared/constants/index.js +1 -0
  298. package/dist/shared/constants/quote.d.ts +30 -0
  299. package/dist/shared/constants/quote.js +37 -0
  300. package/dist/shared/flap/abi.js +1 -1
  301. package/dist/shared/flap/constants.d.ts +1 -2
  302. package/dist/shared/flap/constants.js +2 -3
  303. package/dist/shared/flap/curve.js +3 -0
  304. package/dist/shared/flap/errors.d.ts +1 -4
  305. package/dist/shared/flap/errors.js +20 -1
  306. package/dist/shared/flap/index.d.ts +5 -4
  307. package/dist/shared/flap/index.js +5 -4
  308. package/dist/shared/flap/meta.d.ts +22 -18
  309. package/dist/shared/flap/meta.js +12 -17
  310. package/dist/shared/flap/permit.js +5 -2
  311. package/dist/shared/flap/pinata.d.ts +22 -6
  312. package/dist/shared/flap/pinata.js +21 -26
  313. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  314. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  315. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  316. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  317. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  318. package/dist/shared/flap/portal-bundle-merkle/core.js +96 -277
  319. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +7 -2
  320. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +107 -206
  321. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
  322. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  323. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  324. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  325. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  326. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  327. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  328. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  329. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
  330. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  331. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  332. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
  333. package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
  334. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +88 -9
  335. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  336. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  337. package/dist/shared/flap/portal-bundle.js +55 -56
  338. package/dist/shared/flap/portal-create-token.d.ts +80 -0
  339. package/dist/shared/flap/portal-create-token.js +257 -0
  340. package/dist/shared/flap/portal.d.ts +14 -3
  341. package/dist/shared/flap/portal.js +50 -25
  342. package/dist/shared/flap/vanity.d.ts +1 -5
  343. package/dist/shared/flap/vanity.js +6 -17
  344. package/dist/shared/flap/vault.d.ts +17 -124
  345. package/dist/shared/flap/vault.js +67 -148
  346. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  347. package/dist/shared/foundation/dex/v3-path.js +35 -0
  348. package/dist/shared/foundation/gas/bundle-gas.d.ts +49 -0
  349. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  350. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  351. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  352. package/dist/shared/foundation/index.d.ts +13 -0
  353. package/dist/shared/foundation/index.js +12 -0
  354. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  355. package/dist/shared/foundation/nonce/nonce-manager.js +183 -0
  356. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  357. package/dist/shared/foundation/normalize-unknown.js +29 -0
  358. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  359. package/dist/shared/foundation/sdk-logger.js +12 -0
  360. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  361. package/dist/shared/foundation/tx/build-request.js +25 -0
  362. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  363. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  364. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  365. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  366. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  367. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  368. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  369. package/dist/shared/foundation/types/erc20.js +1 -0
  370. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  371. package/dist/shared/foundation/types/holders-maker.js +1 -0
  372. package/dist/shared/foundation/types/index.d.ts +7 -0
  373. package/dist/shared/foundation/types/index.js +1 -0
  374. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  375. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  376. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  377. package/dist/shared/foundation/types/multicall.js +1 -0
  378. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  379. package/dist/shared/foundation/types/private-sale.js +1 -0
  380. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  381. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  382. package/dist/shared/four/tax-token.d.ts +1 -1
  383. package/dist/shared/four/tax-token.js +27 -7
  384. package/dist/shared/index.d.ts +6 -0
  385. package/dist/shared/index.js +4 -0
  386. package/dist/types/errors.d.ts +27 -0
  387. package/dist/types/errors.js +34 -0
  388. package/dist/utils/airdrop-sweep.d.ts +4 -76
  389. package/dist/utils/airdrop-sweep.js +42 -55
  390. package/dist/utils/bundle-helpers.d.ts +9 -243
  391. package/dist/utils/bundle-helpers.js +10 -584
  392. package/dist/utils/constants.d.ts +5 -61
  393. package/dist/utils/constants.js +5 -80
  394. package/dist/utils/contract-factory.d.ts +2 -4
  395. package/dist/utils/contract-factory.js +25 -18
  396. package/dist/utils/erc20.d.ts +7 -89
  397. package/dist/utils/erc20.js +94 -125
  398. package/dist/utils/errors.d.ts +12 -1
  399. package/dist/utils/errors.js +60 -1
  400. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  401. package/dist/utils/holders-maker/addresses.js +15 -0
  402. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  403. package/dist/utils/holders-maker/buy-tx.js +278 -0
  404. package/dist/utils/holders-maker/constants.d.ts +6 -0
  405. package/dist/utils/holders-maker/constants.js +7 -0
  406. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  407. package/dist/utils/holders-maker/disperse.js +90 -0
  408. package/dist/utils/holders-maker/routing.d.ts +4 -0
  409. package/dist/utils/holders-maker/routing.js +45 -0
  410. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  411. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  412. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  413. package/dist/utils/holders-maker-helpers.js +9 -0
  414. package/dist/utils/holders-maker.d.ts +2 -138
  415. package/dist/utils/holders-maker.js +26 -661
  416. package/dist/utils/hop-chains.d.ts +35 -0
  417. package/dist/utils/hop-chains.js +215 -0
  418. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  419. package/dist/utils/lp-inspect-helpers.js +109 -0
  420. package/dist/utils/lp-inspect.d.ts +2 -112
  421. package/dist/utils/lp-inspect.js +73 -223
  422. package/dist/utils/mpcExclusive.d.ts +2 -5
  423. package/dist/utils/mpcExclusive.js +4 -3
  424. package/dist/utils/private-sale.d.ts +2 -58
  425. package/dist/utils/private-sale.js +4 -15
  426. package/dist/utils/provider-factory.d.ts +4 -0
  427. package/dist/utils/provider-factory.js +10 -0
  428. package/dist/utils/quote-helpers.d.ts +4 -45
  429. package/dist/utils/quote-helpers.js +17 -74
  430. package/dist/utils/stealth-transfer.d.ts +2 -28
  431. package/dist/utils/stealth-transfer.js +31 -15
  432. package/dist/utils/swap-helpers.d.ts +2 -15
  433. package/dist/utils/swap-helpers.js +6 -11
  434. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  435. package/dist/utils/types/airdrop-sweep.js +1 -0
  436. package/dist/utils/types/contract-factory.d.ts +1 -0
  437. package/dist/utils/types/contract-factory.js +1 -0
  438. package/dist/utils/types/erc20.d.ts +1 -0
  439. package/dist/utils/types/erc20.js +1 -0
  440. package/dist/utils/types/errors.d.ts +1 -0
  441. package/dist/utils/types/errors.js +1 -0
  442. package/dist/utils/types/holders-maker.d.ts +1 -0
  443. package/dist/utils/types/holders-maker.js +1 -0
  444. package/dist/utils/types/hop-chains.d.ts +8 -0
  445. package/dist/utils/types/hop-chains.js +1 -0
  446. package/dist/utils/types/index.d.ts +13 -0
  447. package/dist/utils/types/index.js +1 -0
  448. package/dist/utils/types/lp-inspect.d.ts +1 -0
  449. package/dist/utils/types/lp-inspect.js +1 -0
  450. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  451. package/dist/utils/types/mpc-exclusive.js +1 -0
  452. package/dist/utils/types/private-sale.d.ts +1 -0
  453. package/dist/utils/types/private-sale.js +1 -0
  454. package/dist/utils/types/quote-helpers.d.ts +1 -0
  455. package/dist/utils/types/quote-helpers.js +1 -0
  456. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  457. package/dist/utils/types/stealth-transfer.js +1 -0
  458. package/dist/utils/types/wallet.d.ts +25 -0
  459. package/dist/utils/types/wallet.js +1 -0
  460. package/dist/utils/wallet.d.ts +2 -25
  461. package/dist/utils/wallet.js +13 -10
  462. package/dist/vanity/index.d.ts +5 -0
  463. package/dist/vanity/index.js +5 -0
  464. package/package.json +160 -4
  465. package/src/abis/contracts/TaxToken.json +969 -0
  466. package/src/abis/contracts/TokenManager.json +836 -0
  467. package/src/abis/contracts/TokenManager2.json +136 -0
  468. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  469. package/dist/shared/abis/TaxToken.json +0 -105
  470. package/dist/shared/abis/TokenManager2.json +0 -60
  471. /package/dist/{shared/abis → abis/contracts}/TokenManager.json +0 -0
  472. /package/dist/{shared/abis → abis/contracts}/TokenManagerHelper3.json +0 -0
@@ -0,0 +1,220 @@
1
+ import { ethers } from 'ethers';
2
+ import { afterEach, describe, expect, it, vi } from 'vitest';
3
+ import { FourClient } from '../../shared/clients/four.js';
4
+ import { disperseWithBundleMerkle } from '../four-meme/utils-disperse.js';
5
+ import { sweepWithBundleMerkle } from '../four-meme/utils-sweep.js';
6
+ import { pairwiseTransferWithBundleMerkle } from '../four-meme/utils-pairwise.js';
7
+ import { fourBundleSwapMerkle } from '../four-meme/swap.js';
8
+ import { createTokenWithBundleBuyMerkle } from '../four-meme/core.js';
9
+ import { disperseWithBundleMerkle as facadeDisperse } from '../../chains/bsc/four/utils-disperse.js';
10
+ import { sweepWithBundleMerkle as facadeSweep } from '../../chains/bsc/four/utils-sweep.js';
11
+ import * as bundleInternal from '../internal.js';
12
+ import * as swapHelpers from '../../utils/swap-helpers.js';
13
+ import { TM_ADDRESS } from '../four-meme/swap-internal.js';
14
+ import { SIGN_FIXTURE_CHAIN_ID, SIGN_FIXTURE_PRIVATE_KEY, SIGN_FIXTURE_RECIPIENT, SIGN_FIXTURE_RPC, mockJsonRpcFeeData, parseSignedTx, } from './sign-fixtures.js';
15
+ const MNEMONIC = 'test test test test test test test test test test test junk';
16
+ describe('bundle-core sign-only fixtures', () => {
17
+ afterEach(() => {
18
+ vi.restoreAllMocks();
19
+ });
20
+ it('bsc/four utils re-export bundle-core implementations', () => {
21
+ expect(facadeDisperse).toBe(disperseWithBundleMerkle);
22
+ expect(facadeSweep).toBe(sweepWithBundleMerkle);
23
+ });
24
+ it('disperseWithBundleMerkle returns empty when no recipients', async () => {
25
+ const result = await disperseWithBundleMerkle({
26
+ fromPrivateKey: SIGN_FIXTURE_PRIVATE_KEY,
27
+ recipients: [],
28
+ amount: '0.01',
29
+ config: { rpcUrl: SIGN_FIXTURE_RPC, chainId: SIGN_FIXTURE_CHAIN_ID },
30
+ });
31
+ expect(result.signedTransactions).toEqual([]);
32
+ });
33
+ it('disperseWithBundleMerkle signs native BNB transfer + profit hop (offline)', async () => {
34
+ mockJsonRpcFeeData('5');
35
+ const startNonce = 12;
36
+ const result = await disperseWithBundleMerkle({
37
+ fromPrivateKey: SIGN_FIXTURE_PRIVATE_KEY,
38
+ recipients: [SIGN_FIXTURE_RECIPIENT],
39
+ amount: '0.01',
40
+ config: {
41
+ rpcUrl: SIGN_FIXTURE_RPC,
42
+ chainId: SIGN_FIXTURE_CHAIN_ID,
43
+ minGasPriceGwei: 5,
44
+ bribeAmount: 0,
45
+ prefer21000ForNative: true,
46
+ },
47
+ startNonce,
48
+ });
49
+ expect(result.signedTransactions.length).toBe(4);
50
+ const transferTx = parseSignedTx(result.signedTransactions[0]);
51
+ expect(transferTx.chainId).toBe(BigInt(SIGN_FIXTURE_CHAIN_ID));
52
+ expect(transferTx.type).toBe(0);
53
+ expect(transferTx.nonce).toBe(startNonce);
54
+ expect(transferTx.to?.toLowerCase()).toBe(SIGN_FIXTURE_RECIPIENT.toLowerCase());
55
+ expect(transferTx.value).toBe(ethers.parseEther('0.01'));
56
+ for (const signed of result.signedTransactions) {
57
+ expect(signed.startsWith('0x')).toBe(true);
58
+ expect(parseSignedTx(signed).chainId).toBe(BigInt(SIGN_FIXTURE_CHAIN_ID));
59
+ }
60
+ expect(result.profitHopWallets?.length).toBe(2);
61
+ expect(result.metadata?.recipientCount).toBe(1);
62
+ expect(result.metadata?.isNative).toBe(true);
63
+ });
64
+ it('sweepWithBundleMerkle signs native sweep with target paying profit (offline)', async () => {
65
+ mockJsonRpcFeeData('5');
66
+ vi.spyOn(bundleInternal, 'batchGetBalances').mockResolvedValue([ethers.parseEther('1')]);
67
+ vi.spyOn(ethers.JsonRpcProvider.prototype, 'getTransactionCount').mockResolvedValue(3);
68
+ const source = ethers.HDNodeWallet.fromPhrase(MNEMONIC, undefined, "m/44'/60'/0'/0/1");
69
+ const target = ethers.HDNodeWallet.fromPhrase(MNEMONIC, undefined, "m/44'/60'/0'/0/2");
70
+ const result = await sweepWithBundleMerkle({
71
+ sourcePrivateKeys: [source.privateKey],
72
+ target: target.address,
73
+ targetPrivateKey: target.privateKey,
74
+ amount: '0.05',
75
+ config: {
76
+ rpcUrl: SIGN_FIXTURE_RPC,
77
+ chainId: SIGN_FIXTURE_CHAIN_ID,
78
+ minGasPriceGwei: 5,
79
+ bribeAmount: 0,
80
+ prefer21000ForNative: true,
81
+ },
82
+ });
83
+ expect(result.signedTransactions.length).toBeGreaterThanOrEqual(2);
84
+ const sweepTx = result.signedTransactions.find((raw) => {
85
+ const tx = parseSignedTx(raw);
86
+ return tx.to?.toLowerCase() === target.address.toLowerCase() && tx.value === ethers.parseEther('0.05');
87
+ });
88
+ expect(sweepTx).toBeDefined();
89
+ expect(result.metadata?.isNative).toBe(true);
90
+ });
91
+ it('pairwiseTransferWithBundleMerkle signs native pairwise transfer (offline)', async () => {
92
+ mockJsonRpcFeeData('5');
93
+ const sender = ethers.HDNodeWallet.fromPhrase(MNEMONIC, undefined, "m/44'/60'/0'/0/3");
94
+ const receiver = ethers.HDNodeWallet.fromPhrase(MNEMONIC, undefined, "m/44'/60'/0'/0/4");
95
+ const result = await pairwiseTransferWithBundleMerkle({
96
+ senderPrivateKeys: [sender.privateKey],
97
+ receiverAddresses: [receiver.address],
98
+ amount: '0.02',
99
+ config: {
100
+ rpcUrl: SIGN_FIXTURE_RPC,
101
+ chainId: SIGN_FIXTURE_CHAIN_ID,
102
+ minGasPriceGwei: 5,
103
+ bribeAmount: 0,
104
+ prefer21000ForNative: true,
105
+ },
106
+ startNonce: 7,
107
+ });
108
+ expect(result.signedTransactions.length).toBeGreaterThanOrEqual(1);
109
+ const transferTx = result.signedTransactions.find((raw) => {
110
+ const tx = parseSignedTx(raw);
111
+ return tx.to?.toLowerCase() === receiver.address.toLowerCase() && tx.value === ethers.parseEther('0.02');
112
+ });
113
+ expect(transferTx).toBeDefined();
114
+ expect(result.metadata?.pairCount).toBe(1);
115
+ expect(result.metadata?.isNative).toBe(true);
116
+ });
117
+ it('fourBundleSwapMerkle signs sell+buy bundle (offline)', async () => {
118
+ mockJsonRpcFeeData('5');
119
+ vi.spyOn(swapHelpers, 'calculateSellAmount').mockResolvedValue({
120
+ amount: ethers.parseUnits('1000', 18),
121
+ decimals: 18,
122
+ });
123
+ const sellQuoteFunds = ethers.parseEther('0.5');
124
+ vi.spyOn(ethers.JsonRpcProvider.prototype, 'getBalance').mockResolvedValue(ethers.parseEther('10'));
125
+ vi.spyOn(ethers.Contract.prototype, 'getFunction').mockImplementation(((name) => {
126
+ if (name === 'trySell') {
127
+ return async () => ({ funds: sellQuoteFunds });
128
+ }
129
+ if (name === 'allowance') {
130
+ return async () => ethers.MaxUint256;
131
+ }
132
+ if (name === 'sellToken') {
133
+ return {
134
+ populateTransaction: async () => ({
135
+ to: TM_ADDRESS,
136
+ data: '0xdeadbeef',
137
+ }),
138
+ };
139
+ }
140
+ if (name === 'buyTokenAMAP') {
141
+ return {
142
+ populateTransaction: async () => ({
143
+ to: TM_ADDRESS,
144
+ data: '0xcafebabe',
145
+ }),
146
+ };
147
+ }
148
+ return async () => {
149
+ throw new Error(`unexpected getFunction ${name}`);
150
+ };
151
+ }));
152
+ const seller = ethers.HDNodeWallet.fromPhrase(MNEMONIC, undefined, "m/44'/60'/0'/0/5");
153
+ const buyer = ethers.HDNodeWallet.fromPhrase(MNEMONIC, undefined, "m/44'/60'/0'/0/6");
154
+ const tokenAddress = '0x1111111111111111111111111111111111111111';
155
+ const result = await fourBundleSwapMerkle({
156
+ sellerPrivateKey: seller.privateKey,
157
+ buyerPrivateKey: buyer.privateKey,
158
+ sellAmount: '1000',
159
+ tokenAddress,
160
+ config: {
161
+ rpcUrl: SIGN_FIXTURE_RPC,
162
+ chainId: SIGN_FIXTURE_CHAIN_ID,
163
+ minGasPriceGwei: 5,
164
+ bribeAmount: 0,
165
+ },
166
+ startNonces: [3, 1],
167
+ });
168
+ expect(result.signedTransactions.length).toBeGreaterThanOrEqual(2);
169
+ for (const signed of result.signedTransactions) {
170
+ expect(parseSignedTx(signed).chainId).toBe(BigInt(SIGN_FIXTURE_CHAIN_ID));
171
+ }
172
+ expect(result.metadata?.sellerAddress.toLowerCase()).toBe(seller.address.toLowerCase());
173
+ expect(result.metadata?.buyerAddress.toLowerCase()).toBe(buyer.address.toLowerCase());
174
+ });
175
+ it('createTokenWithBundleBuyMerkle signs create bundle with mocked Four API (offline)', async () => {
176
+ mockJsonRpcFeeData('5');
177
+ vi.spyOn(ethers.JsonRpcProvider.prototype, 'getTransactionCount').mockResolvedValue(7);
178
+ vi.spyOn(FourClient.prototype, 'generateNonce').mockResolvedValue('fixture-nonce');
179
+ vi.spyOn(FourClient.prototype, 'loginDex').mockResolvedValue('fixture-token');
180
+ vi.spyOn(FourClient.prototype, 'createToken').mockResolvedValue({
181
+ createArg: '0xabcd',
182
+ signature: '0x1234',
183
+ });
184
+ const originalGetFunction = ethers.Contract.prototype.getFunction;
185
+ vi.spyOn(ethers.Contract.prototype, 'getFunction').mockImplementation(function (key) {
186
+ const name = typeof key === 'string' ? key : key.name;
187
+ if (name === 'createToken') {
188
+ return Object.assign(async () => ({}), {
189
+ populateTransaction: async () => ({
190
+ to: '0x5c952063c7fc8610FFDB798152D69F0B9550762b',
191
+ data: '0xdeadbeef',
192
+ }),
193
+ });
194
+ }
195
+ return originalGetFunction.call(this, key);
196
+ });
197
+ const result = await createTokenWithBundleBuyMerkle({
198
+ privateKeys: [SIGN_FIXTURE_PRIVATE_KEY],
199
+ buyAmounts: ['0.01'],
200
+ tokenInfo: {
201
+ name: 'Fixture',
202
+ symbol: 'FIX',
203
+ description: 'fixture',
204
+ imageUrl: 'https://example.com/fix.png',
205
+ preSale: '0.01',
206
+ },
207
+ config: {
208
+ rpcUrl: SIGN_FIXTURE_RPC,
209
+ chainId: SIGN_FIXTURE_CHAIN_ID,
210
+ minGasPriceGwei: 5,
211
+ bribeAmount: 0,
212
+ },
213
+ });
214
+ expect(result.signedTransactions.length).toBeGreaterThanOrEqual(1);
215
+ for (const signed of result.signedTransactions) {
216
+ expect(parseSignedTx(signed).chainId).toBe(BigInt(SIGN_FIXTURE_CHAIN_ID));
217
+ }
218
+ expect(result.tokenAddress).toBe('0x0000000000000000000000000000000000000000');
219
+ });
220
+ });
@@ -0,0 +1,10 @@
1
+ import { ethers } from 'ethers';
2
+ /** Hardhat / Anvil mnemonic #0 — 仅用于离线 sign fixture */
3
+ export declare const SIGN_FIXTURE_WALLET: ethers.HDNodeWallet;
4
+ export declare const SIGN_FIXTURE_PRIVATE_KEY: string;
5
+ /** Hardhat / Anvil mnemonic #1 */
6
+ export declare const SIGN_FIXTURE_RECIPIENT = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8";
7
+ export declare const SIGN_FIXTURE_RPC = "http://127.0.0.1:8545";
8
+ export declare const SIGN_FIXTURE_CHAIN_ID = 56;
9
+ export declare function mockJsonRpcFeeData(gasPriceGwei?: string): import("vitest").Mock<() => Promise<ethers.FeeData>>;
10
+ export declare function parseSignedTx(signed: string): ethers.Transaction;
@@ -0,0 +1,16 @@
1
+ import { ethers } from 'ethers';
2
+ import { vi } from 'vitest';
3
+ /** Hardhat / Anvil mnemonic #0 — 仅用于离线 sign fixture */
4
+ export const SIGN_FIXTURE_WALLET = ethers.Wallet.fromPhrase('test test test test test test test test test test test junk');
5
+ export const SIGN_FIXTURE_PRIVATE_KEY = SIGN_FIXTURE_WALLET.privateKey;
6
+ /** Hardhat / Anvil mnemonic #1 */
7
+ export const SIGN_FIXTURE_RECIPIENT = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8';
8
+ export const SIGN_FIXTURE_RPC = 'http://127.0.0.1:8545';
9
+ export const SIGN_FIXTURE_CHAIN_ID = 56;
10
+ export function mockJsonRpcFeeData(gasPriceGwei = '3') {
11
+ const feeData = new ethers.FeeData(ethers.parseUnits(gasPriceGwei, 'gwei'), null, null);
12
+ return vi.spyOn(ethers.JsonRpcProvider.prototype, 'getFeeData').mockResolvedValue(feeData);
13
+ }
14
+ export function parseSignedTx(signed) {
15
+ return ethers.Transaction.from(signed);
16
+ }
@@ -0,0 +1,36 @@
1
+ import type { GasPriceConfig } from '../shared/foundation/gas/bundle-gas.js';
2
+ /** Gas / Tx 相关配置(各 bundle 模块 config 的公共字段) */
3
+ export type BundleGasConfigInput = {
4
+ txType?: 0 | 2;
5
+ gasPriceMultiplierPercent?: number;
6
+ minGasPriceGwei?: number;
7
+ };
8
+ /** Merkle bundle 提交相关配置 */
9
+ export type BundleMerkleConfigInput = BundleGasConfigInput & {
10
+ bundleBlockOffset?: number;
11
+ minBlockOffset?: number;
12
+ autoRetryBundle?: boolean;
13
+ maxBundleRetries?: number;
14
+ bribeAmount?: number;
15
+ };
16
+ export declare function getTxType(config: BundleGasConfigInput): 0 | 2;
17
+ export declare function getGasPriceMultiplier(config: BundleGasConfigInput): number;
18
+ export declare function getBundleOptions(config: BundleMerkleConfigInput, blockOffset?: number): {
19
+ blockOffset: number;
20
+ minBlockOffset: number;
21
+ autoRetry: boolean;
22
+ maxRetries: number;
23
+ };
24
+ export declare function getGasPriceConfig(config: BundleGasConfigInput): GasPriceConfig;
25
+ export declare function shouldExtractProfit(_config?: BundleMerkleConfigInput): boolean;
26
+ export declare function getProfitRateBps(_config?: BundleMerkleConfigInput): number;
27
+ export declare function getProfitRecipient(_config?: BundleMerkleConfigInput): string;
28
+ export declare function calculateProfit(amount: bigint, _config?: BundleMerkleConfigInput): {
29
+ profit: bigint;
30
+ remaining: bigint;
31
+ };
32
+ export declare function calculateBatchProfit(amounts: bigint[], _config?: BundleMerkleConfigInput): {
33
+ totalProfit: bigint;
34
+ remainingAmounts: bigint[];
35
+ };
36
+ export declare function getBribeAmount(config?: BundleMerkleConfigInput): bigint;
@@ -0,0 +1,57 @@
1
+ import { ethers } from 'ethers';
2
+ import { getProfitRateBps as getSharedProfitRateBps, getProfitRecipient as pickRandomProfitRecipient, } from '../shared/constants/index.js';
3
+ export function getTxType(config) {
4
+ return config.txType ?? 0;
5
+ }
6
+ export function getGasPriceMultiplier(config) {
7
+ return config.gasPriceMultiplierPercent ?? 50;
8
+ }
9
+ export function getBundleOptions(config, blockOffset) {
10
+ return {
11
+ blockOffset: blockOffset ?? config.bundleBlockOffset ?? 3,
12
+ minBlockOffset: config.minBlockOffset ?? 3,
13
+ autoRetry: config.autoRetryBundle ?? false,
14
+ maxRetries: config.maxBundleRetries ?? 2,
15
+ };
16
+ }
17
+ export function getGasPriceConfig(config) {
18
+ const gasPriceConfig = {};
19
+ if (config.minGasPriceGwei !== undefined) {
20
+ gasPriceConfig.baseGasPrice = ethers.parseUnits(String(config.minGasPriceGwei), 'gwei');
21
+ gasPriceConfig.multiplierPercent = 0;
22
+ }
23
+ else {
24
+ gasPriceConfig.multiplierPercent = getGasPriceMultiplier(config);
25
+ }
26
+ return gasPriceConfig;
27
+ }
28
+ export function shouldExtractProfit(_config) {
29
+ return true;
30
+ }
31
+ export function getProfitRateBps(_config) {
32
+ return getSharedProfitRateBps('normal');
33
+ }
34
+ export function getProfitRecipient(_config) {
35
+ return pickRandomProfitRecipient();
36
+ }
37
+ export function calculateProfit(amount, _config) {
38
+ const profit = (amount * BigInt(getProfitRateBps())) / 10000n;
39
+ return { profit, remaining: amount - profit };
40
+ }
41
+ export function calculateBatchProfit(amounts, _config) {
42
+ let totalProfit = 0n;
43
+ const remainingAmounts = [];
44
+ for (const amount of amounts) {
45
+ const { profit, remaining } = calculateProfit(amount);
46
+ totalProfit += profit;
47
+ remainingAmounts.push(remaining);
48
+ }
49
+ return { totalProfit, remainingAmounts };
50
+ }
51
+ export function getBribeAmount(config) {
52
+ const bribeBnB = config && typeof config.bribeAmount === 'number' ? config.bribeAmount : undefined;
53
+ if (bribeBnB === undefined || bribeBnB <= 0) {
54
+ return 0n;
55
+ }
56
+ return ethers.parseEther(String(bribeBnB));
57
+ }
@@ -0,0 +1,50 @@
1
+ export declare const BUNDLE_ERRORS: {
2
+ readonly NO_PRIVATE_KEY: {
3
+ readonly en: "At least 1 private key (creator) is required";
4
+ readonly zh: "至少需要 1 个私钥(创建者)";
5
+ };
6
+ readonly AMOUNT_MISMATCH: {
7
+ readonly en: (buyCount: number, buyerCount: number) => string;
8
+ readonly zh: (buyCount: number, buyerCount: number) => string;
9
+ };
10
+ readonly IMAGE_REQUIRED: {
11
+ readonly en: "Either imageUrl or imageFile must be provided";
12
+ readonly zh: "必须提供 imageUrl 或 imageFile";
13
+ };
14
+ readonly KEY_AMOUNT_MISMATCH: {
15
+ readonly en: "Private key count and amount count must match";
16
+ readonly zh: "私钥和购买金额数量必须一致";
17
+ };
18
+ readonly SELL_KEY_AMOUNT_MISMATCH: {
19
+ readonly en: "Private key count and sell amount count must match";
20
+ readonly zh: "私钥和卖出数量必须一致";
21
+ };
22
+ };
23
+ /** @deprecated 使用 BUNDLE_ERRORS */
24
+ export declare const ERRORS: {
25
+ readonly NO_PRIVATE_KEY: {
26
+ readonly en: "At least 1 private key (creator) is required";
27
+ readonly zh: "至少需要 1 个私钥(创建者)";
28
+ };
29
+ readonly AMOUNT_MISMATCH: {
30
+ readonly en: (buyCount: number, buyerCount: number) => string;
31
+ readonly zh: (buyCount: number, buyerCount: number) => string;
32
+ };
33
+ readonly IMAGE_REQUIRED: {
34
+ readonly en: "Either imageUrl or imageFile must be provided";
35
+ readonly zh: "必须提供 imageUrl 或 imageFile";
36
+ };
37
+ readonly KEY_AMOUNT_MISMATCH: {
38
+ readonly en: "Private key count and amount count must match";
39
+ readonly zh: "私钥和购买金额数量必须一致";
40
+ };
41
+ readonly SELL_KEY_AMOUNT_MISMATCH: {
42
+ readonly en: "Private key count and sell amount count must match";
43
+ readonly zh: "私钥和卖出数量必须一致";
44
+ };
45
+ };
46
+ type ErrorArgs<K extends keyof typeof BUNDLE_ERRORS> = (typeof BUNDLE_ERRORS)[K]['en'] extends (...args: infer P) => string ? P : [];
47
+ export declare function getBundleErrorMessage<K extends keyof typeof BUNDLE_ERRORS>(key: K, ...args: ErrorArgs<K>): string;
48
+ /** @deprecated 使用 getBundleErrorMessage */
49
+ export declare const getErrorMessage: typeof getBundleErrorMessage;
50
+ export {};
@@ -0,0 +1,35 @@
1
+ export const BUNDLE_ERRORS = {
2
+ NO_PRIVATE_KEY: {
3
+ en: 'At least 1 private key (creator) is required',
4
+ zh: '至少需要 1 个私钥(创建者)',
5
+ },
6
+ AMOUNT_MISMATCH: {
7
+ en: (buyCount, buyerCount) => `Buy amount count (${buyCount}) must equal buyer count (${buyerCount})`,
8
+ zh: (buyCount, buyerCount) => `购买金额数量(${buyCount})必须等于买家数量(${buyerCount})`,
9
+ },
10
+ IMAGE_REQUIRED: {
11
+ en: 'Either imageUrl or imageFile must be provided',
12
+ zh: '必须提供 imageUrl 或 imageFile',
13
+ },
14
+ KEY_AMOUNT_MISMATCH: {
15
+ en: 'Private key count and amount count must match',
16
+ zh: '私钥和购买金额数量必须一致',
17
+ },
18
+ SELL_KEY_AMOUNT_MISMATCH: {
19
+ en: 'Private key count and sell amount count must match',
20
+ zh: '私钥和卖出数量必须一致',
21
+ },
22
+ };
23
+ /** @deprecated 使用 BUNDLE_ERRORS */
24
+ export const ERRORS = BUNDLE_ERRORS;
25
+ export function getBundleErrorMessage(key, ...args) {
26
+ const lang = (process.env.LANG || process.env.LANGUAGE || 'en').toLowerCase().includes('zh') ? 'zh' : 'en';
27
+ const message = BUNDLE_ERRORS[key][lang];
28
+ if (typeof message === 'function') {
29
+ const [a, b] = args;
30
+ return message(a, b);
31
+ }
32
+ return message;
33
+ }
34
+ /** @deprecated 使用 getBundleErrorMessage */
35
+ export const getErrorMessage = getBundleErrorMessage;
@@ -0,0 +1,7 @@
1
+ import type { ApproveFourTokenManagerBatchParams, ApproveFourTokenManagerBatchResult } from './types.js';
2
+ export type { ApproveFourTokenManagerBatchParams, ApproveFourTokenManagerBatchResult } from './types.js';
3
+ /**
4
+ * 批量授权代币给 TokenManager(用于 Private Buy/Sell)
5
+ * ✅ 直接通过 RPC 提交到链上并等待确认
6
+ */
7
+ export declare function approveFourTokenManagerBatch(params: ApproveFourTokenManagerBatchParams): Promise<ApproveFourTokenManagerBatchResult>;
@@ -0,0 +1,99 @@
1
+ import { ethers, Wallet } from 'ethers';
2
+ import { NonceManager, getOptimizedGasPrice } from '../../utils/bundle-helpers.js';
3
+ import { ADDRESSES } from '../../shared/constants/index.js';
4
+ import { ERC20_ABI } from '../../abis/common.js';
5
+ import { getErrorMessageFromUnknown } from '../../shared/foundation/index.js';
6
+ import { getTxType, getGasPriceConfig } from '../config-helpers.js';
7
+ import { createSignProvider } from '../sign-context-helpers.js';
8
+ import { batchCheckAllowances } from '../../utils/erc20.js';
9
+ const APPROVAL_THRESHOLD = ethers.MaxUint256 / 2n;
10
+ function resolveApprovalGasLimit(config) {
11
+ if (config.gasLimit)
12
+ return BigInt(config.gasLimit);
13
+ if (config.gasLimitMultiplier)
14
+ return BigInt(Math.ceil(60000 * config.gasLimitMultiplier));
15
+ return 60000n;
16
+ }
17
+ /**
18
+ * 批量授权代币给 TokenManager(用于 Private Buy/Sell)
19
+ * ✅ 直接通过 RPC 提交到链上并等待确认
20
+ */
21
+ export async function approveFourTokenManagerBatch(params) {
22
+ const { privateKeys, tokenAddress, amounts, config } = params;
23
+ if (privateKeys.length === 0 || amounts.length !== privateKeys.length) {
24
+ throw new Error('Private key count and amount count must match');
25
+ }
26
+ const tmAddr = ADDRESSES.BSC.TokenManagerOriginal;
27
+ const chainId = config.chainId ?? 56;
28
+ const provider = createSignProvider(config.rpcUrl, chainId);
29
+ const wallets = privateKeys.map((k) => new Wallet(k, provider));
30
+ const allMax = amounts.every((a) => a === 'max');
31
+ const [gasPrice, decimals, allowances] = await Promise.all([
32
+ getOptimizedGasPrice(provider, getGasPriceConfig(config)),
33
+ allMax
34
+ ? Promise.resolve(18)
35
+ : (async () => {
36
+ try {
37
+ const tokenContract = new ethers.Contract(tokenAddress, ERC20_ABI, provider);
38
+ return await tokenContract.decimals();
39
+ }
40
+ catch (error) {
41
+ throw new Error(`查询代币 decimals 失败: ${getErrorMessageFromUnknown(error)}`);
42
+ }
43
+ })(),
44
+ batchCheckAllowances(provider, tokenAddress, wallets.map((w) => w.address), tmAddr),
45
+ ]);
46
+ const amountsBigInt = amounts.map((a) => (a === 'max' ? ethers.MaxUint256 : ethers.parseUnits(a, decimals)));
47
+ const needApproval = wallets.filter((_, i) => allowances[i] < APPROVAL_THRESHOLD);
48
+ const needApprovalAmounts = amountsBigInt.filter((_, i) => allowances[i] < APPROVAL_THRESHOLD);
49
+ const skippedCount = wallets.length - needApproval.length;
50
+ if (needApproval.length === 0) {
51
+ return {
52
+ success: true,
53
+ signedTransactions: [],
54
+ approvedCount: 0,
55
+ skippedCount,
56
+ message: '所有钱包已授权,无需重复授权',
57
+ };
58
+ }
59
+ const finalGasLimit = resolveApprovalGasLimit(config);
60
+ const txType = getTxType(config);
61
+ const nonceManager = new NonceManager(provider);
62
+ const needApprovalTokens = needApproval.map((w) => new ethers.Contract(tokenAddress, ERC20_ABI, w));
63
+ const [nonces, unsignedApprovals] = await Promise.all([
64
+ nonceManager.getNextNoncesForWallets(needApproval),
65
+ Promise.all(needApprovalTokens.map((token, i) => token.approve.populateTransaction(tmAddr, needApprovalAmounts[i]))),
66
+ ]);
67
+ const signedTxs = await Promise.all(unsignedApprovals.map((unsigned, i) => needApproval[i].signTransaction({
68
+ ...unsigned,
69
+ from: needApproval[i].address,
70
+ nonce: nonces[i],
71
+ gasLimit: finalGasLimit,
72
+ gasPrice,
73
+ chainId,
74
+ type: txType,
75
+ })));
76
+ nonceManager.clearTemp();
77
+ try {
78
+ const txResponses = await Promise.all(signedTxs.map((tx) => provider.broadcastTransaction(tx)));
79
+ const txHashes = txResponses.map((r) => r.hash);
80
+ await Promise.all(txResponses.map((tx) => tx.wait(1)));
81
+ return {
82
+ success: true,
83
+ signedTransactions: signedTxs,
84
+ approvedCount: signedTxs.length,
85
+ skippedCount,
86
+ txHashes,
87
+ message: `授权成功!共 ${signedTxs.length} 个钱包已授权,跳过 ${skippedCount} 个已授权钱包`,
88
+ };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ success: false,
93
+ signedTransactions: signedTxs,
94
+ approvedCount: 0,
95
+ skippedCount,
96
+ message: `授权提交失败: ${getErrorMessageFromUnknown(error)}`,
97
+ };
98
+ }
99
+ }
@@ -0,0 +1,8 @@
1
+ import { Wallet } from 'ethers';
2
+ import { FourClient } from '../../shared/clients/four.js';
3
+ import type { ChainContext, FourCreateTokenInfo } from './types/core-flow.js';
4
+ export declare const CORE_CHAIN_ID = 56;
5
+ export declare function createChainContext(rpcUrl: string): ChainContext;
6
+ export declare function createWallets(privateKeys: string[], provider: ChainContext['provider']): Wallet[];
7
+ export declare function loginFourClient(wallet: Wallet, fourClient: FourClient): Promise<string>;
8
+ export declare function resolveTokenImage(fourClient: FourClient, tokenInfo: FourCreateTokenInfo, accessToken: string): Promise<string>;
@@ -0,0 +1,40 @@
1
+ import { Wallet } from 'ethers';
2
+ import { buildLoginMessage } from '../../shared/clients/four.js';
3
+ import { createSignProvider } from '../sign-context-helpers.js';
4
+ import { getBundleErrorMessage } from '../errors.js';
5
+ export const CORE_CHAIN_ID = 56;
6
+ export function createChainContext(rpcUrl) {
7
+ const provider = createSignProvider(rpcUrl, CORE_CHAIN_ID, 'BSC');
8
+ return { provider, chainId: CORE_CHAIN_ID };
9
+ }
10
+ export function createWallets(privateKeys, provider) {
11
+ return privateKeys.map((key) => new Wallet(key, provider));
12
+ }
13
+ export async function loginFourClient(wallet, fourClient) {
14
+ const nonce = await fourClient.generateNonce({
15
+ accountAddress: wallet.address,
16
+ verifyType: 'LOGIN',
17
+ networkCode: 'BSC',
18
+ });
19
+ const loginSignature = await wallet.signMessage(buildLoginMessage(nonce));
20
+ return fourClient.loginDex({
21
+ region: 'WEB',
22
+ langType: 'EN',
23
+ verifyInfo: {
24
+ address: wallet.address,
25
+ networkCode: 'BSC',
26
+ signature: loginSignature,
27
+ verifyType: 'LOGIN',
28
+ },
29
+ walletName: 'MetaMask',
30
+ });
31
+ }
32
+ export async function resolveTokenImage(fourClient, tokenInfo, accessToken) {
33
+ if (tokenInfo.imageUrl) {
34
+ return tokenInfo.imageUrl;
35
+ }
36
+ if (tokenInfo.imageFile) {
37
+ return fourClient.uploadImage(accessToken, tokenInfo.imageFile);
38
+ }
39
+ throw new Error(getBundleErrorMessage('IMAGE_REQUIRED'));
40
+ }
@@ -0,0 +1,4 @@
1
+ import type { FourCreateWithBundleBuySignParams, FourCreateWithBundleBuyMerkleResult, FourBatchBuySignParams, FourBatchBuyMerkleResult, FourBatchSellSignParams, FourBatchSellMerkleResult } from './types.js';
2
+ export declare function createTokenWithBundleBuyMerkle(params: FourCreateWithBundleBuySignParams): Promise<FourCreateWithBundleBuyMerkleResult>;
3
+ export declare function batchBuyWithBundleMerkle(params: FourBatchBuySignParams): Promise<FourBatchBuyMerkleResult>;
4
+ export declare function batchSellWithBundleMerkle(params: FourBatchSellSignParams): Promise<FourBatchSellMerkleResult>;