@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,197 @@
|
|
|
1
|
+
import {isISwapInit, ISwap, ISwapInit} from "../ISwap";
|
|
2
|
+
import {
|
|
3
|
+
ChainType,
|
|
4
|
+
SwapCommitState,
|
|
5
|
+
SwapCommitStateType,
|
|
6
|
+
SwapData,
|
|
7
|
+
SwapExpiredState,
|
|
8
|
+
SwapNotCommitedState,
|
|
9
|
+
SwapPaidState
|
|
10
|
+
} from "@atomiqlabs/base";
|
|
11
|
+
import {IEscrowSwapDefinition, IEscrowSwapWrapper} from "./IEscrowSwapWrapper";
|
|
12
|
+
import {Buffer} from "buffer";
|
|
13
|
+
import {timeoutPromise} from "../../utils/TimeoutUtils";
|
|
14
|
+
|
|
15
|
+
export type IEscrowSwapInit<T extends SwapData> = ISwapInit & {
|
|
16
|
+
data?: T,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export function isIEscrowSwapInit<T extends SwapData>(obj: any): obj is IEscrowSwapInit<T> {
|
|
20
|
+
return typeof obj === 'object' &&
|
|
21
|
+
(obj.data == null || typeof obj.data === 'object') &&
|
|
22
|
+
isISwapInit(obj);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export abstract class IEscrowSwap<
|
|
26
|
+
T extends ChainType = ChainType,
|
|
27
|
+
D extends IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, D>, IEscrowSwap<T, D, S>> = IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, any>, IEscrowSwap<T, any, any>>,
|
|
28
|
+
S extends number = number
|
|
29
|
+
> extends ISwap<T, D, S> {
|
|
30
|
+
|
|
31
|
+
data?: T["Data"];
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Transaction IDs for the swap on the smart chain side
|
|
35
|
+
*/
|
|
36
|
+
commitTxId?: string;
|
|
37
|
+
refundTxId?: string;
|
|
38
|
+
claimTxId?: string;
|
|
39
|
+
|
|
40
|
+
protected constructor(wrapper: D["Wrapper"], obj: any);
|
|
41
|
+
protected constructor(wrapper: D["Wrapper"], swapInit: IEscrowSwapInit<T["Data"]>);
|
|
42
|
+
protected constructor(
|
|
43
|
+
wrapper: D["Wrapper"],
|
|
44
|
+
swapInitOrObj: IEscrowSwapInit<T["Data"]> | any,
|
|
45
|
+
) {
|
|
46
|
+
super(wrapper, swapInitOrObj);
|
|
47
|
+
|
|
48
|
+
if(isIEscrowSwapInit(swapInitOrObj)) {
|
|
49
|
+
this.data = swapInitOrObj.data;
|
|
50
|
+
} else {
|
|
51
|
+
if(swapInitOrObj.data!=null) this.data = new wrapper.swapDataDeserializer(swapInitOrObj.data);
|
|
52
|
+
|
|
53
|
+
this.commitTxId = swapInitOrObj.commitTxId;
|
|
54
|
+
this.claimTxId = swapInitOrObj.claimTxId;
|
|
55
|
+
this.refundTxId = swapInitOrObj.refundTxId;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
protected abstract getSwapData(): T["Data"];
|
|
60
|
+
|
|
61
|
+
//////////////////////////////
|
|
62
|
+
//// Identifiers
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns the identification hash of the swap, usually claim data hash, but can be overriden, e.g. for
|
|
66
|
+
* lightning swaps the identifier hash is used instead of claim data hash
|
|
67
|
+
*/
|
|
68
|
+
protected getIdentifierHash(): Buffer {
|
|
69
|
+
const claimHashBuffer = Buffer.from(this.getClaimHash(), "hex");
|
|
70
|
+
if(this.randomNonce==null) return claimHashBuffer;
|
|
71
|
+
return Buffer.concat([claimHashBuffer, Buffer.from(this.randomNonce, "hex")]);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Returns the identification hash of the swap, usually claim data hash, but can be overriden, e.g. for
|
|
76
|
+
* lightning swaps the identifier hash is used instead of claim data hash
|
|
77
|
+
*/
|
|
78
|
+
protected getIdentifierHashString(): string {
|
|
79
|
+
const identifierHash = this.getIdentifierHash();
|
|
80
|
+
return identifierHash.toString("hex");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
_getEscrowHash(): string | null {
|
|
84
|
+
return this.data?.getEscrowHash() ?? null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Returns the escrow hash - i.e. hash of the escrow data
|
|
89
|
+
*/
|
|
90
|
+
getEscrowHash(): string | null {
|
|
91
|
+
return this._getEscrowHash();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Returns the claim data hash - i.e. hash passed to the claim handler
|
|
96
|
+
*/
|
|
97
|
+
getClaimHash(): string {
|
|
98
|
+
return this.getSwapData().getClaimHash();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
getId(): string {
|
|
102
|
+
return this.getIdentifierHashString();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
//////////////////////////////
|
|
107
|
+
//// Watchdogs
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Periodically checks the chain to see whether the swap is committed
|
|
111
|
+
*
|
|
112
|
+
* @param intervalSeconds How often to check (in seconds), default to 5s
|
|
113
|
+
* @param abortSignal
|
|
114
|
+
* @protected
|
|
115
|
+
*/
|
|
116
|
+
protected async watchdogWaitTillCommited(intervalSeconds?: number, abortSignal?: AbortSignal): Promise<boolean> {
|
|
117
|
+
if(this.data==null) throw new Error("Tried to await commitment but data is null, invalid state?");
|
|
118
|
+
|
|
119
|
+
intervalSeconds ??= 5;
|
|
120
|
+
let status: SwapCommitState = {type: SwapCommitStateType.NOT_COMMITED};
|
|
121
|
+
while(status?.type===SwapCommitStateType.NOT_COMMITED) {
|
|
122
|
+
await timeoutPromise(intervalSeconds*1000, abortSignal);
|
|
123
|
+
try {
|
|
124
|
+
status = await this.wrapper.contract.getCommitStatus(this._getInitiator(), this.data);
|
|
125
|
+
if(
|
|
126
|
+
status?.type===SwapCommitStateType.NOT_COMMITED &&
|
|
127
|
+
await this._verifyQuoteDefinitelyExpired()
|
|
128
|
+
) return false;
|
|
129
|
+
} catch (e) {
|
|
130
|
+
this.logger.error("watchdogWaitTillCommited(): Error when fetching commit status or signature expiry: ", e);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
134
|
+
return status?.type!==SwapCommitStateType.EXPIRED;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Periodically checks the chain to see whether the swap was finished (claimed or refunded)
|
|
139
|
+
*
|
|
140
|
+
* @param intervalSeconds How often to check (in seconds), default to 5s
|
|
141
|
+
* @param abortSignal
|
|
142
|
+
* @protected
|
|
143
|
+
*/
|
|
144
|
+
protected async watchdogWaitTillResult(intervalSeconds?: number, abortSignal?: AbortSignal): Promise<
|
|
145
|
+
SwapPaidState | SwapExpiredState | SwapNotCommitedState
|
|
146
|
+
> {
|
|
147
|
+
if(this.data==null) throw new Error("Tried to await result but data is null, invalid state?");
|
|
148
|
+
|
|
149
|
+
intervalSeconds ??= 5;
|
|
150
|
+
let status: SwapCommitState = {type: SwapCommitStateType.COMMITED};
|
|
151
|
+
while(status?.type===SwapCommitStateType.COMMITED || status?.type===SwapCommitStateType.REFUNDABLE) {
|
|
152
|
+
await timeoutPromise(intervalSeconds*1000, abortSignal);
|
|
153
|
+
try {
|
|
154
|
+
status = await this.wrapper.contract.getCommitStatus(this._getInitiator(), this.data);
|
|
155
|
+
} catch (e) {
|
|
156
|
+
this.logger.error("watchdogWaitTillResult(): Error when fetching commit status: ", e);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
160
|
+
return status;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
//////////////////////////////
|
|
165
|
+
//// Quote verification
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Checks if the swap's quote is expired for good (i.e. the swap strictly cannot be committed on-chain anymore)
|
|
169
|
+
*/
|
|
170
|
+
abstract _verifyQuoteDefinitelyExpired(): Promise<boolean>;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Checks if the swap's quote is still valid
|
|
174
|
+
*/
|
|
175
|
+
abstract verifyQuoteValid(): Promise<boolean>;
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
//////////////////////////////
|
|
179
|
+
//// Helpers for batched swap checks
|
|
180
|
+
|
|
181
|
+
abstract _shouldFetchCommitStatus(): boolean;
|
|
182
|
+
|
|
183
|
+
abstract _shouldFetchExpiryStatus(): boolean;
|
|
184
|
+
|
|
185
|
+
abstract _sync(save?: boolean, quoteDefinitelyExpired?: boolean, commitStatus?: SwapCommitState): Promise<boolean>;
|
|
186
|
+
|
|
187
|
+
serialize(): any {
|
|
188
|
+
return {
|
|
189
|
+
...super.serialize(),
|
|
190
|
+
data: this.data!=null ? this.data.serialize() : null,
|
|
191
|
+
commitTxId: this.commitTxId,
|
|
192
|
+
claimTxId: this.claimTxId,
|
|
193
|
+
refundTxId: this.refundTxId
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import {ISwapWrapper, ISwapWrapperOptions, SwapTypeDefinition, WrapperCtorTokens} from "../ISwapWrapper";
|
|
2
|
+
import {
|
|
3
|
+
ChainType,
|
|
4
|
+
ClaimEvent,
|
|
5
|
+
InitializeEvent,
|
|
6
|
+
RefundEvent,
|
|
7
|
+
SignatureData,
|
|
8
|
+
SignatureVerificationError,
|
|
9
|
+
SwapCommitState,
|
|
10
|
+
SwapEvent
|
|
11
|
+
} from "@atomiqlabs/base";
|
|
12
|
+
import {ISwap} from "../ISwap";
|
|
13
|
+
import {UnifiedSwapStorage} from "../../storage/UnifiedSwapStorage";
|
|
14
|
+
import {UnifiedSwapEventListener} from "../../events/UnifiedSwapEventListener";
|
|
15
|
+
import {ISwapPrice} from "../../prices/abstract/ISwapPrice";
|
|
16
|
+
import {EventEmitter} from "events";
|
|
17
|
+
import {SwapType} from "../../enums/SwapType";
|
|
18
|
+
import {IEscrowSwap} from "./IEscrowSwap";
|
|
19
|
+
import {Intermediary} from "../../intermediaries/Intermediary";
|
|
20
|
+
|
|
21
|
+
export type IEscrowSwapDefinition<T extends ChainType, W extends IEscrowSwapWrapper<T, any>, S extends IEscrowSwap<T>> = SwapTypeDefinition<T, W, S>;
|
|
22
|
+
|
|
23
|
+
export abstract class IEscrowSwapWrapper<
|
|
24
|
+
T extends ChainType,
|
|
25
|
+
D extends IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, D>, IEscrowSwap<T, D>>,
|
|
26
|
+
O extends ISwapWrapperOptions = ISwapWrapperOptions
|
|
27
|
+
> extends ISwapWrapper<T, D, O> {
|
|
28
|
+
readonly abstract TYPE: SwapType;
|
|
29
|
+
|
|
30
|
+
readonly contract: T["Contract"];
|
|
31
|
+
readonly swapDataDeserializer: new (data: any) => T["Data"];
|
|
32
|
+
|
|
33
|
+
constructor(
|
|
34
|
+
chainIdentifier: string,
|
|
35
|
+
unifiedStorage: UnifiedSwapStorage<T>,
|
|
36
|
+
unifiedChainEvents: UnifiedSwapEventListener<T>,
|
|
37
|
+
chain: T["ChainInterface"],
|
|
38
|
+
contract: T["Contract"],
|
|
39
|
+
prices: ISwapPrice,
|
|
40
|
+
tokens: WrapperCtorTokens,
|
|
41
|
+
swapDataDeserializer: new (data: any) => T["Data"],
|
|
42
|
+
options: O,
|
|
43
|
+
events?: EventEmitter<{swapState: [ISwap]}>
|
|
44
|
+
) {
|
|
45
|
+
super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, options, events);
|
|
46
|
+
this.swapDataDeserializer = swapDataDeserializer;
|
|
47
|
+
this.contract = contract;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Pre-fetches signature verification data from the server's pre-sent promise, doesn't throw, instead returns null
|
|
52
|
+
*
|
|
53
|
+
* @param signDataPrefetch Promise that resolves when we receive "signDataPrefetch" from the LP in streaming mode
|
|
54
|
+
* @protected
|
|
55
|
+
* @returns Pre-fetched signature verification data or null if failed
|
|
56
|
+
*/
|
|
57
|
+
protected preFetchSignData(signDataPrefetch: Promise<any | null>): Promise<T["PreFetchVerification"] | undefined> {
|
|
58
|
+
if(this.contract.preFetchForInitSignatureVerification==null) return Promise.resolve(undefined);
|
|
59
|
+
return signDataPrefetch.then(obj => {
|
|
60
|
+
if(obj==null) return undefined;
|
|
61
|
+
return this.contract.preFetchForInitSignatureVerification!(obj);
|
|
62
|
+
}).catch(e => {
|
|
63
|
+
this.logger.error("preFetchSignData(): Error: ", e);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Verifies swap initialization signature returned by the intermediary
|
|
69
|
+
*
|
|
70
|
+
* @param initiator A smart chain account initiating the swap
|
|
71
|
+
* @param data Parsed swap data from the intermediary
|
|
72
|
+
* @param signature Response of the intermediary
|
|
73
|
+
* @param feeRatePromise Pre-fetched fee rate promise
|
|
74
|
+
* @param preFetchSignatureVerificationData Pre-fetched signature verification data
|
|
75
|
+
* @param abortSignal
|
|
76
|
+
* @protected
|
|
77
|
+
* @returns Swap initialization signature expiry
|
|
78
|
+
* @throws {SignatureVerificationError} when swap init signature is invalid
|
|
79
|
+
*/
|
|
80
|
+
protected async verifyReturnedSignature(
|
|
81
|
+
initiator: string,
|
|
82
|
+
data: T["Data"],
|
|
83
|
+
signature: SignatureData,
|
|
84
|
+
feeRatePromise: Promise<any>,
|
|
85
|
+
preFetchSignatureVerificationData: Promise<any>,
|
|
86
|
+
abortSignal?: AbortSignal
|
|
87
|
+
): Promise<number> {
|
|
88
|
+
const [feeRate, preFetchedSignatureData] = await Promise.all([feeRatePromise, preFetchSignatureVerificationData]);
|
|
89
|
+
await this.contract.isValidInitAuthorization(initiator, data, signature, feeRate, preFetchedSignatureData);
|
|
90
|
+
return await this.contract.getInitAuthorizationExpiry(data, signature, preFetchedSignatureData);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Processes InitializeEvent for a given swap
|
|
95
|
+
* @param swap
|
|
96
|
+
* @param event
|
|
97
|
+
* @protected
|
|
98
|
+
* @returns Whether the swap was updated/changed
|
|
99
|
+
*/
|
|
100
|
+
protected abstract processEventInitialize(swap: D["Swap"], event: InitializeEvent<T["Data"]>): Promise<boolean>;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Processes ClaimEvent for a given swap
|
|
104
|
+
* @param swap
|
|
105
|
+
* @param event
|
|
106
|
+
* @protected
|
|
107
|
+
* @returns Whether the swap was updated/changed
|
|
108
|
+
*/
|
|
109
|
+
protected abstract processEventClaim(swap: D["Swap"], event: ClaimEvent<T["Data"]>): Promise<boolean>;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Processes RefundEvent for a given swap
|
|
113
|
+
* @param swap
|
|
114
|
+
* @param event
|
|
115
|
+
* @protected
|
|
116
|
+
* @returns Whether the swap was updated/changed
|
|
117
|
+
*/
|
|
118
|
+
protected abstract processEventRefund(swap: D["Swap"], event: RefundEvent<T["Data"]>): Promise<boolean>;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Processes a single SC on-chain event
|
|
122
|
+
* @private
|
|
123
|
+
* @param event
|
|
124
|
+
* @param swap
|
|
125
|
+
*/
|
|
126
|
+
protected async processEvent(event: SwapEvent<T["Data"]>, swap: D["Swap"]): Promise<void> {
|
|
127
|
+
if(swap==null) return;
|
|
128
|
+
|
|
129
|
+
let swapChanged: boolean = false;
|
|
130
|
+
if(event instanceof InitializeEvent) {
|
|
131
|
+
swapChanged = await this.processEventInitialize(swap, event);
|
|
132
|
+
if(event.meta?.txId!=null && swap.commitTxId!==event.meta.txId) {
|
|
133
|
+
swap.commitTxId = event.meta.txId;
|
|
134
|
+
swapChanged ||= true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if(event instanceof ClaimEvent) {
|
|
138
|
+
swapChanged = await this.processEventClaim(swap, event);
|
|
139
|
+
if(event.meta?.txId!=null && swap.claimTxId!==event.meta.txId) {
|
|
140
|
+
swap.claimTxId = event.meta.txId;
|
|
141
|
+
swapChanged ||= true;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if(event instanceof RefundEvent) {
|
|
145
|
+
swapChanged = await this.processEventRefund(swap, event);
|
|
146
|
+
if(event.meta?.txId!=null && swap.refundTxId!==event.meta.txId) {
|
|
147
|
+
swap.refundTxId = event.meta.txId;
|
|
148
|
+
swapChanged ||= true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
this.logger.info("processEvents(): "+event.constructor.name+" processed for "+swap.getId()+" swap: ", swap);
|
|
153
|
+
|
|
154
|
+
if(swapChanged) {
|
|
155
|
+
await swap._saveAndEmit();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
protected async _checkPastSwaps(pastSwaps: D["Swap"][]): Promise<{ changedSwaps: D["Swap"][]; removeSwaps: D["Swap"][] }> {
|
|
160
|
+
const changedSwaps: D["Swap"][] = [];
|
|
161
|
+
const removeSwaps: D["Swap"][] = [];
|
|
162
|
+
|
|
163
|
+
const swapExpiredStatus: {[id: string]: boolean} = {};
|
|
164
|
+
|
|
165
|
+
const checkStatusSwaps: (D["Swap"] & {data: T["Data"]})[] = [];
|
|
166
|
+
|
|
167
|
+
for(let pastSwap of pastSwaps) {
|
|
168
|
+
if(pastSwap._shouldFetchExpiryStatus()) {
|
|
169
|
+
//Check expiry
|
|
170
|
+
swapExpiredStatus[pastSwap.getId()] = await pastSwap._verifyQuoteDefinitelyExpired();
|
|
171
|
+
}
|
|
172
|
+
if(pastSwap._shouldFetchCommitStatus()) {
|
|
173
|
+
//Add to swaps for which status should be checked
|
|
174
|
+
if(pastSwap.data!=null) checkStatusSwaps.push(pastSwap as (D["Swap"] & {data: T["Data"]}));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const swapStatuses = await this.contract.getCommitStatuses(checkStatusSwaps.map(val => ({signer: val._getInitiator(), swapData: val.data})));
|
|
179
|
+
|
|
180
|
+
for(let pastSwap of checkStatusSwaps) {
|
|
181
|
+
const escrowHash = pastSwap.getEscrowHash();
|
|
182
|
+
const shouldSave = await pastSwap._sync(
|
|
183
|
+
false,
|
|
184
|
+
swapExpiredStatus[pastSwap.getId()],
|
|
185
|
+
escrowHash==null ? undefined : swapStatuses[escrowHash]
|
|
186
|
+
);
|
|
187
|
+
if(shouldSave) {
|
|
188
|
+
if(pastSwap.isQuoteExpired()) {
|
|
189
|
+
removeSwaps.push(pastSwap);
|
|
190
|
+
} else {
|
|
191
|
+
changedSwaps.push(pastSwap);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return {
|
|
197
|
+
changedSwaps,
|
|
198
|
+
removeSwaps
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
recoverFromSwapDataAndState(
|
|
203
|
+
init: {data: T["Data"], getInitTxId: () => Promise<string>, getTxBlock: () => Promise<{blockTime: number, blockHeight: number}>},
|
|
204
|
+
state: SwapCommitState,
|
|
205
|
+
lp?: Intermediary
|
|
206
|
+
): Promise<D["Swap"] | null> {
|
|
207
|
+
return Promise.resolve(null);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import {ChainType, SwapData} from "@atomiqlabs/base";
|
|
2
|
+
import {IFromBTCDefinition, IFromBTCWrapper} from "./IFromBTCWrapper";
|
|
3
|
+
import {ISwapWrapperOptions, WrapperCtorTokens} from "../../ISwapWrapper";
|
|
4
|
+
import {LightningNetworkApi, LNNodeLiquidity} from "../../../bitcoin/LightningNetworkApi";
|
|
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 {Buffer} from "buffer";
|
|
10
|
+
import {randomBytes} from "../../../utils/Utils";
|
|
11
|
+
import {Intermediary} from "../../../intermediaries/Intermediary";
|
|
12
|
+
import {PaymentRequestObject, TagsObject} from "@atomiqlabs/bolt11";
|
|
13
|
+
import {IntermediaryError} from "../../../errors/IntermediaryError";
|
|
14
|
+
import {LNURL} from "../../../lnurl/LNURL";
|
|
15
|
+
import {UserError} from "../../../errors/UserError";
|
|
16
|
+
import { sha256 } from "@noble/hashes/sha256";
|
|
17
|
+
import {IEscrowSwap} from "../IEscrowSwap";
|
|
18
|
+
import {LNURLWithdrawParamsWithUrl} from "../../../types/lnurl/LNURLWithdraw";
|
|
19
|
+
|
|
20
|
+
export type IFromBTCLNDefinition<T extends ChainType, W extends IFromBTCLNWrapper<T, any>, S extends IEscrowSwap<T>> = IFromBTCDefinition<T, W, S>;
|
|
21
|
+
|
|
22
|
+
export abstract class IFromBTCLNWrapper<
|
|
23
|
+
T extends ChainType,
|
|
24
|
+
D extends IFromBTCLNDefinition<T, IFromBTCLNWrapper<T, D>, IEscrowSwap<T, D>>,
|
|
25
|
+
O extends ISwapWrapperOptions = ISwapWrapperOptions
|
|
26
|
+
> extends IFromBTCWrapper<T, D, O> {
|
|
27
|
+
|
|
28
|
+
protected readonly lnApi: LightningNetworkApi;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param chainIdentifier
|
|
32
|
+
* @param unifiedStorage Storage interface for the current environment
|
|
33
|
+
* @param unifiedChainEvents On-chain event listener
|
|
34
|
+
* @param chain
|
|
35
|
+
* @param contract Underlying contract handling the swaps
|
|
36
|
+
* @param prices Swap pricing handler
|
|
37
|
+
* @param tokens
|
|
38
|
+
* @param swapDataDeserializer Deserializer for SwapData
|
|
39
|
+
* @param lnApi
|
|
40
|
+
* @param options
|
|
41
|
+
* @param events Instance to use for emitting events
|
|
42
|
+
*/
|
|
43
|
+
constructor(
|
|
44
|
+
chainIdentifier: string,
|
|
45
|
+
unifiedStorage: UnifiedSwapStorage<T>,
|
|
46
|
+
unifiedChainEvents: UnifiedSwapEventListener<T>,
|
|
47
|
+
chain: T["ChainInterface"],
|
|
48
|
+
contract: T["Contract"],
|
|
49
|
+
prices: ISwapPrice,
|
|
50
|
+
tokens: WrapperCtorTokens,
|
|
51
|
+
swapDataDeserializer: new (data: any) => T["Data"],
|
|
52
|
+
lnApi: LightningNetworkApi,
|
|
53
|
+
options: O,
|
|
54
|
+
events?: EventEmitter<{swapState: [IEscrowSwap]}>
|
|
55
|
+
) {
|
|
56
|
+
super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, options, events);
|
|
57
|
+
this.lnApi = lnApi;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Returns the swap expiry, leaving enough time for the user to claim the HTLC
|
|
61
|
+
*
|
|
62
|
+
* @param data Parsed swap data
|
|
63
|
+
*/
|
|
64
|
+
getHtlcTimeout(data: SwapData): bigint {
|
|
65
|
+
return data.getExpiry() - 600n;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Generates a new 32-byte secret to be used as pre-image for lightning network invoice & HTLC swap\
|
|
70
|
+
*
|
|
71
|
+
* @private
|
|
72
|
+
* @returns Hash pre-image & payment hash
|
|
73
|
+
*/
|
|
74
|
+
protected getSecretAndHash(): {secret: Buffer, paymentHash: Buffer} {
|
|
75
|
+
const secret = randomBytes(32);
|
|
76
|
+
const paymentHash = Buffer.from(sha256(secret));
|
|
77
|
+
return {secret, paymentHash};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Pre-fetches intermediary's LN node capacity, doesn't throw, instead returns null
|
|
82
|
+
*
|
|
83
|
+
* @param pubkeyPromise Promise that resolves when we receive "lnPublicKey" param from the intermediary thorugh
|
|
84
|
+
* streaming
|
|
85
|
+
* @private
|
|
86
|
+
* @returns LN Node liquidity
|
|
87
|
+
*/
|
|
88
|
+
protected preFetchLnCapacity(pubkeyPromise: Promise<string | null>): Promise<LNNodeLiquidity | null> {
|
|
89
|
+
return pubkeyPromise.then(pubkey => {
|
|
90
|
+
if(pubkey==null) return null;
|
|
91
|
+
return this.lnApi.getLNNodeLiquidity(pubkey)
|
|
92
|
+
}).catch(e => {
|
|
93
|
+
this.logger.warn("preFetchLnCapacity(): Error: ", e);
|
|
94
|
+
return null;
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Verifies whether the intermediary's lightning node has enough inbound capacity to receive the LN payment
|
|
100
|
+
*
|
|
101
|
+
* @param lp Intermediary
|
|
102
|
+
* @param decodedPr Decoded bolt11 lightning network invoice
|
|
103
|
+
* @param amountIn Amount to be paid for the swap in sats
|
|
104
|
+
* @param lnCapacityPrefetchPromise Pre-fetch for LN node capacity, preFetchLnCapacity()
|
|
105
|
+
* @param abortSignal
|
|
106
|
+
* @private
|
|
107
|
+
* @throws {IntermediaryError} if the lightning network node doesn't have enough inbound liquidity
|
|
108
|
+
* @throws {Error} if the lightning network node's inbound liquidity might be enough, but the swap would
|
|
109
|
+
* deplete more than half of the liquidity
|
|
110
|
+
*/
|
|
111
|
+
protected async verifyLnNodeCapacity(
|
|
112
|
+
lp: Intermediary,
|
|
113
|
+
decodedPr: PaymentRequestObject & {tagsObject: TagsObject},
|
|
114
|
+
lnCapacityPrefetchPromise?: Promise<LNNodeLiquidity | null>,
|
|
115
|
+
abortSignal?: AbortSignal
|
|
116
|
+
): Promise<void> {
|
|
117
|
+
if(decodedPr.payeeNodeKey==null) throw new Error("Unable to extract payee pubkey from the swap invoice!");
|
|
118
|
+
if(decodedPr.millisatoshis==null) throw new Error("Swap invoice doesn't contains msat amount field!");
|
|
119
|
+
|
|
120
|
+
const _result = await lnCapacityPrefetchPromise ?? await this.lnApi.getLNNodeLiquidity(decodedPr.payeeNodeKey);
|
|
121
|
+
if(_result===null) throw new IntermediaryError("LP's lightning node not found in the lightning network graph!");
|
|
122
|
+
|
|
123
|
+
lp.lnData = _result;
|
|
124
|
+
|
|
125
|
+
if(decodedPr.payeeNodeKey!==_result.publicKey) throw new IntermediaryError("Invalid pr returned - payee pubkey");
|
|
126
|
+
const amountIn = (BigInt(decodedPr.millisatoshis) + 999n) / 1000n;
|
|
127
|
+
if(_result.capacity < amountIn)
|
|
128
|
+
throw new IntermediaryError("LP's lightning node doesn't have enough inbound capacity for the swap!");
|
|
129
|
+
if((_result.capacity / 2n) < amountIn)
|
|
130
|
+
throw new Error("LP's lightning node probably doesn't have enough inbound capacity for the swap!");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Parses and fetches lnurl withdraw params from the specified lnurl
|
|
135
|
+
*
|
|
136
|
+
* @param lnurl LNURL to be parsed and fetched
|
|
137
|
+
* @param abortSignal
|
|
138
|
+
* @private
|
|
139
|
+
* @throws {UserError} if the LNURL is invalid or if it's not a LNURL-withdraw
|
|
140
|
+
*/
|
|
141
|
+
protected async getLNURLWithdraw(lnurl: string | LNURLWithdrawParamsWithUrl, abortSignal: AbortSignal): Promise<LNURLWithdrawParamsWithUrl> {
|
|
142
|
+
if(typeof(lnurl)!=="string") return lnurl;
|
|
143
|
+
|
|
144
|
+
const res = await LNURL.getLNURL(lnurl, true, this.options.getRequestTimeout, abortSignal);
|
|
145
|
+
if(res==null) throw new UserError("Invalid LNURL");
|
|
146
|
+
if(res.tag!=="withdrawRequest") throw new UserError("Not a LNURL-withdrawal");
|
|
147
|
+
return res;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
}
|