@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,549 @@
1
+ import {decode as bolt11Decode, PaymentRequestObject, TagsObject} from "@atomiqlabs/bolt11";
2
+ import {
3
+ ChainSwapType,
4
+ ChainType,
5
+ ClaimEvent,
6
+ InitializeEvent, Messenger,
7
+ RefundEvent
8
+ } from "@atomiqlabs/base";
9
+ import {Intermediary} from "../../../../intermediaries/Intermediary";
10
+ import {Buffer} from "buffer";
11
+ import {UserError} from "../../../../errors/UserError";
12
+ import {IntermediaryError} from "../../../../errors/IntermediaryError";
13
+ import {SwapType} from "../../../../enums/SwapType";
14
+ import {
15
+ extendAbortController,
16
+ randomBytes,
17
+ throwIfUndefined
18
+ } from "../../../../utils/Utils";
19
+ import {
20
+ FromBTCLNAutoResponseType,
21
+ IntermediaryAPI
22
+ } from "../../../../intermediaries/apis/IntermediaryAPI";
23
+ import {RequestError} from "../../../../errors/RequestError";
24
+ import {LightningNetworkApi} from "../../../../bitcoin/LightningNetworkApi";
25
+ import {ISwapPrice} from "../../../../prices/abstract/ISwapPrice";
26
+ import {EventEmitter} from "events";
27
+ import {ISwapWrapperOptions, WrapperCtorTokens} from "../../../ISwapWrapper";
28
+ import {UnifiedSwapEventListener} from "../../../../events/UnifiedSwapEventListener";
29
+ import {UnifiedSwapStorage} from "../../../../storage/UnifiedSwapStorage";
30
+ import {ISwap} from "../../../ISwap";
31
+ import {FromBTCLNAutoSwap, FromBTCLNAutoSwapInit, FromBTCLNAutoSwapState} from "./FromBTCLNAutoSwap";
32
+ import {IFromBTCLNDefinition, IFromBTCLNWrapper} from "../IFromBTCLNWrapper";
33
+ import {IClaimableSwapWrapper} from "../../../IClaimableSwapWrapper";
34
+ import {AmountData} from "../../../../types/AmountData";
35
+ import {LNURLWithdrawParamsWithUrl} from "../../../../types/lnurl/LNURLWithdraw";
36
+ import {tryWithRetries} from "../../../../utils/RetryUtils";
37
+ import {AllOptional} from "../../../../utils/TypeUtils";
38
+
39
+ export type FromBTCLNAutoOptions = {
40
+ descriptionHash?: Buffer,
41
+ unsafeSkipLnNodeCheck?: boolean,
42
+ gasAmount?: bigint,
43
+ unsafeZeroWatchtowerFee?: boolean,
44
+ feeSafetyFactor?: number
45
+ };
46
+
47
+ export type FromBTCLNAutoWrapperOptions = ISwapWrapperOptions & {
48
+ safetyFactor: number,
49
+ bitcoinBlocktime: number,
50
+ unsafeSkipLnNodeCheck: boolean
51
+ };
52
+
53
+ export type FromBTCLNAutoDefinition<T extends ChainType> = IFromBTCLNDefinition<T, FromBTCLNAutoWrapper<T>, FromBTCLNAutoSwap<T>>;
54
+
55
+ export class FromBTCLNAutoWrapper<
56
+ T extends ChainType
57
+ > extends IFromBTCLNWrapper<T, FromBTCLNAutoDefinition<T>, FromBTCLNAutoWrapperOptions> implements IClaimableSwapWrapper<FromBTCLNAutoSwap<T>> {
58
+
59
+ public readonly claimableSwapStates = [FromBTCLNAutoSwapState.CLAIM_COMMITED];
60
+ public readonly TYPE = SwapType.FROM_BTCLN_AUTO;
61
+ public readonly swapDeserializer = FromBTCLNAutoSwap;
62
+
63
+ readonly messenger: Messenger;
64
+
65
+ /**
66
+ * @param chainIdentifier
67
+ * @param unifiedStorage Storage interface for the current environment
68
+ * @param unifiedChainEvents On-chain event listener
69
+ * @param chain
70
+ * @param contract Underlying contract handling the swaps
71
+ * @param prices Swap pricing handler
72
+ * @param tokens
73
+ * @param swapDataDeserializer Deserializer for SwapData
74
+ * @param lnApi
75
+ * @param messenger
76
+ * @param options
77
+ * @param events Instance to use for emitting events
78
+ */
79
+ constructor(
80
+ chainIdentifier: string,
81
+ unifiedStorage: UnifiedSwapStorage<T>,
82
+ unifiedChainEvents: UnifiedSwapEventListener<T>,
83
+ chain: T["ChainInterface"],
84
+ contract: T["Contract"],
85
+ prices: ISwapPrice,
86
+ tokens: WrapperCtorTokens,
87
+ swapDataDeserializer: new (data: any) => T["Data"],
88
+ lnApi: LightningNetworkApi,
89
+ messenger: Messenger,
90
+ options?: AllOptional<FromBTCLNAutoWrapperOptions>,
91
+ events?: EventEmitter<{swapState: [ISwap]}>
92
+ ) {
93
+ super(
94
+ chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, lnApi,
95
+ {
96
+ safetyFactor: options?.safetyFactor ?? 2,
97
+ bitcoinBlocktime: options?.bitcoinBlocktime ?? 10*60,
98
+ unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? false
99
+ },
100
+ events
101
+ );
102
+ this.messenger = messenger;
103
+ }
104
+
105
+ public readonly pendingSwapStates = [
106
+ FromBTCLNAutoSwapState.PR_CREATED,
107
+ FromBTCLNAutoSwapState.QUOTE_SOFT_EXPIRED,
108
+ FromBTCLNAutoSwapState.PR_PAID,
109
+ FromBTCLNAutoSwapState.CLAIM_COMMITED,
110
+ FromBTCLNAutoSwapState.EXPIRED
111
+ ];
112
+ public readonly tickSwapState = [
113
+ FromBTCLNAutoSwapState.PR_CREATED,
114
+ FromBTCLNAutoSwapState.QUOTE_SOFT_EXPIRED,
115
+ FromBTCLNAutoSwapState.PR_PAID,
116
+ FromBTCLNAutoSwapState.CLAIM_COMMITED
117
+ ];
118
+
119
+ protected async processEventInitialize(swap: FromBTCLNAutoSwap<T>, event: InitializeEvent<T["Data"]>): Promise<boolean> {
120
+ if(swap.state===FromBTCLNAutoSwapState.PR_PAID || swap.state===FromBTCLNAutoSwapState.PR_CREATED || swap.state===FromBTCLNAutoSwapState.QUOTE_SOFT_EXPIRED) {
121
+ if(swap.data==null) {
122
+ //Obtain data from the initialize event
123
+ const eventData = await event.swapData();
124
+ if(eventData==null) {
125
+ this.logger.error("processEventInitialize("+swap.getId()+"): Error when fetching swap data for swap, null returned!");
126
+ return false;
127
+ }
128
+ try {
129
+ await swap._saveRealSwapData(eventData, false);
130
+ this.logger.info("processEventInitialize("+swap.getId()+"): Successfully taken swap data from on-chain event!");
131
+ } catch (e) {
132
+ this.logger.error("processEventInitialize("+swap.getId()+"): Error when saving swap data for swap: ", e);
133
+ return false;
134
+ }
135
+ }
136
+
137
+ if(swap._getEscrowHash()!==event.escrowHash) {
138
+ this.logger.error("processEventInitialize("+swap.getId()+"): Error when processing event, escrow hashes don't match!");
139
+ return false;
140
+ }
141
+
142
+ swap.commitTxId = event.meta?.txId;
143
+ swap.state = FromBTCLNAutoSwapState.CLAIM_COMMITED;
144
+ swap._broadcastSecret().catch(e => {
145
+ this.logger.error("processEventInitialize("+swap.getId()+"): Error when broadcasting swap secret: ", e);
146
+ });
147
+ return true;
148
+ }
149
+ return false;
150
+ }
151
+
152
+ protected processEventClaim(swap: FromBTCLNAutoSwap<T>, event: ClaimEvent<T["Data"]>): Promise<boolean> {
153
+ if(swap.state!==FromBTCLNAutoSwapState.FAILED && swap.state!==FromBTCLNAutoSwapState.CLAIM_CLAIMED) {
154
+ swap.claimTxId = event.meta?.txId;
155
+ swap.state = FromBTCLNAutoSwapState.CLAIM_CLAIMED;
156
+ return Promise.resolve(true);
157
+ }
158
+ return Promise.resolve(false);
159
+ }
160
+
161
+ protected processEventRefund(swap: FromBTCLNAutoSwap<T>, event: RefundEvent<T["Data"]>): Promise<boolean> {
162
+ if(swap.state!==FromBTCLNAutoSwapState.CLAIM_CLAIMED && swap.state!==FromBTCLNAutoSwapState.FAILED) {
163
+ swap.refundTxId ??= event.meta?.txId;
164
+ swap.state = FromBTCLNAutoSwapState.FAILED;
165
+ return Promise.resolve(true);
166
+ }
167
+ return Promise.resolve(false);
168
+ }
169
+
170
+ /**
171
+ * Pre-fetches claimer (watchtower) bounty data for the swap. Doesn't throw, instead returns null and aborts the
172
+ * provided abortController
173
+ *
174
+ * @param signer Smartchain signer address initiating the swap
175
+ * @param amountData
176
+ * @param options Options as passed to the swap creation function
177
+ * @param abortController
178
+ * @private
179
+ */
180
+ private async preFetchClaimerBounty(
181
+ signer: string,
182
+ amountData: AmountData,
183
+ options: {feeSafetyFactor: number, unsafeZeroWatchtowerFee: boolean},
184
+ abortController: AbortController
185
+ ): Promise<bigint | undefined> {
186
+ if(options.unsafeZeroWatchtowerFee) return 0n;
187
+
188
+ const dummyAmount = BigInt(Math.floor(Math.random()* 0x1000000));
189
+ const dummySwapData = await this.contract.createSwapData(
190
+ ChainSwapType.HTLC, this.chain.randomAddress(), signer, amountData.token,
191
+ dummyAmount, this.contract.getHashForHtlc(randomBytes(32)).toString("hex"),
192
+ this.getRandomSequence(), BigInt(Math.floor(Date.now()/1000)), false, true,
193
+ BigInt(Math.floor(Math.random() * 0x10000)), BigInt(Math.floor(Math.random() * 0x10000))
194
+ );
195
+
196
+ try {
197
+ const result = await this.contract.getClaimFee(this.chain.randomAddress(), dummySwapData);
198
+ return result * BigInt(Math.floor(options.feeSafetyFactor*1000000)) / 1_000_000n
199
+ } catch (e) {
200
+ abortController.abort(e);
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Verifies response returned from intermediary
206
+ *
207
+ * @param resp Response as returned by the intermediary
208
+ * @param amountData
209
+ * @param lp Intermediary
210
+ * @param options Options as passed to the swap creation function
211
+ * @param decodedPr Decoded bolt11 lightning network invoice
212
+ * @param paymentHash Expected payment hash of the bolt11 lightning network invoice
213
+ * @param claimerBounty Claimer bounty as request by the user
214
+ * @private
215
+ * @throws {IntermediaryError} in case the response is invalid
216
+ */
217
+ private verifyReturnedData(
218
+ resp: FromBTCLNAutoResponseType,
219
+ amountData: AmountData,
220
+ lp: Intermediary,
221
+ options: {gasAmount: bigint, descriptionHash?: Buffer},
222
+ decodedPr: PaymentRequestObject & {tagsObject: TagsObject},
223
+ paymentHash: Buffer,
224
+ claimerBounty: bigint
225
+ ): void {
226
+ if(lp.getAddress(this.chainIdentifier)!==resp.intermediaryKey) throw new IntermediaryError("Invalid intermediary address/pubkey");
227
+
228
+ if(options.descriptionHash!=null && decodedPr.tagsObject.purpose_commit_hash!==options.descriptionHash.toString("hex"))
229
+ throw new IntermediaryError("Invalid pr returned - description hash");
230
+
231
+ if(
232
+ decodedPr.tagsObject.payment_hash==null ||
233
+ !Buffer.from(decodedPr.tagsObject.payment_hash, "hex").equals(paymentHash)
234
+ ) throw new IntermediaryError("Invalid pr returned - payment hash");
235
+
236
+ if(decodedPr.millisatoshis==null) throw new IntermediaryError("Invalid pr returned - msat field");
237
+
238
+ const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
239
+ if(resp.btcAmountGas + resp.btcAmountSwap !== amountIn) throw new IntermediaryError("Invalid total btc returned");
240
+ if(resp.gasSwapFeeBtc + resp.swapFeeBtc !== resp.totalFeeBtc) throw new IntermediaryError("Invalid total btc fee returned");
241
+ if(resp.claimerBounty !== claimerBounty) throw new IntermediaryError("Invalid claimer bounty");
242
+ if(resp.totalGas !== options.gasAmount) throw new IntermediaryError("Invalid total gas amount");
243
+ if(!amountData.exactIn) {
244
+ if(resp.total != amountData.amount) throw new IntermediaryError("Invalid amount returned");
245
+ } else {
246
+ if(amountIn !== amountData.amount) throw new IntermediaryError("Invalid payment request returned, amount mismatch");
247
+ }
248
+ }
249
+
250
+ /**
251
+ * Returns a newly created swap, receiving 'amount' on lightning network
252
+ *
253
+ * @param signer Smart chain signer's address intiating the swap
254
+ * @param amountData Amount of token & amount to swap
255
+ * @param lps LPs (liquidity providers) to get the quotes from
256
+ * @param options Quote options
257
+ * @param additionalParams Additional parameters sent to the LP when creating the swap
258
+ * @param abortSignal Abort signal for aborting the process
259
+ * @param preFetches
260
+ */
261
+ create(
262
+ signer: string,
263
+ amountData: AmountData,
264
+ lps: Intermediary[],
265
+ options?: FromBTCLNAutoOptions,
266
+ additionalParams?: Record<string, any>,
267
+ abortSignal?: AbortSignal,
268
+ preFetches?: {
269
+ pricePrefetchPromise?: Promise<bigint | undefined>,
270
+ usdPricePrefetchPromise?: Promise<number | undefined>,
271
+ gasTokenPricePrefetchPromise?: Promise<bigint | undefined>,
272
+ claimerBountyPrefetch?: Promise<bigint | undefined>,
273
+ }
274
+ ): {
275
+ quote: Promise<FromBTCLNAutoSwap<T>>,
276
+ intermediary: Intermediary
277
+ }[] {
278
+ const _options = {
279
+ unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? this.options.unsafeSkipLnNodeCheck,
280
+ gasAmount: options?.gasAmount ?? 0n,
281
+ feeSafetyFactor: options?.feeSafetyFactor ?? 1.25, //No need to add much of a margin, since the claim should happen rather soon
282
+ unsafeZeroWatchtowerFee: options?.unsafeZeroWatchtowerFee ?? false,
283
+ descriptionHash: options?.descriptionHash
284
+ };
285
+
286
+ if(preFetches==null) preFetches = {};
287
+
288
+ if(_options.descriptionHash!=null && _options.descriptionHash.length!==32)
289
+ throw new UserError("Invalid description hash length");
290
+
291
+ const {secret, paymentHash} = this.getSecretAndHash();
292
+ const claimHash = this.contract.getHashForHtlc(paymentHash);
293
+
294
+ const nativeTokenAddress = this.chain.getNativeCurrencyAddress();
295
+
296
+ const _abortController = extendAbortController(abortSignal);
297
+ const _preFetches = {
298
+ pricePrefetchPromise: preFetches?.pricePrefetchPromise ?? this.preFetchPrice(amountData, _abortController.signal),
299
+ usdPricePrefetchPromise: preFetches?.usdPricePrefetchPromise ?? this.preFetchUsdPrice(_abortController.signal),
300
+ claimerBountyPrefetch: preFetches?.claimerBountyPrefetch ?? this.preFetchClaimerBounty(signer, amountData, _options, _abortController),
301
+ gasTokenPricePrefetchPromise: _options.gasAmount!==0n || !_options.unsafeZeroWatchtowerFee ?
302
+ (preFetches.gasTokenPricePrefetchPromise ??= this.preFetchPrice({token: nativeTokenAddress}, _abortController.signal)) :
303
+ undefined
304
+ };
305
+
306
+ return lps.map(lp => {
307
+ return {
308
+ intermediary: lp,
309
+ quote: (async () => {
310
+ if(lp.services[SwapType.FROM_BTCLN_AUTO]==null) throw new Error("LP service for processing from btcln auto swaps not found!");
311
+
312
+ const abortController = extendAbortController(_abortController.signal);
313
+
314
+ const liquidityPromise: Promise<bigint | undefined> = this.preFetchIntermediaryLiquidity(amountData, lp, abortController);
315
+
316
+ const {lnCapacityPromise, resp} = await tryWithRetries(async(retryCount: number) => {
317
+ const {lnPublicKey, response} = IntermediaryAPI.initFromBTCLNAuto(
318
+ this.chainIdentifier, lp.url,
319
+ {
320
+ paymentHash,
321
+ amount: amountData.amount,
322
+ claimer: signer,
323
+ token: amountData.token.toString(),
324
+ descriptionHash: _options.descriptionHash,
325
+ exactOut: !amountData.exactIn,
326
+ additionalParams,
327
+ gasToken: this.chain.getNativeCurrencyAddress(),
328
+ gasAmount: _options.gasAmount,
329
+ claimerBounty: throwIfUndefined(_preFetches.claimerBountyPrefetch)
330
+ },
331
+ this.options.postRequestTimeout, abortController.signal, retryCount>0 ? false : undefined
332
+ );
333
+
334
+ return {
335
+ lnCapacityPromise: _options.unsafeSkipLnNodeCheck ? undefined : this.preFetchLnCapacity(lnPublicKey),
336
+ resp: await response
337
+ };
338
+ }, undefined, RequestError, abortController.signal);
339
+
340
+ const decodedPr = bolt11Decode(resp.pr);
341
+ if(decodedPr.millisatoshis==null) throw new IntermediaryError("Invalid returned swap invoice, no msat amount field");
342
+ if(decodedPr.timeExpireDate==null) throw new IntermediaryError("Invalid returned swap invoice, no expiry date field");
343
+ const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
344
+ const claimerBounty = (await _preFetches.claimerBountyPrefetch)!;
345
+
346
+ try {
347
+ this.verifyReturnedData(resp, amountData, lp, _options, decodedPr, paymentHash, claimerBounty);
348
+ const [pricingInfo, gasPricingInfo] = await Promise.all([
349
+ this.verifyReturnedPrice(
350
+ lp.services[SwapType.FROM_BTCLN_AUTO],
351
+ false, resp.btcAmountSwap,
352
+ resp.total,
353
+ amountData.token, {}, _preFetches.pricePrefetchPromise, _preFetches.usdPricePrefetchPromise, abortController.signal
354
+ ),
355
+ _options.gasAmount===0n ? Promise.resolve(undefined) : this.verifyReturnedPrice(
356
+ {...lp.services[SwapType.FROM_BTCLN_AUTO], swapBaseFee: 0}, //Base fee should be charged only on the amount, not on gas
357
+ false, resp.btcAmountGas,
358
+ resp.totalGas + resp.claimerBounty,
359
+ nativeTokenAddress, {}, _preFetches.gasTokenPricePrefetchPromise, _preFetches.usdPricePrefetchPromise, abortController.signal
360
+ ),
361
+ this.verifyIntermediaryLiquidity(resp.total, throwIfUndefined(liquidityPromise)),
362
+ _options.unsafeSkipLnNodeCheck ? Promise.resolve() : this.verifyLnNodeCapacity(lp, decodedPr, lnCapacityPromise, abortController.signal)
363
+ ]);
364
+
365
+ const swapInit: FromBTCLNAutoSwapInit<T["Data"]> = {
366
+ pricingInfo,
367
+ url: lp.url,
368
+ expiry: decodedPr.timeExpireDate*1000,
369
+
370
+ swapFee: resp.swapFee,
371
+ gasSwapFee: resp.gasSwapFee,
372
+
373
+ swapFeeBtc: resp.swapFeeBtc,
374
+ gasSwapFeeBtc: resp.gasSwapFeeBtc,
375
+
376
+ btcAmountGas: resp.btcAmountGas,
377
+ btcAmountSwap: resp.btcAmountSwap,
378
+
379
+ gasPricingInfo,
380
+
381
+ initialSwapData: await this.contract.createSwapData(
382
+ ChainSwapType.HTLC, lp.getAddress(this.chainIdentifier), signer, amountData.token,
383
+ resp.total, claimHash.toString("hex"),
384
+ this.getRandomSequence(), BigInt(Math.floor(Date.now()/1000)), false, true,
385
+ _options.gasAmount + resp.claimerBounty, resp.claimerBounty, nativeTokenAddress
386
+ ),
387
+ pr: resp.pr,
388
+ secret: secret.toString("hex"),
389
+ exactIn: amountData.exactIn ?? true
390
+ };
391
+ const quote = new FromBTCLNAutoSwap<T>(this, swapInit);
392
+ await quote._save();
393
+ this.logger.debug("create(): Created new FromBTCLNAutoSwap quote, claimHash (pseudo escrowHash): ", quote._getEscrowHash());
394
+ return quote;
395
+ } catch (e) {
396
+ abortController.abort(e);
397
+ throw e;
398
+ }
399
+ })()
400
+ }
401
+ });
402
+ }
403
+
404
+ /**
405
+ * Returns a newly created swap, receiving 'amount' from the lnurl-withdraw
406
+ *
407
+ * @param signer Smart chains signer's address intiating the swap
408
+ * @param lnurl LNURL-withdraw to withdraw funds from
409
+ * @param amountData Amount of token & amount to swap
410
+ * @param lps LPs (liquidity providers) to get the quotes from
411
+ * @param options
412
+ * @param additionalParams Additional parameters sent to the LP when creating the swap
413
+ * @param abortSignal Abort signal for aborting the process
414
+ */
415
+ async createViaLNURL(
416
+ signer: string,
417
+ lnurl: string | LNURLWithdrawParamsWithUrl,
418
+ amountData: AmountData,
419
+ lps: Intermediary[],
420
+ options?: FromBTCLNAutoOptions,
421
+ additionalParams?: Record<string, any>,
422
+ abortSignal?: AbortSignal
423
+ ): Promise<{
424
+ quote: Promise<FromBTCLNAutoSwap<T>>,
425
+ intermediary: Intermediary
426
+ }[]> {
427
+ const _options = {
428
+ unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? this.options.unsafeSkipLnNodeCheck,
429
+ gasAmount: options?.gasAmount ?? 0n,
430
+ feeSafetyFactor: options?.feeSafetyFactor ?? 1.25, //No need to add much of a margin, since the claim should happen rather soon
431
+ unsafeZeroWatchtowerFee: options?.unsafeZeroWatchtowerFee ?? false,
432
+ descriptionHash: options?.descriptionHash
433
+ };
434
+
435
+ const abortController = extendAbortController(abortSignal);
436
+ const preFetches = {
437
+ pricePrefetchPromise: this.preFetchPrice(amountData, abortController.signal),
438
+ usdPricePrefetchPromise: this.preFetchUsdPrice(abortController.signal),
439
+ gasTokenPricePrefetchPromise: _options.gasAmount!==0n || !_options.unsafeZeroWatchtowerFee ?
440
+ this.preFetchPrice({token: this.chain.getNativeCurrencyAddress()}, abortController.signal) :
441
+ undefined,
442
+ claimerBountyPrefetch: this.preFetchClaimerBounty(signer, amountData, _options, abortController)
443
+ };
444
+
445
+ try {
446
+ const exactOutAmountPromise: Promise<bigint | undefined> | undefined = !amountData.exactIn ? preFetches.pricePrefetchPromise.then(price =>
447
+ this.prices.getToBtcSwapAmount(this.chainIdentifier, amountData.amount, amountData.token, abortController.signal, price)
448
+ ).catch(e => {
449
+ abortController.abort(e);
450
+ return undefined;
451
+ }) : undefined;
452
+
453
+ const withdrawRequest = await this.getLNURLWithdraw(lnurl, abortController.signal);
454
+
455
+ const min = BigInt(withdrawRequest.minWithdrawable) / 1000n;
456
+ const max = BigInt(withdrawRequest.maxWithdrawable) / 1000n;
457
+
458
+ if(amountData.exactIn) {
459
+ if(amountData.amount < min) throw new UserError("Amount less than LNURL-withdraw minimum");
460
+ if(amountData.amount > max) throw new UserError("Amount more than LNURL-withdraw maximum");
461
+ } else {
462
+ const amount = (await exactOutAmountPromise)!;
463
+ abortController.signal.throwIfAborted();
464
+
465
+ if((amount * 95n / 100n) < min) throw new UserError("Amount less than LNURL-withdraw minimum");
466
+ if((amount * 105n / 100n) > max) throw new UserError("Amount more than LNURL-withdraw maximum");
467
+ }
468
+
469
+ return this.create(signer, amountData, lps, _options, additionalParams, abortSignal, preFetches).map(data => {
470
+ return {
471
+ quote: data.quote.then(quote => {
472
+ quote.lnurl = withdrawRequest.url;
473
+ quote.lnurlK1 = withdrawRequest.k1;
474
+ quote.lnurlCallback = withdrawRequest.callback;
475
+
476
+ const amountIn = quote.getInput().rawAmount;
477
+ if(amountIn < min) throw new UserError("Amount less than LNURL-withdraw minimum");
478
+ if(amountIn > max) throw new UserError("Amount more than LNURL-withdraw maximum");
479
+
480
+ return quote;
481
+ }),
482
+ intermediary: data.intermediary
483
+ }
484
+ });
485
+ } catch (e) {
486
+ abortController.abort(e);
487
+ throw e;
488
+ }
489
+ }
490
+
491
+ protected async _checkPastSwaps(pastSwaps: FromBTCLNAutoSwap<T>[]): Promise<{
492
+ changedSwaps: FromBTCLNAutoSwap<T>[];
493
+ removeSwaps: FromBTCLNAutoSwap<T>[]
494
+ }> {
495
+ const changedSwapSet: Set<FromBTCLNAutoSwap<T>> = new Set();
496
+
497
+ const swapExpiredStatus: {[id: string]: boolean} = {};
498
+ const checkStatusSwaps: (FromBTCLNAutoSwap<T> & {data: T["Data"]})[] = [];
499
+
500
+ await Promise.all(pastSwaps.map(async (pastSwap) => {
501
+ if(pastSwap._shouldCheckIntermediary()) {
502
+ try {
503
+ const result = await pastSwap._checkIntermediaryPaymentReceived(false);
504
+ if(result!=null) {
505
+ changedSwapSet.add(pastSwap);
506
+ }
507
+ } catch (e) {
508
+ this.logger.error(`_checkPastSwaps(): Failed to contact LP regarding swap ${pastSwap.getId()}, error: `, e);
509
+ }
510
+ }
511
+ if(pastSwap._shouldFetchExpiryStatus()) {
512
+ //Check expiry
513
+ swapExpiredStatus[pastSwap.getId()] = await pastSwap._verifyQuoteDefinitelyExpired();
514
+ }
515
+ if(pastSwap._shouldFetchCommitStatus()) {
516
+ //Add to swaps for which status should be checked
517
+ if(pastSwap.data!=null) checkStatusSwaps.push(pastSwap as FromBTCLNAutoSwap<T> & {data: T["Data"]});
518
+ }
519
+ }));
520
+
521
+ const swapStatuses = await this.contract.getCommitStatuses(checkStatusSwaps.map(val => ({signer: val._getInitiator(), swapData: val.data})));
522
+
523
+ for(let pastSwap of checkStatusSwaps) {
524
+ const shouldSave = await pastSwap._sync(
525
+ false, swapExpiredStatus[pastSwap.getId()],
526
+ swapStatuses[pastSwap.getEscrowHash()!], true
527
+ );
528
+ if(shouldSave) {
529
+ changedSwapSet.add(pastSwap);
530
+ }
531
+ }
532
+
533
+ const changedSwaps: FromBTCLNAutoSwap<T>[] = [];
534
+ const removeSwaps: FromBTCLNAutoSwap<T>[] = [];
535
+ changedSwapSet.forEach(val => {
536
+ if(val.isQuoteExpired()) {
537
+ removeSwaps.push(val);
538
+ } else {
539
+ changedSwaps.push(val);
540
+ }
541
+ });
542
+
543
+ return {
544
+ changedSwaps,
545
+ removeSwaps
546
+ };
547
+ }
548
+
549
+ }