four-flap-meme-sdk 1.9.49 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. package/README.en.md +41 -6
  2. package/README.md +31 -0
  3. package/README.zh-CN.md +41 -6
  4. package/dist/abis/common.js +74 -68
  5. package/dist/abis/flap/vault.js +9 -7
  6. package/dist/abis/index.d.ts +3 -4
  7. package/dist/abis/index.js +3 -4
  8. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  9. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  10. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
  11. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  12. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
  13. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  14. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  15. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  16. package/dist/bundle-core/config-helpers.d.ts +36 -0
  17. package/dist/bundle-core/config-helpers.js +57 -0
  18. package/dist/bundle-core/errors.d.ts +50 -0
  19. package/dist/bundle-core/errors.js +34 -0
  20. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  21. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  22. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  23. package/dist/bundle-core/four-meme/core-helpers.js +40 -0
  24. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  25. package/dist/bundle-core/four-meme/core.js +515 -0
  26. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  27. package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
  28. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  29. package/dist/bundle-core/four-meme/private.js +465 -0
  30. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  31. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  32. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  33. package/dist/bundle-core/four-meme/swap-buy-first.js +493 -0
  34. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  35. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  36. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  37. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  38. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +27 -0
  39. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  40. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  41. package/dist/bundle-core/four-meme/swap.js +505 -0
  42. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  43. package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
  44. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  45. package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
  46. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  47. package/dist/bundle-core/four-meme/types/index.js +1 -0
  48. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  49. package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
  50. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  51. package/dist/bundle-core/four-meme/types.js +1 -0
  52. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  53. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  54. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  55. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  56. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  57. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  58. package/dist/bundle-core/index.d.ts +8 -0
  59. package/dist/bundle-core/index.js +8 -0
  60. package/dist/bundle-core/internal.d.ts +21 -0
  61. package/dist/bundle-core/internal.js +182 -0
  62. package/dist/bundle-core/sign-context-helpers.d.ts +25 -0
  63. package/dist/bundle-core/sign-context-helpers.js +67 -0
  64. package/dist/bundle-core/submit.d.ts +293 -0
  65. package/dist/bundle-core/submit.js +727 -0
  66. package/dist/bundle-core/types/index.d.ts +8 -0
  67. package/dist/bundle-core/types/index.js +1 -0
  68. package/dist/bundle-core/types.d.ts +1 -0
  69. package/dist/bundle-core/types.js +1 -0
  70. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  71. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -116
  72. package/dist/chains/bsc/four/config.d.ts +5 -70
  73. package/dist/chains/bsc/four/config.js +2 -115
  74. package/dist/chains/bsc/four/core.d.ts +1 -4
  75. package/dist/chains/bsc/four/core.js +1 -589
  76. package/dist/chains/bsc/four/disperse.d.ts +12 -0
  77. package/dist/chains/bsc/four/disperse.js +470 -0
  78. package/dist/chains/bsc/four/index.d.ts +6 -6
  79. package/dist/chains/bsc/four/index.js +6 -6
  80. package/dist/chains/bsc/four/internal.d.ts +2 -50
  81. package/dist/chains/bsc/four/internal.js +2 -237
  82. package/dist/chains/bsc/four/pairwise.d.ts +7 -0
  83. package/dist/chains/bsc/four/pairwise.js +308 -0
  84. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  85. package/dist/chains/bsc/four/pancake-proxy.js +1 -688
  86. package/dist/chains/bsc/four/private.d.ts +1 -27
  87. package/dist/chains/bsc/four/private.js +1 -477
  88. package/dist/chains/bsc/four/submit.d.ts +2 -315
  89. package/dist/chains/bsc/four/submit.js +2 -746
  90. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  91. package/dist/chains/bsc/four/swap-buy-first.js +2 -506
  92. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  93. package/dist/chains/bsc/four/swap-internal.js +1 -18
  94. package/dist/chains/bsc/four/swap.d.ts +2 -144
  95. package/dist/chains/bsc/four/swap.js +2 -760
  96. package/dist/chains/bsc/four/sweep.d.ts +13 -0
  97. package/dist/chains/bsc/four/sweep.js +788 -0
  98. package/dist/chains/bsc/four/types.d.ts +1 -476
  99. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  100. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  101. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  102. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  103. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  104. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  105. package/dist/chains/bsc/four/utils.d.ts +5 -18
  106. package/dist/chains/bsc/four/utils.js +5 -1534
  107. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +159 -0
  108. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +117 -0
  109. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  110. package/dist/chains/bsc/pancake/bundle-buy-first.js +97 -207
  111. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  112. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
  113. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  114. package/dist/chains/bsc/pancake/bundle-swap.js +111 -686
  115. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  116. package/dist/chains/bsc/pancake/index.js +1 -3
  117. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  118. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  119. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  120. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  121. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  122. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  123. package/dist/chains/eni/batch-router/transfer.js +54 -23
  124. package/dist/chains/eni/batch-router/utils.js +32 -6
  125. package/dist/chains/eni/bundler/sign.js +4 -4
  126. package/dist/chains/eni/bundler/submit.js +1 -4
  127. package/dist/chains/eni/constants.js +1 -1
  128. package/dist/chains/eni/index.d.ts +1 -1
  129. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  130. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  131. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  132. package/dist/chains/eni/platforms/daoaas/meta.js +8 -4
  133. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -43
  134. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  135. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  136. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  137. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  138. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -47
  139. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  140. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  141. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  142. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  143. package/dist/chains/eni/platforms/iro/index.js +4 -4
  144. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  145. package/dist/chains/eni/platforms/iro/token.js +107 -31
  146. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  147. package/dist/chains/eni/submit.js +5 -13
  148. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  149. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -20
  150. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  151. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  152. package/dist/chains/xlayer/eip7702/bundle-create.js +93 -56
  153. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  154. package/dist/chains/xlayer/eip7702/bundle-sell.js +26 -74
  155. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  156. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -68
  157. package/dist/chains/xlayer/eip7702/constants.d.ts +1 -16
  158. package/dist/chains/xlayer/eip7702/constants.js +3 -21
  159. package/dist/chains/xlayer/eip7702/index.d.ts +27 -46
  160. package/dist/chains/xlayer/eip7702/index.js +27 -81
  161. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
  162. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
  163. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  164. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +58 -291
  165. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  166. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +57 -0
  167. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  168. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  169. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  170. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
  171. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  172. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  173. package/dist/chains/xlayer/eip7702/volume.js +83 -158
  174. package/dist/chains/xlayer/eoa/constants.js +1 -1
  175. package/dist/chains/xlayer/eoa/dex-helpers.js +5 -5
  176. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  177. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  178. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  179. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +64 -276
  180. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  181. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +14 -14
  182. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  183. package/dist/chains/xlayer/eoa/index.js +8 -23
  184. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  185. package/dist/chains/xlayer/eoa/router-manager.js +3 -3
  186. package/dist/chains/xlayer/eoa/types-core.d.ts +363 -0
  187. package/dist/chains/xlayer/eoa/types-core.js +53 -0
  188. package/dist/chains/xlayer/eoa/types-create.d.ts +413 -0
  189. package/dist/chains/xlayer/eoa/types-create.js +9 -0
  190. package/dist/chains/xlayer/eoa/types-volume.d.ts +209 -0
  191. package/dist/chains/xlayer/eoa/types-volume.js +13 -0
  192. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  193. package/dist/chains/xlayer/eoa/types.js +1 -3
  194. package/dist/contracts/helper3.d.ts +20 -17
  195. package/dist/contracts/helper3.js +56 -20
  196. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  197. package/dist/contracts/tm-bundle-helpers.js +72 -0
  198. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  199. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -117
  200. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -70
  201. package/dist/contracts/tm-bundle-merkle/config.js +2 -115
  202. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  203. package/dist/contracts/tm-bundle-merkle/core.js +1 -588
  204. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  205. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  206. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -50
  207. package/dist/contracts/tm-bundle-merkle/internal.js +2 -236
  208. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  209. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -687
  210. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  211. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  212. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  213. package/dist/contracts/tm-bundle-merkle/submit.js +3 -919
  214. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  215. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -505
  216. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  217. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  218. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  219. package/dist/contracts/tm-bundle-merkle/swap.js +2 -757
  220. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  221. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  222. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  223. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  224. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  225. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  226. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  227. package/dist/contracts/tm-bundle-merkle/utils.d.ts +5 -6
  228. package/dist/contracts/tm-bundle-merkle/utils.js +5 -6
  229. package/dist/contracts/tm-bundle.d.ts +3 -51
  230. package/dist/contracts/tm-bundle.js +102 -142
  231. package/dist/contracts/tm.d.ts +3 -2
  232. package/dist/contracts/tm.js +36 -32
  233. package/dist/contracts/tm1.js +9 -4
  234. package/dist/contracts/tm2.js +9 -4
  235. package/dist/dex/direct-router-helpers.d.ts +264 -0
  236. package/dist/dex/direct-router-helpers.js +539 -0
  237. package/dist/dex/direct-router.d.ts +3 -125
  238. package/dist/dex/direct-router.js +237 -652
  239. package/dist/dex/types.d.ts +81 -0
  240. package/dist/dex/types.js +1 -0
  241. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  242. package/dist/exports/root-bundle-and-tooling.js +30 -0
  243. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  244. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  245. package/dist/exports/root-foundations.d.ts +35 -0
  246. package/dist/exports/root-foundations.js +70 -0
  247. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  248. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  249. package/dist/flows/create.d.ts +2 -2
  250. package/dist/flows/create.js +6 -6
  251. package/dist/flows/index.d.ts +1 -0
  252. package/dist/flows/index.js +1 -0
  253. package/dist/index.d.ts +20 -91
  254. package/dist/index.js +20 -215
  255. package/dist/shared/abis/common.d.ts +2 -83
  256. package/dist/shared/abis/common.js +2 -252
  257. package/dist/shared/abis/index.d.ts +5 -6
  258. package/dist/shared/abis/index.js +5 -7
  259. package/dist/shared/clients/blockrazor.js +41 -24
  260. package/dist/shared/clients/club48.js +30 -26
  261. package/dist/shared/clients/emitservice.js +2 -0
  262. package/dist/shared/clients/four.js +23 -18
  263. package/dist/shared/clients/index.d.ts +8 -0
  264. package/dist/shared/clients/index.js +8 -0
  265. package/dist/shared/clients/merkle.js +26 -30
  266. package/dist/shared/constants/addresses.d.ts +1 -1
  267. package/dist/shared/constants/addresses.js +11 -2
  268. package/dist/shared/constants/chains.d.ts +1 -1
  269. package/dist/shared/constants/chains.js +1 -1
  270. package/dist/shared/constants/gas.d.ts +1 -1
  271. package/dist/shared/constants/gas.js +2 -6
  272. package/dist/shared/constants/index.d.ts +1 -0
  273. package/dist/shared/constants/index.js +1 -0
  274. package/dist/shared/constants/quote.d.ts +30 -0
  275. package/dist/shared/constants/quote.js +37 -0
  276. package/dist/shared/flap/__tests__/curve.test.js +3 -3
  277. package/dist/shared/flap/abi.js +1 -1
  278. package/dist/shared/flap/constants.d.ts +1 -1
  279. package/dist/shared/flap/constants.js +2 -2
  280. package/dist/shared/flap/curve.js +3 -0
  281. package/dist/shared/flap/errors.d.ts +1 -4
  282. package/dist/shared/flap/errors.js +21 -3
  283. package/dist/shared/flap/index.d.ts +2 -2
  284. package/dist/shared/flap/index.js +2 -2
  285. package/dist/shared/flap/meta.d.ts +16 -18
  286. package/dist/shared/flap/meta.js +14 -26
  287. package/dist/shared/flap/permit.js +6 -5
  288. package/dist/shared/flap/pinata.d.ts +9 -2
  289. package/dist/shared/flap/pinata.js +20 -18
  290. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  291. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  292. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  293. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  294. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  295. package/dist/shared/flap/portal-bundle-merkle/core.js +66 -156
  296. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +81 -86
  297. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +100 -92
  298. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  299. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  300. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  301. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  302. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  303. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  304. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  305. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +66 -247
  306. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  307. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  308. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +2 -71
  309. package/dist/shared/flap/portal-bundle-merkle/swap.js +103 -410
  310. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +73 -3
  311. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.d.ts +100 -0
  312. package/dist/shared/flap/portal-bundle-merkle/utils-helpers.js +133 -0
  313. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  314. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  315. package/dist/shared/flap/portal-bundle.js +54 -42
  316. package/dist/shared/flap/portal.js +32 -10
  317. package/dist/shared/flap/vanity.js +4 -7
  318. package/dist/shared/flap/vault.d.ts +1 -1
  319. package/dist/shared/flap/vault.js +54 -48
  320. package/dist/shared/flap 2/__tests__/curve.test.d.ts +1 -0
  321. package/dist/shared/flap 2/portal-bundle-merkle/types.js +1 -0
  322. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  323. package/dist/shared/foundation/dex/v3-path.js +35 -0
  324. package/dist/shared/foundation/gas/bundle-gas.d.ts +39 -0
  325. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  326. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  327. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  328. package/dist/shared/foundation/index.d.ts +13 -0
  329. package/dist/shared/foundation/index.js +12 -0
  330. package/dist/shared/foundation/nonce/nonce-manager.d.ts +17 -0
  331. package/dist/shared/foundation/nonce/nonce-manager.js +180 -0
  332. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  333. package/dist/shared/foundation/normalize-unknown.js +29 -0
  334. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  335. package/dist/shared/foundation/sdk-logger.js +12 -0
  336. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  337. package/dist/shared/foundation/tx/build-request.js +25 -0
  338. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  339. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  340. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  341. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  342. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  343. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  344. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  345. package/dist/shared/foundation/types/erc20.js +1 -0
  346. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  347. package/dist/shared/foundation/types/holders-maker.js +1 -0
  348. package/dist/shared/foundation/types/index.d.ts +7 -0
  349. package/dist/shared/foundation/types/index.js +1 -0
  350. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  351. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  352. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  353. package/dist/shared/foundation/types/multicall.js +1 -0
  354. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  355. package/dist/shared/foundation/types/private-sale.js +1 -0
  356. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  357. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  358. package/dist/shared/four/tax-token.d.ts +1 -1
  359. package/dist/shared/four/tax-token.js +27 -7
  360. package/dist/shared/index.d.ts +4 -0
  361. package/dist/shared/index.js +4 -0
  362. package/dist/types/distribute.d.ts +72 -0
  363. package/dist/types/distribute.js +1 -0
  364. package/dist/types 2/errors.d.ts +27 -0
  365. package/dist/types 2/errors.js +34 -0
  366. package/dist/utils/airdrop-sweep-types.d.ts +1 -0
  367. package/dist/utils/airdrop-sweep-types.js +1 -0
  368. package/dist/utils/airdrop-sweep.d.ts +4 -76
  369. package/dist/utils/airdrop-sweep.js +38 -52
  370. package/dist/utils/bundle-helpers.d.ts +9 -243
  371. package/dist/utils/bundle-helpers.js +10 -584
  372. package/dist/utils/constants.d.ts +5 -61
  373. package/dist/utils/constants.js +5 -80
  374. package/dist/utils/contract-factory.d.ts +2 -4
  375. package/dist/utils/contract-factory.js +25 -18
  376. package/dist/utils/erc20-types.d.ts +1 -0
  377. package/dist/utils/erc20-types.js +1 -0
  378. package/dist/utils/erc20.d.ts +8 -90
  379. package/dist/utils/erc20.js +94 -153
  380. package/dist/utils/errors.d.ts +10 -22
  381. package/dist/utils/errors.js +61 -79
  382. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  383. package/dist/utils/holders-maker/addresses.js +15 -0
  384. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  385. package/dist/utils/holders-maker/buy-tx.js +278 -0
  386. package/dist/utils/holders-maker/constants.d.ts +6 -0
  387. package/dist/utils/holders-maker/constants.js +7 -0
  388. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  389. package/dist/utils/holders-maker/disperse.js +90 -0
  390. package/dist/utils/holders-maker/routing.d.ts +4 -0
  391. package/dist/utils/holders-maker/routing.js +45 -0
  392. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  393. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  394. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  395. package/dist/utils/holders-maker-helpers.js +9 -0
  396. package/dist/utils/holders-maker-types.d.ts +1 -0
  397. package/dist/utils/holders-maker-types.js +1 -0
  398. package/dist/utils/holders-maker.d.ts +2 -138
  399. package/dist/utils/holders-maker.js +23 -651
  400. package/dist/utils/hop-chains.d.ts +35 -0
  401. package/dist/utils/hop-chains.js +215 -0
  402. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  403. package/dist/utils/lp-inspect-helpers.js +109 -0
  404. package/dist/utils/lp-inspect-types.d.ts +1 -0
  405. package/dist/utils/lp-inspect-types.js +1 -0
  406. package/dist/utils/lp-inspect.d.ts +2 -112
  407. package/dist/utils/lp-inspect.js +63 -195
  408. package/dist/utils/mpcExclusive.d.ts +2 -5
  409. package/dist/utils/mpcExclusive.js +4 -3
  410. package/dist/utils/private-sale-types.d.ts +1 -0
  411. package/dist/utils/private-sale-types.js +1 -0
  412. package/dist/utils/private-sale.d.ts +2 -58
  413. package/dist/utils/private-sale.js +2 -7
  414. package/dist/utils/provider-factory.d.ts +4 -0
  415. package/dist/utils/provider-factory.js +10 -0
  416. package/dist/utils/quote-helpers-types.d.ts +1 -0
  417. package/dist/utils/quote-helpers-types.js +1 -0
  418. package/dist/utils/quote-helpers.d.ts +4 -45
  419. package/dist/utils/quote-helpers.js +15 -65
  420. package/dist/utils/stealth-transfer.d.ts +2 -28
  421. package/dist/utils/stealth-transfer.js +30 -14
  422. package/dist/utils/swap-helpers.d.ts +0 -3
  423. package/dist/utils/swap-helpers.js +6 -9
  424. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  425. package/dist/utils/types/airdrop-sweep.js +1 -0
  426. package/dist/utils/types/contract-factory.d.ts +1 -0
  427. package/dist/utils/types/contract-factory.js +1 -0
  428. package/dist/utils/types/erc20.d.ts +1 -0
  429. package/dist/utils/types/erc20.js +1 -0
  430. package/dist/utils/types/errors.d.ts +1 -0
  431. package/dist/utils/types/errors.js +1 -0
  432. package/dist/utils/types/holders-maker.d.ts +1 -0
  433. package/dist/utils/types/holders-maker.js +1 -0
  434. package/dist/utils/types/hop-chains.d.ts +8 -0
  435. package/dist/utils/types/hop-chains.js +1 -0
  436. package/dist/utils/types/index.d.ts +13 -0
  437. package/dist/utils/types/index.js +1 -0
  438. package/dist/utils/types/lp-inspect.d.ts +1 -0
  439. package/dist/utils/types/lp-inspect.js +1 -0
  440. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  441. package/dist/utils/types/mpc-exclusive.js +1 -0
  442. package/dist/utils/types/private-sale.d.ts +1 -0
  443. package/dist/utils/types/private-sale.js +1 -0
  444. package/dist/utils/types/quote-helpers.d.ts +1 -0
  445. package/dist/utils/types/quote-helpers.js +1 -0
  446. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  447. package/dist/utils/types/stealth-transfer.js +1 -0
  448. package/dist/utils/types/wallet.d.ts +25 -0
  449. package/dist/utils/types/wallet.js +1 -0
  450. package/dist/utils/wallet.d.ts +2 -25
  451. package/dist/utils/wallet.js +9 -10
  452. package/package.json +55 -2
  453. package/src/abis/contracts/TaxToken.json +969 -0
  454. package/src/abis/contracts/TokenManager.json +836 -0
  455. package/src/abis/contracts/TokenManager2.json +136 -0
  456. package/src/abis/contracts/TokenManagerHelper3.json +993 -0
  457. /package/dist/{shared 2/flap/__tests__/curve.test.d.ts → bundle-core/__tests__/config-helpers.test.d.ts} +0 -0
  458. /package/dist/{shared 2/flap/portal-bundle-merkle/types.js → bundle-core/__tests__/facade-parity.test.d.ts} +0 -0
  459. /package/dist/{shared 2/abis → shared/abis 2}/TaxToken.json +0 -0
  460. /package/dist/{shared 2/abis → shared/abis 2}/TokenManager.json +0 -0
  461. /package/dist/{shared 2/abis → shared/abis 2}/TokenManager2.json +0 -0
  462. /package/dist/{shared 2/abis → shared/abis 2}/TokenManagerHelper3.json +0 -0
  463. /package/dist/{shared 2/abis → shared/abis 2}/common.d.ts +0 -0
  464. /package/dist/{shared 2/abis → shared/abis 2}/common.js +0 -0
  465. /package/dist/{shared 2/abis → shared/abis 2}/index.d.ts +0 -0
  466. /package/dist/{shared 2/abis → shared/abis 2}/index.js +0 -0
  467. /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.d.ts +0 -0
  468. /package/dist/{shared 2/clients → shared/clients 2}/blockrazor.js +0 -0
  469. /package/dist/{shared 2/clients → shared/clients 2}/club48.d.ts +0 -0
  470. /package/dist/{shared 2/clients → shared/clients 2}/club48.js +0 -0
  471. /package/dist/{shared 2/clients → shared/clients 2}/emitservice.d.ts +0 -0
  472. /package/dist/{shared 2/clients → shared/clients 2}/emitservice.js +0 -0
  473. /package/dist/{shared 2/clients → shared/clients 2}/four.d.ts +0 -0
  474. /package/dist/{shared 2/clients → shared/clients 2}/four.js +0 -0
  475. /package/dist/{shared 2/clients → shared/clients 2}/merkle.d.ts +0 -0
  476. /package/dist/{shared 2/clients → shared/clients 2}/merkle.js +0 -0
  477. /package/dist/{shared 2/flap → shared/flap 2}/__tests__/curve.test.js +0 -0
  478. /package/dist/{shared 2/flap → shared/flap 2}/abi.d.ts +0 -0
  479. /package/dist/{shared 2/flap → shared/flap 2}/abi.js +0 -0
  480. /package/dist/{shared 2/flap → shared/flap 2}/constants.d.ts +0 -0
  481. /package/dist/{shared 2/flap → shared/flap 2}/constants.js +0 -0
  482. /package/dist/{shared 2/flap → shared/flap 2}/curve.d.ts +0 -0
  483. /package/dist/{shared 2/flap → shared/flap 2}/curve.js +0 -0
  484. /package/dist/{shared 2/flap → shared/flap 2}/errors.d.ts +0 -0
  485. /package/dist/{shared 2/flap → shared/flap 2}/errors.js +0 -0
  486. /package/dist/{shared 2/flap → shared/flap 2}/index.d.ts +0 -0
  487. /package/dist/{shared 2/flap → shared/flap 2}/index.js +0 -0
  488. /package/dist/{shared 2/flap → shared/flap 2}/ipfs.d.ts +0 -0
  489. /package/dist/{shared 2/flap → shared/flap 2}/ipfs.js +0 -0
  490. /package/dist/{shared 2/flap → shared/flap 2}/meta.d.ts +0 -0
  491. /package/dist/{shared 2/flap → shared/flap 2}/meta.js +0 -0
  492. /package/dist/{shared 2/flap → shared/flap 2}/permit.d.ts +0 -0
  493. /package/dist/{shared 2/flap → shared/flap 2}/permit.js +0 -0
  494. /package/dist/{shared 2/flap → shared/flap 2}/pinata.d.ts +0 -0
  495. /package/dist/{shared 2/flap → shared/flap 2}/pinata.js +0 -0
  496. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.d.ts +0 -0
  497. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/config.js +0 -0
  498. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.d.ts +0 -0
  499. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/core.js +0 -0
  500. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.d.ts +0 -0
  501. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/create-to-dex.js +0 -0
  502. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.d.ts +0 -0
  503. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/curve-to-dex.js +0 -0
  504. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.d.ts +0 -0
  505. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/index.js +0 -0
  506. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.d.ts +0 -0
  507. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/pancake-proxy.js +0 -0
  508. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.d.ts +0 -0
  509. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/private.js +0 -0
  510. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.d.ts +0 -0
  511. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap-buy-first.js +0 -0
  512. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.d.ts +0 -0
  513. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/swap.js +0 -0
  514. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/types.d.ts +0 -0
  515. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.d.ts +0 -0
  516. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle-merkle/utils.js +0 -0
  517. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.d.ts +0 -0
  518. /package/dist/{shared 2/flap → shared/flap 2}/portal-bundle.js +0 -0
  519. /package/dist/{shared 2/flap → shared/flap 2}/portal.d.ts +0 -0
  520. /package/dist/{shared 2/flap → shared/flap 2}/portal.js +0 -0
  521. /package/dist/{shared 2/flap → shared/flap 2}/vanity.d.ts +0 -0
  522. /package/dist/{shared 2/flap → shared/flap 2}/vanity.js +0 -0
  523. /package/dist/{shared 2/flap → shared/flap 2}/vault.d.ts +0 -0
  524. /package/dist/{shared 2/flap → shared/flap 2}/vault.js +0 -0
  525. /package/dist/{shared 2/four → shared/four 2}/index.d.ts +0 -0
  526. /package/dist/{shared 2/four → shared/four 2}/index.js +0 -0
  527. /package/dist/{shared 2/four → shared/four 2}/tax-token.d.ts +0 -0
  528. /package/dist/{shared 2/four → shared/four 2}/tax-token.js +0 -0
  529. /package/dist/{shared 2/index.d.ts → shared/index 2.js} +0 -0
  530. /package/dist/{shared 2/index.js → shared/index.d 2.ts} +0 -0
@@ -1,239 +1,4 @@
1
- import { ethers, Wallet } from 'ethers';
2
- import { ADDRESSES } from '../../../utils/constants.js';
3
- import { MULTICALL3_ABI, ERC20_BALANCE_ABI } from '../../../shared/abis/common.js';
4
- import { CHAINS, GAS_LIMITS } from '../../../shared/constants/index.js';
5
- // 内部缓存:ERC20 小数位
6
- const decimalsCache = new Map();
7
1
  /**
8
- * 获取 ERC20 代币精度(带缓存)
9
- * ✅ 优化:避免每次调用都获取 network,直接使用传入的 chainId
2
+ * @deprecated 实现已迁移至 bundle-core/internal.ts,此处仅 re-export 保持 import 路径不变。
10
3
  */
11
- export async function getErc20DecimalsMerkle(provider, token, chainId) {
12
- // ✅ 修复:不访问 provider._network(ethers v6 可能未准备好导致 NETWORK_ERROR)
13
- // 直接使用传入的 chainId,如果没传则默认 56 (BSC)
14
- const resolvedChainId = chainId ?? 56;
15
- const key = `${resolvedChainId}_${token.toLowerCase()}`;
16
- if (decimalsCache.has(key))
17
- return decimalsCache.get(key);
18
- try {
19
- const erc20 = new ethers.Contract(token, ['function decimals() view returns (uint8)'], provider);
20
- const d = await erc20.decimals();
21
- if (!Number.isFinite(d) || d < 0 || d > 36)
22
- return 18;
23
- decimalsCache.set(key, d);
24
- return d;
25
- }
26
- catch {
27
- return 18;
28
- }
29
- }
30
- /**
31
- * ✅ 生成多跳中间钱包(返回完整钱包信息:地址 + 私钥)
32
- */
33
- export function generateHopWallets(recipientCount, hopCount) {
34
- const hopCounts = Array.isArray(hopCount) ? hopCount : new Array(recipientCount).fill(hopCount);
35
- if (hopCounts.every(h => h <= 0))
36
- return null;
37
- const result = [];
38
- for (let i = 0; i < recipientCount; i++) {
39
- const chain = [];
40
- for (let j = 0; j < hopCounts[i]; j++) {
41
- const wallet = Wallet.createRandom();
42
- chain.push({
43
- address: wallet.address,
44
- privateKey: wallet.privateKey
45
- });
46
- }
47
- result.push(chain);
48
- }
49
- return result;
50
- }
51
- export function normalizeAmounts(recipients, amount, amounts) {
52
- if (amounts && amounts.length > 0) {
53
- if (amounts.length !== recipients.length) {
54
- throw new Error(`amounts length (${amounts.length}) must match recipients length (${recipients.length})`);
55
- }
56
- return amounts.map(a => (typeof a === 'bigint' ? a.toString() : String(a)));
57
- }
58
- if (amount !== undefined && String(amount).trim().length > 0) {
59
- return new Array(recipients.length).fill(typeof amount === 'bigint' ? amount.toString() : String(amount));
60
- }
61
- throw new Error('Either amount or amounts must be provided');
62
- }
63
- /**
64
- * 批量获取余额(原生代币或 ERC20)
65
- * ✅ 优化:原生代币也使用 Multicall3 批量获取,减少 RPC 调用
66
- */
67
- export async function batchGetBalances(provider, addresses, tokenAddress) {
68
- if (addresses.length === 0)
69
- return [];
70
- // ✅ 使用公共模块
71
- const MULTICALL3_ADDRESS = ADDRESSES.BSC.Multicall3;
72
- const multicall = new ethers.Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
73
- if (!tokenAddress) {
74
- // ✅ 优化:原生代币使用 Multicall3.getEthBalance 批量获取(单次 RPC 调用)
75
- const multicallIface = new ethers.Interface(MULTICALL3_ABI);
76
- const calls = addresses.map(addr => ({
77
- target: MULTICALL3_ADDRESS,
78
- allowFailure: true,
79
- callData: multicallIface.encodeFunctionData('getEthBalance', [addr])
80
- }));
81
- try {
82
- const results = await multicall.aggregate3(calls);
83
- return results.map((result) => {
84
- if (result.success && result.returnData && result.returnData !== '0x') {
85
- try {
86
- const decoded = multicallIface.decodeFunctionResult('getEthBalance', result.returnData);
87
- return decoded[0];
88
- }
89
- catch {
90
- return 0n;
91
- }
92
- }
93
- return 0n;
94
- });
95
- }
96
- catch {
97
- // ✅ 回退:并行调用(如果 Multicall3 失败)
98
- return Promise.all(addresses.map(addr => provider.getBalance(addr).catch(() => 0n)));
99
- }
100
- }
101
- else {
102
- // ✅ ERC20 余额:使用 Multicall3 批量获取
103
- const iface = new ethers.Interface(ERC20_BALANCE_ABI);
104
- const calls = addresses.map(addr => ({
105
- target: tokenAddress,
106
- allowFailure: true,
107
- callData: iface.encodeFunctionData('balanceOf', [addr])
108
- }));
109
- try {
110
- const results = await multicall.aggregate3(calls);
111
- return results.map((result) => {
112
- if (result.success && result.returnData && result.returnData !== '0x') {
113
- try {
114
- return iface.decodeFunctionResult('balanceOf', result.returnData)[0];
115
- }
116
- catch {
117
- return 0n;
118
- }
119
- }
120
- return 0n;
121
- });
122
- }
123
- catch {
124
- // ✅ 回退:并行调用(如果 Multicall3 失败)
125
- const fallbackCalls = addresses.map(addr => provider
126
- .call({ to: tokenAddress, data: iface.encodeFunctionData('balanceOf', [addr]) })
127
- .then(raw => iface.decodeFunctionResult('balanceOf', raw)[0])
128
- .catch(() => 0n));
129
- return Promise.all(fallbackCalls);
130
- }
131
- }
132
- }
133
- /**
134
- * 通过模拟交易获取 ERC20 转账的最小 Gas Limit
135
- * ✅ 使用 eth_estimateGas 预估实际需要的 gas,然后加一个小的缓冲量
136
- *
137
- * @param provider - Provider 实例
138
- * @param tokenAddress - ERC20 代币地址
139
- * @param from - 发送方地址
140
- * @param to - 接收方地址
141
- * @param amount - 转账金额(wei)
142
- * @param bufferPercent - 缓冲百分比(默认 5%)
143
- * @returns 预估的 gas limit
144
- */
145
- export async function estimateErc20TransferGas(provider, tokenAddress, from, to, amount, bufferPercent = 5) {
146
- try {
147
- const iface = new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
148
- const data = iface.encodeFunctionData('transfer', [to, amount]);
149
- const estimatedGas = await provider.estimateGas({
150
- from,
151
- to: tokenAddress,
152
- data,
153
- value: 0n
154
- });
155
- // 添加缓冲量(默认 5%)
156
- const buffer = (estimatedGas * BigInt(bufferPercent)) / 100n;
157
- const finalGas = estimatedGas + buffer;
158
- return finalGas;
159
- }
160
- catch (error) {
161
- console.warn(`[estimateErc20TransferGas] 预估失败,使用默认值:`, error);
162
- // 回退到默认值
163
- return 52000n;
164
- }
165
- }
166
- /**
167
- * 批量预估多个 ERC20 转账的 Gas Limit
168
- * ✅ 选取最大值作为统一的 gas limit(确保所有转账都能成功)
169
- */
170
- export async function estimateMaxErc20TransferGas(provider, tokenAddress, from, recipients, amounts, bufferPercent = 5) {
171
- if (recipients.length === 0)
172
- return 52000n;
173
- // 为了减少 RPC 调用,最多预估前 3 个和最后 1 个
174
- const sampleIndices = [];
175
- sampleIndices.push(0); // 第一个
176
- if (recipients.length > 1)
177
- sampleIndices.push(Math.min(1, recipients.length - 1));
178
- if (recipients.length > 2)
179
- sampleIndices.push(Math.min(2, recipients.length - 1));
180
- if (recipients.length > 3)
181
- sampleIndices.push(recipients.length - 1); // 最后一个
182
- // 去重
183
- const uniqueIndices = [...new Set(sampleIndices)];
184
- try {
185
- const estimates = await Promise.all(uniqueIndices.map(i => estimateErc20TransferGas(provider, tokenAddress, from, recipients[i], amounts[i], bufferPercent)));
186
- // 取最大值
187
- const maxGas = estimates.reduce((max, gas) => gas > max ? gas : max, 0n);
188
- return maxGas;
189
- }
190
- catch (error) {
191
- console.warn(`[estimateMaxErc20TransferGas] 批量预估失败,使用默认值:`, error);
192
- return 52000n;
193
- }
194
- }
195
- /**
196
- * 计算 Gas Limit
197
- * - 原生代币转账:
198
- * - BSC: 21000 gas(固定)
199
- * - XLayer: 50000 gas(EIP-7702 授权地址需要更多 gas)
200
- * - ERC20 标准 transfer:约 45000-55000 gas,使用 55000 作为安全值
201
- *
202
- * ✅ 优化:降低 ERC20 gas limit,减少中转钱包 BNB 残留
203
- * ✅ XLayer 特殊处理:EIP-7702 授权的地址接收 OKB 时会触发 delegate 代码,需要更多 gas
204
- */
205
- export function calculateGasLimit(config, isNative, hasHops, hopCount = 0) {
206
- if (config.gasLimit !== undefined) {
207
- return BigInt(config.gasLimit);
208
- }
209
- // ✅ XLayer 链原生代币需要更多 gas(EIP-7702 delegate 执行)
210
- const isXLayer = config.chainId === CHAINS.XLAYER.chainId;
211
- // ✅ 原生代币: BSC 21000, XLayer 50000(EIP-7702 安全)
212
- // ✅ ERC20 标准 transfer: 48000(USDT 最低约 46815)
213
- const baseGas = isNative
214
- ? (isXLayer ? Number(GAS_LIMITS.XLAYER_NATIVE_TRANSFER) : Number(GAS_LIMITS.NATIVE_TRANSFER))
215
- : 46815;
216
- // ✅ 多跳时只需要累加单次转账的 gas,不需要额外乘数
217
- // 每个中转钱包只执行一笔 transfer
218
- if (hasHops && hopCount > 0) {
219
- // 多跳场景:返回单次转账的 gas limit(中转钱包只执行一笔交易)
220
- // 这里不累加,因为每个中转钱包独立执行
221
- const multiplier = config.gasLimitMultiplier ?? 1.1; // ✅ 降低安全系数
222
- return BigInt(Math.ceil(baseGas * multiplier));
223
- }
224
- // 无多跳或单次调用:使用较小的安全系数
225
- const multiplier = config.gasLimitMultiplier ?? 1.1;
226
- return BigInt(Math.ceil(baseGas * multiplier));
227
- }
228
- export function isNativeTokenAddress(tokenAddress) {
229
- if (!tokenAddress)
230
- return true;
231
- const v = tokenAddress.trim().toLowerCase();
232
- if (!v)
233
- return true;
234
- if (v === 'native')
235
- return true;
236
- if (v === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee')
237
- return true;
238
- return false;
239
- }
4
+ export { getErc20Decimals, getErc20DecimalsMerkle, generateHopWallets, normalizeAmounts, batchGetBalances, estimateErc20TransferGas, estimateMaxErc20TransferGas, calculateGasLimit, isNativeTokenAddress, } from '../../../bundle-core/internal.js';
@@ -0,0 +1,7 @@
1
+ import { PairwiseTransferSignParams, PairwiseTransferMerkleResult } from './types.js';
2
+ /**
3
+ * 分发(仅签名版本 - 不依赖 Merkle)
4
+ * ✅ 精简版:只负责签名交易,不提交到 Merkle
5
+ * ✅ 优化版:支持 startNonce 参数避免并行调用时的 nonce 冲突
6
+ */
7
+ export declare function pairwiseTransferWithBundleMerkle(params: PairwiseTransferSignParams): Promise<PairwiseTransferMerkleResult>;
@@ -0,0 +1,308 @@
1
+ import { ethers, Wallet } from 'ethers';
2
+ import { getOptimizedGasPrice, NonceManager, buildProfitHopTransactions, PROFIT_HOP_COUNT, buildGasFields } from '../../../utils/bundle-helpers.js';
3
+ import { BLOCKRAZOR_BUILDER_EOA, calculateTransferFee } from '../../../utils/constants.js';
4
+ import { GAS_LIMITS, CHAINS } from '../../../shared/constants/index.js';
5
+ import { getTxType, getGasPriceConfig, shouldExtractProfit, getProfitRecipient, getBribeAmount } from './config.js';
6
+ // ==================== Gas 常量(使用统一常量) ====================
7
+ const NATIVE_TRANSFER_GAS_LIMIT = GAS_LIMITS.NATIVE_TRANSFER;
8
+ const BRIBE_GAS_LIMIT = GAS_LIMITS.BRIBE;
9
+ import { getErc20DecimalsMerkle as _getErc20DecimalsMerkle, generateHopWallets as _generateHopWallets, calculateGasLimit as _calculateGasLimit, isNativeTokenAddress as _isNativeTokenAddress } from './internal.js';
10
+ // ==================== 钱包转账按地址收费 ====================
11
+ /**
12
+ * 分发(仅签名版本 - 不依赖 Merkle)
13
+ * ✅ 精简版:只负责签名交易,不提交到 Merkle
14
+ * ✅ 优化版:支持 startNonce 参数避免并行调用时的 nonce 冲突
15
+ */
16
+ export async function pairwiseTransferWithBundleMerkle(params) {
17
+ const { senderPrivateKeys, receiverAddresses, amount, amounts, tokenAddress, tokenDecimals, hopCount = 0, hopPrivateKeys, config, startNonce, } = params;
18
+ if (!senderPrivateKeys || senderPrivateKeys.length === 0) {
19
+ return { signedTransactions: [], hopWallets: undefined };
20
+ }
21
+ if (!receiverAddresses || receiverAddresses.length === 0) {
22
+ return { signedTransactions: [], hopWallets: undefined };
23
+ }
24
+ if (senderPrivateKeys.length !== receiverAddresses.length) {
25
+ throw new Error(`senderPrivateKeys length (${senderPrivateKeys.length}) must match receiverAddresses length (${receiverAddresses.length})`);
26
+ }
27
+ const pairCount = senderPrivateKeys.length;
28
+ const normalizedAmounts = (() => {
29
+ if (amounts && amounts.length > 0) {
30
+ if (amounts.length !== pairCount) {
31
+ throw new Error(`amounts length (${amounts.length}) must match pair count (${pairCount})`);
32
+ }
33
+ return amounts.map(a => (typeof a === 'bigint' ? a.toString() : String(a)));
34
+ }
35
+ if (amount !== undefined && String(amount).trim().length > 0) {
36
+ const v = typeof amount === 'bigint' ? amount.toString() : String(amount);
37
+ return new Array(pairCount).fill(v);
38
+ }
39
+ throw new Error('Either amount or amounts must be provided');
40
+ })();
41
+ const chainIdNum = config.chainId ?? CHAINS.BSC.chainId;
42
+ const chainName = chainIdNum === CHAINS.MONAD.chainId ? 'Monad' : chainIdNum === CHAINS.BSC.chainId ? 'BSC' : `Chain-${chainIdNum}`;
43
+ const provider = new ethers.JsonRpcProvider(config.rpcUrl, { chainId: chainIdNum, name: chainName });
44
+ const txType = getTxType(config);
45
+ const isNative = _isNativeTokenAddress(tokenAddress);
46
+ const nonceManager = new NonceManager(provider);
47
+ // hop 私钥链优先使用传入
48
+ const providedHops = (() => {
49
+ if (hopPrivateKeys && hopPrivateKeys.length > 0) {
50
+ if (hopPrivateKeys.length !== pairCount) {
51
+ throw new Error(`hopPrivateKeys length (${hopPrivateKeys.length}) must match pair count (${pairCount})`);
52
+ }
53
+ return hopPrivateKeys.every(h => h.length === 0) ? null : hopPrivateKeys;
54
+ }
55
+ return null;
56
+ })();
57
+ const preparedHops = providedHops ?? _generateHopWallets(pairCount, hopCount);
58
+ const hasHops = preparedHops !== null;
59
+ const maxHopCount = hasHops ? Math.max(...preparedHops.map(h => h.length)) : 0;
60
+ const finalGasLimit = _calculateGasLimit(config, isNative, hasHops, maxHopCount);
61
+ const nativeGasLimit = (config.prefer21000ForNative ?? false) ? BRIBE_GAS_LIMIT : finalGasLimit;
62
+ // 与 disperse/swap.ts 保持一致:多跳场景固定 gas limit
63
+ const nativeTransferGasLimit = NATIVE_TRANSFER_GAS_LIMIT;
64
+ const erc20TransferGasLimit = GAS_LIMITS.ERC20_TRANSFER;
65
+ const [gasPrice, decimals] = await Promise.all([
66
+ getOptimizedGasPrice(provider, getGasPriceConfig(config)),
67
+ isNative ? Promise.resolve(18) : Promise.resolve(tokenDecimals ?? await _getErc20DecimalsMerkle(provider, tokenAddress, chainIdNum))
68
+ ]);
69
+ const gasFields = buildGasFields(txType, gasPrice);
70
+ const iface = isNative ? null : new ethers.Interface(['function transfer(address,uint256) returns (bool)']);
71
+ // ✅ 费用:按地址数量收取固定费用(原生代币),由第一个 sender 支付
72
+ const extractProfit = shouldExtractProfit(config);
73
+ const profitAddr = getProfitRecipient();
74
+ let totalAmountBeforeProfit = 0n;
75
+ let totalProfitNative = 0n;
76
+ const parsedAmountsWei = normalizedAmounts.map(v => {
77
+ const amt = isNative ? ethers.parseEther(v) : ethers.parseUnits(v, decimals);
78
+ totalAmountBeforeProfit += amt;
79
+ return amt;
80
+ });
81
+ // ✅ 按地址数量收取固定费用
82
+ if (extractProfit && pairCount > 0) {
83
+ totalProfitNative = calculateTransferFee(chainIdNum, pairCount);
84
+ }
85
+ // ✅ BSC 链贿赂支持(由第一个 sender 支付)
86
+ const bribeAmount = chainIdNum === CHAINS.BSC.chainId ? getBribeAmount(config) : 0n;
87
+ const needBribeTx = bribeAmount > 0n;
88
+ const bribeSignedTx = [];
89
+ // 计算每个 sender 需要的 nonce 数量(聚合到地址)
90
+ const senderWallets = senderPrivateKeys.map(pk => new Wallet(pk, provider));
91
+ const senderAddrLowerList = senderWallets.map(w => w.address.toLowerCase());
92
+ const firstSenderAddrLower = senderAddrLowerList[0];
93
+ const nonceNeedBySender = new Map();
94
+ for (let i = 0; i < pairCount; i++) {
95
+ const addrLower = senderAddrLowerList[i];
96
+ const hopLen = preparedHops ? preparedHops[i].length : 0;
97
+ const perPairTxCount = (() => {
98
+ if (isNative)
99
+ return 1;
100
+ return hopLen > 0 ? 2 : 1;
101
+ })();
102
+ const cur = nonceNeedBySender.get(addrLower);
103
+ if (cur)
104
+ cur.count += perPairTxCount;
105
+ else
106
+ nonceNeedBySender.set(addrLower, { wallet: senderWallets[i], count: perPairTxCount });
107
+ }
108
+ // ✅ 贿赂交易需要 1 个额外的 nonce
109
+ if (needBribeTx) {
110
+ const cur = nonceNeedBySender.get(firstSenderAddrLower);
111
+ if (cur)
112
+ cur.count += 1;
113
+ }
114
+ if (extractProfit && totalProfitNative > 0n) {
115
+ const cur = nonceNeedBySender.get(firstSenderAddrLower);
116
+ if (cur)
117
+ cur.count += 1;
118
+ }
119
+ const nonceQueueBySender = new Map();
120
+ for (const [addrLower, entry] of nonceNeedBySender.entries()) {
121
+ const count = entry.count;
122
+ const nonces = (addrLower === firstSenderAddrLower && startNonce !== undefined)
123
+ ? Array.from({ length: count }, (_, i) => startNonce + i)
124
+ : await nonceManager.getNextNonceBatch(entry.wallet, count);
125
+ nonceQueueBySender.set(addrLower, nonces);
126
+ }
127
+ const popNonce = (addrLower) => {
128
+ const q = nonceQueueBySender.get(addrLower);
129
+ if (!q || q.length === 0)
130
+ throw new Error(`nonce queue empty for sender ${addrLower}`);
131
+ return q.shift();
132
+ };
133
+ const txsToSign = [];
134
+ const nativeHopGasFee = nativeTransferGasLimit * gasPrice;
135
+ const erc20HopGasFee = erc20TransferGasLimit * gasPrice;
136
+ const nativeHopGasFeeForErc20 = nativeTransferGasLimit * gasPrice;
137
+ for (let i = 0; i < pairCount; i++) {
138
+ const senderWallet = senderWallets[i];
139
+ const senderLower = senderAddrLowerList[i];
140
+ const to = receiverAddresses[i];
141
+ const amtWei = parsedAmountsWei[i];
142
+ const hopChain = preparedHops ? preparedHops[i] : [];
143
+ if (!hopChain || hopChain.length === 0) {
144
+ const nonce = popNonce(senderLower);
145
+ if (isNative) {
146
+ txsToSign.push({
147
+ wallet: senderWallet,
148
+ tx: { to, value: amtWei, nonce, gasLimit: nativeGasLimit, chainId: chainIdNum, ...gasFields }
149
+ });
150
+ }
151
+ else {
152
+ const data = iface.encodeFunctionData('transfer', [to, amtWei]);
153
+ txsToSign.push({
154
+ wallet: senderWallet,
155
+ tx: { to: tokenAddress, data, value: 0n, nonce, gasLimit: finalGasLimit, chainId: chainIdNum, ...gasFields }
156
+ });
157
+ }
158
+ continue;
159
+ }
160
+ const fullChain = [senderWallet, ...hopChain.map(w => new Wallet(typeof w === 'string' ? w : w.privateKey, provider))];
161
+ const addresses = [...fullChain.map(w => w.address), to];
162
+ if (isNative) {
163
+ for (let j = 0; j < addresses.length - 1; j++) {
164
+ const fromWallet = fullChain[j];
165
+ const toAddress = addresses[j + 1];
166
+ const nonce = j === 0 ? popNonce(senderLower) : 0;
167
+ const remainingHops = addresses.length - 2 - j;
168
+ const additionalGas = nativeHopGasFee * BigInt(remainingHops);
169
+ const transferValue = amtWei + additionalGas;
170
+ txsToSign.push({
171
+ wallet: fromWallet,
172
+ tx: { to: toAddress, value: transferValue, nonce, gasLimit: nativeTransferGasLimit, chainId: chainIdNum, ...gasFields }
173
+ });
174
+ }
175
+ }
176
+ else {
177
+ const hopGasNeeds = [];
178
+ for (let j = hopChain.length - 1; j >= 0; j--) {
179
+ if (j === hopChain.length - 1)
180
+ hopGasNeeds.unshift(erc20HopGasFee);
181
+ else {
182
+ const nextHopGas = hopGasNeeds[0];
183
+ hopGasNeeds.unshift(nativeHopGasFeeForErc20 + erc20HopGasFee + nextHopGas);
184
+ }
185
+ }
186
+ txsToSign.push({
187
+ wallet: senderWallet,
188
+ tx: {
189
+ to: fullChain[1].address,
190
+ value: hopGasNeeds[0],
191
+ nonce: popNonce(senderLower),
192
+ gasLimit: nativeTransferGasLimit,
193
+ chainId: chainIdNum,
194
+ ...gasFields
195
+ }
196
+ });
197
+ const mainToFirstHopData = iface.encodeFunctionData('transfer', [fullChain[1].address, amtWei]);
198
+ txsToSign.push({
199
+ wallet: senderWallet,
200
+ tx: {
201
+ to: tokenAddress,
202
+ data: mainToFirstHopData,
203
+ value: 0n,
204
+ nonce: popNonce(senderLower),
205
+ gasLimit: erc20TransferGasLimit,
206
+ chainId: chainIdNum,
207
+ ...gasFields
208
+ }
209
+ });
210
+ // hop wallets:逐层传递
211
+ for (let j = 1; j < fullChain.length; j++) {
212
+ const fromWallet = fullChain[j];
213
+ const toAddress = addresses[j + 1];
214
+ const isLastHop = j === fullChain.length - 1;
215
+ if (!isLastHop) {
216
+ const gasToTransfer = hopGasNeeds[j];
217
+ txsToSign.push({
218
+ wallet: fromWallet,
219
+ tx: {
220
+ to: toAddress,
221
+ value: gasToTransfer,
222
+ nonce: 0,
223
+ gasLimit: nativeTransferGasLimit,
224
+ chainId: chainIdNum,
225
+ ...gasFields
226
+ }
227
+ });
228
+ const erc20Data = iface.encodeFunctionData('transfer', [toAddress, amtWei]);
229
+ txsToSign.push({
230
+ wallet: fromWallet,
231
+ tx: {
232
+ to: tokenAddress,
233
+ data: erc20Data,
234
+ value: 0n,
235
+ nonce: 1,
236
+ gasLimit: erc20TransferGasLimit,
237
+ chainId: chainIdNum,
238
+ ...gasFields
239
+ }
240
+ });
241
+ }
242
+ else {
243
+ const erc20Data = iface.encodeFunctionData('transfer', [toAddress, amtWei]);
244
+ txsToSign.push({
245
+ wallet: fromWallet,
246
+ tx: {
247
+ to: tokenAddress,
248
+ data: erc20Data,
249
+ value: 0n,
250
+ nonce: 0,
251
+ gasLimit: erc20TransferGasLimit,
252
+ chainId: chainIdNum,
253
+ ...gasFields
254
+ }
255
+ });
256
+ }
257
+ }
258
+ }
259
+ }
260
+ if (needBribeTx) {
261
+ const firstSenderWallet = senderWallets[0];
262
+ const bribeNonce = popNonce(firstSenderAddrLower);
263
+ const bribeTx = await firstSenderWallet.signTransaction({
264
+ to: BLOCKRAZOR_BUILDER_EOA,
265
+ value: bribeAmount,
266
+ nonce: bribeNonce,
267
+ gasLimit: BRIBE_GAS_LIMIT,
268
+ chainId: chainIdNum,
269
+ ...gasFields
270
+ });
271
+ bribeSignedTx.push(bribeTx);
272
+ }
273
+ const signedTxs = await Promise.all(txsToSign.map(({ wallet, tx }) => wallet.signTransaction(tx)));
274
+ // 利润多跳(固定 2 hop)
275
+ let profitHopWallets;
276
+ if (extractProfit && totalProfitNative > 0n) {
277
+ const firstSenderWallet = senderWallets[0];
278
+ const profitNonce = popNonce(firstSenderAddrLower);
279
+ const profitHopResult = await buildProfitHopTransactions({
280
+ provider,
281
+ payerWallet: firstSenderWallet,
282
+ profitAmount: totalProfitNative,
283
+ profitRecipient: profitAddr,
284
+ hopCount: PROFIT_HOP_COUNT,
285
+ gasPrice,
286
+ chainId: chainIdNum,
287
+ txType,
288
+ startNonce: profitNonce
289
+ });
290
+ signedTxs.push(...profitHopResult.signedTransactions);
291
+ profitHopWallets = profitHopResult.hopWallets;
292
+ }
293
+ return {
294
+ signedTransactions: [...bribeSignedTx, ...signedTxs], // ✅ 贿赂交易放在最前面
295
+ hopWallets: preparedHops || undefined,
296
+ profitHopWallets,
297
+ metadata: extractProfit ? {
298
+ pairCount,
299
+ isNative,
300
+ tokenAddress: isNative ? undefined : tokenAddress,
301
+ totalAmount: isNative ? ethers.formatEther(totalAmountBeforeProfit) : ethers.formatUnits(totalAmountBeforeProfit, decimals),
302
+ profitAmount: ethers.formatEther(totalProfitNative),
303
+ profitRecipient: profitAddr,
304
+ hasBribeTx: bribeSignedTx.length > 0, // ✅ 标记是否有贿赂交易
305
+ bribeAmount: bribeSignedTx.length > 0 ? ethers.formatEther(bribeAmount) : undefined
306
+ } : undefined
307
+ };
308
+ }
@@ -1,28 +1 @@
1
- /**
2
- * PancakeSwap 官方 Router 交易模块
3
- *
4
- * ✅ 使用官方 PancakeSwap V2/V3 Router(非代理合约)
5
- * - V2 Router: 0x10ED43C718714eb63d5aA57B78B54704E256024E
6
- * - V3 Router: 0x13f4EA83D0bd40E75C8222255bc855a974568Dd4
7
- * - V3 Quoter: 0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997
8
- */
9
- import { FourPancakeProxyBatchBuySignParams, FourPancakeProxyBatchBuyResult, FourPancakeProxyBatchSellSignParams, FourPancakeProxyBatchSellResult, FourPancakeProxyApprovalParams, FourPancakeProxyApprovalBatchParams, FourPancakeProxyApprovalBatchResult } from './types.js';
10
- /**
11
- * ✅ 授权代币给 PancakeSwap Router(根据 routeType 选择 V2/V3)
12
- */
13
- export declare function approveFourPancakeProxy(params: FourPancakeProxyApprovalParams): Promise<{
14
- txHash: string;
15
- approved: boolean;
16
- }>;
17
- /**
18
- * ✅ 批量授权代币给 PancakeSwap Router
19
- */
20
- export declare function approveFourPancakeProxyBatch(params: FourPancakeProxyApprovalBatchParams): Promise<FourPancakeProxyApprovalBatchResult>;
21
- /**
22
- * ✅ 使用 PancakeSwap 官方 Router 批量购买代币
23
- */
24
- export declare function fourPancakeProxyBatchBuyMerkle(params: FourPancakeProxyBatchBuySignParams): Promise<FourPancakeProxyBatchBuyResult>;
25
- /**
26
- * ✅ 使用 PancakeSwap 官方 Router 批量卖出代币
27
- */
28
- export declare function fourPancakeProxyBatchSellMerkle(params: FourPancakeProxyBatchSellSignParams): Promise<FourPancakeProxyBatchSellResult>;
1
+ export { fourPancakeProxyBatchBuyMerkle, fourPancakeProxyBatchSellMerkle, approveFourPancakeProxy, approveFourPancakeProxyBatch, } from '../../../bundle-core/four-meme/pancake-proxy.js';