@atomiqlabs/sdk 8.9.1 → 8.9.2
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/LICENSE +201 -201
- package/README.md +1760 -1760
- package/api/index.d.ts +1 -1
- package/api/index.js +3 -3
- package/dist/ApiList.d.ts +37 -37
- package/dist/ApiList.js +30 -30
- package/dist/SmartChainAssets.d.ts +181 -181
- package/dist/SmartChainAssets.js +181 -181
- package/dist/api/ApiEndpoints.d.ts +393 -393
- package/dist/api/ApiEndpoints.js +2 -2
- package/dist/api/ApiParser.d.ts +10 -10
- package/dist/api/ApiParser.js +134 -134
- package/dist/api/ApiTypes.d.ts +157 -157
- package/dist/api/ApiTypes.js +75 -75
- package/dist/api/SerializedAction.d.ts +40 -40
- package/dist/api/SerializedAction.js +59 -59
- package/dist/api/SwapperApi.d.ts +50 -50
- package/dist/api/SwapperApi.js +431 -431
- package/dist/api/index.d.ts +5 -5
- package/dist/api/index.js +24 -24
- package/dist/bitcoin/coinselect2/accumulative.d.ts +7 -7
- package/dist/bitcoin/coinselect2/accumulative.js +52 -52
- package/dist/bitcoin/coinselect2/blackjack.d.ts +7 -7
- package/dist/bitcoin/coinselect2/blackjack.js +38 -38
- package/dist/bitcoin/coinselect2/index.d.ts +20 -20
- package/dist/bitcoin/coinselect2/index.js +69 -69
- package/dist/bitcoin/coinselect2/utils.d.ts +82 -82
- package/dist/bitcoin/coinselect2/utils.js +158 -158
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +113 -113
- package/dist/bitcoin/wallet/BitcoinWallet.js +335 -335
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +116 -116
- package/dist/bitcoin/wallet/IBitcoinWallet.js +21 -21
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +106 -106
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +196 -196
- 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 +24 -24
- package/dist/events/UnifiedSwapEventListener.js +138 -138
- package/dist/http/HttpUtils.d.ts +29 -29
- package/dist/http/HttpUtils.js +97 -97
- package/dist/http/paramcoders/IParamReader.d.ts +8 -8
- package/dist/http/paramcoders/IParamReader.js +2 -2
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -44
- package/dist/http/paramcoders/ParamDecoder.js +137 -137
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -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 +13 -13
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -26
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +17 -17
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +175 -175
- package/dist/index.d.ts +86 -86
- package/dist/index.js +159 -159
- package/dist/intermediaries/Intermediary.d.ts +178 -178
- package/dist/intermediaries/Intermediary.js +166 -166
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +216 -216
- package/dist/intermediaries/IntermediaryDiscovery.js +424 -424
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +607 -607
- package/dist/intermediaries/apis/IntermediaryAPI.js +764 -764
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +155 -155
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +137 -137
- package/dist/intermediaries/auth/SignedKeyBasedAuth.d.ts +14 -14
- package/dist/intermediaries/auth/SignedKeyBasedAuth.js +68 -68
- 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 -168
- package/dist/prices/abstract/ISwapPrice.js +279 -279
- 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 +127 -127
- package/dist/storage/IUnifiedStorage.js +2 -2
- package/dist/storage/UnifiedSwapStorage.d.ts +120 -120
- package/dist/storage/UnifiedSwapStorage.js +154 -154
- 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 +765 -770
- package/dist/swapper/Swapper.js +1749 -1758
- package/dist/swapper/SwapperFactory.d.ts +135 -135
- package/dist/swapper/SwapperFactory.js +162 -162
- package/dist/swapper/SwapperUtils.d.ts +222 -222
- package/dist/swapper/SwapperUtils.js +519 -519
- 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 +14 -14
- package/dist/swaps/IBTCWalletSwap.d.ts +73 -73
- package/dist/swaps/IBTCWalletSwap.js +18 -18
- package/dist/swaps/IClaimableSwap.d.ts +49 -49
- package/dist/swaps/IClaimableSwap.js +15 -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 +14 -14
- package/dist/swaps/ISwap.d.ts +453 -453
- package/dist/swaps/ISwap.js +371 -371
- package/dist/swaps/ISwapWithGasDrop.d.ts +21 -21
- package/dist/swaps/ISwapWithGasDrop.js +12 -12
- package/dist/swaps/ISwapWrapper.d.ts +295 -295
- package/dist/swaps/ISwapWrapper.js +373 -373
- 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 +139 -139
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +172 -172
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +129 -129
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +167 -167
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +107 -107
- 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 +64 -64
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +82 -82
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +547 -547
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +1419 -1419
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +192 -192
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +432 -432
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +650 -650
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +1577 -1577
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +237 -237
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +525 -525
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +491 -491
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +1463 -1463
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +204 -204
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +406 -406
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +446 -446
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +1097 -1097
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +68 -68
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +117 -117
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +127 -127
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +256 -256
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +252 -252
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +535 -535
- 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 +134 -134
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +286 -286
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +694 -694
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1687 -1687
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +259 -259
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +947 -947
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +302 -302
- package/dist/swaps/trusted/ln/LnForGasSwap.js +625 -625
- 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 +343 -343
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +698 -698
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +71 -71
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +93 -93
- 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 +57 -57
- package/dist/types/SwapExecutionAction.d.ts +195 -195
- package/dist/types/SwapExecutionAction.js +106 -106
- package/dist/types/SwapExecutionStep.d.ts +144 -144
- package/dist/types/SwapExecutionStep.js +87 -87
- 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 +43 -43
- package/dist/types/Token.d.ts +99 -99
- package/dist/types/Token.js +76 -76
- package/dist/types/TokenAmount.d.ts +75 -75
- package/dist/types/TokenAmount.js +85 -85
- 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 +18 -18
- package/dist/types/lnurl/LNURLPay.d.ts +61 -61
- package/dist/types/lnurl/LNURLPay.js +31 -31
- package/dist/types/lnurl/LNURLWithdraw.d.ts +48 -48
- package/dist/types/lnurl/LNURLWithdraw.js +27 -27
- package/dist/types/wallets/LightningInvoiceCreateService.d.ts +24 -24
- package/dist/types/wallets/LightningInvoiceCreateService.js +15 -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 +70 -70
- package/dist/utils/BitcoinUtils.d.ts +18 -18
- package/dist/utils/BitcoinUtils.js +174 -174
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -7
- package/dist/utils/BitcoinWalletUtils.js +14 -14
- package/dist/utils/Logger.d.ts +7 -7
- package/dist/utils/Logger.js +12 -12
- package/dist/utils/RetryUtils.d.ts +22 -22
- package/dist/utils/RetryUtils.js +67 -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 +55 -55
- package/dist/utils/TokenUtils.d.ts +19 -19
- package/dist/utils/TokenUtils.js +37 -37
- package/dist/utils/TypeUtils.d.ts +7 -7
- package/dist/utils/TypeUtils.js +2 -2
- package/dist/utils/Utils.d.ts +69 -69
- package/dist/utils/Utils.js +214 -214
- package/package.json +46 -46
- package/src/SmartChainAssets.ts +186 -186
- package/src/api/ApiEndpoints.ts +427 -427
- package/src/api/ApiParser.ts +138 -138
- package/src/api/ApiTypes.ts +229 -229
- package/src/api/SerializedAction.ts +97 -97
- package/src/api/SwapperApi.ts +545 -545
- package/src/api/index.ts +5 -5
- package/src/bitcoin/coinselect2/accumulative.ts +69 -69
- package/src/bitcoin/coinselect2/blackjack.ts +50 -50
- package/src/bitcoin/coinselect2/index.ts +93 -93
- package/src/bitcoin/coinselect2/utils.ts +236 -236
- package/src/bitcoin/wallet/BitcoinWallet.ts +439 -439
- package/src/bitcoin/wallet/IBitcoinWallet.ts +140 -140
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +225 -225
- package/src/enums/FeeType.ts +15 -15
- package/src/enums/SwapAmountType.ts +16 -16
- package/src/enums/SwapDirection.ts +15 -15
- package/src/enums/SwapSide.ts +16 -16
- package/src/enums/SwapType.ts +75 -75
- package/src/errors/IntermediaryError.ts +28 -28
- package/src/errors/RequestError.ts +64 -64
- package/src/errors/UserError.ts +15 -15
- package/src/events/UnifiedSwapEventListener.ts +181 -181
- package/src/http/HttpUtils.ts +97 -97
- package/src/http/paramcoders/IParamReader.ts +9 -9
- package/src/http/paramcoders/ParamDecoder.ts +145 -145
- package/src/http/paramcoders/ParamEncoder.ts +40 -40
- package/src/http/paramcoders/SchemaVerifier.ts +153 -153
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +57 -57
- package/src/http/paramcoders/client/StreamParamEncoder.ts +28 -28
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +194 -194
- package/src/index.ts +141 -141
- package/src/intermediaries/Intermediary.ts +280 -280
- package/src/intermediaries/IntermediaryDiscovery.ts +548 -548
- package/src/intermediaries/apis/IntermediaryAPI.ts +1247 -1247
- package/src/intermediaries/auth/SignedKeyBasedAuth.ts +69 -69
- package/src/lnurl/LNURL.ts +402 -402
- package/src/prices/RedundantSwapPrice.ts +264 -264
- package/src/prices/SingleSwapPrice.ts +50 -50
- package/src/prices/SwapPriceWithChain.ts +194 -194
- package/src/prices/abstract/ICachedSwapPrice.ts +85 -85
- package/src/prices/abstract/IPriceProvider.ts +127 -127
- package/src/prices/abstract/ISwapPrice.ts +390 -390
- package/src/prices/providers/BinancePriceProvider.ts +48 -48
- package/src/prices/providers/CoinGeckoPriceProvider.ts +46 -46
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +49 -49
- package/src/prices/providers/CustomPriceProvider.ts +40 -40
- package/src/prices/providers/KrakenPriceProvider.ts +83 -83
- package/src/prices/providers/OKXPriceProvider.ts +59 -59
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +31 -31
- package/src/prices/providers/abstract/HttpPriceProvider.ts +14 -14
- package/src/storage/IUnifiedStorage.ts +136 -136
- package/src/storage/UnifiedSwapStorage.ts +175 -175
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +350 -350
- package/src/storage-browser/LocalStorageManager.ts +106 -106
- package/src/swapper/Swapper.ts +2557 -2570
- package/src/swapper/SwapperFactory.ts +307 -307
- package/src/swapper/SwapperUtils.ts +610 -610
- package/src/swapper/SwapperWithChain.ts +707 -707
- package/src/swapper/SwapperWithSigner.ts +511 -511
- package/src/swaps/IAddressSwap.ts +30 -30
- package/src/swaps/IBTCWalletSwap.ts +92 -92
- package/src/swaps/IClaimableSwap.ts +65 -65
- package/src/swaps/IClaimableSwapWrapper.ts +17 -17
- package/src/swaps/IRefundableSwap.ts +58 -58
- package/src/swaps/ISwap.ts +775 -775
- package/src/swaps/ISwapWithGasDrop.ts +25 -25
- package/src/swaps/ISwapWrapper.ts +564 -564
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +217 -217
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +271 -271
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +284 -284
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +172 -172
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +300 -300
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +107 -107
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1670 -1671
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +603 -603
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1883 -1883
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +752 -752
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +1753 -1753
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +612 -612
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +1327 -1327
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +138 -138
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +304 -304
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +787 -787
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +206 -206
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +403 -403
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +2148 -2148
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +1238 -1238
- package/src/swaps/trusted/ln/LnForGasSwap.ts +753 -753
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +90 -90
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +843 -843
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +133 -133
- package/src/types/AmountData.ts +9 -9
- package/src/types/CustomPriceFunction.ts +11 -11
- package/src/types/PriceInfoType.ts +66 -66
- package/src/types/SwapExecutionAction.ts +323 -323
- package/src/types/SwapExecutionStep.ts +224 -224
- package/src/types/SwapStateInfo.ts +6 -6
- package/src/types/SwapWithSigner.ts +61 -61
- package/src/types/Token.ts +163 -163
- package/src/types/TokenAmount.ts +167 -167
- package/src/types/fees/Fee.ts +56 -56
- package/src/types/fees/FeeBreakdown.ts +11 -11
- package/src/types/fees/PercentagePPM.ts +26 -26
- package/src/types/lnurl/LNURLPay.ts +79 -79
- package/src/types/lnurl/LNURLWithdraw.ts +61 -61
- package/src/types/wallets/LightningInvoiceCreateService.ts +30 -30
- package/src/types/wallets/MinimalBitcoinWalletInterface.ts +21 -21
- package/src/types/wallets/MinimalLightningNetworkWalletInterface.ts +9 -9
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -71
- package/src/utils/BitcoinUtils.ts +164 -164
- package/src/utils/BitcoinWalletUtils.ts +15 -15
- package/src/utils/Logger.ts +14 -14
- package/src/utils/RetryUtils.ts +78 -78
- package/src/utils/SwapUtils.ts +99 -99
- package/src/utils/TimeoutUtils.ts +49 -49
- package/src/utils/TokenUtils.ts +33 -33
- package/src/utils/TypeUtils.ts +8 -8
- package/src/utils/Utils.ts +221 -221
|
@@ -1,304 +1,304 @@
|
|
|
1
|
-
import {decode as bolt11Decode} from "@atomiqlabs/bolt11";
|
|
2
|
-
import {ToBTCLNDefinition, ToBTCLNWrapper} from "./ToBTCLNWrapper";
|
|
3
|
-
import {isIToBTCSwapInit, IToBTCSwap, IToBTCSwapInit} from "../IToBTCSwap";
|
|
4
|
-
import {SwapType} from "../../../../enums/SwapType";
|
|
5
|
-
import {ChainType, SwapData} from "@atomiqlabs/base";
|
|
6
|
-
import {Buffer} from "buffer";
|
|
7
|
-
import {sha256} from "@noble/hashes/sha2";
|
|
8
|
-
import {IntermediaryError} from "../../../../errors/IntermediaryError";
|
|
9
|
-
import {isLNURLPaySuccessAction, LNURL, LNURLPaySuccessAction} from "../../../../lnurl/LNURL";
|
|
10
|
-
import {TokenAmount, toTokenAmount} from "../../../../types/TokenAmount";
|
|
11
|
-
import {BitcoinTokens, BtcToken} from "../../../../types/Token";
|
|
12
|
-
import {getLogger, LoggerType} from "../../../../utils/Logger";
|
|
13
|
-
import {LNURLDecodedSuccessAction} from "../../../../types/lnurl/LNURLPay";
|
|
14
|
-
|
|
15
|
-
export type ToBTCLNSwapInit<T extends SwapData> = IToBTCSwapInit<T> & {
|
|
16
|
-
confidence: number;
|
|
17
|
-
pr?: string;
|
|
18
|
-
lnurl?: string;
|
|
19
|
-
successAction?: LNURLPaySuccessAction;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export function isToBTCLNSwapInit<T extends SwapData>(obj: any): obj is ToBTCLNSwapInit<T> {
|
|
23
|
-
return typeof (obj.confidence) === "number" &&
|
|
24
|
-
(obj.pr==null || typeof (obj.pr) === "string") &&
|
|
25
|
-
(obj.lnurl == null || typeof (obj.lnurl) === "string") &&
|
|
26
|
-
(obj.successAction == null || isLNURLPaySuccessAction(obj.successAction)) &&
|
|
27
|
-
isIToBTCSwapInit<T>(obj);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
//Set of nodes which disallow probing, resulting in 0 confidence reported by the LP
|
|
31
|
-
const SNOWFLAKE_LIST: Set<string> = new Set([
|
|
32
|
-
"038f8f113c580048d847d6949371726653e02b928196bad310e3eda39ff61723f6",
|
|
33
|
-
"03a6ce61fcaacd38d31d4e3ce2d506602818e3856b4b44faff1dde9642ba705976"
|
|
34
|
-
]);
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Escrow based (HTLC) swap for Smart chains -> Bitcoin lightning
|
|
38
|
-
*
|
|
39
|
-
* @category Swaps/Smart chain → Lightning
|
|
40
|
-
*/
|
|
41
|
-
export class ToBTCLNSwap<T extends ChainType = ChainType> extends IToBTCSwap<T, ToBTCLNDefinition<T>> {
|
|
42
|
-
protected readonly TYPE = SwapType.TO_BTCLN;
|
|
43
|
-
/**
|
|
44
|
-
* @internal
|
|
45
|
-
*/
|
|
46
|
-
protected readonly outputToken: BtcToken<true> = BitcoinTokens.BTCLN;
|
|
47
|
-
/**
|
|
48
|
-
* @internal
|
|
49
|
-
*/
|
|
50
|
-
protected readonly logger: LoggerType;
|
|
51
|
-
|
|
52
|
-
private readonly usesClaimHashAsId: boolean;
|
|
53
|
-
private readonly confidence: number;
|
|
54
|
-
private pr?: string;
|
|
55
|
-
private secret?: string;
|
|
56
|
-
|
|
57
|
-
private lnurl?: string;
|
|
58
|
-
private successAction?: LNURLPaySuccessAction;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Sets the LNURL data for the swap
|
|
62
|
-
*
|
|
63
|
-
* @internal
|
|
64
|
-
*/
|
|
65
|
-
_setLNURLData(lnurl: string, successAction?: LNURLPaySuccessAction) {
|
|
66
|
-
this.lnurl = lnurl;
|
|
67
|
-
this.successAction = successAction;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
constructor(wrapper: ToBTCLNWrapper<T>, init: ToBTCLNSwapInit<T["Data"]>);
|
|
71
|
-
constructor(wrapper: ToBTCLNWrapper<T>, obj: any);
|
|
72
|
-
|
|
73
|
-
constructor(wrapper: ToBTCLNWrapper<T>, initOrObj: ToBTCLNSwapInit<T["Data"]> | any) {
|
|
74
|
-
if(isToBTCLNSwapInit(initOrObj) && initOrObj.url!=null) initOrObj.url += "/tobtcln";
|
|
75
|
-
super(wrapper, initOrObj);
|
|
76
|
-
if(isToBTCLNSwapInit(initOrObj)) {
|
|
77
|
-
this.confidence = initOrObj.confidence;
|
|
78
|
-
this.pr = initOrObj.pr;
|
|
79
|
-
this.lnurl = initOrObj.lnurl;
|
|
80
|
-
this.successAction = initOrObj.successAction;
|
|
81
|
-
this.usesClaimHashAsId = true;
|
|
82
|
-
} else {
|
|
83
|
-
this.confidence = initOrObj.confidence;
|
|
84
|
-
this.pr = initOrObj.pr;
|
|
85
|
-
this.lnurl = initOrObj.lnurl;
|
|
86
|
-
this.successAction = initOrObj.successAction;
|
|
87
|
-
this.secret = initOrObj.secret;
|
|
88
|
-
this.usesClaimHashAsId = initOrObj.usesClaimHashAsId ?? false;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
this.logger = getLogger("ToBTCLN("+this.getIdentifierHashString()+"): ");
|
|
92
|
-
this.tryRecomputeSwapPrice();
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* @inheritDoc
|
|
97
|
-
* @internal
|
|
98
|
-
*/
|
|
99
|
-
_setPaymentResult(result: { secret?: string; txId?: string }, check: boolean = false): Promise<boolean> {
|
|
100
|
-
if(result==null) return Promise.resolve(false);
|
|
101
|
-
if(result.secret==null) throw new IntermediaryError("No payment secret returned!");
|
|
102
|
-
|
|
103
|
-
const secretBuffer = Buffer.from(result.secret, "hex");
|
|
104
|
-
const hash = Buffer.from(sha256(secretBuffer));
|
|
105
|
-
|
|
106
|
-
if(check) {
|
|
107
|
-
const claimHash = this._contract.getHashForHtlc(hash);
|
|
108
|
-
|
|
109
|
-
const expectedClaimHash = Buffer.from(this.getClaimHash(), "hex");
|
|
110
|
-
if(!claimHash.equals(expectedClaimHash)) throw new IntermediaryError("Invalid payment secret returned");
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
this.pr ??= hash.toString("hex");
|
|
114
|
-
|
|
115
|
-
this.secret = result.secret;
|
|
116
|
-
return Promise.resolve(true);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
//////////////////////////////
|
|
121
|
-
//// Amounts & fees
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* @inheritDoc
|
|
125
|
-
*/
|
|
126
|
-
getOutputToken(): BtcToken<true> {
|
|
127
|
-
return BitcoinTokens.BTCLN;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* @inheritDoc
|
|
132
|
-
*/
|
|
133
|
-
getOutput(): TokenAmount<BtcToken<true>> {
|
|
134
|
-
if(this.pr==null || !this.pr.toLowerCase().startsWith("ln"))
|
|
135
|
-
return toTokenAmount(null, this.outputToken, this.wrapper._prices, this.pricingInfo);
|
|
136
|
-
const parsedPR = bolt11Decode(this.pr);
|
|
137
|
-
if(parsedPR.millisatoshis==null) throw new Error("Swap invoice has no msat amount field!");
|
|
138
|
-
const amount = (BigInt(parsedPR.millisatoshis) + 999n) / 1000n;
|
|
139
|
-
return toTokenAmount(amount, this.outputToken, this.wrapper._prices, this.pricingInfo);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
//////////////////////////////
|
|
144
|
-
//// Getters & utils
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* @inheritDoc
|
|
148
|
-
*/
|
|
149
|
-
getOutputTxId(): string | null {
|
|
150
|
-
const paymentHash = this.getPaymentHash();
|
|
151
|
-
if(paymentHash==null) return null;
|
|
152
|
-
return paymentHash.toString("hex");
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* @inheritDoc
|
|
157
|
-
*/
|
|
158
|
-
getOutputAddress(): string | null {
|
|
159
|
-
return this.lnurl ?? this.pr ?? null;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Returns payment secret (pre-image) as a proof of payment
|
|
164
|
-
*/
|
|
165
|
-
getSecret(): string | null {
|
|
166
|
-
return this.secret ?? null;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Returns the confidence of the intermediary that this payment will succeed.
|
|
171
|
-
*
|
|
172
|
-
* @returns Decimal value between 0 and 1, where 0 is not likely and 1 is very likely
|
|
173
|
-
*/
|
|
174
|
-
getConfidence(): number {
|
|
175
|
-
return this.confidence;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Checks whether a swap is likely to fail, based on the confidence as reported by the intermediary (LP)
|
|
180
|
-
*/
|
|
181
|
-
willLikelyFail(): boolean {
|
|
182
|
-
if(this.pr==null || !this.pr.toLowerCase().startsWith("ln")) return false;
|
|
183
|
-
|
|
184
|
-
const parsedRequest = bolt11Decode(this.pr);
|
|
185
|
-
|
|
186
|
-
if(parsedRequest.tagsObject.routing_info!=null) {
|
|
187
|
-
for (let route of parsedRequest.tagsObject.routing_info) {
|
|
188
|
-
if(SNOWFLAKE_LIST.has(route.pubkey)) {
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return this.confidence===0;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Tries to detect if the target lightning invoice is a non-custodial mobile wallet, extract care must be taken
|
|
199
|
-
* for such a wallet **to be online** when attempting to make a swap sending to such a wallet
|
|
200
|
-
*/
|
|
201
|
-
isPayingToNonCustodialWallet(): boolean {
|
|
202
|
-
if(this.pr==null || !this.pr.toLowerCase().startsWith("ln")) return false;
|
|
203
|
-
|
|
204
|
-
const parsedRequest = bolt11Decode(this.pr);
|
|
205
|
-
|
|
206
|
-
if(parsedRequest.tagsObject.routing_info!=null) {
|
|
207
|
-
return parsedRequest.tagsObject.routing_info.length>0;
|
|
208
|
-
}
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* @inheritDoc
|
|
214
|
-
* @internal
|
|
215
|
-
*/
|
|
216
|
-
protected getIdentifierHash(): Buffer {
|
|
217
|
-
const idBuffer: Buffer = this.usesClaimHashAsId
|
|
218
|
-
? Buffer.from(this.getClaimHash(), "hex")
|
|
219
|
-
: this.getPaymentHash()!;
|
|
220
|
-
if(this._randomNonce==null) return idBuffer;
|
|
221
|
-
return Buffer.concat([idBuffer, Buffer.from(this._randomNonce, "hex")]);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* @inheritDoc
|
|
226
|
-
* @internal
|
|
227
|
-
*/
|
|
228
|
-
protected getLpIdentifier(): string {
|
|
229
|
-
if(this.pr==null) return this._data.getEscrowHash();
|
|
230
|
-
if(this.pr.toLowerCase().startsWith("ln")) {
|
|
231
|
-
const parsed = bolt11Decode(this.pr);
|
|
232
|
-
if(parsed.tagsObject.payment_hash==null) throw new Error("Swap invoice has no payment hash field!");
|
|
233
|
-
return parsed.tagsObject.payment_hash;
|
|
234
|
-
}
|
|
235
|
-
return this.pr;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Returns the payment hash of the swap, i.e. a payment hash of the lightning network invoice that
|
|
240
|
-
* is about to be paid
|
|
241
|
-
*/
|
|
242
|
-
getPaymentHash(): Buffer | null {
|
|
243
|
-
if(this.pr==null) return null;
|
|
244
|
-
if(this.pr.toLowerCase().startsWith("ln")) {
|
|
245
|
-
const parsed = bolt11Decode(this.pr);
|
|
246
|
-
if(parsed.tagsObject.payment_hash==null) throw new Error("Swap invoice has no payment hash field!");
|
|
247
|
-
return Buffer.from(parsed.tagsObject.payment_hash, "hex");
|
|
248
|
-
}
|
|
249
|
-
return Buffer.from(this.pr, "hex");
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
//////////////////////////////
|
|
254
|
-
//// LNURL-pay
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Whether this is an LNURL-pay swap
|
|
258
|
-
*/
|
|
259
|
-
isLNURL(): boolean {
|
|
260
|
-
return this.lnurl!=null;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Gets the used LNURL-pay link or `null` if this is not an LNURL-pay swap
|
|
265
|
-
*/
|
|
266
|
-
getLNURL(): string | null {
|
|
267
|
-
return this.lnurl ?? null;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Checks whether this LNURL-pay payment contains a success action
|
|
272
|
-
*/
|
|
273
|
-
hasSuccessAction(): boolean {
|
|
274
|
-
return this.successAction!=null;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Returns the success action after a successful payment, else `null`
|
|
279
|
-
*/
|
|
280
|
-
getSuccessAction(): LNURLDecodedSuccessAction | null {
|
|
281
|
-
return LNURL.decodeSuccessAction(this.successAction, this.secret);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
//////////////////////////////
|
|
286
|
-
//// Storage
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* @inheritDoc
|
|
290
|
-
*/
|
|
291
|
-
serialize(): any {
|
|
292
|
-
return {
|
|
293
|
-
...super.serialize(),
|
|
294
|
-
paymentHash: this.getPaymentHash()?.toString("hex"),
|
|
295
|
-
pr: this.pr,
|
|
296
|
-
confidence: this.confidence,
|
|
297
|
-
secret: this.secret,
|
|
298
|
-
lnurl: this.lnurl,
|
|
299
|
-
successAction: this.successAction,
|
|
300
|
-
usesClaimHashAsId: this.usesClaimHashAsId
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
}
|
|
1
|
+
import {decode as bolt11Decode} from "@atomiqlabs/bolt11";
|
|
2
|
+
import {ToBTCLNDefinition, ToBTCLNWrapper} from "./ToBTCLNWrapper";
|
|
3
|
+
import {isIToBTCSwapInit, IToBTCSwap, IToBTCSwapInit} from "../IToBTCSwap";
|
|
4
|
+
import {SwapType} from "../../../../enums/SwapType";
|
|
5
|
+
import {ChainType, SwapData} from "@atomiqlabs/base";
|
|
6
|
+
import {Buffer} from "buffer";
|
|
7
|
+
import {sha256} from "@noble/hashes/sha2";
|
|
8
|
+
import {IntermediaryError} from "../../../../errors/IntermediaryError";
|
|
9
|
+
import {isLNURLPaySuccessAction, LNURL, LNURLPaySuccessAction} from "../../../../lnurl/LNURL";
|
|
10
|
+
import {TokenAmount, toTokenAmount} from "../../../../types/TokenAmount";
|
|
11
|
+
import {BitcoinTokens, BtcToken} from "../../../../types/Token";
|
|
12
|
+
import {getLogger, LoggerType} from "../../../../utils/Logger";
|
|
13
|
+
import {LNURLDecodedSuccessAction} from "../../../../types/lnurl/LNURLPay";
|
|
14
|
+
|
|
15
|
+
export type ToBTCLNSwapInit<T extends SwapData> = IToBTCSwapInit<T> & {
|
|
16
|
+
confidence: number;
|
|
17
|
+
pr?: string;
|
|
18
|
+
lnurl?: string;
|
|
19
|
+
successAction?: LNURLPaySuccessAction;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function isToBTCLNSwapInit<T extends SwapData>(obj: any): obj is ToBTCLNSwapInit<T> {
|
|
23
|
+
return typeof (obj.confidence) === "number" &&
|
|
24
|
+
(obj.pr==null || typeof (obj.pr) === "string") &&
|
|
25
|
+
(obj.lnurl == null || typeof (obj.lnurl) === "string") &&
|
|
26
|
+
(obj.successAction == null || isLNURLPaySuccessAction(obj.successAction)) &&
|
|
27
|
+
isIToBTCSwapInit<T>(obj);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//Set of nodes which disallow probing, resulting in 0 confidence reported by the LP
|
|
31
|
+
const SNOWFLAKE_LIST: Set<string> = new Set([
|
|
32
|
+
"038f8f113c580048d847d6949371726653e02b928196bad310e3eda39ff61723f6",
|
|
33
|
+
"03a6ce61fcaacd38d31d4e3ce2d506602818e3856b4b44faff1dde9642ba705976"
|
|
34
|
+
]);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Escrow based (HTLC) swap for Smart chains -> Bitcoin lightning
|
|
38
|
+
*
|
|
39
|
+
* @category Swaps/Smart chain → Lightning
|
|
40
|
+
*/
|
|
41
|
+
export class ToBTCLNSwap<T extends ChainType = ChainType> extends IToBTCSwap<T, ToBTCLNDefinition<T>> {
|
|
42
|
+
protected readonly TYPE = SwapType.TO_BTCLN;
|
|
43
|
+
/**
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
protected readonly outputToken: BtcToken<true> = BitcoinTokens.BTCLN;
|
|
47
|
+
/**
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
protected readonly logger: LoggerType;
|
|
51
|
+
|
|
52
|
+
private readonly usesClaimHashAsId: boolean;
|
|
53
|
+
private readonly confidence: number;
|
|
54
|
+
private pr?: string;
|
|
55
|
+
private secret?: string;
|
|
56
|
+
|
|
57
|
+
private lnurl?: string;
|
|
58
|
+
private successAction?: LNURLPaySuccessAction;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Sets the LNURL data for the swap
|
|
62
|
+
*
|
|
63
|
+
* @internal
|
|
64
|
+
*/
|
|
65
|
+
_setLNURLData(lnurl: string, successAction?: LNURLPaySuccessAction) {
|
|
66
|
+
this.lnurl = lnurl;
|
|
67
|
+
this.successAction = successAction;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
constructor(wrapper: ToBTCLNWrapper<T>, init: ToBTCLNSwapInit<T["Data"]>);
|
|
71
|
+
constructor(wrapper: ToBTCLNWrapper<T>, obj: any);
|
|
72
|
+
|
|
73
|
+
constructor(wrapper: ToBTCLNWrapper<T>, initOrObj: ToBTCLNSwapInit<T["Data"]> | any) {
|
|
74
|
+
if(isToBTCLNSwapInit(initOrObj) && initOrObj.url!=null) initOrObj.url += "/tobtcln";
|
|
75
|
+
super(wrapper, initOrObj);
|
|
76
|
+
if(isToBTCLNSwapInit(initOrObj)) {
|
|
77
|
+
this.confidence = initOrObj.confidence;
|
|
78
|
+
this.pr = initOrObj.pr;
|
|
79
|
+
this.lnurl = initOrObj.lnurl;
|
|
80
|
+
this.successAction = initOrObj.successAction;
|
|
81
|
+
this.usesClaimHashAsId = true;
|
|
82
|
+
} else {
|
|
83
|
+
this.confidence = initOrObj.confidence;
|
|
84
|
+
this.pr = initOrObj.pr;
|
|
85
|
+
this.lnurl = initOrObj.lnurl;
|
|
86
|
+
this.successAction = initOrObj.successAction;
|
|
87
|
+
this.secret = initOrObj.secret;
|
|
88
|
+
this.usesClaimHashAsId = initOrObj.usesClaimHashAsId ?? false;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
this.logger = getLogger("ToBTCLN("+this.getIdentifierHashString()+"): ");
|
|
92
|
+
this.tryRecomputeSwapPrice();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @inheritDoc
|
|
97
|
+
* @internal
|
|
98
|
+
*/
|
|
99
|
+
_setPaymentResult(result: { secret?: string; txId?: string }, check: boolean = false): Promise<boolean> {
|
|
100
|
+
if(result==null) return Promise.resolve(false);
|
|
101
|
+
if(result.secret==null) throw new IntermediaryError("No payment secret returned!");
|
|
102
|
+
|
|
103
|
+
const secretBuffer = Buffer.from(result.secret, "hex");
|
|
104
|
+
const hash = Buffer.from(sha256(secretBuffer));
|
|
105
|
+
|
|
106
|
+
if(check) {
|
|
107
|
+
const claimHash = this._contract.getHashForHtlc(hash);
|
|
108
|
+
|
|
109
|
+
const expectedClaimHash = Buffer.from(this.getClaimHash(), "hex");
|
|
110
|
+
if(!claimHash.equals(expectedClaimHash)) throw new IntermediaryError("Invalid payment secret returned");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
this.pr ??= hash.toString("hex");
|
|
114
|
+
|
|
115
|
+
this.secret = result.secret;
|
|
116
|
+
return Promise.resolve(true);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
//////////////////////////////
|
|
121
|
+
//// Amounts & fees
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @inheritDoc
|
|
125
|
+
*/
|
|
126
|
+
getOutputToken(): BtcToken<true> {
|
|
127
|
+
return BitcoinTokens.BTCLN;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @inheritDoc
|
|
132
|
+
*/
|
|
133
|
+
getOutput(): TokenAmount<BtcToken<true>> {
|
|
134
|
+
if(this.pr==null || !this.pr.toLowerCase().startsWith("ln"))
|
|
135
|
+
return toTokenAmount(null, this.outputToken, this.wrapper._prices, this.pricingInfo);
|
|
136
|
+
const parsedPR = bolt11Decode(this.pr);
|
|
137
|
+
if(parsedPR.millisatoshis==null) throw new Error("Swap invoice has no msat amount field!");
|
|
138
|
+
const amount = (BigInt(parsedPR.millisatoshis) + 999n) / 1000n;
|
|
139
|
+
return toTokenAmount(amount, this.outputToken, this.wrapper._prices, this.pricingInfo);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
//////////////////////////////
|
|
144
|
+
//// Getters & utils
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* @inheritDoc
|
|
148
|
+
*/
|
|
149
|
+
getOutputTxId(): string | null {
|
|
150
|
+
const paymentHash = this.getPaymentHash();
|
|
151
|
+
if(paymentHash==null) return null;
|
|
152
|
+
return paymentHash.toString("hex");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @inheritDoc
|
|
157
|
+
*/
|
|
158
|
+
getOutputAddress(): string | null {
|
|
159
|
+
return this.lnurl ?? this.pr ?? null;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Returns payment secret (pre-image) as a proof of payment
|
|
164
|
+
*/
|
|
165
|
+
getSecret(): string | null {
|
|
166
|
+
return this.secret ?? null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Returns the confidence of the intermediary that this payment will succeed.
|
|
171
|
+
*
|
|
172
|
+
* @returns Decimal value between 0 and 1, where 0 is not likely and 1 is very likely
|
|
173
|
+
*/
|
|
174
|
+
getConfidence(): number {
|
|
175
|
+
return this.confidence;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Checks whether a swap is likely to fail, based on the confidence as reported by the intermediary (LP)
|
|
180
|
+
*/
|
|
181
|
+
willLikelyFail(): boolean {
|
|
182
|
+
if(this.pr==null || !this.pr.toLowerCase().startsWith("ln")) return false;
|
|
183
|
+
|
|
184
|
+
const parsedRequest = bolt11Decode(this.pr);
|
|
185
|
+
|
|
186
|
+
if(parsedRequest.tagsObject.routing_info!=null) {
|
|
187
|
+
for (let route of parsedRequest.tagsObject.routing_info) {
|
|
188
|
+
if(SNOWFLAKE_LIST.has(route.pubkey)) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return this.confidence===0;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Tries to detect if the target lightning invoice is a non-custodial mobile wallet, extract care must be taken
|
|
199
|
+
* for such a wallet **to be online** when attempting to make a swap sending to such a wallet
|
|
200
|
+
*/
|
|
201
|
+
isPayingToNonCustodialWallet(): boolean {
|
|
202
|
+
if(this.pr==null || !this.pr.toLowerCase().startsWith("ln")) return false;
|
|
203
|
+
|
|
204
|
+
const parsedRequest = bolt11Decode(this.pr);
|
|
205
|
+
|
|
206
|
+
if(parsedRequest.tagsObject.routing_info!=null) {
|
|
207
|
+
return parsedRequest.tagsObject.routing_info.length>0;
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* @inheritDoc
|
|
214
|
+
* @internal
|
|
215
|
+
*/
|
|
216
|
+
protected getIdentifierHash(): Buffer {
|
|
217
|
+
const idBuffer: Buffer = this.usesClaimHashAsId
|
|
218
|
+
? Buffer.from(this.getClaimHash(), "hex")
|
|
219
|
+
: this.getPaymentHash()!;
|
|
220
|
+
if(this._randomNonce==null) return idBuffer;
|
|
221
|
+
return Buffer.concat([idBuffer, Buffer.from(this._randomNonce, "hex")]);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* @inheritDoc
|
|
226
|
+
* @internal
|
|
227
|
+
*/
|
|
228
|
+
protected getLpIdentifier(): string {
|
|
229
|
+
if(this.pr==null) return this._data.getEscrowHash();
|
|
230
|
+
if(this.pr.toLowerCase().startsWith("ln")) {
|
|
231
|
+
const parsed = bolt11Decode(this.pr);
|
|
232
|
+
if(parsed.tagsObject.payment_hash==null) throw new Error("Swap invoice has no payment hash field!");
|
|
233
|
+
return parsed.tagsObject.payment_hash;
|
|
234
|
+
}
|
|
235
|
+
return this.pr;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Returns the payment hash of the swap, i.e. a payment hash of the lightning network invoice that
|
|
240
|
+
* is about to be paid
|
|
241
|
+
*/
|
|
242
|
+
getPaymentHash(): Buffer | null {
|
|
243
|
+
if(this.pr==null) return null;
|
|
244
|
+
if(this.pr.toLowerCase().startsWith("ln")) {
|
|
245
|
+
const parsed = bolt11Decode(this.pr);
|
|
246
|
+
if(parsed.tagsObject.payment_hash==null) throw new Error("Swap invoice has no payment hash field!");
|
|
247
|
+
return Buffer.from(parsed.tagsObject.payment_hash, "hex");
|
|
248
|
+
}
|
|
249
|
+
return Buffer.from(this.pr, "hex");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
//////////////////////////////
|
|
254
|
+
//// LNURL-pay
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Whether this is an LNURL-pay swap
|
|
258
|
+
*/
|
|
259
|
+
isLNURL(): boolean {
|
|
260
|
+
return this.lnurl!=null;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Gets the used LNURL-pay link or `null` if this is not an LNURL-pay swap
|
|
265
|
+
*/
|
|
266
|
+
getLNURL(): string | null {
|
|
267
|
+
return this.lnurl ?? null;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Checks whether this LNURL-pay payment contains a success action
|
|
272
|
+
*/
|
|
273
|
+
hasSuccessAction(): boolean {
|
|
274
|
+
return this.successAction!=null;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Returns the success action after a successful payment, else `null`
|
|
279
|
+
*/
|
|
280
|
+
getSuccessAction(): LNURLDecodedSuccessAction | null {
|
|
281
|
+
return LNURL.decodeSuccessAction(this.successAction, this.secret);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
//////////////////////////////
|
|
286
|
+
//// Storage
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* @inheritDoc
|
|
290
|
+
*/
|
|
291
|
+
serialize(): any {
|
|
292
|
+
return {
|
|
293
|
+
...super.serialize(),
|
|
294
|
+
paymentHash: this.getPaymentHash()?.toString("hex"),
|
|
295
|
+
pr: this.pr,
|
|
296
|
+
confidence: this.confidence,
|
|
297
|
+
secret: this.secret,
|
|
298
|
+
lnurl: this.lnurl,
|
|
299
|
+
successAction: this.successAction,
|
|
300
|
+
usesClaimHashAsId: this.usesClaimHashAsId
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
}
|