@atomiqlabs/sdk 7.0.11 → 8.0.7
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/README.md +45 -29
- package/dist/SmartChainAssets.d.ts +11 -3
- package/dist/SmartChainAssets.js +7 -3
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
- package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
- package/dist/bitcoin/LightningNetworkApi.js +2 -0
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
- package/dist/bitcoin/coinselect2/accumulative.js +52 -0
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
- package/dist/bitcoin/coinselect2/blackjack.js +38 -0
- package/dist/bitcoin/coinselect2/index.d.ts +19 -0
- package/dist/bitcoin/coinselect2/index.js +69 -0
- package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
- package/dist/bitcoin/coinselect2/utils.js +123 -0
- package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
- package/dist/bitcoin/mempool/MempoolApi.js +311 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
- package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
- package/dist/enums/FeeType.d.ts +8 -0
- package/dist/enums/FeeType.js +12 -0
- package/dist/enums/SwapAmountType.d.ts +8 -0
- package/dist/enums/SwapAmountType.js +12 -0
- package/dist/enums/SwapDirection.d.ts +8 -0
- package/dist/enums/SwapDirection.js +12 -0
- package/dist/enums/SwapType.d.ts +14 -0
- package/dist/enums/SwapType.js +18 -0
- package/dist/errors/IntermediaryError.d.ts +9 -0
- package/dist/errors/IntermediaryError.js +26 -0
- package/dist/errors/PaymentAuthError.d.ts +11 -0
- package/dist/errors/PaymentAuthError.js +23 -0
- package/dist/errors/RequestError.d.ts +18 -0
- package/dist/errors/RequestError.js +46 -0
- package/dist/errors/UserError.d.ts +7 -0
- package/dist/errors/UserError.js +15 -0
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
- package/dist/events/UnifiedSwapEventListener.js +130 -0
- package/dist/http/HttpUtils.d.ts +27 -0
- package/dist/http/HttpUtils.js +91 -0
- package/dist/http/paramcoders/IParamReader.d.ts +8 -0
- package/dist/http/paramcoders/IParamReader.js +2 -0
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
- package/dist/http/paramcoders/ParamDecoder.js +132 -0
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
- package/dist/http/paramcoders/ParamEncoder.js +31 -0
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
- package/dist/http/paramcoders/SchemaVerifier.js +145 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
- package/dist/index.d.ts +82 -4
- package/dist/index.js +128 -4
- package/dist/intermediaries/Intermediary.d.ts +111 -0
- package/dist/intermediaries/Intermediary.js +115 -0
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
- package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
- package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
- package/dist/lnurl/LNURL.d.ts +102 -0
- package/dist/lnurl/LNURL.js +321 -0
- package/dist/prices/RedundantSwapPrice.d.ts +89 -0
- package/dist/prices/RedundantSwapPrice.js +202 -0
- package/dist/prices/SingleSwapPrice.d.ts +31 -0
- package/dist/prices/SingleSwapPrice.js +41 -0
- package/dist/prices/SwapPriceWithChain.d.ts +70 -0
- package/dist/prices/SwapPriceWithChain.js +91 -0
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
- package/dist/prices/abstract/IPriceProvider.js +74 -0
- package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
- package/dist/prices/abstract/ISwapPrice.js +219 -0
- package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
- package/dist/prices/providers/BinancePriceProvider.js +23 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
- package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
- package/dist/prices/providers/CustomPriceProvider.js +24 -0
- package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
- package/dist/prices/providers/KrakenPriceProvider.js +36 -0
- package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
- package/dist/prices/providers/OKXPriceProvider.js +23 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
- package/dist/storage/IUnifiedStorage.d.ts +73 -0
- package/dist/storage/IUnifiedStorage.js +2 -0
- package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
- package/dist/storage/UnifiedSwapStorage.js +83 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
- package/dist/swapper/Swapper.d.ts +533 -0
- package/dist/swapper/Swapper.js +1566 -0
- package/dist/swapper/SwapperFactory.d.ts +87 -0
- package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +40 -22
- package/dist/swapper/SwapperUtils.d.ts +153 -0
- package/dist/swapper/SwapperUtils.js +420 -0
- package/dist/swapper/SwapperWithChain.d.ts +214 -0
- package/dist/swapper/SwapperWithChain.js +315 -0
- package/dist/swapper/SwapperWithSigner.d.ts +178 -0
- package/dist/swapper/SwapperWithSigner.js +172 -0
- package/dist/swaps/IAddressSwap.d.ts +13 -0
- package/dist/swaps/IAddressSwap.js +13 -0
- package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
- package/dist/swaps/IBTCWalletSwap.js +17 -0
- package/dist/swaps/IClaimableSwap.d.ts +17 -0
- package/dist/swaps/IClaimableSwap.js +14 -0
- package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
- package/dist/swaps/IClaimableSwapWrapper.js +2 -0
- package/dist/swaps/IRefundableSwap.d.ts +17 -0
- package/dist/swaps/IRefundableSwap.js +13 -0
- package/dist/swaps/ISwap.d.ts +207 -0
- package/dist/swaps/ISwap.js +264 -0
- package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
- package/dist/swaps/ISwapWithGasDrop.js +11 -0
- package/dist/swaps/ISwapWrapper.d.ts +153 -0
- package/dist/swaps/ISwapWrapper.js +227 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
- package/dist/types/AmountData.d.ts +9 -0
- package/dist/types/AmountData.js +2 -0
- package/dist/types/CustomPriceFunction.d.ts +5 -0
- package/dist/types/CustomPriceFunction.js +2 -0
- package/dist/types/PriceInfoType.d.ts +28 -0
- package/dist/types/PriceInfoType.js +57 -0
- package/dist/types/SwapExecutionAction.d.ts +7 -0
- package/dist/types/SwapExecutionAction.js +2 -0
- package/dist/types/SwapWithSigner.d.ts +14 -0
- package/dist/types/SwapWithSigner.js +40 -0
- package/dist/types/Token.d.ts +53 -0
- package/dist/types/Token.js +58 -0
- package/dist/types/TokenAmount.d.ts +57 -0
- package/dist/types/TokenAmount.js +47 -0
- package/dist/types/fees/Fee.d.ts +49 -0
- package/dist/types/fees/Fee.js +2 -0
- package/dist/types/fees/FeeBreakdown.d.ts +10 -0
- package/dist/types/fees/FeeBreakdown.js +2 -0
- package/dist/types/fees/PercentagePPM.d.ts +15 -0
- package/dist/types/fees/PercentagePPM.js +17 -0
- package/dist/types/lnurl/LNURLPay.d.ts +54 -0
- package/dist/types/lnurl/LNURLPay.js +28 -0
- package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
- package/dist/types/lnurl/LNURLWithdraw.js +24 -0
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
- package/dist/utils/BitcoinUtils.d.ts +13 -0
- package/dist/utils/BitcoinUtils.js +98 -0
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
- package/dist/utils/BitcoinWalletUtils.js +14 -0
- package/dist/utils/Logger.d.ts +7 -0
- package/dist/utils/Logger.js +12 -0
- package/dist/utils/RetryUtils.d.ts +21 -0
- package/dist/utils/RetryUtils.js +66 -0
- package/dist/utils/SwapUtils.d.ts +31 -0
- package/dist/utils/SwapUtils.js +18 -0
- package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
- package/dist/utils/TimeoutUtils.js +55 -0
- package/dist/utils/TokenUtils.d.ts +11 -0
- package/dist/utils/TokenUtils.js +29 -0
- package/dist/utils/TypeUtils.d.ts +7 -0
- package/dist/utils/TypeUtils.js +2 -0
- package/dist/utils/Utils.d.ts +57 -0
- package/dist/utils/Utils.js +178 -0
- package/package.json +14 -6
- package/src/SmartChainAssets.ts +11 -3
- package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
- package/src/bitcoin/LightningNetworkApi.ts +16 -0
- package/src/bitcoin/coinselect2/accumulative.ts +68 -0
- package/src/bitcoin/coinselect2/blackjack.ts +49 -0
- package/src/bitcoin/coinselect2/index.ts +92 -0
- package/src/bitcoin/coinselect2/utils.ts +189 -0
- package/src/bitcoin/mempool/MempoolApi.ts +554 -0
- package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
- package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
- package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
- package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
- package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
- package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
- package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
- package/src/enums/FeeType.ts +9 -0
- package/src/enums/SwapAmountType.ts +9 -0
- package/src/enums/SwapDirection.ts +9 -0
- package/src/enums/SwapType.ts +15 -0
- package/src/errors/IntermediaryError.ts +24 -0
- package/src/errors/PaymentAuthError.ts +26 -0
- package/src/errors/RequestError.ts +51 -0
- package/src/errors/UserError.ts +14 -0
- package/src/events/UnifiedSwapEventListener.ts +171 -0
- package/src/http/HttpUtils.ts +92 -0
- package/src/http/paramcoders/IParamReader.ts +10 -0
- package/src/http/paramcoders/ParamDecoder.ts +142 -0
- package/src/http/paramcoders/ParamEncoder.ts +37 -0
- package/src/http/paramcoders/SchemaVerifier.ts +153 -0
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
- package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
- package/src/index.ts +102 -4
- package/src/intermediaries/Intermediary.ts +204 -0
- package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
- package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
- package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
- package/src/lnurl/LNURL.ts +403 -0
- package/src/prices/RedundantSwapPrice.ts +245 -0
- package/src/prices/SingleSwapPrice.ts +47 -0
- package/src/prices/SwapPriceWithChain.ts +157 -0
- package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
- package/src/prices/abstract/IPriceProvider.ts +128 -0
- package/src/prices/abstract/ISwapPrice.ts +328 -0
- package/src/prices/providers/BinancePriceProvider.ts +41 -0
- package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
- package/src/prices/providers/CustomPriceProvider.ts +29 -0
- package/src/prices/providers/KrakenPriceProvider.ts +74 -0
- package/src/prices/providers/OKXPriceProvider.ts +53 -0
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
- package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
- package/src/storage/IUnifiedStorage.ts +83 -0
- package/src/storage/UnifiedSwapStorage.ts +104 -0
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
- package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
- package/src/swapper/Swapper.ts +2107 -0
- package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +116 -75
- package/src/swapper/SwapperUtils.ts +510 -0
- package/src/swapper/SwapperWithChain.ts +464 -0
- package/src/swapper/SwapperWithSigner.ts +300 -0
- package/src/swaps/IAddressSwap.ts +20 -0
- package/src/swaps/IBTCWalletSwap.ts +77 -0
- package/src/swaps/IClaimableSwap.ts +30 -0
- package/src/swaps/IClaimableSwapWrapper.ts +9 -0
- package/src/swaps/IRefundableSwap.ts +29 -0
- package/src/swaps/ISwap.ts +490 -0
- package/src/swaps/ISwapWithGasDrop.ts +19 -0
- package/src/swaps/ISwapWrapper.ts +344 -0
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
- package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
- package/src/types/AmountData.ts +9 -0
- package/src/types/CustomPriceFunction.ts +5 -0
- package/src/types/PriceInfoType.ts +67 -0
- package/src/types/SwapExecutionAction.ts +8 -0
- package/src/types/SwapWithSigner.ts +57 -0
- package/src/types/Token.ts +90 -0
- package/src/types/TokenAmount.ts +110 -0
- package/src/types/fees/Fee.ts +55 -0
- package/src/types/fees/FeeBreakdown.ts +11 -0
- package/src/types/fees/PercentagePPM.ts +24 -0
- package/src/types/lnurl/LNURLPay.ts +72 -0
- package/src/types/lnurl/LNURLWithdraw.ts +55 -0
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
- package/src/utils/BitcoinUtils.ts +86 -0
- package/src/utils/BitcoinWalletUtils.ts +16 -0
- package/src/utils/Logger.ts +15 -0
- package/src/utils/RetryUtils.ts +71 -0
- package/src/utils/SwapUtils.ts +38 -0
- package/src/utils/TimeoutUtils.ts +50 -0
- package/src/utils/TokenUtils.ts +25 -0
- package/src/utils/TypeUtils.ts +9 -0
- package/src/utils/Utils.ts +182 -0
- package/dist/SwapperFactory.d.ts +0 -52
- package/dist/Utils.js +0 -37
- package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
- package/dist/fs-storage/FileSystemStorageManager.js +0 -60
- package/dist/fs-storage/index.d.ts +0 -1
- package/dist/fs-storage/index.js +0 -17
- package/src/SmartChainAssets.js +0 -75
- package/src/SwapperFactory.js +0 -120
- package/src/Utils.js +0 -37
- package/src/Utils.ts +0 -31
- package/src/fs-storage/FileSystemStorageManager.ts +0 -71
- package/src/fs-storage/index.ts +0 -1
- package/src/index.js +0 -21
- package/src/storage/LocalStorageManager.js +0 -72
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import {RequestError} from "../../errors/RequestError";
|
|
2
|
+
import {FieldTypeEnum, RequestSchemaResult, verifySchema} from "../../http/paramcoders/SchemaVerifier";
|
|
3
|
+
import {httpGet} from "../../http/HttpUtils";
|
|
4
|
+
import {tryWithRetries} from "../../utils/RetryUtils";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export enum AddressStatusResponseCodes {
|
|
8
|
+
EXPIRED=10001,
|
|
9
|
+
PAID=10000,
|
|
10
|
+
AWAIT_PAYMENT=10010,
|
|
11
|
+
AWAIT_CONFIRMATION=10011,
|
|
12
|
+
PENDING=10013,
|
|
13
|
+
TX_SENT=10012,
|
|
14
|
+
REFUNDED=10014,
|
|
15
|
+
DOUBLE_SPENT=10015,
|
|
16
|
+
REFUNDABLE=10016
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type AddressStatusResponse = {
|
|
20
|
+
code: AddressStatusResponseCodes.TX_SENT | AddressStatusResponseCodes.PAID,
|
|
21
|
+
msg: string,
|
|
22
|
+
data: {
|
|
23
|
+
adjustedAmount: string,
|
|
24
|
+
adjustedTotal: string,
|
|
25
|
+
adjustedFee?: string,
|
|
26
|
+
adjustedFeeSats?: string,
|
|
27
|
+
txId: string,
|
|
28
|
+
scTxId: string
|
|
29
|
+
}
|
|
30
|
+
} | {
|
|
31
|
+
code: AddressStatusResponseCodes.AWAIT_CONFIRMATION | AddressStatusResponseCodes.PENDING,
|
|
32
|
+
msg: string,
|
|
33
|
+
data: {
|
|
34
|
+
adjustedAmount: string,
|
|
35
|
+
adjustedTotal: string,
|
|
36
|
+
adjustedFee?: string,
|
|
37
|
+
adjustedFeeSats?: string,
|
|
38
|
+
txId: string
|
|
39
|
+
}
|
|
40
|
+
} | {
|
|
41
|
+
code: AddressStatusResponseCodes.REFUNDABLE,
|
|
42
|
+
msg: string,
|
|
43
|
+
data: {
|
|
44
|
+
adjustedAmount: string
|
|
45
|
+
}
|
|
46
|
+
} | {
|
|
47
|
+
code: AddressStatusResponseCodes.REFUNDED | AddressStatusResponseCodes.DOUBLE_SPENT,
|
|
48
|
+
msg: string,
|
|
49
|
+
data: {
|
|
50
|
+
txId: string
|
|
51
|
+
}
|
|
52
|
+
} | {
|
|
53
|
+
code: AddressStatusResponseCodes.AWAIT_PAYMENT | AddressStatusResponseCodes.EXPIRED,
|
|
54
|
+
msg: string
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export type TrustedFromBTCInit = {
|
|
58
|
+
address: string,
|
|
59
|
+
amount: bigint,
|
|
60
|
+
token: string,
|
|
61
|
+
refundAddress?: string
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const TrustedFromBTCResponseSchema = {
|
|
65
|
+
paymentHash: FieldTypeEnum.String,
|
|
66
|
+
sequence: FieldTypeEnum.BigInt,
|
|
67
|
+
btcAddress: FieldTypeEnum.String,
|
|
68
|
+
amountSats: FieldTypeEnum.BigInt,
|
|
69
|
+
swapFeeSats: FieldTypeEnum.BigInt,
|
|
70
|
+
swapFee: FieldTypeEnum.BigInt,
|
|
71
|
+
total: FieldTypeEnum.BigInt,
|
|
72
|
+
intermediaryKey: FieldTypeEnum.String,
|
|
73
|
+
recommendedFee: FieldTypeEnum.Number,
|
|
74
|
+
expiresAt: FieldTypeEnum.Number
|
|
75
|
+
} as const;
|
|
76
|
+
|
|
77
|
+
export type TrustedFromBTCResponseType = RequestSchemaResult<typeof TrustedFromBTCResponseSchema>;
|
|
78
|
+
|
|
79
|
+
export enum InvoiceStatusResponseCodes {
|
|
80
|
+
EXPIRED=10001,
|
|
81
|
+
PAID=10000,
|
|
82
|
+
AWAIT_PAYMENT=10010,
|
|
83
|
+
PENDING=10011,
|
|
84
|
+
TX_SENT=10012
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type InvoiceStatusResponse = {
|
|
88
|
+
code: InvoiceStatusResponseCodes.TX_SENT | InvoiceStatusResponseCodes.PAID,
|
|
89
|
+
msg: string,
|
|
90
|
+
data: {
|
|
91
|
+
txId: string
|
|
92
|
+
}
|
|
93
|
+
} | {
|
|
94
|
+
code: Exclude<InvoiceStatusResponseCodes, InvoiceStatusResponseCodes.TX_SENT | InvoiceStatusResponseCodes.PAID>,
|
|
95
|
+
msg: string
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export type TrustedFromBTCLNInit = {
|
|
99
|
+
address: string,
|
|
100
|
+
amount: bigint,
|
|
101
|
+
token: string
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const TrustedFromBTCLNResponseSchema = {
|
|
105
|
+
pr: FieldTypeEnum.String,
|
|
106
|
+
swapFee: FieldTypeEnum.BigInt,
|
|
107
|
+
total: FieldTypeEnum.BigInt
|
|
108
|
+
} as const;
|
|
109
|
+
|
|
110
|
+
export type TrustedFromBTCLNResponseType = RequestSchemaResult<typeof TrustedFromBTCLNResponseSchema>;
|
|
111
|
+
|
|
112
|
+
export class TrustedIntermediaryAPI {
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Fetches the invoice status from the intermediary node
|
|
116
|
+
*
|
|
117
|
+
* @param url Url of the trusted intermediary
|
|
118
|
+
* @param paymentHash Payment hash of the lightning invoice
|
|
119
|
+
* @param timeout Timeout in milliseconds
|
|
120
|
+
* @param abortSignal
|
|
121
|
+
* @throws {RequestError} if non-200 http response is returned
|
|
122
|
+
*/
|
|
123
|
+
static async getInvoiceStatus(
|
|
124
|
+
url: string,
|
|
125
|
+
paymentHash: string,
|
|
126
|
+
timeout?: number,
|
|
127
|
+
abortSignal?: AbortSignal
|
|
128
|
+
): Promise<InvoiceStatusResponse> {
|
|
129
|
+
return tryWithRetries(() => httpGet<InvoiceStatusResponse>(
|
|
130
|
+
url+"/getInvoiceStatus?paymentHash="+encodeURIComponent(paymentHash),
|
|
131
|
+
timeout, abortSignal
|
|
132
|
+
), undefined, RequestError, abortSignal);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Initiate a trusted swap from BTCLN to SC native currency, retries!
|
|
137
|
+
*
|
|
138
|
+
* @param chainIdentifier
|
|
139
|
+
* @param baseUrl Base url of the trusted swap intermediary
|
|
140
|
+
* @param init Initialization parameters
|
|
141
|
+
* @param timeout Timeout in milliseconds for the request
|
|
142
|
+
* @param abortSignal
|
|
143
|
+
* @throws {RequestError} If the response is non-200
|
|
144
|
+
*/
|
|
145
|
+
static async initTrustedFromBTCLN(
|
|
146
|
+
chainIdentifier: string,
|
|
147
|
+
baseUrl: string,
|
|
148
|
+
init: TrustedFromBTCLNInit,
|
|
149
|
+
timeout?: number,
|
|
150
|
+
abortSignal?: AbortSignal
|
|
151
|
+
): Promise<TrustedFromBTCLNResponseType> {
|
|
152
|
+
const resp = await tryWithRetries(
|
|
153
|
+
() => httpGet<{code: number, msg: string, data?: any}>(
|
|
154
|
+
baseUrl+"/lnforgas/createInvoice" +
|
|
155
|
+
"?address="+encodeURIComponent(init.address) +
|
|
156
|
+
"&amount="+encodeURIComponent(init.amount.toString(10))+
|
|
157
|
+
"&chain="+encodeURIComponent(chainIdentifier)+
|
|
158
|
+
"&token="+encodeURIComponent(init.token),
|
|
159
|
+
timeout,
|
|
160
|
+
abortSignal
|
|
161
|
+
), undefined, RequestError, abortSignal
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
if(resp.code!==10000) throw RequestError.parse(JSON.stringify(resp), 400);
|
|
165
|
+
const res = verifySchema(resp.data, TrustedFromBTCLNResponseSchema);
|
|
166
|
+
if(res==null) throw new Error("Invalid response returned from LP");
|
|
167
|
+
return res;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Fetches the address status from the intermediary node
|
|
172
|
+
*
|
|
173
|
+
* @param url Url of the trusted intermediary
|
|
174
|
+
* @param paymentHash Payment hash of the swap
|
|
175
|
+
* @param sequence Sequence number of the swap
|
|
176
|
+
* @param timeout Timeout in milliseconds
|
|
177
|
+
* @param abortSignal
|
|
178
|
+
* @throws {RequestError} if non-200 http response is returned
|
|
179
|
+
*/
|
|
180
|
+
static async getAddressStatus(
|
|
181
|
+
url: string,
|
|
182
|
+
paymentHash: string,
|
|
183
|
+
sequence: bigint,
|
|
184
|
+
timeout?: number,
|
|
185
|
+
abortSignal?: AbortSignal
|
|
186
|
+
): Promise<AddressStatusResponse> {
|
|
187
|
+
return tryWithRetries(() => httpGet<AddressStatusResponse>(
|
|
188
|
+
url+"/getAddressStatus?paymentHash="+encodeURIComponent(paymentHash)+"&sequence="+encodeURIComponent(sequence.toString(10)),
|
|
189
|
+
timeout, abortSignal
|
|
190
|
+
), undefined, RequestError, abortSignal);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Sets the refund address for an on-chain gas swap
|
|
195
|
+
*
|
|
196
|
+
* @param url Url of the trusted intermediary
|
|
197
|
+
* @param paymentHash Payment hash of the swap
|
|
198
|
+
* @param sequence Sequence number of the swap
|
|
199
|
+
* @param refundAddress Refund address to set for the swap
|
|
200
|
+
* @param timeout Timeout in milliseconds
|
|
201
|
+
* @param abortSignal
|
|
202
|
+
* @throws {RequestError} if non-200 http response is returned
|
|
203
|
+
*/
|
|
204
|
+
static async setRefundAddress(
|
|
205
|
+
url: string,
|
|
206
|
+
paymentHash: string,
|
|
207
|
+
sequence: bigint,
|
|
208
|
+
refundAddress: string,
|
|
209
|
+
timeout?: number,
|
|
210
|
+
abortSignal?: AbortSignal
|
|
211
|
+
): Promise<void> {
|
|
212
|
+
return tryWithRetries(() => httpGet<void>(
|
|
213
|
+
url+"/setRefundAddress" +
|
|
214
|
+
"?paymentHash="+encodeURIComponent(paymentHash)+
|
|
215
|
+
"&sequence="+encodeURIComponent(sequence.toString(10))+
|
|
216
|
+
"&refundAddress="+encodeURIComponent(refundAddress),
|
|
217
|
+
timeout, abortSignal
|
|
218
|
+
), undefined, RequestError, abortSignal);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Initiate a trusted swap from BTC to SC native currency, retries!
|
|
223
|
+
*
|
|
224
|
+
* @param chainIdentifier
|
|
225
|
+
* @param baseUrl Base url of the trusted swap intermediary
|
|
226
|
+
* @param init Initialization parameters
|
|
227
|
+
* @param timeout Timeout in milliseconds for the request
|
|
228
|
+
* @param abortSignal
|
|
229
|
+
* @throws {RequestError} If the response is non-200
|
|
230
|
+
*/
|
|
231
|
+
static async initTrustedFromBTC(
|
|
232
|
+
chainIdentifier: string,
|
|
233
|
+
baseUrl: string,
|
|
234
|
+
init: TrustedFromBTCInit,
|
|
235
|
+
timeout?: number,
|
|
236
|
+
abortSignal?: AbortSignal
|
|
237
|
+
): Promise<TrustedFromBTCResponseType> {
|
|
238
|
+
const resp = await tryWithRetries(
|
|
239
|
+
() => httpGet<{code: number, msg: string, data?: any}>(
|
|
240
|
+
baseUrl+"/frombtc_trusted/getAddress?chain="+encodeURIComponent(chainIdentifier)+
|
|
241
|
+
"&address="+encodeURIComponent(init.address)+
|
|
242
|
+
"&amount="+encodeURIComponent(init.amount.toString(10))+
|
|
243
|
+
(init.refundAddress==null ? "" : "&refundAddress="+encodeURIComponent(init.refundAddress))+
|
|
244
|
+
"&exactIn=true"+
|
|
245
|
+
"&token="+encodeURIComponent(init.token),
|
|
246
|
+
timeout,
|
|
247
|
+
abortSignal
|
|
248
|
+
), undefined, RequestError, abortSignal
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
if(resp.code!==10000) throw RequestError.parse(JSON.stringify(resp), 400);
|
|
252
|
+
const res = verifySchema(resp.data, TrustedFromBTCResponseSchema);
|
|
253
|
+
if(res==null) throw new Error("Invalid response returned from LP");
|
|
254
|
+
return res;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import {RequestError} from "../errors/RequestError";
|
|
2
|
+
import {decode as bolt11Decode, PaymentRequestObject, TagsObject} from "@atomiqlabs/bolt11";
|
|
3
|
+
import {UserError} from "../errors/UserError";
|
|
4
|
+
import {bech32} from "@scure/base";
|
|
5
|
+
import {cbc} from "@noble/ciphers/aes";
|
|
6
|
+
import {Buffer} from "buffer";
|
|
7
|
+
import {sha256} from "@noble/hashes/sha2";
|
|
8
|
+
import {httpGet} from "../http/HttpUtils";
|
|
9
|
+
import {
|
|
10
|
+
isLNURLWithdrawParams,
|
|
11
|
+
LNURLWithdraw,
|
|
12
|
+
LNURLWithdrawParams,
|
|
13
|
+
LNURLWithdrawParamsWithUrl
|
|
14
|
+
} from "../types/lnurl/LNURLWithdraw";
|
|
15
|
+
import {
|
|
16
|
+
isLNURLPayParams,
|
|
17
|
+
LNURLDecodedSuccessAction,
|
|
18
|
+
LNURLPay,
|
|
19
|
+
LNURLPayParams,
|
|
20
|
+
LNURLPayParamsWithUrl
|
|
21
|
+
} from "../types/lnurl/LNURLPay";
|
|
22
|
+
import {tryWithRetries} from "../utils/RetryUtils";
|
|
23
|
+
|
|
24
|
+
type LNURLOk = {
|
|
25
|
+
status: "OK"
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type LNURLError = {
|
|
29
|
+
status: "ERROR",
|
|
30
|
+
reason?: string
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
function isLNURLError(obj: any): obj is LNURLError {
|
|
34
|
+
return obj.status==="ERROR" &&
|
|
35
|
+
(obj.reason==null || typeof obj.reason==="string");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
type LNURLPayResult = {
|
|
39
|
+
pr: string;
|
|
40
|
+
successAction: LNURLPaySuccessAction | null;
|
|
41
|
+
disposable: boolean | null;
|
|
42
|
+
routes: [];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isLNURLPayResult(obj: any, domain?: string): obj is LNURLPayResult {
|
|
46
|
+
return typeof obj.pr === "string" &&
|
|
47
|
+
(obj.routes == null || Array.isArray(obj.routes)) &&
|
|
48
|
+
(obj.disposable === null || obj.disposable === undefined || typeof obj.disposable === "boolean") &&
|
|
49
|
+
(obj.successAction == null || isLNURLPaySuccessAction(obj.successAction, domain));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type LNURLPaySuccessAction = {
|
|
53
|
+
tag: string;
|
|
54
|
+
description: string | null;
|
|
55
|
+
url: string | null;
|
|
56
|
+
message: string | null;
|
|
57
|
+
ciphertext: string | null;
|
|
58
|
+
iv: string | null;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export function isLNURLPaySuccessAction(obj: any, domain?: string): obj is LNURLPaySuccessAction {
|
|
62
|
+
if(obj==null || typeof obj !== 'object' || typeof obj.tag !== 'string') return false;
|
|
63
|
+
switch(obj.tag) {
|
|
64
|
+
case "message":
|
|
65
|
+
return obj.message!=null && obj.message.length<=144;
|
|
66
|
+
case "url":
|
|
67
|
+
return obj.description!=null && obj.description.length<=144 &&
|
|
68
|
+
obj.url!=null &&
|
|
69
|
+
(domain==null || new URL(obj.url).hostname===domain);
|
|
70
|
+
case "aes":
|
|
71
|
+
return obj.description!=null && obj.description.length<=144 &&
|
|
72
|
+
obj.ciphertext!=null && obj.ciphertext.length<=4096 && BASE64_REGEX.test(obj.ciphertext) &&
|
|
73
|
+
obj.iv!=null && obj.iv.length<=24 && BASE64_REGEX.test(obj.iv);
|
|
74
|
+
default:
|
|
75
|
+
//Unsupported action
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const BASE64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
|
|
81
|
+
const MAIL_REGEX = /(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[A-z0-9](?:[A-z0-9-]*[A-z0-9])?\.)+[A-z0-9](?:[A-z0-9-]*[A-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[A-z0-9-]*[A-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* LNURL encoding/decoding and callback handling
|
|
85
|
+
* @category Bitcoin
|
|
86
|
+
*/
|
|
87
|
+
export class LNURL {
|
|
88
|
+
|
|
89
|
+
private static findBech32LNURL(str: string) {
|
|
90
|
+
const arr = /,*?((lnurl)([0-9]{1,}[a-z0-9]+){1})/.exec(str.toLowerCase());
|
|
91
|
+
if(arr==null) return null;
|
|
92
|
+
return arr[1];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private static isBech32LNURL(str: string): boolean {
|
|
96
|
+
return this.findBech32LNURL(str)!=null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Checks whether a provided string is bare (non bech32 encoded) lnurl
|
|
101
|
+
* @param str
|
|
102
|
+
* @private
|
|
103
|
+
*/
|
|
104
|
+
private static isBareLNURL(str: string): boolean {
|
|
105
|
+
try {
|
|
106
|
+
return str.startsWith("lnurlw://") || str.startsWith("lnurlp://");
|
|
107
|
+
} catch(e) {}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Checks if the provided string is a lightning network address (e.g. satoshi@nakamoto.com)
|
|
113
|
+
* @param str
|
|
114
|
+
* @private
|
|
115
|
+
*/
|
|
116
|
+
private static isLightningAddress(str: string): boolean {
|
|
117
|
+
return MAIL_REGEX.test(str);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Checks whether a given string is a LNURL or lightning address
|
|
122
|
+
* @param str
|
|
123
|
+
*/
|
|
124
|
+
static isLNURL(str: string): boolean {
|
|
125
|
+
return LNURL.isBech32LNURL(str) || LNURL.isLightningAddress(str) || LNURL.isBareLNURL(str);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Extracts the URL that needs to be request from LNURL or lightning address
|
|
130
|
+
* @param str
|
|
131
|
+
* @private
|
|
132
|
+
* @returns An URL to send the request to, or null if it cannot be parsed
|
|
133
|
+
*/
|
|
134
|
+
private static extractCallUrl(str: string): string | null {
|
|
135
|
+
if(MAIL_REGEX.test(str)) {
|
|
136
|
+
//lightning e-mail like address
|
|
137
|
+
const arr = str.split("@");
|
|
138
|
+
const username = arr[0];
|
|
139
|
+
const domain = arr[1];
|
|
140
|
+
let scheme = "https";
|
|
141
|
+
if(domain.endsWith(".onion")) {
|
|
142
|
+
scheme = "http";
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return scheme+"://"+domain+"/.well-known/lnurlp/"+username;
|
|
146
|
+
} else if(LNURL.isBareLNURL(str)) {
|
|
147
|
+
//non-bech32m encoded lnurl
|
|
148
|
+
const data = str.substring("lnurlw://".length);
|
|
149
|
+
const httpUrl = new URL("http://"+data);
|
|
150
|
+
|
|
151
|
+
let scheme = "https";
|
|
152
|
+
if(httpUrl.hostname.endsWith(".onion")) {
|
|
153
|
+
scheme = "http";
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return scheme+"://"+data;
|
|
157
|
+
} else {
|
|
158
|
+
const lnurl = LNURL.findBech32LNURL(str);
|
|
159
|
+
|
|
160
|
+
if(lnurl!=null) {
|
|
161
|
+
let { prefix: hrp, words: dataPart } = bech32.decode(lnurl as any, 2000);
|
|
162
|
+
let requestByteArray = bech32.fromWords(dataPart);
|
|
163
|
+
|
|
164
|
+
return Buffer.from(requestByteArray).toString();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Sends a request to obtain data about a specific LNURL or lightning address
|
|
172
|
+
*
|
|
173
|
+
* @param str A lnurl or lightning address
|
|
174
|
+
* @param shouldRetry Whether we should retry in case of network failure
|
|
175
|
+
* @param timeout Request timeout in milliseconds
|
|
176
|
+
* @param abortSignal
|
|
177
|
+
*/
|
|
178
|
+
static async getLNURL(
|
|
179
|
+
str: string,
|
|
180
|
+
shouldRetry: boolean = true,
|
|
181
|
+
timeout?: number,
|
|
182
|
+
abortSignal?: AbortSignal
|
|
183
|
+
) : Promise<LNURLPayParamsWithUrl | LNURLWithdrawParamsWithUrl | null> {
|
|
184
|
+
if(shouldRetry==null) shouldRetry = true;
|
|
185
|
+
|
|
186
|
+
const url = LNURL.extractCallUrl(str);
|
|
187
|
+
if(url==null) return null;
|
|
188
|
+
|
|
189
|
+
const sendRequest =
|
|
190
|
+
() => httpGet<LNURLPayParams | LNURLWithdrawParams | LNURLError>(url, timeout, abortSignal, true);
|
|
191
|
+
|
|
192
|
+
let response = shouldRetry ?
|
|
193
|
+
await tryWithRetries(sendRequest, undefined, RequestError, abortSignal) :
|
|
194
|
+
await sendRequest();
|
|
195
|
+
|
|
196
|
+
if(isLNURLError(response)) return null;
|
|
197
|
+
|
|
198
|
+
if(response.tag==="payRequest") try {
|
|
199
|
+
response.decodedMetadata = JSON.parse(response.metadata)
|
|
200
|
+
} catch (err) {
|
|
201
|
+
response.decodedMetadata = []
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if(!isLNURLPayParams(response) && !isLNURLWithdrawParams(response)) return null;
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
...response,
|
|
208
|
+
url: str
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Sends a request to obtain data about a specific LNURL or lightning address
|
|
214
|
+
*
|
|
215
|
+
* @param str A lnurl or lightning address
|
|
216
|
+
* @param shouldRetry Whether we should retry in case of network failure
|
|
217
|
+
* @param timeout Request timeout in milliseconds
|
|
218
|
+
* @param abortSignal
|
|
219
|
+
*/
|
|
220
|
+
static async getLNURLType(str: string, shouldRetry?: boolean, timeout?: number, abortSignal?: AbortSignal): Promise<LNURLPay | LNURLWithdraw | null> {
|
|
221
|
+
let res: any = await LNURL.getLNURL(str, shouldRetry, timeout, abortSignal);
|
|
222
|
+
|
|
223
|
+
if(res.tag==="payRequest") {
|
|
224
|
+
const payRequest: LNURLPayParamsWithUrl = res;
|
|
225
|
+
let shortDescription: string | undefined = undefined;
|
|
226
|
+
let longDescription: string | undefined = undefined;
|
|
227
|
+
let icon: string | undefined = undefined;
|
|
228
|
+
payRequest.decodedMetadata.forEach(data => {
|
|
229
|
+
switch(data[0]) {
|
|
230
|
+
case "text/plain":
|
|
231
|
+
shortDescription = data[1];
|
|
232
|
+
break;
|
|
233
|
+
case "text/long-desc":
|
|
234
|
+
longDescription = data[1];
|
|
235
|
+
break;
|
|
236
|
+
case "image/png;base64":
|
|
237
|
+
icon = "data:"+data[0]+","+data[1];
|
|
238
|
+
break;
|
|
239
|
+
case "image/jpeg;base64":
|
|
240
|
+
icon = "data:"+data[0]+","+data[1];
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
return {
|
|
245
|
+
type: "pay",
|
|
246
|
+
min: BigInt(payRequest.minSendable) / 1000n,
|
|
247
|
+
max: BigInt(payRequest.maxSendable) / 1000n,
|
|
248
|
+
commentMaxLength: payRequest.commentAllowed || 0,
|
|
249
|
+
shortDescription,
|
|
250
|
+
longDescription,
|
|
251
|
+
icon,
|
|
252
|
+
params: payRequest
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if(res.tag==="withdrawRequest") {
|
|
256
|
+
const payRequest: LNURLWithdrawParamsWithUrl = res;
|
|
257
|
+
return {
|
|
258
|
+
type: "withdraw",
|
|
259
|
+
min: BigInt(payRequest.minWithdrawable) / 1000n,
|
|
260
|
+
max: BigInt(payRequest.maxWithdrawable) / 1000n,
|
|
261
|
+
params: payRequest
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Uses a LNURL-pay request by obtaining a lightning network invoice from it
|
|
269
|
+
*
|
|
270
|
+
* @param payRequest LNURL params as returned from the getLNURL call
|
|
271
|
+
* @param amount Amount of sats (BTC) to pay
|
|
272
|
+
* @param comment Optional comment for the payment request
|
|
273
|
+
* @param timeout Request timeout in milliseconds
|
|
274
|
+
* @param abortSignal
|
|
275
|
+
* @throws {RequestError} If the response is non-200, status: ERROR, or invalid format
|
|
276
|
+
*/
|
|
277
|
+
static async useLNURLPay(
|
|
278
|
+
payRequest: LNURLPayParamsWithUrl,
|
|
279
|
+
amount: bigint,
|
|
280
|
+
comment?: string,
|
|
281
|
+
timeout?: number,
|
|
282
|
+
abortSignal?: AbortSignal
|
|
283
|
+
): Promise<{
|
|
284
|
+
invoice: string,
|
|
285
|
+
parsedInvoice: PaymentRequestObject & { tagsObject: TagsObject; },
|
|
286
|
+
successAction?: LNURLPaySuccessAction
|
|
287
|
+
}> {
|
|
288
|
+
const params = ["amount="+(amount * 1000n).toString(10)];
|
|
289
|
+
if(comment!=null) {
|
|
290
|
+
params.push("comment="+encodeURIComponent(comment));
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const queryParams = (payRequest.callback.includes("?") ? "&" : "?")+params.join("&");
|
|
294
|
+
|
|
295
|
+
const response = await tryWithRetries(
|
|
296
|
+
() => httpGet<LNURLPayResult | LNURLError>(payRequest.callback+queryParams, timeout, abortSignal, true),
|
|
297
|
+
undefined, RequestError, abortSignal
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
if(isLNURLError(response)) throw new RequestError("LNURL callback error: "+response.reason, 200);
|
|
301
|
+
if(!isLNURLPayResult(response)) throw new RequestError("Invalid LNURL response!", 200);
|
|
302
|
+
|
|
303
|
+
const parsedPR = bolt11Decode(response.pr);
|
|
304
|
+
|
|
305
|
+
const descHash = Buffer.from(sha256(payRequest.metadata)).toString("hex");
|
|
306
|
+
if(parsedPR.tagsObject.purpose_commit_hash!==descHash)
|
|
307
|
+
throw new RequestError("Invalid invoice received (description hash)!", 200);
|
|
308
|
+
|
|
309
|
+
const msats = parsedPR.millisatoshis;
|
|
310
|
+
if(msats==null)
|
|
311
|
+
throw new RequestError("Invalid invoice received (amount msats not defined)", 200);
|
|
312
|
+
const invoiceMSats = BigInt(msats);
|
|
313
|
+
if(invoiceMSats !== (amount * 1000n))
|
|
314
|
+
throw new RequestError("Invalid invoice received (amount)!", 200);
|
|
315
|
+
|
|
316
|
+
return {
|
|
317
|
+
invoice: response.pr,
|
|
318
|
+
parsedInvoice: parsedPR,
|
|
319
|
+
successAction: response.successAction ?? undefined
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Submits the bolt11 lightning invoice to the lnurl withdraw url
|
|
325
|
+
*
|
|
326
|
+
* @param withdrawRequest Withdraw request to use
|
|
327
|
+
* @param withdrawRequest.k1 K1 parameter
|
|
328
|
+
* @param withdrawRequest.callback A URL to call
|
|
329
|
+
* @param lnpr bolt11 lightning network invoice to submit to the withdrawal endpoint
|
|
330
|
+
* @throws {RequestError} If the response is non-200 or status: ERROR
|
|
331
|
+
*/
|
|
332
|
+
static async postInvoiceToLNURLWithdraw(
|
|
333
|
+
withdrawRequest: {k1: string, callback: string},
|
|
334
|
+
lnpr: string
|
|
335
|
+
): Promise<void> {
|
|
336
|
+
const params = [
|
|
337
|
+
"pr="+lnpr,
|
|
338
|
+
"k1="+withdrawRequest.k1
|
|
339
|
+
];
|
|
340
|
+
const queryParams = (withdrawRequest.callback.includes("?") ? "&" : "?")+params.join("&");
|
|
341
|
+
|
|
342
|
+
const response = await tryWithRetries(
|
|
343
|
+
() => httpGet<LNURLOk | LNURLError>(withdrawRequest.callback+queryParams, undefined, undefined, true),
|
|
344
|
+
undefined, RequestError
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
if(isLNURLError(response)) throw new RequestError("LNURL callback error: " + response.reason, 200);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Uses a LNURL-withdraw request by submitting a lightning network invoice to it
|
|
352
|
+
*
|
|
353
|
+
* @param withdrawRequest Withdrawal request as returned from getLNURL call
|
|
354
|
+
* @param lnpr bolt11 lightning network invoice to submit to the withdrawal endpoint
|
|
355
|
+
* @throws {UserError} In case the provided bolt11 lightning invoice has an amount that is out of bounds for
|
|
356
|
+
* the specified LNURL-withdraw request
|
|
357
|
+
*/
|
|
358
|
+
static async useLNURLWithdraw(
|
|
359
|
+
withdrawRequest: LNURLWithdrawParamsWithUrl,
|
|
360
|
+
lnpr: string
|
|
361
|
+
): Promise<void> {
|
|
362
|
+
const min = BigInt(withdrawRequest.minWithdrawable) / 1000n;
|
|
363
|
+
const max = BigInt(withdrawRequest.maxWithdrawable) / 1000n;
|
|
364
|
+
|
|
365
|
+
const parsedPR = bolt11Decode(lnpr);
|
|
366
|
+
const msats = parsedPR.millisatoshis;
|
|
367
|
+
if(msats==null) throw new UserError("Invoice without msats value field!");
|
|
368
|
+
const amount = (BigInt(msats) + 999n) / 1000n;
|
|
369
|
+
if(amount < min) throw new UserError("Invoice amount less than minimum LNURL-withdraw limit");
|
|
370
|
+
if(amount > max) throw new UserError("Invoice amount more than maximum LNURL-withdraw limit");
|
|
371
|
+
|
|
372
|
+
return await LNURL.postInvoiceToLNURLWithdraw(withdrawRequest, lnpr);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
static decodeSuccessAction(successAction?: LNURLPaySuccessAction | null, secret?: string | null): LNURLDecodedSuccessAction | null {
|
|
376
|
+
if(secret==null) return null;
|
|
377
|
+
if(successAction==null) return null;
|
|
378
|
+
if(successAction.tag==="message" && successAction.message!=null) {
|
|
379
|
+
return {
|
|
380
|
+
description: successAction.message
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
if(successAction.tag==="url" && successAction.description!=null && successAction.url!=null) {
|
|
384
|
+
return {
|
|
385
|
+
description: successAction.description,
|
|
386
|
+
url: successAction.url
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
if(successAction.tag==="aes" && successAction.iv!=null && successAction.ciphertext!=null && successAction.description!=null) {
|
|
390
|
+
const CBC = cbc(Buffer.from(secret, "hex"), Buffer.from(successAction.iv, "hex"));
|
|
391
|
+
let plaintext = CBC.decrypt(Buffer.from(successAction.ciphertext, "base64"));
|
|
392
|
+
// remove padding
|
|
393
|
+
const size = plaintext.length;
|
|
394
|
+
const pad = plaintext[size - 1];
|
|
395
|
+
return {
|
|
396
|
+
description: successAction.description,
|
|
397
|
+
text: Buffer.from(plaintext).toString("utf8", 0, size - pad)
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
}
|