four-flap-meme-sdk 2.2.18 → 2.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (492) hide show
  1. package/dist/__tests__/subpath-exports.test.d.ts +1 -0
  2. package/dist/__tests__/subpath-exports.test.js +64 -0
  3. package/dist/abis/common.d.ts +85 -0
  4. package/dist/abis/common.js +240 -0
  5. package/dist/abis/contracts/TaxToken.json +969 -0
  6. package/dist/abis/contracts/TokenManager.json +836 -0
  7. package/dist/abis/contracts/TokenManager2.json +136 -0
  8. package/dist/abis/contracts/TokenManagerHelper3.json +993 -0
  9. package/dist/abis/contracts/index.d.ts +5 -0
  10. package/dist/abis/contracts/index.js +5 -0
  11. package/dist/abis/flap/index.d.ts +5 -0
  12. package/dist/abis/flap/index.js +5 -0
  13. package/dist/abis/flap/portal-eip7702.d.ts +4 -0
  14. package/dist/abis/flap/portal-eip7702.js +39 -0
  15. package/dist/abis/flap/portal-events.d.ts +6 -0
  16. package/dist/abis/flap/portal-events.js +17 -0
  17. package/dist/abis/flap/portal-merkle.d.ts +4 -0
  18. package/dist/abis/flap/portal-merkle.js +25 -0
  19. package/dist/abis/flap/portal.d.ts +6 -0
  20. package/dist/abis/flap/portal.js +37 -0
  21. package/dist/abis/flap/vault.d.ts +171 -0
  22. package/dist/abis/flap/vault.js +91 -0
  23. package/dist/abis/index.d.ts +8 -0
  24. package/dist/abis/index.js +11 -0
  25. package/dist/bundle-core/__tests__/config-helpers.test.d.ts +1 -0
  26. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  27. package/dist/bundle-core/__tests__/facade-parity.test.d.ts +1 -0
  28. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  29. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
  30. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  31. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
  32. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  33. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  34. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  35. package/dist/bundle-core/config-helpers.d.ts +37 -0
  36. package/dist/bundle-core/config-helpers.js +58 -0
  37. package/dist/bundle-core/errors.d.ts +50 -0
  38. package/dist/bundle-core/errors.js +38 -0
  39. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  40. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  41. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  42. package/dist/bundle-core/four-meme/core-helpers.js +41 -0
  43. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  44. package/dist/bundle-core/four-meme/core.js +515 -0
  45. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  46. package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
  47. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  48. package/dist/bundle-core/four-meme/private.js +465 -0
  49. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  50. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  51. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  52. package/dist/bundle-core/four-meme/swap-buy-first.js +456 -0
  53. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  54. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  55. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  56. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  57. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +28 -0
  58. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  59. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  60. package/dist/bundle-core/four-meme/swap.js +505 -0
  61. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  62. package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
  63. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  64. package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
  65. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  66. package/dist/bundle-core/four-meme/types/index.js +1 -0
  67. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  68. package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
  69. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  70. package/dist/bundle-core/four-meme/types.js +1 -0
  71. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  72. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  73. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  74. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  75. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  76. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  77. package/dist/bundle-core/index.d.ts +8 -0
  78. package/dist/bundle-core/index.js +8 -0
  79. package/dist/bundle-core/internal.d.ts +16 -0
  80. package/dist/bundle-core/internal.js +160 -0
  81. package/dist/bundle-core/sign-context-helpers.d.ts +26 -0
  82. package/dist/bundle-core/sign-context-helpers.js +63 -0
  83. package/dist/bundle-core/submit.d.ts +293 -0
  84. package/dist/bundle-core/submit.js +731 -0
  85. package/dist/bundle-core/types/index.d.ts +8 -0
  86. package/dist/bundle-core/types/index.js +1 -0
  87. package/dist/bundle-core/types.d.ts +1 -0
  88. package/dist/bundle-core/types.js +1 -0
  89. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  90. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -113
  91. package/dist/chains/bsc/four/config.d.ts +5 -67
  92. package/dist/chains/bsc/four/config.js +2 -114
  93. package/dist/chains/bsc/four/core.d.ts +1 -4
  94. package/dist/chains/bsc/four/core.js +1 -592
  95. package/dist/chains/bsc/four/index.d.ts +6 -6
  96. package/dist/chains/bsc/four/index.js +6 -6
  97. package/dist/chains/bsc/four/internal.d.ts +2 -46
  98. package/dist/chains/bsc/four/internal.js +2 -239
  99. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  100. package/dist/chains/bsc/four/pancake-proxy.js +1 -687
  101. package/dist/chains/bsc/four/private.d.ts +1 -27
  102. package/dist/chains/bsc/four/private.js +1 -477
  103. package/dist/chains/bsc/four/submit.d.ts +2 -315
  104. package/dist/chains/bsc/four/submit.js +2 -752
  105. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  106. package/dist/chains/bsc/four/swap-buy-first.js +2 -507
  107. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  108. package/dist/chains/bsc/four/swap-internal.js +1 -18
  109. package/dist/chains/bsc/four/swap.d.ts +2 -144
  110. package/dist/chains/bsc/four/swap.js +2 -766
  111. package/dist/chains/bsc/four/types.d.ts +1 -476
  112. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  113. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  114. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  115. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  116. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  117. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  118. package/dist/chains/bsc/four/utils.d.ts +5 -18
  119. package/dist/chains/bsc/four/utils.js +5 -1552
  120. package/dist/chains/bsc/iro.d.ts +5 -0
  121. package/dist/chains/bsc/iro.js +4 -0
  122. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +155 -0
  123. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +80 -0
  124. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  125. package/dist/chains/bsc/pancake/bundle-buy-first.js +98 -213
  126. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  127. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
  128. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  129. package/dist/chains/bsc/pancake/bundle-swap.js +114 -726
  130. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  131. package/dist/chains/bsc/pancake/index.js +1 -3
  132. package/dist/chains/bsc/platforms/iro/factory.d.ts +2 -2
  133. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  134. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  135. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  136. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  137. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  138. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  139. package/dist/chains/eni/batch-router/transfer.js +55 -25
  140. package/dist/chains/eni/batch-router/utils.js +32 -6
  141. package/dist/chains/eni/bundler/sign.js +5 -6
  142. package/dist/chains/eni/bundler/submit.js +1 -4
  143. package/dist/chains/eni/constants.js +1 -1
  144. package/dist/chains/eni/flat-aliases.d.ts +10 -0
  145. package/dist/chains/eni/flat-aliases.js +8 -0
  146. package/dist/chains/eni/index.d.ts +2 -1
  147. package/dist/chains/eni/index.js +1 -0
  148. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  149. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  150. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  151. package/dist/chains/eni/platforms/daoaas/meta.js +9 -6
  152. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -44
  153. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  154. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  155. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  156. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  157. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -46
  158. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  159. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  160. package/dist/chains/eni/platforms/iro/factory.d.ts +2 -2
  161. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  162. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  163. package/dist/chains/eni/platforms/iro/index.js +4 -4
  164. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  165. package/dist/chains/eni/platforms/iro/token.js +107 -31
  166. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  167. package/dist/chains/eni/submit.d.ts +43 -0
  168. package/dist/chains/eni/submit.js +287 -0
  169. package/dist/chains/index.d.ts +13 -0
  170. package/dist/chains/index.js +13 -0
  171. package/dist/chains/xlayer/constants.d.ts +5 -0
  172. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  173. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -21
  174. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  175. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  176. package/dist/chains/xlayer/eip7702/bundle-create.js +104 -74
  177. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  178. package/dist/chains/xlayer/eip7702/bundle-sell.js +29 -111
  179. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  180. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -245
  181. package/dist/chains/xlayer/eip7702/constants.d.ts +11 -26
  182. package/dist/chains/xlayer/eip7702/constants.js +15 -68
  183. package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
  184. package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
  185. package/dist/chains/xlayer/eip7702/index.d.ts +28 -46
  186. package/dist/chains/xlayer/eip7702/index.js +28 -81
  187. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
  188. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
  189. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  190. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +63 -307
  191. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  192. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +58 -0
  193. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  194. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  195. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  196. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
  197. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  198. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  199. package/dist/chains/xlayer/eip7702/volume.js +89 -164
  200. package/dist/chains/xlayer/eoa/constants.d.ts +1 -1
  201. package/dist/chains/xlayer/eoa/constants.js +2 -16
  202. package/dist/chains/xlayer/eoa/dex-helpers.d.ts +1 -1
  203. package/dist/chains/xlayer/eoa/dex-helpers.js +7 -37
  204. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  205. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  206. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  207. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +66 -299
  208. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  209. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +18 -23
  210. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  211. package/dist/chains/xlayer/eoa/index.js +8 -23
  212. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  213. package/dist/chains/xlayer/eoa/router-manager.js +5 -4
  214. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  215. package/dist/chains/xlayer/eoa/types.js +1 -3
  216. package/dist/chains/xlayer/index.d.ts +3 -2
  217. package/dist/chains/xlayer/index.js +4 -7
  218. package/dist/contracts/helper3.d.ts +20 -5
  219. package/dist/contracts/helper3.js +56 -20
  220. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  221. package/dist/contracts/tm-bundle-helpers.js +73 -0
  222. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  223. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -113
  224. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -67
  225. package/dist/contracts/tm-bundle-merkle/config.js +2 -114
  226. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  227. package/dist/contracts/tm-bundle-merkle/core.js +1 -591
  228. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  229. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  230. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -46
  231. package/dist/contracts/tm-bundle-merkle/internal.js +2 -238
  232. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  233. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -686
  234. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  235. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  236. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  237. package/dist/contracts/tm-bundle-merkle/submit.js +3 -928
  238. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  239. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -506
  240. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  241. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  242. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  243. package/dist/contracts/tm-bundle-merkle/swap.js +2 -764
  244. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  245. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  246. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  247. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  248. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  249. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  250. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  251. package/dist/contracts/tm-bundle-merkle/utils.d.ts +6 -18
  252. package/dist/contracts/tm-bundle-merkle/utils.js +6 -1501
  253. package/dist/contracts/tm-bundle.d.ts +3 -51
  254. package/dist/contracts/tm-bundle.js +120 -187
  255. package/dist/contracts/tm.d.ts +10 -8
  256. package/dist/contracts/tm.js +39 -35
  257. package/dist/contracts/tm1.js +9 -4
  258. package/dist/contracts/tm2.js +10 -5
  259. package/dist/dex/direct-router-helpers.d.ts +269 -0
  260. package/dist/dex/direct-router-helpers.js +536 -0
  261. package/dist/dex/direct-router.d.ts +3 -125
  262. package/dist/dex/direct-router.js +244 -672
  263. package/dist/dex/types.d.ts +81 -0
  264. package/dist/dex/types.js +1 -0
  265. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  266. package/dist/exports/root-bundle-and-tooling.js +30 -0
  267. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  268. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  269. package/dist/exports/root-foundations.d.ts +35 -0
  270. package/dist/exports/root-foundations.js +70 -0
  271. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  272. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  273. package/dist/flap/index.d.ts +11 -0
  274. package/dist/flap/index.js +9 -0
  275. package/dist/flows/create.d.ts +2 -1
  276. package/dist/flows/create.js +6 -6
  277. package/dist/flows/index.d.ts +9 -0
  278. package/dist/flows/index.js +9 -0
  279. package/dist/index.d.ts +20 -88
  280. package/dist/index.js +20 -218
  281. package/dist/merkle/index.d.ts +12 -0
  282. package/dist/merkle/index.js +11 -0
  283. package/dist/shared/abis/common.d.ts +2 -83
  284. package/dist/shared/abis/common.js +2 -254
  285. package/dist/shared/abis/index.d.ts +5 -6
  286. package/dist/shared/abis/index.js +5 -7
  287. package/dist/shared/clients/blockrazor.d.ts +4 -8
  288. package/dist/shared/clients/blockrazor.js +43 -35
  289. package/dist/shared/clients/club48.d.ts +2 -2
  290. package/dist/shared/clients/club48.js +36 -30
  291. package/dist/shared/clients/emitservice.js +2 -0
  292. package/dist/shared/clients/four.d.ts +21 -6
  293. package/dist/shared/clients/four.js +29 -24
  294. package/dist/shared/clients/index.d.ts +8 -0
  295. package/dist/shared/clients/index.js +8 -0
  296. package/dist/shared/clients/merkle.d.ts +4 -3
  297. package/dist/shared/clients/merkle.js +30 -47
  298. package/dist/shared/constants/addresses.d.ts +27 -1
  299. package/dist/shared/constants/addresses.js +39 -2
  300. package/dist/shared/constants/chains.d.ts +1 -1
  301. package/dist/shared/constants/chains.js +1 -1
  302. package/dist/shared/constants/gas.d.ts +1 -1
  303. package/dist/shared/constants/gas.js +2 -6
  304. package/dist/shared/constants/index.d.ts +4 -1
  305. package/dist/shared/constants/index.js +2 -1
  306. package/dist/shared/constants/quote.d.ts +30 -0
  307. package/dist/shared/constants/quote.js +37 -0
  308. package/dist/shared/flap/abi.js +1 -1
  309. package/dist/shared/flap/constants.d.ts +1 -2
  310. package/dist/shared/flap/constants.js +3 -4
  311. package/dist/shared/flap/curve.js +3 -0
  312. package/dist/shared/flap/errors.d.ts +1 -4
  313. package/dist/shared/flap/errors.js +20 -1
  314. package/dist/shared/flap/index.d.ts +4 -5
  315. package/dist/shared/flap/index.js +4 -5
  316. package/dist/shared/flap/launch-v6.d.ts +0 -5
  317. package/dist/shared/flap/launch-v6.js +2 -16
  318. package/dist/shared/flap/meta.d.ts +22 -18
  319. package/dist/shared/flap/meta.js +32 -24
  320. package/dist/shared/flap/permit.js +10 -3
  321. package/dist/shared/flap/pinata.d.ts +22 -6
  322. package/dist/shared/flap/pinata.js +21 -26
  323. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  324. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  325. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  326. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  327. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  328. package/dist/shared/flap/portal-bundle-merkle/core.js +168 -175
  329. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +17 -4
  330. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +96 -117
  331. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +104 -122
  332. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  333. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  334. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  335. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  336. package/dist/shared/flap/portal-bundle-merkle/swap-batch.d.ts +8 -0
  337. package/dist/shared/flap/portal-bundle-merkle/swap-batch.js +227 -0
  338. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  339. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  340. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  341. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +69 -288
  342. package/dist/shared/flap/portal-bundle-merkle/swap-cross.d.ts +9 -0
  343. package/dist/shared/flap/portal-bundle-merkle/swap-cross.js +139 -0
  344. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  345. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  346. package/dist/shared/flap/portal-bundle-merkle/swap-planning.d.ts +70 -0
  347. package/dist/shared/flap/portal-bundle-merkle/swap-planning.js +182 -0
  348. package/dist/shared/flap/portal-bundle-merkle/swap-quick-batch.d.ts +16 -0
  349. package/dist/shared/flap/portal-bundle-merkle/swap-quick-batch.js +327 -0
  350. package/dist/shared/flap/portal-bundle-merkle/swap-single.d.ts +2 -0
  351. package/dist/shared/flap/portal-bundle-merkle/swap-single.js +184 -0
  352. package/dist/shared/flap/portal-bundle-merkle/swap-types.d.ts +101 -0
  353. package/dist/shared/flap/portal-bundle-merkle/swap-types.js +1 -0
  354. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +6 -199
  355. package/dist/shared/flap/portal-bundle-merkle/swap.js +5 -1357
  356. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +88 -12
  357. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  358. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  359. package/dist/shared/flap/portal-bundle.js +83 -78
  360. package/dist/shared/flap/portal-create-token.d.ts +39 -21
  361. package/dist/shared/flap/portal-create-token.js +121 -124
  362. package/dist/shared/flap/portal.d.ts +1 -2
  363. package/dist/shared/flap/portal.js +36 -28
  364. package/dist/shared/flap/vanity.d.ts +6 -6
  365. package/dist/shared/flap/vanity.js +15 -21
  366. package/dist/shared/flap/vault.d.ts +25 -93
  367. package/dist/shared/flap/vault.js +77 -127
  368. package/dist/shared/foundation/amount/split-by-weight.d.ts +5 -0
  369. package/dist/shared/foundation/amount/split-by-weight.js +35 -0
  370. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  371. package/dist/shared/foundation/dex/v3-path.js +35 -0
  372. package/dist/shared/foundation/erc20/decimals.d.ts +7 -0
  373. package/dist/shared/foundation/erc20/decimals.js +24 -0
  374. package/dist/shared/foundation/gas/bundle-gas.d.ts +49 -0
  375. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  376. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  377. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  378. package/dist/shared/foundation/index.d.ts +15 -0
  379. package/dist/shared/foundation/index.js +14 -0
  380. package/dist/shared/foundation/nonce/nonce-manager.d.ts +19 -0
  381. package/dist/shared/foundation/nonce/nonce-manager.js +217 -0
  382. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  383. package/dist/shared/foundation/normalize-unknown.js +29 -0
  384. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  385. package/dist/shared/foundation/sdk-logger.js +12 -0
  386. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  387. package/dist/shared/foundation/tx/build-request.js +25 -0
  388. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  389. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  390. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  391. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  392. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  393. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  394. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  395. package/dist/shared/foundation/types/erc20.js +1 -0
  396. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  397. package/dist/shared/foundation/types/holders-maker.js +1 -0
  398. package/dist/shared/foundation/types/index.d.ts +7 -0
  399. package/dist/shared/foundation/types/index.js +1 -0
  400. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  401. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  402. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  403. package/dist/shared/foundation/types/multicall.js +1 -0
  404. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  405. package/dist/shared/foundation/types/private-sale.js +1 -0
  406. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  407. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  408. package/dist/shared/foundation/wallet/generate.d.ts +5 -0
  409. package/dist/shared/foundation/wallet/generate.js +8 -0
  410. package/dist/shared/four/tax-token.d.ts +1 -1
  411. package/dist/shared/four/tax-token.js +31 -10
  412. package/dist/shared/index.d.ts +6 -0
  413. package/dist/shared/index.js +4 -0
  414. package/dist/types/errors.d.ts +27 -0
  415. package/dist/types/errors.js +34 -0
  416. package/dist/utils/airdrop-sweep.d.ts +4 -76
  417. package/dist/utils/airdrop-sweep.js +42 -55
  418. package/dist/utils/bundle-helpers.d.ts +9 -243
  419. package/dist/utils/bundle-helpers.js +10 -584
  420. package/dist/utils/constants.d.ts +5 -61
  421. package/dist/utils/constants.js +5 -80
  422. package/dist/utils/contract-factory.d.ts +2 -4
  423. package/dist/utils/contract-factory.js +25 -18
  424. package/dist/utils/erc20.d.ts +7 -89
  425. package/dist/utils/erc20.js +98 -129
  426. package/dist/utils/errors.d.ts +12 -1
  427. package/dist/utils/errors.js +60 -1
  428. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  429. package/dist/utils/holders-maker/addresses.js +15 -0
  430. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  431. package/dist/utils/holders-maker/buy-tx.js +278 -0
  432. package/dist/utils/holders-maker/constants.d.ts +6 -0
  433. package/dist/utils/holders-maker/constants.js +7 -0
  434. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  435. package/dist/utils/holders-maker/disperse.js +90 -0
  436. package/dist/utils/holders-maker/routing.d.ts +4 -0
  437. package/dist/utils/holders-maker/routing.js +45 -0
  438. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  439. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  440. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  441. package/dist/utils/holders-maker-helpers.js +9 -0
  442. package/dist/utils/holders-maker.d.ts +2 -138
  443. package/dist/utils/holders-maker.js +50 -671
  444. package/dist/utils/hop-chains.d.ts +35 -0
  445. package/dist/utils/hop-chains.js +215 -0
  446. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  447. package/dist/utils/lp-inspect-helpers.js +109 -0
  448. package/dist/utils/lp-inspect.d.ts +2 -112
  449. package/dist/utils/lp-inspect.js +78 -293
  450. package/dist/utils/mpcExclusive.d.ts +2 -5
  451. package/dist/utils/mpcExclusive.js +4 -3
  452. package/dist/utils/private-sale.d.ts +2 -58
  453. package/dist/utils/private-sale.js +4 -15
  454. package/dist/utils/provider-factory.d.ts +4 -0
  455. package/dist/utils/provider-factory.js +10 -0
  456. package/dist/utils/quote-helpers.d.ts +4 -45
  457. package/dist/utils/quote-helpers.js +17 -74
  458. package/dist/utils/stealth-transfer.d.ts +2 -28
  459. package/dist/utils/stealth-transfer.js +39 -19
  460. package/dist/utils/swap-helpers.d.ts +2 -15
  461. package/dist/utils/swap-helpers.js +6 -11
  462. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  463. package/dist/utils/types/airdrop-sweep.js +1 -0
  464. package/dist/utils/types/contract-factory.d.ts +1 -0
  465. package/dist/utils/types/contract-factory.js +1 -0
  466. package/dist/utils/types/erc20.d.ts +1 -0
  467. package/dist/utils/types/erc20.js +1 -0
  468. package/dist/utils/types/errors.d.ts +1 -0
  469. package/dist/utils/types/errors.js +1 -0
  470. package/dist/utils/types/holders-maker.d.ts +1 -0
  471. package/dist/utils/types/holders-maker.js +1 -0
  472. package/dist/utils/types/hop-chains.d.ts +8 -0
  473. package/dist/utils/types/hop-chains.js +1 -0
  474. package/dist/utils/types/index.d.ts +13 -0
  475. package/dist/utils/types/index.js +1 -0
  476. package/dist/utils/types/lp-inspect.d.ts +1 -0
  477. package/dist/utils/types/lp-inspect.js +1 -0
  478. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  479. package/dist/utils/types/mpc-exclusive.js +1 -0
  480. package/dist/utils/types/private-sale.d.ts +1 -0
  481. package/dist/utils/types/private-sale.js +1 -0
  482. package/dist/utils/types/quote-helpers.d.ts +1 -0
  483. package/dist/utils/types/quote-helpers.js +1 -0
  484. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  485. package/dist/utils/types/stealth-transfer.js +1 -0
  486. package/dist/utils/types/wallet.d.ts +25 -0
  487. package/dist/utils/types/wallet.js +1 -0
  488. package/dist/utils/wallet.d.ts +4 -25
  489. package/dist/utils/wallet.js +27 -22
  490. package/dist/vanity/index.d.ts +5 -0
  491. package/dist/vanity/index.js +5 -0
  492. package/package.json +100 -2
@@ -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): any;
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,37 @@
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 type BundleSubmitOptions = {
19
+ blockOffset: number;
20
+ minBlockOffset: number;
21
+ autoRetry: boolean;
22
+ maxRetries: number;
23
+ };
24
+ export declare function getBundleOptions(config: BundleMerkleConfigInput, blockOffset?: number): BundleSubmitOptions;
25
+ export declare function getGasPriceConfig(config: BundleGasConfigInput): GasPriceConfig;
26
+ export declare function shouldExtractProfit(_config?: BundleMerkleConfigInput): boolean;
27
+ export declare function getProfitRateBps(_config?: BundleMerkleConfigInput): number;
28
+ export declare function getProfitRecipient(_config?: BundleMerkleConfigInput): string;
29
+ export declare function calculateProfit(amount: bigint, _config?: BundleMerkleConfigInput): {
30
+ profit: bigint;
31
+ remaining: bigint;
32
+ };
33
+ export declare function calculateBatchProfit(amounts: bigint[], _config?: BundleMerkleConfigInput): {
34
+ totalProfit: bigint;
35
+ remainingAmounts: bigint[];
36
+ };
37
+ export declare function getBribeAmount(config?: BundleMerkleConfigInput): bigint;
@@ -0,0 +1,58 @@
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
+ const value = config.gasPriceMultiplierPercent;
8
+ return typeof value === 'number' && Number.isFinite(value) ? value : 50;
9
+ }
10
+ export function getBundleOptions(config, blockOffset) {
11
+ return {
12
+ blockOffset: blockOffset ?? config.bundleBlockOffset ?? 3,
13
+ minBlockOffset: config.minBlockOffset ?? 3,
14
+ autoRetry: config.autoRetryBundle ?? false,
15
+ maxRetries: config.maxBundleRetries ?? 2,
16
+ };
17
+ }
18
+ export function getGasPriceConfig(config) {
19
+ const gasPriceConfig = {};
20
+ if (config.minGasPriceGwei !== undefined) {
21
+ gasPriceConfig.baseGasPrice = ethers.parseUnits(String(config.minGasPriceGwei), 'gwei');
22
+ gasPriceConfig.multiplierPercent = 0;
23
+ }
24
+ else {
25
+ gasPriceConfig.multiplierPercent = getGasPriceMultiplier(config);
26
+ }
27
+ return gasPriceConfig;
28
+ }
29
+ export function shouldExtractProfit(_config) {
30
+ return true;
31
+ }
32
+ export function getProfitRateBps(_config) {
33
+ return getSharedProfitRateBps('normal');
34
+ }
35
+ export function getProfitRecipient(_config) {
36
+ return pickRandomProfitRecipient();
37
+ }
38
+ export function calculateProfit(amount, _config) {
39
+ const profit = (amount * BigInt(getProfitRateBps())) / 10000n;
40
+ return { profit, remaining: amount - profit };
41
+ }
42
+ export function calculateBatchProfit(amounts, _config) {
43
+ let totalProfit = 0n;
44
+ const remainingAmounts = [];
45
+ for (const amount of amounts) {
46
+ const { profit, remaining } = calculateProfit(amount);
47
+ totalProfit += profit;
48
+ remainingAmounts.push(remaining);
49
+ }
50
+ return { totalProfit, remainingAmounts };
51
+ }
52
+ export function getBribeAmount(config) {
53
+ const bribeBnB = config && typeof config.bribeAmount === 'number' ? config.bribeAmount : undefined;
54
+ if (bribeBnB === undefined || !Number.isFinite(bribeBnB) || bribeBnB <= 0) {
55
+ return 0n;
56
+ }
57
+ return ethers.parseEther(String(bribeBnB));
58
+ }
@@ -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,38 @@
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 langSource = (typeof process !== 'undefined' && process.env && (process.env.LANG || process.env.LANGUAGE)) ||
27
+ (typeof navigator !== 'undefined' && navigator.language) ||
28
+ 'en';
29
+ const lang = langSource.toLowerCase().includes('zh') ? 'zh' : 'en';
30
+ const message = BUNDLE_ERRORS[key][lang];
31
+ if (typeof message === 'function') {
32
+ const [a, b] = args;
33
+ return message(a, b);
34
+ }
35
+ return message;
36
+ }
37
+ /** @deprecated 使用 getBundleErrorMessage */
38
+ 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, CHAINS } 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 ?? CHAINS.BSC.chainId;
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,41 @@
1
+ import { Wallet } from 'ethers';
2
+ import { CHAINS } from '../../shared/constants/index.js';
3
+ import { buildLoginMessage } from '../../shared/clients/four.js';
4
+ import { createSignProvider } from '../sign-context-helpers.js';
5
+ import { getBundleErrorMessage } from '../errors.js';
6
+ export const CORE_CHAIN_ID = CHAINS.BSC.chainId;
7
+ export function createChainContext(rpcUrl) {
8
+ const provider = createSignProvider(rpcUrl, CORE_CHAIN_ID, 'BSC');
9
+ return { provider, chainId: CORE_CHAIN_ID };
10
+ }
11
+ export function createWallets(privateKeys, provider) {
12
+ return privateKeys.map((key) => new Wallet(key, provider));
13
+ }
14
+ export async function loginFourClient(wallet, fourClient) {
15
+ const nonce = await fourClient.generateNonce({
16
+ accountAddress: wallet.address,
17
+ verifyType: 'LOGIN',
18
+ networkCode: 'BSC',
19
+ });
20
+ const loginSignature = await wallet.signMessage(buildLoginMessage(nonce));
21
+ return fourClient.loginDex({
22
+ region: 'WEB',
23
+ langType: 'EN',
24
+ verifyInfo: {
25
+ address: wallet.address,
26
+ networkCode: 'BSC',
27
+ signature: loginSignature,
28
+ verifyType: 'LOGIN',
29
+ },
30
+ walletName: 'MetaMask',
31
+ });
32
+ }
33
+ export async function resolveTokenImage(fourClient, tokenInfo, accessToken) {
34
+ if (tokenInfo.imageUrl) {
35
+ return tokenInfo.imageUrl;
36
+ }
37
+ if (tokenInfo.imageFile) {
38
+ return fourClient.uploadImage(accessToken, tokenInfo.imageFile);
39
+ }
40
+ throw new Error(getBundleErrorMessage('IMAGE_REQUIRED'));
41
+ }
@@ -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>;