four-flap-meme-sdk 2.2.19 → 2.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/dist/__tests__/subpath-exports.test.d.ts +1 -0
  2. package/dist/__tests__/subpath-exports.test.js +64 -0
  3. package/dist/abis/common.d.ts +85 -0
  4. package/dist/abis/common.js +240 -0
  5. package/dist/abis/contracts/TaxToken.json +969 -0
  6. package/dist/abis/contracts/TokenManager.json +836 -0
  7. package/dist/abis/contracts/TokenManager2.json +136 -0
  8. package/dist/abis/contracts/TokenManagerHelper3.json +993 -0
  9. package/dist/abis/contracts/index.d.ts +5 -0
  10. package/dist/abis/contracts/index.js +5 -0
  11. package/dist/abis/flap/index.d.ts +5 -0
  12. package/dist/abis/flap/index.js +5 -0
  13. package/dist/abis/flap/portal-eip7702.d.ts +4 -0
  14. package/dist/abis/flap/portal-eip7702.js +39 -0
  15. package/dist/abis/flap/portal-events.d.ts +6 -0
  16. package/dist/abis/flap/portal-events.js +17 -0
  17. package/dist/abis/flap/portal-merkle.d.ts +4 -0
  18. package/dist/abis/flap/portal-merkle.js +25 -0
  19. package/dist/abis/flap/portal.d.ts +6 -0
  20. package/dist/abis/flap/portal.js +37 -0
  21. package/dist/abis/flap/vault.d.ts +171 -0
  22. package/dist/abis/flap/vault.js +91 -0
  23. package/dist/abis/index.d.ts +8 -0
  24. package/dist/abis/index.js +11 -0
  25. package/dist/bundle-core/__tests__/config-helpers.test.d.ts +1 -0
  26. package/dist/bundle-core/__tests__/config-helpers.test.js +28 -0
  27. package/dist/bundle-core/__tests__/facade-parity.test.d.ts +1 -0
  28. package/dist/bundle-core/__tests__/facade-parity.test.js +33 -0
  29. package/dist/bundle-core/__tests__/sign-context-helpers.test.d.ts +1 -0
  30. package/dist/bundle-core/__tests__/sign-context-helpers.test.js +60 -0
  31. package/dist/bundle-core/__tests__/sign-fixture.test.d.ts +1 -0
  32. package/dist/bundle-core/__tests__/sign-fixture.test.js +220 -0
  33. package/dist/bundle-core/__tests__/sign-fixtures.d.ts +10 -0
  34. package/dist/bundle-core/__tests__/sign-fixtures.js +16 -0
  35. package/dist/bundle-core/config-helpers.d.ts +37 -0
  36. package/dist/bundle-core/config-helpers.js +58 -0
  37. package/dist/bundle-core/errors.d.ts +50 -0
  38. package/dist/bundle-core/errors.js +38 -0
  39. package/dist/bundle-core/four-meme/approve-tokenmanager.d.ts +7 -0
  40. package/dist/bundle-core/four-meme/approve-tokenmanager.js +99 -0
  41. package/dist/bundle-core/four-meme/core-helpers.d.ts +8 -0
  42. package/dist/bundle-core/four-meme/core-helpers.js +41 -0
  43. package/dist/bundle-core/four-meme/core.d.ts +4 -0
  44. package/dist/bundle-core/four-meme/core.js +515 -0
  45. package/dist/bundle-core/four-meme/pancake-proxy.d.ts +28 -0
  46. package/dist/bundle-core/four-meme/pancake-proxy.js +679 -0
  47. package/dist/bundle-core/four-meme/private.d.ts +27 -0
  48. package/dist/bundle-core/four-meme/private.js +465 -0
  49. package/dist/bundle-core/four-meme/sign-context-helpers.d.ts +2 -0
  50. package/dist/bundle-core/four-meme/sign-context-helpers.js +2 -0
  51. package/dist/bundle-core/four-meme/swap-buy-first.d.ts +8 -0
  52. package/dist/bundle-core/four-meme/swap-buy-first.js +456 -0
  53. package/dist/bundle-core/four-meme/swap-hop-helpers.d.ts +6 -0
  54. package/dist/bundle-core/four-meme/swap-hop-helpers.js +63 -0
  55. package/dist/bundle-core/four-meme/swap-internal.d.ts +3 -0
  56. package/dist/bundle-core/four-meme/swap-internal.js +18 -0
  57. package/dist/bundle-core/four-meme/swap-sign-helpers.d.ts +28 -0
  58. package/dist/bundle-core/four-meme/swap-sign-helpers.js +105 -0
  59. package/dist/bundle-core/four-meme/swap.d.ts +17 -0
  60. package/dist/bundle-core/four-meme/swap.js +505 -0
  61. package/dist/bundle-core/four-meme/types/buy-first.d.ts +50 -0
  62. package/dist/bundle-core/four-meme/types/buy-first.js +1 -0
  63. package/dist/bundle-core/four-meme/types/core-flow.d.ts +63 -0
  64. package/dist/bundle-core/four-meme/types/core-flow.js +1 -0
  65. package/dist/bundle-core/four-meme/types/index.d.ts +600 -0
  66. package/dist/bundle-core/four-meme/types/index.js +1 -0
  67. package/dist/bundle-core/four-meme/types/swap-internal.d.ts +19 -0
  68. package/dist/bundle-core/four-meme/types/swap-internal.js +1 -0
  69. package/dist/bundle-core/four-meme/types.d.ts +1 -0
  70. package/dist/bundle-core/four-meme/types.js +1 -0
  71. package/dist/bundle-core/four-meme/utils-disperse.d.ts +7 -0
  72. package/dist/bundle-core/four-meme/utils-disperse.js +396 -0
  73. package/dist/bundle-core/four-meme/utils-pairwise.d.ts +8 -0
  74. package/dist/bundle-core/four-meme/utils-pairwise.js +328 -0
  75. package/dist/bundle-core/four-meme/utils-sweep.d.ts +8 -0
  76. package/dist/bundle-core/four-meme/utils-sweep.js +744 -0
  77. package/dist/bundle-core/index.d.ts +8 -0
  78. package/dist/bundle-core/index.js +8 -0
  79. package/dist/bundle-core/internal.d.ts +16 -0
  80. package/dist/bundle-core/internal.js +160 -0
  81. package/dist/bundle-core/sign-context-helpers.d.ts +26 -0
  82. package/dist/bundle-core/sign-context-helpers.js +63 -0
  83. package/dist/bundle-core/submit.d.ts +293 -0
  84. package/dist/bundle-core/submit.js +731 -0
  85. package/dist/bundle-core/types/index.d.ts +8 -0
  86. package/dist/bundle-core/types/index.js +1 -0
  87. package/dist/bundle-core/types.d.ts +1 -0
  88. package/dist/bundle-core/types.js +1 -0
  89. package/dist/chains/bsc/four/approve-tokenmanager.d.ts +1 -26
  90. package/dist/chains/bsc/four/approve-tokenmanager.js +1 -113
  91. package/dist/chains/bsc/four/config.d.ts +5 -67
  92. package/dist/chains/bsc/four/config.js +2 -114
  93. package/dist/chains/bsc/four/core.d.ts +1 -4
  94. package/dist/chains/bsc/four/core.js +1 -592
  95. package/dist/chains/bsc/four/index.d.ts +6 -6
  96. package/dist/chains/bsc/four/index.js +6 -6
  97. package/dist/chains/bsc/four/internal.d.ts +2 -46
  98. package/dist/chains/bsc/four/internal.js +2 -239
  99. package/dist/chains/bsc/four/pancake-proxy.d.ts +1 -28
  100. package/dist/chains/bsc/four/pancake-proxy.js +1 -687
  101. package/dist/chains/bsc/four/private.d.ts +1 -27
  102. package/dist/chains/bsc/four/private.js +1 -477
  103. package/dist/chains/bsc/four/submit.d.ts +2 -315
  104. package/dist/chains/bsc/four/submit.js +2 -752
  105. package/dist/chains/bsc/four/swap-buy-first.d.ts +2 -55
  106. package/dist/chains/bsc/four/swap-buy-first.js +2 -507
  107. package/dist/chains/bsc/four/swap-internal.d.ts +1 -3
  108. package/dist/chains/bsc/four/swap-internal.js +1 -18
  109. package/dist/chains/bsc/four/swap.d.ts +2 -144
  110. package/dist/chains/bsc/four/swap.js +2 -766
  111. package/dist/chains/bsc/four/types.d.ts +1 -476
  112. package/dist/chains/bsc/four/utils-disperse.d.ts +1 -0
  113. package/dist/chains/bsc/four/utils-disperse.js +1 -0
  114. package/dist/chains/bsc/four/utils-pairwise.d.ts +1 -0
  115. package/dist/chains/bsc/four/utils-pairwise.js +1 -0
  116. package/dist/chains/bsc/four/utils-sweep.d.ts +1 -0
  117. package/dist/chains/bsc/four/utils-sweep.js +1 -0
  118. package/dist/chains/bsc/four/utils.d.ts +5 -18
  119. package/dist/chains/bsc/four/utils.js +5 -1552
  120. package/dist/chains/bsc/iro.d.ts +5 -0
  121. package/dist/chains/bsc/iro.js +4 -0
  122. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.d.ts +155 -0
  123. package/dist/chains/bsc/pancake/bundle-buy-first-helpers.js +80 -0
  124. package/dist/chains/bsc/pancake/bundle-buy-first.d.ts +1 -91
  125. package/dist/chains/bsc/pancake/bundle-buy-first.js +98 -213
  126. package/dist/chains/bsc/pancake/bundle-swap-helpers.d.ts +241 -0
  127. package/dist/chains/bsc/pancake/bundle-swap-helpers.js +565 -0
  128. package/dist/chains/bsc/pancake/bundle-swap.d.ts +1 -79
  129. package/dist/chains/bsc/pancake/bundle-swap.js +114 -726
  130. package/dist/chains/bsc/pancake/index.d.ts +4 -2
  131. package/dist/chains/bsc/pancake/index.js +1 -3
  132. package/dist/chains/bsc/platforms/iro/factory.d.ts +2 -2
  133. package/dist/chains/bsc/platforms/iro/factory.js +3 -1
  134. package/dist/chains/bsc/platforms/iro/index.d.ts +5 -5
  135. package/dist/chains/bsc/platforms/iro/index.js +3 -3
  136. package/dist/chains/bsc/platforms/iro/pool.js +31 -10
  137. package/dist/chains/bsc/platforms/iro/token.js +4 -1
  138. package/dist/chains/eni/batch-router/bundle-approve.js +4 -3
  139. package/dist/chains/eni/batch-router/transfer.js +55 -25
  140. package/dist/chains/eni/batch-router/utils.js +32 -6
  141. package/dist/chains/eni/bundler/sign.js +5 -6
  142. package/dist/chains/eni/bundler/submit.js +1 -4
  143. package/dist/chains/eni/constants.js +1 -1
  144. package/dist/chains/eni/flat-aliases.d.ts +10 -0
  145. package/dist/chains/eni/flat-aliases.js +8 -0
  146. package/dist/chains/eni/index.d.ts +2 -1
  147. package/dist/chains/eni/index.js +1 -0
  148. package/dist/chains/eni/platforms/daoaas/create.js +2 -2
  149. package/dist/chains/eni/platforms/daoaas/index.d.ts +3 -3
  150. package/dist/chains/eni/platforms/daoaas/index.js +3 -3
  151. package/dist/chains/eni/platforms/daoaas/meta.js +9 -6
  152. package/dist/chains/eni/platforms/daoaas/portal-direct.js +28 -44
  153. package/dist/chains/eni/platforms/daoaas/portal.js +10 -6
  154. package/dist/chains/eni/platforms/dswap/liquidity.js +58 -26
  155. package/dist/chains/eni/platforms/fair-launch/index.d.ts +2 -2
  156. package/dist/chains/eni/platforms/fair-launch/index.js +1 -1
  157. package/dist/chains/eni/platforms/fair-launch/launcher.js +87 -46
  158. package/dist/chains/eni/platforms/fair-launch/pool.js +4 -1
  159. package/dist/chains/eni/platforms/fair-launch/presets.js +2 -2
  160. package/dist/chains/eni/platforms/iro/factory.d.ts +2 -2
  161. package/dist/chains/eni/platforms/iro/factory.js +3 -1
  162. package/dist/chains/eni/platforms/iro/index.d.ts +6 -6
  163. package/dist/chains/eni/platforms/iro/index.js +4 -4
  164. package/dist/chains/eni/platforms/iro/pool.js +90 -26
  165. package/dist/chains/eni/platforms/iro/token.js +107 -31
  166. package/dist/chains/eni/platforms/iro/whitelist.js +6 -18
  167. package/dist/chains/eni/submit.d.ts +43 -0
  168. package/dist/chains/eni/submit.js +287 -0
  169. package/dist/chains/index.d.ts +13 -0
  170. package/dist/chains/index.js +13 -0
  171. package/dist/chains/xlayer/constants.d.ts +5 -0
  172. package/dist/chains/xlayer/eip7702/bundle-approve.d.ts +2 -26
  173. package/dist/chains/xlayer/eip7702/bundle-approve.js +11 -21
  174. package/dist/chains/xlayer/eip7702/bundle-buy.d.ts +2 -6
  175. package/dist/chains/xlayer/eip7702/bundle-buy.js +13 -51
  176. package/dist/chains/xlayer/eip7702/bundle-create.js +104 -74
  177. package/dist/chains/xlayer/eip7702/bundle-sell.d.ts +2 -6
  178. package/dist/chains/xlayer/eip7702/bundle-sell.js +29 -111
  179. package/dist/chains/xlayer/eip7702/bundle-swap.d.ts +3 -65
  180. package/dist/chains/xlayer/eip7702/bundle-swap.js +51 -245
  181. package/dist/chains/xlayer/eip7702/constants.d.ts +11 -26
  182. package/dist/chains/xlayer/eip7702/constants.js +15 -68
  183. package/dist/chains/xlayer/eip7702/flat-aliases.d.ts +13 -0
  184. package/dist/chains/xlayer/eip7702/flat-aliases.js +10 -0
  185. package/dist/chains/xlayer/eip7702/index.d.ts +28 -46
  186. package/dist/chains/xlayer/eip7702/index.js +28 -81
  187. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.d.ts +79 -0
  188. package/dist/chains/xlayer/eip7702/multi-hop-transfer-helpers.js +1 -0
  189. package/dist/chains/xlayer/eip7702/multi-hop-transfer.d.ts +2 -203
  190. package/dist/chains/xlayer/eip7702/multi-hop-transfer.js +63 -307
  191. package/dist/chains/xlayer/eip7702/transfer-context-helpers.d.ts +26 -0
  192. package/dist/chains/xlayer/eip7702/transfer-context-helpers.js +58 -0
  193. package/dist/chains/xlayer/eip7702/types.d.ts +88 -0
  194. package/dist/chains/xlayer/eip7702/utils.d.ts +0 -3
  195. package/dist/chains/xlayer/eip7702/utils.js +23 -28
  196. package/dist/chains/xlayer/eip7702/volume-helpers.d.ts +148 -0
  197. package/dist/chains/xlayer/eip7702/volume-helpers.js +48 -0
  198. package/dist/chains/xlayer/eip7702/volume.d.ts +6 -184
  199. package/dist/chains/xlayer/eip7702/volume.js +89 -164
  200. package/dist/chains/xlayer/eoa/constants.d.ts +1 -1
  201. package/dist/chains/xlayer/eoa/constants.js +2 -16
  202. package/dist/chains/xlayer/eoa/dex-helpers.d.ts +1 -1
  203. package/dist/chains/xlayer/eoa/dex-helpers.js +7 -37
  204. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.d.ts +126 -0
  205. package/dist/chains/xlayer/eoa/eoa-bundle-swap-helpers.js +228 -0
  206. package/dist/chains/xlayer/eoa/eoa-bundle-swap.d.ts +1 -95
  207. package/dist/chains/xlayer/eoa/eoa-bundle-swap.js +66 -299
  208. package/dist/chains/xlayer/eoa/eoa-wash-volume.d.ts +1 -1
  209. package/dist/chains/xlayer/eoa/eoa-wash-volume.js +18 -23
  210. package/dist/chains/xlayer/eoa/index.d.ts +10 -6
  211. package/dist/chains/xlayer/eoa/index.js +8 -23
  212. package/dist/chains/xlayer/eoa/portal-ops.js +7 -2
  213. package/dist/chains/xlayer/eoa/router-manager.js +5 -4
  214. package/dist/chains/xlayer/eoa/types.d.ts +2 -2
  215. package/dist/chains/xlayer/eoa/types.js +1 -3
  216. package/dist/chains/xlayer/index.d.ts +3 -2
  217. package/dist/chains/xlayer/index.js +4 -7
  218. package/dist/contracts/helper3.d.ts +20 -5
  219. package/dist/contracts/helper3.js +56 -20
  220. package/dist/contracts/tm-bundle-helpers.d.ts +88 -0
  221. package/dist/contracts/tm-bundle-helpers.js +73 -0
  222. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.d.ts +1 -26
  223. package/dist/contracts/tm-bundle-merkle/approve-tokenmanager.js +1 -113
  224. package/dist/contracts/tm-bundle-merkle/config.d.ts +5 -67
  225. package/dist/contracts/tm-bundle-merkle/config.js +2 -114
  226. package/dist/contracts/tm-bundle-merkle/core.d.ts +1 -4
  227. package/dist/contracts/tm-bundle-merkle/core.js +1 -591
  228. package/dist/contracts/tm-bundle-merkle/index.d.ts +5 -5
  229. package/dist/contracts/tm-bundle-merkle/index.js +5 -5
  230. package/dist/contracts/tm-bundle-merkle/internal.d.ts +2 -46
  231. package/dist/contracts/tm-bundle-merkle/internal.js +2 -238
  232. package/dist/contracts/tm-bundle-merkle/pancake-proxy.d.ts +1 -28
  233. package/dist/contracts/tm-bundle-merkle/pancake-proxy.js +1 -686
  234. package/dist/contracts/tm-bundle-merkle/private.d.ts +1 -27
  235. package/dist/contracts/tm-bundle-merkle/private.js +1 -476
  236. package/dist/contracts/tm-bundle-merkle/submit.d.ts +3 -314
  237. package/dist/contracts/tm-bundle-merkle/submit.js +3 -928
  238. package/dist/contracts/tm-bundle-merkle/swap-buy-first.d.ts +2 -55
  239. package/dist/contracts/tm-bundle-merkle/swap-buy-first.js +2 -506
  240. package/dist/contracts/tm-bundle-merkle/swap-internal.d.ts +1 -3
  241. package/dist/contracts/tm-bundle-merkle/swap-internal.js +1 -18
  242. package/dist/contracts/tm-bundle-merkle/swap.d.ts +2 -144
  243. package/dist/contracts/tm-bundle-merkle/swap.js +2 -764
  244. package/dist/contracts/tm-bundle-merkle/types.d.ts +1 -476
  245. package/dist/contracts/tm-bundle-merkle/utils-disperse.d.ts +1 -0
  246. package/dist/contracts/tm-bundle-merkle/utils-disperse.js +1 -0
  247. package/dist/contracts/tm-bundle-merkle/utils-pairwise.d.ts +1 -0
  248. package/dist/contracts/tm-bundle-merkle/utils-pairwise.js +1 -0
  249. package/dist/contracts/tm-bundle-merkle/utils-sweep.d.ts +1 -0
  250. package/dist/contracts/tm-bundle-merkle/utils-sweep.js +1 -0
  251. package/dist/contracts/tm-bundle-merkle/utils.d.ts +6 -18
  252. package/dist/contracts/tm-bundle-merkle/utils.js +6 -1501
  253. package/dist/contracts/tm-bundle.d.ts +3 -51
  254. package/dist/contracts/tm-bundle.js +120 -187
  255. package/dist/contracts/tm.d.ts +10 -8
  256. package/dist/contracts/tm.js +39 -35
  257. package/dist/contracts/tm1.js +9 -4
  258. package/dist/contracts/tm2.js +10 -5
  259. package/dist/dex/direct-router-helpers.d.ts +269 -0
  260. package/dist/dex/direct-router-helpers.js +536 -0
  261. package/dist/dex/direct-router.d.ts +3 -125
  262. package/dist/dex/direct-router.js +244 -672
  263. package/dist/dex/types.d.ts +81 -0
  264. package/dist/dex/types.js +1 -0
  265. package/dist/exports/root-bundle-and-tooling.d.ts +27 -0
  266. package/dist/exports/root-bundle-and-tooling.js +30 -0
  267. package/dist/exports/root-eni-and-bsc-iro.d.ts +26 -0
  268. package/dist/exports/root-eni-and-bsc-iro.js +66 -0
  269. package/dist/exports/root-foundations.d.ts +35 -0
  270. package/dist/exports/root-foundations.js +70 -0
  271. package/dist/exports/root-swap-dex-and-xlayer.d.ts +30 -0
  272. package/dist/exports/root-swap-dex-and-xlayer.js +78 -0
  273. package/dist/flap/index.d.ts +11 -0
  274. package/dist/flap/index.js +9 -0
  275. package/dist/flows/create.d.ts +2 -1
  276. package/dist/flows/create.js +6 -6
  277. package/dist/flows/index.d.ts +9 -0
  278. package/dist/flows/index.js +9 -0
  279. package/dist/index.d.ts +20 -88
  280. package/dist/index.js +20 -218
  281. package/dist/merkle/index.d.ts +12 -0
  282. package/dist/merkle/index.js +11 -0
  283. package/dist/shared/abis/common.d.ts +2 -83
  284. package/dist/shared/abis/common.js +2 -254
  285. package/dist/shared/abis/index.d.ts +5 -6
  286. package/dist/shared/abis/index.js +5 -7
  287. package/dist/shared/clients/blockrazor.d.ts +4 -8
  288. package/dist/shared/clients/blockrazor.js +43 -35
  289. package/dist/shared/clients/club48.d.ts +2 -2
  290. package/dist/shared/clients/club48.js +36 -30
  291. package/dist/shared/clients/emitservice.js +2 -0
  292. package/dist/shared/clients/four.d.ts +21 -6
  293. package/dist/shared/clients/four.js +29 -24
  294. package/dist/shared/clients/index.d.ts +8 -0
  295. package/dist/shared/clients/index.js +8 -0
  296. package/dist/shared/clients/merkle.d.ts +4 -3
  297. package/dist/shared/clients/merkle.js +30 -47
  298. package/dist/shared/constants/addresses.d.ts +27 -1
  299. package/dist/shared/constants/addresses.js +39 -2
  300. package/dist/shared/constants/chains.d.ts +1 -1
  301. package/dist/shared/constants/chains.js +1 -1
  302. package/dist/shared/constants/gas.d.ts +1 -1
  303. package/dist/shared/constants/gas.js +2 -6
  304. package/dist/shared/constants/index.d.ts +4 -1
  305. package/dist/shared/constants/index.js +2 -1
  306. package/dist/shared/constants/quote.d.ts +30 -0
  307. package/dist/shared/constants/quote.js +37 -0
  308. package/dist/shared/flap/abi.js +1 -1
  309. package/dist/shared/flap/constants.d.ts +1 -2
  310. package/dist/shared/flap/constants.js +3 -4
  311. package/dist/shared/flap/curve.js +3 -0
  312. package/dist/shared/flap/errors.d.ts +1 -4
  313. package/dist/shared/flap/errors.js +20 -1
  314. package/dist/shared/flap/index.d.ts +4 -5
  315. package/dist/shared/flap/index.js +4 -5
  316. package/dist/shared/flap/launch-v6.d.ts +0 -5
  317. package/dist/shared/flap/launch-v6.js +2 -16
  318. package/dist/shared/flap/meta.d.ts +22 -18
  319. package/dist/shared/flap/meta.js +32 -24
  320. package/dist/shared/flap/permit.js +10 -3
  321. package/dist/shared/flap/pinata.d.ts +22 -6
  322. package/dist/shared/flap/pinata.js +21 -26
  323. package/dist/shared/flap/portal-bundle-merkle/config.d.ts +3 -72
  324. package/dist/shared/flap/portal-bundle-merkle/config.js +4 -124
  325. package/dist/shared/flap/portal-bundle-merkle/core-helpers.d.ts +32 -0
  326. package/dist/shared/flap/portal-bundle-merkle/core-helpers.js +83 -0
  327. package/dist/shared/flap/portal-bundle-merkle/core.d.ts +0 -4
  328. package/dist/shared/flap/portal-bundle-merkle/core.js +168 -175
  329. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.d.ts +17 -4
  330. package/dist/shared/flap/portal-bundle-merkle/create-to-dex.js +96 -117
  331. package/dist/shared/flap/portal-bundle-merkle/curve-to-dex.js +104 -122
  332. package/dist/shared/flap/portal-bundle-merkle/index.d.ts +11 -7
  333. package/dist/shared/flap/portal-bundle-merkle/index.js +4 -7
  334. package/dist/shared/flap/portal-bundle-merkle/pancake-proxy.js +71 -68
  335. package/dist/shared/flap/portal-bundle-merkle/private.js +61 -114
  336. package/dist/shared/flap/portal-bundle-merkle/swap-batch.d.ts +8 -0
  337. package/dist/shared/flap/portal-bundle-merkle/swap-batch.js +227 -0
  338. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.d.ts +125 -0
  339. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first-helpers.js +113 -0
  340. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.d.ts +1 -64
  341. package/dist/shared/flap/portal-bundle-merkle/swap-buy-first.js +69 -288
  342. package/dist/shared/flap/portal-bundle-merkle/swap-cross.d.ts +9 -0
  343. package/dist/shared/flap/portal-bundle-merkle/swap-cross.js +139 -0
  344. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.d.ts +149 -0
  345. package/dist/shared/flap/portal-bundle-merkle/swap-helpers.js +259 -0
  346. package/dist/shared/flap/portal-bundle-merkle/swap-planning.d.ts +70 -0
  347. package/dist/shared/flap/portal-bundle-merkle/swap-planning.js +182 -0
  348. package/dist/shared/flap/portal-bundle-merkle/swap-quick-batch.d.ts +16 -0
  349. package/dist/shared/flap/portal-bundle-merkle/swap-quick-batch.js +327 -0
  350. package/dist/shared/flap/portal-bundle-merkle/swap-single.d.ts +2 -0
  351. package/dist/shared/flap/portal-bundle-merkle/swap-single.js +184 -0
  352. package/dist/shared/flap/portal-bundle-merkle/swap-types.d.ts +101 -0
  353. package/dist/shared/flap/portal-bundle-merkle/swap-types.js +1 -0
  354. package/dist/shared/flap/portal-bundle-merkle/swap.d.ts +6 -199
  355. package/dist/shared/flap/portal-bundle-merkle/swap.js +5 -1357
  356. package/dist/shared/flap/portal-bundle-merkle/types.d.ts +88 -12
  357. package/dist/shared/flap/portal-bundle-merkle/utils.d.ts +1 -80
  358. package/dist/shared/flap/portal-bundle-merkle/utils.js +145 -265
  359. package/dist/shared/flap/portal-bundle.js +83 -78
  360. package/dist/shared/flap/portal-create-token.d.ts +39 -21
  361. package/dist/shared/flap/portal-create-token.js +121 -124
  362. package/dist/shared/flap/portal.d.ts +1 -2
  363. package/dist/shared/flap/portal.js +36 -28
  364. package/dist/shared/flap/vanity.d.ts +6 -6
  365. package/dist/shared/flap/vanity.js +15 -21
  366. package/dist/shared/flap/vault.d.ts +25 -93
  367. package/dist/shared/flap/vault.js +77 -127
  368. package/dist/shared/foundation/amount/split-by-weight.d.ts +5 -0
  369. package/dist/shared/foundation/amount/split-by-weight.js +35 -0
  370. package/dist/shared/foundation/dex/v3-path.d.ts +6 -0
  371. package/dist/shared/foundation/dex/v3-path.js +35 -0
  372. package/dist/shared/foundation/erc20/decimals.d.ts +7 -0
  373. package/dist/shared/foundation/erc20/decimals.js +24 -0
  374. package/dist/shared/foundation/gas/bundle-gas.d.ts +49 -0
  375. package/dist/shared/foundation/gas/bundle-gas.js +93 -0
  376. package/dist/shared/foundation/gas/profit-hop.d.ts +20 -0
  377. package/dist/shared/foundation/gas/profit-hop.js +72 -0
  378. package/dist/shared/foundation/index.d.ts +15 -0
  379. package/dist/shared/foundation/index.js +14 -0
  380. package/dist/shared/foundation/nonce/nonce-manager.d.ts +19 -0
  381. package/dist/shared/foundation/nonce/nonce-manager.js +217 -0
  382. package/dist/shared/foundation/normalize-unknown.d.ts +9 -0
  383. package/dist/shared/foundation/normalize-unknown.js +29 -0
  384. package/dist/shared/foundation/sdk-logger.d.ts +13 -0
  385. package/dist/shared/foundation/sdk-logger.js +12 -0
  386. package/dist/shared/foundation/tx/build-request.d.ts +17 -0
  387. package/dist/shared/foundation/tx/build-request.js +25 -0
  388. package/dist/shared/foundation/tx/sign-batch.d.ts +5 -0
  389. package/dist/shared/foundation/tx/sign-batch.js +26 -0
  390. package/dist/shared/foundation/tx/wallet-sign-patch.d.ts +1 -0
  391. package/dist/shared/foundation/tx/wallet-sign-patch.js +18 -0
  392. package/dist/shared/foundation/types/airdrop-sweep.d.ts +79 -0
  393. package/dist/shared/foundation/types/airdrop-sweep.js +1 -0
  394. package/dist/shared/foundation/types/erc20.d.ts +65 -0
  395. package/dist/shared/foundation/types/erc20.js +1 -0
  396. package/dist/shared/foundation/types/holders-maker.d.ts +64 -0
  397. package/dist/shared/foundation/types/holders-maker.js +1 -0
  398. package/dist/shared/foundation/types/index.d.ts +7 -0
  399. package/dist/shared/foundation/types/index.js +1 -0
  400. package/dist/shared/foundation/types/lp-inspect.d.ts +102 -0
  401. package/dist/shared/foundation/types/lp-inspect.js +1 -0
  402. package/dist/shared/foundation/types/multicall.d.ts +5 -0
  403. package/dist/shared/foundation/types/multicall.js +1 -0
  404. package/dist/shared/foundation/types/private-sale.d.ts +35 -0
  405. package/dist/shared/foundation/types/private-sale.js +1 -0
  406. package/dist/shared/foundation/types/quote-helpers.d.ts +17 -0
  407. package/dist/shared/foundation/types/quote-helpers.js +1 -0
  408. package/dist/shared/foundation/wallet/generate.d.ts +5 -0
  409. package/dist/shared/foundation/wallet/generate.js +8 -0
  410. package/dist/shared/four/tax-token.d.ts +1 -1
  411. package/dist/shared/four/tax-token.js +31 -10
  412. package/dist/shared/index.d.ts +6 -0
  413. package/dist/shared/index.js +4 -0
  414. package/dist/types/errors.d.ts +27 -0
  415. package/dist/types/errors.js +34 -0
  416. package/dist/utils/airdrop-sweep.d.ts +4 -76
  417. package/dist/utils/airdrop-sweep.js +42 -55
  418. package/dist/utils/bundle-helpers.d.ts +9 -243
  419. package/dist/utils/bundle-helpers.js +10 -584
  420. package/dist/utils/constants.d.ts +5 -61
  421. package/dist/utils/constants.js +5 -80
  422. package/dist/utils/contract-factory.d.ts +2 -4
  423. package/dist/utils/contract-factory.js +25 -18
  424. package/dist/utils/erc20.d.ts +7 -89
  425. package/dist/utils/erc20.js +98 -129
  426. package/dist/utils/errors.d.ts +12 -1
  427. package/dist/utils/errors.js +60 -1
  428. package/dist/utils/holders-maker/addresses.d.ts +12 -0
  429. package/dist/utils/holders-maker/addresses.js +15 -0
  430. package/dist/utils/holders-maker/buy-tx.d.ts +44 -0
  431. package/dist/utils/holders-maker/buy-tx.js +278 -0
  432. package/dist/utils/holders-maker/constants.d.ts +6 -0
  433. package/dist/utils/holders-maker/constants.js +7 -0
  434. package/dist/utils/holders-maker/disperse.d.ts +18 -0
  435. package/dist/utils/holders-maker/disperse.js +90 -0
  436. package/dist/utils/holders-maker/routing.d.ts +4 -0
  437. package/dist/utils/holders-maker/routing.js +45 -0
  438. package/dist/utils/holders-maker/transfer-tx.d.ts +4 -0
  439. package/dist/utils/holders-maker/transfer-tx.js +67 -0
  440. package/dist/utils/holders-maker-helpers.d.ts +9 -0
  441. package/dist/utils/holders-maker-helpers.js +9 -0
  442. package/dist/utils/holders-maker.d.ts +2 -138
  443. package/dist/utils/holders-maker.js +50 -671
  444. package/dist/utils/hop-chains.d.ts +35 -0
  445. package/dist/utils/hop-chains.js +215 -0
  446. package/dist/utils/lp-inspect-helpers.d.ts +9 -0
  447. package/dist/utils/lp-inspect-helpers.js +109 -0
  448. package/dist/utils/lp-inspect.d.ts +2 -112
  449. package/dist/utils/lp-inspect.js +78 -293
  450. package/dist/utils/mpcExclusive.d.ts +2 -5
  451. package/dist/utils/mpcExclusive.js +4 -3
  452. package/dist/utils/pcs-infinity-cl.js +18 -54
  453. package/dist/utils/private-sale.d.ts +2 -58
  454. package/dist/utils/private-sale.js +4 -15
  455. package/dist/utils/provider-factory.d.ts +4 -0
  456. package/dist/utils/provider-factory.js +10 -0
  457. package/dist/utils/quote-helpers.d.ts +4 -45
  458. package/dist/utils/quote-helpers.js +17 -74
  459. package/dist/utils/stealth-transfer.d.ts +2 -28
  460. package/dist/utils/stealth-transfer.js +39 -19
  461. package/dist/utils/swap-helpers.d.ts +2 -15
  462. package/dist/utils/swap-helpers.js +6 -11
  463. package/dist/utils/types/airdrop-sweep.d.ts +1 -0
  464. package/dist/utils/types/airdrop-sweep.js +1 -0
  465. package/dist/utils/types/contract-factory.d.ts +1 -0
  466. package/dist/utils/types/contract-factory.js +1 -0
  467. package/dist/utils/types/erc20.d.ts +1 -0
  468. package/dist/utils/types/erc20.js +1 -0
  469. package/dist/utils/types/errors.d.ts +1 -0
  470. package/dist/utils/types/errors.js +1 -0
  471. package/dist/utils/types/holders-maker.d.ts +1 -0
  472. package/dist/utils/types/holders-maker.js +1 -0
  473. package/dist/utils/types/hop-chains.d.ts +8 -0
  474. package/dist/utils/types/hop-chains.js +1 -0
  475. package/dist/utils/types/index.d.ts +13 -0
  476. package/dist/utils/types/index.js +1 -0
  477. package/dist/utils/types/lp-inspect.d.ts +1 -0
  478. package/dist/utils/types/lp-inspect.js +1 -0
  479. package/dist/utils/types/mpc-exclusive.d.ts +5 -0
  480. package/dist/utils/types/mpc-exclusive.js +1 -0
  481. package/dist/utils/types/private-sale.d.ts +1 -0
  482. package/dist/utils/types/private-sale.js +1 -0
  483. package/dist/utils/types/quote-helpers.d.ts +1 -0
  484. package/dist/utils/types/quote-helpers.js +1 -0
  485. package/dist/utils/types/stealth-transfer.d.ts +44 -0
  486. package/dist/utils/types/stealth-transfer.js +1 -0
  487. package/dist/utils/types/wallet.d.ts +25 -0
  488. package/dist/utils/types/wallet.js +1 -0
  489. package/dist/utils/wallet.d.ts +4 -25
  490. package/dist/utils/wallet.js +27 -22
  491. package/dist/vanity/index.d.ts +5 -0
  492. package/dist/vanity/index.js +5 -0
  493. package/package.json +100 -2
@@ -0,0 +1,731 @@
1
+ /**
2
+ * 独立的Bundle提交方法
3
+ *
4
+ * 用于服务器端接收前端构建的签名交易后,提交到Merkle或BlockRazor
5
+ * 以及 Monad 等不支持 Bundle 的链的逐笔广播
6
+ */
7
+ import { MerkleClient } from '../shared/clients/merkle.js';
8
+ import { BlockRazorClient } from '../shared/clients/blockrazor.js';
9
+ import { ethers } from 'ethers';
10
+ import { getErrorMessageFromUnknown, consoleSdkLogger } from '../shared/foundation/index.js';
11
+ import { CHAINS } from '../shared/constants/index.js';
12
+ import { createSignProvider } from './sign-context-helpers.js';
13
+ const sdkLogger = consoleSdkLogger;
14
+ // ✅ MerkleClient 缓存(复用连接,减少初始化开销)
15
+ const merkleClientCache = new Map();
16
+ const CLIENT_CACHE_TTL_MS = 60 * 1000; // 60秒缓存
17
+ /**
18
+ * 获取或创建 MerkleClient(带缓存)
19
+ */
20
+ function getMerkleClient(config) {
21
+ const cacheKey = `${config.apiKey}-${config.chainId ?? CHAINS.BSC.chainId}-${config.customRpcUrl || ''}`;
22
+ const now = Date.now();
23
+ const cached = merkleClientCache.get(cacheKey);
24
+ if (cached && cached.expireAt > now) {
25
+ return cached.client;
26
+ }
27
+ // 创建新客户端并缓存
28
+ const client = new MerkleClient({
29
+ apiKey: config.apiKey,
30
+ chainId: config.chainId ?? CHAINS.BSC.chainId,
31
+ customRpcUrl: config.customRpcUrl,
32
+ });
33
+ merkleClientCache.set(cacheKey, { client, expireAt: now + CLIENT_CACHE_TTL_MS });
34
+ return client;
35
+ }
36
+ async function submitBundlesSequential(bundles, submitFn) {
37
+ const results = [];
38
+ for (const signedTransactions of bundles) {
39
+ results.push(await submitFn(signedTransactions));
40
+ }
41
+ return results;
42
+ }
43
+ async function submitBundlesParallel(bundles, submitFn) {
44
+ return Promise.all(bundles.map((signedTransactions) => submitFn(signedTransactions)));
45
+ }
46
+ /**
47
+ * 提交已签名的交易到Merkle(服务器端使用)
48
+ *
49
+ * 这个方法接收前端构建和签名好的交易,直接提交到Merkle服务
50
+ *
51
+ * @param signedTransactions 签名后的交易数组
52
+ * @param config Merkle提交配置(精简版,只需要提交相关参数)
53
+ * @returns Bundle提交结果
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * // 服务器端代码
58
+ * import { submitBundleToMerkle } from 'four-flap-meme-sdk';
59
+ *
60
+ * const result = await submitBundleToMerkle(signedTransactions, {
61
+ * apiKey: process.env.MERKLE_API_KEY,
62
+ * customRpcUrl: process.env.MERKLE_RPC_URL,
63
+ * bundleBlockOffset: 5
64
+ * });
65
+ *
66
+ * if (result.code) {
67
+ * } else {
68
+ * console.error('❌ Bundle提交失败:', result.error);
69
+ * }
70
+ * ```
71
+ */
72
+ export async function submitBundleToMerkle(signedTransactions, config) {
73
+ try {
74
+ const totalTransactions = signedTransactions?.length ?? 0;
75
+ // 验证输入
76
+ if (!signedTransactions || signedTransactions.length === 0) {
77
+ return {
78
+ code: false,
79
+ totalTransactions,
80
+ error: 'signedTransactions cannot be empty',
81
+ };
82
+ }
83
+ if (!config.apiKey) {
84
+ return {
85
+ code: false,
86
+ totalTransactions,
87
+ error: 'apiKey is required in config',
88
+ };
89
+ }
90
+ // ✅ 使用缓存的 MerkleClient(复用连接 + 区块号缓存)
91
+ const merkle = getMerkleClient(config);
92
+ // 提交Bundle
93
+ const bundleResult = await merkle.sendBundle({
94
+ transactions: signedTransactions,
95
+ blockOffset: config.bundleBlockOffset ?? 3,
96
+ minBlockOffset: config.minBlockOffset ?? 3,
97
+ autoRetry: config.autoRetryBundle ?? false,
98
+ maxRetries: config.maxBundleRetries ?? 2,
99
+ });
100
+ // ✅ 提交成功
101
+ return {
102
+ code: true,
103
+ totalTransactions,
104
+ bundleHash: bundleResult.bundleHash,
105
+ txHashes: bundleResult.txHashes,
106
+ targetBlock: bundleResult.targetBlock,
107
+ txCount: bundleResult.txCount,
108
+ };
109
+ }
110
+ catch (error) {
111
+ // ❌ 提交失败
112
+ return {
113
+ code: false,
114
+ totalTransactions: signedTransactions?.length ?? 0,
115
+ error: getErrorMessageFromUnknown(error),
116
+ };
117
+ }
118
+ }
119
+ /**
120
+ * 批量提交多个Bundle到Merkle(顺序执行)
121
+ *
122
+ * @param bundles 多个Bundle的签名交易数组
123
+ * @param config Merkle提交配置
124
+ * @returns Bundle提交结果数组
125
+ */
126
+ export async function submitMultipleBundles(bundles, config) {
127
+ return submitBundlesSequential(bundles, (signedTransactions) => submitBundleToMerkle(signedTransactions, config));
128
+ }
129
+ /**
130
+ * 并行提交多个Bundle到Merkle(适用于独立的Bundle)
131
+ *
132
+ * @param bundles 多个Bundle的签名交易数组
133
+ * @param config Merkle提交配置
134
+ * @returns Bundle提交结果数组
135
+ */
136
+ export async function submitMultipleBundlesParallel(bundles, config) {
137
+ return submitBundlesParallel(bundles, (signedTransactions) => submitBundleToMerkle(signedTransactions, config));
138
+ }
139
+ // ==================== BlockRazor Bundle 提交方法 ====================
140
+ // ✅ BlockRazorClient 缓存(复用连接,减少初始化开销)
141
+ const blockRazorClientCache = new Map();
142
+ /**
143
+ * 获取或创建 BlockRazorClient(带缓存)
144
+ */
145
+ function getBlockRazorClient(config) {
146
+ const cacheKey = `${config.apiKey || 'default'}-${config.customRpcUrl || ''}-${config.builderRpcUrl || ''}`;
147
+ const now = Date.now();
148
+ const cached = blockRazorClientCache.get(cacheKey);
149
+ if (cached && cached.expireAt > now) {
150
+ return cached.client;
151
+ }
152
+ // 创建新客户端并缓存
153
+ const client = new BlockRazorClient({
154
+ apiKey: config.apiKey,
155
+ chainId: CHAINS.BSC.chainId, // BlockRazor 目前只支持 BSC
156
+ customRpcUrl: config.customRpcUrl,
157
+ builderRpcUrl: config.builderRpcUrl,
158
+ });
159
+ blockRazorClientCache.set(cacheKey, { client, expireAt: now + CLIENT_CACHE_TTL_MS });
160
+ return client;
161
+ }
162
+ /**
163
+ * 提交已签名的交易到 BlockRazor(服务器端使用)
164
+ *
165
+ * BlockRazor 是 BSC 链的 Block Builder 服务,支持 Bundle 提交
166
+ *
167
+ * 特点:
168
+ * - 向 Builder EOA 转账 BNB 可提高优先级
169
+ * - 支持 Bundle 合并提高打包率
170
+ * - 最低 Gas Price 要求: 0.05 Gwei
171
+ *
172
+ * @param signedTransactions 签名后的交易数组
173
+ * @param config BlockRazor 提交配置
174
+ * @returns Bundle 提交结果
175
+ *
176
+ * @example
177
+ * ```typescript
178
+ * // 服务器端代码
179
+ * import { submitBundleToBlockRazor } from 'four-flap-meme-sdk';
180
+ *
181
+ * const result = await submitBundleToBlockRazor(signedTransactions, {
182
+ * blockOffset: 10,
183
+ * noMerge: false, // 允许合并
184
+ * autoRetry: true
185
+ * });
186
+ *
187
+ * if (result.code) {
188
+ * } else {
189
+ * console.error('❌ Bundle 提交失败:', result.error);
190
+ * }
191
+ * ```
192
+ */
193
+ export async function submitBundleToBlockRazor(signedTransactions, config) {
194
+ try {
195
+ const totalTransactions = signedTransactions?.length ?? 0;
196
+ // 验证输入
197
+ if (!signedTransactions || signedTransactions.length === 0) {
198
+ return {
199
+ code: false,
200
+ totalTransactions,
201
+ error: 'signedTransactions cannot be empty',
202
+ };
203
+ }
204
+ // ✅ 使用缓存的 BlockRazorClient
205
+ const client = getBlockRazorClient(config);
206
+ // 提交 Bundle
207
+ const bundleResult = await client.sendBundle({
208
+ transactions: signedTransactions,
209
+ blockOffset: config.blockOffset ?? 100,
210
+ maxBlockOffset: config.maxBlockOffset ?? 100,
211
+ noMerge: config.noMerge ?? false,
212
+ revertingTxHashes: config.revertingTxHashes,
213
+ autoRetry: config.autoRetry ?? false,
214
+ maxRetries: config.maxRetries ?? 3,
215
+ });
216
+ // ✅ 提交成功
217
+ return {
218
+ code: true,
219
+ totalTransactions,
220
+ bundleHash: bundleResult.bundleHash,
221
+ txHashes: bundleResult.txHashes,
222
+ maxBlockNumber: bundleResult.maxBlockNumber,
223
+ txCount: bundleResult.txCount,
224
+ };
225
+ }
226
+ catch (error) {
227
+ // ❌ 提交失败
228
+ return {
229
+ code: false,
230
+ totalTransactions: signedTransactions?.length ?? 0,
231
+ error: getErrorMessageFromUnknown(error),
232
+ };
233
+ }
234
+ }
235
+ /**
236
+ * 批量提交多个 Bundle 到 BlockRazor(顺序执行)
237
+ *
238
+ * @param bundles 多个 Bundle 的签名交易数组
239
+ * @param config BlockRazor 提交配置
240
+ * @returns Bundle 提交结果数组
241
+ */
242
+ export async function submitMultipleBundlesToBlockRazor(bundles, config) {
243
+ return submitBundlesSequential(bundles, (signedTransactions) => submitBundleToBlockRazor(signedTransactions, config));
244
+ }
245
+ /**
246
+ * 并行提交多个 Bundle 到 BlockRazor(适用于独立的 Bundle)
247
+ *
248
+ * @param bundles 多个 Bundle 的签名交易数组
249
+ * @param config BlockRazor 提交配置
250
+ * @returns Bundle 提交结果数组
251
+ */
252
+ export async function submitMultipleBundlesToBlockRazorParallel(bundles, config) {
253
+ return submitBundlesParallel(bundles, (signedTransactions) => submitBundleToBlockRazor(signedTransactions, config));
254
+ }
255
+ function shouldTreatBroadcastErrorAsMaybeSent(msg) {
256
+ const m = String(msg || '').toLowerCase();
257
+ return (m.includes('already known') ||
258
+ m.includes('known transaction') ||
259
+ m.includes('already exists') ||
260
+ m.includes('nonce too low') ||
261
+ m.includes('nonce has already been used') ||
262
+ m.includes('nonce expired') ||
263
+ m.includes('replacement transaction underpriced'));
264
+ }
265
+ async function recoverTxHashIfAlreadySeen(provider, signedTx, errorMessage) {
266
+ if (!shouldTreatBroadcastErrorAsMaybeSent(errorMessage))
267
+ return undefined;
268
+ try {
269
+ const hash = ethers.Transaction.from(signedTx).hash;
270
+ if (!hash)
271
+ return undefined;
272
+ const tx = await provider.getTransaction(hash);
273
+ return tx ? hash : undefined;
274
+ }
275
+ catch {
276
+ return undefined;
277
+ }
278
+ }
279
+ /**
280
+ * 并行广播到 RPC(用于不支持 Bundle 的链,如 Monad)
281
+ *
282
+ * ✅ 优化:默认使用并行广播,速度更快
283
+ *
284
+ * @param signedTransactions 签名后的交易数组
285
+ * @param config 直接广播配置
286
+ * @returns 广播结果
287
+ *
288
+ * @example
289
+ * ```typescript
290
+ * // 服务器端代码(Monad 链)
291
+ * import { submitDirectToRpc } from 'four-flap-meme-sdk';
292
+ *
293
+ * const result = await submitDirectToRpc(signedTransactions, {
294
+ * rpcUrl: 'https://rpc-mainnet.monadinfra.com',
295
+ * chainId: 143,
296
+ * chainName: 'MONAD'
297
+ * });
298
+ *
299
+ * if (result.code) {
300
+ * } else {
301
+ * console.error('❌ 全部广播失败:', result.errorSummary);
302
+ * }
303
+ * ```
304
+ */
305
+ export async function submitDirectToRpc(signedTransactions, config) {
306
+ const totalTransactions = signedTransactions?.length ?? 0;
307
+ // 验证输入
308
+ if (!signedTransactions || signedTransactions.length === 0) {
309
+ return {
310
+ code: false,
311
+ totalTransactions: 0,
312
+ successCount: 0,
313
+ failedCount: 0,
314
+ txHashes: [],
315
+ results: [],
316
+ errorSummary: 'signedTransactions cannot be empty',
317
+ };
318
+ }
319
+ if (!config.rpcUrl) {
320
+ return {
321
+ code: false,
322
+ totalTransactions,
323
+ successCount: 0,
324
+ failedCount: totalTransactions,
325
+ txHashes: [],
326
+ results: [],
327
+ errorSummary: 'rpcUrl is required in config',
328
+ };
329
+ }
330
+ const chainId = config.chainId ?? 143;
331
+ const chainName = config.chainName ?? 'MONAD';
332
+ const provider = createSignProvider(config.rpcUrl, chainId, chainName);
333
+ // ✅ 并行广播所有交易
334
+ const broadcastPromises = signedTransactions.map(async (signedTx, i) => {
335
+ try {
336
+ const txResponse = await provider.broadcastTransaction(signedTx);
337
+ // 如果需要等待确认
338
+ if (config.waitForConfirmation) {
339
+ try {
340
+ const receipt = await provider.waitForTransaction(txResponse.hash, 1, config.confirmationTimeout ?? 30000);
341
+ if (receipt && receipt.status === 0) {
342
+ console.warn(`⚠️ [${chainName}] 交易 ${txResponse.hash} 执行失败(已上链但状态为0)`);
343
+ }
344
+ }
345
+ catch (_waitError) {
346
+ console.warn(`⚠️ [${chainName}] 等待交易确认超时: ${txResponse.hash}`);
347
+ }
348
+ }
349
+ return {
350
+ index: i,
351
+ success: true,
352
+ txHash: txResponse.hash,
353
+ };
354
+ }
355
+ catch (error) {
356
+ const errorMessage = getErrorMessageFromUnknown(error);
357
+ console.error(`❌ [${chainName}] 交易 ${i + 1}/${totalTransactions} 广播失败:`, errorMessage);
358
+ // ✅ 兼容:nonce too low / already known 等情况下,交易可能已经被接收
359
+ const recovered = await recoverTxHashIfAlreadySeen(provider, signedTx, errorMessage);
360
+ if (recovered) {
361
+ if (config.waitForConfirmation) {
362
+ try {
363
+ await provider.waitForTransaction(recovered, 1, config.confirmationTimeout ?? 30000);
364
+ }
365
+ catch (waitError) {
366
+ sdkLogger.debug?.(`[DirectSubmit] recovered tx waitForTransaction failed: ${recovered}`, getErrorMessageFromUnknown(waitError));
367
+ }
368
+ }
369
+ return { index: i, success: true, txHash: recovered, error: errorMessage };
370
+ }
371
+ return {
372
+ index: i,
373
+ success: false,
374
+ error: errorMessage,
375
+ };
376
+ }
377
+ });
378
+ const results = await Promise.all(broadcastPromises);
379
+ // 按索引排序结果
380
+ results.sort((a, b) => a.index - b.index);
381
+ const txHashes = results.filter((r) => r.success && r.txHash).map((r) => r.txHash);
382
+ const errors = results.filter((r) => !r.success).map((r) => `交易 ${r.index + 1}: ${r.error}`);
383
+ const successCount = txHashes.length;
384
+ const failedCount = totalTransactions - successCount;
385
+ return {
386
+ code: successCount > 0,
387
+ totalTransactions,
388
+ successCount,
389
+ failedCount,
390
+ txHashes,
391
+ results,
392
+ errorSummary: errors.length > 0 ? errors.join('; ') : undefined,
393
+ };
394
+ }
395
+ /**
396
+ * ✅ 顺序广播并等待确认(用于多跳交易等需要顺序执行的场景)
397
+ *
398
+ * 每笔交易广播后会等待上链确认,确保后续交易能正确执行
399
+ *
400
+ * ⚠️ 多跳场景:如果某笔交易失败,会立即停止(因为后续交易肯定也会失败)
401
+ *
402
+ * @param signedTransactions 签名后的交易数组
403
+ * @param config 直接广播配置
404
+ * @returns 广播结果
405
+ */
406
+ export async function submitDirectToRpcSequential(signedTransactions, config) {
407
+ const totalTransactions = signedTransactions?.length ?? 0;
408
+ if (!signedTransactions || signedTransactions.length === 0) {
409
+ return {
410
+ code: false,
411
+ totalTransactions: 0,
412
+ successCount: 0,
413
+ failedCount: 0,
414
+ txHashes: [],
415
+ results: [],
416
+ errorSummary: 'signedTransactions cannot be empty',
417
+ };
418
+ }
419
+ if (!config.rpcUrl) {
420
+ return {
421
+ code: false,
422
+ totalTransactions,
423
+ successCount: 0,
424
+ failedCount: totalTransactions,
425
+ txHashes: [],
426
+ results: [],
427
+ errorSummary: 'rpcUrl is required in config',
428
+ };
429
+ }
430
+ const chainId = config.chainId ?? 143;
431
+ const chainName = config.chainName ?? 'MONAD';
432
+ // ✅ XLayer 链默认 120 秒超时(网络可能较慢)
433
+ const confirmationTimeout = config.confirmationTimeout ?? (chainId === 196 ? 120000 : 60000);
434
+ const provider = createSignProvider(config.rpcUrl, chainId, chainName);
435
+ const results = [];
436
+ const txHashes = [];
437
+ const errors = [];
438
+ // 顺序广播并等待确认
439
+ for (let i = 0; i < signedTransactions.length; i++) {
440
+ const signedTx = signedTransactions[i];
441
+ try {
442
+ // 广播交易
443
+ const txResponse = await provider.broadcastTransaction(signedTx);
444
+ // ✅ 等待交易确认
445
+ const receipt = await provider.waitForTransaction(txResponse.hash, 1, // 等待1个确认
446
+ confirmationTimeout);
447
+ if (receipt && receipt.status === 1) {
448
+ results.push({
449
+ index: i,
450
+ success: true,
451
+ txHash: txResponse.hash,
452
+ });
453
+ txHashes.push(txResponse.hash);
454
+ }
455
+ else {
456
+ const errorMsg = `交易执行失败(status=${receipt?.status})`;
457
+ console.error(`❌ [${chainName}] 交易 ${i + 1}/${totalTransactions} 上链失败: ${errorMsg}`);
458
+ results.push({
459
+ index: i,
460
+ success: false,
461
+ txHash: txResponse.hash,
462
+ error: errorMsg,
463
+ });
464
+ errors.push(`交易 ${i + 1}: ${errorMsg}`);
465
+ // ✅ 多跳场景:如果某笔失败,后续交易肯定也会失败,立即停止
466
+ console.warn(`⚠️ [${chainName}] 多跳模式检测到失败,停止后续 ${totalTransactions - i - 1} 笔交易`);
467
+ break;
468
+ }
469
+ }
470
+ catch (error) {
471
+ const errorMessage = getErrorMessageFromUnknown(error);
472
+ console.error(`❌ [${chainName}] 交易 ${i + 1}/${totalTransactions} 广播/确认失败:`, errorMessage);
473
+ // ✅ 兼容:nonce too low / already known 等情况下,交易可能已经被接收
474
+ const recovered = await recoverTxHashIfAlreadySeen(provider, signedTx, errorMessage);
475
+ if (recovered) {
476
+ // 顺序模式依赖确认:尽量等待一下
477
+ try {
478
+ const receipt = await provider.waitForTransaction(recovered, 1, confirmationTimeout);
479
+ if (receipt && receipt.status === 1) {
480
+ results.push({ index: i, success: true, txHash: recovered, error: errorMessage });
481
+ txHashes.push(recovered);
482
+ continue;
483
+ }
484
+ const errorMsg = `交易执行失败(status=${receipt?.status})`;
485
+ console.error(`❌ [${chainName}] 交易 ${i + 1} 恢复失败: ${errorMsg}`);
486
+ results.push({ index: i, success: false, txHash: recovered, error: `${errorMessage} | ${errorMsg}` });
487
+ errors.push(`交易 ${i + 1}: ${errorMessage} | ${errorMsg}`);
488
+ // ✅ 多跳场景:失败则停止
489
+ console.warn(`⚠️ [${chainName}] 多跳模式检测到失败,停止后续 ${totalTransactions - i - 1} 笔交易`);
490
+ break;
491
+ }
492
+ catch (waitError) {
493
+ // 等待超时:对于多跳场景,不能假设成功,需要停止
494
+ const waitErrorMsg = getErrorMessageFromUnknown(waitError);
495
+ console.error(`⏱️ [${chainName}] 交易 ${i + 1} 等待确认超时: ${waitErrorMsg}`);
496
+ results.push({
497
+ index: i,
498
+ success: false,
499
+ txHash: recovered,
500
+ error: `${errorMessage} | 等待确认超时: ${waitErrorMsg}`,
501
+ });
502
+ errors.push(`交易 ${i + 1}: ${errorMessage} | 等待确认超时`);
503
+ // ✅ 多跳场景:超时也停止
504
+ console.warn(`⚠️ [${chainName}] 多跳模式检测到超时,停止后续 ${totalTransactions - i - 1} 笔交易`);
505
+ break;
506
+ }
507
+ }
508
+ results.push({
509
+ index: i,
510
+ success: false,
511
+ error: errorMessage,
512
+ });
513
+ errors.push(`交易 ${i + 1}: ${errorMessage}`);
514
+ // ✅ 多跳场景:如果某笔失败,后续交易肯定也会失败,立即停止
515
+ console.warn(`⚠️ [${chainName}] 多跳模式检测到失败,停止后续 ${totalTransactions - i - 1} 笔交易`);
516
+ break;
517
+ }
518
+ }
519
+ const successCount = txHashes.length;
520
+ const failedCount = totalTransactions - successCount;
521
+ return {
522
+ code: successCount > 0,
523
+ totalTransactions,
524
+ successCount,
525
+ failedCount,
526
+ txHashes,
527
+ results,
528
+ errorSummary: errors.length > 0 ? errors.join('; ') : undefined,
529
+ };
530
+ }
531
+ /**
532
+ * ✅ 顺序广播但不等待确认(用于 AA handleOps + tail 等 nonce 连续的场景)
533
+ *
534
+ * 按顺序逐笔发送交易,每笔只等待广播成功(RPC 返回 txHash),不等待链上确认。
535
+ * 这样可以保证交易按顺序进入 mempool,同时避免等待确认超时。
536
+ *
537
+ * @param signedTransactions 签名后的交易数组
538
+ * @param config 直接广播配置
539
+ * @returns 广播结果
540
+ */
541
+ export async function submitDirectToRpcSequentialNoWait(signedTransactions, config) {
542
+ const totalTransactions = signedTransactions?.length ?? 0;
543
+ if (!signedTransactions || signedTransactions.length === 0) {
544
+ return {
545
+ code: false,
546
+ totalTransactions: 0,
547
+ successCount: 0,
548
+ failedCount: 0,
549
+ txHashes: [],
550
+ results: [],
551
+ errorSummary: 'signedTransactions cannot be empty',
552
+ };
553
+ }
554
+ if (!config.rpcUrl) {
555
+ return {
556
+ code: false,
557
+ totalTransactions,
558
+ successCount: 0,
559
+ failedCount: totalTransactions,
560
+ txHashes: [],
561
+ results: [],
562
+ errorSummary: 'rpcUrl is required in config',
563
+ };
564
+ }
565
+ const chainId = config.chainId ?? 143;
566
+ const chainName = config.chainName ?? 'MONAD';
567
+ const provider = createSignProvider(config.rpcUrl, chainId, chainName);
568
+ const results = [];
569
+ const txHashes = [];
570
+ const errors = [];
571
+ // ✅ 顺序广播,每笔只等待广播成功(不等待链上确认)
572
+ for (let i = 0; i < signedTransactions.length; i++) {
573
+ const signedTx = signedTransactions[i];
574
+ try {
575
+ // 广播交易,等待 RPC 返回 txHash
576
+ const txResponse = await provider.broadcastTransaction(signedTx);
577
+ results.push({
578
+ index: i,
579
+ success: true,
580
+ txHash: txResponse.hash,
581
+ });
582
+ txHashes.push(txResponse.hash);
583
+ }
584
+ catch (error) {
585
+ const errorMessage = getErrorMessageFromUnknown(error);
586
+ console.error(`❌ [${chainName}] 交易 ${i + 1}/${totalTransactions} 广播失败:`, errorMessage);
587
+ // ✅ 兼容:nonce too low / already known 等情况下,交易可能已经被接收
588
+ const recovered = await recoverTxHashIfAlreadySeen(provider, signedTx, errorMessage);
589
+ if (recovered) {
590
+ results.push({ index: i, success: true, txHash: recovered, error: errorMessage });
591
+ txHashes.push(recovered);
592
+ continue;
593
+ }
594
+ results.push({
595
+ index: i,
596
+ success: false,
597
+ error: errorMessage,
598
+ });
599
+ errors.push(`交易 ${i + 1}: ${errorMessage}`);
600
+ // ✅ 如果某笔失败,继续尝试后续交易(可能是 nonce 问题可以自动恢复)
601
+ }
602
+ }
603
+ const successCount = txHashes.length;
604
+ const failedCount = totalTransactions - successCount;
605
+ return {
606
+ code: successCount > 0,
607
+ totalTransactions,
608
+ successCount,
609
+ failedCount,
610
+ txHashes,
611
+ results,
612
+ errorSummary: errors.length > 0 ? errors.join('; ') : undefined,
613
+ };
614
+ }
615
+ /**
616
+ * 并行逐笔广播到 RPC(速度更快,但可能有 nonce 冲突)
617
+ *
618
+ * ⚠️ 注意:仅适用于不同钱包的交易,同一钱包的多笔交易应使用顺序广播
619
+ *
620
+ * @param signedTransactions 签名后的交易数组
621
+ * @param config 直接广播配置
622
+ * @returns 广播结果
623
+ */
624
+ export async function submitDirectToRpcParallel(signedTransactions, config) {
625
+ const totalTransactions = signedTransactions?.length ?? 0;
626
+ if (!signedTransactions || signedTransactions.length === 0) {
627
+ return {
628
+ code: false,
629
+ totalTransactions: 0,
630
+ successCount: 0,
631
+ failedCount: 0,
632
+ txHashes: [],
633
+ results: [],
634
+ errorSummary: 'signedTransactions cannot be empty',
635
+ };
636
+ }
637
+ if (!config.rpcUrl) {
638
+ return {
639
+ code: false,
640
+ totalTransactions,
641
+ successCount: 0,
642
+ failedCount: totalTransactions,
643
+ txHashes: [],
644
+ results: [],
645
+ errorSummary: 'rpcUrl is required in config',
646
+ };
647
+ }
648
+ const chainId = config.chainId ?? 143;
649
+ const chainName = config.chainName ?? 'MONAD';
650
+ const provider = createSignProvider(config.rpcUrl, chainId, chainName);
651
+ // 并行广播
652
+ const broadcastPromises = signedTransactions.map(async (signedTx, i) => {
653
+ try {
654
+ const txResponse = await provider.broadcastTransaction(signedTx);
655
+ return {
656
+ index: i,
657
+ success: true,
658
+ txHash: txResponse.hash,
659
+ };
660
+ }
661
+ catch (error) {
662
+ return {
663
+ index: i,
664
+ success: false,
665
+ error: getErrorMessageFromUnknown(error),
666
+ };
667
+ }
668
+ });
669
+ const results = await Promise.all(broadcastPromises);
670
+ const txHashes = results.filter((r) => r.success && r.txHash).map((r) => r.txHash);
671
+ const errors = results.filter((r) => !r.success).map((r) => `交易 ${r.index + 1}: ${r.error}`);
672
+ const successCount = txHashes.length;
673
+ const failedCount = totalTransactions - successCount;
674
+ return {
675
+ code: successCount > 0,
676
+ totalTransactions,
677
+ successCount,
678
+ failedCount,
679
+ txHashes,
680
+ results,
681
+ errorSummary: errors.length > 0 ? errors.join('; ') : undefined,
682
+ };
683
+ }
684
+ /**
685
+ * 智能广播到 RPC(自动选择并行或顺序)
686
+ */
687
+ export async function submitDirectToRpcSmart(signedTransactions, config, options) {
688
+ const emptyFail = (mode) => ({
689
+ code: false,
690
+ totalTransactions: 0,
691
+ successCount: 0,
692
+ failedCount: 0,
693
+ txHashes: [],
694
+ results: [],
695
+ errorSummary: 'signedTransactions cannot be empty',
696
+ mode,
697
+ });
698
+ if (!signedTransactions || signedTransactions.length === 0) {
699
+ return emptyFail('parallel');
700
+ }
701
+ const hasMultipleFromSameWallet = (() => {
702
+ if (signedTransactions.length < 2)
703
+ return false;
704
+ const seen = new Set();
705
+ for (const raw of signedTransactions) {
706
+ if (!raw)
707
+ continue;
708
+ try {
709
+ const tx = ethers.Transaction.from(raw);
710
+ const from = (tx.from || '').toLowerCase();
711
+ if (!from)
712
+ continue;
713
+ if (seen.has(from))
714
+ return true;
715
+ seen.add(from);
716
+ }
717
+ catch {
718
+ // ignore parse errors
719
+ }
720
+ }
721
+ return false;
722
+ })();
723
+ if (hasMultipleFromSameWallet) {
724
+ const result = options?.waitConfirmation
725
+ ? await submitDirectToRpcSequential(signedTransactions, config)
726
+ : await submitDirectToRpcSequentialNoWait(signedTransactions, config);
727
+ return { ...result, mode: 'sequential' };
728
+ }
729
+ const result = await submitDirectToRpcParallel(signedTransactions, config);
730
+ return { ...result, mode: 'parallel' };
731
+ }