@atomiqlabs/sdk 7.0.12 → 8.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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} +37 -19
- 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} +113 -72
- 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,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IEscrowSwap = exports.isIEscrowSwapInit = void 0;
|
|
4
|
+
const ISwap_1 = require("../ISwap");
|
|
5
|
+
const base_1 = require("@atomiqlabs/base");
|
|
6
|
+
const buffer_1 = require("buffer");
|
|
7
|
+
const TimeoutUtils_1 = require("../../utils/TimeoutUtils");
|
|
8
|
+
function isIEscrowSwapInit(obj) {
|
|
9
|
+
return typeof obj === 'object' &&
|
|
10
|
+
(obj.data == null || typeof obj.data === 'object') &&
|
|
11
|
+
(0, ISwap_1.isISwapInit)(obj);
|
|
12
|
+
}
|
|
13
|
+
exports.isIEscrowSwapInit = isIEscrowSwapInit;
|
|
14
|
+
class IEscrowSwap extends ISwap_1.ISwap {
|
|
15
|
+
constructor(wrapper, swapInitOrObj) {
|
|
16
|
+
super(wrapper, swapInitOrObj);
|
|
17
|
+
if (isIEscrowSwapInit(swapInitOrObj)) {
|
|
18
|
+
this.data = swapInitOrObj.data;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
if (swapInitOrObj.data != null)
|
|
22
|
+
this.data = new wrapper.swapDataDeserializer(swapInitOrObj.data);
|
|
23
|
+
this.commitTxId = swapInitOrObj.commitTxId;
|
|
24
|
+
this.claimTxId = swapInitOrObj.claimTxId;
|
|
25
|
+
this.refundTxId = swapInitOrObj.refundTxId;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//////////////////////////////
|
|
29
|
+
//// Identifiers
|
|
30
|
+
/**
|
|
31
|
+
* Returns the identification hash of the swap, usually claim data hash, but can be overriden, e.g. for
|
|
32
|
+
* lightning swaps the identifier hash is used instead of claim data hash
|
|
33
|
+
*/
|
|
34
|
+
getIdentifierHash() {
|
|
35
|
+
const claimHashBuffer = buffer_1.Buffer.from(this.getClaimHash(), "hex");
|
|
36
|
+
if (this.randomNonce == null)
|
|
37
|
+
return claimHashBuffer;
|
|
38
|
+
return buffer_1.Buffer.concat([claimHashBuffer, buffer_1.Buffer.from(this.randomNonce, "hex")]);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns the identification hash of the swap, usually claim data hash, but can be overriden, e.g. for
|
|
42
|
+
* lightning swaps the identifier hash is used instead of claim data hash
|
|
43
|
+
*/
|
|
44
|
+
getIdentifierHashString() {
|
|
45
|
+
const identifierHash = this.getIdentifierHash();
|
|
46
|
+
return identifierHash.toString("hex");
|
|
47
|
+
}
|
|
48
|
+
_getEscrowHash() {
|
|
49
|
+
return this.data?.getEscrowHash() ?? null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns the escrow hash - i.e. hash of the escrow data
|
|
53
|
+
*/
|
|
54
|
+
getEscrowHash() {
|
|
55
|
+
return this._getEscrowHash();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Returns the claim data hash - i.e. hash passed to the claim handler
|
|
59
|
+
*/
|
|
60
|
+
getClaimHash() {
|
|
61
|
+
return this.getSwapData().getClaimHash();
|
|
62
|
+
}
|
|
63
|
+
getId() {
|
|
64
|
+
return this.getIdentifierHashString();
|
|
65
|
+
}
|
|
66
|
+
//////////////////////////////
|
|
67
|
+
//// Watchdogs
|
|
68
|
+
/**
|
|
69
|
+
* Periodically checks the chain to see whether the swap is committed
|
|
70
|
+
*
|
|
71
|
+
* @param intervalSeconds How often to check (in seconds), default to 5s
|
|
72
|
+
* @param abortSignal
|
|
73
|
+
* @protected
|
|
74
|
+
*/
|
|
75
|
+
async watchdogWaitTillCommited(intervalSeconds, abortSignal) {
|
|
76
|
+
if (this.data == null)
|
|
77
|
+
throw new Error("Tried to await commitment but data is null, invalid state?");
|
|
78
|
+
intervalSeconds ??= 5;
|
|
79
|
+
let status = { type: base_1.SwapCommitStateType.NOT_COMMITED };
|
|
80
|
+
while (status?.type === base_1.SwapCommitStateType.NOT_COMMITED) {
|
|
81
|
+
await (0, TimeoutUtils_1.timeoutPromise)(intervalSeconds * 1000, abortSignal);
|
|
82
|
+
try {
|
|
83
|
+
status = await this.wrapper.contract.getCommitStatus(this._getInitiator(), this.data);
|
|
84
|
+
if (status?.type === base_1.SwapCommitStateType.NOT_COMMITED &&
|
|
85
|
+
await this._verifyQuoteDefinitelyExpired())
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
this.logger.error("watchdogWaitTillCommited(): Error when fetching commit status or signature expiry: ", e);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (abortSignal != null)
|
|
93
|
+
abortSignal.throwIfAborted();
|
|
94
|
+
return status?.type !== base_1.SwapCommitStateType.EXPIRED;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Periodically checks the chain to see whether the swap was finished (claimed or refunded)
|
|
98
|
+
*
|
|
99
|
+
* @param intervalSeconds How often to check (in seconds), default to 5s
|
|
100
|
+
* @param abortSignal
|
|
101
|
+
* @protected
|
|
102
|
+
*/
|
|
103
|
+
async watchdogWaitTillResult(intervalSeconds, abortSignal) {
|
|
104
|
+
if (this.data == null)
|
|
105
|
+
throw new Error("Tried to await result but data is null, invalid state?");
|
|
106
|
+
intervalSeconds ??= 5;
|
|
107
|
+
let status = { type: base_1.SwapCommitStateType.COMMITED };
|
|
108
|
+
while (status?.type === base_1.SwapCommitStateType.COMMITED || status?.type === base_1.SwapCommitStateType.REFUNDABLE) {
|
|
109
|
+
await (0, TimeoutUtils_1.timeoutPromise)(intervalSeconds * 1000, abortSignal);
|
|
110
|
+
try {
|
|
111
|
+
status = await this.wrapper.contract.getCommitStatus(this._getInitiator(), this.data);
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
this.logger.error("watchdogWaitTillResult(): Error when fetching commit status: ", e);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (abortSignal != null)
|
|
118
|
+
abortSignal.throwIfAborted();
|
|
119
|
+
return status;
|
|
120
|
+
}
|
|
121
|
+
serialize() {
|
|
122
|
+
return {
|
|
123
|
+
...super.serialize(),
|
|
124
|
+
data: this.data != null ? this.data.serialize() : null,
|
|
125
|
+
commitTxId: this.commitTxId,
|
|
126
|
+
claimTxId: this.claimTxId,
|
|
127
|
+
refundTxId: this.refundTxId
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
;
|
|
131
|
+
}
|
|
132
|
+
exports.IEscrowSwap = IEscrowSwap;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ISwapWrapper, ISwapWrapperOptions, SwapTypeDefinition, WrapperCtorTokens } from "../ISwapWrapper";
|
|
3
|
+
import { ChainType, ClaimEvent, InitializeEvent, RefundEvent, SignatureData, SwapCommitState, SwapEvent } from "@atomiqlabs/base";
|
|
4
|
+
import { ISwap } from "../ISwap";
|
|
5
|
+
import { UnifiedSwapStorage } from "../../storage/UnifiedSwapStorage";
|
|
6
|
+
import { UnifiedSwapEventListener } from "../../events/UnifiedSwapEventListener";
|
|
7
|
+
import { ISwapPrice } from "../../prices/abstract/ISwapPrice";
|
|
8
|
+
import { EventEmitter } from "events";
|
|
9
|
+
import { SwapType } from "../../enums/SwapType";
|
|
10
|
+
import { IEscrowSwap } from "./IEscrowSwap";
|
|
11
|
+
import { Intermediary } from "../../intermediaries/Intermediary";
|
|
12
|
+
export type IEscrowSwapDefinition<T extends ChainType, W extends IEscrowSwapWrapper<T, any>, S extends IEscrowSwap<T>> = SwapTypeDefinition<T, W, S>;
|
|
13
|
+
export declare abstract class IEscrowSwapWrapper<T extends ChainType, D extends IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, D>, IEscrowSwap<T, D>>, O extends ISwapWrapperOptions = ISwapWrapperOptions> extends ISwapWrapper<T, D, O> {
|
|
14
|
+
readonly abstract TYPE: SwapType;
|
|
15
|
+
readonly contract: T["Contract"];
|
|
16
|
+
readonly swapDataDeserializer: new (data: any) => T["Data"];
|
|
17
|
+
constructor(chainIdentifier: string, unifiedStorage: UnifiedSwapStorage<T>, unifiedChainEvents: UnifiedSwapEventListener<T>, chain: T["ChainInterface"], contract: T["Contract"], prices: ISwapPrice, tokens: WrapperCtorTokens, swapDataDeserializer: new (data: any) => T["Data"], options: O, events?: EventEmitter<{
|
|
18
|
+
swapState: [ISwap];
|
|
19
|
+
}>);
|
|
20
|
+
/**
|
|
21
|
+
* Pre-fetches signature verification data from the server's pre-sent promise, doesn't throw, instead returns null
|
|
22
|
+
*
|
|
23
|
+
* @param signDataPrefetch Promise that resolves when we receive "signDataPrefetch" from the LP in streaming mode
|
|
24
|
+
* @protected
|
|
25
|
+
* @returns Pre-fetched signature verification data or null if failed
|
|
26
|
+
*/
|
|
27
|
+
protected preFetchSignData(signDataPrefetch: Promise<any | null>): Promise<T["PreFetchVerification"] | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* Verifies swap initialization signature returned by the intermediary
|
|
30
|
+
*
|
|
31
|
+
* @param initiator A smart chain account initiating the swap
|
|
32
|
+
* @param data Parsed swap data from the intermediary
|
|
33
|
+
* @param signature Response of the intermediary
|
|
34
|
+
* @param feeRatePromise Pre-fetched fee rate promise
|
|
35
|
+
* @param preFetchSignatureVerificationData Pre-fetched signature verification data
|
|
36
|
+
* @param abortSignal
|
|
37
|
+
* @protected
|
|
38
|
+
* @returns Swap initialization signature expiry
|
|
39
|
+
* @throws {SignatureVerificationError} when swap init signature is invalid
|
|
40
|
+
*/
|
|
41
|
+
protected verifyReturnedSignature(initiator: string, data: T["Data"], signature: SignatureData, feeRatePromise: Promise<any>, preFetchSignatureVerificationData: Promise<any>, abortSignal?: AbortSignal): Promise<number>;
|
|
42
|
+
/**
|
|
43
|
+
* Processes InitializeEvent for a given swap
|
|
44
|
+
* @param swap
|
|
45
|
+
* @param event
|
|
46
|
+
* @protected
|
|
47
|
+
* @returns Whether the swap was updated/changed
|
|
48
|
+
*/
|
|
49
|
+
protected abstract processEventInitialize(swap: D["Swap"], event: InitializeEvent<T["Data"]>): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Processes ClaimEvent for a given swap
|
|
52
|
+
* @param swap
|
|
53
|
+
* @param event
|
|
54
|
+
* @protected
|
|
55
|
+
* @returns Whether the swap was updated/changed
|
|
56
|
+
*/
|
|
57
|
+
protected abstract processEventClaim(swap: D["Swap"], event: ClaimEvent<T["Data"]>): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* Processes RefundEvent for a given swap
|
|
60
|
+
* @param swap
|
|
61
|
+
* @param event
|
|
62
|
+
* @protected
|
|
63
|
+
* @returns Whether the swap was updated/changed
|
|
64
|
+
*/
|
|
65
|
+
protected abstract processEventRefund(swap: D["Swap"], event: RefundEvent<T["Data"]>): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Processes a single SC on-chain event
|
|
68
|
+
* @private
|
|
69
|
+
* @param event
|
|
70
|
+
* @param swap
|
|
71
|
+
*/
|
|
72
|
+
protected processEvent(event: SwapEvent<T["Data"]>, swap: D["Swap"]): Promise<void>;
|
|
73
|
+
protected _checkPastSwaps(pastSwaps: D["Swap"][]): Promise<{
|
|
74
|
+
changedSwaps: D["Swap"][];
|
|
75
|
+
removeSwaps: D["Swap"][];
|
|
76
|
+
}>;
|
|
77
|
+
recoverFromSwapDataAndState(init: {
|
|
78
|
+
data: T["Data"];
|
|
79
|
+
getInitTxId: () => Promise<string>;
|
|
80
|
+
getTxBlock: () => Promise<{
|
|
81
|
+
blockTime: number;
|
|
82
|
+
blockHeight: number;
|
|
83
|
+
}>;
|
|
84
|
+
}, state: SwapCommitState, lp?: Intermediary): Promise<D["Swap"] | null>;
|
|
85
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IEscrowSwapWrapper = void 0;
|
|
4
|
+
const ISwapWrapper_1 = require("../ISwapWrapper");
|
|
5
|
+
const base_1 = require("@atomiqlabs/base");
|
|
6
|
+
class IEscrowSwapWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
7
|
+
constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, options, events) {
|
|
8
|
+
super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, options, events);
|
|
9
|
+
this.swapDataDeserializer = swapDataDeserializer;
|
|
10
|
+
this.contract = contract;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Pre-fetches signature verification data from the server's pre-sent promise, doesn't throw, instead returns null
|
|
14
|
+
*
|
|
15
|
+
* @param signDataPrefetch Promise that resolves when we receive "signDataPrefetch" from the LP in streaming mode
|
|
16
|
+
* @protected
|
|
17
|
+
* @returns Pre-fetched signature verification data or null if failed
|
|
18
|
+
*/
|
|
19
|
+
preFetchSignData(signDataPrefetch) {
|
|
20
|
+
if (this.contract.preFetchForInitSignatureVerification == null)
|
|
21
|
+
return Promise.resolve(undefined);
|
|
22
|
+
return signDataPrefetch.then(obj => {
|
|
23
|
+
if (obj == null)
|
|
24
|
+
return undefined;
|
|
25
|
+
return this.contract.preFetchForInitSignatureVerification(obj);
|
|
26
|
+
}).catch(e => {
|
|
27
|
+
this.logger.error("preFetchSignData(): Error: ", e);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Verifies swap initialization signature returned by the intermediary
|
|
32
|
+
*
|
|
33
|
+
* @param initiator A smart chain account initiating the swap
|
|
34
|
+
* @param data Parsed swap data from the intermediary
|
|
35
|
+
* @param signature Response of the intermediary
|
|
36
|
+
* @param feeRatePromise Pre-fetched fee rate promise
|
|
37
|
+
* @param preFetchSignatureVerificationData Pre-fetched signature verification data
|
|
38
|
+
* @param abortSignal
|
|
39
|
+
* @protected
|
|
40
|
+
* @returns Swap initialization signature expiry
|
|
41
|
+
* @throws {SignatureVerificationError} when swap init signature is invalid
|
|
42
|
+
*/
|
|
43
|
+
async verifyReturnedSignature(initiator, data, signature, feeRatePromise, preFetchSignatureVerificationData, abortSignal) {
|
|
44
|
+
const [feeRate, preFetchedSignatureData] = await Promise.all([feeRatePromise, preFetchSignatureVerificationData]);
|
|
45
|
+
await this.contract.isValidInitAuthorization(initiator, data, signature, feeRate, preFetchedSignatureData);
|
|
46
|
+
return await this.contract.getInitAuthorizationExpiry(data, signature, preFetchedSignatureData);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Processes a single SC on-chain event
|
|
50
|
+
* @private
|
|
51
|
+
* @param event
|
|
52
|
+
* @param swap
|
|
53
|
+
*/
|
|
54
|
+
async processEvent(event, swap) {
|
|
55
|
+
if (swap == null)
|
|
56
|
+
return;
|
|
57
|
+
let swapChanged = false;
|
|
58
|
+
if (event instanceof base_1.InitializeEvent) {
|
|
59
|
+
swapChanged = await this.processEventInitialize(swap, event);
|
|
60
|
+
if (event.meta?.txId != null && swap.commitTxId !== event.meta.txId) {
|
|
61
|
+
swap.commitTxId = event.meta.txId;
|
|
62
|
+
swapChanged ||= true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (event instanceof base_1.ClaimEvent) {
|
|
66
|
+
swapChanged = await this.processEventClaim(swap, event);
|
|
67
|
+
if (event.meta?.txId != null && swap.claimTxId !== event.meta.txId) {
|
|
68
|
+
swap.claimTxId = event.meta.txId;
|
|
69
|
+
swapChanged ||= true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (event instanceof base_1.RefundEvent) {
|
|
73
|
+
swapChanged = await this.processEventRefund(swap, event);
|
|
74
|
+
if (event.meta?.txId != null && swap.refundTxId !== event.meta.txId) {
|
|
75
|
+
swap.refundTxId = event.meta.txId;
|
|
76
|
+
swapChanged ||= true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
this.logger.info("processEvents(): " + event.constructor.name + " processed for " + swap.getId() + " swap: ", swap);
|
|
80
|
+
if (swapChanged) {
|
|
81
|
+
await swap._saveAndEmit();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async _checkPastSwaps(pastSwaps) {
|
|
85
|
+
const changedSwaps = [];
|
|
86
|
+
const removeSwaps = [];
|
|
87
|
+
const swapExpiredStatus = {};
|
|
88
|
+
const checkStatusSwaps = [];
|
|
89
|
+
for (let pastSwap of pastSwaps) {
|
|
90
|
+
if (pastSwap._shouldFetchExpiryStatus()) {
|
|
91
|
+
//Check expiry
|
|
92
|
+
swapExpiredStatus[pastSwap.getId()] = await pastSwap._verifyQuoteDefinitelyExpired();
|
|
93
|
+
}
|
|
94
|
+
if (pastSwap._shouldFetchCommitStatus()) {
|
|
95
|
+
//Add to swaps for which status should be checked
|
|
96
|
+
if (pastSwap.data != null)
|
|
97
|
+
checkStatusSwaps.push(pastSwap);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const swapStatuses = await this.contract.getCommitStatuses(checkStatusSwaps.map(val => ({ signer: val._getInitiator(), swapData: val.data })));
|
|
101
|
+
for (let pastSwap of checkStatusSwaps) {
|
|
102
|
+
const escrowHash = pastSwap.getEscrowHash();
|
|
103
|
+
const shouldSave = await pastSwap._sync(false, swapExpiredStatus[pastSwap.getId()], escrowHash == null ? undefined : swapStatuses[escrowHash]);
|
|
104
|
+
if (shouldSave) {
|
|
105
|
+
if (pastSwap.isQuoteExpired()) {
|
|
106
|
+
removeSwaps.push(pastSwap);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
changedSwaps.push(pastSwap);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
changedSwaps,
|
|
115
|
+
removeSwaps
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
recoverFromSwapDataAndState(init, state, lp) {
|
|
119
|
+
return Promise.resolve(null);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.IEscrowSwapWrapper = IEscrowSwapWrapper;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import { ChainType, SwapData } from "@atomiqlabs/base";
|
|
5
|
+
import { IFromBTCDefinition, IFromBTCWrapper } from "./IFromBTCWrapper";
|
|
6
|
+
import { ISwapWrapperOptions, WrapperCtorTokens } from "../../ISwapWrapper";
|
|
7
|
+
import { LightningNetworkApi, LNNodeLiquidity } from "../../../bitcoin/LightningNetworkApi";
|
|
8
|
+
import { UnifiedSwapStorage } from "../../../storage/UnifiedSwapStorage";
|
|
9
|
+
import { UnifiedSwapEventListener } from "../../../events/UnifiedSwapEventListener";
|
|
10
|
+
import { ISwapPrice } from "../../../prices/abstract/ISwapPrice";
|
|
11
|
+
import { EventEmitter } from "events";
|
|
12
|
+
import { Buffer } from "buffer";
|
|
13
|
+
import { Intermediary } from "../../../intermediaries/Intermediary";
|
|
14
|
+
import { PaymentRequestObject, TagsObject } from "@atomiqlabs/bolt11";
|
|
15
|
+
import { IEscrowSwap } from "../IEscrowSwap";
|
|
16
|
+
import { LNURLWithdrawParamsWithUrl } from "../../../types/lnurl/LNURLWithdraw";
|
|
17
|
+
export type IFromBTCLNDefinition<T extends ChainType, W extends IFromBTCLNWrapper<T, any>, S extends IEscrowSwap<T>> = IFromBTCDefinition<T, W, S>;
|
|
18
|
+
export declare abstract class IFromBTCLNWrapper<T extends ChainType, D extends IFromBTCLNDefinition<T, IFromBTCLNWrapper<T, D>, IEscrowSwap<T, D>>, O extends ISwapWrapperOptions = ISwapWrapperOptions> extends IFromBTCWrapper<T, D, O> {
|
|
19
|
+
protected readonly lnApi: LightningNetworkApi;
|
|
20
|
+
/**
|
|
21
|
+
* @param chainIdentifier
|
|
22
|
+
* @param unifiedStorage Storage interface for the current environment
|
|
23
|
+
* @param unifiedChainEvents On-chain event listener
|
|
24
|
+
* @param chain
|
|
25
|
+
* @param contract Underlying contract handling the swaps
|
|
26
|
+
* @param prices Swap pricing handler
|
|
27
|
+
* @param tokens
|
|
28
|
+
* @param swapDataDeserializer Deserializer for SwapData
|
|
29
|
+
* @param lnApi
|
|
30
|
+
* @param options
|
|
31
|
+
* @param events Instance to use for emitting events
|
|
32
|
+
*/
|
|
33
|
+
constructor(chainIdentifier: string, unifiedStorage: UnifiedSwapStorage<T>, unifiedChainEvents: UnifiedSwapEventListener<T>, chain: T["ChainInterface"], contract: T["Contract"], prices: ISwapPrice, tokens: WrapperCtorTokens, swapDataDeserializer: new (data: any) => T["Data"], lnApi: LightningNetworkApi, options: O, events?: EventEmitter<{
|
|
34
|
+
swapState: [IEscrowSwap];
|
|
35
|
+
}>);
|
|
36
|
+
/**
|
|
37
|
+
* Returns the swap expiry, leaving enough time for the user to claim the HTLC
|
|
38
|
+
*
|
|
39
|
+
* @param data Parsed swap data
|
|
40
|
+
*/
|
|
41
|
+
getHtlcTimeout(data: SwapData): bigint;
|
|
42
|
+
/**
|
|
43
|
+
* Generates a new 32-byte secret to be used as pre-image for lightning network invoice & HTLC swap\
|
|
44
|
+
*
|
|
45
|
+
* @private
|
|
46
|
+
* @returns Hash pre-image & payment hash
|
|
47
|
+
*/
|
|
48
|
+
protected getSecretAndHash(): {
|
|
49
|
+
secret: Buffer;
|
|
50
|
+
paymentHash: Buffer;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Pre-fetches intermediary's LN node capacity, doesn't throw, instead returns null
|
|
54
|
+
*
|
|
55
|
+
* @param pubkeyPromise Promise that resolves when we receive "lnPublicKey" param from the intermediary thorugh
|
|
56
|
+
* streaming
|
|
57
|
+
* @private
|
|
58
|
+
* @returns LN Node liquidity
|
|
59
|
+
*/
|
|
60
|
+
protected preFetchLnCapacity(pubkeyPromise: Promise<string | null>): Promise<LNNodeLiquidity | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Verifies whether the intermediary's lightning node has enough inbound capacity to receive the LN payment
|
|
63
|
+
*
|
|
64
|
+
* @param lp Intermediary
|
|
65
|
+
* @param decodedPr Decoded bolt11 lightning network invoice
|
|
66
|
+
* @param amountIn Amount to be paid for the swap in sats
|
|
67
|
+
* @param lnCapacityPrefetchPromise Pre-fetch for LN node capacity, preFetchLnCapacity()
|
|
68
|
+
* @param abortSignal
|
|
69
|
+
* @private
|
|
70
|
+
* @throws {IntermediaryError} if the lightning network node doesn't have enough inbound liquidity
|
|
71
|
+
* @throws {Error} if the lightning network node's inbound liquidity might be enough, but the swap would
|
|
72
|
+
* deplete more than half of the liquidity
|
|
73
|
+
*/
|
|
74
|
+
protected verifyLnNodeCapacity(lp: Intermediary, decodedPr: PaymentRequestObject & {
|
|
75
|
+
tagsObject: TagsObject;
|
|
76
|
+
}, lnCapacityPrefetchPromise?: Promise<LNNodeLiquidity | null>, abortSignal?: AbortSignal): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Parses and fetches lnurl withdraw params from the specified lnurl
|
|
79
|
+
*
|
|
80
|
+
* @param lnurl LNURL to be parsed and fetched
|
|
81
|
+
* @param abortSignal
|
|
82
|
+
* @private
|
|
83
|
+
* @throws {UserError} if the LNURL is invalid or if it's not a LNURL-withdraw
|
|
84
|
+
*/
|
|
85
|
+
protected getLNURLWithdraw(lnurl: string | LNURLWithdrawParamsWithUrl, abortSignal: AbortSignal): Promise<LNURLWithdrawParamsWithUrl>;
|
|
86
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IFromBTCLNWrapper = void 0;
|
|
4
|
+
const IFromBTCWrapper_1 = require("./IFromBTCWrapper");
|
|
5
|
+
const buffer_1 = require("buffer");
|
|
6
|
+
const Utils_1 = require("../../../utils/Utils");
|
|
7
|
+
const IntermediaryError_1 = require("../../../errors/IntermediaryError");
|
|
8
|
+
const LNURL_1 = require("../../../lnurl/LNURL");
|
|
9
|
+
const UserError_1 = require("../../../errors/UserError");
|
|
10
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
11
|
+
class IFromBTCLNWrapper extends IFromBTCWrapper_1.IFromBTCWrapper {
|
|
12
|
+
/**
|
|
13
|
+
* @param chainIdentifier
|
|
14
|
+
* @param unifiedStorage Storage interface for the current environment
|
|
15
|
+
* @param unifiedChainEvents On-chain event listener
|
|
16
|
+
* @param chain
|
|
17
|
+
* @param contract Underlying contract handling the swaps
|
|
18
|
+
* @param prices Swap pricing handler
|
|
19
|
+
* @param tokens
|
|
20
|
+
* @param swapDataDeserializer Deserializer for SwapData
|
|
21
|
+
* @param lnApi
|
|
22
|
+
* @param options
|
|
23
|
+
* @param events Instance to use for emitting events
|
|
24
|
+
*/
|
|
25
|
+
constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, lnApi, options, events) {
|
|
26
|
+
super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, options, events);
|
|
27
|
+
this.lnApi = lnApi;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns the swap expiry, leaving enough time for the user to claim the HTLC
|
|
31
|
+
*
|
|
32
|
+
* @param data Parsed swap data
|
|
33
|
+
*/
|
|
34
|
+
getHtlcTimeout(data) {
|
|
35
|
+
return data.getExpiry() - 600n;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generates a new 32-byte secret to be used as pre-image for lightning network invoice & HTLC swap\
|
|
39
|
+
*
|
|
40
|
+
* @private
|
|
41
|
+
* @returns Hash pre-image & payment hash
|
|
42
|
+
*/
|
|
43
|
+
getSecretAndHash() {
|
|
44
|
+
const secret = (0, Utils_1.randomBytes)(32);
|
|
45
|
+
const paymentHash = buffer_1.Buffer.from((0, sha256_1.sha256)(secret));
|
|
46
|
+
return { secret, paymentHash };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Pre-fetches intermediary's LN node capacity, doesn't throw, instead returns null
|
|
50
|
+
*
|
|
51
|
+
* @param pubkeyPromise Promise that resolves when we receive "lnPublicKey" param from the intermediary thorugh
|
|
52
|
+
* streaming
|
|
53
|
+
* @private
|
|
54
|
+
* @returns LN Node liquidity
|
|
55
|
+
*/
|
|
56
|
+
preFetchLnCapacity(pubkeyPromise) {
|
|
57
|
+
return pubkeyPromise.then(pubkey => {
|
|
58
|
+
if (pubkey == null)
|
|
59
|
+
return null;
|
|
60
|
+
return this.lnApi.getLNNodeLiquidity(pubkey);
|
|
61
|
+
}).catch(e => {
|
|
62
|
+
this.logger.warn("preFetchLnCapacity(): Error: ", e);
|
|
63
|
+
return null;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Verifies whether the intermediary's lightning node has enough inbound capacity to receive the LN payment
|
|
68
|
+
*
|
|
69
|
+
* @param lp Intermediary
|
|
70
|
+
* @param decodedPr Decoded bolt11 lightning network invoice
|
|
71
|
+
* @param amountIn Amount to be paid for the swap in sats
|
|
72
|
+
* @param lnCapacityPrefetchPromise Pre-fetch for LN node capacity, preFetchLnCapacity()
|
|
73
|
+
* @param abortSignal
|
|
74
|
+
* @private
|
|
75
|
+
* @throws {IntermediaryError} if the lightning network node doesn't have enough inbound liquidity
|
|
76
|
+
* @throws {Error} if the lightning network node's inbound liquidity might be enough, but the swap would
|
|
77
|
+
* deplete more than half of the liquidity
|
|
78
|
+
*/
|
|
79
|
+
async verifyLnNodeCapacity(lp, decodedPr, lnCapacityPrefetchPromise, abortSignal) {
|
|
80
|
+
if (decodedPr.payeeNodeKey == null)
|
|
81
|
+
throw new Error("Unable to extract payee pubkey from the swap invoice!");
|
|
82
|
+
if (decodedPr.millisatoshis == null)
|
|
83
|
+
throw new Error("Swap invoice doesn't contains msat amount field!");
|
|
84
|
+
const _result = await lnCapacityPrefetchPromise ?? await this.lnApi.getLNNodeLiquidity(decodedPr.payeeNodeKey);
|
|
85
|
+
if (_result === null)
|
|
86
|
+
throw new IntermediaryError_1.IntermediaryError("LP's lightning node not found in the lightning network graph!");
|
|
87
|
+
lp.lnData = _result;
|
|
88
|
+
if (decodedPr.payeeNodeKey !== _result.publicKey)
|
|
89
|
+
throw new IntermediaryError_1.IntermediaryError("Invalid pr returned - payee pubkey");
|
|
90
|
+
const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
|
|
91
|
+
if (_result.capacity < amountIn)
|
|
92
|
+
throw new IntermediaryError_1.IntermediaryError("LP's lightning node doesn't have enough inbound capacity for the swap!");
|
|
93
|
+
if ((_result.capacity / 2n) < amountIn)
|
|
94
|
+
throw new Error("LP's lightning node probably doesn't have enough inbound capacity for the swap!");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Parses and fetches lnurl withdraw params from the specified lnurl
|
|
98
|
+
*
|
|
99
|
+
* @param lnurl LNURL to be parsed and fetched
|
|
100
|
+
* @param abortSignal
|
|
101
|
+
* @private
|
|
102
|
+
* @throws {UserError} if the LNURL is invalid or if it's not a LNURL-withdraw
|
|
103
|
+
*/
|
|
104
|
+
async getLNURLWithdraw(lnurl, abortSignal) {
|
|
105
|
+
if (typeof (lnurl) !== "string")
|
|
106
|
+
return lnurl;
|
|
107
|
+
const res = await LNURL_1.LNURL.getLNURL(lnurl, true, this.options.getRequestTimeout, abortSignal);
|
|
108
|
+
if (res == null)
|
|
109
|
+
throw new UserError_1.UserError("Invalid LNURL");
|
|
110
|
+
if (res.tag !== "withdrawRequest")
|
|
111
|
+
throw new UserError_1.UserError("Not a LNURL-withdrawal");
|
|
112
|
+
return res;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.IFromBTCLNWrapper = IFromBTCLNWrapper;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { IFromBTCWrapper } from "./IFromBTCWrapper";
|
|
2
|
+
import { ChainType } from "@atomiqlabs/base";
|
|
3
|
+
import { Fee } from "../../../types/fees/Fee";
|
|
4
|
+
import { IAddressSwap } from "../../IAddressSwap";
|
|
5
|
+
import { IEscrowSelfInitSwap, IEscrowSelfInitSwapDefinition, IEscrowSelfInitSwapInit } from "../IEscrowSelfInitSwap";
|
|
6
|
+
import { FeeType } from "../../../enums/FeeType";
|
|
7
|
+
import { TokenAmount } from "../../../types/TokenAmount";
|
|
8
|
+
import { BtcToken, SCToken } from "../../../types/Token";
|
|
9
|
+
export type IFromBTCSelfInitDefinition<T extends ChainType, W extends IFromBTCWrapper<T, any>, S extends IFromBTCSelfInitSwap<T>> = IEscrowSelfInitSwapDefinition<T, W, S>;
|
|
10
|
+
export declare abstract class IFromBTCSelfInitSwap<T extends ChainType = ChainType, D extends IFromBTCSelfInitDefinition<T, IFromBTCWrapper<T, D>, IFromBTCSelfInitSwap<T, D, S>> = IFromBTCSelfInitDefinition<T, IFromBTCWrapper<T, any>, IFromBTCSelfInitSwap<T, any, any>>, S extends number = number> extends IEscrowSelfInitSwap<T, D, S> implements IAddressSwap {
|
|
11
|
+
protected abstract readonly inputToken: BtcToken;
|
|
12
|
+
protected constructor(wrapper: D["Wrapper"], init: IEscrowSelfInitSwapInit<T["Data"]>);
|
|
13
|
+
protected constructor(wrapper: D["Wrapper"], obj: any);
|
|
14
|
+
/**
|
|
15
|
+
* In case swapFee in BTC is not supplied it recalculates it based on swap price
|
|
16
|
+
* @protected
|
|
17
|
+
*/
|
|
18
|
+
protected tryRecomputeSwapPrice(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Returns the bitcoin address or lightning invoice to be paid for the swap
|
|
21
|
+
*/
|
|
22
|
+
abstract getAddress(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Returns a string that can be displayed as QR code representation of the address or lightning invoice
|
|
25
|
+
* (with bitcoin: or lightning: prefix)
|
|
26
|
+
*/
|
|
27
|
+
abstract getHyperlink(): string;
|
|
28
|
+
abstract isClaimable(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Returns if the swap can be committed
|
|
31
|
+
*/
|
|
32
|
+
protected abstract canCommit(): boolean;
|
|
33
|
+
_getInitiator(): string;
|
|
34
|
+
getOutputTxId(): string | null;
|
|
35
|
+
getOutputAddress(): string | null;
|
|
36
|
+
requiresAction(): boolean;
|
|
37
|
+
protected getOutAmountWithoutFee(): bigint;
|
|
38
|
+
protected getSwapFee(): Fee<T["ChainId"], BtcToken, SCToken<T["ChainId"]>>;
|
|
39
|
+
getFee(): Fee;
|
|
40
|
+
getFeeBreakdown(): [{
|
|
41
|
+
type: FeeType.SWAP;
|
|
42
|
+
fee: Fee<T["ChainId"], BtcToken, SCToken<T["ChainId"]>>;
|
|
43
|
+
}];
|
|
44
|
+
getOutputToken(): SCToken<T["ChainId"]>;
|
|
45
|
+
getOutput(): TokenAmount<T["ChainId"], SCToken<T["ChainId"]>>;
|
|
46
|
+
abstract getInput(): TokenAmount<T["ChainId"], BtcToken>;
|
|
47
|
+
getInputWithoutFee(): TokenAmount<T["ChainId"], BtcToken>;
|
|
48
|
+
getSecurityDeposit(): TokenAmount<T["ChainId"], SCToken<T["ChainId"]>>;
|
|
49
|
+
getTotalDeposit(): TokenAmount<T["ChainId"], SCToken<T["ChainId"]>>;
|
|
50
|
+
hasEnoughForTxFees(): Promise<{
|
|
51
|
+
enoughBalance: boolean;
|
|
52
|
+
balance: TokenAmount;
|
|
53
|
+
required: TokenAmount;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* Returns the transactions required for committing the swap on-chain, locking the tokens from the intermediary
|
|
57
|
+
* in an HTLC or PTLC
|
|
58
|
+
*
|
|
59
|
+
* @param skipChecks Skip checks like making sure init signature is still valid and swap wasn't commited yet
|
|
60
|
+
* (this is handled when swap is created (quoted), if you commit right after quoting, you can use skipChecks=true)
|
|
61
|
+
* @throws {Error} When in invalid state to commit the swap
|
|
62
|
+
*/
|
|
63
|
+
txsCommit(skipChecks?: boolean): Promise<T["TX"][]>;
|
|
64
|
+
/**
|
|
65
|
+
* Commits the swap on-chain, locking the tokens from the intermediary in an HTLC or PTLC
|
|
66
|
+
*
|
|
67
|
+
* @param signer Signer to sign the transactions with, must be the same as used in the initialization
|
|
68
|
+
* @param abortSignal Abort signal to stop waiting for the transaction confirmation and abort
|
|
69
|
+
* @param skipChecks Skip checks like making sure init signature is still valid and swap wasn't commited yet
|
|
70
|
+
* (this is handled when swap is created (quoted), if you commit right after quoting, you can use skipChecks=true)
|
|
71
|
+
* @throws {Error} If invalid signer is provided that doesn't match the swap data
|
|
72
|
+
*/
|
|
73
|
+
abstract commit(signer: T["Signer"] | T["NativeSigner"], abortSignal?: AbortSignal, skipChecks?: boolean): Promise<string>;
|
|
74
|
+
abstract waitTillCommited(abortSignal?: AbortSignal): Promise<void>;
|
|
75
|
+
getClaimFee(): Promise<bigint>;
|
|
76
|
+
abstract txsClaim(signer?: T["Signer"]): Promise<T["TX"][]>;
|
|
77
|
+
/**
|
|
78
|
+
* Claims and finishes the swap
|
|
79
|
+
*
|
|
80
|
+
* @param signer Signer to sign the transactions with, can also be different to the initializer
|
|
81
|
+
* @param abortSignal Abort signal to stop waiting for transaction confirmation
|
|
82
|
+
*/
|
|
83
|
+
abstract claim(signer: T["Signer"] | T["NativeSigner"], abortSignal?: AbortSignal): Promise<string>;
|
|
84
|
+
/**
|
|
85
|
+
* Waits till the swap is successfully claimed
|
|
86
|
+
*
|
|
87
|
+
* @param maxWaitTimeSeconds Maximum time in seconds to wait for the swap to be settled
|
|
88
|
+
* @param abortSignal AbortSignal
|
|
89
|
+
* @throws {Error} If swap is in invalid state (must be COMMIT)
|
|
90
|
+
* @returns {boolean} whether the swap was claimed in time or not
|
|
91
|
+
*/
|
|
92
|
+
abstract waitTillClaimed(maxWaitTimeSeconds?: number, abortSignal?: AbortSignal): Promise<boolean>;
|
|
93
|
+
}
|