four-flap-meme-sdk 1.9.49 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (567) 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.js +34 -0
  5. package/dist/abis/common.js +74 -68
  6. package/dist/abis/flap/vault.js +9 -7
  7. package/dist/abis/index.d.ts +3 -4
  8. package/dist/abis/index.js +3 -4
  9. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  10. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  11. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  12. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  13. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  14. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  15. package/dist/bundle-core/config-helpers.d.ts +36 -0
  16. package/dist/bundle-core/config-helpers.js +57 -0
  17. package/dist/bundle-core/errors.d.ts +50 -0
  18. package/dist/bundle-core/errors.js +34 -0
  19. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  20. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  21. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  22. package/dist/bundle-core/four-meme/core-helpers.js +40 -0
  23. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  24. package/dist/bundle-core/four-meme/core.js +515 -0
  25. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  26. package/dist/{shared 2/flap/portal-bundle-merkle/pancake-proxy.js → bundle-core/four-meme/pancake-proxy.js} +277 -299
  27. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  28. package/dist/bundle-core/four-meme/private.js +465 -0
  29. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  30. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  31. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  32. package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
  33. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  34. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  35. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  36. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  37. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
  38. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  39. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  40. package/dist/{chains/bsc/four/swap/index.js → bundle-core/four-meme/swap.js} +84 -408
  41. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  42. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  43. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  44. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  45. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  46. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  47. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  48. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  49. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  50. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  51. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  52. package/dist/bundle-core/index.d.ts +8 -0
  53. package/dist/bundle-core/index.js +8 -0
  54. package/dist/bundle-core/internal.d.ts +21 -0
  55. package/dist/bundle-core/internal.js +182 -0
  56. package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
  57. package/dist/bundle-core/sign-context-helpers.js +67 -0
  58. package/dist/bundle-core/submit.d.ts +293 -0
  59. package/dist/bundle-core/submit.js +727 -0
  60. package/dist/bundle-core/types/index.d.ts +8 -0
  61. package/dist/bundle-core/types.d.ts +1 -0
  62. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  63. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -116
  64. package/dist/chains/bsc/four/config.d.ts +5 -70
  65. package/dist/chains/bsc/four/config.js +2 -115
  66. package/dist/chains/bsc/four/core.d.ts +1 -4
  67. package/dist/chains/bsc/four/core.js +1 -589
  68. package/dist/chains/bsc/four/index.d.ts +6 -6
  69. package/dist/chains/bsc/four/index.js +6 -6
  70. package/dist/chains/bsc/four/internal.d.ts +2 -50
  71. package/dist/chains/bsc/four/internal.js +2 -237
  72. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  73. package/dist/chains/bsc/four/pancake-proxy.js +1 -688
  74. package/dist/chains/bsc/four/private.d.ts +1 -27
  75. package/dist/chains/bsc/four/private.js +1 -477
  76. package/dist/chains/bsc/four/submit.d.ts +2 -315
  77. package/dist/chains/bsc/four/submit.js +2 -746
  78. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  79. package/dist/chains/bsc/four/swap-buy-first.js +2 -506
  80. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  81. package/dist/chains/bsc/four/swap-internal.js +1 -18
  82. package/dist/chains/bsc/four/swap.d.ts +2 -144
  83. package/dist/chains/bsc/four/swap.js +2 -760
  84. package/dist/chains/bsc/four/types.d.ts +1 -476
  85. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  86. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  87. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  88. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  89. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  90. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  91. package/dist/chains/bsc/four/utils.d.ts +5 -18
  92. package/dist/chains/bsc/four/utils.js +5 -1534
  93. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
  94. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
  95. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  96. package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -207
  97. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  98. package/dist/chains/bsc/pancake/{bundle-swap/helpers.js → bundle-swap-helpers.js} +63 -70
  99. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  100. package/dist/chains/bsc/pancake/bundle-swap.js +111 -686
  101. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  102. package/dist/chains/bsc/pancake/index.js +1 -3
  103. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  104. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  105. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  106. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  107. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  108. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  109. package/dist/chains/eni/batch-router/transfer.js +54 -23
  110. package/dist/chains/eni/batch-router/utils.js +32 -6
  111. package/dist/chains/eni/bundler/sign.js +4 -4
  112. package/dist/chains/eni/bundler/submit.js +1 -4
  113. package/dist/chains/eni/constants.js +1 -1
  114. package/dist/chains/eni/index.d.ts +1 -1
  115. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  116. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  117. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  118. package/dist/chains/eni/platforms/daoaas/meta.js +8 -4
  119. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
  120. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  121. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  122. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  123. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  124. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -47
  125. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  126. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  127. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  128. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  129. package/dist/chains/eni/platforms/iro/index.js +4 -4
  130. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  131. package/dist/chains/eni/platforms/iro/token.js +107 -31
  132. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  133. package/dist/chains/eni/submit.js +5 -13
  134. package/dist/chains/index.d.ts +13 -0
  135. package/dist/chains/index.js +13 -0
  136. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  137. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
  138. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  139. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  140. package/dist/chains/xlayer/eip7702/bundle-create.js +93 -56
  141. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  142. package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
  143. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  144. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
  145. package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
  146. package/dist/chains/xlayer/eip7702/constants.js +3 -21
  147. package/dist/chains/xlayer/eip7702/index.d.ts +29 -46
  148. package/dist/chains/xlayer/eip7702/index.js +27 -81
  149. package/dist/chains/xlayer/eip7702/{multi-hop-transfer/types.d.ts → multi-hop-transfer-helpers.d.ts} +17 -23
  150. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  151. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +58 -291
  152. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  153. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
  154. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  155. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  156. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  157. package/dist/chains/xlayer/eip7702/{volume/types.d.ts → volume-helpers.d.ts} +41 -17
  158. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  159. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  160. package/dist/chains/xlayer/eip7702/volume.js +83 -158
  161. package/dist/chains/xlayer/eoa/constants.js +1 -1
  162. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  163. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  164. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  165. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  166. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +64 -276
  167. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  168. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
  169. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  170. package/dist/chains/xlayer/eoa/index.js +8 -23
  171. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  172. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  173. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  174. package/dist/chains/xlayer/eoa/types.js +1 -3
  175. package/dist/contracts/helper3.d.ts +20 -17
  176. package/dist/contracts/helper3.js +56 -20
  177. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  178. package/dist/contracts/tm-bundle-helpers.js +72 -0
  179. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  180. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -117
  181. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
  182. package/dist/contracts/tm-bundle-merkle/config.js +2 -115
  183. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  184. package/dist/contracts/tm-bundle-merkle/core.js +1 -588
  185. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  186. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  187. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -50
  188. package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
  189. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  190. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
  191. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  192. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  193. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  194. package/dist/contracts/tm-bundle-merkle/submit.js +3 -919
  195. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  196. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
  197. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  198. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  199. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  200. package/dist/contracts/tm-bundle-merkle/swap.js +2 -757
  201. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  202. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  203. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  204. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  205. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  206. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  207. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  208. package/dist/contracts/tm-bundle-merkle/utils.d.ts +5 -6
  209. package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
  210. package/dist/contracts/tm-bundle.d.ts +3 -51
  211. package/dist/contracts/tm-bundle.js +102 -142
  212. package/dist/contracts/tm.d.ts +3 -2
  213. package/dist/contracts/tm.js +36 -32
  214. package/dist/contracts/tm1.js +9 -4
  215. package/dist/contracts/tm2.js +9 -4
  216. package/dist/dex/direct-router-helpers.d.ts +264 -0
  217. package/dist/dex/direct-router-helpers.js +539 -0
  218. package/dist/dex/direct-router.d.ts +3 -125
  219. package/dist/dex/direct-router.js +237 -652
  220. package/dist/dex/{direct-router/types.d.ts → types.d.ts} +1 -1
  221. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  222. package/dist/exports/root-bundle-and-tooling.js +30 -0
  223. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  224. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  225. package/dist/exports/root-foundations.d.ts +35 -0
  226. package/dist/exports/root-foundations.js +70 -0
  227. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  228. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  229. package/dist/flap/index.d.ts +10 -0
  230. package/dist/flap/index.js +8 -0
  231. package/dist/flows/create.d.ts +2 -2
  232. package/dist/flows/create.js +6 -6
  233. package/dist/flows/index.d.ts +1 -0
  234. package/dist/flows/index.js +1 -0
  235. package/dist/index.d.ts +20 -91
  236. package/dist/index.js +20 -215
  237. package/dist/shared/abis/common.d.ts +2 -83
  238. package/dist/shared/abis/common.js +2 -252
  239. package/dist/shared/abis/index.d.ts +5 -6
  240. package/dist/shared/abis/index.js +5 -7
  241. package/dist/shared/clients/blockrazor.js +41 -24
  242. package/dist/shared/clients/club48.js +30 -26
  243. package/dist/shared/clients/emitservice.js +2 -0
  244. package/dist/shared/clients/four.js +23 -18
  245. package/dist/shared/clients/index.d.ts +8 -0
  246. package/dist/shared/clients/index.js +8 -0
  247. package/dist/shared/clients/merkle.js +26 -30
  248. package/dist/shared/constants/addresses.d.ts +1 -1
  249. package/dist/shared/constants/addresses.js +11 -2
  250. package/dist/shared/constants/chains.d.ts +1 -1
  251. package/dist/shared/constants/chains.js +1 -1
  252. package/dist/shared/constants/gas.d.ts +1 -1
  253. package/dist/shared/constants/gas.js +2 -6
  254. package/dist/shared/constants/index.d.ts +3 -0
  255. package/dist/shared/constants/index.js +1 -0
  256. package/dist/shared/constants/quote.d.ts +30 -0
  257. package/dist/shared/constants/quote.js +37 -0
  258. package/dist/shared/flap/abi.js +1 -1
  259. package/dist/shared/flap/constants.d.ts +1 -1
  260. package/dist/shared/flap/constants.js +2 -2
  261. package/dist/shared/flap/curve.js +3 -0
  262. package/dist/shared/flap/errors.d.ts +1 -4
  263. package/dist/shared/flap/errors.js +21 -3
  264. package/dist/shared/flap/index.d.ts +2 -2
  265. package/dist/shared/flap/index.js +2 -2
  266. package/dist/shared/flap/meta.d.ts +16 -18
  267. package/dist/shared/flap/meta.js +14 -26
  268. package/dist/shared/flap/permit.js +6 -5
  269. package/dist/shared/flap/pinata.d.ts +9 -2
  270. package/dist/shared/flap/pinata.js +20 -18
  271. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  272. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  273. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  274. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  275. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  276. package/dist/shared/flap/portal-bundle-merkle/core.js +66 -156
  277. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
  278. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
  279. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  280. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  281. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  282. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  283. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  284. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  285. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  286. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
  287. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  288. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  289. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
  290. package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
  291. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +73 -3
  292. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  293. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  294. package/dist/shared/flap/portal-bundle.js +54 -42
  295. package/dist/shared/flap/portal.js +32 -10
  296. package/dist/shared/flap/vanity.js +4 -7
  297. package/dist/shared/flap/vault.d.ts +1 -1
  298. package/dist/shared/flap/vault.js +54 -48
  299. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  300. package/dist/shared/foundation/dex/v3-path.js +35 -0
  301. package/dist/shared/foundation/gas/bundle-gas.d.ts +39 -0
  302. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  303. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  304. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  305. package/dist/shared/foundation/index.d.ts +13 -0
  306. package/dist/shared/foundation/index.js +12 -0
  307. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  308. package/dist/shared/foundation/nonce/nonce-manager.js +180 -0
  309. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  310. package/dist/shared/foundation/normalize-unknown.js +29 -0
  311. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  312. package/dist/shared/foundation/sdk-logger.js +12 -0
  313. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  314. package/dist/shared/foundation/tx/build-request.js +25 -0
  315. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  316. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  317. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  318. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  319. package/dist/{utils/erc20/types.d.ts → shared/foundation/types/erc20.d.ts} +7 -19
  320. package/dist/{utils/holders-maker/types.d.ts → shared/foundation/types/holders-maker.d.ts} +4 -12
  321. package/dist/shared/foundation/types/index.d.ts +7 -0
  322. package/dist/{utils/lp-inspect/types.d.ts → shared/foundation/types/lp-inspect.d.ts} +4 -2
  323. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  324. package/dist/shared/foundation/types/multicall.js +1 -0
  325. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  326. package/dist/shared/foundation/types/private-sale.js +1 -0
  327. package/dist/{utils/quote-helpers/types.d.ts → shared/foundation/types/quote-helpers.d.ts} +1 -0
  328. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  329. package/dist/shared/four/tax-token.d.ts +1 -1
  330. package/dist/shared/four/tax-token.js +27 -7
  331. package/dist/shared/index.d.ts +6 -0
  332. package/dist/shared/index.js +4 -0
  333. package/dist/utils/airdrop-sweep.d.ts +4 -76
  334. package/dist/utils/airdrop-sweep.js +38 -52
  335. package/dist/utils/bundle-helpers.d.ts +9 -243
  336. package/dist/utils/bundle-helpers.js +10 -584
  337. package/dist/utils/constants.d.ts +5 -61
  338. package/dist/utils/constants.js +5 -80
  339. package/dist/utils/contract-factory.d.ts +2 -4
  340. package/dist/utils/contract-factory.js +25 -18
  341. package/dist/utils/erc20.d.ts +8 -90
  342. package/dist/utils/erc20.js +94 -153
  343. package/dist/utils/errors.d.ts +10 -22
  344. package/dist/utils/errors.js +61 -79
  345. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  346. package/dist/utils/holders-maker/addresses.js +15 -0
  347. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  348. package/dist/utils/holders-maker/buy-tx.js +278 -0
  349. package/dist/utils/holders-maker/constants.d.ts +6 -0
  350. package/dist/utils/holders-maker/constants.js +7 -0
  351. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  352. package/dist/utils/holders-maker/disperse.js +90 -0
  353. package/dist/utils/holders-maker/routing.d.ts +4 -0
  354. package/dist/utils/holders-maker/routing.js +45 -0
  355. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  356. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  357. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  358. package/dist/utils/holders-maker-helpers.js +9 -0
  359. package/dist/utils/holders-maker.d.ts +2 -138
  360. package/dist/utils/holders-maker.js +23 -651
  361. package/dist/utils/hop-chains.d.ts +35 -0
  362. package/dist/utils/hop-chains.js +215 -0
  363. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  364. package/dist/utils/lp-inspect-helpers.js +109 -0
  365. package/dist/utils/lp-inspect.d.ts +2 -112
  366. package/dist/utils/lp-inspect.js +63 -195
  367. package/dist/utils/mpcExclusive.d.ts +2 -5
  368. package/dist/utils/mpcExclusive.js +4 -3
  369. package/dist/utils/private-sale.d.ts +2 -58
  370. package/dist/utils/private-sale.js +2 -7
  371. package/dist/utils/provider-factory.d.ts +4 -0
  372. package/dist/utils/provider-factory.js +10 -0
  373. package/dist/utils/quote-helpers.d.ts +4 -45
  374. package/dist/utils/quote-helpers.js +15 -65
  375. package/dist/utils/stealth-transfer.d.ts +2 -28
  376. package/dist/utils/stealth-transfer.js +30 -14
  377. package/dist/utils/swap-helpers.d.ts +0 -3
  378. package/dist/utils/swap-helpers.js +6 -9
  379. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  380. package/dist/utils/types/airdrop-sweep.js +1 -0
  381. package/dist/utils/types/contract-factory.d.ts +1 -0
  382. package/dist/utils/types/contract-factory.js +1 -0
  383. package/dist/utils/types/erc20.d.ts +1 -0
  384. package/dist/utils/types/erc20.js +1 -0
  385. package/dist/utils/types/errors.d.ts +1 -0
  386. package/dist/utils/types/errors.js +1 -0
  387. package/dist/utils/types/holders-maker.d.ts +1 -0
  388. package/dist/utils/types/holders-maker.js +1 -0
  389. package/dist/utils/types/hop-chains.d.ts +8 -0
  390. package/dist/utils/types/hop-chains.js +1 -0
  391. package/dist/utils/types/index.d.ts +13 -0
  392. package/dist/utils/types/index.js +1 -0
  393. package/dist/utils/types/lp-inspect.d.ts +1 -0
  394. package/dist/utils/types/lp-inspect.js +1 -0
  395. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  396. package/dist/utils/types/mpc-exclusive.js +1 -0
  397. package/dist/utils/types/private-sale.d.ts +1 -0
  398. package/dist/utils/types/private-sale.js +1 -0
  399. package/dist/utils/types/quote-helpers.d.ts +1 -0
  400. package/dist/utils/types/quote-helpers.js +1 -0
  401. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  402. package/dist/utils/types/stealth-transfer.js +1 -0
  403. package/dist/utils/types/wallet.d.ts +25 -0
  404. package/dist/utils/types/wallet.js +1 -0
  405. package/dist/utils/wallet.d.ts +2 -25
  406. package/dist/utils/wallet.js +9 -10
  407. package/package.json +120 -2
  408. package/src/abis/contracts/TaxToken.json +969 -0
  409. package/src/abis/contracts/TokenManager.json +836 -0
  410. package/src/abis/contracts/TokenManager2.json +136 -0
  411. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  412. package/dist/chains/bsc/four/submit/blockrazor.d.ts +0 -18
  413. package/dist/chains/bsc/four/submit/blockrazor.js +0 -86
  414. package/dist/chains/bsc/four/submit/direct.d.ts +0 -66
  415. package/dist/chains/bsc/four/submit/direct.js +0 -452
  416. package/dist/chains/bsc/four/submit/helpers.d.ts +0 -18
  417. package/dist/chains/bsc/four/submit/helpers.js +0 -57
  418. package/dist/chains/bsc/four/submit/index.d.ts +0 -12
  419. package/dist/chains/bsc/four/submit/index.js +0 -11
  420. package/dist/chains/bsc/four/submit/merkle.d.ts +0 -18
  421. package/dist/chains/bsc/four/submit/merkle.js +0 -74
  422. package/dist/chains/bsc/four/submit/types.d.ts +0 -143
  423. package/dist/chains/bsc/four/swap/index.d.ts +0 -32
  424. package/dist/chains/bsc/four/swap/types.d.ts +0 -70
  425. package/dist/chains/bsc/four/utils/index.d.ts +0 -20
  426. package/dist/chains/bsc/four/utils/index.js +0 -1558
  427. package/dist/chains/bsc/pancake/bundle-buy-first/index.d.ts +0 -8
  428. package/dist/chains/bsc/pancake/bundle-buy-first/index.js +0 -907
  429. package/dist/chains/bsc/pancake/bundle-buy-first/types.d.ts +0 -73
  430. package/dist/chains/bsc/pancake/bundle-swap/helpers.d.ts +0 -102
  431. package/dist/chains/bsc/pancake/bundle-swap/index.d.ts +0 -50
  432. package/dist/chains/bsc/pancake/bundle-swap/index.js +0 -1066
  433. package/dist/chains/bsc/pancake/bundle-swap/types.d.ts +0 -202
  434. package/dist/chains/bsc/pancake/bundle-swap/types.js +0 -3
  435. package/dist/chains/xlayer/eip7702/bundle-swap/index.d.ts +0 -72
  436. package/dist/chains/xlayer/eip7702/bundle-swap/index.js +0 -921
  437. package/dist/chains/xlayer/eip7702/bundle-swap/types.d.ts +0 -65
  438. package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.d.ts +0 -128
  439. package/dist/chains/xlayer/eip7702/multi-hop-transfer/index.js +0 -857
  440. package/dist/chains/xlayer/eip7702/volume/index.d.ts +0 -96
  441. package/dist/chains/xlayer/eip7702/volume/index.js +0 -793
  442. package/dist/dex/direct-router/index.d.ts +0 -70
  443. package/dist/dex/direct-router/index.js +0 -1410
  444. package/dist/shared/abis/TaxToken.json +0 -969
  445. package/dist/shared/abis/TokenManager.json +0 -836
  446. package/dist/shared/abis/TokenManager2.json +0 -136
  447. package/dist/shared/abis/TokenManagerHelper3.json +0 -993
  448. package/dist/shared/flap/__tests__/curve.test.js +0 -85
  449. package/dist/shared/flap/portal/index.d.ts +0 -12
  450. package/dist/shared/flap/portal/index.js +0 -11
  451. package/dist/shared/flap/portal/portal.d.ts +0 -47
  452. package/dist/shared/flap/portal/portal.js +0 -218
  453. package/dist/shared/flap/portal/types.d.ts +0 -227
  454. package/dist/shared/flap/portal/types.js +0 -80
  455. package/dist/shared/flap/portal/writer.d.ts +0 -121
  456. package/dist/shared/flap/portal/writer.js +0 -265
  457. package/dist/shared/flap/portal-bundle-merkle/core/index.d.ts +0 -18
  458. package/dist/shared/flap/portal-bundle-merkle/core/index.js +0 -938
  459. package/dist/shared/flap/portal-bundle-merkle/swap/index.d.ts +0 -42
  460. package/dist/shared/flap/portal-bundle-merkle/swap/index.js +0 -1448
  461. package/dist/shared/flap/portal-bundle-merkle/swap/types.d.ts +0 -84
  462. package/dist/shared/flap/portal-bundle-merkle/utils/index.d.ts +0 -17
  463. package/dist/shared/flap/portal-bundle-merkle/utils/index.js +0 -1024
  464. package/dist/shared/flap/portal-bundle-merkle/utils/types.d.ts +0 -16
  465. package/dist/shared 2/abis/TaxToken.json +0 -105
  466. package/dist/shared 2/abis/TokenManager.json +0 -836
  467. package/dist/shared 2/abis/TokenManager2.json +0 -60
  468. package/dist/shared 2/abis/TokenManagerHelper3.json +0 -993
  469. package/dist/shared 2/abis/common.d.ts +0 -85
  470. package/dist/shared 2/abis/common.js +0 -254
  471. package/dist/shared 2/abis/index.d.ts +0 -8
  472. package/dist/shared 2/abis/index.js +0 -8
  473. package/dist/shared 2/clients/blockrazor.d.ts +0 -314
  474. package/dist/shared 2/clients/blockrazor.js +0 -596
  475. package/dist/shared 2/clients/club48.d.ts +0 -154
  476. package/dist/shared 2/clients/club48.js +0 -331
  477. package/dist/shared 2/clients/emitservice.d.ts +0 -47
  478. package/dist/shared 2/clients/emitservice.js +0 -44
  479. package/dist/shared 2/clients/four.d.ts +0 -132
  480. package/dist/shared 2/clients/four.js +0 -281
  481. package/dist/shared 2/clients/merkle.d.ts +0 -210
  482. package/dist/shared 2/clients/merkle.js +0 -400
  483. package/dist/shared 2/flap/__tests__/curve.test.js +0 -85
  484. package/dist/shared 2/flap/abi.d.ts +0 -4
  485. package/dist/shared 2/flap/abi.js +0 -4
  486. package/dist/shared 2/flap/constants.d.ts +0 -128
  487. package/dist/shared 2/flap/constants.js +0 -143
  488. package/dist/shared 2/flap/curve.d.ts +0 -33
  489. package/dist/shared 2/flap/curve.js +0 -84
  490. package/dist/shared 2/flap/errors.d.ts +0 -37
  491. package/dist/shared 2/flap/errors.js +0 -114
  492. package/dist/shared 2/flap/index.d.ts +0 -22
  493. package/dist/shared 2/flap/index.js +0 -33
  494. package/dist/shared 2/flap/ipfs.d.ts +0 -21
  495. package/dist/shared 2/flap/ipfs.js +0 -38
  496. package/dist/shared 2/flap/meta.d.ts +0 -30
  497. package/dist/shared 2/flap/meta.js +0 -195
  498. package/dist/shared 2/flap/permit.d.ts +0 -16
  499. package/dist/shared 2/flap/permit.js +0 -67
  500. package/dist/shared 2/flap/pinata.d.ts +0 -40
  501. package/dist/shared 2/flap/pinata.js +0 -106
  502. package/dist/shared 2/flap/portal-bundle-merkle/config.d.ts +0 -79
  503. package/dist/shared 2/flap/portal-bundle-merkle/config.js +0 -133
  504. package/dist/shared 2/flap/portal-bundle-merkle/core.d.ts +0 -18
  505. package/dist/shared 2/flap/portal-bundle-merkle/core.js +0 -938
  506. package/dist/shared 2/flap/portal-bundle-merkle/create-to-dex.d.ts +0 -125
  507. package/dist/shared 2/flap/portal-bundle-merkle/create-to-dex.js +0 -665
  508. package/dist/shared 2/flap/portal-bundle-merkle/curve-to-dex.d.ts +0 -88
  509. package/dist/shared 2/flap/portal-bundle-merkle/curve-to-dex.js +0 -446
  510. package/dist/shared 2/flap/portal-bundle-merkle/index.d.ts +0 -14
  511. package/dist/shared 2/flap/portal-bundle-merkle/index.js +0 -26
  512. package/dist/shared 2/flap/portal-bundle-merkle/pancake-proxy.d.ts +0 -28
  513. package/dist/shared 2/flap/portal-bundle-merkle/private.d.ts +0 -17
  514. package/dist/shared 2/flap/portal-bundle-merkle/private.js +0 -549
  515. package/dist/shared 2/flap/portal-bundle-merkle/swap-buy-first.d.ts +0 -65
  516. package/dist/shared 2/flap/portal-bundle-merkle/swap-buy-first.js +0 -831
  517. package/dist/shared 2/flap/portal-bundle-merkle/swap.d.ts +0 -201
  518. package/dist/shared 2/flap/portal-bundle-merkle/swap.js +0 -1359
  519. package/dist/shared 2/flap/portal-bundle-merkle/types.d.ts +0 -358
  520. package/dist/shared 2/flap/portal-bundle-merkle/utils.d.ts +0 -89
  521. package/dist/shared 2/flap/portal-bundle-merkle/utils.js +0 -963
  522. package/dist/shared 2/flap/portal-bundle.d.ts +0 -119
  523. package/dist/shared 2/flap/portal-bundle.js +0 -584
  524. package/dist/shared 2/flap/portal.d.ts +0 -392
  525. package/dist/shared 2/flap/portal.js +0 -559
  526. package/dist/shared 2/flap/vanity.d.ts +0 -48
  527. package/dist/shared 2/flap/vanity.js +0 -110
  528. package/dist/shared 2/flap/vault.d.ts +0 -240
  529. package/dist/shared 2/flap/vault.js +0 -366
  530. package/dist/shared 2/four/index.d.ts +0 -7
  531. package/dist/shared 2/four/index.js +0 -22
  532. package/dist/shared 2/four/tax-token.d.ts +0 -176
  533. package/dist/shared 2/four/tax-token.js +0 -302
  534. package/dist/shared 2/index.d.ts +0 -10
  535. package/dist/shared 2/index.js +0 -10
  536. package/dist/utils/__tests__/errors.test.js +0 -76
  537. package/dist/utils/erc20/index.d.ts +0 -242
  538. package/dist/utils/erc20/index.js +0 -645
  539. package/dist/utils/holders-maker/helpers.d.ts +0 -43
  540. package/dist/utils/holders-maker/helpers.js +0 -371
  541. package/dist/utils/holders-maker/index.d.ts +0 -26
  542. package/dist/utils/holders-maker/index.js +0 -218
  543. package/dist/utils/holders-maker/types.js +0 -4
  544. package/dist/utils/lp-inspect/index.d.ts +0 -44
  545. package/dist/utils/lp-inspect/index.js +0 -937
  546. package/dist/utils/quote-helpers/index.d.ts +0 -107
  547. package/dist/utils/quote-helpers/index.js +0 -346
  548. /package/dist/{chains/bsc/four/submit/types.js → __tests__/subpath-exports.test.d.ts} +0 -0
  549. /package/dist/{chains/bsc/four/swap/types.js → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
  550. /package/dist/{chains/bsc/four/utils/types.d.ts → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
  551. /package/dist/{chains/bsc/four/utils/types.js → bundle-core/__tests__/sign-context-helpers.test.d.ts} +0 -0
  552. /package/dist/{chains/bsc/pancake/bundle-buy-first/types.js → bundle-core/__tests__/sign-fixture.test.d.ts} +0 -0
  553. /package/dist/{chains/xlayer/eip7702/multi-hop-transfer/types.js → bundle-core/four-meme/types/buy-first.js} +0 -0
  554. /package/dist/{chains/xlayer/eip7702/volume/types.js → bundle-core/four-meme/types/core-flow.js} +0 -0
  555. /package/dist/{dex/direct-router/types.js → bundle-core/four-meme/types/index.js} +0 -0
  556. /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/four-meme/types/swap-internal.js} +0 -0
  557. /package/dist/{chains/xlayer/eip7702/bundle-swap → bundle-core/four-meme}/types.js +0 -0
  558. /package/dist/{shared/flap/__tests__/curve.test.d.ts → bundle-core/types/index.js} +0 -0
  559. /package/dist/{shared 2/flap/portal-bundle-merkle → bundle-core}/types.js +0 -0
  560. /package/dist/{shared/flap/portal-bundle-merkle/core/types.d.ts → chains/xlayer/eip7702/multi-hop-transfer-helpers.js} +0 -0
  561. /package/dist/{shared/flap/portal-bundle-merkle/core → dex}/types.js +0 -0
  562. /package/dist/shared/{flap/portal-bundle-merkle/swap/types.js → foundation/tx/wallet-sign-patch.d.ts} +0 -0
  563. /package/dist/shared/{flap/portal-bundle-merkle/utils/types.js → foundation/types/airdrop-sweep.js} +0 -0
  564. /package/dist/{utils/__tests__/errors.test.d.ts → shared/foundation/types/erc20.js} +0 -0
  565. /package/dist/{utils/erc20/types.js → shared/foundation/types/holders-maker.js} +0 -0
  566. /package/dist/{utils/lp-inspect/types.js → shared/foundation/types/index.js} +0 -0
  567. /package/dist/{utils/quote-helpers/types.js → shared/foundation/types/lp-inspect.js} +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?: unknown): boolean;
26
+ export declare function getProfitRateBps(_config?: unknown): number;
27
+ export declare function getProfitRecipient(_config?: unknown): string;
28
+ export declare function calculateProfit(amount: bigint, _config?: unknown): {
29
+ profit: bigint;
30
+ remaining: bigint;
31
+ };
32
+ export declare function calculateBatchProfit(amounts: bigint[], _config?: unknown): {
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,34 @@
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
+ return message(...args);
30
+ }
31
+ return message;
32
+ }
33
+ /** @deprecated 使用 getBundleErrorMessage */
34
+ 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>;