@atomiqlabs/sdk 7.0.12 → 8.0.7

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 (364) hide show
  1. package/README.md +45 -29
  2. package/dist/SmartChainAssets.d.ts +11 -3
  3. package/dist/SmartChainAssets.js +7 -3
  4. package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
  5. package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
  6. package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
  7. package/dist/bitcoin/LightningNetworkApi.js +2 -0
  8. package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
  9. package/dist/bitcoin/coinselect2/accumulative.js +52 -0
  10. package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
  11. package/dist/bitcoin/coinselect2/blackjack.js +38 -0
  12. package/dist/bitcoin/coinselect2/index.d.ts +19 -0
  13. package/dist/bitcoin/coinselect2/index.js +69 -0
  14. package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
  15. package/dist/bitcoin/coinselect2/utils.js +123 -0
  16. package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
  17. package/dist/bitcoin/mempool/MempoolApi.js +311 -0
  18. package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
  19. package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
  20. package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
  21. package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
  22. package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
  23. package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
  24. package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
  25. package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
  26. package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
  27. package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
  28. package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
  29. package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
  30. package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
  31. package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
  32. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
  33. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
  34. package/dist/enums/FeeType.d.ts +8 -0
  35. package/dist/enums/FeeType.js +12 -0
  36. package/dist/enums/SwapAmountType.d.ts +8 -0
  37. package/dist/enums/SwapAmountType.js +12 -0
  38. package/dist/enums/SwapDirection.d.ts +8 -0
  39. package/dist/enums/SwapDirection.js +12 -0
  40. package/dist/enums/SwapType.d.ts +14 -0
  41. package/dist/enums/SwapType.js +18 -0
  42. package/dist/errors/IntermediaryError.d.ts +9 -0
  43. package/dist/errors/IntermediaryError.js +26 -0
  44. package/dist/errors/PaymentAuthError.d.ts +11 -0
  45. package/dist/errors/PaymentAuthError.js +23 -0
  46. package/dist/errors/RequestError.d.ts +18 -0
  47. package/dist/errors/RequestError.js +46 -0
  48. package/dist/errors/UserError.d.ts +7 -0
  49. package/dist/errors/UserError.js +15 -0
  50. package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
  51. package/dist/events/UnifiedSwapEventListener.js +130 -0
  52. package/dist/http/HttpUtils.d.ts +27 -0
  53. package/dist/http/HttpUtils.js +91 -0
  54. package/dist/http/paramcoders/IParamReader.d.ts +8 -0
  55. package/dist/http/paramcoders/IParamReader.js +2 -0
  56. package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
  57. package/dist/http/paramcoders/ParamDecoder.js +132 -0
  58. package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
  59. package/dist/http/paramcoders/ParamEncoder.js +31 -0
  60. package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
  61. package/dist/http/paramcoders/SchemaVerifier.js +145 -0
  62. package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
  63. package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
  64. package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
  65. package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
  66. package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
  67. package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
  68. package/dist/index.d.ts +82 -4
  69. package/dist/index.js +128 -4
  70. package/dist/intermediaries/Intermediary.d.ts +111 -0
  71. package/dist/intermediaries/Intermediary.js +115 -0
  72. package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
  73. package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
  74. package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
  75. package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
  76. package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
  77. package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
  78. package/dist/lnurl/LNURL.d.ts +102 -0
  79. package/dist/lnurl/LNURL.js +321 -0
  80. package/dist/prices/RedundantSwapPrice.d.ts +89 -0
  81. package/dist/prices/RedundantSwapPrice.js +202 -0
  82. package/dist/prices/SingleSwapPrice.d.ts +31 -0
  83. package/dist/prices/SingleSwapPrice.js +41 -0
  84. package/dist/prices/SwapPriceWithChain.d.ts +70 -0
  85. package/dist/prices/SwapPriceWithChain.js +91 -0
  86. package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
  87. package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
  88. package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
  89. package/dist/prices/abstract/IPriceProvider.js +74 -0
  90. package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
  91. package/dist/prices/abstract/ISwapPrice.js +219 -0
  92. package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
  93. package/dist/prices/providers/BinancePriceProvider.js +23 -0
  94. package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
  95. package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
  96. package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
  97. package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
  98. package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
  99. package/dist/prices/providers/CustomPriceProvider.js +24 -0
  100. package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
  101. package/dist/prices/providers/KrakenPriceProvider.js +36 -0
  102. package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
  103. package/dist/prices/providers/OKXPriceProvider.js +23 -0
  104. package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
  105. package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
  106. package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
  107. package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
  108. package/dist/storage/IUnifiedStorage.d.ts +73 -0
  109. package/dist/storage/IUnifiedStorage.js +2 -0
  110. package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
  111. package/dist/storage/UnifiedSwapStorage.js +83 -0
  112. package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
  113. package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
  114. package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
  115. package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
  116. package/dist/swapper/Swapper.d.ts +533 -0
  117. package/dist/swapper/Swapper.js +1566 -0
  118. package/dist/swapper/SwapperFactory.d.ts +87 -0
  119. package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +37 -19
  120. package/dist/swapper/SwapperUtils.d.ts +153 -0
  121. package/dist/swapper/SwapperUtils.js +420 -0
  122. package/dist/swapper/SwapperWithChain.d.ts +214 -0
  123. package/dist/swapper/SwapperWithChain.js +315 -0
  124. package/dist/swapper/SwapperWithSigner.d.ts +178 -0
  125. package/dist/swapper/SwapperWithSigner.js +172 -0
  126. package/dist/swaps/IAddressSwap.d.ts +13 -0
  127. package/dist/swaps/IAddressSwap.js +13 -0
  128. package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
  129. package/dist/swaps/IBTCWalletSwap.js +17 -0
  130. package/dist/swaps/IClaimableSwap.d.ts +17 -0
  131. package/dist/swaps/IClaimableSwap.js +14 -0
  132. package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
  133. package/dist/swaps/IClaimableSwapWrapper.js +2 -0
  134. package/dist/swaps/IRefundableSwap.d.ts +17 -0
  135. package/dist/swaps/IRefundableSwap.js +13 -0
  136. package/dist/swaps/ISwap.d.ts +207 -0
  137. package/dist/swaps/ISwap.js +264 -0
  138. package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
  139. package/dist/swaps/ISwapWithGasDrop.js +11 -0
  140. package/dist/swaps/ISwapWrapper.d.ts +153 -0
  141. package/dist/swaps/ISwapWrapper.js +227 -0
  142. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
  143. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
  144. package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
  145. package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
  146. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
  147. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
  148. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
  149. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
  150. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
  151. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
  152. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
  153. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
  154. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
  155. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
  156. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
  157. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
  158. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
  159. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
  160. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
  161. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
  162. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
  163. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
  164. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
  165. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
  166. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
  167. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
  168. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
  169. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
  170. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
  171. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
  172. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
  173. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
  174. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
  175. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
  176. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
  177. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
  178. package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
  179. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
  180. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
  181. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
  182. package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
  183. package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
  184. package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
  185. package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
  186. package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
  187. package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
  188. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
  189. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
  190. package/dist/types/AmountData.d.ts +9 -0
  191. package/dist/types/AmountData.js +2 -0
  192. package/dist/types/CustomPriceFunction.d.ts +5 -0
  193. package/dist/types/CustomPriceFunction.js +2 -0
  194. package/dist/types/PriceInfoType.d.ts +28 -0
  195. package/dist/types/PriceInfoType.js +57 -0
  196. package/dist/types/SwapExecutionAction.d.ts +7 -0
  197. package/dist/types/SwapExecutionAction.js +2 -0
  198. package/dist/types/SwapWithSigner.d.ts +14 -0
  199. package/dist/types/SwapWithSigner.js +40 -0
  200. package/dist/types/Token.d.ts +53 -0
  201. package/dist/types/Token.js +58 -0
  202. package/dist/types/TokenAmount.d.ts +57 -0
  203. package/dist/types/TokenAmount.js +47 -0
  204. package/dist/types/fees/Fee.d.ts +49 -0
  205. package/dist/types/fees/Fee.js +2 -0
  206. package/dist/types/fees/FeeBreakdown.d.ts +10 -0
  207. package/dist/types/fees/FeeBreakdown.js +2 -0
  208. package/dist/types/fees/PercentagePPM.d.ts +15 -0
  209. package/dist/types/fees/PercentagePPM.js +17 -0
  210. package/dist/types/lnurl/LNURLPay.d.ts +54 -0
  211. package/dist/types/lnurl/LNURLPay.js +28 -0
  212. package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
  213. package/dist/types/lnurl/LNURLWithdraw.js +24 -0
  214. package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
  215. package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
  216. package/dist/utils/BitcoinUtils.d.ts +13 -0
  217. package/dist/utils/BitcoinUtils.js +98 -0
  218. package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
  219. package/dist/utils/BitcoinWalletUtils.js +14 -0
  220. package/dist/utils/Logger.d.ts +7 -0
  221. package/dist/utils/Logger.js +12 -0
  222. package/dist/utils/RetryUtils.d.ts +21 -0
  223. package/dist/utils/RetryUtils.js +66 -0
  224. package/dist/utils/SwapUtils.d.ts +31 -0
  225. package/dist/utils/SwapUtils.js +18 -0
  226. package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
  227. package/dist/utils/TimeoutUtils.js +55 -0
  228. package/dist/utils/TokenUtils.d.ts +11 -0
  229. package/dist/utils/TokenUtils.js +29 -0
  230. package/dist/utils/TypeUtils.d.ts +7 -0
  231. package/dist/utils/TypeUtils.js +2 -0
  232. package/dist/utils/Utils.d.ts +57 -0
  233. package/dist/utils/Utils.js +178 -0
  234. package/package.json +14 -6
  235. package/src/SmartChainAssets.ts +11 -3
  236. package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
  237. package/src/bitcoin/LightningNetworkApi.ts +16 -0
  238. package/src/bitcoin/coinselect2/accumulative.ts +68 -0
  239. package/src/bitcoin/coinselect2/blackjack.ts +49 -0
  240. package/src/bitcoin/coinselect2/index.ts +92 -0
  241. package/src/bitcoin/coinselect2/utils.ts +189 -0
  242. package/src/bitcoin/mempool/MempoolApi.ts +554 -0
  243. package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
  244. package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
  245. package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
  246. package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
  247. package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
  248. package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
  249. package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
  250. package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
  251. package/src/enums/FeeType.ts +9 -0
  252. package/src/enums/SwapAmountType.ts +9 -0
  253. package/src/enums/SwapDirection.ts +9 -0
  254. package/src/enums/SwapType.ts +15 -0
  255. package/src/errors/IntermediaryError.ts +24 -0
  256. package/src/errors/PaymentAuthError.ts +26 -0
  257. package/src/errors/RequestError.ts +51 -0
  258. package/src/errors/UserError.ts +14 -0
  259. package/src/events/UnifiedSwapEventListener.ts +171 -0
  260. package/src/http/HttpUtils.ts +92 -0
  261. package/src/http/paramcoders/IParamReader.ts +10 -0
  262. package/src/http/paramcoders/ParamDecoder.ts +142 -0
  263. package/src/http/paramcoders/ParamEncoder.ts +37 -0
  264. package/src/http/paramcoders/SchemaVerifier.ts +153 -0
  265. package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
  266. package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
  267. package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
  268. package/src/index.ts +102 -4
  269. package/src/intermediaries/Intermediary.ts +204 -0
  270. package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
  271. package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
  272. package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
  273. package/src/lnurl/LNURL.ts +403 -0
  274. package/src/prices/RedundantSwapPrice.ts +245 -0
  275. package/src/prices/SingleSwapPrice.ts +47 -0
  276. package/src/prices/SwapPriceWithChain.ts +157 -0
  277. package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
  278. package/src/prices/abstract/IPriceProvider.ts +128 -0
  279. package/src/prices/abstract/ISwapPrice.ts +328 -0
  280. package/src/prices/providers/BinancePriceProvider.ts +41 -0
  281. package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
  282. package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
  283. package/src/prices/providers/CustomPriceProvider.ts +29 -0
  284. package/src/prices/providers/KrakenPriceProvider.ts +74 -0
  285. package/src/prices/providers/OKXPriceProvider.ts +53 -0
  286. package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
  287. package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
  288. package/src/storage/IUnifiedStorage.ts +83 -0
  289. package/src/storage/UnifiedSwapStorage.ts +104 -0
  290. package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
  291. package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
  292. package/src/swapper/Swapper.ts +2107 -0
  293. package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +113 -72
  294. package/src/swapper/SwapperUtils.ts +510 -0
  295. package/src/swapper/SwapperWithChain.ts +464 -0
  296. package/src/swapper/SwapperWithSigner.ts +300 -0
  297. package/src/swaps/IAddressSwap.ts +20 -0
  298. package/src/swaps/IBTCWalletSwap.ts +77 -0
  299. package/src/swaps/IClaimableSwap.ts +30 -0
  300. package/src/swaps/IClaimableSwapWrapper.ts +9 -0
  301. package/src/swaps/IRefundableSwap.ts +29 -0
  302. package/src/swaps/ISwap.ts +490 -0
  303. package/src/swaps/ISwapWithGasDrop.ts +19 -0
  304. package/src/swaps/ISwapWrapper.ts +344 -0
  305. package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
  306. package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
  307. package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
  308. package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
  309. package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
  310. package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
  311. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
  312. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
  313. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
  314. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
  315. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
  316. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
  317. package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
  318. package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
  319. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
  320. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
  321. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
  322. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
  323. package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
  324. package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
  325. package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
  326. package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
  327. package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
  328. package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
  329. package/src/types/AmountData.ts +9 -0
  330. package/src/types/CustomPriceFunction.ts +5 -0
  331. package/src/types/PriceInfoType.ts +67 -0
  332. package/src/types/SwapExecutionAction.ts +8 -0
  333. package/src/types/SwapWithSigner.ts +57 -0
  334. package/src/types/Token.ts +90 -0
  335. package/src/types/TokenAmount.ts +110 -0
  336. package/src/types/fees/Fee.ts +55 -0
  337. package/src/types/fees/FeeBreakdown.ts +11 -0
  338. package/src/types/fees/PercentagePPM.ts +24 -0
  339. package/src/types/lnurl/LNURLPay.ts +72 -0
  340. package/src/types/lnurl/LNURLWithdraw.ts +55 -0
  341. package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
  342. package/src/utils/BitcoinUtils.ts +86 -0
  343. package/src/utils/BitcoinWalletUtils.ts +16 -0
  344. package/src/utils/Logger.ts +15 -0
  345. package/src/utils/RetryUtils.ts +71 -0
  346. package/src/utils/SwapUtils.ts +38 -0
  347. package/src/utils/TimeoutUtils.ts +50 -0
  348. package/src/utils/TokenUtils.ts +25 -0
  349. package/src/utils/TypeUtils.ts +9 -0
  350. package/src/utils/Utils.ts +182 -0
  351. package/dist/SwapperFactory.d.ts +0 -52
  352. package/dist/Utils.js +0 -37
  353. package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
  354. package/dist/fs-storage/FileSystemStorageManager.js +0 -60
  355. package/dist/fs-storage/index.d.ts +0 -1
  356. package/dist/fs-storage/index.js +0 -17
  357. package/src/SmartChainAssets.js +0 -75
  358. package/src/SwapperFactory.js +0 -120
  359. package/src/Utils.js +0 -37
  360. package/src/Utils.ts +0 -31
  361. package/src/fs-storage/FileSystemStorageManager.ts +0 -71
  362. package/src/fs-storage/index.ts +0 -1
  363. package/src/index.js +0 -21
  364. package/src/storage/LocalStorageManager.js +0 -72
@@ -0,0 +1,361 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MempoolBitcoinRpc = void 0;
4
+ const MempoolBitcoinBlock_1 = require("./MempoolBitcoinBlock");
5
+ const MempoolApi_1 = require("./MempoolApi");
6
+ const buffer_1 = require("buffer");
7
+ const Utils_1 = require("../../utils/Utils");
8
+ const btc_signer_1 = require("@scure/btc-signer");
9
+ const sha2_1 = require("@noble/hashes/sha2");
10
+ const TimeoutUtils_1 = require("../../utils/TimeoutUtils");
11
+ const BITCOIN_BLOCKTIME = 600 * 1000;
12
+ const BITCOIN_BLOCKSIZE = 1024 * 1024;
13
+ function bitcoinTxToBtcTx(btcTx) {
14
+ return {
15
+ locktime: btcTx.lockTime,
16
+ version: btcTx.version,
17
+ confirmations: 0,
18
+ txid: buffer_1.Buffer.from((0, sha2_1.sha256)((0, sha2_1.sha256)(btcTx.toBytes(true, false)))).reverse().toString("hex"),
19
+ hex: buffer_1.Buffer.from(btcTx.toBytes(true, false)).toString("hex"),
20
+ raw: buffer_1.Buffer.from(btcTx.toBytes(true, true)).toString("hex"),
21
+ vsize: btcTx.isFinal ? btcTx.vsize : NaN,
22
+ outs: Array.from({ length: btcTx.outputsLength }, (_, i) => i).map((index) => {
23
+ const output = btcTx.getOutput(index);
24
+ return {
25
+ value: Number(output.amount),
26
+ n: index,
27
+ scriptPubKey: {
28
+ asm: btc_signer_1.Script.decode(output.script).map(val => typeof (val) === "object" ? buffer_1.Buffer.from(val).toString("hex") : val.toString()).join(" "),
29
+ hex: buffer_1.Buffer.from(output.script).toString("hex")
30
+ }
31
+ };
32
+ }),
33
+ ins: Array.from({ length: btcTx.inputsLength }, (_, i) => i).map(index => {
34
+ const input = btcTx.getInput(index);
35
+ return {
36
+ txid: buffer_1.Buffer.from(input.txid).toString("hex"),
37
+ vout: input.index,
38
+ scriptSig: {
39
+ asm: btc_signer_1.Script.decode(input.finalScriptSig).map(val => typeof (val) === "object" ? buffer_1.Buffer.from(val).toString("hex") : val.toString()).join(" "),
40
+ hex: buffer_1.Buffer.from(input.finalScriptSig).toString("hex")
41
+ },
42
+ sequence: input.sequence,
43
+ txinwitness: input.finalScriptWitness == null ? [] : input.finalScriptWitness.map(witness => buffer_1.Buffer.from(witness).toString("hex"))
44
+ };
45
+ })
46
+ };
47
+ }
48
+ /**
49
+ * Bitcoin RPC implementation via Mempool.space API
50
+ * @category Bitcoin
51
+ */
52
+ class MempoolBitcoinRpc {
53
+ constructor(urlOrMempoolApi) {
54
+ this.api = urlOrMempoolApi instanceof MempoolApi_1.MempoolApi ? urlOrMempoolApi : new MempoolApi_1.MempoolApi(urlOrMempoolApi);
55
+ }
56
+ /**
57
+ * Returns a txo hash for a specific transaction vout
58
+ *
59
+ * @param vout
60
+ * @private
61
+ */
62
+ static getTxoHash(vout) {
63
+ return (0, Utils_1.getTxoHash)(vout.scriptpubkey, vout.value);
64
+ }
65
+ /**
66
+ * Returns delay in milliseconds till an unconfirmed transaction is expected to confirm, returns -1
67
+ * if the transaction won't confirm any time soon
68
+ *
69
+ * @param feeRate
70
+ * @private
71
+ */
72
+ async getTimeTillConfirmation(feeRate) {
73
+ const mempoolBlocks = await this.api.getPendingBlocks();
74
+ const mempoolBlockIndex = mempoolBlocks.findIndex(block => block.feeRange[0] <= feeRate);
75
+ if (mempoolBlockIndex === -1)
76
+ return -1;
77
+ //Last returned block is usually an aggregate (or a stack) of multiple btc blocks, if tx falls in this block
78
+ // and the last returned block really is an aggregate one (size bigger than BITCOIN_BLOCKSIZE) we return -1
79
+ if (mempoolBlockIndex + 1 === mempoolBlocks.length &&
80
+ mempoolBlocks[mempoolBlocks.length - 1].blockVSize > BITCOIN_BLOCKSIZE)
81
+ return -1;
82
+ return (mempoolBlockIndex + 1) * BITCOIN_BLOCKTIME;
83
+ }
84
+ /**
85
+ * Returns an estimate after which time the tx will confirm with the required amount of confirmations,
86
+ * confirmationDelay of -1 means the transaction won't confirm in the near future
87
+ *
88
+ * @param tx
89
+ * @param requiredConfirmations
90
+ * @private
91
+ *
92
+ * @returns estimated confirmation delay, -1 if the transaction won't confirm in the near future, null if the
93
+ * transaction was replaced or was confirmed in the meantime
94
+ */
95
+ async getConfirmationDelay(tx, requiredConfirmations) {
96
+ if (tx.confirmations == null || tx.confirmations === 0) {
97
+ //Get CPFP data
98
+ const cpfpData = await this.api.getCPFPData(tx.txid);
99
+ if (cpfpData.effectiveFeePerVsize == null) {
100
+ //Transaction is either confirmed in the meantime, or replaced
101
+ return null;
102
+ }
103
+ let confirmationDelay = (await this.getTimeTillConfirmation(cpfpData.effectiveFeePerVsize));
104
+ if (confirmationDelay !== -1)
105
+ confirmationDelay += (requiredConfirmations - 1) * BITCOIN_BLOCKTIME;
106
+ return confirmationDelay;
107
+ }
108
+ if (tx.confirmations > requiredConfirmations)
109
+ return 0;
110
+ return ((requiredConfirmations - tx.confirmations) * BITCOIN_BLOCKTIME);
111
+ }
112
+ /**
113
+ * Converts mempool API's transaction to BtcTx object while fetching the raw tx separately
114
+ * @param tx Transaction to convert
115
+ * @private
116
+ */
117
+ async toBtcTx(tx) {
118
+ const base = await this.toBtcTxWithoutRawData(tx);
119
+ if (base == null)
120
+ return null;
121
+ const rawTx = await this.api.getRawTransaction(tx.txid);
122
+ if (rawTx == null)
123
+ return null;
124
+ //Strip witness data
125
+ const btcTx = btc_signer_1.Transaction.fromRaw(rawTx, {
126
+ allowLegacyWitnessUtxo: true,
127
+ allowUnknownInputs: true,
128
+ allowUnknownOutputs: true,
129
+ disableScriptCheck: true
130
+ });
131
+ const strippedRawTx = buffer_1.Buffer.from(btcTx.toBytes(true, false)).toString("hex");
132
+ return {
133
+ ...base,
134
+ hex: strippedRawTx,
135
+ raw: rawTx.toString("hex")
136
+ };
137
+ }
138
+ /**
139
+ * Converts mempool API's transaction to BtcTx object, doesn't populate raw and hex fields
140
+ * @param tx Transaction to convert
141
+ * @private
142
+ */
143
+ async toBtcTxWithoutRawData(tx) {
144
+ let confirmations = 0;
145
+ if (tx.status != null && tx.status.confirmed) {
146
+ const blockheight = await this.api.getTipBlockHeight();
147
+ confirmations = blockheight - tx.status.block_height + 1;
148
+ }
149
+ return {
150
+ locktime: tx.locktime,
151
+ version: tx.version,
152
+ blockheight: tx.status?.block_height,
153
+ blockhash: tx.status?.block_hash,
154
+ confirmations,
155
+ txid: tx.txid,
156
+ vsize: tx.weight / 4,
157
+ outs: tx.vout.map((e, index) => {
158
+ return {
159
+ value: e.value,
160
+ n: index,
161
+ scriptPubKey: {
162
+ hex: e.scriptpubkey,
163
+ asm: e.scriptpubkey_asm
164
+ }
165
+ };
166
+ }),
167
+ ins: tx.vin.map(e => {
168
+ return {
169
+ txid: e.txid,
170
+ vout: e.vout,
171
+ scriptSig: {
172
+ hex: e.scriptsig,
173
+ asm: e.scriptsig_asm
174
+ },
175
+ sequence: e.sequence,
176
+ txinwitness: e.witness
177
+ };
178
+ }),
179
+ inputAddresses: tx.vin.map(e => e.prevout.scriptpubkey_address)
180
+ };
181
+ }
182
+ getTipHeight() {
183
+ return this.api.getTipBlockHeight();
184
+ }
185
+ async getBlockHeader(blockhash) {
186
+ return new MempoolBitcoinBlock_1.MempoolBitcoinBlock(await this.api.getBlockHeader(blockhash));
187
+ }
188
+ async getMerkleProof(txId, blockhash) {
189
+ const proof = await this.api.getTransactionProof(txId);
190
+ return {
191
+ reversedTxId: buffer_1.Buffer.from(txId, "hex").reverse(),
192
+ pos: proof.pos,
193
+ merkle: proof.merkle.map(e => buffer_1.Buffer.from(e, "hex").reverse()),
194
+ blockheight: proof.block_height
195
+ };
196
+ }
197
+ async getTransaction(txId) {
198
+ const tx = await this.api.getTransaction(txId);
199
+ if (tx == null)
200
+ return null;
201
+ return await this.toBtcTx(tx);
202
+ }
203
+ async isInMainChain(blockhash) {
204
+ const blockStatus = await this.api.getBlockStatus(blockhash);
205
+ return blockStatus.in_best_chain;
206
+ }
207
+ getBlockhash(height) {
208
+ return this.api.getBlockHash(height);
209
+ }
210
+ getBlockWithTransactions(blockhash) {
211
+ throw new Error("Unsupported.");
212
+ }
213
+ async getSyncInfo() {
214
+ const tipHeight = await this.api.getTipBlockHeight();
215
+ return {
216
+ verificationProgress: 1,
217
+ blocks: tipHeight,
218
+ headers: tipHeight,
219
+ ibd: false
220
+ };
221
+ }
222
+ async getPast15Blocks(height) {
223
+ return (await this.api.getPast15BlockHeaders(height)).map(blockHeader => new MempoolBitcoinBlock_1.MempoolBitcoinBlock(blockHeader));
224
+ }
225
+ async checkAddressTxos(address, txoHash) {
226
+ const allTxs = await this.api.getAddressTransactions(address);
227
+ const relevantTxs = allTxs
228
+ .map(tx => {
229
+ return {
230
+ tx,
231
+ vout: tx.vout.findIndex(vout => MempoolBitcoinRpc.getTxoHash(vout).equals(txoHash))
232
+ };
233
+ })
234
+ .filter(obj => obj.vout >= 0)
235
+ .sort((a, b) => {
236
+ if (a.tx.status.confirmed && !b.tx.status.confirmed)
237
+ return -1;
238
+ if (!a.tx.status.confirmed && b.tx.status.confirmed)
239
+ return 1;
240
+ if (a.tx.status.confirmed && b.tx.status.confirmed)
241
+ return a.tx.status.block_height - b.tx.status.block_height;
242
+ return 0;
243
+ });
244
+ if (relevantTxs.length === 0)
245
+ return null;
246
+ return {
247
+ tx: await this.toBtcTxWithoutRawData(relevantTxs[0].tx),
248
+ vout: relevantTxs[0].vout
249
+ };
250
+ }
251
+ /**
252
+ * Waits till the address receives a transaction containing a specific txoHash
253
+ *
254
+ * @param address
255
+ * @param txoHash
256
+ * @param requiredConfirmations
257
+ * @param stateUpdateCbk
258
+ * @param abortSignal
259
+ * @param intervalSeconds
260
+ */
261
+ async waitForAddressTxo(address, txoHash, requiredConfirmations, stateUpdateCbk, abortSignal, intervalSeconds) {
262
+ if (abortSignal != null)
263
+ abortSignal.throwIfAborted();
264
+ while (abortSignal == null || !abortSignal.aborted) {
265
+ await (0, TimeoutUtils_1.timeoutPromise)((intervalSeconds || 5) * 1000, abortSignal);
266
+ const result = await this.checkAddressTxos(address, txoHash);
267
+ if (result == null) {
268
+ stateUpdateCbk();
269
+ continue;
270
+ }
271
+ const confirmationDelay = await this.getConfirmationDelay(result.tx, requiredConfirmations);
272
+ if (confirmationDelay == null)
273
+ continue;
274
+ if (stateUpdateCbk != null)
275
+ stateUpdateCbk(result.tx, result.vout, confirmationDelay);
276
+ if (confirmationDelay === 0)
277
+ return result;
278
+ }
279
+ throw abortSignal.reason;
280
+ }
281
+ async waitForTransaction(txId, requiredConfirmations, stateUpdateCbk, abortSignal, intervalSeconds) {
282
+ if (abortSignal != null)
283
+ abortSignal.throwIfAborted();
284
+ while (abortSignal == null || !abortSignal.aborted) {
285
+ await (0, TimeoutUtils_1.timeoutPromise)((intervalSeconds || 5) * 1000, abortSignal);
286
+ const result = await this.getTransaction(txId);
287
+ if (result == null) {
288
+ stateUpdateCbk();
289
+ continue;
290
+ }
291
+ const confirmationDelay = await this.getConfirmationDelay(result, requiredConfirmations);
292
+ if (confirmationDelay == null)
293
+ continue;
294
+ if (stateUpdateCbk != null)
295
+ stateUpdateCbk(result, confirmationDelay);
296
+ if (confirmationDelay === 0)
297
+ return result;
298
+ }
299
+ throw abortSignal.reason;
300
+ }
301
+ async getLNNodeLiquidity(pubkey) {
302
+ const nodeInfo = await this.api.getLNNodeInfo(pubkey);
303
+ if (nodeInfo == null)
304
+ return null;
305
+ return {
306
+ publicKey: nodeInfo.public_key,
307
+ capacity: BigInt(nodeInfo.capacity),
308
+ numChannels: nodeInfo.active_channel_count
309
+ };
310
+ }
311
+ sendRawTransaction(rawTx) {
312
+ return this.api.sendTransaction(rawTx);
313
+ }
314
+ sendRawPackage(rawTx) {
315
+ throw new Error("Unsupported");
316
+ }
317
+ async isSpent(utxo, confirmed) {
318
+ const [txId, voutStr] = utxo.split(":");
319
+ const vout = parseInt(voutStr);
320
+ const outspends = await this.api.getOutspends(txId);
321
+ if (outspends[vout] == null)
322
+ return true;
323
+ if (confirmed) {
324
+ return outspends[vout].spent && outspends[vout].status.confirmed;
325
+ }
326
+ return outspends[vout].spent;
327
+ }
328
+ parseTransaction(rawTx) {
329
+ const btcTx = btc_signer_1.Transaction.fromRaw(buffer_1.Buffer.from(rawTx, "hex"), {
330
+ allowLegacyWitnessUtxo: true,
331
+ allowUnknownInputs: true,
332
+ allowUnknownOutputs: true,
333
+ disableScriptCheck: true
334
+ });
335
+ return Promise.resolve(bitcoinTxToBtcTx(btcTx));
336
+ }
337
+ getEffectiveFeeRate(btcTx) {
338
+ throw new Error("Unsupported.");
339
+ }
340
+ async getFeeRate() {
341
+ return (await this.api.getFees()).fastestFee;
342
+ }
343
+ getAddressBalances(address) {
344
+ return this.api.getAddressBalances(address);
345
+ }
346
+ async getAddressUTXOs(address) {
347
+ return (await this.api.getAddressUTXOs(address)).map(val => ({
348
+ txid: val.txid,
349
+ vout: val.vout,
350
+ confirmed: val.status.confirmed,
351
+ block_height: val.status.block_height,
352
+ block_hash: val.status.block_hash,
353
+ block_time: val.status.block_time,
354
+ value: val.value
355
+ }));
356
+ }
357
+ getCPFPData(txId) {
358
+ return this.api.getCPFPData(txId);
359
+ }
360
+ }
361
+ exports.MempoolBitcoinRpc = MempoolBitcoinRpc;
@@ -0,0 +1,22 @@
1
+ import { BtcRelay, BtcStoredHeader, RelaySynchronizer } from "@atomiqlabs/base";
2
+ import { MempoolBitcoinBlock } from "../MempoolBitcoinBlock";
3
+ import { MempoolBitcoinRpc } from "../MempoolBitcoinRpc";
4
+ export declare class MempoolBtcRelaySynchronizer<B extends BtcStoredHeader<any>, TX> implements RelaySynchronizer<B, TX, MempoolBitcoinBlock> {
5
+ bitcoinRpc: MempoolBitcoinRpc;
6
+ btcRelay: BtcRelay<B, TX, MempoolBitcoinBlock>;
7
+ constructor(btcRelay: BtcRelay<B, TX, MempoolBitcoinBlock>, bitcoinRpc: MempoolBitcoinRpc);
8
+ syncToLatestTxs(signer: string, feeRate?: string): Promise<{
9
+ txs: TX[];
10
+ targetCommitedHeader: B;
11
+ computedHeaderMap: {
12
+ [blockheight: number]: B;
13
+ };
14
+ blockHeaderMap: {
15
+ [blockheight: number]: MempoolBitcoinBlock;
16
+ };
17
+ btcRelayTipCommitedHeader: B;
18
+ btcRelayTipBlockHeader: MempoolBitcoinBlock;
19
+ latestBlockHeader: MempoolBitcoinBlock;
20
+ startForkId?: number;
21
+ }>;
22
+ }
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MempoolBtcRelaySynchronizer = void 0;
4
+ const Logger_1 = require("../../../utils/Logger");
5
+ const TimeoutUtils_1 = require("../../../utils/TimeoutUtils");
6
+ const logger = (0, Logger_1.getLogger)("MempoolBtcRelaySynchronizer: ");
7
+ class MempoolBtcRelaySynchronizer {
8
+ constructor(btcRelay, bitcoinRpc) {
9
+ this.btcRelay = btcRelay;
10
+ this.bitcoinRpc = bitcoinRpc;
11
+ }
12
+ async syncToLatestTxs(signer, feeRate) {
13
+ const tipData = await this.btcRelay.getTipData();
14
+ if (tipData == null)
15
+ throw new Error("BtcRelay tip data not found - probably not initialized?");
16
+ const latestKnownBlockLogData = await this.btcRelay.retrieveLatestKnownBlockLog();
17
+ if (latestKnownBlockLogData == null)
18
+ throw new Error("Failed to get latest known block log");
19
+ const { resultStoredHeader, resultBitcoinHeader } = latestKnownBlockLogData;
20
+ let cacheData = {
21
+ forkId: resultStoredHeader.getBlockheight() < tipData.blockheight ? -1 : 0,
22
+ lastStoredHeader: resultStoredHeader,
23
+ computedCommitedHeaders: []
24
+ };
25
+ let spvTipBlockHeader = latestKnownBlockLogData.resultBitcoinHeader;
26
+ logger.debug("Retrieved stored header with commitment: ", cacheData.lastStoredHeader);
27
+ logger.debug("SPV tip bitcoin RPC block header: ", spvTipBlockHeader);
28
+ let spvTipBlockHeight = spvTipBlockHeader.height;
29
+ const txsList = [];
30
+ const blockHeaderMap = {
31
+ [resultBitcoinHeader.getHeight()]: resultBitcoinHeader
32
+ };
33
+ const computedHeaderMap = {
34
+ [resultStoredHeader.getBlockheight()]: resultStoredHeader
35
+ };
36
+ let startForkId = undefined;
37
+ let forkFee = feeRate;
38
+ let mainFee = feeRate;
39
+ const saveHeaders = async (headerCache) => {
40
+ if (cacheData.forkId === -1) {
41
+ if (mainFee == null)
42
+ mainFee = await this.btcRelay.getMainFeeRate(signer);
43
+ cacheData = await this.btcRelay.saveNewForkHeaders(signer, headerCache, cacheData.lastStoredHeader, tipData.chainWork, mainFee);
44
+ }
45
+ else if (cacheData.forkId === 0) {
46
+ if (mainFee == null)
47
+ mainFee = await this.btcRelay.getMainFeeRate(signer);
48
+ cacheData = await this.btcRelay.saveMainHeaders(signer, headerCache, cacheData.lastStoredHeader, mainFee);
49
+ }
50
+ else {
51
+ if (forkFee == null)
52
+ forkFee = await this.btcRelay.getForkFeeRate(signer, cacheData.forkId);
53
+ cacheData = await this.btcRelay.saveForkHeaders(signer, headerCache, cacheData.lastStoredHeader, cacheData.forkId, tipData.chainWork, forkFee);
54
+ }
55
+ if (cacheData.forkId !== -1 && cacheData.forkId !== 0)
56
+ startForkId = cacheData.forkId;
57
+ txsList.push(cacheData.tx);
58
+ for (let storedHeader of cacheData.computedCommitedHeaders) {
59
+ computedHeaderMap[storedHeader.getBlockheight()] = storedHeader;
60
+ }
61
+ };
62
+ let headerCache = [];
63
+ while (true) {
64
+ const retrievedHeaders = await this.bitcoinRpc.getPast15Blocks(spvTipBlockHeight + 15);
65
+ let startIndex = retrievedHeaders.findIndex(val => val.height === spvTipBlockHeight);
66
+ if (startIndex === -1)
67
+ startIndex = retrievedHeaders.length; //Start from the last block
68
+ for (let i = startIndex - 1; i >= 0; i--) {
69
+ const header = retrievedHeaders[i];
70
+ blockHeaderMap[header.height] = header;
71
+ headerCache.push(header);
72
+ if (cacheData.forkId === 0 ?
73
+ headerCache.length >= this.btcRelay.maxHeadersPerTx :
74
+ headerCache.length >= this.btcRelay.maxForkHeadersPerTx) {
75
+ await saveHeaders(headerCache);
76
+ headerCache = [];
77
+ }
78
+ }
79
+ if (retrievedHeaders.length > 0) {
80
+ if (spvTipBlockHeight === retrievedHeaders[0].height)
81
+ break; //Already at the tip
82
+ spvTipBlockHeight = retrievedHeaders[0].height;
83
+ await (0, TimeoutUtils_1.timeoutPromise)(1000);
84
+ }
85
+ else
86
+ break;
87
+ }
88
+ if (headerCache.length > 0)
89
+ await saveHeaders(headerCache);
90
+ if (cacheData.forkId !== 0) {
91
+ throw new Error("Unable to synchronize on-chain bitcoin light client! Not enough chainwork at connected RPC.");
92
+ }
93
+ return {
94
+ txs: txsList,
95
+ targetCommitedHeader: cacheData.lastStoredHeader,
96
+ blockHeaderMap,
97
+ computedHeaderMap,
98
+ btcRelayTipCommitedHeader: resultStoredHeader,
99
+ btcRelayTipBlockHeader: resultBitcoinHeader,
100
+ latestBlockHeader: spvTipBlockHeader,
101
+ startForkId
102
+ };
103
+ }
104
+ }
105
+ exports.MempoolBtcRelaySynchronizer = MempoolBtcRelaySynchronizer;
@@ -0,0 +1,93 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { CoinselectAddressTypes } from "../coinselect2";
4
+ import { BTC_NETWORK } from "@scure/btc-signer/utils";
5
+ import { Transaction } from "@scure/btc-signer";
6
+ import { IBitcoinWallet } from "./IBitcoinWallet";
7
+ import { Buffer } from "buffer";
8
+ import { BitcoinRpcWithAddressIndex } from "../BitcoinRpcWithAddressIndex";
9
+ /**
10
+ * UTXO data structure for Bitcoin wallets
11
+ * @category Bitcoin
12
+ */
13
+ export type BitcoinWalletUtxo = {
14
+ vout: number;
15
+ txId: string;
16
+ value: number;
17
+ type: CoinselectAddressTypes;
18
+ outputScript: Buffer;
19
+ address: string;
20
+ cpfp?: {
21
+ txVsize: number;
22
+ txEffectiveFeeRate: number;
23
+ };
24
+ confirmed: boolean;
25
+ };
26
+ /**
27
+ * Identifies the address type of a Bitcoin address
28
+ * @category Bitcoin
29
+ */
30
+ export declare function identifyAddressType(address: string, network: BTC_NETWORK): CoinselectAddressTypes;
31
+ /**
32
+ * Abstract base class for Bitcoin wallet implementations
33
+ * @category Bitcoin
34
+ */
35
+ export declare abstract class BitcoinWallet implements IBitcoinWallet {
36
+ rpc: BitcoinRpcWithAddressIndex<any>;
37
+ network: BTC_NETWORK;
38
+ feeMultiplier: number;
39
+ feeOverride?: number;
40
+ constructor(mempoolApi: BitcoinRpcWithAddressIndex<any>, network: BTC_NETWORK, feeMultiplier?: number, feeOverride?: number);
41
+ getFeeRate(): Promise<number>;
42
+ protected _sendTransaction(rawHex: string): Promise<string>;
43
+ protected _getBalance(address: string): Promise<{
44
+ confirmedBalance: bigint;
45
+ unconfirmedBalance: bigint;
46
+ }>;
47
+ protected _getUtxoPool(sendingAddress: string, sendingAddressType: CoinselectAddressTypes): Promise<BitcoinWalletUtxo[]>;
48
+ protected _getPsbt(sendingAccounts: {
49
+ pubkey: string;
50
+ address: string;
51
+ addressType: CoinselectAddressTypes;
52
+ }[], recipient: string, amount: number, feeRate?: number): Promise<{
53
+ fee: number;
54
+ psbt?: Transaction;
55
+ inputAddressIndexes?: {
56
+ [address: string]: number[];
57
+ };
58
+ }>;
59
+ protected _fundPsbt(sendingAccounts: {
60
+ pubkey: string;
61
+ address: string;
62
+ addressType: CoinselectAddressTypes;
63
+ }[], psbt: Transaction, feeRate?: number): Promise<{
64
+ fee: number;
65
+ psbt?: Transaction;
66
+ inputAddressIndexes?: {
67
+ [address: string]: number[];
68
+ };
69
+ }>;
70
+ protected _getSpendableBalance(sendingAccounts: {
71
+ address: string;
72
+ addressType: CoinselectAddressTypes;
73
+ }[], psbt?: Transaction, feeRate?: number): Promise<{
74
+ balance: bigint;
75
+ feeRate: number;
76
+ totalFee: number;
77
+ }>;
78
+ abstract sendTransaction(address: string, amount: bigint, feeRate?: number): Promise<string>;
79
+ abstract fundPsbt(psbt: Transaction, feeRate?: number): Promise<Transaction>;
80
+ abstract signPsbt(psbt: Transaction, signInputs: number[]): Promise<Transaction>;
81
+ abstract getTransactionFee(address: string, amount: bigint, feeRate?: number): Promise<number>;
82
+ abstract getFundedPsbtFee(psbt: Transaction, feeRate?: number): Promise<number>;
83
+ abstract getReceiveAddress(): string;
84
+ abstract getBalance(): Promise<{
85
+ confirmedBalance: bigint;
86
+ unconfirmedBalance: bigint;
87
+ }>;
88
+ abstract getSpendableBalance(psbt?: Transaction, feeRate?: number): Promise<{
89
+ balance: bigint;
90
+ feeRate: number;
91
+ totalFee: number;
92
+ }>;
93
+ }