@atomiqlabs/sdk 8.6.4 → 8.6.6
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.
- package/dist/SmartChainAssets.d.ts +181 -181
- package/dist/SmartChainAssets.js +181 -181
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -6
- package/dist/bitcoin/coinselect2/accumulative.js +51 -52
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -6
- package/dist/bitcoin/coinselect2/blackjack.js +37 -38
- package/dist/bitcoin/coinselect2/index.d.ts +17 -19
- package/dist/bitcoin/coinselect2/index.js +69 -69
- package/dist/bitcoin/coinselect2/utils.d.ts +75 -77
- package/dist/bitcoin/coinselect2/utils.js +123 -123
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +128 -130
- package/dist/bitcoin/wallet/BitcoinWallet.js +322 -322
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +78 -78
- package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -21
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +99 -101
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +176 -176
- package/dist/enums/FeeType.d.ts +15 -15
- package/dist/enums/FeeType.js +19 -19
- package/dist/enums/SwapAmountType.d.ts +15 -15
- package/dist/enums/SwapAmountType.js +19 -19
- package/dist/enums/SwapDirection.d.ts +15 -15
- package/dist/enums/SwapDirection.js +19 -19
- package/dist/enums/SwapSide.d.ts +15 -15
- package/dist/enums/SwapSide.js +19 -19
- package/dist/enums/SwapType.d.ts +75 -75
- package/dist/enums/SwapType.js +79 -79
- package/dist/errors/IntermediaryError.d.ts +13 -13
- package/dist/errors/IntermediaryError.js +27 -27
- package/dist/errors/RequestError.d.ts +32 -32
- package/dist/errors/RequestError.js +54 -54
- package/dist/errors/UserError.d.ts +8 -8
- package/dist/errors/UserError.js +16 -16
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -23
- package/dist/events/UnifiedSwapEventListener.js +130 -130
- package/dist/http/HttpUtils.d.ts +27 -27
- package/dist/http/HttpUtils.js +90 -91
- package/dist/http/paramcoders/IParamReader.d.ts +8 -8
- package/dist/http/paramcoders/IParamReader.js +2 -2
- package/dist/http/paramcoders/ParamDecoder.d.ts +42 -44
- package/dist/http/paramcoders/ParamDecoder.js +137 -137
- package/dist/http/paramcoders/ParamEncoder.d.ts +18 -20
- package/dist/http/paramcoders/ParamEncoder.js +36 -36
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -26
- package/dist/http/paramcoders/SchemaVerifier.js +145 -145
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -11
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -57
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +11 -13
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -26
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -16
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +173 -174
- package/dist/index.d.ts +85 -85
- package/dist/index.js +158 -158
- package/dist/intermediaries/Intermediary.d.ts +157 -157
- package/dist/intermediaries/Intermediary.js +142 -142
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +198 -199
- package/dist/intermediaries/IntermediaryDiscovery.js +406 -406
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +437 -438
- package/dist/intermediaries/apis/IntermediaryAPI.js +603 -602
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +155 -155
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +137 -137
- package/dist/lnurl/LNURL.d.ts +102 -102
- package/dist/lnurl/LNURL.js +321 -321
- package/dist/prices/RedundantSwapPrice.d.ts +110 -110
- package/dist/prices/RedundantSwapPrice.js +222 -222
- package/dist/prices/SingleSwapPrice.d.ts +34 -34
- package/dist/prices/SingleSwapPrice.js +44 -44
- package/dist/prices/SwapPriceWithChain.d.ts +107 -107
- package/dist/prices/SwapPriceWithChain.js +128 -128
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -28
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -62
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -81
- package/dist/prices/abstract/IPriceProvider.js +74 -74
- package/dist/prices/abstract/ISwapPrice.d.ts +168 -166
- package/dist/prices/abstract/ISwapPrice.js +279 -267
- package/dist/prices/providers/BinancePriceProvider.d.ts +23 -23
- package/dist/prices/providers/BinancePriceProvider.js +30 -30
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +23 -23
- package/dist/prices/providers/CoinGeckoPriceProvider.js +29 -29
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +25 -25
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +29 -29
- package/dist/prices/providers/CustomPriceProvider.d.ts +24 -24
- package/dist/prices/providers/CustomPriceProvider.js +35 -35
- package/dist/prices/providers/KrakenPriceProvider.d.ts +38 -38
- package/dist/prices/providers/KrakenPriceProvider.js +45 -45
- package/dist/prices/providers/OKXPriceProvider.d.ts +34 -34
- package/dist/prices/providers/OKXPriceProvider.js +29 -29
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +17 -17
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +21 -21
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -7
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -12
- package/dist/storage/IUnifiedStorage.d.ts +85 -85
- package/dist/storage/IUnifiedStorage.js +2 -2
- package/dist/storage/UnifiedSwapStorage.d.ts +114 -114
- package/dist/storage/UnifiedSwapStorage.js +116 -116
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +63 -63
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +298 -298
- package/dist/storage-browser/LocalStorageManager.d.ts +49 -49
- package/dist/storage-browser/LocalStorageManager.js +93 -93
- package/dist/swapper/Swapper.d.ts +686 -687
- package/dist/swapper/Swapper.js +1603 -1603
- package/dist/swapper/SwapperFactory.d.ts +135 -135
- package/dist/swapper/SwapperFactory.js +162 -162
- package/dist/swapper/SwapperUtils.d.ts +200 -200
- package/dist/swapper/SwapperUtils.js +467 -467
- package/dist/swapper/SwapperWithChain.d.ts +404 -404
- package/dist/swapper/SwapperWithChain.js +469 -469
- package/dist/swapper/SwapperWithSigner.d.ts +322 -322
- package/dist/swapper/SwapperWithSigner.js +318 -318
- package/dist/swaps/IAddressSwap.d.ts +22 -22
- package/dist/swaps/IAddressSwap.js +13 -14
- package/dist/swaps/IBTCWalletSwap.d.ts +73 -73
- package/dist/swaps/IBTCWalletSwap.js +17 -18
- package/dist/swaps/IClaimableSwap.d.ts +49 -49
- package/dist/swaps/IClaimableSwap.js +14 -15
- package/dist/swaps/IClaimableSwapWrapper.d.ts +15 -15
- package/dist/swaps/IClaimableSwapWrapper.js +2 -2
- package/dist/swaps/IRefundableSwap.d.ts +43 -43
- package/dist/swaps/IRefundableSwap.js +13 -14
- package/dist/swaps/ISwap.d.ts +386 -387
- package/dist/swaps/ISwap.js +346 -341
- package/dist/swaps/ISwapWithGasDrop.d.ts +21 -21
- package/dist/swaps/ISwapWithGasDrop.js +11 -12
- package/dist/swaps/ISwapWrapper.d.ts +283 -284
- package/dist/swaps/ISwapWrapper.js +353 -353
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +98 -98
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +126 -126
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +133 -135
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +169 -169
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +114 -115
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +134 -134
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +98 -101
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +130 -130
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +162 -162
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +190 -190
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +58 -58
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +78 -78
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +529 -531
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +1285 -1285
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +181 -184
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +418 -417
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +581 -583
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +1371 -1371
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +225 -228
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +506 -506
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +458 -458
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +1126 -1126
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +190 -191
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +378 -377
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +403 -403
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +924 -924
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +62 -62
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +112 -112
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +125 -127
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +256 -256
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +241 -242
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -520
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +73 -73
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +155 -155
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +127 -128
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +278 -278
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +630 -630
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1443 -1443
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +213 -207
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +756 -755
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +261 -261
- package/dist/swaps/trusted/ln/LnForGasSwap.js +511 -511
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +40 -40
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +82 -82
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +342 -342
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +715 -715
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +68 -69
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +92 -92
- package/dist/types/AmountData.d.ts +10 -10
- package/dist/types/AmountData.js +2 -2
- package/dist/types/CustomPriceFunction.d.ts +11 -11
- package/dist/types/CustomPriceFunction.js +2 -2
- package/dist/types/PriceInfoType.d.ts +28 -28
- package/dist/types/PriceInfoType.js +56 -57
- package/dist/types/SwapExecutionAction.d.ts +88 -88
- package/dist/types/SwapExecutionAction.js +2 -2
- package/dist/types/SwapStateInfo.d.ts +5 -5
- package/dist/types/SwapStateInfo.js +2 -2
- package/dist/types/SwapWithSigner.d.ts +17 -17
- package/dist/types/SwapWithSigner.js +42 -43
- package/dist/types/Token.d.ts +99 -99
- package/dist/types/Token.js +76 -76
- package/dist/types/TokenAmount.d.ts +69 -69
- package/dist/types/TokenAmount.js +59 -60
- package/dist/types/fees/Fee.d.ts +50 -50
- package/dist/types/fees/Fee.js +2 -2
- package/dist/types/fees/FeeBreakdown.d.ts +11 -11
- package/dist/types/fees/FeeBreakdown.js +2 -2
- package/dist/types/fees/PercentagePPM.d.ts +17 -17
- package/dist/types/fees/PercentagePPM.js +17 -18
- package/dist/types/lnurl/LNURLPay.d.ts +61 -61
- package/dist/types/lnurl/LNURLPay.js +30 -31
- package/dist/types/lnurl/LNURLWithdraw.d.ts +48 -48
- package/dist/types/lnurl/LNURLWithdraw.js +26 -27
- package/dist/types/wallets/LightningInvoiceCreateService.d.ts +24 -24
- package/dist/types/wallets/LightningInvoiceCreateService.js +14 -15
- package/dist/types/wallets/MinimalBitcoinWalletInterface.d.ts +23 -23
- package/dist/types/wallets/MinimalBitcoinWalletInterface.js +2 -2
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.d.ts +9 -9
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.js +2 -2
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -1
- package/dist/utils/AutomaticClockDriftCorrection.js +69 -70
- package/dist/utils/BitcoinUtils.d.ts +12 -14
- package/dist/utils/BitcoinUtils.js +101 -102
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -7
- package/dist/utils/BitcoinWalletUtils.js +13 -14
- package/dist/utils/Logger.d.ts +7 -7
- package/dist/utils/Logger.js +11 -12
- package/dist/utils/RetryUtils.d.ts +22 -22
- package/dist/utils/RetryUtils.js +66 -67
- package/dist/utils/SwapUtils.d.ts +88 -88
- package/dist/utils/SwapUtils.js +72 -72
- package/dist/utils/TimeoutUtils.d.ts +17 -17
- package/dist/utils/TimeoutUtils.js +54 -55
- package/dist/utils/TokenUtils.d.ts +19 -19
- package/dist/utils/TokenUtils.js +36 -37
- package/dist/utils/TypeUtils.d.ts +7 -7
- package/dist/utils/TypeUtils.js +2 -2
- package/dist/utils/Utils.d.ts +56 -58
- package/dist/utils/Utils.js +193 -194
- package/package.json +1 -1
- package/src/intermediaries/apis/IntermediaryAPI.ts +4 -2
- package/src/prices/abstract/ISwapPrice.ts +19 -6
- package/src/swaps/ISwap.ts +17 -6
- package/src/swaps/ISwapWrapper.ts +4 -3
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +4 -2
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +4 -1
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +2 -2
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +4 -2
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +6 -6
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +5 -5
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +4 -1
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +10 -2
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +1 -1
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +1 -1
|
@@ -1,417 +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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
this.
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
* @param
|
|
259
|
-
* @param
|
|
260
|
-
* @param
|
|
261
|
-
* @param
|
|
262
|
-
* @param
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
const
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
* @
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
const
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
const
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
* @
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
let
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
data,
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
swap
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
swap.
|
|
411
|
-
swap.
|
|
412
|
-
|
|
413
|
-
await swap.
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
}
|
|
417
|
-
|
|
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;
|