@lifi/sdk-provider-solana 4.0.1-alpha.0 → 4.0.2

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 (296) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +88 -5
  3. package/dist/cjs/SolanaProvider.d.ts +7 -2
  4. package/dist/cjs/SolanaProvider.js +31 -34
  5. package/dist/cjs/SolanaProvider.js.map +1 -1
  6. package/dist/cjs/actions/getSNSAddress.d.ts +5 -1
  7. package/dist/cjs/actions/getSNSAddress.js +16 -22
  8. package/dist/cjs/actions/getSNSAddress.js.map +1 -1
  9. package/dist/cjs/actions/getSolanaBalance.d.ts +7 -3
  10. package/dist/cjs/actions/getSolanaBalance.js +70 -79
  11. package/dist/cjs/actions/getSolanaBalance.js.map +1 -1
  12. package/dist/cjs/actions/resolveSolanaAddress.d.ts +5 -1
  13. package/dist/cjs/actions/resolveSolanaAddress.js +7 -5
  14. package/dist/cjs/actions/resolveSolanaAddress.js.map +1 -1
  15. package/dist/cjs/actions/sendAndConfirmBundle.d.ts +29 -17
  16. package/dist/cjs/actions/sendAndConfirmBundle.js +64 -84
  17. package/dist/cjs/actions/sendAndConfirmBundle.js.map +1 -1
  18. package/dist/cjs/actions/sendAndConfirmTransaction.d.ts +26 -15
  19. package/dist/cjs/actions/sendAndConfirmTransaction.js +73 -97
  20. package/dist/cjs/actions/sendAndConfirmTransaction.js.map +1 -1
  21. package/dist/cjs/core/SolanaStepExecutor.d.ts +17 -0
  22. package/dist/cjs/core/SolanaStepExecutor.js +49 -0
  23. package/dist/cjs/core/SolanaStepExecutor.js.map +1 -0
  24. package/dist/cjs/core/tasks/SolanaJitoWaitForTransactionTask.d.ts +10 -0
  25. package/dist/cjs/core/tasks/SolanaJitoWaitForTransactionTask.js +35 -0
  26. package/dist/cjs/core/tasks/SolanaJitoWaitForTransactionTask.js.map +1 -0
  27. package/dist/cjs/core/tasks/SolanaSignAndExecuteTask.d.ts +10 -0
  28. package/dist/cjs/core/tasks/SolanaSignAndExecuteTask.js +37 -0
  29. package/dist/cjs/core/tasks/SolanaSignAndExecuteTask.js.map +1 -0
  30. package/dist/cjs/core/tasks/SolanaStandardWaitForTransactionTask.d.ts +10 -0
  31. package/dist/cjs/core/tasks/SolanaStandardWaitForTransactionTask.js +46 -0
  32. package/dist/cjs/core/tasks/SolanaStandardWaitForTransactionTask.js.map +1 -0
  33. package/dist/cjs/core/tasks/SolanaWaitForTransactionTask.d.ts +10 -0
  34. package/dist/cjs/core/tasks/SolanaWaitForTransactionTask.js +18 -0
  35. package/dist/cjs/core/tasks/SolanaWaitForTransactionTask.js.map +1 -0
  36. package/dist/cjs/errors/parseSolanaErrors.d.ts +7 -2
  37. package/dist/cjs/errors/parseSolanaErrors.js +18 -28
  38. package/dist/cjs/errors/parseSolanaErrors.js.map +1 -1
  39. package/dist/cjs/index.d.ts +6 -5
  40. package/dist/cjs/index.js +16 -12
  41. package/dist/cjs/rpc/jito/api/getBundleStatuses.d.ts +22 -14
  42. package/dist/cjs/rpc/jito/api/getBundleStatuses.js +0 -3
  43. package/dist/cjs/rpc/jito/api/getTipAccounts.d.ts +14 -4
  44. package/dist/cjs/rpc/jito/api/getTipAccounts.js +0 -3
  45. package/dist/cjs/rpc/jito/api/sendBundle.d.ts +21 -5
  46. package/dist/cjs/rpc/jito/api/sendBundle.js +0 -3
  47. package/dist/cjs/rpc/jito/api/simulateBundle.d.ts +49 -41
  48. package/dist/cjs/rpc/jito/api/simulateBundle.js +0 -3
  49. package/dist/cjs/rpc/jito/createJitoRpc.d.ts +14 -10
  50. package/dist/cjs/rpc/jito/createJitoRpc.js +16 -11
  51. package/dist/cjs/rpc/jito/createJitoRpc.js.map +1 -1
  52. package/dist/cjs/rpc/jito/types.d.ts +8 -1
  53. package/dist/cjs/rpc/jito/types.js +0 -3
  54. package/dist/cjs/rpc/registry.d.ts +21 -5
  55. package/dist/cjs/rpc/registry.js +47 -35
  56. package/dist/cjs/rpc/registry.js.map +1 -1
  57. package/dist/cjs/rpc/types.d.ts +9 -4
  58. package/dist/cjs/rpc/types.js +0 -3
  59. package/dist/cjs/rpc/utils.d.ts +67 -4
  60. package/dist/cjs/rpc/utils.js +79 -22
  61. package/dist/cjs/rpc/utils.js.map +1 -1
  62. package/dist/cjs/types.d.ts +25 -9
  63. package/dist/cjs/types.js +7 -5
  64. package/dist/cjs/types.js.map +1 -1
  65. package/dist/cjs/utils/KeypairWallet.unit.helpers.d.ts +7 -3
  66. package/dist/cjs/utils/KeypairWallet.unit.helpers.js +15 -17
  67. package/dist/cjs/utils/KeypairWallet.unit.helpers.js.map +1 -1
  68. package/dist/cjs/utils/KeypairWalletAdapter.d.ts +29 -16
  69. package/dist/cjs/utils/KeypairWalletAdapter.js +80 -83
  70. package/dist/cjs/utils/KeypairWalletAdapter.js.map +1 -1
  71. package/dist/cjs/utils/base64ToUint8Array.d.ts +5 -1
  72. package/dist/cjs/utils/base64ToUint8Array.js +10 -10
  73. package/dist/cjs/utils/base64ToUint8Array.js.map +1 -1
  74. package/dist/cjs/utils/getWalletFeature.d.ts +28 -8
  75. package/dist/cjs/utils/getWalletFeature.js +23 -8
  76. package/dist/cjs/utils/getWalletFeature.js.map +1 -1
  77. package/dist/cjs/utils/shouldUseJitoBundle.d.ts +8 -0
  78. package/dist/cjs/utils/shouldUseJitoBundle.js +12 -0
  79. package/dist/cjs/utils/shouldUseJitoBundle.js.map +1 -0
  80. package/dist/cjs/utils/solanaErrorCause.d.ts +15 -0
  81. package/dist/cjs/utils/solanaErrorCause.js +24 -0
  82. package/dist/cjs/utils/solanaErrorCause.js.map +1 -0
  83. package/dist/cjs/version.d.ts +6 -2
  84. package/dist/cjs/version.js +8 -5
  85. package/dist/cjs/version.js.map +1 -1
  86. package/dist/esm/SolanaProvider.d.ts +7 -2
  87. package/dist/esm/SolanaProvider.d.ts.map +1 -0
  88. package/dist/esm/SolanaProvider.js +31 -32
  89. package/dist/esm/SolanaProvider.js.map +1 -1
  90. package/dist/esm/actions/getSNSAddress.d.ts +5 -1
  91. package/dist/esm/actions/getSNSAddress.d.ts.map +1 -0
  92. package/dist/esm/actions/getSNSAddress.js +17 -23
  93. package/dist/esm/actions/getSNSAddress.js.map +1 -1
  94. package/dist/esm/actions/getSolanaBalance.d.ts +7 -3
  95. package/dist/esm/actions/getSolanaBalance.d.ts.map +1 -0
  96. package/dist/esm/actions/getSolanaBalance.js +70 -78
  97. package/dist/esm/actions/getSolanaBalance.js.map +1 -1
  98. package/dist/esm/actions/resolveSolanaAddress.d.ts +5 -1
  99. package/dist/esm/actions/resolveSolanaAddress.d.ts.map +1 -0
  100. package/dist/esm/actions/resolveSolanaAddress.js +7 -3
  101. package/dist/esm/actions/resolveSolanaAddress.js.map +1 -1
  102. package/dist/esm/actions/sendAndConfirmBundle.d.ts +28 -24
  103. package/dist/esm/actions/sendAndConfirmBundle.d.ts.map +1 -0
  104. package/dist/esm/actions/sendAndConfirmBundle.js +63 -97
  105. package/dist/esm/actions/sendAndConfirmBundle.js.map +1 -1
  106. package/dist/esm/actions/sendAndConfirmTransaction.d.ts +25 -21
  107. package/dist/esm/actions/sendAndConfirmTransaction.d.ts.map +1 -0
  108. package/dist/esm/actions/sendAndConfirmTransaction.js +72 -111
  109. package/dist/esm/actions/sendAndConfirmTransaction.js.map +1 -1
  110. package/dist/esm/core/SolanaStepExecutor.d.ts +17 -0
  111. package/dist/esm/core/SolanaStepExecutor.d.ts.map +1 -0
  112. package/dist/esm/core/SolanaStepExecutor.js +48 -0
  113. package/dist/esm/core/SolanaStepExecutor.js.map +1 -0
  114. package/dist/esm/core/tasks/SolanaJitoWaitForTransactionTask.d.ts +10 -0
  115. package/dist/esm/core/tasks/SolanaJitoWaitForTransactionTask.d.ts.map +1 -0
  116. package/dist/esm/core/tasks/SolanaJitoWaitForTransactionTask.js +34 -0
  117. package/dist/esm/core/tasks/SolanaJitoWaitForTransactionTask.js.map +1 -0
  118. package/dist/esm/core/tasks/SolanaSignAndExecuteTask.d.ts +10 -0
  119. package/dist/esm/core/tasks/SolanaSignAndExecuteTask.d.ts.map +1 -0
  120. package/dist/esm/core/tasks/SolanaSignAndExecuteTask.js +36 -0
  121. package/dist/esm/core/tasks/SolanaSignAndExecuteTask.js.map +1 -0
  122. package/dist/esm/core/tasks/SolanaStandardWaitForTransactionTask.d.ts +10 -0
  123. package/dist/esm/core/tasks/SolanaStandardWaitForTransactionTask.d.ts.map +1 -0
  124. package/dist/esm/core/tasks/SolanaStandardWaitForTransactionTask.js +45 -0
  125. package/dist/esm/core/tasks/SolanaStandardWaitForTransactionTask.js.map +1 -0
  126. package/dist/esm/core/tasks/SolanaWaitForTransactionTask.d.ts +10 -0
  127. package/dist/esm/core/tasks/SolanaWaitForTransactionTask.d.ts.map +1 -0
  128. package/dist/esm/core/tasks/SolanaWaitForTransactionTask.js +17 -0
  129. package/dist/esm/core/tasks/SolanaWaitForTransactionTask.js.map +1 -0
  130. package/dist/esm/errors/parseSolanaErrors.d.ts +7 -2
  131. package/dist/esm/errors/parseSolanaErrors.d.ts.map +1 -0
  132. package/dist/esm/errors/parseSolanaErrors.js +18 -25
  133. package/dist/esm/errors/parseSolanaErrors.js.map +1 -1
  134. package/dist/esm/index.d.ts +6 -5
  135. package/dist/esm/index.js +6 -6
  136. package/dist/esm/package.json +1 -1
  137. package/dist/esm/rpc/jito/api/getBundleStatuses.d.ts +22 -22
  138. package/dist/esm/rpc/jito/api/getBundleStatuses.d.ts.map +1 -0
  139. package/dist/esm/rpc/jito/api/getBundleStatuses.js +0 -1
  140. package/dist/esm/rpc/jito/api/getTipAccounts.d.ts +13 -11
  141. package/dist/esm/rpc/jito/api/getTipAccounts.d.ts.map +1 -0
  142. package/dist/esm/rpc/jito/api/getTipAccounts.js +0 -1
  143. package/dist/esm/rpc/jito/api/sendBundle.d.ts +20 -20
  144. package/dist/esm/rpc/jito/api/sendBundle.d.ts.map +1 -0
  145. package/dist/esm/rpc/jito/api/sendBundle.js +0 -1
  146. package/dist/esm/rpc/jito/api/simulateBundle.d.ts +49 -50
  147. package/dist/esm/rpc/jito/api/simulateBundle.d.ts.map +1 -0
  148. package/dist/esm/rpc/jito/api/simulateBundle.js +0 -1
  149. package/dist/esm/rpc/jito/createJitoRpc.d.ts +14 -10
  150. package/dist/esm/rpc/jito/createJitoRpc.d.ts.map +1 -0
  151. package/dist/esm/rpc/jito/createJitoRpc.js +16 -12
  152. package/dist/esm/rpc/jito/createJitoRpc.js.map +1 -1
  153. package/dist/esm/rpc/jito/types.d.ts +7 -3
  154. package/dist/esm/rpc/jito/types.d.ts.map +1 -0
  155. package/dist/esm/rpc/jito/types.js +0 -1
  156. package/dist/esm/rpc/registry.d.ts +18 -13
  157. package/dist/esm/rpc/registry.d.ts.map +1 -0
  158. package/dist/esm/rpc/registry.js +44 -47
  159. package/dist/esm/rpc/registry.js.map +1 -1
  160. package/dist/esm/rpc/types.d.ts +9 -4
  161. package/dist/esm/rpc/types.d.ts.map +1 -0
  162. package/dist/esm/rpc/types.js +0 -1
  163. package/dist/esm/rpc/utils.d.ts +64 -57
  164. package/dist/esm/rpc/utils.d.ts.map +1 -0
  165. package/dist/esm/rpc/utils.js +73 -75
  166. package/dist/esm/rpc/utils.js.map +1 -1
  167. package/dist/esm/types.d.ts +25 -9
  168. package/dist/esm/types.d.ts.map +1 -0
  169. package/dist/esm/types.js +7 -3
  170. package/dist/esm/types.js.map +1 -1
  171. package/dist/esm/utils/KeypairWallet.unit.helpers.d.ts +7 -3
  172. package/dist/esm/utils/KeypairWallet.unit.helpers.d.ts.map +1 -0
  173. package/dist/esm/utils/KeypairWallet.unit.helpers.js +16 -16
  174. package/dist/esm/utils/KeypairWallet.unit.helpers.js.map +1 -1
  175. package/dist/esm/utils/KeypairWalletAdapter.d.ts +28 -23
  176. package/dist/esm/utils/KeypairWalletAdapter.d.ts.map +1 -0
  177. package/dist/esm/utils/KeypairWalletAdapter.js +79 -89
  178. package/dist/esm/utils/KeypairWalletAdapter.js.map +1 -1
  179. package/dist/esm/utils/base64ToUint8Array.d.ts +5 -1
  180. package/dist/esm/utils/base64ToUint8Array.d.ts.map +1 -0
  181. package/dist/esm/utils/base64ToUint8Array.js +10 -8
  182. package/dist/esm/utils/base64ToUint8Array.js.map +1 -1
  183. package/dist/esm/utils/getWalletFeature.d.ts +27 -23
  184. package/dist/esm/utils/getWalletFeature.d.ts.map +1 -0
  185. package/dist/esm/utils/getWalletFeature.js +22 -23
  186. package/dist/esm/utils/getWalletFeature.js.map +1 -1
  187. package/dist/esm/utils/shouldUseJitoBundle.d.ts +8 -0
  188. package/dist/esm/utils/shouldUseJitoBundle.d.ts.map +1 -0
  189. package/dist/esm/utils/shouldUseJitoBundle.js +11 -0
  190. package/dist/esm/utils/shouldUseJitoBundle.js.map +1 -0
  191. package/dist/esm/utils/solanaErrorCause.d.ts +15 -0
  192. package/dist/esm/utils/solanaErrorCause.d.ts.map +1 -0
  193. package/dist/esm/utils/solanaErrorCause.js +22 -0
  194. package/dist/esm/utils/solanaErrorCause.js.map +1 -0
  195. package/dist/esm/version.d.ts +6 -2
  196. package/dist/esm/version.d.ts.map +1 -0
  197. package/dist/esm/version.js +6 -2
  198. package/dist/esm/version.js.map +1 -1
  199. package/package.json +9 -8
  200. package/src/SolanaProvider.ts +2 -1
  201. package/src/actions/getSNSAddress.ts +3 -1
  202. package/src/actions/getSolanaBalance.ts +25 -18
  203. package/src/actions/sendAndConfirmBundle.ts +11 -1
  204. package/src/actions/sendAndConfirmTransaction.ts +13 -1
  205. package/src/core/SolanaStepExecutor.ts +102 -0
  206. package/src/core/tasks/SolanaJitoWaitForTransactionTask.ts +86 -0
  207. package/src/core/tasks/SolanaSignAndExecuteTask.ts +99 -0
  208. package/src/core/tasks/SolanaStandardWaitForTransactionTask.ts +112 -0
  209. package/src/core/tasks/SolanaWaitForTransactionTask.ts +23 -0
  210. package/src/index.ts +1 -0
  211. package/src/rpc/registry.ts +28 -18
  212. package/src/rpc/utils.ts +10 -2
  213. package/src/types.ts +17 -1
  214. package/src/utils/KeypairWallet.unit.helpers.ts +4 -1
  215. package/src/utils/base64ToUint8Array.ts +1 -1
  216. package/src/utils/shouldUseJitoBundle.ts +18 -0
  217. package/src/utils/solanaErrorCause.ts +24 -0
  218. package/src/version.ts +1 -1
  219. package/dist/cjs/SolanaStepExecutor.d.ts +0 -9
  220. package/dist/cjs/SolanaStepExecutor.js +0 -177
  221. package/dist/cjs/SolanaStepExecutor.js.map +0 -1
  222. package/dist/cjs/index.js.map +0 -1
  223. package/dist/cjs/rpc/jito/api/getBundleStatuses.js.map +0 -1
  224. package/dist/cjs/rpc/jito/api/getTipAccounts.js.map +0 -1
  225. package/dist/cjs/rpc/jito/api/sendBundle.js.map +0 -1
  226. package/dist/cjs/rpc/jito/api/simulateBundle.js.map +0 -1
  227. package/dist/cjs/rpc/jito/types.js.map +0 -1
  228. package/dist/cjs/rpc/types.js.map +0 -1
  229. package/dist/cjs/utils/withTimeout.d.ts +0 -7
  230. package/dist/cjs/utils/withTimeout.js +0 -35
  231. package/dist/cjs/utils/withTimeout.js.map +0 -1
  232. package/dist/esm/SolanaStepExecutor.d.ts +0 -9
  233. package/dist/esm/SolanaStepExecutor.js +0 -185
  234. package/dist/esm/SolanaStepExecutor.js.map +0 -1
  235. package/dist/esm/index.js.map +0 -1
  236. package/dist/esm/rpc/jito/api/getBundleStatuses.js.map +0 -1
  237. package/dist/esm/rpc/jito/api/getTipAccounts.js.map +0 -1
  238. package/dist/esm/rpc/jito/api/sendBundle.js.map +0 -1
  239. package/dist/esm/rpc/jito/api/simulateBundle.js.map +0 -1
  240. package/dist/esm/rpc/jito/types.js.map +0 -1
  241. package/dist/esm/rpc/types.js.map +0 -1
  242. package/dist/esm/utils/withTimeout.d.ts +0 -16
  243. package/dist/esm/utils/withTimeout.js +0 -41
  244. package/dist/esm/utils/withTimeout.js.map +0 -1
  245. package/dist/types/SolanaProvider.d.ts +0 -3
  246. package/dist/types/SolanaProvider.d.ts.map +0 -1
  247. package/dist/types/SolanaStepExecutor.d.ts +0 -10
  248. package/dist/types/SolanaStepExecutor.d.ts.map +0 -1
  249. package/dist/types/actions/getSNSAddress.d.ts +0 -2
  250. package/dist/types/actions/getSNSAddress.d.ts.map +0 -1
  251. package/dist/types/actions/getSolanaBalance.d.ts +0 -4
  252. package/dist/types/actions/getSolanaBalance.d.ts.map +0 -1
  253. package/dist/types/actions/resolveSolanaAddress.d.ts +0 -2
  254. package/dist/types/actions/resolveSolanaAddress.d.ts.map +0 -1
  255. package/dist/types/actions/sendAndConfirmBundle.d.ts +0 -29
  256. package/dist/types/actions/sendAndConfirmBundle.d.ts.map +0 -1
  257. package/dist/types/actions/sendAndConfirmTransaction.d.ts +0 -27
  258. package/dist/types/actions/sendAndConfirmTransaction.d.ts.map +0 -1
  259. package/dist/types/errors/parseSolanaErrors.d.ts +0 -3
  260. package/dist/types/errors/parseSolanaErrors.d.ts.map +0 -1
  261. package/dist/types/index.d.ts +0 -6
  262. package/dist/types/index.d.ts.map +0 -1
  263. package/dist/types/rpc/jito/api/getBundleStatuses.d.ts +0 -28
  264. package/dist/types/rpc/jito/api/getBundleStatuses.d.ts.map +0 -1
  265. package/dist/types/rpc/jito/api/getTipAccounts.d.ts +0 -15
  266. package/dist/types/rpc/jito/api/getTipAccounts.d.ts.map +0 -1
  267. package/dist/types/rpc/jito/api/sendBundle.d.ts +0 -24
  268. package/dist/types/rpc/jito/api/sendBundle.d.ts.map +0 -1
  269. package/dist/types/rpc/jito/api/simulateBundle.d.ts +0 -59
  270. package/dist/types/rpc/jito/api/simulateBundle.d.ts.map +0 -1
  271. package/dist/types/rpc/jito/createJitoRpc.d.ts +0 -11
  272. package/dist/types/rpc/jito/createJitoRpc.d.ts.map +0 -1
  273. package/dist/types/rpc/jito/types.d.ts +0 -5
  274. package/dist/types/rpc/jito/types.d.ts.map +0 -1
  275. package/dist/types/rpc/registry.d.ts +0 -17
  276. package/dist/types/rpc/registry.d.ts.map +0 -1
  277. package/dist/types/rpc/types.d.ts +0 -5
  278. package/dist/types/rpc/types.d.ts.map +0 -1
  279. package/dist/types/rpc/utils.d.ts +0 -61
  280. package/dist/types/rpc/utils.d.ts.map +0 -1
  281. package/dist/types/types.d.ts +0 -13
  282. package/dist/types/types.d.ts.map +0 -1
  283. package/dist/types/utils/KeypairWallet.unit.helpers.d.ts +0 -5
  284. package/dist/types/utils/KeypairWallet.unit.helpers.d.ts.map +0 -1
  285. package/dist/types/utils/KeypairWalletAdapter.d.ts +0 -26
  286. package/dist/types/utils/KeypairWalletAdapter.d.ts.map +0 -1
  287. package/dist/types/utils/base64ToUint8Array.d.ts +0 -2
  288. package/dist/types/utils/base64ToUint8Array.d.ts.map +0 -1
  289. package/dist/types/utils/getWalletFeature.d.ts +0 -27
  290. package/dist/types/utils/getWalletFeature.d.ts.map +0 -1
  291. package/dist/types/utils/withTimeout.d.ts +0 -17
  292. package/dist/types/utils/withTimeout.d.ts.map +0 -1
  293. package/dist/types/version.d.ts +0 -3
  294. package/dist/types/version.d.ts.map +0 -1
  295. package/src/SolanaStepExecutor.ts +0 -346
  296. package/src/utils/withTimeout.ts +0 -50
@@ -1,87 +1,67 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sendAndConfirmBundle = sendAndConfirmBundle;
4
- const sdk_1 = require("@lifi/sdk");
5
- const kit_1 = require("@solana/kit");
6
- const registry_js_1 = require("../rpc/registry.js");
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_rpc_registry = require("../rpc/registry.js");
3
+ let _lifi_sdk = require("@lifi/sdk");
4
+ let _solana_kit = require("@solana/kit");
5
+ //#region src/actions/sendAndConfirmBundle.ts
6
+ const NULL_BUNDLE_RESULT = /* @__PURE__ */ new Error("Bundle was not confirmed by this RPC");
7
+ /**
8
+ * Send and confirm a bundle of transactions using Jito.
9
+ * Automatically selects a Jito-enabled RPC connection and polls for confirmation
10
+ * across multiple Jito RPCs in parallel.
11
+ * @param client - The SDK client.
12
+ * @param signedTransactions - Array of signed transactions to bundle.
13
+ * @returns BundleResult containing Bundle ID, transaction signatures, and confirmation results.
14
+ */
7
15
  async function sendAndConfirmBundle(client, signedTransactions) {
8
- const jitoRpcs = await (0, registry_js_1.getJitoRpcs)(client);
9
- if (jitoRpcs.length === 0) {
10
- throw new Error('No Jito-enabled RPC connection available for bundle submission');
11
- }
12
- const serializedTransactions = signedTransactions.map((tx) => (0, kit_1.getBase64EncodedWireTransaction)(tx));
13
- const abortController = new AbortController();
14
- const confirmPromises = jitoRpcs.map(async (jitoRpc) => {
15
- try {
16
- let bundleId;
17
- try {
18
- bundleId = await jitoRpc.sendBundle(serializedTransactions).send();
19
- }
20
- catch (_) {
21
- return null;
22
- }
23
- const [{ value: blockhashResult }, initialBlockHeight] = await Promise.all([
24
- jitoRpc
25
- .getLatestBlockhash({
26
- commitment: 'confirmed',
27
- })
28
- .send(),
29
- jitoRpc
30
- .getBlockHeight({
31
- commitment: 'confirmed',
32
- })
33
- .send(),
34
- ]);
35
- let currentBlockHeight = initialBlockHeight;
36
- while (currentBlockHeight < blockhashResult.lastValidBlockHeight &&
37
- !abortController.signal.aborted) {
38
- const statusResponse = await jitoRpc
39
- .getBundleStatuses([bundleId])
40
- .send();
41
- const bundleStatus = statusResponse.value[0];
42
- if (bundleStatus &&
43
- (bundleStatus.confirmation_status === 'confirmed' ||
44
- bundleStatus.confirmation_status === 'finalized')) {
45
- const txSignatures = bundleStatus.transactions;
46
- const sigResponse = await jitoRpc
47
- .getSignatureStatuses(txSignatures)
48
- .send();
49
- if (!sigResponse?.value || !Array.isArray(sigResponse.value)) {
50
- await (0, sdk_1.sleep)(400);
51
- continue;
52
- }
53
- abortController.abort();
54
- return {
55
- bundleId,
56
- txSignatures,
57
- signatureResults: sigResponse.value,
58
- };
59
- }
60
- await (0, sdk_1.sleep)(400);
61
- if (!abortController.signal.aborted) {
62
- currentBlockHeight = await jitoRpc
63
- .getBlockHeight({
64
- commitment: 'confirmed',
65
- })
66
- .send();
67
- }
68
- }
69
- return null;
70
- }
71
- catch (error) {
72
- if (abortController.signal.aborted) {
73
- return null;
74
- }
75
- throw error;
76
- }
77
- });
78
- const result = await Promise.any(confirmPromises).catch(() => null);
79
- if (!abortController.signal.aborted) {
80
- abortController.abort();
81
- }
82
- if (!result) {
83
- throw new Error('Failed to send and confirm bundle');
84
- }
85
- return result;
16
+ const jitoRpcs = await require_rpc_registry.getJitoRpcs(client);
17
+ if (jitoRpcs.length === 0) throw new Error("No Jito-enabled RPC connection available for bundle submission");
18
+ const serializedTransactions = signedTransactions.map((tx) => (0, _solana_kit.getBase64EncodedWireTransaction)(tx));
19
+ const abortController = new AbortController();
20
+ const confirmPromises = jitoRpcs.map(async (jitoRpc) => {
21
+ try {
22
+ let bundleId;
23
+ try {
24
+ bundleId = await jitoRpc.sendBundle(serializedTransactions).send();
25
+ } catch (_) {
26
+ return null;
27
+ }
28
+ const [{ value: blockhashResult }, initialBlockHeight] = await Promise.all([jitoRpc.getLatestBlockhash({ commitment: "confirmed" }).send(), jitoRpc.getBlockHeight({ commitment: "confirmed" }).send()]);
29
+ let currentBlockHeight = initialBlockHeight;
30
+ while (currentBlockHeight < blockhashResult.lastValidBlockHeight && !abortController.signal.aborted) {
31
+ const bundleStatus = (await jitoRpc.getBundleStatuses([bundleId]).send()).value[0];
32
+ if (bundleStatus && (bundleStatus.confirmation_status === "confirmed" || bundleStatus.confirmation_status === "finalized")) {
33
+ const txSignatures = bundleStatus.transactions;
34
+ const sigResponse = await jitoRpc.getSignatureStatuses(txSignatures).send();
35
+ if (!sigResponse?.value || !Array.isArray(sigResponse.value)) {
36
+ await (0, _lifi_sdk.sleep)(400);
37
+ continue;
38
+ }
39
+ abortController.abort();
40
+ return {
41
+ bundleId,
42
+ txSignatures,
43
+ signatureResults: sigResponse.value
44
+ };
45
+ }
46
+ await (0, _lifi_sdk.sleep)(400);
47
+ if (!abortController.signal.aborted) currentBlockHeight = await jitoRpc.getBlockHeight({ commitment: "confirmed" }).send();
48
+ }
49
+ return null;
50
+ } catch (error) {
51
+ if (abortController.signal.aborted) return null;
52
+ throw error;
53
+ }
54
+ });
55
+ const result = await Promise.any(confirmPromises.map(async (promise) => {
56
+ const bundleResult = await promise;
57
+ if (!bundleResult) throw NULL_BUNDLE_RESULT;
58
+ return bundleResult;
59
+ })).catch(() => null);
60
+ if (!abortController.signal.aborted) abortController.abort();
61
+ if (!result) throw new Error("Failed to send and confirm bundle");
62
+ return result;
86
63
  }
64
+ //#endregion
65
+ exports.sendAndConfirmBundle = sendAndConfirmBundle;
66
+
87
67
  //# sourceMappingURL=sendAndConfirmBundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sendAndConfirmBundle.js","sourceRoot":"","sources":["../../../src/actions/sendAndConfirmBundle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sendAndConfirmBundle.js","names":["getJitoRpcs"],"sources":["../../../src/actions/sendAndConfirmBundle.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n type Signature,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\n\nimport { getJitoRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\nexport type BundleResult = {\n bundleId: string\n txSignatures: Signature[]\n signatureResults: (SignatureStatus | null)[]\n}\n\nconst NULL_BUNDLE_RESULT = new Error('Bundle was not confirmed by this RPC')\n\n/**\n * Send and confirm a bundle of transactions using Jito.\n * Automatically selects a Jito-enabled RPC connection and polls for confirmation\n * across multiple Jito RPCs in parallel.\n * @param client - The SDK client.\n * @param signedTransactions - Array of signed transactions to bundle.\n * @returns BundleResult containing Bundle ID, transaction signatures, and confirmation results.\n */\nexport async function sendAndConfirmBundle(\n client: SDKClient,\n signedTransactions: Transaction[]\n): Promise<BundleResult> {\n const jitoRpcs = await getJitoRpcs(client)\n\n if (jitoRpcs.length === 0) {\n throw new Error(\n 'No Jito-enabled RPC connection available for bundle submission'\n )\n }\n\n // Serialize transactions to base64\n const serializedTransactions = signedTransactions.map((tx) =>\n getBase64EncodedWireTransaction(tx)\n )\n\n const abortController = new AbortController()\n\n const confirmPromises = jitoRpcs.map(async (jitoRpc) => {\n try {\n // Send bundle to Jito\n let bundleId: string\n try {\n bundleId = await jitoRpc.sendBundle(serializedTransactions).send()\n } catch (_) {\n return null\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n jitoRpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let currentBlockHeight = initialBlockHeight\n\n while (\n currentBlockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await jitoRpc\n .getBundleStatuses([bundleId])\n .send()\n\n const bundleStatus = statusResponse.value[0]\n\n // Check if bundle is confirmed or finalized\n if (\n bundleStatus &&\n (bundleStatus.confirmation_status === 'confirmed' ||\n bundleStatus.confirmation_status === 'finalized')\n ) {\n // Bundle confirmed! Extract transaction signatures from bundle status\n const txSignatures = bundleStatus.transactions\n\n // Fetch individual signature results from Jito RPC\n const sigResponse = await jitoRpc\n .getSignatureStatuses(txSignatures)\n .send()\n\n if (!sigResponse?.value || !Array.isArray(sigResponse.value)) {\n // Keep polling if can't find signature results\n await sleep(400)\n continue\n }\n\n // Immediately abort all other connections when we find a result\n abortController.abort()\n return {\n bundleId,\n txSignatures,\n signatureResults: sigResponse.value,\n }\n }\n\n await sleep(400)\n if (!abortController.signal.aborted) {\n currentBlockHeight = await jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n\n return null\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n // Wait for first successful confirmation\n const result = await Promise.any(\n confirmPromises.map(async (promise) => {\n const bundleResult = await promise\n if (!bundleResult) {\n throw NULL_BUNDLE_RESULT\n }\n return bundleResult\n })\n ).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n if (!result) {\n throw new Error('Failed to send and confirm bundle')\n }\n\n return result\n}\n"],"mappings":";;;;;AAyBA,MAAM,qCAAqB,IAAI,MAAM,sCAAsC;;;;;;;;;AAU3E,eAAsB,qBACpB,QACA,oBACuB;CACvB,MAAM,WAAW,MAAMA,qBAAAA,YAAY,MAAM;CAEzC,IAAI,SAAS,WAAW,GACtB,MAAM,IAAI,MACR,gEACF;CAIF,MAAM,yBAAyB,mBAAmB,KAAK,QAAA,GAAA,YAAA,gCAAA,CACrB,EAAE,CACpC;CAEA,MAAM,kBAAkB,IAAI,gBAAgB;CAE5C,MAAM,kBAAkB,SAAS,IAAI,OAAO,YAAY;EACtD,IAAI;GAEF,IAAI;GACJ,IAAI;IACF,WAAW,MAAM,QAAQ,WAAW,sBAAsB,CAAC,CAAC,KAAK;GACnE,SAAS,GAAG;IACV,OAAO;GACT;GAEA,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,QACG,mBAAmB,EAClB,YAAY,YACd,CAAC,CAAC,CACD,KAAK,GACR,QACG,eAAe,EACd,YAAY,YACd,CAAC,CAAC,CACD,KAAK,CACV,CAAC;GAEH,IAAI,qBAAqB;GAEzB,OACE,qBAAqB,gBAAgB,wBACrC,CAAC,gBAAgB,OAAO,SACxB;IAKA,MAAM,gBAAe,MAJQ,QAC1B,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAC7B,KAAK,EAAA,CAE4B,MAAM;IAG1C,IACE,iBACC,aAAa,wBAAwB,eACpC,aAAa,wBAAwB,cACvC;KAEA,MAAM,eAAe,aAAa;KAGlC,MAAM,cAAc,MAAM,QACvB,qBAAqB,YAAY,CAAC,CAClC,KAAK;KAER,IAAI,CAAC,aAAa,SAAS,CAAC,MAAM,QAAQ,YAAY,KAAK,GAAG;MAE5D,OAAA,GAAA,UAAA,MAAA,CAAY,GAAG;MACf;KACF;KAGA,gBAAgB,MAAM;KACtB,OAAO;MACL;MACA;MACA,kBAAkB,YAAY;KAChC;IACF;IAEA,OAAA,GAAA,UAAA,MAAA,CAAY,GAAG;IACf,IAAI,CAAC,gBAAgB,OAAO,SAC1B,qBAAqB,MAAM,QACxB,eAAe,EACd,YAAY,YACd,CAAC,CAAC,CACD,KAAK;GAEZ;GAEA,OAAO;EACT,SAAS,OAAO;GACd,IAAI,gBAAgB,OAAO,SACzB,OAAO;GAET,MAAM;EACR;CACF,CAAC;CAGD,MAAM,SAAS,MAAM,QAAQ,IAC3B,gBAAgB,IAAI,OAAO,YAAY;EACrC,MAAM,eAAe,MAAM;EAC3B,IAAI,CAAC,cACH,MAAM;EAER,OAAO;CACT,CAAC,CACH,CAAC,CAAC,YAAY,IAAI;CAElB,IAAI,CAAC,gBAAgB,OAAO,SAC1B,gBAAgB,MAAM;CAGxB,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,mCAAmC;CAGrD,OAAO;AACT"}
@@ -1,19 +1,30 @@
1
- import { type SDKClient } from '@lifi/sdk';
2
- import { type Commitment, type Transaction, type TransactionError } from '@solana/kit';
1
+ import { SDKClient } from "@lifi/sdk";
2
+ import { Commitment, Transaction, TransactionError } from "@solana/kit";
3
+
4
+ //#region src/actions/sendAndConfirmTransaction.d.ts
3
5
  type SignatureStatus = {
4
- slot: bigint;
5
- confirmations: bigint | null;
6
- err: TransactionError | null;
7
- confirmationStatus: Commitment | null;
8
- status: Readonly<{
9
- Err: TransactionError;
10
- }> | Readonly<{
11
- Ok: null;
12
- }>;
6
+ slot: bigint;
7
+ confirmations: bigint | null;
8
+ err: TransactionError | null;
9
+ confirmationStatus: Commitment | null;
10
+ status: Readonly<{
11
+ Err: TransactionError;
12
+ }> | Readonly<{
13
+ Ok: null;
14
+ }>;
13
15
  };
14
16
  type ConfirmedTransactionResult = {
15
- signatureResult: SignatureStatus | null;
16
- txSignature: string;
17
+ signatureResult: SignatureStatus | null;
18
+ txSignature: string;
17
19
  };
18
- export declare function sendAndConfirmTransaction(client: SDKClient, signedTransaction: Transaction): Promise<ConfirmedTransactionResult>;
19
- export {};
20
+ /**
21
+ * Sends a Solana transaction to multiple RPC endpoints and returns the confirmation
22
+ * as soon as any of them confirm the transaction.
23
+ * @param client - The SDK client.
24
+ * @param signedTransaction - The signed transaction to send.
25
+ * @returns - The confirmation result of the transaction.
26
+ */
27
+ declare function sendAndConfirmTransaction(client: SDKClient, signedTransaction: Transaction): Promise<ConfirmedTransactionResult>;
28
+ //#endregion
29
+ export { sendAndConfirmTransaction };
30
+ //# sourceMappingURL=sendAndConfirmTransaction.d.ts.map
@@ -1,100 +1,76 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sendAndConfirmTransaction = sendAndConfirmTransaction;
4
- const sdk_1 = require("@lifi/sdk");
5
- const kit_1 = require("@solana/kit");
6
- const registry_js_1 = require("../rpc/registry.js");
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_rpc_registry = require("../rpc/registry.js");
3
+ let _lifi_sdk = require("@lifi/sdk");
4
+ let _solana_kit = require("@solana/kit");
5
+ //#region src/actions/sendAndConfirmTransaction.ts
6
+ const NULL_CONFIRMATION_RESULT = /* @__PURE__ */ new Error("Transaction was not confirmed by this RPC");
7
+ /**
8
+ * Sends a Solana transaction to multiple RPC endpoints and returns the confirmation
9
+ * as soon as any of them confirm the transaction.
10
+ * @param client - The SDK client.
11
+ * @param signedTransaction - The signed transaction to send.
12
+ * @returns - The confirmation result of the transaction.
13
+ */
7
14
  async function sendAndConfirmTransaction(client, signedTransaction) {
8
- const solanaRpcs = await (0, registry_js_1.getSolanaRpcs)(client);
9
- const signedTxSerialized = (0, kit_1.getBase64EncodedWireTransaction)(signedTransaction);
10
- const txSignature = (0, kit_1.getSignatureFromTransaction)(signedTransaction);
11
- if (!txSignature) {
12
- throw new Error('Transaction signature is missing.');
13
- }
14
- const rawTransactionOptions = {
15
- skipPreflight: true,
16
- maxRetries: BigInt(0),
17
- preflightCommitment: 'confirmed',
18
- encoding: 'base64',
19
- };
20
- const abortController = new AbortController();
21
- const confirmPromises = solanaRpcs.map(async (rpc) => {
22
- try {
23
- try {
24
- await rpc
25
- .sendTransaction(signedTxSerialized, rawTransactionOptions)
26
- .send();
27
- }
28
- catch (_) {
29
- }
30
- const [{ value: blockhashResult }, initialBlockHeight] = await Promise.all([
31
- rpc
32
- .getLatestBlockhash({
33
- commitment: 'confirmed',
34
- })
35
- .send(),
36
- rpc
37
- .getBlockHeight({
38
- commitment: 'confirmed',
39
- })
40
- .send(),
41
- ]);
42
- let signatureResult = null;
43
- let blockHeight = initialBlockHeight;
44
- const pollingPromise = (async () => {
45
- while (blockHeight < blockhashResult.lastValidBlockHeight &&
46
- !abortController.signal.aborted) {
47
- const statusResponse = await rpc
48
- .getSignatureStatuses([txSignature])
49
- .send();
50
- const status = statusResponse.value[0];
51
- if (status &&
52
- (status.confirmationStatus === 'confirmed' ||
53
- status.confirmationStatus === 'finalized')) {
54
- signatureResult = status;
55
- abortController.abort();
56
- return status;
57
- }
58
- await (0, sdk_1.sleep)(400);
59
- }
60
- return null;
61
- })();
62
- const sendingPromise = (async () => {
63
- while (blockHeight < blockhashResult.lastValidBlockHeight &&
64
- !abortController.signal.aborted &&
65
- !signatureResult) {
66
- try {
67
- await rpc
68
- .sendTransaction(signedTxSerialized, rawTransactionOptions)
69
- .send();
70
- }
71
- catch (_) {
72
- }
73
- await (0, sdk_1.sleep)(1000);
74
- if (!abortController.signal.aborted) {
75
- blockHeight = await rpc
76
- .getBlockHeight({
77
- commitment: 'confirmed',
78
- })
79
- .send();
80
- }
81
- }
82
- return null;
83
- })();
84
- const result = await Promise.race([pollingPromise, sendingPromise]);
85
- return result;
86
- }
87
- catch (error) {
88
- if (abortController.signal.aborted) {
89
- return null;
90
- }
91
- throw error;
92
- }
93
- });
94
- const signatureResult = await Promise.any(confirmPromises).catch(() => null);
95
- if (!abortController.signal.aborted) {
96
- abortController.abort();
97
- }
98
- return { signatureResult, txSignature };
15
+ const solanaRpcs = await require_rpc_registry.getSolanaRpcs(client);
16
+ const signedTxSerialized = (0, _solana_kit.getBase64EncodedWireTransaction)(signedTransaction);
17
+ const txSignature = (0, _solana_kit.getSignatureFromTransaction)(signedTransaction);
18
+ if (!txSignature) throw new Error("Transaction signature is missing.");
19
+ const rawTransactionOptions = {
20
+ skipPreflight: true,
21
+ maxRetries: BigInt(0),
22
+ preflightCommitment: "confirmed",
23
+ encoding: "base64"
24
+ };
25
+ const abortController = new AbortController();
26
+ const confirmPromises = solanaRpcs.map(async (rpc) => {
27
+ try {
28
+ try {
29
+ await rpc.sendTransaction(signedTxSerialized, rawTransactionOptions).send();
30
+ } catch (_) {}
31
+ const [{ value: blockhashResult }, initialBlockHeight] = await Promise.all([rpc.getLatestBlockhash({ commitment: "confirmed" }).send(), rpc.getBlockHeight({ commitment: "confirmed" }).send()]);
32
+ let signatureResult = null;
33
+ let blockHeight = initialBlockHeight;
34
+ const pollingPromise = (async () => {
35
+ while (blockHeight < blockhashResult.lastValidBlockHeight && !abortController.signal.aborted) {
36
+ const status = (await rpc.getSignatureStatuses([txSignature]).send()).value[0];
37
+ if (status && (status.confirmationStatus === "confirmed" || status.confirmationStatus === "finalized")) {
38
+ signatureResult = status;
39
+ abortController.abort();
40
+ return status;
41
+ }
42
+ await (0, _lifi_sdk.sleep)(400);
43
+ }
44
+ return null;
45
+ })();
46
+ const sendingPromise = (async () => {
47
+ while (blockHeight < blockhashResult.lastValidBlockHeight && !abortController.signal.aborted && !signatureResult) {
48
+ try {
49
+ await rpc.sendTransaction(signedTxSerialized, rawTransactionOptions).send();
50
+ } catch (_) {}
51
+ await (0, _lifi_sdk.sleep)(1e3);
52
+ if (!abortController.signal.aborted) blockHeight = await rpc.getBlockHeight({ commitment: "confirmed" }).send();
53
+ }
54
+ return null;
55
+ })();
56
+ return await Promise.race([pollingPromise, sendingPromise]);
57
+ } catch (error) {
58
+ if (abortController.signal.aborted) return null;
59
+ throw error;
60
+ }
61
+ });
62
+ const signatureResult = await Promise.any(confirmPromises.map(async (promise) => {
63
+ const result = await promise;
64
+ if (!result) throw NULL_CONFIRMATION_RESULT;
65
+ return result;
66
+ })).catch(() => null);
67
+ if (!abortController.signal.aborted) abortController.abort();
68
+ return {
69
+ signatureResult,
70
+ txSignature
71
+ };
99
72
  }
73
+ //#endregion
74
+ exports.sendAndConfirmTransaction = sendAndConfirmTransaction;
75
+
100
76
  //# sourceMappingURL=sendAndConfirmTransaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sendAndConfirmTransaction.js","sourceRoot":"","sources":["../../../src/actions/sendAndConfirmTransaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sendAndConfirmTransaction.js","names":["getSolanaRpcs"],"sources":["../../../src/actions/sendAndConfirmTransaction.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n getSignatureFromTransaction,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\nimport { getSolanaRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\ntype ConfirmedTransactionResult = {\n signatureResult: SignatureStatus | null\n txSignature: string\n}\n\nconst NULL_CONFIRMATION_RESULT = new Error(\n 'Transaction was not confirmed by this RPC'\n)\n\n/**\n * Sends a Solana transaction to multiple RPC endpoints and returns the confirmation\n * as soon as any of them confirm the transaction.\n * @param client - The SDK client.\n * @param signedTransaction - The signed transaction to send.\n * @returns - The confirmation result of the transaction.\n */\nexport async function sendAndConfirmTransaction(\n client: SDKClient,\n signedTransaction: Transaction\n): Promise<ConfirmedTransactionResult> {\n const solanaRpcs = await getSolanaRpcs(client)\n\n const signedTxSerialized = getBase64EncodedWireTransaction(signedTransaction)\n // Create transaction hash (signature)\n const txSignature = getSignatureFromTransaction(signedTransaction)\n\n if (!txSignature) {\n throw new Error('Transaction signature is missing.')\n }\n\n const rawTransactionOptions = {\n // We can skip preflight check after the first transaction has been sent\n // https://solana.com/docs/advanced/retry#the-cost-of-skipping-preflight\n skipPreflight: true,\n // Setting max retries to 0 as we are handling retries manually\n maxRetries: BigInt(0),\n // https://solana.com/docs/advanced/confirmation#use-an-appropriate-preflight-commitment-level\n preflightCommitment: 'confirmed' as Commitment,\n encoding: 'base64' as const,\n }\n\n const abortController = new AbortController()\n\n const confirmPromises = solanaRpcs.map(async (rpc) => {\n try {\n // Send initial transaction for this RPC\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue with confirmation even if initial send fails\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n rpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let signatureResult: SignatureStatus | null = null\n let blockHeight = initialBlockHeight\n const pollingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await rpc\n .getSignatureStatuses([txSignature])\n .send()\n\n const status = statusResponse.value[0]\n if (\n status &&\n (status.confirmationStatus === 'confirmed' ||\n status.confirmationStatus === 'finalized')\n ) {\n signatureResult = status\n // Immediately abort all other RPCs when we find a result\n abortController.abort()\n return status\n }\n\n await sleep(400)\n }\n return null\n })()\n\n const sendingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted &&\n !signatureResult\n ) {\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue trying even if individual sends fail\n }\n\n await sleep(1000)\n if (!abortController.signal.aborted) {\n blockHeight = await rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n return null\n })()\n\n // Wait for polling to find the result\n const result = await Promise.race([pollingPromise, sendingPromise])\n return result\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n const signatureResult = await Promise.any(\n confirmPromises.map(async (promise) => {\n const result = await promise\n if (!result) {\n throw NULL_CONFIRMATION_RESULT\n }\n return result\n })\n ).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n return { signatureResult, txSignature }\n}\n"],"mappings":";;;;;AAuBA,MAAM,2CAA2B,IAAI,MACnC,2CACF;;;;;;;;AASA,eAAsB,0BACpB,QACA,mBACqC;CACrC,MAAM,aAAa,MAAMA,qBAAAA,cAAc,MAAM;CAE7C,MAAM,sBAAA,GAAA,YAAA,gCAAA,CAAqD,iBAAiB;CAE5E,MAAM,eAAA,GAAA,YAAA,4BAAA,CAA0C,iBAAiB;CAEjE,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,mCAAmC;CAGrD,MAAM,wBAAwB;EAG5B,eAAe;EAEf,YAAY,OAAO,CAAC;EAEpB,qBAAqB;EACrB,UAAU;CACZ;CAEA,MAAM,kBAAkB,IAAI,gBAAgB;CAE5C,MAAM,kBAAkB,WAAW,IAAI,OAAO,QAAQ;EACpD,IAAI;GAEF,IAAI;IACF,MAAM,IACH,gBAAgB,oBAAoB,qBAAqB,CAAC,CAC1D,KAAK;GACV,SAAS,GAAG,CAEZ;GAEA,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,IACG,mBAAmB,EAClB,YAAY,YACd,CAAC,CAAC,CACD,KAAK,GACR,IACG,eAAe,EACd,YAAY,YACd,CAAC,CAAC,CACD,KAAK,CACV,CAAC;GAEH,IAAI,kBAA0C;GAC9C,IAAI,cAAc;GAClB,MAAM,kBAAkB,YAAY;IAClC,OACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,SACxB;KAKA,MAAM,UAAS,MAJc,IAC1B,qBAAqB,CAAC,WAAW,CAAC,CAAC,CACnC,KAAK,EAAA,CAEsB,MAAM;KACpC,IACE,WACC,OAAO,uBAAuB,eAC7B,OAAO,uBAAuB,cAChC;MACA,kBAAkB;MAElB,gBAAgB,MAAM;MACtB,OAAO;KACT;KAEA,OAAA,GAAA,UAAA,MAAA,CAAY,GAAG;IACjB;IACA,OAAO;GACT,EAAA,CAAG;GAEH,MAAM,kBAAkB,YAAY;IAClC,OACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,WACxB,CAAC,iBACD;KACA,IAAI;MACF,MAAM,IACH,gBAAgB,oBAAoB,qBAAqB,CAAC,CAC1D,KAAK;KACV,SAAS,GAAG,CAEZ;KAEA,OAAA,GAAA,UAAA,MAAA,CAAY,GAAI;KAChB,IAAI,CAAC,gBAAgB,OAAO,SAC1B,cAAc,MAAM,IACjB,eAAe,EACd,YAAY,YACd,CAAC,CAAC,CACD,KAAK;IAEZ;IACA,OAAO;GACT,EAAA,CAAG;GAIH,OAAO,MADc,QAAQ,KAAK,CAAC,gBAAgB,cAAc,CAAC;EAEpE,SAAS,OAAO;GACd,IAAI,gBAAgB,OAAO,SACzB,OAAO;GAET,MAAM;EACR;CACF,CAAC;CAED,MAAM,kBAAkB,MAAM,QAAQ,IACpC,gBAAgB,IAAI,OAAO,YAAY;EACrC,MAAM,SAAS,MAAM;EACrB,IAAI,CAAC,QACH,MAAM;EAER,OAAO;CACT,CAAC,CACH,CAAC,CAAC,YAAY,IAAI;CAElB,IAAI,CAAC,gBAAgB,OAAO,SAC1B,gBAAgB,MAAM;CAGxB,OAAO;EAAE;EAAiB;CAAY;AACxC"}
@@ -0,0 +1,17 @@
1
+ import { SolanaStepExecutorContext, SolanaStepExecutorOptions } from "../types.js";
2
+ import { BaseStepExecutor, ExecutionAction, LiFiStepExtended, SDKError, StepExecutorBaseContext, TaskPipeline } from "@lifi/sdk";
3
+ import { WalletAccount } from "@wallet-standard/base";
4
+
5
+ //#region src/core/SolanaStepExecutor.d.ts
6
+ declare class SolanaStepExecutor extends BaseStepExecutor {
7
+ private wallet;
8
+ private skipSimulation;
9
+ constructor(options: SolanaStepExecutorOptions);
10
+ getWalletAccount: (step: LiFiStepExtended) => WalletAccount;
11
+ override parseErrors: (error: Error, step?: LiFiStepExtended, action?: ExecutionAction) => Promise<SDKError>;
12
+ override createContext: (baseContext: StepExecutorBaseContext) => Promise<SolanaStepExecutorContext>;
13
+ override createPipeline: (context: SolanaStepExecutorContext) => TaskPipeline;
14
+ }
15
+ //#endregion
16
+ export { SolanaStepExecutor };
17
+ //# sourceMappingURL=SolanaStepExecutor.d.ts.map
@@ -0,0 +1,49 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_errors_parseSolanaErrors = require("../errors/parseSolanaErrors.js");
3
+ const require_core_tasks_SolanaSignAndExecuteTask = require("./tasks/SolanaSignAndExecuteTask.js");
4
+ const require_core_tasks_SolanaWaitForTransactionTask = require("./tasks/SolanaWaitForTransactionTask.js");
5
+ let _lifi_sdk = require("@lifi/sdk");
6
+ //#region src/core/SolanaStepExecutor.ts
7
+ var SolanaStepExecutor = class extends _lifi_sdk.BaseStepExecutor {
8
+ wallet;
9
+ skipSimulation;
10
+ constructor(options) {
11
+ super(options);
12
+ this.wallet = options.wallet;
13
+ this.skipSimulation = options.skipSimulation ?? false;
14
+ }
15
+ getWalletAccount = (step) => {
16
+ const account = this.wallet.accounts.find((account) => account.address === step.action.fromAddress);
17
+ if (!account) throw new _lifi_sdk.TransactionError(_lifi_sdk.LiFiErrorCode.WalletChangedDuringExecution, "The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.");
18
+ return account;
19
+ };
20
+ parseErrors = (error, step, action) => require_errors_parseSolanaErrors.parseSolanaErrors(error, step, action);
21
+ createContext = async (baseContext) => {
22
+ const { step } = baseContext;
23
+ const walletAccount = this.getWalletAccount(step);
24
+ return {
25
+ ...baseContext,
26
+ wallet: this.wallet,
27
+ walletAccount,
28
+ skipSimulation: this.skipSimulation
29
+ };
30
+ };
31
+ createPipeline = (context) => {
32
+ const { step, isBridgeExecution } = context;
33
+ const tasks = [
34
+ new _lifi_sdk.CheckBalanceTask(),
35
+ new _lifi_sdk.PrepareTransactionTask(),
36
+ new require_core_tasks_SolanaSignAndExecuteTask.SolanaSignAndExecuteTask(),
37
+ new require_core_tasks_SolanaWaitForTransactionTask.SolanaWaitForTransactionTask(),
38
+ new _lifi_sdk.WaitForTransactionStatusTask(isBridgeExecution ? "RECEIVING_CHAIN" : "SWAP")
39
+ ];
40
+ const swapOrBridgeAction = this.statusManager.findAction(step, isBridgeExecution ? "CROSS_CHAIN" : "SWAP");
41
+ const taskName = swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === "DONE" ? _lifi_sdk.WaitForTransactionStatusTask.name : _lifi_sdk.CheckBalanceTask.name;
42
+ const firstTaskIndex = tasks.findIndex((task) => task.constructor.name === taskName);
43
+ return new _lifi_sdk.TaskPipeline(tasks.slice(firstTaskIndex));
44
+ };
45
+ };
46
+ //#endregion
47
+ exports.SolanaStepExecutor = SolanaStepExecutor;
48
+
49
+ //# sourceMappingURL=SolanaStepExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolanaStepExecutor.js","names":["BaseStepExecutor","TransactionError","LiFiErrorCode","parseSolanaErrors","CheckBalanceTask","PrepareTransactionTask","SolanaSignAndExecuteTask","SolanaWaitForTransactionTask","WaitForTransactionStatusTask","TaskPipeline"],"sources":["../../../src/core/SolanaStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Wallet, WalletAccount } from '@wallet-standard/base'\nimport { parseSolanaErrors } from '../errors/parseSolanaErrors.js'\nimport type {\n SolanaStepExecutorContext,\n SolanaStepExecutorOptions,\n} from '../types.js'\nimport { SolanaSignAndExecuteTask } from './tasks/SolanaSignAndExecuteTask.js'\nimport { SolanaWaitForTransactionTask } from './tasks/SolanaWaitForTransactionTask.js'\n\nexport class SolanaStepExecutor extends BaseStepExecutor {\n private wallet: Wallet\n private skipSimulation: boolean\n\n constructor(options: SolanaStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n this.skipSimulation = options.skipSimulation ?? false\n }\n\n getWalletAccount = (step: LiFiStepExtended): WalletAccount => {\n const account = this.wallet.accounts.find(\n (account) => account.address === step.action.fromAddress\n )\n\n if (!account) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n\n return account\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseSolanaErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<SolanaStepExecutorContext> => {\n const { step } = baseContext\n\n const walletAccount = this.getWalletAccount(step)\n\n return {\n ...baseContext,\n wallet: this.wallet,\n walletAccount,\n skipSimulation: this.skipSimulation,\n }\n }\n\n override createPipeline = (\n context: SolanaStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const tasks = [\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new SolanaSignAndExecuteTask(),\n new SolanaWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;;AAsBA,IAAa,qBAAb,cAAwCA,UAAAA,iBAAiB;CACvD;CACA;CAEA,YAAY,SAAoC;EAC9C,MAAM,OAAO;EACb,KAAK,SAAS,QAAQ;EACtB,KAAK,iBAAiB,QAAQ,kBAAkB;CAClD;CAEA,oBAAoB,SAA0C;EAC5D,MAAM,UAAU,KAAK,OAAO,SAAS,MAClC,YAAY,QAAQ,YAAY,KAAK,OAAO,WAC/C;EAEA,IAAI,CAAC,SACH,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,mHACF;EAGF,OAAO;CACT;CAEA,eACE,OACA,MACA,WACsBC,iCAAAA,kBAAkB,OAAO,MAAM,MAAM;CAE7D,gBAAyB,OACvB,gBACuC;EACvC,MAAM,EAAE,SAAS;EAEjB,MAAM,gBAAgB,KAAK,iBAAiB,IAAI;EAEhD,OAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb;GACA,gBAAgB,KAAK;EACvB;CACF;CAEA,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,QAAQ;GACZ,IAAIC,UAAAA,iBAAiB;GACrB,IAAIC,UAAAA,uBAAuB;GAC3B,IAAIC,4CAAAA,yBAAyB;GAC7B,IAAIC,gDAAAA,6BAA6B;GACjC,IAAIC,UAAAA,6BACF,oBAAoB,oBAAoB,MAC1C;EACF;EAEA,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,MACtC;EAEA,MAAM,WACJ,oBAAoB,UAAU,oBAAoB,WAAW,SACzDA,UAAAA,6BAA6B,OAC7BJ,UAAAA,iBAAiB;EAEvB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,QACtC;EAIA,OAAO,IAAIK,UAAAA,aAFQ,MAAM,MAAM,cAEE,CAAC;CACpC;AACF"}
@@ -0,0 +1,10 @@
1
+ import { SolanaStepExecutorContext } from "../../types.js";
2
+ import { BaseStepExecutionTask, TaskResult } from "@lifi/sdk";
3
+
4
+ //#region src/core/tasks/SolanaJitoWaitForTransactionTask.d.ts
5
+ declare class SolanaJitoWaitForTransactionTask extends BaseStepExecutionTask {
6
+ run(context: SolanaStepExecutorContext): Promise<TaskResult>;
7
+ }
8
+ //#endregion
9
+ export { SolanaJitoWaitForTransactionTask };
10
+ //# sourceMappingURL=SolanaJitoWaitForTransactionTask.d.ts.map
@@ -0,0 +1,35 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_actions_sendAndConfirmBundle = require("../../actions/sendAndConfirmBundle.js");
3
+ const require_utils_solanaErrorCause = require("../../utils/solanaErrorCause.js");
4
+ let _lifi_sdk = require("@lifi/sdk");
5
+ //#region src/core/tasks/SolanaJitoWaitForTransactionTask.ts
6
+ var SolanaJitoWaitForTransactionTask = class extends _lifi_sdk.BaseStepExecutionTask {
7
+ async run(context) {
8
+ const { client, step, statusManager, fromChain, isBridgeExecution, signedTransactions: contextSignedTransactions } = context;
9
+ const signedTransactions = contextSignedTransactions ?? [];
10
+ const action = statusManager.findAction(step, isBridgeExecution ? "CROSS_CHAIN" : "SWAP");
11
+ if (!action) throw new _lifi_sdk.TransactionError(_lifi_sdk.LiFiErrorCode.TransactionUnprepared, "Unable to prepare transaction. Action not found.");
12
+ if (!signedTransactions.length) throw new _lifi_sdk.TransactionError(_lifi_sdk.LiFiErrorCode.TransactionUnprepared, "Unable to prepare transaction. Signed transactions are not found.");
13
+ const bundleResult = await require_actions_sendAndConfirmBundle.sendAndConfirmBundle(client, signedTransactions);
14
+ if (!bundleResult.signatureResults.every((result) => result !== null)) throw new _lifi_sdk.TransactionError(_lifi_sdk.LiFiErrorCode.TransactionFailed, "Bundle confirmation failed: Not all transactions were confirmed.");
15
+ const failedResult = bundleResult.signatureResults.find((result) => result?.err);
16
+ if (failedResult?.err) {
17
+ const cause = new require_utils_solanaErrorCause.SolanaTransactionDetailsError(failedResult.err);
18
+ throw new _lifi_sdk.TransactionError(_lifi_sdk.LiFiErrorCode.TransactionFailed, `Transaction failed: ${cause.message}`, cause);
19
+ }
20
+ const confirmedTransaction = {
21
+ txSignature: bundleResult.txSignatures[0],
22
+ bundleId: bundleResult.bundleId
23
+ };
24
+ statusManager.updateAction(step, action.type, "PENDING", {
25
+ txHash: confirmedTransaction.txSignature,
26
+ txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTransaction.txSignature}`
27
+ });
28
+ if (isBridgeExecution) statusManager.updateAction(step, action.type, "DONE");
29
+ return { status: "COMPLETED" };
30
+ }
31
+ };
32
+ //#endregion
33
+ exports.SolanaJitoWaitForTransactionTask = SolanaJitoWaitForTransactionTask;
34
+
35
+ //# sourceMappingURL=SolanaJitoWaitForTransactionTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolanaJitoWaitForTransactionTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","sendAndConfirmBundle","SolanaTransactionDetailsError"],"sources":["../../../../src/core/tasks/SolanaJitoWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { sendAndConfirmBundle } from '../../actions/sendAndConfirmBundle.js'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { SolanaTransactionDetailsError } from '../../utils/solanaErrorCause.js'\n\nexport class SolanaJitoWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransactions: contextSignedTransactions,\n } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n if (!signedTransactions.length) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Signed transactions are not found.'\n )\n }\n\n // Use Jito bundle for transaction submission\n const bundleResult = await sendAndConfirmBundle(client, signedTransactions)\n\n const allConfirmed = bundleResult.signatureResults.every(\n (result) => result !== null\n )\n\n if (!allConfirmed) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Bundle confirmation failed: Not all transactions were confirmed.'\n )\n }\n\n // Check for errors in any of the transactions\n const failedResult = bundleResult.signatureResults.find(\n (result) => result?.err\n )\n if (failedResult?.err) {\n const cause = new SolanaTransactionDetailsError(failedResult.err)\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction failed: ${cause.message}`,\n cause\n )\n }\n\n const confirmedTransaction = {\n txSignature: bundleResult.txSignatures[0],\n bundleId: bundleResult.bundleId,\n }\n\n // Transaction has been confirmed and we can update the action\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash: confirmedTransaction.txSignature,\n txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTransaction.txSignature}`,\n })\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;;;AAUA,IAAa,mCAAb,cAAsDA,UAAAA,sBAAsB;CAC1E,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,oBAAoB,8BAClB;EAEJ,MAAM,qBAAqB,6BAA6B,CAAC;EAEzD,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,MACtC;EACA,IAAI,CAAC,QACH,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,kDACF;EAGF,IAAI,CAAC,mBAAmB,QACtB,MAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mEACF;EAIF,MAAM,eAAe,MAAMC,qCAAAA,qBAAqB,QAAQ,kBAAkB;EAM1E,IAAI,CAJiB,aAAa,iBAAiB,OAChD,WAAW,WAAW,IAGT,GACd,MAAM,IAAIF,UAAAA,iBACRC,UAAAA,cAAc,mBACd,kEACF;EAIF,MAAM,eAAe,aAAa,iBAAiB,MAChD,WAAW,QAAQ,GACtB;EACA,IAAI,cAAc,KAAK;GACrB,MAAM,QAAQ,IAAIE,+BAAAA,8BAA8B,aAAa,GAAG;GAChE,MAAM,IAAIH,UAAAA,iBACRC,UAAAA,cAAc,mBACd,uBAAuB,MAAM,WAC7B,KACF;EACF;EAEA,MAAM,uBAAuB;GAC3B,aAAa,aAAa,aAAa;GACvC,UAAU,aAAa;EACzB;EAGA,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD,QAAQ,qBAAqB;GAC7B,QAAQ,GAAG,UAAU,SAAS,kBAAkB,GAAG,KAAK,qBAAqB;EAC/E,CAAC;EAED,IAAI,mBACF,cAAc,aAAa,MAAM,OAAO,MAAM,MAAM;EAGtD,OAAO,EAAE,QAAQ,YAAY;CAC/B;AACF"}
@@ -0,0 +1,10 @@
1
+ import { SolanaStepExecutorContext } from "../../types.js";
2
+ import { BaseStepExecutionTask, TaskResult } from "@lifi/sdk";
3
+
4
+ //#region src/core/tasks/SolanaSignAndExecuteTask.d.ts
5
+ declare class SolanaSignAndExecuteTask extends BaseStepExecutionTask {
6
+ run(context: SolanaStepExecutorContext): Promise<TaskResult>;
7
+ }
8
+ //#endregion
9
+ export { SolanaSignAndExecuteTask };
10
+ //# sourceMappingURL=SolanaSignAndExecuteTask.d.ts.map