@atomiqlabs/sdk 8.6.6 → 8.6.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 (226) hide show
  1. package/dist/SmartChainAssets.d.ts +181 -181
  2. package/dist/SmartChainAssets.js +181 -181
  3. package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -6
  4. package/dist/bitcoin/coinselect2/accumulative.js +52 -51
  5. package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -6
  6. package/dist/bitcoin/coinselect2/blackjack.js +38 -37
  7. package/dist/bitcoin/coinselect2/index.d.ts +19 -17
  8. package/dist/bitcoin/coinselect2/index.js +69 -69
  9. package/dist/bitcoin/coinselect2/utils.d.ts +77 -75
  10. package/dist/bitcoin/coinselect2/utils.js +123 -123
  11. package/dist/bitcoin/wallet/BitcoinWallet.d.ts +130 -128
  12. package/dist/bitcoin/wallet/BitcoinWallet.js +322 -322
  13. package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +78 -78
  14. package/dist/bitcoin/wallet/IBitcoinWallet.js +21 -20
  15. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +101 -99
  16. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +190 -176
  17. package/dist/enums/FeeType.d.ts +15 -15
  18. package/dist/enums/FeeType.js +19 -19
  19. package/dist/enums/SwapAmountType.d.ts +15 -15
  20. package/dist/enums/SwapAmountType.js +19 -19
  21. package/dist/enums/SwapDirection.d.ts +15 -15
  22. package/dist/enums/SwapDirection.js +19 -19
  23. package/dist/enums/SwapSide.d.ts +15 -15
  24. package/dist/enums/SwapSide.js +19 -19
  25. package/dist/enums/SwapType.d.ts +75 -75
  26. package/dist/enums/SwapType.js +79 -79
  27. package/dist/errors/IntermediaryError.d.ts +13 -13
  28. package/dist/errors/IntermediaryError.js +27 -27
  29. package/dist/errors/RequestError.d.ts +32 -32
  30. package/dist/errors/RequestError.js +54 -54
  31. package/dist/errors/UserError.d.ts +8 -8
  32. package/dist/errors/UserError.js +16 -16
  33. package/dist/events/UnifiedSwapEventListener.d.ts +23 -23
  34. package/dist/events/UnifiedSwapEventListener.js +130 -130
  35. package/dist/http/HttpUtils.d.ts +27 -27
  36. package/dist/http/HttpUtils.js +91 -90
  37. package/dist/http/paramcoders/IParamReader.d.ts +8 -8
  38. package/dist/http/paramcoders/IParamReader.js +2 -2
  39. package/dist/http/paramcoders/ParamDecoder.d.ts +44 -42
  40. package/dist/http/paramcoders/ParamDecoder.js +137 -137
  41. package/dist/http/paramcoders/ParamEncoder.d.ts +20 -18
  42. package/dist/http/paramcoders/ParamEncoder.js +36 -36
  43. package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -26
  44. package/dist/http/paramcoders/SchemaVerifier.js +145 -145
  45. package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -11
  46. package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -57
  47. package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -11
  48. package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -26
  49. package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -16
  50. package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -173
  51. package/dist/index.d.ts +85 -85
  52. package/dist/index.js +158 -158
  53. package/dist/intermediaries/Intermediary.d.ts +157 -157
  54. package/dist/intermediaries/Intermediary.js +142 -142
  55. package/dist/intermediaries/IntermediaryDiscovery.d.ts +199 -198
  56. package/dist/intermediaries/IntermediaryDiscovery.js +406 -406
  57. package/dist/intermediaries/apis/IntermediaryAPI.d.ts +439 -437
  58. package/dist/intermediaries/apis/IntermediaryAPI.js +603 -603
  59. package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +155 -155
  60. package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +137 -137
  61. package/dist/lnurl/LNURL.d.ts +102 -102
  62. package/dist/lnurl/LNURL.js +321 -321
  63. package/dist/prices/RedundantSwapPrice.d.ts +110 -110
  64. package/dist/prices/RedundantSwapPrice.js +222 -222
  65. package/dist/prices/SingleSwapPrice.d.ts +34 -34
  66. package/dist/prices/SingleSwapPrice.js +44 -44
  67. package/dist/prices/SwapPriceWithChain.d.ts +107 -107
  68. package/dist/prices/SwapPriceWithChain.js +128 -128
  69. package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -28
  70. package/dist/prices/abstract/ICachedSwapPrice.js +62 -62
  71. package/dist/prices/abstract/IPriceProvider.d.ts +81 -81
  72. package/dist/prices/abstract/IPriceProvider.js +74 -74
  73. package/dist/prices/abstract/ISwapPrice.d.ts +168 -168
  74. package/dist/prices/abstract/ISwapPrice.js +279 -279
  75. package/dist/prices/providers/BinancePriceProvider.d.ts +23 -23
  76. package/dist/prices/providers/BinancePriceProvider.js +30 -30
  77. package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +23 -23
  78. package/dist/prices/providers/CoinGeckoPriceProvider.js +29 -29
  79. package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +25 -25
  80. package/dist/prices/providers/CoinPaprikaPriceProvider.js +29 -29
  81. package/dist/prices/providers/CustomPriceProvider.d.ts +24 -24
  82. package/dist/prices/providers/CustomPriceProvider.js +35 -35
  83. package/dist/prices/providers/KrakenPriceProvider.d.ts +38 -38
  84. package/dist/prices/providers/KrakenPriceProvider.js +45 -45
  85. package/dist/prices/providers/OKXPriceProvider.d.ts +34 -34
  86. package/dist/prices/providers/OKXPriceProvider.js +29 -29
  87. package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +17 -17
  88. package/dist/prices/providers/abstract/ExchangePriceProvider.js +21 -21
  89. package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -7
  90. package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -12
  91. package/dist/storage/IUnifiedStorage.d.ts +85 -85
  92. package/dist/storage/IUnifiedStorage.js +2 -2
  93. package/dist/storage/UnifiedSwapStorage.d.ts +114 -114
  94. package/dist/storage/UnifiedSwapStorage.js +116 -116
  95. package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +63 -63
  96. package/dist/storage-browser/IndexedDBUnifiedStorage.js +298 -298
  97. package/dist/storage-browser/LocalStorageManager.d.ts +49 -49
  98. package/dist/storage-browser/LocalStorageManager.js +93 -93
  99. package/dist/swapper/Swapper.d.ts +687 -686
  100. package/dist/swapper/Swapper.js +1603 -1603
  101. package/dist/swapper/SwapperFactory.d.ts +135 -135
  102. package/dist/swapper/SwapperFactory.js +162 -162
  103. package/dist/swapper/SwapperUtils.d.ts +200 -200
  104. package/dist/swapper/SwapperUtils.js +467 -467
  105. package/dist/swapper/SwapperWithChain.d.ts +404 -404
  106. package/dist/swapper/SwapperWithChain.js +469 -469
  107. package/dist/swapper/SwapperWithSigner.d.ts +322 -322
  108. package/dist/swapper/SwapperWithSigner.js +318 -318
  109. package/dist/swaps/IAddressSwap.d.ts +22 -22
  110. package/dist/swaps/IAddressSwap.js +14 -13
  111. package/dist/swaps/IBTCWalletSwap.d.ts +73 -73
  112. package/dist/swaps/IBTCWalletSwap.js +18 -17
  113. package/dist/swaps/IClaimableSwap.d.ts +49 -49
  114. package/dist/swaps/IClaimableSwap.js +15 -14
  115. package/dist/swaps/IClaimableSwapWrapper.d.ts +15 -15
  116. package/dist/swaps/IClaimableSwapWrapper.js +2 -2
  117. package/dist/swaps/IRefundableSwap.d.ts +43 -43
  118. package/dist/swaps/IRefundableSwap.js +14 -13
  119. package/dist/swaps/ISwap.d.ts +387 -386
  120. package/dist/swaps/ISwap.js +346 -346
  121. package/dist/swaps/ISwapWithGasDrop.d.ts +21 -21
  122. package/dist/swaps/ISwapWithGasDrop.js +12 -11
  123. package/dist/swaps/ISwapWrapper.d.ts +285 -283
  124. package/dist/swaps/ISwapWrapper.js +353 -353
  125. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +98 -98
  126. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +126 -126
  127. package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +135 -133
  128. package/dist/swaps/escrow_swaps/IEscrowSwap.js +169 -169
  129. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +115 -114
  130. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +134 -134
  131. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +101 -98
  132. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +130 -130
  133. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +162 -162
  134. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +190 -190
  135. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +58 -58
  136. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +78 -78
  137. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +531 -529
  138. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +1285 -1285
  139. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +184 -181
  140. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +418 -418
  141. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +583 -581
  142. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +1371 -1371
  143. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +228 -225
  144. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +506 -506
  145. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +458 -458
  146. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +1126 -1126
  147. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +191 -190
  148. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +378 -378
  149. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +403 -403
  150. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +924 -924
  151. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +62 -62
  152. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +112 -112
  153. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +127 -125
  154. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +256 -256
  155. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +242 -241
  156. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -520
  157. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +73 -73
  158. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +155 -155
  159. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +128 -127
  160. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +278 -278
  161. package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +630 -630
  162. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1443 -1443
  163. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +214 -213
  164. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +756 -756
  165. package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +261 -261
  166. package/dist/swaps/trusted/ln/LnForGasSwap.js +511 -511
  167. package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +40 -40
  168. package/dist/swaps/trusted/ln/LnForGasWrapper.js +82 -82
  169. package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +342 -342
  170. package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +715 -715
  171. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +69 -68
  172. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +92 -92
  173. package/dist/types/AmountData.d.ts +10 -10
  174. package/dist/types/AmountData.js +2 -2
  175. package/dist/types/CustomPriceFunction.d.ts +11 -11
  176. package/dist/types/CustomPriceFunction.js +2 -2
  177. package/dist/types/PriceInfoType.d.ts +28 -28
  178. package/dist/types/PriceInfoType.js +57 -56
  179. package/dist/types/SwapExecutionAction.d.ts +88 -88
  180. package/dist/types/SwapExecutionAction.js +2 -2
  181. package/dist/types/SwapStateInfo.d.ts +5 -5
  182. package/dist/types/SwapStateInfo.js +2 -2
  183. package/dist/types/SwapWithSigner.d.ts +17 -17
  184. package/dist/types/SwapWithSigner.js +43 -42
  185. package/dist/types/Token.d.ts +99 -99
  186. package/dist/types/Token.js +76 -76
  187. package/dist/types/TokenAmount.d.ts +69 -69
  188. package/dist/types/TokenAmount.js +60 -59
  189. package/dist/types/fees/Fee.d.ts +50 -50
  190. package/dist/types/fees/Fee.js +2 -2
  191. package/dist/types/fees/FeeBreakdown.d.ts +11 -11
  192. package/dist/types/fees/FeeBreakdown.js +2 -2
  193. package/dist/types/fees/PercentagePPM.d.ts +17 -17
  194. package/dist/types/fees/PercentagePPM.js +18 -17
  195. package/dist/types/lnurl/LNURLPay.d.ts +61 -61
  196. package/dist/types/lnurl/LNURLPay.js +31 -30
  197. package/dist/types/lnurl/LNURLWithdraw.d.ts +48 -48
  198. package/dist/types/lnurl/LNURLWithdraw.js +27 -26
  199. package/dist/types/wallets/LightningInvoiceCreateService.d.ts +24 -24
  200. package/dist/types/wallets/LightningInvoiceCreateService.js +15 -14
  201. package/dist/types/wallets/MinimalBitcoinWalletInterface.d.ts +23 -23
  202. package/dist/types/wallets/MinimalBitcoinWalletInterface.js +2 -2
  203. package/dist/types/wallets/MinimalLightningNetworkWalletInterface.d.ts +9 -9
  204. package/dist/types/wallets/MinimalLightningNetworkWalletInterface.js +2 -2
  205. package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -1
  206. package/dist/utils/AutomaticClockDriftCorrection.js +70 -69
  207. package/dist/utils/BitcoinUtils.d.ts +14 -12
  208. package/dist/utils/BitcoinUtils.js +102 -101
  209. package/dist/utils/BitcoinWalletUtils.d.ts +7 -7
  210. package/dist/utils/BitcoinWalletUtils.js +14 -13
  211. package/dist/utils/Logger.d.ts +7 -7
  212. package/dist/utils/Logger.js +12 -11
  213. package/dist/utils/RetryUtils.d.ts +22 -22
  214. package/dist/utils/RetryUtils.js +67 -66
  215. package/dist/utils/SwapUtils.d.ts +88 -88
  216. package/dist/utils/SwapUtils.js +72 -72
  217. package/dist/utils/TimeoutUtils.d.ts +17 -17
  218. package/dist/utils/TimeoutUtils.js +55 -54
  219. package/dist/utils/TokenUtils.d.ts +19 -19
  220. package/dist/utils/TokenUtils.js +37 -36
  221. package/dist/utils/TypeUtils.d.ts +7 -7
  222. package/dist/utils/TypeUtils.js +2 -2
  223. package/dist/utils/Utils.d.ts +58 -56
  224. package/dist/utils/Utils.js +194 -193
  225. package/package.json +1 -1
  226. package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +14 -2
@@ -1,418 +1,418 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FromBTCLNWrapper = void 0;
4
- const FromBTCLNSwap_1 = require("./FromBTCLNSwap");
5
- const bolt11_1 = require("@atomiqlabs/bolt11");
6
- const base_1 = require("@atomiqlabs/base");
7
- const buffer_1 = require("buffer");
8
- const UserError_1 = require("../../../../errors/UserError");
9
- const IntermediaryError_1 = require("../../../../errors/IntermediaryError");
10
- const SwapType_1 = require("../../../../enums/SwapType");
11
- const Utils_1 = require("../../../../utils/Utils");
12
- const IntermediaryAPI_1 = require("../../../../intermediaries/apis/IntermediaryAPI");
13
- const RequestError_1 = require("../../../../errors/RequestError");
14
- const IFromBTCLNWrapper_1 = require("../IFromBTCLNWrapper");
15
- const RetryUtils_1 = require("../../../../utils/RetryUtils");
16
- const sha2_1 = require("@noble/hashes/sha2");
17
- /**
18
- * Legacy escrow (HTLC) based swap for Bitcoin Lightning -> Smart chains, requires manual settlement
19
- * of the swap on the destination network once the lightning network payment is received by the LP.
20
- *
21
- * @category Swaps/Legacy/Lightning → Smart chain
22
- */
23
- class FromBTCLNWrapper extends IFromBTCLNWrapper_1.IFromBTCLNWrapper {
24
- /**
25
- * @param chainIdentifier
26
- * @param unifiedStorage Storage interface for the current environment
27
- * @param unifiedChainEvents On-chain event listener
28
- * @param chain
29
- * @param contract Underlying contract handling the swaps
30
- * @param prices Swap pricing handler
31
- * @param tokens
32
- * @param swapDataDeserializer Deserializer for SwapData
33
- * @param lnApi
34
- * @param options
35
- * @param events Instance to use for emitting events
36
- */
37
- constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, lnApi, options, events) {
38
- super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, lnApi, {
39
- ...options,
40
- safetyFactor: options?.safetyFactor ?? 2,
41
- bitcoinBlocktime: options?.bitcoinBlocktime ?? 10 * 60,
42
- unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? false
43
- }, events);
44
- this.TYPE = SwapType_1.SwapType.FROM_BTCLN;
45
- /**
46
- * @internal
47
- */
48
- this.tickSwapState = [
49
- FromBTCLNSwap_1.FromBTCLNSwapState.PR_CREATED,
50
- FromBTCLNSwap_1.FromBTCLNSwapState.PR_PAID,
51
- FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED
52
- ];
53
- /**
54
- * @internal
55
- */
56
- this._pendingSwapStates = [
57
- FromBTCLNSwap_1.FromBTCLNSwapState.PR_CREATED,
58
- FromBTCLNSwap_1.FromBTCLNSwapState.QUOTE_SOFT_EXPIRED,
59
- FromBTCLNSwap_1.FromBTCLNSwapState.PR_PAID,
60
- FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED,
61
- FromBTCLNSwap_1.FromBTCLNSwapState.EXPIRED
62
- ];
63
- /**
64
- * @internal
65
- */
66
- this._claimableSwapStates = [FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED];
67
- /**
68
- * @internal
69
- */
70
- this._swapDeserializer = FromBTCLNSwap_1.FromBTCLNSwap;
71
- }
72
- /**
73
- * @inheritDoc
74
- * @internal
75
- */
76
- processEventInitialize(swap, event) {
77
- if (swap._state === FromBTCLNSwap_1.FromBTCLNSwapState.PR_PAID || swap._state === FromBTCLNSwap_1.FromBTCLNSwapState.QUOTE_SOFT_EXPIRED) {
78
- swap._state = FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED;
79
- return Promise.resolve(true);
80
- }
81
- return Promise.resolve(false);
82
- }
83
- /**
84
- * @inheritDoc
85
- * @internal
86
- */
87
- processEventClaim(swap, event) {
88
- if (swap._state !== FromBTCLNSwap_1.FromBTCLNSwapState.FAILED && swap._state !== FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_CLAIMED) {
89
- swap._state = FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_CLAIMED;
90
- swap._setSwapSecret(event.result);
91
- return Promise.resolve(true);
92
- }
93
- return Promise.resolve(false);
94
- }
95
- /**
96
- * @inheritDoc
97
- * @internal
98
- */
99
- processEventRefund(swap, event) {
100
- if (swap._state !== FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_CLAIMED && swap._state !== FromBTCLNSwap_1.FromBTCLNSwapState.FAILED) {
101
- swap._state = FromBTCLNSwap_1.FromBTCLNSwapState.FAILED;
102
- return Promise.resolve(true);
103
- }
104
- return Promise.resolve(false);
105
- }
106
- /**
107
- * Verifies response returned from intermediary
108
- *
109
- * @param resp Response as returned by the intermediary
110
- * @param amountData
111
- * @param lp Intermediary
112
- * @param options Options as passed to the swap creation function
113
- * @param decodedPr Decoded bolt11 lightning network invoice
114
- * @param paymentHash Expected payment hash of the bolt11 lightning network invoice
115
- *
116
- * @throws {IntermediaryError} in case the response is invalid
117
- *
118
- * @private
119
- */
120
- verifyReturnedData(resp, amountData, lp, options, decodedPr, paymentHash) {
121
- if (lp.getAddress(this.chainIdentifier) !== resp.intermediaryKey)
122
- throw new IntermediaryError_1.IntermediaryError("Invalid intermediary address/pubkey");
123
- if (options.descriptionHash != null && decodedPr.tagsObject.purpose_commit_hash !== options.descriptionHash.toString("hex"))
124
- throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - description hash");
125
- if (options.description != null && decodedPr.tagsObject.description !== options.description)
126
- throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - description");
127
- if (decodedPr.tagsObject.payment_hash == null ||
128
- !buffer_1.Buffer.from(decodedPr.tagsObject.payment_hash, "hex").equals(paymentHash))
129
- throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - payment hash");
130
- if (decodedPr.millisatoshis == null)
131
- throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - msat field");
132
- if (!amountData.exactIn) {
133
- if (resp.total != amountData.amount)
134
- throw new IntermediaryError_1.IntermediaryError("Invalid amount returned");
135
- }
136
- else {
137
- const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
138
- if (amountIn !== amountData.amount)
139
- throw new IntermediaryError_1.IntermediaryError("Invalid payment request returned, amount mismatch");
140
- }
141
- }
142
- /**
143
- * Returns a newly created legacy Lightning -> Smart chain swap using the HTLC based escrow swap protocol,
144
- * where the user needs to manually settle swap on the destination smart chain. The user has to pay
145
- * a bolt11 invoice on the input lightning network side.
146
- *
147
- * @param recipient Smart chain signer's address on the destination chain, that will have to manually
148
- * settle the swap.
149
- * @param amountData Amount, token and exact input/output data for to swap
150
- * @param lps An array of intermediaries (LPs) to get the quotes from
151
- * @param options Optional additional quote options
152
- * @param additionalParams Optional additional parameters sent to the LP when creating the swap
153
- * @param abortSignal Abort signal
154
- * @param preFetches Optional pre-fetches for speeding up the quoting process (mainly used internally)
155
- */
156
- create(recipient, amountData, lps, options, additionalParams, abortSignal, preFetches) {
157
- if (!this.isInitialized)
158
- throw new Error("Not initialized, call init() first!");
159
- const _options = {
160
- paymentHash: (0, Utils_1.parseHashValueExact32Bytes)(options?.paymentHash, "payment hash"),
161
- description: options?.description,
162
- descriptionHash: (0, Utils_1.parseHashValueExact32Bytes)(options?.descriptionHash, "description hash"),
163
- unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? this._options.unsafeSkipLnNodeCheck
164
- };
165
- if (_options.description != null && buffer_1.Buffer.byteLength(_options.description, "utf8") > 500)
166
- throw new UserError_1.UserError("Invalid description length");
167
- let secret;
168
- let paymentHash;
169
- if (_options.paymentHash != null) {
170
- paymentHash = _options.paymentHash;
171
- }
172
- else {
173
- ({ secret, paymentHash } = this.getSecretAndHash());
174
- }
175
- const claimHash = this._contract.getHashForHtlc(paymentHash);
176
- const nativeTokenAddress = this._chain.getNativeCurrencyAddress();
177
- const _abortController = (0, Utils_1.extendAbortController)(abortSignal);
178
- const _preFetches = {
179
- pricePrefetchPromise: preFetches?.pricePrefetchPromise ?? this.preFetchPrice(amountData, _abortController.signal),
180
- feeRatePromise: preFetches?.feeRatePromise ?? this.preFetchFeeRate(recipient, amountData, claimHash.toString("hex"), _abortController),
181
- usdPricePrefetchPromise: preFetches?.usdPricePrefetchPromise ?? this.preFetchUsdPrice(_abortController.signal),
182
- };
183
- return lps.map(lp => {
184
- return {
185
- intermediary: lp,
186
- quote: (async () => {
187
- if (lp.services[SwapType_1.SwapType.FROM_BTCLN] == null)
188
- throw new Error("LP service for processing from btcln swaps not found!");
189
- const abortController = (0, Utils_1.extendAbortController)(_abortController.signal);
190
- const liquidityPromise = this.preFetchIntermediaryLiquidity(amountData, lp, abortController);
191
- const { lnCapacityPromise, resp } = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
192
- const { lnPublicKey, response } = IntermediaryAPI_1.IntermediaryAPI.initFromBTCLN(this.chainIdentifier, lp.url, nativeTokenAddress, {
193
- paymentHash,
194
- amount: amountData.amount,
195
- claimer: recipient,
196
- token: amountData.token.toString(),
197
- description: _options.description,
198
- descriptionHash: _options.descriptionHash,
199
- exactOut: !amountData.exactIn,
200
- feeRate: (0, Utils_1.throwIfUndefined)(_preFetches.feeRatePromise),
201
- additionalParams
202
- }, this._options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
203
- let lnCapacityPromise;
204
- if (!_options.unsafeSkipLnNodeCheck) {
205
- lnCapacityPromise = this.preFetchLnCapacity(lnPublicKey);
206
- }
207
- else
208
- lnPublicKey.catch(() => { });
209
- return {
210
- lnCapacityPromise,
211
- resp: await response
212
- };
213
- }, undefined, RequestError_1.RequestError, abortController.signal);
214
- const decodedPr = (0, bolt11_1.decode)(resp.pr);
215
- if (decodedPr.millisatoshis == null)
216
- throw new IntermediaryError_1.IntermediaryError("Invalid returned swap invoice, no msat amount field");
217
- if (decodedPr.timeExpireDate == null)
218
- throw new IntermediaryError_1.IntermediaryError("Invalid returned swap invoice, no expiry date field");
219
- const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
220
- const swapFeeBtc = resp.swapFee * amountIn / (resp.total - resp.swapFee);
221
- try {
222
- this.verifyReturnedData(resp, amountData, lp, _options, decodedPr, paymentHash);
223
- const [pricingInfo] = await Promise.all([
224
- this.verifyReturnedPrice(lp.services[SwapType_1.SwapType.FROM_BTCLN], false, amountIn, resp.total, amountData.token, { swapFeeBtc }, _preFetches.pricePrefetchPromise, _preFetches.usdPricePrefetchPromise, abortController.signal),
225
- this.verifyIntermediaryLiquidity(resp.total, (0, Utils_1.throwIfUndefined)(liquidityPromise)),
226
- lnCapacityPromise != null ? this.verifyLnNodeCapacity(lp, decodedPr, lnCapacityPromise, abortController.signal) : Promise.resolve()
227
- ]);
228
- const quote = new FromBTCLNSwap_1.FromBTCLNSwap(this, {
229
- pricingInfo,
230
- url: lp.url,
231
- expiry: decodedPr.timeExpireDate * 1000,
232
- swapFee: resp.swapFee,
233
- swapFeeBtc,
234
- feeRate: (await _preFetches.feeRatePromise),
235
- initialSwapData: await this._contract.createSwapData(base_1.ChainSwapType.HTLC, lp.getAddress(this.chainIdentifier), recipient, amountData.token, resp.total, claimHash.toString("hex"), this.getRandomSequence(), BigInt(Math.floor(Date.now() / 1000)), false, true, resp.securityDeposit, 0n, nativeTokenAddress),
236
- pr: resp.pr,
237
- secret: secret?.toString("hex"),
238
- exactIn: amountData.exactIn ?? true
239
- });
240
- return quote;
241
- }
242
- catch (e) {
243
- abortController.abort(e);
244
- throw e;
245
- }
246
- })()
247
- };
248
- });
249
- }
250
- /**
251
- * Returns a newly created legacy Lightning -> Smart chain swap using the HTLC based escrow swap protocol,
252
- * where the user needs to manually settle swap on the destination smart chain. The swap is created
253
- * with an LNURL-withdraw link which will be used to pay the generated bolt11 invoice automatically
254
- * when {@link FromBTCLNSwap.waitForPayment} is called on the swap.
255
- *
256
- * @param recipient Smart chain signer's address on the destination chain, that will have to manually
257
- * settle the swap.
258
- * @param lnurl LNURL-withdraw link to pull the funds from
259
- * @param amountData Amount, token and exact input/output data for to swap
260
- * @param lps An array of intermediaries (LPs) to get the quotes from
261
- * @param options Optional additional quote options
262
- * @param additionalParams Optional additional parameters sent to the LP when creating the swap
263
- * @param abortSignal Abort signal
264
- */
265
- async createViaLNURL(recipient, lnurl, amountData, lps, options, additionalParams, abortSignal) {
266
- if (!this.isInitialized)
267
- throw new Error("Not initialized, call init() first!");
268
- const _options = {
269
- paymentHash: (0, Utils_1.parseHashValueExact32Bytes)(options?.paymentHash, "payment hash"),
270
- description: options?.description,
271
- descriptionHash: (0, Utils_1.parseHashValueExact32Bytes)(options?.descriptionHash, "description hash"),
272
- unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? this._options.unsafeSkipLnNodeCheck
273
- };
274
- const abortController = (0, Utils_1.extendAbortController)(abortSignal);
275
- const preFetches = {
276
- pricePrefetchPromise: this.preFetchPrice(amountData, abortController.signal),
277
- usdPricePrefetchPromise: this.preFetchUsdPrice(abortController.signal),
278
- feeRatePromise: this.preFetchFeeRate(recipient, amountData, undefined, abortController)
279
- };
280
- try {
281
- const exactOutAmountPromise = !amountData.exactIn ? preFetches.pricePrefetchPromise.then(price => this._prices.getToBtcSwapAmount(this.chainIdentifier, amountData.amount, amountData.token, abortController.signal, price)).catch(e => {
282
- abortController.abort(e);
283
- return undefined;
284
- }) : undefined;
285
- const withdrawRequest = await this.getLNURLWithdraw(lnurl, abortController.signal);
286
- const min = BigInt(withdrawRequest.minWithdrawable) / 1000n;
287
- const max = BigInt(withdrawRequest.maxWithdrawable) / 1000n;
288
- if (amountData.exactIn) {
289
- if (amountData.amount < min)
290
- throw new UserError_1.UserError("Amount less than LNURL-withdraw minimum");
291
- if (amountData.amount > max)
292
- throw new UserError_1.UserError("Amount more than LNURL-withdraw maximum");
293
- }
294
- else {
295
- const amount = (await exactOutAmountPromise);
296
- abortController.signal.throwIfAborted();
297
- if ((amount * 95n / 100n) < min)
298
- throw new UserError_1.UserError("Amount less than LNURL-withdraw minimum");
299
- if ((amount * 105n / 100n) > max)
300
- throw new UserError_1.UserError("Amount more than LNURL-withdraw maximum");
301
- }
302
- return this.create(recipient, amountData, lps, _options, additionalParams, abortSignal, preFetches).map(data => {
303
- return {
304
- quote: data.quote.then(quote => {
305
- quote._setLNURLData(withdrawRequest.url, withdrawRequest.k1, withdrawRequest.callback);
306
- const amountIn = quote.getInput().rawAmount;
307
- if (amountIn < min)
308
- throw new UserError_1.UserError("Amount less than LNURL-withdraw minimum");
309
- if (amountIn > max)
310
- throw new UserError_1.UserError("Amount more than LNURL-withdraw maximum");
311
- return quote;
312
- }),
313
- intermediary: data.intermediary
314
- };
315
- });
316
- }
317
- catch (e) {
318
- abortController.abort(e);
319
- throw e;
320
- }
321
- }
322
- /**
323
- * @inheritDoc
324
- * @internal
325
- */
326
- async _checkPastSwaps(pastSwaps) {
327
- const changedSwapSet = new Set();
328
- const swapExpiredStatus = {};
329
- const checkStatusSwaps = [];
330
- await Promise.all(pastSwaps.map(async (pastSwap) => {
331
- if (pastSwap._shouldCheckIntermediary()) {
332
- try {
333
- const result = await pastSwap._checkIntermediaryPaymentReceived(false);
334
- if (result != null) {
335
- changedSwapSet.add(pastSwap);
336
- }
337
- }
338
- catch (e) {
339
- this.logger.error(`_checkPastSwaps(): Failed to contact LP regarding swap ${pastSwap.getId()}, error: `, e);
340
- }
341
- }
342
- if (pastSwap._shouldFetchExpiryStatus()) {
343
- //Check expiry
344
- swapExpiredStatus[pastSwap.getId()] = await pastSwap._verifyQuoteDefinitelyExpired();
345
- }
346
- if (pastSwap._shouldFetchOnchainState()) {
347
- //Add to swaps for which status should be checked
348
- if (pastSwap._data != null)
349
- checkStatusSwaps.push(pastSwap);
350
- }
351
- }));
352
- const swapStatuses = await this._contract.getCommitStatuses(checkStatusSwaps.map(val => ({ signer: val._getInitiator(), swapData: val._data })));
353
- for (let pastSwap of checkStatusSwaps) {
354
- const shouldSave = await pastSwap._sync(false, swapExpiredStatus[pastSwap.getId()], swapStatuses[pastSwap.getEscrowHash()], true);
355
- if (shouldSave) {
356
- changedSwapSet.add(pastSwap);
357
- }
358
- }
359
- const changedSwaps = [];
360
- const removeSwaps = [];
361
- changedSwapSet.forEach(val => {
362
- if (val.isQuoteExpired()) {
363
- removeSwaps.push(val);
364
- }
365
- else {
366
- changedSwaps.push(val);
367
- }
368
- });
369
- return {
370
- changedSwaps,
371
- removeSwaps
372
- };
373
- }
374
- /**
375
- * @inheritDoc
376
- * @internal
377
- */
378
- async recoverFromSwapDataAndState(init, state, lp) {
379
- const data = init.data;
380
- let paymentHash = data.getHTLCHashHint();
381
- let secret;
382
- if (state.type === base_1.SwapCommitStateType.PAID) {
383
- secret = await state.getClaimResult();
384
- paymentHash = buffer_1.Buffer.from((0, sha2_1.sha256)(buffer_1.Buffer.from(secret, "hex"))).toString("hex");
385
- }
386
- const swapInit = {
387
- pricingInfo: {
388
- isValid: true,
389
- satsBaseFee: 0n,
390
- swapPriceUSatPerToken: 100000000000000n,
391
- realPriceUSatPerToken: 100000000000000n,
392
- differencePPM: 0n,
393
- feePPM: 0n,
394
- },
395
- url: lp?.url,
396
- expiry: 0,
397
- swapFee: 0n,
398
- swapFeeBtc: 0n,
399
- feeRate: "",
400
- signatureData: undefined,
401
- initialSwapData: data,
402
- data,
403
- pr: paymentHash ?? undefined,
404
- secret,
405
- exactIn: false
406
- };
407
- const swap = new FromBTCLNSwap_1.FromBTCLNSwap(this, swapInit);
408
- swap._commitTxId = await init.getInitTxId();
409
- const blockData = await init.getTxBlock();
410
- swap.createdAt = blockData.blockTime * 1000;
411
- swap._setInitiated();
412
- swap._state = FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED;
413
- await swap._sync(false, false, state);
414
- await swap._save();
415
- return swap;
416
- }
417
- }
418
- exports.FromBTCLNWrapper = FromBTCLNWrapper;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FromBTCLNWrapper = void 0;
4
+ const FromBTCLNSwap_1 = require("./FromBTCLNSwap");
5
+ const bolt11_1 = require("@atomiqlabs/bolt11");
6
+ const base_1 = require("@atomiqlabs/base");
7
+ const buffer_1 = require("buffer");
8
+ const UserError_1 = require("../../../../errors/UserError");
9
+ const IntermediaryError_1 = require("../../../../errors/IntermediaryError");
10
+ const SwapType_1 = require("../../../../enums/SwapType");
11
+ const Utils_1 = require("../../../../utils/Utils");
12
+ const IntermediaryAPI_1 = require("../../../../intermediaries/apis/IntermediaryAPI");
13
+ const RequestError_1 = require("../../../../errors/RequestError");
14
+ const IFromBTCLNWrapper_1 = require("../IFromBTCLNWrapper");
15
+ const RetryUtils_1 = require("../../../../utils/RetryUtils");
16
+ const sha2_1 = require("@noble/hashes/sha2");
17
+ /**
18
+ * Legacy escrow (HTLC) based swap for Bitcoin Lightning -> Smart chains, requires manual settlement
19
+ * of the swap on the destination network once the lightning network payment is received by the LP.
20
+ *
21
+ * @category Swaps/Legacy/Lightning → Smart chain
22
+ */
23
+ class FromBTCLNWrapper extends IFromBTCLNWrapper_1.IFromBTCLNWrapper {
24
+ /**
25
+ * @param chainIdentifier
26
+ * @param unifiedStorage Storage interface for the current environment
27
+ * @param unifiedChainEvents On-chain event listener
28
+ * @param chain
29
+ * @param contract Underlying contract handling the swaps
30
+ * @param prices Swap pricing handler
31
+ * @param tokens
32
+ * @param swapDataDeserializer Deserializer for SwapData
33
+ * @param lnApi
34
+ * @param options
35
+ * @param events Instance to use for emitting events
36
+ */
37
+ constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, lnApi, options, events) {
38
+ super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, lnApi, {
39
+ ...options,
40
+ safetyFactor: options?.safetyFactor ?? 2,
41
+ bitcoinBlocktime: options?.bitcoinBlocktime ?? 10 * 60,
42
+ unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? false
43
+ }, events);
44
+ this.TYPE = SwapType_1.SwapType.FROM_BTCLN;
45
+ /**
46
+ * @internal
47
+ */
48
+ this.tickSwapState = [
49
+ FromBTCLNSwap_1.FromBTCLNSwapState.PR_CREATED,
50
+ FromBTCLNSwap_1.FromBTCLNSwapState.PR_PAID,
51
+ FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED
52
+ ];
53
+ /**
54
+ * @internal
55
+ */
56
+ this._pendingSwapStates = [
57
+ FromBTCLNSwap_1.FromBTCLNSwapState.PR_CREATED,
58
+ FromBTCLNSwap_1.FromBTCLNSwapState.QUOTE_SOFT_EXPIRED,
59
+ FromBTCLNSwap_1.FromBTCLNSwapState.PR_PAID,
60
+ FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED,
61
+ FromBTCLNSwap_1.FromBTCLNSwapState.EXPIRED
62
+ ];
63
+ /**
64
+ * @internal
65
+ */
66
+ this._claimableSwapStates = [FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED];
67
+ /**
68
+ * @internal
69
+ */
70
+ this._swapDeserializer = FromBTCLNSwap_1.FromBTCLNSwap;
71
+ }
72
+ /**
73
+ * @inheritDoc
74
+ * @internal
75
+ */
76
+ processEventInitialize(swap, event) {
77
+ if (swap._state === FromBTCLNSwap_1.FromBTCLNSwapState.PR_PAID || swap._state === FromBTCLNSwap_1.FromBTCLNSwapState.QUOTE_SOFT_EXPIRED) {
78
+ swap._state = FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED;
79
+ return Promise.resolve(true);
80
+ }
81
+ return Promise.resolve(false);
82
+ }
83
+ /**
84
+ * @inheritDoc
85
+ * @internal
86
+ */
87
+ processEventClaim(swap, event) {
88
+ if (swap._state !== FromBTCLNSwap_1.FromBTCLNSwapState.FAILED && swap._state !== FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_CLAIMED) {
89
+ swap._state = FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_CLAIMED;
90
+ swap._setSwapSecret(event.result);
91
+ return Promise.resolve(true);
92
+ }
93
+ return Promise.resolve(false);
94
+ }
95
+ /**
96
+ * @inheritDoc
97
+ * @internal
98
+ */
99
+ processEventRefund(swap, event) {
100
+ if (swap._state !== FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_CLAIMED && swap._state !== FromBTCLNSwap_1.FromBTCLNSwapState.FAILED) {
101
+ swap._state = FromBTCLNSwap_1.FromBTCLNSwapState.FAILED;
102
+ return Promise.resolve(true);
103
+ }
104
+ return Promise.resolve(false);
105
+ }
106
+ /**
107
+ * Verifies response returned from intermediary
108
+ *
109
+ * @param resp Response as returned by the intermediary
110
+ * @param amountData
111
+ * @param lp Intermediary
112
+ * @param options Options as passed to the swap creation function
113
+ * @param decodedPr Decoded bolt11 lightning network invoice
114
+ * @param paymentHash Expected payment hash of the bolt11 lightning network invoice
115
+ *
116
+ * @throws {IntermediaryError} in case the response is invalid
117
+ *
118
+ * @private
119
+ */
120
+ verifyReturnedData(resp, amountData, lp, options, decodedPr, paymentHash) {
121
+ if (lp.getAddress(this.chainIdentifier) !== resp.intermediaryKey)
122
+ throw new IntermediaryError_1.IntermediaryError("Invalid intermediary address/pubkey");
123
+ if (options.descriptionHash != null && decodedPr.tagsObject.purpose_commit_hash !== options.descriptionHash.toString("hex"))
124
+ throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - description hash");
125
+ if (options.description != null && decodedPr.tagsObject.description !== options.description)
126
+ throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - description");
127
+ if (decodedPr.tagsObject.payment_hash == null ||
128
+ !buffer_1.Buffer.from(decodedPr.tagsObject.payment_hash, "hex").equals(paymentHash))
129
+ throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - payment hash");
130
+ if (decodedPr.millisatoshis == null)
131
+ throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - msat field");
132
+ if (!amountData.exactIn) {
133
+ if (resp.total != amountData.amount)
134
+ throw new IntermediaryError_1.IntermediaryError("Invalid amount returned");
135
+ }
136
+ else {
137
+ const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
138
+ if (amountIn !== amountData.amount)
139
+ throw new IntermediaryError_1.IntermediaryError("Invalid payment request returned, amount mismatch");
140
+ }
141
+ }
142
+ /**
143
+ * Returns a newly created legacy Lightning -> Smart chain swap using the HTLC based escrow swap protocol,
144
+ * where the user needs to manually settle swap on the destination smart chain. The user has to pay
145
+ * a bolt11 invoice on the input lightning network side.
146
+ *
147
+ * @param recipient Smart chain signer's address on the destination chain, that will have to manually
148
+ * settle the swap.
149
+ * @param amountData Amount, token and exact input/output data for to swap
150
+ * @param lps An array of intermediaries (LPs) to get the quotes from
151
+ * @param options Optional additional quote options
152
+ * @param additionalParams Optional additional parameters sent to the LP when creating the swap
153
+ * @param abortSignal Abort signal
154
+ * @param preFetches Optional pre-fetches for speeding up the quoting process (mainly used internally)
155
+ */
156
+ create(recipient, amountData, lps, options, additionalParams, abortSignal, preFetches) {
157
+ if (!this.isInitialized)
158
+ throw new Error("Not initialized, call init() first!");
159
+ const _options = {
160
+ paymentHash: (0, Utils_1.parseHashValueExact32Bytes)(options?.paymentHash, "payment hash"),
161
+ description: options?.description,
162
+ descriptionHash: (0, Utils_1.parseHashValueExact32Bytes)(options?.descriptionHash, "description hash"),
163
+ unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? this._options.unsafeSkipLnNodeCheck
164
+ };
165
+ if (_options.description != null && buffer_1.Buffer.byteLength(_options.description, "utf8") > 500)
166
+ throw new UserError_1.UserError("Invalid description length");
167
+ let secret;
168
+ let paymentHash;
169
+ if (_options.paymentHash != null) {
170
+ paymentHash = _options.paymentHash;
171
+ }
172
+ else {
173
+ ({ secret, paymentHash } = this.getSecretAndHash());
174
+ }
175
+ const claimHash = this._contract.getHashForHtlc(paymentHash);
176
+ const nativeTokenAddress = this._chain.getNativeCurrencyAddress();
177
+ const _abortController = (0, Utils_1.extendAbortController)(abortSignal);
178
+ const _preFetches = {
179
+ pricePrefetchPromise: preFetches?.pricePrefetchPromise ?? this.preFetchPrice(amountData, _abortController.signal),
180
+ feeRatePromise: preFetches?.feeRatePromise ?? this.preFetchFeeRate(recipient, amountData, claimHash.toString("hex"), _abortController),
181
+ usdPricePrefetchPromise: preFetches?.usdPricePrefetchPromise ?? this.preFetchUsdPrice(_abortController.signal),
182
+ };
183
+ return lps.map(lp => {
184
+ return {
185
+ intermediary: lp,
186
+ quote: (async () => {
187
+ if (lp.services[SwapType_1.SwapType.FROM_BTCLN] == null)
188
+ throw new Error("LP service for processing from btcln swaps not found!");
189
+ const abortController = (0, Utils_1.extendAbortController)(_abortController.signal);
190
+ const liquidityPromise = this.preFetchIntermediaryLiquidity(amountData, lp, abortController);
191
+ const { lnCapacityPromise, resp } = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
192
+ const { lnPublicKey, response } = IntermediaryAPI_1.IntermediaryAPI.initFromBTCLN(this.chainIdentifier, lp.url, nativeTokenAddress, {
193
+ paymentHash,
194
+ amount: amountData.amount,
195
+ claimer: recipient,
196
+ token: amountData.token.toString(),
197
+ description: _options.description,
198
+ descriptionHash: _options.descriptionHash,
199
+ exactOut: !amountData.exactIn,
200
+ feeRate: (0, Utils_1.throwIfUndefined)(_preFetches.feeRatePromise),
201
+ additionalParams
202
+ }, this._options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
203
+ let lnCapacityPromise;
204
+ if (!_options.unsafeSkipLnNodeCheck) {
205
+ lnCapacityPromise = this.preFetchLnCapacity(lnPublicKey);
206
+ }
207
+ else
208
+ lnPublicKey.catch(() => { });
209
+ return {
210
+ lnCapacityPromise,
211
+ resp: await response
212
+ };
213
+ }, undefined, RequestError_1.RequestError, abortController.signal);
214
+ const decodedPr = (0, bolt11_1.decode)(resp.pr);
215
+ if (decodedPr.millisatoshis == null)
216
+ throw new IntermediaryError_1.IntermediaryError("Invalid returned swap invoice, no msat amount field");
217
+ if (decodedPr.timeExpireDate == null)
218
+ throw new IntermediaryError_1.IntermediaryError("Invalid returned swap invoice, no expiry date field");
219
+ const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
220
+ const swapFeeBtc = resp.swapFee * amountIn / (resp.total - resp.swapFee);
221
+ try {
222
+ this.verifyReturnedData(resp, amountData, lp, _options, decodedPr, paymentHash);
223
+ const [pricingInfo] = await Promise.all([
224
+ this.verifyReturnedPrice(lp.services[SwapType_1.SwapType.FROM_BTCLN], false, amountIn, resp.total, amountData.token, { swapFeeBtc }, _preFetches.pricePrefetchPromise, _preFetches.usdPricePrefetchPromise, abortController.signal),
225
+ this.verifyIntermediaryLiquidity(resp.total, (0, Utils_1.throwIfUndefined)(liquidityPromise)),
226
+ lnCapacityPromise != null ? this.verifyLnNodeCapacity(lp, decodedPr, lnCapacityPromise, abortController.signal) : Promise.resolve()
227
+ ]);
228
+ const quote = new FromBTCLNSwap_1.FromBTCLNSwap(this, {
229
+ pricingInfo,
230
+ url: lp.url,
231
+ expiry: decodedPr.timeExpireDate * 1000,
232
+ swapFee: resp.swapFee,
233
+ swapFeeBtc,
234
+ feeRate: (await _preFetches.feeRatePromise),
235
+ initialSwapData: await this._contract.createSwapData(base_1.ChainSwapType.HTLC, lp.getAddress(this.chainIdentifier), recipient, amountData.token, resp.total, claimHash.toString("hex"), this.getRandomSequence(), BigInt(Math.floor(Date.now() / 1000)), false, true, resp.securityDeposit, 0n, nativeTokenAddress),
236
+ pr: resp.pr,
237
+ secret: secret?.toString("hex"),
238
+ exactIn: amountData.exactIn ?? true
239
+ });
240
+ return quote;
241
+ }
242
+ catch (e) {
243
+ abortController.abort(e);
244
+ throw e;
245
+ }
246
+ })()
247
+ };
248
+ });
249
+ }
250
+ /**
251
+ * Returns a newly created legacy Lightning -> Smart chain swap using the HTLC based escrow swap protocol,
252
+ * where the user needs to manually settle swap on the destination smart chain. The swap is created
253
+ * with an LNURL-withdraw link which will be used to pay the generated bolt11 invoice automatically
254
+ * when {@link FromBTCLNSwap.waitForPayment} is called on the swap.
255
+ *
256
+ * @param recipient Smart chain signer's address on the destination chain, that will have to manually
257
+ * settle the swap.
258
+ * @param lnurl LNURL-withdraw link to pull the funds from
259
+ * @param amountData Amount, token and exact input/output data for to swap
260
+ * @param lps An array of intermediaries (LPs) to get the quotes from
261
+ * @param options Optional additional quote options
262
+ * @param additionalParams Optional additional parameters sent to the LP when creating the swap
263
+ * @param abortSignal Abort signal
264
+ */
265
+ async createViaLNURL(recipient, lnurl, amountData, lps, options, additionalParams, abortSignal) {
266
+ if (!this.isInitialized)
267
+ throw new Error("Not initialized, call init() first!");
268
+ const _options = {
269
+ paymentHash: (0, Utils_1.parseHashValueExact32Bytes)(options?.paymentHash, "payment hash"),
270
+ description: options?.description,
271
+ descriptionHash: (0, Utils_1.parseHashValueExact32Bytes)(options?.descriptionHash, "description hash"),
272
+ unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? this._options.unsafeSkipLnNodeCheck
273
+ };
274
+ const abortController = (0, Utils_1.extendAbortController)(abortSignal);
275
+ const preFetches = {
276
+ pricePrefetchPromise: this.preFetchPrice(amountData, abortController.signal),
277
+ usdPricePrefetchPromise: this.preFetchUsdPrice(abortController.signal),
278
+ feeRatePromise: this.preFetchFeeRate(recipient, amountData, undefined, abortController)
279
+ };
280
+ try {
281
+ const exactOutAmountPromise = !amountData.exactIn ? preFetches.pricePrefetchPromise.then(price => this._prices.getToBtcSwapAmount(this.chainIdentifier, amountData.amount, amountData.token, abortController.signal, price)).catch(e => {
282
+ abortController.abort(e);
283
+ return undefined;
284
+ }) : undefined;
285
+ const withdrawRequest = await this.getLNURLWithdraw(lnurl, abortController.signal);
286
+ const min = BigInt(withdrawRequest.minWithdrawable) / 1000n;
287
+ const max = BigInt(withdrawRequest.maxWithdrawable) / 1000n;
288
+ if (amountData.exactIn) {
289
+ if (amountData.amount < min)
290
+ throw new UserError_1.UserError("Amount less than LNURL-withdraw minimum");
291
+ if (amountData.amount > max)
292
+ throw new UserError_1.UserError("Amount more than LNURL-withdraw maximum");
293
+ }
294
+ else {
295
+ const amount = (await exactOutAmountPromise);
296
+ abortController.signal.throwIfAborted();
297
+ if ((amount * 95n / 100n) < min)
298
+ throw new UserError_1.UserError("Amount less than LNURL-withdraw minimum");
299
+ if ((amount * 105n / 100n) > max)
300
+ throw new UserError_1.UserError("Amount more than LNURL-withdraw maximum");
301
+ }
302
+ return this.create(recipient, amountData, lps, _options, additionalParams, abortSignal, preFetches).map(data => {
303
+ return {
304
+ quote: data.quote.then(quote => {
305
+ quote._setLNURLData(withdrawRequest.url, withdrawRequest.k1, withdrawRequest.callback);
306
+ const amountIn = quote.getInput().rawAmount;
307
+ if (amountIn < min)
308
+ throw new UserError_1.UserError("Amount less than LNURL-withdraw minimum");
309
+ if (amountIn > max)
310
+ throw new UserError_1.UserError("Amount more than LNURL-withdraw maximum");
311
+ return quote;
312
+ }),
313
+ intermediary: data.intermediary
314
+ };
315
+ });
316
+ }
317
+ catch (e) {
318
+ abortController.abort(e);
319
+ throw e;
320
+ }
321
+ }
322
+ /**
323
+ * @inheritDoc
324
+ * @internal
325
+ */
326
+ async _checkPastSwaps(pastSwaps) {
327
+ const changedSwapSet = new Set();
328
+ const swapExpiredStatus = {};
329
+ const checkStatusSwaps = [];
330
+ await Promise.all(pastSwaps.map(async (pastSwap) => {
331
+ if (pastSwap._shouldCheckIntermediary()) {
332
+ try {
333
+ const result = await pastSwap._checkIntermediaryPaymentReceived(false);
334
+ if (result != null) {
335
+ changedSwapSet.add(pastSwap);
336
+ }
337
+ }
338
+ catch (e) {
339
+ this.logger.error(`_checkPastSwaps(): Failed to contact LP regarding swap ${pastSwap.getId()}, error: `, e);
340
+ }
341
+ }
342
+ if (pastSwap._shouldFetchExpiryStatus()) {
343
+ //Check expiry
344
+ swapExpiredStatus[pastSwap.getId()] = await pastSwap._verifyQuoteDefinitelyExpired();
345
+ }
346
+ if (pastSwap._shouldFetchOnchainState()) {
347
+ //Add to swaps for which status should be checked
348
+ if (pastSwap._data != null)
349
+ checkStatusSwaps.push(pastSwap);
350
+ }
351
+ }));
352
+ const swapStatuses = await this._contract.getCommitStatuses(checkStatusSwaps.map(val => ({ signer: val._getInitiator(), swapData: val._data })));
353
+ for (let pastSwap of checkStatusSwaps) {
354
+ const shouldSave = await pastSwap._sync(false, swapExpiredStatus[pastSwap.getId()], swapStatuses[pastSwap.getEscrowHash()], true);
355
+ if (shouldSave) {
356
+ changedSwapSet.add(pastSwap);
357
+ }
358
+ }
359
+ const changedSwaps = [];
360
+ const removeSwaps = [];
361
+ changedSwapSet.forEach(val => {
362
+ if (val.isQuoteExpired()) {
363
+ removeSwaps.push(val);
364
+ }
365
+ else {
366
+ changedSwaps.push(val);
367
+ }
368
+ });
369
+ return {
370
+ changedSwaps,
371
+ removeSwaps
372
+ };
373
+ }
374
+ /**
375
+ * @inheritDoc
376
+ * @internal
377
+ */
378
+ async recoverFromSwapDataAndState(init, state, lp) {
379
+ const data = init.data;
380
+ let paymentHash = data.getHTLCHashHint();
381
+ let secret;
382
+ if (state.type === base_1.SwapCommitStateType.PAID) {
383
+ secret = await state.getClaimResult();
384
+ paymentHash = buffer_1.Buffer.from((0, sha2_1.sha256)(buffer_1.Buffer.from(secret, "hex"))).toString("hex");
385
+ }
386
+ const swapInit = {
387
+ pricingInfo: {
388
+ isValid: true,
389
+ satsBaseFee: 0n,
390
+ swapPriceUSatPerToken: 100000000000000n,
391
+ realPriceUSatPerToken: 100000000000000n,
392
+ differencePPM: 0n,
393
+ feePPM: 0n,
394
+ },
395
+ url: lp?.url,
396
+ expiry: 0,
397
+ swapFee: 0n,
398
+ swapFeeBtc: 0n,
399
+ feeRate: "",
400
+ signatureData: undefined,
401
+ initialSwapData: data,
402
+ data,
403
+ pr: paymentHash ?? undefined,
404
+ secret,
405
+ exactIn: false
406
+ };
407
+ const swap = new FromBTCLNSwap_1.FromBTCLNSwap(this, swapInit);
408
+ swap._commitTxId = await init.getInitTxId();
409
+ const blockData = await init.getTxBlock();
410
+ swap.createdAt = blockData.blockTime * 1000;
411
+ swap._setInitiated();
412
+ swap._state = FromBTCLNSwap_1.FromBTCLNSwapState.CLAIM_COMMITED;
413
+ await swap._sync(false, false, state);
414
+ await swap._save();
415
+ return swap;
416
+ }
417
+ }
418
+ exports.FromBTCLNWrapper = FromBTCLNWrapper;