@atomiqlabs/sdk 7.0.12 → 8.0.8

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,197 @@
1
+ import {isISwapInit, ISwap, ISwapInit} from "../ISwap";
2
+ import {
3
+ ChainType,
4
+ SwapCommitState,
5
+ SwapCommitStateType,
6
+ SwapData,
7
+ SwapExpiredState,
8
+ SwapNotCommitedState,
9
+ SwapPaidState
10
+ } from "@atomiqlabs/base";
11
+ import {IEscrowSwapDefinition, IEscrowSwapWrapper} from "./IEscrowSwapWrapper";
12
+ import {Buffer} from "buffer";
13
+ import {timeoutPromise} from "../../utils/TimeoutUtils";
14
+
15
+ export type IEscrowSwapInit<T extends SwapData> = ISwapInit & {
16
+ data?: T,
17
+ };
18
+
19
+ export function isIEscrowSwapInit<T extends SwapData>(obj: any): obj is IEscrowSwapInit<T> {
20
+ return typeof obj === 'object' &&
21
+ (obj.data == null || typeof obj.data === 'object') &&
22
+ isISwapInit(obj);
23
+ }
24
+
25
+ export abstract class IEscrowSwap<
26
+ T extends ChainType = ChainType,
27
+ D extends IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, D>, IEscrowSwap<T, D, S>> = IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, any>, IEscrowSwap<T, any, any>>,
28
+ S extends number = number
29
+ > extends ISwap<T, D, S> {
30
+
31
+ data?: T["Data"];
32
+
33
+ /**
34
+ * Transaction IDs for the swap on the smart chain side
35
+ */
36
+ commitTxId?: string;
37
+ refundTxId?: string;
38
+ claimTxId?: string;
39
+
40
+ protected constructor(wrapper: D["Wrapper"], obj: any);
41
+ protected constructor(wrapper: D["Wrapper"], swapInit: IEscrowSwapInit<T["Data"]>);
42
+ protected constructor(
43
+ wrapper: D["Wrapper"],
44
+ swapInitOrObj: IEscrowSwapInit<T["Data"]> | any,
45
+ ) {
46
+ super(wrapper, swapInitOrObj);
47
+
48
+ if(isIEscrowSwapInit(swapInitOrObj)) {
49
+ this.data = swapInitOrObj.data;
50
+ } else {
51
+ if(swapInitOrObj.data!=null) this.data = new wrapper.swapDataDeserializer(swapInitOrObj.data);
52
+
53
+ this.commitTxId = swapInitOrObj.commitTxId;
54
+ this.claimTxId = swapInitOrObj.claimTxId;
55
+ this.refundTxId = swapInitOrObj.refundTxId;
56
+ }
57
+ }
58
+
59
+ protected abstract getSwapData(): T["Data"];
60
+
61
+ //////////////////////////////
62
+ //// Identifiers
63
+
64
+ /**
65
+ * Returns the identification hash of the swap, usually claim data hash, but can be overriden, e.g. for
66
+ * lightning swaps the identifier hash is used instead of claim data hash
67
+ */
68
+ protected getIdentifierHash(): Buffer {
69
+ const claimHashBuffer = Buffer.from(this.getClaimHash(), "hex");
70
+ if(this.randomNonce==null) return claimHashBuffer;
71
+ return Buffer.concat([claimHashBuffer, Buffer.from(this.randomNonce, "hex")]);
72
+ }
73
+
74
+ /**
75
+ * Returns the identification hash of the swap, usually claim data hash, but can be overriden, e.g. for
76
+ * lightning swaps the identifier hash is used instead of claim data hash
77
+ */
78
+ protected getIdentifierHashString(): string {
79
+ const identifierHash = this.getIdentifierHash();
80
+ return identifierHash.toString("hex");
81
+ }
82
+
83
+ _getEscrowHash(): string | null {
84
+ return this.data?.getEscrowHash() ?? null;
85
+ }
86
+
87
+ /**
88
+ * Returns the escrow hash - i.e. hash of the escrow data
89
+ */
90
+ getEscrowHash(): string | null {
91
+ return this._getEscrowHash();
92
+ }
93
+
94
+ /**
95
+ * Returns the claim data hash - i.e. hash passed to the claim handler
96
+ */
97
+ getClaimHash(): string {
98
+ return this.getSwapData().getClaimHash();
99
+ }
100
+
101
+ getId(): string {
102
+ return this.getIdentifierHashString();
103
+ }
104
+
105
+
106
+ //////////////////////////////
107
+ //// Watchdogs
108
+
109
+ /**
110
+ * Periodically checks the chain to see whether the swap is committed
111
+ *
112
+ * @param intervalSeconds How often to check (in seconds), default to 5s
113
+ * @param abortSignal
114
+ * @protected
115
+ */
116
+ protected async watchdogWaitTillCommited(intervalSeconds?: number, abortSignal?: AbortSignal): Promise<boolean> {
117
+ if(this.data==null) throw new Error("Tried to await commitment but data is null, invalid state?");
118
+
119
+ intervalSeconds ??= 5;
120
+ let status: SwapCommitState = {type: SwapCommitStateType.NOT_COMMITED};
121
+ while(status?.type===SwapCommitStateType.NOT_COMMITED) {
122
+ await timeoutPromise(intervalSeconds*1000, abortSignal);
123
+ try {
124
+ status = await this.wrapper.contract.getCommitStatus(this._getInitiator(), this.data);
125
+ if(
126
+ status?.type===SwapCommitStateType.NOT_COMMITED &&
127
+ await this._verifyQuoteDefinitelyExpired()
128
+ ) return false;
129
+ } catch (e) {
130
+ this.logger.error("watchdogWaitTillCommited(): Error when fetching commit status or signature expiry: ", e);
131
+ }
132
+ }
133
+ if(abortSignal!=null) abortSignal.throwIfAborted();
134
+ return status?.type!==SwapCommitStateType.EXPIRED;
135
+ }
136
+
137
+ /**
138
+ * Periodically checks the chain to see whether the swap was finished (claimed or refunded)
139
+ *
140
+ * @param intervalSeconds How often to check (in seconds), default to 5s
141
+ * @param abortSignal
142
+ * @protected
143
+ */
144
+ protected async watchdogWaitTillResult(intervalSeconds?: number, abortSignal?: AbortSignal): Promise<
145
+ SwapPaidState | SwapExpiredState | SwapNotCommitedState
146
+ > {
147
+ if(this.data==null) throw new Error("Tried to await result but data is null, invalid state?");
148
+
149
+ intervalSeconds ??= 5;
150
+ let status: SwapCommitState = {type: SwapCommitStateType.COMMITED};
151
+ while(status?.type===SwapCommitStateType.COMMITED || status?.type===SwapCommitStateType.REFUNDABLE) {
152
+ await timeoutPromise(intervalSeconds*1000, abortSignal);
153
+ try {
154
+ status = await this.wrapper.contract.getCommitStatus(this._getInitiator(), this.data);
155
+ } catch (e) {
156
+ this.logger.error("watchdogWaitTillResult(): Error when fetching commit status: ", e);
157
+ }
158
+ }
159
+ if(abortSignal!=null) abortSignal.throwIfAborted();
160
+ return status;
161
+ }
162
+
163
+
164
+ //////////////////////////////
165
+ //// Quote verification
166
+
167
+ /**
168
+ * Checks if the swap's quote is expired for good (i.e. the swap strictly cannot be committed on-chain anymore)
169
+ */
170
+ abstract _verifyQuoteDefinitelyExpired(): Promise<boolean>;
171
+
172
+ /**
173
+ * Checks if the swap's quote is still valid
174
+ */
175
+ abstract verifyQuoteValid(): Promise<boolean>;
176
+
177
+
178
+ //////////////////////////////
179
+ //// Helpers for batched swap checks
180
+
181
+ abstract _shouldFetchCommitStatus(): boolean;
182
+
183
+ abstract _shouldFetchExpiryStatus(): boolean;
184
+
185
+ abstract _sync(save?: boolean, quoteDefinitelyExpired?: boolean, commitStatus?: SwapCommitState): Promise<boolean>;
186
+
187
+ serialize(): any {
188
+ return {
189
+ ...super.serialize(),
190
+ data: this.data!=null ? this.data.serialize() : null,
191
+ commitTxId: this.commitTxId,
192
+ claimTxId: this.claimTxId,
193
+ refundTxId: this.refundTxId
194
+ }
195
+ };
196
+
197
+ }
@@ -0,0 +1,210 @@
1
+ import {ISwapWrapper, ISwapWrapperOptions, SwapTypeDefinition, WrapperCtorTokens} from "../ISwapWrapper";
2
+ import {
3
+ ChainType,
4
+ ClaimEvent,
5
+ InitializeEvent,
6
+ RefundEvent,
7
+ SignatureData,
8
+ SignatureVerificationError,
9
+ SwapCommitState,
10
+ SwapEvent
11
+ } from "@atomiqlabs/base";
12
+ import {ISwap} from "../ISwap";
13
+ import {UnifiedSwapStorage} from "../../storage/UnifiedSwapStorage";
14
+ import {UnifiedSwapEventListener} from "../../events/UnifiedSwapEventListener";
15
+ import {ISwapPrice} from "../../prices/abstract/ISwapPrice";
16
+ import {EventEmitter} from "events";
17
+ import {SwapType} from "../../enums/SwapType";
18
+ import {IEscrowSwap} from "./IEscrowSwap";
19
+ import {Intermediary} from "../../intermediaries/Intermediary";
20
+
21
+ export type IEscrowSwapDefinition<T extends ChainType, W extends IEscrowSwapWrapper<T, any>, S extends IEscrowSwap<T>> = SwapTypeDefinition<T, W, S>;
22
+
23
+ export abstract class IEscrowSwapWrapper<
24
+ T extends ChainType,
25
+ D extends IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, D>, IEscrowSwap<T, D>>,
26
+ O extends ISwapWrapperOptions = ISwapWrapperOptions
27
+ > extends ISwapWrapper<T, D, O> {
28
+ readonly abstract TYPE: SwapType;
29
+
30
+ readonly contract: T["Contract"];
31
+ readonly swapDataDeserializer: new (data: any) => T["Data"];
32
+
33
+ constructor(
34
+ chainIdentifier: string,
35
+ unifiedStorage: UnifiedSwapStorage<T>,
36
+ unifiedChainEvents: UnifiedSwapEventListener<T>,
37
+ chain: T["ChainInterface"],
38
+ contract: T["Contract"],
39
+ prices: ISwapPrice,
40
+ tokens: WrapperCtorTokens,
41
+ swapDataDeserializer: new (data: any) => T["Data"],
42
+ options: O,
43
+ events?: EventEmitter<{swapState: [ISwap]}>
44
+ ) {
45
+ super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, options, events);
46
+ this.swapDataDeserializer = swapDataDeserializer;
47
+ this.contract = contract;
48
+ }
49
+
50
+ /**
51
+ * Pre-fetches signature verification data from the server's pre-sent promise, doesn't throw, instead returns null
52
+ *
53
+ * @param signDataPrefetch Promise that resolves when we receive "signDataPrefetch" from the LP in streaming mode
54
+ * @protected
55
+ * @returns Pre-fetched signature verification data or null if failed
56
+ */
57
+ protected preFetchSignData(signDataPrefetch: Promise<any | null>): Promise<T["PreFetchVerification"] | undefined> {
58
+ if(this.contract.preFetchForInitSignatureVerification==null) return Promise.resolve(undefined);
59
+ return signDataPrefetch.then(obj => {
60
+ if(obj==null) return undefined;
61
+ return this.contract.preFetchForInitSignatureVerification!(obj);
62
+ }).catch(e => {
63
+ this.logger.error("preFetchSignData(): Error: ", e);
64
+ });
65
+ }
66
+
67
+ /**
68
+ * Verifies swap initialization signature returned by the intermediary
69
+ *
70
+ * @param initiator A smart chain account initiating the swap
71
+ * @param data Parsed swap data from the intermediary
72
+ * @param signature Response of the intermediary
73
+ * @param feeRatePromise Pre-fetched fee rate promise
74
+ * @param preFetchSignatureVerificationData Pre-fetched signature verification data
75
+ * @param abortSignal
76
+ * @protected
77
+ * @returns Swap initialization signature expiry
78
+ * @throws {SignatureVerificationError} when swap init signature is invalid
79
+ */
80
+ protected async verifyReturnedSignature(
81
+ initiator: string,
82
+ data: T["Data"],
83
+ signature: SignatureData,
84
+ feeRatePromise: Promise<any>,
85
+ preFetchSignatureVerificationData: Promise<any>,
86
+ abortSignal?: AbortSignal
87
+ ): Promise<number> {
88
+ const [feeRate, preFetchedSignatureData] = await Promise.all([feeRatePromise, preFetchSignatureVerificationData]);
89
+ await this.contract.isValidInitAuthorization(initiator, data, signature, feeRate, preFetchedSignatureData);
90
+ return await this.contract.getInitAuthorizationExpiry(data, signature, preFetchedSignatureData);
91
+ }
92
+
93
+ /**
94
+ * Processes InitializeEvent for a given swap
95
+ * @param swap
96
+ * @param event
97
+ * @protected
98
+ * @returns Whether the swap was updated/changed
99
+ */
100
+ protected abstract processEventInitialize(swap: D["Swap"], event: InitializeEvent<T["Data"]>): Promise<boolean>;
101
+
102
+ /**
103
+ * Processes ClaimEvent for a given swap
104
+ * @param swap
105
+ * @param event
106
+ * @protected
107
+ * @returns Whether the swap was updated/changed
108
+ */
109
+ protected abstract processEventClaim(swap: D["Swap"], event: ClaimEvent<T["Data"]>): Promise<boolean>;
110
+
111
+ /**
112
+ * Processes RefundEvent for a given swap
113
+ * @param swap
114
+ * @param event
115
+ * @protected
116
+ * @returns Whether the swap was updated/changed
117
+ */
118
+ protected abstract processEventRefund(swap: D["Swap"], event: RefundEvent<T["Data"]>): Promise<boolean>;
119
+
120
+ /**
121
+ * Processes a single SC on-chain event
122
+ * @private
123
+ * @param event
124
+ * @param swap
125
+ */
126
+ protected async processEvent(event: SwapEvent<T["Data"]>, swap: D["Swap"]): Promise<void> {
127
+ if(swap==null) return;
128
+
129
+ let swapChanged: boolean = false;
130
+ if(event instanceof InitializeEvent) {
131
+ swapChanged = await this.processEventInitialize(swap, event);
132
+ if(event.meta?.txId!=null && swap.commitTxId!==event.meta.txId) {
133
+ swap.commitTxId = event.meta.txId;
134
+ swapChanged ||= true;
135
+ }
136
+ }
137
+ if(event instanceof ClaimEvent) {
138
+ swapChanged = await this.processEventClaim(swap, event);
139
+ if(event.meta?.txId!=null && swap.claimTxId!==event.meta.txId) {
140
+ swap.claimTxId = event.meta.txId;
141
+ swapChanged ||= true;
142
+ }
143
+ }
144
+ if(event instanceof RefundEvent) {
145
+ swapChanged = await this.processEventRefund(swap, event);
146
+ if(event.meta?.txId!=null && swap.refundTxId!==event.meta.txId) {
147
+ swap.refundTxId = event.meta.txId;
148
+ swapChanged ||= true;
149
+ }
150
+ }
151
+
152
+ this.logger.info("processEvents(): "+event.constructor.name+" processed for "+swap.getId()+" swap: ", swap);
153
+
154
+ if(swapChanged) {
155
+ await swap._saveAndEmit();
156
+ }
157
+ }
158
+
159
+ protected async _checkPastSwaps(pastSwaps: D["Swap"][]): Promise<{ changedSwaps: D["Swap"][]; removeSwaps: D["Swap"][] }> {
160
+ const changedSwaps: D["Swap"][] = [];
161
+ const removeSwaps: D["Swap"][] = [];
162
+
163
+ const swapExpiredStatus: {[id: string]: boolean} = {};
164
+
165
+ const checkStatusSwaps: (D["Swap"] & {data: T["Data"]})[] = [];
166
+
167
+ for(let pastSwap of pastSwaps) {
168
+ if(pastSwap._shouldFetchExpiryStatus()) {
169
+ //Check expiry
170
+ swapExpiredStatus[pastSwap.getId()] = await pastSwap._verifyQuoteDefinitelyExpired();
171
+ }
172
+ if(pastSwap._shouldFetchCommitStatus()) {
173
+ //Add to swaps for which status should be checked
174
+ if(pastSwap.data!=null) checkStatusSwaps.push(pastSwap as (D["Swap"] & {data: T["Data"]}));
175
+ }
176
+ }
177
+
178
+ const swapStatuses = await this.contract.getCommitStatuses(checkStatusSwaps.map(val => ({signer: val._getInitiator(), swapData: val.data})));
179
+
180
+ for(let pastSwap of checkStatusSwaps) {
181
+ const escrowHash = pastSwap.getEscrowHash();
182
+ const shouldSave = await pastSwap._sync(
183
+ false,
184
+ swapExpiredStatus[pastSwap.getId()],
185
+ escrowHash==null ? undefined : swapStatuses[escrowHash]
186
+ );
187
+ if(shouldSave) {
188
+ if(pastSwap.isQuoteExpired()) {
189
+ removeSwaps.push(pastSwap);
190
+ } else {
191
+ changedSwaps.push(pastSwap);
192
+ }
193
+ }
194
+ }
195
+
196
+ return {
197
+ changedSwaps,
198
+ removeSwaps
199
+ };
200
+ }
201
+
202
+ recoverFromSwapDataAndState(
203
+ init: {data: T["Data"], getInitTxId: () => Promise<string>, getTxBlock: () => Promise<{blockTime: number, blockHeight: number}>},
204
+ state: SwapCommitState,
205
+ lp?: Intermediary
206
+ ): Promise<D["Swap"] | null> {
207
+ return Promise.resolve(null);
208
+ }
209
+
210
+ }
@@ -0,0 +1,150 @@
1
+ import {ChainType, SwapData} from "@atomiqlabs/base";
2
+ import {IFromBTCDefinition, IFromBTCWrapper} from "./IFromBTCWrapper";
3
+ import {ISwapWrapperOptions, WrapperCtorTokens} from "../../ISwapWrapper";
4
+ import {LightningNetworkApi, LNNodeLiquidity} from "../../../bitcoin/LightningNetworkApi";
5
+ import {UnifiedSwapStorage} from "../../../storage/UnifiedSwapStorage";
6
+ import {UnifiedSwapEventListener} from "../../../events/UnifiedSwapEventListener";
7
+ import {ISwapPrice} from "../../../prices/abstract/ISwapPrice";
8
+ import {EventEmitter} from "events";
9
+ import {Buffer} from "buffer";
10
+ import {randomBytes} from "../../../utils/Utils";
11
+ import {Intermediary} from "../../../intermediaries/Intermediary";
12
+ import {PaymentRequestObject, TagsObject} from "@atomiqlabs/bolt11";
13
+ import {IntermediaryError} from "../../../errors/IntermediaryError";
14
+ import {LNURL} from "../../../lnurl/LNURL";
15
+ import {UserError} from "../../../errors/UserError";
16
+ import { sha256 } from "@noble/hashes/sha256";
17
+ import {IEscrowSwap} from "../IEscrowSwap";
18
+ import {LNURLWithdrawParamsWithUrl} from "../../../types/lnurl/LNURLWithdraw";
19
+
20
+ export type IFromBTCLNDefinition<T extends ChainType, W extends IFromBTCLNWrapper<T, any>, S extends IEscrowSwap<T>> = IFromBTCDefinition<T, W, S>;
21
+
22
+ export abstract class IFromBTCLNWrapper<
23
+ T extends ChainType,
24
+ D extends IFromBTCLNDefinition<T, IFromBTCLNWrapper<T, D>, IEscrowSwap<T, D>>,
25
+ O extends ISwapWrapperOptions = ISwapWrapperOptions
26
+ > extends IFromBTCWrapper<T, D, O> {
27
+
28
+ protected readonly lnApi: LightningNetworkApi;
29
+
30
+ /**
31
+ * @param chainIdentifier
32
+ * @param unifiedStorage Storage interface for the current environment
33
+ * @param unifiedChainEvents On-chain event listener
34
+ * @param chain
35
+ * @param contract Underlying contract handling the swaps
36
+ * @param prices Swap pricing handler
37
+ * @param tokens
38
+ * @param swapDataDeserializer Deserializer for SwapData
39
+ * @param lnApi
40
+ * @param options
41
+ * @param events Instance to use for emitting events
42
+ */
43
+ constructor(
44
+ chainIdentifier: string,
45
+ unifiedStorage: UnifiedSwapStorage<T>,
46
+ unifiedChainEvents: UnifiedSwapEventListener<T>,
47
+ chain: T["ChainInterface"],
48
+ contract: T["Contract"],
49
+ prices: ISwapPrice,
50
+ tokens: WrapperCtorTokens,
51
+ swapDataDeserializer: new (data: any) => T["Data"],
52
+ lnApi: LightningNetworkApi,
53
+ options: O,
54
+ events?: EventEmitter<{swapState: [IEscrowSwap]}>
55
+ ) {
56
+ super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, options, events);
57
+ this.lnApi = lnApi;
58
+ }
59
+ /**
60
+ * Returns the swap expiry, leaving enough time for the user to claim the HTLC
61
+ *
62
+ * @param data Parsed swap data
63
+ */
64
+ getHtlcTimeout(data: SwapData): bigint {
65
+ return data.getExpiry() - 600n;
66
+ }
67
+
68
+ /**
69
+ * Generates a new 32-byte secret to be used as pre-image for lightning network invoice & HTLC swap\
70
+ *
71
+ * @private
72
+ * @returns Hash pre-image & payment hash
73
+ */
74
+ protected getSecretAndHash(): {secret: Buffer, paymentHash: Buffer} {
75
+ const secret = randomBytes(32);
76
+ const paymentHash = Buffer.from(sha256(secret));
77
+ return {secret, paymentHash};
78
+ }
79
+
80
+ /**
81
+ * Pre-fetches intermediary's LN node capacity, doesn't throw, instead returns null
82
+ *
83
+ * @param pubkeyPromise Promise that resolves when we receive "lnPublicKey" param from the intermediary thorugh
84
+ * streaming
85
+ * @private
86
+ * @returns LN Node liquidity
87
+ */
88
+ protected preFetchLnCapacity(pubkeyPromise: Promise<string | null>): Promise<LNNodeLiquidity | null> {
89
+ return pubkeyPromise.then(pubkey => {
90
+ if(pubkey==null) return null;
91
+ return this.lnApi.getLNNodeLiquidity(pubkey)
92
+ }).catch(e => {
93
+ this.logger.warn("preFetchLnCapacity(): Error: ", e);
94
+ return null;
95
+ })
96
+ }
97
+
98
+ /**
99
+ * Verifies whether the intermediary's lightning node has enough inbound capacity to receive the LN payment
100
+ *
101
+ * @param lp Intermediary
102
+ * @param decodedPr Decoded bolt11 lightning network invoice
103
+ * @param amountIn Amount to be paid for the swap in sats
104
+ * @param lnCapacityPrefetchPromise Pre-fetch for LN node capacity, preFetchLnCapacity()
105
+ * @param abortSignal
106
+ * @private
107
+ * @throws {IntermediaryError} if the lightning network node doesn't have enough inbound liquidity
108
+ * @throws {Error} if the lightning network node's inbound liquidity might be enough, but the swap would
109
+ * deplete more than half of the liquidity
110
+ */
111
+ protected async verifyLnNodeCapacity(
112
+ lp: Intermediary,
113
+ decodedPr: PaymentRequestObject & {tagsObject: TagsObject},
114
+ lnCapacityPrefetchPromise?: Promise<LNNodeLiquidity | null>,
115
+ abortSignal?: AbortSignal
116
+ ): Promise<void> {
117
+ if(decodedPr.payeeNodeKey==null) throw new Error("Unable to extract payee pubkey from the swap invoice!");
118
+ if(decodedPr.millisatoshis==null) throw new Error("Swap invoice doesn't contains msat amount field!");
119
+
120
+ const _result = await lnCapacityPrefetchPromise ?? await this.lnApi.getLNNodeLiquidity(decodedPr.payeeNodeKey);
121
+ if(_result===null) throw new IntermediaryError("LP's lightning node not found in the lightning network graph!");
122
+
123
+ lp.lnData = _result;
124
+
125
+ if(decodedPr.payeeNodeKey!==_result.publicKey) throw new IntermediaryError("Invalid pr returned - payee pubkey");
126
+ const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
127
+ if(_result.capacity < amountIn)
128
+ throw new IntermediaryError("LP's lightning node doesn't have enough inbound capacity for the swap!");
129
+ if((_result.capacity / 2n) < amountIn)
130
+ throw new Error("LP's lightning node probably doesn't have enough inbound capacity for the swap!");
131
+ }
132
+
133
+ /**
134
+ * Parses and fetches lnurl withdraw params from the specified lnurl
135
+ *
136
+ * @param lnurl LNURL to be parsed and fetched
137
+ * @param abortSignal
138
+ * @private
139
+ * @throws {UserError} if the LNURL is invalid or if it's not a LNURL-withdraw
140
+ */
141
+ protected async getLNURLWithdraw(lnurl: string | LNURLWithdrawParamsWithUrl, abortSignal: AbortSignal): Promise<LNURLWithdrawParamsWithUrl> {
142
+ if(typeof(lnurl)!=="string") return lnurl;
143
+
144
+ const res = await LNURL.getLNURL(lnurl, true, this.options.getRequestTimeout, abortSignal);
145
+ if(res==null) throw new UserError("Invalid LNURL");
146
+ if(res.tag!=="withdrawRequest") throw new UserError("Not a LNURL-withdrawal");
147
+ return res;
148
+ }
149
+
150
+ }