@lifi/sdk 3.3.0-alpha.3 → 3.3.0-beta.1

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 (431) hide show
  1. package/README.md +2 -2
  2. package/package.json +5 -8
  3. package/src/_cjs/config.js +4 -1
  4. package/src/_cjs/config.js.map +1 -1
  5. package/src/_cjs/core/EVM/EVM.js +1 -1
  6. package/src/_cjs/core/EVM/EVMStepExecutor.js +19 -7
  7. package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
  8. package/src/_cjs/core/EVM/checkAllowance.js +5 -1
  9. package/src/_cjs/core/EVM/checkAllowance.js.map +1 -1
  10. package/src/_cjs/core/EVM/getAllowance.js +3 -3
  11. package/src/_cjs/core/EVM/getAllowance.js.map +1 -1
  12. package/src/_cjs/core/EVM/getEVMBalance.js +4 -6
  13. package/src/_cjs/core/EVM/getEVMBalance.js.map +1 -1
  14. package/src/_cjs/core/EVM/parseEVMErrors.js +3 -3
  15. package/src/_cjs/core/EVM/parseEVMErrors.js.map +1 -1
  16. package/src/_cjs/core/EVM/switchChain.js +5 -1
  17. package/src/_cjs/core/EVM/switchChain.js.map +1 -1
  18. package/src/_cjs/core/EVM/utils.js +4 -1
  19. package/src/_cjs/core/EVM/utils.js.map +1 -1
  20. package/src/_cjs/core/EVM/waitForTransactionReceipt.js +5 -4
  21. package/src/_cjs/core/EVM/waitForTransactionReceipt.js.map +1 -1
  22. package/src/_cjs/core/Solana/Solana.js +1 -1
  23. package/src/_cjs/core/Solana/SolanaStepExecutor.js +14 -6
  24. package/src/_cjs/core/Solana/SolanaStepExecutor.js.map +1 -1
  25. package/src/_cjs/core/Solana/connection.js +1 -3
  26. package/src/_cjs/core/Solana/connection.js.map +1 -1
  27. package/src/_cjs/core/Solana/getSolanaBalance.js +3 -3
  28. package/src/_cjs/core/Solana/getSolanaBalance.js.map +1 -1
  29. package/src/_cjs/core/Solana/isSVMAddress.js +1 -1
  30. package/src/_cjs/core/Solana/isSVMAddress.js.map +1 -1
  31. package/src/_cjs/core/Solana/parseSolanaErrors.js +1 -1
  32. package/src/_cjs/core/Solana/parseSolanaErrors.js.map +1 -1
  33. package/src/_cjs/core/StatusManager.js +4 -3
  34. package/src/_cjs/core/StatusManager.js.map +1 -1
  35. package/src/_cjs/core/UTXO/UTXO.js +1 -1
  36. package/src/_cjs/core/UTXO/UTXOStepExecutor.js +43 -21
  37. package/src/_cjs/core/UTXO/UTXOStepExecutor.js.map +1 -1
  38. package/src/_cjs/core/UTXO/getUTXOBalance.js +3 -3
  39. package/src/_cjs/core/UTXO/getUTXOBalance.js.map +1 -1
  40. package/src/_cjs/core/UTXO/getUTXOPublicClient.js +1 -0
  41. package/src/_cjs/core/UTXO/getUTXOPublicClient.js.map +1 -1
  42. package/src/_cjs/core/UTXO/isUTXOAddress.js +7 -7
  43. package/src/_cjs/core/UTXO/isUTXOAddress.js.map +1 -1
  44. package/src/_cjs/core/UTXO/parseUTXOErrors.js +5 -1
  45. package/src/_cjs/core/UTXO/parseUTXOErrors.js.map +1 -1
  46. package/src/_cjs/core/UTXO/utxo-stack/actions/getBlock.js +31 -0
  47. package/src/_cjs/core/UTXO/utxo-stack/actions/getBlock.js.map +1 -0
  48. package/src/_cjs/core/UTXO/utxo-stack/actions/getBlockStats.js +27 -0
  49. package/src/_cjs/core/UTXO/utxo-stack/actions/getBlockStats.js.map +1 -0
  50. package/src/_cjs/core/UTXO/utxo-stack/actions/getUTXOTransaction.js +18 -9
  51. package/src/_cjs/core/UTXO/utxo-stack/actions/getUTXOTransaction.js.map +1 -1
  52. package/src/_cjs/core/UTXO/utxo-stack/actions/waitForTransaction.js +185 -0
  53. package/src/_cjs/core/UTXO/utxo-stack/actions/waitForTransaction.js.map +1 -0
  54. package/src/_cjs/core/UTXO/utxo-stack/actions/watchBlockNumber.js +45 -0
  55. package/src/_cjs/core/UTXO/utxo-stack/actions/watchBlockNumber.js.map +1 -0
  56. package/src/_cjs/core/UTXO/utxo-stack/decorators/UTXOAPIActions.js.map +1 -1
  57. package/src/_cjs/core/UTXO/utxo-stack/types/blockStats.js +3 -0
  58. package/src/_cjs/core/UTXO/utxo-stack/types/blockStats.js.map +1 -0
  59. package/src/_cjs/core/UTXO/utxo-stack/utils/cancelTransaction.js +51 -0
  60. package/src/_cjs/core/UTXO/utxo-stack/utils/cancelTransaction.js.map +1 -0
  61. package/src/_cjs/core/UTXO/utxo-stack/utils/modifyFee.js +50 -0
  62. package/src/_cjs/core/UTXO/utxo-stack/utils/modifyFee.js.map +1 -0
  63. package/src/_cjs/core/UTXO/utxo-stack/utils/observe.js +48 -0
  64. package/src/_cjs/core/UTXO/utxo-stack/utils/observe.js.map +1 -0
  65. package/src/_cjs/core/UTXO/utxo-stack/utils/poll.js +30 -0
  66. package/src/_cjs/core/UTXO/utxo-stack/utils/poll.js.map +1 -0
  67. package/src/_cjs/core/checkBalance.js +2 -7
  68. package/src/_cjs/core/checkBalance.js.map +1 -1
  69. package/src/_cjs/core/execution.js.map +1 -1
  70. package/src/_cjs/core/stepComparison.js +1 -1
  71. package/src/_cjs/core/waitForReceivingTransaction.js +36 -41
  72. package/src/_cjs/core/waitForReceivingTransaction.js.map +1 -1
  73. package/src/_cjs/createConfig.js.map +1 -1
  74. package/src/_cjs/errors/baseError.js +1 -1
  75. package/src/_cjs/errors/baseError.js.map +1 -1
  76. package/src/_cjs/errors/constants.js +1 -0
  77. package/src/_cjs/errors/constants.js.map +1 -1
  78. package/src/_cjs/errors/errors.js +1 -1
  79. package/src/_cjs/errors/errors.js.map +1 -1
  80. package/src/_cjs/errors/httpError.js +1 -1
  81. package/src/_cjs/errors/httpError.js.map +1 -1
  82. package/src/_cjs/helpers.js +3 -3
  83. package/src/_cjs/helpers.js.map +1 -1
  84. package/src/_cjs/index.js +67 -11
  85. package/src/_cjs/index.js.map +1 -1
  86. package/src/_cjs/request.js +1 -1
  87. package/src/_cjs/request.js.map +1 -1
  88. package/src/_cjs/services/api.js +30 -18
  89. package/src/_cjs/services/api.js.map +1 -1
  90. package/src/_cjs/services/balance.js +11 -4
  91. package/src/_cjs/services/balance.js.map +1 -1
  92. package/src/_cjs/utils/getTransactionMessage.js +3 -4
  93. package/src/_cjs/utils/getTransactionMessage.js.map +1 -1
  94. package/src/_cjs/utils/withDedupe.js.map +1 -1
  95. package/src/_cjs/version.js +1 -1
  96. package/src/_cjs/version.js.map +1 -1
  97. package/src/_esm/config.js +4 -1
  98. package/src/_esm/config.js.map +1 -1
  99. package/src/_esm/core/EVM/EVM.js +1 -1
  100. package/src/_esm/core/EVM/EVMStepExecutor.js +18 -6
  101. package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
  102. package/src/_esm/core/EVM/checkAllowance.js +5 -1
  103. package/src/_esm/core/EVM/checkAllowance.js.map +1 -1
  104. package/src/_esm/core/EVM/getAllowance.js +3 -3
  105. package/src/_esm/core/EVM/getAllowance.js.map +1 -1
  106. package/src/_esm/core/EVM/getEVMBalance.js +4 -6
  107. package/src/_esm/core/EVM/getEVMBalance.js.map +1 -1
  108. package/src/_esm/core/EVM/parseEVMErrors.js +2 -3
  109. package/src/_esm/core/EVM/parseEVMErrors.js.map +1 -1
  110. package/src/_esm/core/EVM/publicClient.js +1 -1
  111. package/src/_esm/core/EVM/publicClient.js.map +1 -1
  112. package/src/_esm/core/EVM/switchChain.js +5 -1
  113. package/src/_esm/core/EVM/switchChain.js.map +1 -1
  114. package/src/_esm/core/EVM/types.js +0 -1
  115. package/src/_esm/core/EVM/types.js.map +1 -1
  116. package/src/_esm/core/EVM/utils.js +4 -2
  117. package/src/_esm/core/EVM/utils.js.map +1 -1
  118. package/src/_esm/core/EVM/waitForTransactionReceipt.js +3 -2
  119. package/src/_esm/core/EVM/waitForTransactionReceipt.js.map +1 -1
  120. package/src/_esm/core/Solana/Solana.js +1 -1
  121. package/src/_esm/core/Solana/SolanaStepExecutor.js +13 -6
  122. package/src/_esm/core/Solana/SolanaStepExecutor.js.map +1 -1
  123. package/src/_esm/core/Solana/connection.js +1 -3
  124. package/src/_esm/core/Solana/connection.js.map +1 -1
  125. package/src/_esm/core/Solana/getSolanaBalance.js +3 -3
  126. package/src/_esm/core/Solana/getSolanaBalance.js.map +1 -1
  127. package/src/_esm/core/Solana/isSVMAddress.js +1 -1
  128. package/src/_esm/core/Solana/isSVMAddress.js.map +1 -1
  129. package/src/_esm/core/Solana/parseSolanaErrors.js +1 -1
  130. package/src/_esm/core/Solana/parseSolanaErrors.js.map +1 -1
  131. package/src/_esm/core/Solana/types.js +0 -1
  132. package/src/_esm/core/Solana/types.js.map +1 -1
  133. package/src/_esm/core/StatusManager.js +13 -6
  134. package/src/_esm/core/StatusManager.js.map +1 -1
  135. package/src/_esm/core/UTXO/UTXO.js +1 -1
  136. package/src/_esm/core/UTXO/UTXOStepExecutor.js +44 -38
  137. package/src/_esm/core/UTXO/UTXOStepExecutor.js.map +1 -1
  138. package/src/_esm/core/UTXO/getUTXOAPIPublicClient.js.map +1 -1
  139. package/src/_esm/core/UTXO/getUTXOBalance.js +3 -3
  140. package/src/_esm/core/UTXO/getUTXOBalance.js.map +1 -1
  141. package/src/_esm/core/UTXO/getUTXOPublicClient.js +2 -1
  142. package/src/_esm/core/UTXO/getUTXOPublicClient.js.map +1 -1
  143. package/src/_esm/core/UTXO/isUTXOAddress.js +7 -7
  144. package/src/_esm/core/UTXO/isUTXOAddress.js.map +1 -1
  145. package/src/_esm/core/UTXO/parseUTXOErrors.js +6 -1
  146. package/src/_esm/core/UTXO/parseUTXOErrors.js.map +1 -1
  147. package/src/_esm/core/UTXO/types.js +0 -1
  148. package/src/_esm/core/UTXO/types.js.map +1 -1
  149. package/src/_esm/core/UTXO/utxo-stack/actions/getBalance.js +0 -1
  150. package/src/_esm/core/UTXO/utxo-stack/actions/getBalance.js.map +1 -1
  151. package/src/_esm/core/UTXO/utxo-stack/actions/getBlock.js +28 -0
  152. package/src/_esm/core/UTXO/utxo-stack/actions/getBlock.js.map +1 -0
  153. package/src/_esm/core/UTXO/utxo-stack/actions/getBlockCount.js +0 -1
  154. package/src/_esm/core/UTXO/utxo-stack/actions/getBlockCount.js.map +1 -1
  155. package/src/_esm/core/UTXO/utxo-stack/actions/getBlockStats.js +24 -0
  156. package/src/_esm/core/UTXO/utxo-stack/actions/getBlockStats.js.map +1 -0
  157. package/src/_esm/core/UTXO/utxo-stack/actions/getUTXOTransaction.js +18 -10
  158. package/src/_esm/core/UTXO/utxo-stack/actions/getUTXOTransaction.js.map +1 -1
  159. package/src/_esm/core/UTXO/utxo-stack/actions/sendUTXOTransaction.js +0 -1
  160. package/src/_esm/core/UTXO/utxo-stack/actions/sendUTXOTransaction.js.map +1 -1
  161. package/src/_esm/core/UTXO/utxo-stack/actions/signPsbt.js +0 -1
  162. package/src/_esm/core/UTXO/utxo-stack/actions/signPsbt.js.map +1 -1
  163. package/src/_esm/core/UTXO/utxo-stack/actions/waitForTransaction.js +230 -0
  164. package/src/_esm/core/UTXO/utxo-stack/actions/waitForTransaction.js.map +1 -0
  165. package/src/_esm/core/UTXO/utxo-stack/actions/watchBlockNumber.js +58 -0
  166. package/src/_esm/core/UTXO/utxo-stack/actions/watchBlockNumber.js.map +1 -0
  167. package/src/_esm/core/UTXO/utxo-stack/decorators/UTXOAPIActions.js.map +1 -1
  168. package/src/_esm/core/UTXO/utxo-stack/decorators/UTXOActions.js.map +1 -1
  169. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.js +1 -1
  170. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.js.map +1 -1
  171. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/utxo.js +1 -1
  172. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/utxo.js.map +1 -1
  173. package/src/_esm/core/UTXO/utxo-stack/types/blockStats.js +2 -0
  174. package/src/_esm/core/UTXO/utxo-stack/types/blockStats.js.map +1 -0
  175. package/src/_esm/core/UTXO/utxo-stack/utils/cancelTransaction.js +55 -0
  176. package/src/_esm/core/UTXO/utxo-stack/utils/cancelTransaction.js.map +1 -0
  177. package/src/_esm/core/UTXO/utxo-stack/utils/modifyFee.js +53 -0
  178. package/src/_esm/core/UTXO/utxo-stack/utils/modifyFee.js.map +1 -0
  179. package/src/_esm/core/UTXO/utxo-stack/utils/observe.js +51 -0
  180. package/src/_esm/core/UTXO/utxo-stack/utils/observe.js.map +1 -0
  181. package/src/_esm/core/UTXO/utxo-stack/utils/poll.js +30 -0
  182. package/src/_esm/core/UTXO/utxo-stack/utils/poll.js.map +1 -0
  183. package/src/_esm/core/checkBalance.js +2 -7
  184. package/src/_esm/core/checkBalance.js.map +1 -1
  185. package/src/_esm/core/execution.js.map +1 -1
  186. package/src/_esm/core/processMessages.js +0 -1
  187. package/src/_esm/core/processMessages.js.map +1 -1
  188. package/src/_esm/core/rpc.js +0 -1
  189. package/src/_esm/core/rpc.js.map +1 -1
  190. package/src/_esm/core/stepComparison.js +1 -1
  191. package/src/_esm/core/utils.js +0 -1
  192. package/src/_esm/core/utils.js.map +1 -1
  193. package/src/_esm/core/waitForReceivingTransaction.js +36 -41
  194. package/src/_esm/core/waitForReceivingTransaction.js.map +1 -1
  195. package/src/_esm/createConfig.js +0 -1
  196. package/src/_esm/createConfig.js.map +1 -1
  197. package/src/_esm/errors/SDKError.js +0 -1
  198. package/src/_esm/errors/SDKError.js.map +1 -1
  199. package/src/_esm/errors/baseError.js +2 -2
  200. package/src/_esm/errors/baseError.js.map +1 -1
  201. package/src/_esm/errors/constants.js +1 -0
  202. package/src/_esm/errors/constants.js.map +1 -1
  203. package/src/_esm/errors/errors.js +1 -1
  204. package/src/_esm/errors/errors.js.map +1 -1
  205. package/src/_esm/errors/httpError.js +2 -2
  206. package/src/_esm/errors/httpError.js.map +1 -1
  207. package/src/_esm/helpers.js +4 -6
  208. package/src/_esm/helpers.js.map +1 -1
  209. package/src/_esm/index.js +13 -9
  210. package/src/_esm/index.js.map +1 -1
  211. package/src/_esm/request.js +1 -1
  212. package/src/_esm/request.js.map +1 -1
  213. package/src/_esm/services/api.js +30 -19
  214. package/src/_esm/services/api.js.map +1 -1
  215. package/src/_esm/services/balance.js +11 -4
  216. package/src/_esm/services/balance.js.map +1 -1
  217. package/src/_esm/utils/getTransactionMessage.js +3 -4
  218. package/src/_esm/utils/getTransactionMessage.js.map +1 -1
  219. package/src/_esm/utils/withDedupe.js +0 -1
  220. package/src/_esm/utils/withDedupe.js.map +1 -1
  221. package/src/_esm/version.js +1 -1
  222. package/src/_esm/version.js.map +1 -1
  223. package/src/_types/config.d.ts.map +1 -1
  224. package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
  225. package/src/_types/core/EVM/checkAllowance.d.ts.map +1 -1
  226. package/src/_types/core/EVM/getEVMBalance.d.ts.map +1 -1
  227. package/src/_types/core/EVM/parseEVMErrors.d.ts +1 -1
  228. package/src/_types/core/EVM/parseEVMErrors.d.ts.map +1 -1
  229. package/src/_types/core/EVM/types.d.ts +1 -1
  230. package/src/_types/core/EVM/types.d.ts.map +1 -1
  231. package/src/_types/core/EVM/utils.d.ts +1 -1
  232. package/src/_types/core/EVM/utils.d.ts.map +1 -1
  233. package/src/_types/core/EVM/waitForTransactionReceipt.d.ts.map +1 -1
  234. package/src/_types/core/Solana/SolanaStepExecutor.d.ts +1 -1
  235. package/src/_types/core/Solana/SolanaStepExecutor.d.ts.map +1 -1
  236. package/src/_types/core/Solana/connection.d.ts.map +1 -1
  237. package/src/_types/core/Solana/parseSolanaErrors.d.ts.map +1 -1
  238. package/src/_types/core/Solana/types.d.ts +1 -1
  239. package/src/_types/core/Solana/types.d.ts.map +1 -1
  240. package/src/_types/core/StatusManager.d.ts +18 -8
  241. package/src/_types/core/StatusManager.d.ts.map +1 -1
  242. package/src/_types/core/UTXO/UTXOStepExecutor.d.ts.map +1 -1
  243. package/src/_types/core/UTXO/getUTXOAPIPublicClient.d.ts.map +1 -1
  244. package/src/_types/core/UTXO/getUTXOBalance.d.ts.map +1 -1
  245. package/src/_types/core/UTXO/getUTXOPublicClient.d.ts.map +1 -1
  246. package/src/_types/core/UTXO/isUTXOAddress.d.ts.map +1 -1
  247. package/src/_types/core/UTXO/parseUTXOErrors.d.ts.map +1 -1
  248. package/src/_types/core/UTXO/types.d.ts +1 -1
  249. package/src/_types/core/UTXO/types.d.ts.map +1 -1
  250. package/src/_types/core/UTXO/utxo-stack/actions/getBalance.d.ts +1 -1
  251. package/src/_types/core/UTXO/utxo-stack/actions/getBalance.d.ts.map +1 -1
  252. package/src/_types/core/UTXO/utxo-stack/actions/getBlock.d.ts +13 -0
  253. package/src/_types/core/UTXO/utxo-stack/actions/getBlock.d.ts.map +1 -0
  254. package/src/_types/core/UTXO/utxo-stack/actions/getBlockCount.d.ts +1 -1
  255. package/src/_types/core/UTXO/utxo-stack/actions/getBlockCount.d.ts.map +1 -1
  256. package/src/_types/core/UTXO/utxo-stack/actions/getBlockStats.d.ts +15 -0
  257. package/src/_types/core/UTXO/utxo-stack/actions/getBlockStats.d.ts.map +1 -0
  258. package/src/_types/core/UTXO/utxo-stack/actions/getUTXOTransaction.d.ts +2 -2
  259. package/src/_types/core/UTXO/utxo-stack/actions/getUTXOTransaction.d.ts.map +1 -1
  260. package/src/_types/core/UTXO/utxo-stack/actions/sendUTXOTransaction.d.ts +2 -2
  261. package/src/_types/core/UTXO/utxo-stack/actions/sendUTXOTransaction.d.ts.map +1 -1
  262. package/src/_types/core/UTXO/utxo-stack/actions/signPsbt.d.ts +1 -1
  263. package/src/_types/core/UTXO/utxo-stack/actions/signPsbt.d.ts.map +1 -1
  264. package/src/_types/core/UTXO/utxo-stack/actions/waitForTransaction.d.ts +76 -0
  265. package/src/_types/core/UTXO/utxo-stack/actions/waitForTransaction.d.ts.map +1 -0
  266. package/src/_types/core/UTXO/utxo-stack/actions/watchBlockNumber.d.ts +26 -0
  267. package/src/_types/core/UTXO/utxo-stack/actions/watchBlockNumber.d.ts.map +1 -0
  268. package/src/_types/core/UTXO/utxo-stack/decorators/UTXOAPIActions.d.ts.map +1 -1
  269. package/src/_types/core/UTXO/utxo-stack/decorators/UTXOActions.d.ts.map +1 -1
  270. package/src/_types/core/UTXO/utxo-stack/transports/utxo/types.d.ts +16 -0
  271. package/src/_types/core/UTXO/utxo-stack/transports/utxo/types.d.ts.map +1 -1
  272. package/src/_types/core/UTXO/utxo-stack/transports/utxo/utxo.d.ts.map +1 -1
  273. package/src/_types/core/UTXO/utxo-stack/types/blockStats.d.ts +35 -0
  274. package/src/_types/core/UTXO/utxo-stack/types/blockStats.d.ts.map +1 -0
  275. package/src/_types/core/UTXO/utxo-stack/utils/cancelTransaction.d.ts +3 -0
  276. package/src/_types/core/UTXO/utxo-stack/utils/cancelTransaction.d.ts.map +1 -0
  277. package/src/_types/core/UTXO/utxo-stack/utils/modifyFee.d.ts +3 -0
  278. package/src/_types/core/UTXO/utxo-stack/utils/modifyFee.d.ts.map +1 -0
  279. package/src/_types/core/UTXO/utxo-stack/utils/observe.d.ts +19 -0
  280. package/src/_types/core/UTXO/utxo-stack/utils/observe.d.ts.map +1 -0
  281. package/src/_types/core/UTXO/utxo-stack/utils/poll.d.ts +13 -0
  282. package/src/_types/core/UTXO/utxo-stack/utils/poll.d.ts.map +1 -0
  283. package/src/_types/core/checkBalance.d.ts.map +1 -1
  284. package/src/_types/core/execution.d.ts.map +1 -1
  285. package/src/_types/core/processMessages.d.ts +1 -1
  286. package/src/_types/core/processMessages.d.ts.map +1 -1
  287. package/src/_types/core/rpc.d.ts +1 -1
  288. package/src/_types/core/rpc.d.ts.map +1 -1
  289. package/src/_types/core/utils.d.ts +1 -1
  290. package/src/_types/core/utils.d.ts.map +1 -1
  291. package/src/_types/core/waitForReceivingTransaction.d.ts.map +1 -1
  292. package/src/_types/createConfig.d.ts +1 -1
  293. package/src/_types/createConfig.d.ts.map +1 -1
  294. package/src/_types/errors/SDKError.d.ts +1 -1
  295. package/src/_types/errors/SDKError.d.ts.map +1 -1
  296. package/src/_types/errors/constants.d.ts +2 -1
  297. package/src/_types/errors/constants.d.ts.map +1 -1
  298. package/src/_types/errors/errors.d.ts +1 -1
  299. package/src/_types/errors/errors.d.ts.map +1 -1
  300. package/src/_types/errors/httpError.d.ts +1 -1
  301. package/src/_types/errors/httpError.d.ts.map +1 -1
  302. package/src/_types/helpers.d.ts +1 -1
  303. package/src/_types/helpers.d.ts.map +1 -1
  304. package/src/_types/index.d.ts +15 -9
  305. package/src/_types/index.d.ts.map +1 -1
  306. package/src/_types/services/api.d.ts.map +1 -1
  307. package/src/_types/services/balance.d.ts.map +1 -1
  308. package/src/_types/types/internal.d.ts +1 -39
  309. package/src/_types/types/internal.d.ts.map +1 -1
  310. package/src/_types/utils/getTransactionMessage.d.ts.map +1 -1
  311. package/src/_types/utils/withDedupe.d.ts.map +1 -1
  312. package/src/_types/version.d.ts +1 -1
  313. package/src/_types/version.d.ts.map +1 -1
  314. package/src/config.ts +4 -1
  315. package/src/core/EVM/EVM.ts +1 -1
  316. package/src/core/EVM/EVMStepExecutor.ts +15 -13
  317. package/src/core/EVM/checkAllowance.ts +4 -3
  318. package/src/core/EVM/getAllowance.ts +3 -3
  319. package/src/core/EVM/getEVMBalance.ts +4 -5
  320. package/src/core/EVM/parseEVMErrors.ts +3 -3
  321. package/src/core/EVM/publicClient.ts +2 -2
  322. package/src/core/EVM/switchChain.ts +5 -5
  323. package/src/core/EVM/types.ts +2 -2
  324. package/src/core/EVM/utils.ts +5 -5
  325. package/src/core/EVM/waitForTransactionReceipt.ts +3 -2
  326. package/src/core/Solana/Solana.ts +1 -1
  327. package/src/core/Solana/SolanaStepExecutor.ts +13 -12
  328. package/src/core/Solana/connection.ts +1 -2
  329. package/src/core/Solana/getSolanaBalance.ts +3 -3
  330. package/src/core/Solana/isSVMAddress.ts +1 -1
  331. package/src/core/Solana/parseSolanaErrors.ts +1 -1
  332. package/src/core/Solana/types.ts +1 -1
  333. package/src/core/StatusManager.ts +26 -28
  334. package/src/core/UTXO/UTXO.ts +1 -1
  335. package/src/core/UTXO/UTXOStepExecutor.ts +59 -56
  336. package/src/core/UTXO/getUTXOAPIPublicClient.ts +3 -3
  337. package/src/core/UTXO/getUTXOBalance.ts +3 -4
  338. package/src/core/UTXO/getUTXOPublicClient.ts +4 -3
  339. package/src/core/UTXO/isUTXOAddress.ts +10 -11
  340. package/src/core/UTXO/parseUTXOErrors.ts +12 -1
  341. package/src/core/UTXO/types.ts +1 -1
  342. package/src/core/UTXO/utxo-stack/actions/getBalance.ts +1 -1
  343. package/src/core/UTXO/utxo-stack/actions/getBlock.ts +58 -0
  344. package/src/core/UTXO/utxo-stack/actions/getBlockCount.ts +1 -1
  345. package/src/core/UTXO/utxo-stack/actions/getBlockStats.ts +55 -0
  346. package/src/core/UTXO/utxo-stack/actions/getUTXOTransaction.ts +24 -11
  347. package/src/core/UTXO/utxo-stack/actions/sendUTXOTransaction.ts +2 -2
  348. package/src/core/UTXO/utxo-stack/actions/signPsbt.ts +1 -1
  349. package/src/core/UTXO/utxo-stack/actions/waitForTransaction.ts +387 -0
  350. package/src/core/UTXO/utxo-stack/actions/watchBlockNumber.ts +105 -0
  351. package/src/core/UTXO/utxo-stack/decorators/UTXOAPIActions.ts +1 -2
  352. package/src/core/UTXO/utxo-stack/decorators/UTXOActions.ts +3 -3
  353. package/src/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.ts +1 -1
  354. package/src/core/UTXO/utxo-stack/transports/utxo/types.ts +16 -0
  355. package/src/core/UTXO/utxo-stack/transports/utxo/utxo.ts +3 -3
  356. package/src/core/UTXO/utxo-stack/types/blockStats.ts +35 -0
  357. package/src/core/UTXO/utxo-stack/utils/cancelTransaction.ts +75 -0
  358. package/src/core/UTXO/utxo-stack/utils/modifyFee.ts +78 -0
  359. package/src/core/UTXO/utxo-stack/utils/observe.ts +81 -0
  360. package/src/core/UTXO/utxo-stack/utils/poll.ts +48 -0
  361. package/src/core/checkBalance.ts +2 -8
  362. package/src/core/execution.ts +0 -1
  363. package/src/core/processMessages.ts +5 -5
  364. package/src/core/rpc.ts +1 -1
  365. package/src/core/stepComparison.ts +1 -1
  366. package/src/core/utils.ts +1 -1
  367. package/src/core/waitForReceivingTransaction.ts +42 -46
  368. package/src/createConfig.ts +1 -2
  369. package/src/errors/SDKError.ts +1 -1
  370. package/src/errors/baseError.ts +2 -2
  371. package/src/errors/constants.ts +1 -0
  372. package/src/errors/errors.ts +1 -1
  373. package/src/errors/httpError.ts +3 -3
  374. package/src/helpers.ts +4 -5
  375. package/src/index.ts +84 -9
  376. package/src/request.ts +1 -1
  377. package/src/services/api.ts +29 -33
  378. package/src/services/balance.ts +13 -4
  379. package/src/types/internal.ts +1 -40
  380. package/src/utils/getTransactionMessage.ts +3 -4
  381. package/src/utils/withDedupe.ts +0 -1
  382. package/src/version.ts +1 -1
  383. package/src/_cjs/core/UTXO/blockchairApi.js +0 -169
  384. package/src/_cjs/core/UTXO/blockchairApi.js.map +0 -1
  385. package/src/_cjs/core/UTXO/blockchairApiTypes.js +0 -26
  386. package/src/_cjs/core/UTXO/blockchairApiTypes.js.map +0 -1
  387. package/src/_cjs/core/UTXO/requestClient.js +0 -63
  388. package/src/_cjs/core/UTXO/requestClient.js.map +0 -1
  389. package/src/_cjs/core/index.js +0 -7
  390. package/src/_cjs/core/index.js.map +0 -1
  391. package/src/_cjs/errors/index.js +0 -11
  392. package/src/_cjs/errors/index.js.map +0 -1
  393. package/src/_cjs/types/index.js +0 -5
  394. package/src/_cjs/types/index.js.map +0 -1
  395. package/src/_cjs/utils/index.js +0 -8
  396. package/src/_cjs/utils/index.js.map +0 -1
  397. package/src/_esm/core/UTXO/blockchairApi.js +0 -167
  398. package/src/_esm/core/UTXO/blockchairApi.js.map +0 -1
  399. package/src/_esm/core/UTXO/blockchairApiTypes.js +0 -23
  400. package/src/_esm/core/UTXO/blockchairApiTypes.js.map +0 -1
  401. package/src/_esm/core/UTXO/requestClient.js +0 -59
  402. package/src/_esm/core/UTXO/requestClient.js.map +0 -1
  403. package/src/_esm/core/index.js +0 -4
  404. package/src/_esm/core/index.js.map +0 -1
  405. package/src/_esm/errors/index.js +0 -8
  406. package/src/_esm/errors/index.js.map +0 -1
  407. package/src/_esm/types/index.js +0 -2
  408. package/src/_esm/types/index.js.map +0 -1
  409. package/src/_esm/utils/index.js +0 -5
  410. package/src/_esm/utils/index.js.map +0 -1
  411. package/src/_types/core/UTXO/blockchairApi.d.ts +0 -37
  412. package/src/_types/core/UTXO/blockchairApi.d.ts.map +0 -1
  413. package/src/_types/core/UTXO/blockchairApiTypes.d.ts +0 -229
  414. package/src/_types/core/UTXO/blockchairApiTypes.d.ts.map +0 -1
  415. package/src/_types/core/UTXO/requestClient.d.ts +0 -22
  416. package/src/_types/core/UTXO/requestClient.d.ts.map +0 -1
  417. package/src/_types/core/index.d.ts +0 -4
  418. package/src/_types/core/index.d.ts.map +0 -1
  419. package/src/_types/errors/index.d.ts +0 -8
  420. package/src/_types/errors/index.d.ts.map +0 -1
  421. package/src/_types/types/index.d.ts +0 -2
  422. package/src/_types/types/index.d.ts.map +0 -1
  423. package/src/_types/utils/index.d.ts +0 -5
  424. package/src/_types/utils/index.d.ts.map +0 -1
  425. package/src/core/UTXO/blockchairApi.ts +0 -273
  426. package/src/core/UTXO/blockchairApiTypes.ts +0 -253
  427. package/src/core/UTXO/requestClient.ts +0 -84
  428. package/src/core/index.ts +0 -3
  429. package/src/errors/index.ts +0 -7
  430. package/src/types/index.ts +0 -1
  431. package/src/utils/index.ts +0 -4
@@ -1,5 +1,5 @@
1
1
  import { sha256 } from '@noble/hashes/sha256'
2
- import { bech32, bech32m } from 'bech32'
2
+ import { type Decoded, bech32, bech32m } from 'bech32'
3
3
  import bs58 from 'bs58'
4
4
 
5
5
  export enum UTXONetwork {
@@ -26,26 +26,26 @@ export type UTXOAddress = {
26
26
  const addressTypes: {
27
27
  [key: number]: { type: UTXOAddressType; network: UTXONetwork }
28
28
  } = {
29
- 0x00: {
29
+ 0: {
30
30
  type: UTXOAddressType.p2pkh,
31
31
  network: UTXONetwork.Mainnet,
32
32
  },
33
- 0x6f: {
33
+ 111: {
34
34
  type: UTXOAddressType.p2pkh,
35
35
  network: UTXONetwork.Testnet,
36
36
  },
37
- 0x05: {
37
+ 5: {
38
38
  type: UTXOAddressType.p2sh,
39
39
  network: UTXONetwork.Mainnet,
40
40
  },
41
- 0xc4: {
41
+ 196: {
42
42
  type: UTXOAddressType.p2sh,
43
43
  network: UTXONetwork.Testnet,
44
44
  },
45
45
  }
46
46
 
47
47
  const parseBech32 = (address: string): UTXOAddress => {
48
- let decoded
48
+ let decoded: Decoded
49
49
 
50
50
  try {
51
51
  if (
@@ -57,7 +57,7 @@ const parseBech32 = (address: string): UTXOAddress => {
57
57
  } else {
58
58
  decoded = bech32.decode(address)
59
59
  }
60
- } catch (error) {
60
+ } catch (_error) {
61
61
  throw new Error('Invalid address')
62
62
  }
63
63
 
@@ -80,8 +80,7 @@ const parseBech32 = (address: string): UTXOAddress => {
80
80
  }
81
81
  const data = bech32.fromWords(decoded.words.slice(1))
82
82
 
83
- let type
84
-
83
+ let type: UTXOAddressType
85
84
  if (data.length === 20) {
86
85
  type = UTXOAddressType.p2wpkh
87
86
  } else if (witnessVersion === 1) {
@@ -108,7 +107,7 @@ export const getUTXOAddress = (address: string): UTXOAddress => {
108
107
 
109
108
  try {
110
109
  decoded = bs58.decode(address)
111
- } catch (error) {
110
+ } catch (_error) {
112
111
  throw new Error('Invalid address')
113
112
  }
114
113
 
@@ -160,7 +159,7 @@ export const isUTXOAddress = (
160
159
  }
161
160
 
162
161
  return true
163
- } catch (error) {
162
+ } catch (_error) {
164
163
  return false
165
164
  }
166
165
  }
@@ -1,8 +1,8 @@
1
1
  import type { LiFiStep, Process } from '@lifi/types'
2
+ import { SDKError } from '../../errors/SDKError.js'
2
3
  import { BaseError } from '../../errors/baseError.js'
3
4
  import { ErrorMessage, LiFiErrorCode } from '../../errors/constants.js'
4
5
  import { TransactionError, UnknownError } from '../../errors/errors.js'
5
- import { SDKError } from '../../errors/SDKError.js'
6
6
 
7
7
  export const parseUTXOErrors = async (
8
8
  e: Error,
@@ -21,6 +21,17 @@ export const parseUTXOErrors = async (
21
21
  }
22
22
 
23
23
  const handleSpecificErrors = (e: any) => {
24
+ // txn-mempool-conflict
25
+ if (
26
+ e.details?.includes?.('conflict') ||
27
+ e.cause?.message?.includes?.('conflict')
28
+ ) {
29
+ return new TransactionError(
30
+ LiFiErrorCode.TransactionConflict,
31
+ 'Your transaction conflicts with another transaction already in the mempool. One or more inputs have been spent by another transaction.',
32
+ e
33
+ )
34
+ }
24
35
  if (e.code === 4001 || e.code === -32000 || e.cause?.includes?.('rejected')) {
25
36
  return new TransactionError(LiFiErrorCode.SignatureRejected, e.message, e)
26
37
  }
@@ -1,6 +1,6 @@
1
1
  import { ChainType } from '@lifi/types'
2
2
  import type { Client } from 'viem'
3
- import { type SDKProvider } from '../types.js'
3
+ import type { SDKProvider } from '../types.js'
4
4
 
5
5
  export interface UTXOProviderOptions {
6
6
  getWalletClient?: () => Promise<Client>
@@ -1,4 +1,4 @@
1
- import { type Account, type Chain, type Client, type Transport } from 'viem'
1
+ import type { Account, Chain, Client, Transport } from 'viem'
2
2
  import type { UTXOAPISchema } from '../transports/utxo/types.js'
3
3
 
4
4
  export type GetBalanceParameters = {
@@ -0,0 +1,58 @@
1
+ import { Block } from 'bitcoinjs-lib'
2
+ import {
3
+ type Account,
4
+ BlockNotFoundError,
5
+ type Chain,
6
+ type Client,
7
+ type Transport,
8
+ } from 'viem'
9
+ import type { UTXOSchema } from '../transports/utxo/types.js'
10
+
11
+ export type GetBlockParameters =
12
+ | {
13
+ blockHash: string
14
+ blockNumber?: never
15
+ }
16
+ | {
17
+ blockHash?: never
18
+ blockNumber: number
19
+ }
20
+
21
+ export type GetBlockReturnType = Block
22
+
23
+ export async function getBlock<
24
+ C extends Chain | undefined,
25
+ A extends Account | undefined = Account | undefined,
26
+ >(
27
+ client: Client<Transport, C, A, UTXOSchema>,
28
+ { blockHash, blockNumber }: GetBlockParameters
29
+ ): Promise<GetBlockReturnType> {
30
+ let blockHex: string | undefined
31
+ try {
32
+ let _blockHash = blockHash
33
+ if (!_blockHash && blockNumber) {
34
+ _blockHash = await client.request(
35
+ {
36
+ method: 'getblockhash',
37
+ params: [blockNumber],
38
+ },
39
+ { dedupe: true }
40
+ )
41
+ }
42
+ if (_blockHash) {
43
+ blockHex = await client.request(
44
+ {
45
+ method: 'getblock',
46
+ params: [_blockHash, 0],
47
+ },
48
+ { dedupe: true }
49
+ )
50
+ }
51
+ } catch (_error) {
52
+ throw new BlockNotFoundError({ blockHash, blockNumber } as never)
53
+ }
54
+ if (!blockHex) {
55
+ throw new BlockNotFoundError({ blockHash, blockNumber } as never)
56
+ }
57
+ return Block.fromHex(blockHex)
58
+ }
@@ -1,4 +1,4 @@
1
- import { type Account, type Chain, type Client, type Transport } from 'viem'
1
+ import type { Account, Chain, Client, Transport } from 'viem'
2
2
  import type { UTXOSchema } from '../transports/utxo/types.js'
3
3
 
4
4
  export type GetBlockCountReturnType = number
@@ -0,0 +1,55 @@
1
+ import {
2
+ type Account,
3
+ BlockNotFoundError,
4
+ type Chain,
5
+ type Client,
6
+ type Transport,
7
+ } from 'viem'
8
+ import type { UTXOSchema } from '../transports/utxo/types.js'
9
+ import type { BlockStats, BlockStatsKeys } from '../types/blockStats.js'
10
+
11
+ export type GetBlockStatsParameters = (
12
+ | {
13
+ blockHash: string
14
+ blockNumber?: never
15
+ }
16
+ | {
17
+ blockHash?: never
18
+ blockNumber: number
19
+ }
20
+ ) & {
21
+ stats?: Array<BlockStatsKeys>
22
+ }
23
+
24
+ export type GetBlockStatsReturnType = BlockStats
25
+
26
+ export async function getBlockStats<
27
+ C extends Chain | undefined,
28
+ A extends Account | undefined = Account | undefined,
29
+ >(
30
+ client: Client<Transport, C, A, UTXOSchema>,
31
+ { blockHash, blockNumber, stats }: GetBlockStatsParameters
32
+ ): Promise<GetBlockStatsReturnType> {
33
+ const blockHashOrNumber = blockHash || blockNumber
34
+ if (!blockHashOrNumber) {
35
+ throw new BlockNotFoundError({ blockHash, blockNumber } as never)
36
+ }
37
+ try {
38
+ const params: [string | number, Array<BlockStatsKeys>?] = [
39
+ blockHashOrNumber,
40
+ ]
41
+ if (stats) {
42
+ params.push(stats)
43
+ }
44
+ const data = await client.request(
45
+ {
46
+ method: 'getblockstats',
47
+ params: params,
48
+ },
49
+ { dedupe: true }
50
+ )
51
+ return data
52
+ } catch (_error) {
53
+ throw new BlockNotFoundError({ blockHash, blockNumber } as never)
54
+ }
55
+ }
@@ -1,4 +1,10 @@
1
- import { type Account, type Chain, type Client, type Transport } from 'viem'
1
+ import {
2
+ type Account,
3
+ type Chain,
4
+ type Client,
5
+ TransactionNotFoundError,
6
+ type Transport,
7
+ } from 'viem'
2
8
  import type { UTXOSchema } from '../transports/utxo/types.js'
3
9
  import type { UTXOTransaction } from '../types/transaction.js'
4
10
 
@@ -6,7 +12,7 @@ export type GetUTXOTransactionParameters = {
6
12
  /** The Id of the transaction */
7
13
  txId: string
8
14
  /** The block in which to look for the transaction */
9
- blockhash?: string
15
+ blockHash?: string
10
16
  }
11
17
 
12
18
  export type GetUTXOTransactionReturnType = UTXOTransaction
@@ -16,15 +22,22 @@ export async function getUTXOTransaction<
16
22
  A extends Account | undefined = Account | undefined,
17
23
  >(
18
24
  client: Client<Transport, C, A, UTXOSchema>,
19
- { txId, blockhash }: GetUTXOTransactionParameters
25
+ { txId, blockHash }: GetUTXOTransactionParameters
20
26
  ): Promise<GetUTXOTransactionReturnType> {
21
- const params: [string, boolean, string?] = [txId, true]
22
- if (blockhash) {
23
- params.push(blockhash)
27
+ try {
28
+ const params: [string, boolean, string?] = [txId, true]
29
+ if (blockHash) {
30
+ params.push(blockHash)
31
+ }
32
+ const data = await client.request({
33
+ method: 'getrawtransaction',
34
+ params: params,
35
+ })
36
+ return data
37
+ } catch (_error) {
38
+ throw new TransactionNotFoundError({
39
+ blockHash: blockHash as never,
40
+ hash: txId as never,
41
+ })
24
42
  }
25
- const data = await client.request({
26
- method: 'getrawtransaction',
27
- params: params,
28
- })
29
- return data
30
43
  }
@@ -1,8 +1,8 @@
1
- import { type Account, type Chain, type Client, type Transport } from 'viem'
1
+ import type { Account, Chain, Client, Transport } from 'viem'
2
2
  import type { UTXOSchema } from '../transports/utxo/types.js'
3
3
 
4
4
  export type SendUTXOTransactionParameters = {
5
- /** The hex string of the raw transaction */
5
+ /** The hex string of the raw transaction. */
6
6
  hex: string
7
7
  /** Rejects transactions whose fee rate is higher than the specified value, expressed in BTC/kB. Set to 0 to accept any fee rate. Default = 0.10 */
8
8
  maxFeeRate?: number
@@ -1,4 +1,4 @@
1
- import { type Account, type Chain, type Client, type Transport } from 'viem'
1
+ import type { Account, Chain, Client, Transport } from 'viem'
2
2
  import type {
3
3
  SignPsbtParameters,
4
4
  SignPsbtReturnType,
@@ -0,0 +1,387 @@
1
+ import { Transaction, address } from 'bitcoinjs-lib'
2
+ import {
3
+ type Chain,
4
+ type Client,
5
+ TransactionNotFoundError,
6
+ TransactionReceiptNotFoundError,
7
+ type Transport,
8
+ WaitForTransactionReceiptTimeoutError,
9
+ stringify,
10
+ withRetry,
11
+ } from 'viem'
12
+ import { getAction } from 'viem/utils'
13
+ import type { UTXOTransaction } from '../types/transaction.js'
14
+ import { observe } from '../utils/observe.js'
15
+ import { getBlock } from './getBlock.js'
16
+ import { getBlockStats } from './getBlockStats.js'
17
+ import { getUTXOTransaction } from './getUTXOTransaction.js'
18
+ import { watchBlockNumber } from './watchBlockNumber.js'
19
+
20
+ export type ReplacementReason = 'cancelled' | 'replaced' | 'repriced'
21
+ export type ReplacementReturnType = {
22
+ reason: ReplacementReason
23
+ replacedTransaction: Transaction
24
+ transaction: UTXOTransaction
25
+ }
26
+
27
+ export type WaitForTransactionReceiptReturnType = UTXOTransaction
28
+
29
+ export type WithRetryParameters = {
30
+ // The delay (in ms) between retries.
31
+ delay?:
32
+ | ((config: { count: number; error: Error }) => number)
33
+ | number
34
+ | undefined
35
+ // The max number of times to retry.
36
+ retryCount?: number | undefined
37
+ }
38
+
39
+ export type WaitForTransactionReceiptParameters = {
40
+ /** The Id of the transaction. */
41
+ txId: string
42
+ /** The hex string of the raw transaction. */
43
+ txHex: string
44
+ /** The sender address of the transaction. */
45
+ senderAddress?: string
46
+ /**
47
+ * The number of confirmations (blocks that have passed) to wait before resolving.
48
+ * @default 1
49
+ */
50
+ confirmations?: number | undefined
51
+ /** Optional callback to emit if the transaction has been replaced. */
52
+ onReplaced?: ((response: ReplacementReturnType) => void) | undefined
53
+ /**
54
+ * Polling frequency (in ms). Defaults to the client's pollingInterval config.
55
+ * @default client.pollingInterval
56
+ */
57
+ pollingInterval?: number | undefined
58
+ /**
59
+ * Number of times to retry if the transaction or block is not found.
60
+ * @default 6 (exponential backoff)
61
+ */
62
+ retryCount?: number
63
+ /**
64
+ * Time to wait (in ms) between retries.
65
+ */
66
+ retryDelay?: ((config: { count: number; error: Error }) => number) | number
67
+ /** Optional timeout (in milliseconds) to wait before stopping polling. */
68
+ timeout?: number | undefined
69
+ }
70
+
71
+ /**
72
+ * Waits for the transaction to be included on a block (one confirmation), and then returns the transaction.
73
+ * - JSON-RPC Methods:
74
+ * - Polls getrawtransaction on each block until it has been processed.
75
+ * - If a transaction has been replaced:
76
+ * - Calls getblock and extracts the transactions
77
+ * - Checks if one of the transactions is a replacement
78
+ * - If so, calls getrawtransaction.
79
+ *
80
+ * The `waitForTransaction` action additionally supports replacement detection (e.g. RBF - transactions replaced-by-fee ).
81
+ *
82
+ * Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel).
83
+ * https://bitcoinops.org/en/topics/replace-by-fee/
84
+ *
85
+ * There are 3 types of Transaction Replacement reasons:
86
+ *
87
+ * - `repriced`: The fee has been modified (e.g. same outputs, different amounts)
88
+ * - `cancelled`: The Transaction has been cancelled (e.g. output is sender address)
89
+ * - `replaced`: The Transaction has been replaced (e.g. different outputs)
90
+ * @param client - Client to use
91
+ * @param parameters - {@link WaitForTransactionReceiptParameters}
92
+ * @returns The UTXO transaction. {@link WaitForTransactionReceiptReturnType}
93
+ */
94
+ export async function waitForTransaction<chain extends Chain | undefined>(
95
+ client: Client<Transport, chain>,
96
+ {
97
+ confirmations = 1,
98
+ txId,
99
+ txHex,
100
+ senderAddress,
101
+ onReplaced,
102
+ pollingInterval = client.pollingInterval,
103
+ retryCount = 10,
104
+ retryDelay = 3_000,
105
+ timeout,
106
+ }: WaitForTransactionReceiptParameters
107
+ ): Promise<WaitForTransactionReceiptReturnType> {
108
+ const observerId = stringify(['waitForTransaction', client.uid, txId])
109
+
110
+ let count = 0
111
+ let transaction: UTXOTransaction | undefined
112
+ let replacedTransaction: Transaction | undefined
113
+ let retrying = false
114
+
115
+ return new Promise((resolve, reject) => {
116
+ if (timeout) {
117
+ setTimeout(
118
+ () =>
119
+ reject(
120
+ new WaitForTransactionReceiptTimeoutError({ hash: txId as never })
121
+ ),
122
+ timeout
123
+ )
124
+ }
125
+
126
+ const _unobserve = observe(
127
+ observerId,
128
+ { onReplaced, resolve, reject },
129
+ (emit) => {
130
+ const _unwatch = getAction(
131
+ client,
132
+ watchBlockNumber,
133
+ 'watchBlockNumber'
134
+ )({
135
+ emitMissed: true,
136
+ emitOnBegin: true,
137
+ pollingInterval,
138
+ async onBlockNumber(blockNumber_) {
139
+ const done = (fn: () => void) => {
140
+ _unwatch()
141
+ fn()
142
+ _unobserve()
143
+ }
144
+
145
+ let blockNumber = blockNumber_
146
+
147
+ if (retrying) {
148
+ return
149
+ }
150
+ if (count > retryCount) {
151
+ done(() =>
152
+ emit.reject(
153
+ new WaitForTransactionReceiptTimeoutError({
154
+ hash: txId as never,
155
+ })
156
+ )
157
+ )
158
+ }
159
+
160
+ try {
161
+ // If we already have a valid receipt, let's check if we have enough
162
+ // confirmations. If we do, then we can resolve.
163
+ if (transaction?.blockhash) {
164
+ const blockStats = await getAction(
165
+ client,
166
+ getBlockStats,
167
+ 'getBlockStats'
168
+ )({
169
+ blockHash: transaction.blockhash,
170
+ stats: ['height'],
171
+ })
172
+ if (
173
+ confirmations > 1 &&
174
+ (!blockStats.height ||
175
+ blockNumber - blockStats.height + 1 < confirmations)
176
+ ) {
177
+ return
178
+ }
179
+ done(() => emit.resolve(transaction!))
180
+ return
181
+ }
182
+
183
+ // Get the transaction to check if it's been replaced.
184
+ // We need to retry as some RPC Providers may be slow to sync
185
+ // up mined transactions.
186
+ retrying = true
187
+ transaction = await withRetry(
188
+ () =>
189
+ getAction(
190
+ client,
191
+ getUTXOTransaction,
192
+ 'getUTXOTransaction'
193
+ // If transaction exists it might be the replaced one with different txId
194
+ )({ txId: transaction?.txid || txId }),
195
+ {
196
+ delay: retryDelay,
197
+ retryCount,
198
+ }
199
+ )
200
+ if (transaction.blockhash) {
201
+ const blockStats = await getAction(
202
+ client,
203
+ getBlockStats,
204
+ 'getBlockStats'
205
+ )({
206
+ blockHash: transaction.blockhash,
207
+ stats: ['height'],
208
+ })
209
+ if (blockStats.height) {
210
+ blockNumber = blockStats.height
211
+ }
212
+ }
213
+ retrying = false
214
+
215
+ // Check if transaction has been processed.
216
+ if (!transaction?.confirmations) {
217
+ throw new TransactionReceiptNotFoundError({
218
+ hash: txId as never,
219
+ })
220
+ }
221
+
222
+ // Check if we have enough confirmations. If not, continue polling.
223
+ if (transaction.confirmations < confirmations) {
224
+ return
225
+ }
226
+
227
+ done(() => emit.resolve(transaction!))
228
+ } catch (err) {
229
+ // If the receipt is not found, the transaction will be pending.
230
+ // We need to check if it has potentially been replaced.
231
+ if (
232
+ err instanceof TransactionNotFoundError ||
233
+ err instanceof TransactionReceiptNotFoundError
234
+ ) {
235
+ try {
236
+ replacedTransaction = Transaction.fromHex(
237
+ transaction?.hex || txHex
238
+ )
239
+
240
+ // Let's retrieve the transactions from the current block.
241
+ // We need to retry as some RPC Providers may be slow to sync
242
+ // up mined blocks.
243
+ retrying = true
244
+ const block = await withRetry(
245
+ () =>
246
+ getAction(
247
+ client,
248
+ getBlock,
249
+ 'getBlock'
250
+ )({
251
+ blockNumber,
252
+ }),
253
+ {
254
+ delay: retryDelay,
255
+ retryCount,
256
+ // shouldRetry: ({ error }) =>
257
+ // error instanceof BlockNotFoundError,
258
+ }
259
+ )
260
+ retrying = false
261
+
262
+ // Create a set of input identifiers for mempool transaction
263
+ const replacedTransactionInputs = new Set<string>()
264
+
265
+ for (const input of replacedTransaction.ins) {
266
+ const txid = Array.from(input.hash)
267
+ .reverse()
268
+ .map((byte) => `00${byte.toString(16)}`.slice(-2))
269
+ .join('')
270
+ const vout = input.index
271
+ const inputId = `${txid}:${vout}`
272
+ replacedTransactionInputs.add(inputId)
273
+ }
274
+
275
+ let replacementTransaction: Transaction | undefined
276
+
277
+ for (const tx of block.transactions!) {
278
+ if (tx.isCoinbase()) {
279
+ continue
280
+ }
281
+
282
+ // Check if any input of this transaction matches an input of mempool transaction
283
+ for (const input of tx.ins) {
284
+ const txid = Array.from(input.hash)
285
+ .reverse()
286
+ .map((byte) => `00${byte.toString(16)}`.slice(-2))
287
+ .join('')
288
+ const vout = input.index
289
+ const inputId = `${txid}:${vout}`
290
+ if (replacedTransactionInputs.has(inputId)) {
291
+ replacementTransaction = tx
292
+ break
293
+ }
294
+ }
295
+ if (replacementTransaction) {
296
+ break
297
+ }
298
+ }
299
+
300
+ // If we couldn't find a replacement transaction, continue polling.
301
+ if (!replacementTransaction) {
302
+ return
303
+ }
304
+
305
+ // If we found a replacement transaction, return it's receipt.
306
+ transaction = await getAction(
307
+ client,
308
+ getUTXOTransaction,
309
+ 'getUTXOTransaction'
310
+ )({
311
+ txId: replacementTransaction.getId(),
312
+ })
313
+
314
+ // Check if we have enough confirmations. If not, continue polling.
315
+ if (
316
+ transaction.confirmations &&
317
+ transaction.confirmations < confirmations
318
+ ) {
319
+ return
320
+ }
321
+
322
+ let reason: ReplacementReason = 'replaced'
323
+
324
+ // Function to get output addresses
325
+ function getOutputAddresses(tx: Transaction): string[] {
326
+ const addresses: string[] = []
327
+ for (const output of tx.outs) {
328
+ try {
329
+ const outputAddress = address.fromOutputScript(
330
+ output.script
331
+ )
332
+ addresses.push(outputAddress)
333
+ } catch (_e) {
334
+ // Handle non-standard scripts (e.g., OP_RETURN)
335
+ }
336
+ }
337
+ return addresses
338
+ }
339
+
340
+ // Get the recipient addresses from the original transaction
341
+ const originalOutputAddresses =
342
+ getOutputAddresses(replacedTransaction)
343
+
344
+ // Get the recipient addresses from the replacement transaction
345
+ const replacementOutputAddresses = getOutputAddresses(
346
+ replacementTransaction
347
+ )
348
+
349
+ if (
350
+ originalOutputAddresses.length ===
351
+ replacementOutputAddresses.length &&
352
+ originalOutputAddresses.every((address) =>
353
+ replacementOutputAddresses.includes(address)
354
+ )
355
+ ) {
356
+ reason = 'repriced'
357
+ } else if (
358
+ senderAddress &&
359
+ replacementOutputAddresses.length === 1 &&
360
+ replacementOutputAddresses.includes(senderAddress)
361
+ ) {
362
+ reason = 'cancelled'
363
+ }
364
+
365
+ done(() => {
366
+ emit.onReplaced?.({
367
+ reason,
368
+ replacedTransaction: replacedTransaction!,
369
+ transaction: transaction!,
370
+ })
371
+ emit.resolve(transaction!)
372
+ })
373
+ } catch (err_) {
374
+ done(() => emit.reject(err_))
375
+ }
376
+ } else {
377
+ done(() => emit.reject(err))
378
+ }
379
+ } finally {
380
+ count++
381
+ }
382
+ },
383
+ })
384
+ }
385
+ )
386
+ })
387
+ }