@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,437 @@
1
+ import {BtcBlockWithTxs, BtcSyncInfo, BtcTx} from "@atomiqlabs/base";
2
+ import {MempoolBitcoinBlock} from "./MempoolBitcoinBlock";
3
+ import {BitcoinTransaction, MempoolApi, TxVout} from "./MempoolApi";
4
+ import {Buffer} from "buffer";
5
+ import {BitcoinRpcWithAddressIndex, BtcTxWithBlockheight} from "../BitcoinRpcWithAddressIndex";
6
+ import {LightningNetworkApi, LNNodeLiquidity} from "../LightningNetworkApi";
7
+ import {getTxoHash} from "../../utils/Utils";
8
+ import {Script, Transaction} from "@scure/btc-signer";
9
+ import {sha256} from "@noble/hashes/sha2";
10
+ import {timeoutPromise} from "../../utils/TimeoutUtils";
11
+
12
+ const BITCOIN_BLOCKTIME = 600 * 1000;
13
+ const BITCOIN_BLOCKSIZE = 1024*1024;
14
+
15
+ function bitcoinTxToBtcTx(btcTx: Transaction): BtcTx {
16
+ return {
17
+ locktime: btcTx.lockTime,
18
+ version: btcTx.version,
19
+ confirmations: 0,
20
+ txid: Buffer.from(sha256(sha256(btcTx.toBytes(true, false)))).reverse().toString("hex"),
21
+ hex: Buffer.from(btcTx.toBytes(true, false)).toString("hex"),
22
+ raw: Buffer.from(btcTx.toBytes(true, true)).toString("hex"),
23
+ vsize: btcTx.isFinal ? btcTx.vsize : NaN,
24
+
25
+ outs: Array.from({length: btcTx.outputsLength}, (_, i) => i).map((index) => {
26
+ const output = btcTx.getOutput(index);
27
+ return {
28
+ value: Number(output.amount),
29
+ n: index,
30
+ scriptPubKey: {
31
+ asm: Script.decode(output.script!).map(val => typeof(val)==="object" ? Buffer.from(val).toString("hex") : val.toString()).join(" "),
32
+ hex: Buffer.from(output.script!).toString("hex")
33
+ }
34
+ }
35
+ }),
36
+ ins: Array.from({length: btcTx.inputsLength}, (_, i) => i).map(index => {
37
+ const input = btcTx.getInput(index);
38
+ return {
39
+ txid: Buffer.from(input.txid!).toString("hex"),
40
+ vout: input.index!,
41
+ scriptSig: {
42
+ asm: Script.decode(input.finalScriptSig!).map(val => typeof(val)==="object" ? Buffer.from(val).toString("hex") : val.toString()).join(" "),
43
+ hex: Buffer.from(input.finalScriptSig!).toString("hex")
44
+ },
45
+ sequence: input.sequence!,
46
+ txinwitness: input.finalScriptWitness==null ? [] : input.finalScriptWitness.map(witness => Buffer.from(witness).toString("hex"))
47
+ }
48
+ })
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Bitcoin RPC implementation via Mempool.space API
54
+ * @category Bitcoin
55
+ */
56
+ export class MempoolBitcoinRpc implements BitcoinRpcWithAddressIndex<MempoolBitcoinBlock>, LightningNetworkApi {
57
+
58
+ api: MempoolApi;
59
+
60
+ constructor(urlOrMempoolApi: MempoolApi | string | string[]) {
61
+ this.api = urlOrMempoolApi instanceof MempoolApi ? urlOrMempoolApi : new MempoolApi(urlOrMempoolApi);
62
+ }
63
+
64
+ /**
65
+ * Returns a txo hash for a specific transaction vout
66
+ *
67
+ * @param vout
68
+ * @private
69
+ */
70
+ private static getTxoHash(vout: TxVout): Buffer {
71
+ return getTxoHash(vout.scriptpubkey, vout.value);
72
+ }
73
+
74
+ /**
75
+ * Returns delay in milliseconds till an unconfirmed transaction is expected to confirm, returns -1
76
+ * if the transaction won't confirm any time soon
77
+ *
78
+ * @param feeRate
79
+ * @private
80
+ */
81
+ private async getTimeTillConfirmation(feeRate: number): Promise<number> {
82
+ const mempoolBlocks = await this.api.getPendingBlocks();
83
+ const mempoolBlockIndex = mempoolBlocks.findIndex(block => block.feeRange[0]<=feeRate);
84
+ if(mempoolBlockIndex===-1) return -1;
85
+ //Last returned block is usually an aggregate (or a stack) of multiple btc blocks, if tx falls in this block
86
+ // and the last returned block really is an aggregate one (size bigger than BITCOIN_BLOCKSIZE) we return -1
87
+ if(
88
+ mempoolBlockIndex+1===mempoolBlocks.length &&
89
+ mempoolBlocks[mempoolBlocks.length-1].blockVSize>BITCOIN_BLOCKSIZE
90
+ ) return -1;
91
+ return (mempoolBlockIndex+1) * BITCOIN_BLOCKTIME;
92
+ }
93
+
94
+ /**
95
+ * Returns an estimate after which time the tx will confirm with the required amount of confirmations,
96
+ * confirmationDelay of -1 means the transaction won't confirm in the near future
97
+ *
98
+ * @param tx
99
+ * @param requiredConfirmations
100
+ * @private
101
+ *
102
+ * @returns estimated confirmation delay, -1 if the transaction won't confirm in the near future, null if the
103
+ * transaction was replaced or was confirmed in the meantime
104
+ */
105
+ async getConfirmationDelay(tx: {txid: string, confirmations?: number}, requiredConfirmations: number): Promise<number | null> {
106
+ if(tx.confirmations==null || tx.confirmations===0) {
107
+ //Get CPFP data
108
+ const cpfpData = await this.api.getCPFPData(tx.txid);
109
+ if(cpfpData.effectiveFeePerVsize==null) {
110
+ //Transaction is either confirmed in the meantime, or replaced
111
+ return null;
112
+ }
113
+ let confirmationDelay = (await this.getTimeTillConfirmation(cpfpData.effectiveFeePerVsize));
114
+ if(confirmationDelay!==-1) confirmationDelay += (requiredConfirmations-1)*BITCOIN_BLOCKTIME;
115
+ return confirmationDelay;
116
+ }
117
+ if(tx.confirmations>requiredConfirmations) return 0;
118
+ return ((requiredConfirmations-tx.confirmations)*BITCOIN_BLOCKTIME);
119
+ }
120
+
121
+ /**
122
+ * Converts mempool API's transaction to BtcTx object while fetching the raw tx separately
123
+ * @param tx Transaction to convert
124
+ * @private
125
+ */
126
+ private async toBtcTx(tx: BitcoinTransaction): Promise<BtcTxWithBlockheight | null> {
127
+ const base = await this.toBtcTxWithoutRawData(tx);
128
+ if(base==null) return null;
129
+ const rawTx = await this.api.getRawTransaction(tx.txid);
130
+ if(rawTx==null) return null;
131
+ //Strip witness data
132
+ const btcTx = Transaction.fromRaw(rawTx, {
133
+ allowLegacyWitnessUtxo: true,
134
+ allowUnknownInputs: true,
135
+ allowUnknownOutputs: true,
136
+ disableScriptCheck: true
137
+ });
138
+ const strippedRawTx = Buffer.from(btcTx.toBytes(true, false)).toString("hex");
139
+
140
+ return {
141
+ ...base,
142
+ hex: strippedRawTx,
143
+ raw: rawTx.toString("hex")
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Converts mempool API's transaction to BtcTx object, doesn't populate raw and hex fields
149
+ * @param tx Transaction to convert
150
+ * @private
151
+ */
152
+ private async toBtcTxWithoutRawData(tx: BitcoinTransaction): Promise<Omit<BtcTxWithBlockheight, "raw" | "hex">> {
153
+ let confirmations: number = 0;
154
+ if(tx.status!=null && tx.status.confirmed) {
155
+ const blockheight = await this.api.getTipBlockHeight();
156
+ confirmations = blockheight-tx.status.block_height+1;
157
+ }
158
+
159
+ return {
160
+ locktime: tx.locktime,
161
+ version: tx.version,
162
+ blockheight: tx.status?.block_height,
163
+ blockhash: tx.status?.block_hash,
164
+ confirmations,
165
+ txid: tx.txid,
166
+ vsize: tx.weight/4,
167
+ outs: tx.vout.map((e, index) => {
168
+ return {
169
+ value: e.value,
170
+ n: index,
171
+ scriptPubKey: {
172
+ hex: e.scriptpubkey,
173
+ asm: e.scriptpubkey_asm
174
+ }
175
+ }
176
+ }),
177
+ ins: tx.vin.map(e => {
178
+ return {
179
+ txid: e.txid,
180
+ vout: e.vout,
181
+ scriptSig: {
182
+ hex: e.scriptsig,
183
+ asm: e.scriptsig_asm
184
+ },
185
+ sequence: e.sequence,
186
+ txinwitness: e.witness
187
+ }
188
+ }),
189
+ inputAddresses: tx.vin.map(e => e.prevout.scriptpubkey_address)
190
+ };
191
+ }
192
+
193
+ getTipHeight(): Promise<number> {
194
+ return this.api.getTipBlockHeight();
195
+ }
196
+
197
+ async getBlockHeader(blockhash: string): Promise<MempoolBitcoinBlock> {
198
+ return new MempoolBitcoinBlock(await this.api.getBlockHeader(blockhash));
199
+ }
200
+
201
+ async getMerkleProof(txId: string, blockhash: string): Promise<{
202
+ reversedTxId: Buffer;
203
+ pos: number;
204
+ merkle: Buffer[];
205
+ blockheight: number
206
+ }> {
207
+ const proof = await this.api.getTransactionProof(txId);
208
+ return {
209
+ reversedTxId: Buffer.from(txId, "hex").reverse(),
210
+ pos: proof.pos,
211
+ merkle: proof.merkle.map(e => Buffer.from(e, "hex").reverse()),
212
+ blockheight: proof.block_height
213
+ };
214
+ }
215
+
216
+ async getTransaction(txId: string): Promise<BtcTxWithBlockheight | null> {
217
+ const tx = await this.api.getTransaction(txId);
218
+ if(tx==null) return null;
219
+ return await this.toBtcTx(tx);
220
+ }
221
+
222
+ async isInMainChain(blockhash: string): Promise<boolean> {
223
+ const blockStatus = await this.api.getBlockStatus(blockhash);
224
+ return blockStatus.in_best_chain;
225
+ }
226
+
227
+ getBlockhash(height: number): Promise<string> {
228
+ return this.api.getBlockHash(height);
229
+ }
230
+
231
+ getBlockWithTransactions(blockhash: string): Promise<BtcBlockWithTxs> {
232
+ throw new Error("Unsupported.");
233
+ }
234
+
235
+ async getSyncInfo(): Promise<BtcSyncInfo> {
236
+ const tipHeight = await this.api.getTipBlockHeight();
237
+ return {
238
+ verificationProgress: 1,
239
+ blocks: tipHeight,
240
+ headers: tipHeight,
241
+ ibd: false
242
+ };
243
+ }
244
+
245
+ async getPast15Blocks(height: number): Promise<MempoolBitcoinBlock[]> {
246
+ return (await this.api.getPast15BlockHeaders(height)).map(blockHeader => new MempoolBitcoinBlock(blockHeader));
247
+ }
248
+
249
+ async checkAddressTxos(address: string, txoHash: Buffer): Promise<{
250
+ tx: Omit<BtcTxWithBlockheight, "hex" | "raw">,
251
+ vout: number
252
+ } | null> {
253
+ const allTxs = await this.api.getAddressTransactions(address);
254
+
255
+ const relevantTxs = allTxs
256
+ .map(tx => {
257
+ return {
258
+ tx,
259
+ vout: tx.vout.findIndex(vout => MempoolBitcoinRpc.getTxoHash(vout).equals(txoHash))
260
+ }
261
+ })
262
+ .filter(obj => obj.vout>=0)
263
+ .sort((a, b) => {
264
+ if(a.tx.status.confirmed && !b.tx.status.confirmed) return -1;
265
+ if(!a.tx.status.confirmed && b.tx.status.confirmed) return 1;
266
+ if(a.tx.status.confirmed && b.tx.status.confirmed) return a.tx.status.block_height-b.tx.status.block_height;
267
+ return 0;
268
+ });
269
+
270
+ if(relevantTxs.length===0) return null;
271
+
272
+ return {
273
+ tx: await this.toBtcTxWithoutRawData(relevantTxs[0].tx),
274
+ vout: relevantTxs[0].vout
275
+ };
276
+ }
277
+
278
+ /**
279
+ * Waits till the address receives a transaction containing a specific txoHash
280
+ *
281
+ * @param address
282
+ * @param txoHash
283
+ * @param requiredConfirmations
284
+ * @param stateUpdateCbk
285
+ * @param abortSignal
286
+ * @param intervalSeconds
287
+ */
288
+ async waitForAddressTxo(
289
+ address: string,
290
+ txoHash: Buffer,
291
+ requiredConfirmations: number,
292
+ stateUpdateCbk: (btcTx?: Omit<BtcTxWithBlockheight, "hex" | "raw">, vout?: number, txEtaMS?: number) => void,
293
+ abortSignal?: AbortSignal,
294
+ intervalSeconds?: number
295
+ ): Promise<{
296
+ tx: Omit<BtcTxWithBlockheight, "hex" | "raw">,
297
+ vout: number
298
+ }> {
299
+ if(abortSignal!=null) abortSignal.throwIfAborted();
300
+
301
+ while(abortSignal==null || !abortSignal.aborted) {
302
+ await timeoutPromise((intervalSeconds || 5)*1000, abortSignal);
303
+
304
+ const result = await this.checkAddressTxos(address, txoHash);
305
+ if(result==null) {
306
+ stateUpdateCbk();
307
+ continue;
308
+ }
309
+
310
+ const confirmationDelay = await this.getConfirmationDelay(result.tx, requiredConfirmations);
311
+ if(confirmationDelay==null) continue;
312
+
313
+ if(stateUpdateCbk!=null) stateUpdateCbk(
314
+ result.tx,
315
+ result.vout,
316
+ confirmationDelay
317
+ );
318
+
319
+ if(confirmationDelay===0) return result;
320
+ }
321
+
322
+ throw abortSignal.reason;
323
+ }
324
+
325
+
326
+ async waitForTransaction(
327
+ txId: string, requiredConfirmations: number,
328
+ stateUpdateCbk: (btcTx?: BtcTxWithBlockheight, txEtaMS?: number) => void,
329
+ abortSignal?: AbortSignal, intervalSeconds?: number
330
+ ): Promise<BtcTxWithBlockheight> {
331
+ if(abortSignal!=null) abortSignal.throwIfAborted();
332
+
333
+ while(abortSignal==null || !abortSignal.aborted) {
334
+ await timeoutPromise((intervalSeconds || 5)*1000, abortSignal);
335
+
336
+ const result = await this.getTransaction(txId);
337
+ if(result==null) {
338
+ stateUpdateCbk();
339
+ continue;
340
+ }
341
+
342
+ const confirmationDelay = await this.getConfirmationDelay(result, requiredConfirmations);
343
+ if(confirmationDelay==null) continue;
344
+
345
+ if(stateUpdateCbk!=null) stateUpdateCbk(
346
+ result,
347
+ confirmationDelay
348
+ );
349
+
350
+ if(confirmationDelay===0) return result;
351
+ }
352
+
353
+ throw abortSignal.reason;
354
+ }
355
+
356
+ async getLNNodeLiquidity(pubkey: string): Promise<LNNodeLiquidity | null> {
357
+ const nodeInfo = await this.api.getLNNodeInfo(pubkey);
358
+ if(nodeInfo==null) return null;
359
+ return {
360
+ publicKey: nodeInfo.public_key,
361
+ capacity: BigInt(nodeInfo.capacity),
362
+ numChannels: nodeInfo.active_channel_count
363
+ }
364
+ }
365
+
366
+ sendRawTransaction(rawTx: string): Promise<string> {
367
+ return this.api.sendTransaction(rawTx);
368
+ }
369
+
370
+ sendRawPackage(rawTx: string[]): Promise<string[]> {
371
+ throw new Error("Unsupported");
372
+ }
373
+
374
+ async isSpent(utxo: string, confirmed?: boolean): Promise<boolean> {
375
+ const [txId, voutStr] = utxo.split(":");
376
+ const vout = parseInt(voutStr);
377
+ const outspends = await this.api.getOutspends(txId);
378
+ if(outspends[vout]==null) return true;
379
+ if(confirmed) {
380
+ return outspends[vout].spent && outspends[vout].status.confirmed;
381
+ }
382
+ return outspends[vout].spent;
383
+ }
384
+
385
+ parseTransaction(rawTx: string): Promise<BtcTx> {
386
+ const btcTx = Transaction.fromRaw(Buffer.from(rawTx, "hex"), {
387
+ allowLegacyWitnessUtxo: true,
388
+ allowUnknownInputs: true,
389
+ allowUnknownOutputs: true,
390
+ disableScriptCheck: true
391
+ });
392
+ return Promise.resolve(bitcoinTxToBtcTx(btcTx));
393
+ }
394
+
395
+ getEffectiveFeeRate(btcTx: BtcTx): Promise<{ vsize: number; fee: number; feeRate: number }> {
396
+ throw new Error("Unsupported.");
397
+ }
398
+
399
+ async getFeeRate(): Promise<number> {
400
+ return (await this.api.getFees()).fastestFee;
401
+ }
402
+
403
+ getAddressBalances(address: string): Promise<{
404
+ confirmedBalance: bigint,
405
+ unconfirmedBalance: bigint
406
+ }> {
407
+ return this.api.getAddressBalances(address);
408
+ }
409
+
410
+ async getAddressUTXOs(address:string): Promise<{
411
+ txid: string,
412
+ vout: number,
413
+ confirmed: boolean,
414
+ block_height: number,
415
+ block_hash: string,
416
+ block_time: number
417
+ value: bigint
418
+ }[]> {
419
+ return (await this.api.getAddressUTXOs(address)).map(val => ({
420
+ txid: val.txid,
421
+ vout: val.vout,
422
+ confirmed: val.status.confirmed,
423
+ block_height: val.status.block_height,
424
+ block_hash: val.status.block_hash,
425
+ block_time: val.status.block_time,
426
+ value: val.value
427
+ }));
428
+ }
429
+
430
+ getCPFPData(txId: string): Promise<{
431
+ effectiveFeePerVsize: number,
432
+ adjustedVsize: number
433
+ }> {
434
+ return this.api.getCPFPData(txId)
435
+ }
436
+
437
+ }
@@ -0,0 +1,134 @@
1
+ import {BtcRelay, BtcStoredHeader, RelaySynchronizer} from "@atomiqlabs/base";
2
+ import {MempoolBitcoinBlock} from "../MempoolBitcoinBlock";
3
+ import {MempoolBitcoinRpc} from "../MempoolBitcoinRpc";
4
+
5
+ import {getLogger} from "../../../utils/Logger";
6
+ import {timeoutPromise} from "../../../utils/TimeoutUtils";
7
+
8
+ const logger = getLogger("MempoolBtcRelaySynchronizer: ")
9
+
10
+ export class MempoolBtcRelaySynchronizer<B extends BtcStoredHeader<any>, TX> implements RelaySynchronizer<B, TX, MempoolBitcoinBlock > {
11
+
12
+ bitcoinRpc: MempoolBitcoinRpc;
13
+ btcRelay: BtcRelay<B, TX, MempoolBitcoinBlock>;
14
+
15
+ constructor(btcRelay: BtcRelay<B, TX, MempoolBitcoinBlock>, bitcoinRpc: MempoolBitcoinRpc) {
16
+ this.btcRelay = btcRelay;
17
+ this.bitcoinRpc = bitcoinRpc;
18
+ }
19
+
20
+ async syncToLatestTxs(signer: string, feeRate?: string): Promise<{
21
+ txs: TX[]
22
+ targetCommitedHeader: B,
23
+ computedHeaderMap: {[blockheight: number]: B},
24
+ blockHeaderMap: {[blockheight: number]: MempoolBitcoinBlock},
25
+ btcRelayTipCommitedHeader: B,
26
+ btcRelayTipBlockHeader: MempoolBitcoinBlock,
27
+ latestBlockHeader: MempoolBitcoinBlock,
28
+ startForkId?: number
29
+ }> {
30
+ const tipData = await this.btcRelay.getTipData();
31
+ if(tipData==null) throw new Error("BtcRelay tip data not found - probably not initialized?");
32
+
33
+ const latestKnownBlockLogData = await this.btcRelay.retrieveLatestKnownBlockLog();
34
+ if(latestKnownBlockLogData==null) throw new Error("Failed to get latest known block log");
35
+ const {resultStoredHeader, resultBitcoinHeader} = latestKnownBlockLogData;
36
+
37
+ let cacheData: {
38
+ forkId: number,
39
+ lastStoredHeader: B,
40
+ tx?: TX,
41
+ computedCommitedHeaders: B[]
42
+ } = {
43
+ forkId: resultStoredHeader.getBlockheight()<tipData.blockheight ? -1 : 0, //Indicate that we will be submitting blocks to fork
44
+ lastStoredHeader: resultStoredHeader,
45
+ computedCommitedHeaders: []
46
+ };
47
+
48
+ let spvTipBlockHeader = latestKnownBlockLogData.resultBitcoinHeader;
49
+
50
+ logger.debug("Retrieved stored header with commitment: ", cacheData.lastStoredHeader);
51
+ logger.debug("SPV tip bitcoin RPC block header: ", spvTipBlockHeader);
52
+
53
+ let spvTipBlockHeight = spvTipBlockHeader.height;
54
+
55
+ const txsList: TX[] = [];
56
+ const blockHeaderMap: {[blockheight: number]: MempoolBitcoinBlock} = {
57
+ [resultBitcoinHeader.getHeight()]: resultBitcoinHeader
58
+ };
59
+ const computedHeaderMap: {[blockheight: number]: B} = {
60
+ [resultStoredHeader.getBlockheight()]: resultStoredHeader
61
+ };
62
+ let startForkId: number | undefined = undefined;
63
+
64
+ let forkFee: string | undefined = feeRate;
65
+ let mainFee: string | undefined = feeRate;
66
+ const saveHeaders = async (headerCache: MempoolBitcoinBlock[]) => {
67
+ if(cacheData.forkId===-1) {
68
+ if(mainFee==null) mainFee = await this.btcRelay.getMainFeeRate(signer);
69
+ cacheData = await this.btcRelay.saveNewForkHeaders(signer, headerCache, cacheData.lastStoredHeader, tipData.chainWork, mainFee);
70
+ } else if(cacheData.forkId===0) {
71
+ if(mainFee==null) mainFee = await this.btcRelay.getMainFeeRate(signer);
72
+ cacheData = await this.btcRelay.saveMainHeaders(signer, headerCache, cacheData.lastStoredHeader, mainFee);
73
+ } else {
74
+ if(forkFee==null) forkFee = await this.btcRelay.getForkFeeRate(signer, cacheData.forkId);
75
+ cacheData = await this.btcRelay.saveForkHeaders(signer, headerCache, cacheData.lastStoredHeader, cacheData.forkId, tipData.chainWork, forkFee)
76
+ }
77
+ if(cacheData.forkId!==-1 && cacheData.forkId!==0) startForkId = cacheData.forkId;
78
+ txsList.push(cacheData.tx!);
79
+ for(let storedHeader of cacheData.computedCommitedHeaders) {
80
+ computedHeaderMap[storedHeader.getBlockheight()] = storedHeader;
81
+ }
82
+ };
83
+
84
+ let headerCache: MempoolBitcoinBlock[] = [];
85
+
86
+ while(true) {
87
+ const retrievedHeaders = await this.bitcoinRpc.getPast15Blocks(spvTipBlockHeight+15);
88
+ let startIndex = retrievedHeaders.findIndex(val => val.height === spvTipBlockHeight);
89
+ if(startIndex === -1) startIndex = retrievedHeaders.length; //Start from the last block
90
+
91
+ for(let i=startIndex-1;i>=0;i--) {
92
+ const header = retrievedHeaders[i];
93
+
94
+ blockHeaderMap[header.height] = header;
95
+ headerCache.push(header);
96
+
97
+ if(cacheData.forkId===0 ?
98
+ headerCache.length>=this.btcRelay.maxHeadersPerTx :
99
+ headerCache.length>=this.btcRelay.maxForkHeadersPerTx) {
100
+
101
+ await saveHeaders(headerCache);
102
+ headerCache = [];
103
+ }
104
+ }
105
+
106
+ if(retrievedHeaders.length>0) {
107
+ if(spvTipBlockHeight === retrievedHeaders[0].height) break; //Already at the tip
108
+ spvTipBlockHeight = retrievedHeaders[0].height;
109
+ await timeoutPromise(1000);
110
+ } else break;
111
+ }
112
+
113
+ if(headerCache.length>0) await saveHeaders(headerCache);
114
+
115
+ if(cacheData.forkId!==0) {
116
+ throw new Error("Unable to synchronize on-chain bitcoin light client! Not enough chainwork at connected RPC.");
117
+ }
118
+
119
+ return {
120
+ txs: txsList,
121
+ targetCommitedHeader: cacheData.lastStoredHeader,
122
+
123
+ blockHeaderMap,
124
+ computedHeaderMap,
125
+
126
+ btcRelayTipCommitedHeader: resultStoredHeader,
127
+ btcRelayTipBlockHeader: resultBitcoinHeader,
128
+
129
+ latestBlockHeader: spvTipBlockHeader,
130
+ startForkId
131
+ };
132
+ }
133
+
134
+ }