@atomiqlabs/sdk 7.0.12 → 8.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -29
- package/dist/SmartChainAssets.d.ts +11 -3
- package/dist/SmartChainAssets.js +7 -3
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
- package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
- package/dist/bitcoin/LightningNetworkApi.js +2 -0
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
- package/dist/bitcoin/coinselect2/accumulative.js +52 -0
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
- package/dist/bitcoin/coinselect2/blackjack.js +38 -0
- package/dist/bitcoin/coinselect2/index.d.ts +19 -0
- package/dist/bitcoin/coinselect2/index.js +69 -0
- package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
- package/dist/bitcoin/coinselect2/utils.js +123 -0
- package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
- package/dist/bitcoin/mempool/MempoolApi.js +311 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
- package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
- package/dist/enums/FeeType.d.ts +8 -0
- package/dist/enums/FeeType.js +12 -0
- package/dist/enums/SwapAmountType.d.ts +8 -0
- package/dist/enums/SwapAmountType.js +12 -0
- package/dist/enums/SwapDirection.d.ts +8 -0
- package/dist/enums/SwapDirection.js +12 -0
- package/dist/enums/SwapType.d.ts +14 -0
- package/dist/enums/SwapType.js +18 -0
- package/dist/errors/IntermediaryError.d.ts +9 -0
- package/dist/errors/IntermediaryError.js +26 -0
- package/dist/errors/PaymentAuthError.d.ts +11 -0
- package/dist/errors/PaymentAuthError.js +23 -0
- package/dist/errors/RequestError.d.ts +18 -0
- package/dist/errors/RequestError.js +46 -0
- package/dist/errors/UserError.d.ts +7 -0
- package/dist/errors/UserError.js +15 -0
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
- package/dist/events/UnifiedSwapEventListener.js +130 -0
- package/dist/http/HttpUtils.d.ts +27 -0
- package/dist/http/HttpUtils.js +91 -0
- package/dist/http/paramcoders/IParamReader.d.ts +8 -0
- package/dist/http/paramcoders/IParamReader.js +2 -0
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
- package/dist/http/paramcoders/ParamDecoder.js +132 -0
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
- package/dist/http/paramcoders/ParamEncoder.js +31 -0
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
- package/dist/http/paramcoders/SchemaVerifier.js +145 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
- package/dist/index.d.ts +82 -4
- package/dist/index.js +128 -4
- package/dist/intermediaries/Intermediary.d.ts +111 -0
- package/dist/intermediaries/Intermediary.js +115 -0
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
- package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
- package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
- package/dist/lnurl/LNURL.d.ts +102 -0
- package/dist/lnurl/LNURL.js +321 -0
- package/dist/prices/RedundantSwapPrice.d.ts +89 -0
- package/dist/prices/RedundantSwapPrice.js +202 -0
- package/dist/prices/SingleSwapPrice.d.ts +31 -0
- package/dist/prices/SingleSwapPrice.js +41 -0
- package/dist/prices/SwapPriceWithChain.d.ts +70 -0
- package/dist/prices/SwapPriceWithChain.js +91 -0
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
- package/dist/prices/abstract/IPriceProvider.js +74 -0
- package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
- package/dist/prices/abstract/ISwapPrice.js +219 -0
- package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
- package/dist/prices/providers/BinancePriceProvider.js +23 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
- package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
- package/dist/prices/providers/CustomPriceProvider.js +24 -0
- package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
- package/dist/prices/providers/KrakenPriceProvider.js +36 -0
- package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
- package/dist/prices/providers/OKXPriceProvider.js +23 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
- package/dist/storage/IUnifiedStorage.d.ts +73 -0
- package/dist/storage/IUnifiedStorage.js +2 -0
- package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
- package/dist/storage/UnifiedSwapStorage.js +83 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
- package/dist/swapper/Swapper.d.ts +533 -0
- package/dist/swapper/Swapper.js +1566 -0
- package/dist/swapper/SwapperFactory.d.ts +87 -0
- package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +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,120 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { IFromBTCWrapper } from "../IFromBTCWrapper";
|
|
3
|
+
import { FromBTCSwap, FromBTCSwapState } from "./FromBTCSwap";
|
|
4
|
+
import { ChainType, ClaimEvent, InitializeEvent, RefundEvent, RelaySynchronizer, SwapData, BtcRelay } from "@atomiqlabs/base";
|
|
5
|
+
import { EventEmitter } from "events";
|
|
6
|
+
import { Intermediary } from "../../../../intermediaries/Intermediary";
|
|
7
|
+
import { BitcoinRpcWithAddressIndex } from "../../../../bitcoin/BitcoinRpcWithAddressIndex";
|
|
8
|
+
import { ISwapPrice } from "../../../../prices/abstract/ISwapPrice";
|
|
9
|
+
import { ISwapWrapperOptions, WrapperCtorTokens } from "../../../ISwapWrapper";
|
|
10
|
+
import { SwapType } from "../../../../enums/SwapType";
|
|
11
|
+
import { BTC_NETWORK } from "@scure/btc-signer/utils";
|
|
12
|
+
import { UnifiedSwapEventListener } from "../../../../events/UnifiedSwapEventListener";
|
|
13
|
+
import { UnifiedSwapStorage } from "../../../../storage/UnifiedSwapStorage";
|
|
14
|
+
import { ISwap } from "../../../ISwap";
|
|
15
|
+
import { IClaimableSwapWrapper } from "../../../IClaimableSwapWrapper";
|
|
16
|
+
import { IFromBTCSelfInitDefinition } from "../IFromBTCSelfInitSwap";
|
|
17
|
+
import { AmountData } from "../../../../types/AmountData";
|
|
18
|
+
import { AllOptional } from "../../../../utils/TypeUtils";
|
|
19
|
+
export type FromBTCOptions = {
|
|
20
|
+
feeSafetyFactor?: bigint;
|
|
21
|
+
blockSafetyFactor?: number;
|
|
22
|
+
unsafeZeroWatchtowerFee?: boolean;
|
|
23
|
+
};
|
|
24
|
+
export type FromBTCWrapperOptions = ISwapWrapperOptions & {
|
|
25
|
+
safetyFactor: number;
|
|
26
|
+
blocksTillTxConfirms: number;
|
|
27
|
+
maxConfirmations: number;
|
|
28
|
+
minSendWindow: number;
|
|
29
|
+
bitcoinNetwork: BTC_NETWORK;
|
|
30
|
+
bitcoinBlocktime: number;
|
|
31
|
+
};
|
|
32
|
+
export type FromBTCDefinition<T extends ChainType> = IFromBTCSelfInitDefinition<T, FromBTCWrapper<T>, FromBTCSwap<T>>;
|
|
33
|
+
export declare class FromBTCWrapper<T extends ChainType> extends IFromBTCWrapper<T, FromBTCDefinition<T>, FromBTCWrapperOptions> implements IClaimableSwapWrapper<FromBTCSwap<T>> {
|
|
34
|
+
readonly claimableSwapStates: FromBTCSwapState[];
|
|
35
|
+
readonly TYPE = SwapType.FROM_BTC;
|
|
36
|
+
readonly swapDeserializer: typeof FromBTCSwap;
|
|
37
|
+
readonly synchronizer: RelaySynchronizer<any, T["TX"], any>;
|
|
38
|
+
readonly btcRelay: BtcRelay<any, T["TX"], any>;
|
|
39
|
+
readonly btcRpc: BitcoinRpcWithAddressIndex<any>;
|
|
40
|
+
/**
|
|
41
|
+
* @param chainIdentifier
|
|
42
|
+
* @param unifiedStorage Storage interface for the current environment
|
|
43
|
+
* @param unifiedChainEvents On-chain event listener
|
|
44
|
+
* @param chain
|
|
45
|
+
* @param contract Underlying contract handling the swaps
|
|
46
|
+
* @param prices Pricing to use
|
|
47
|
+
* @param tokens
|
|
48
|
+
* @param swapDataDeserializer Deserializer for SwapData
|
|
49
|
+
* @param btcRelay
|
|
50
|
+
* @param synchronizer Btc relay synchronizer
|
|
51
|
+
* @param btcRpc Bitcoin RPC which also supports getting transactions by txoHash
|
|
52
|
+
* @param options
|
|
53
|
+
* @param events Instance to use for emitting events
|
|
54
|
+
*/
|
|
55
|
+
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"], btcRelay: BtcRelay<any, T["TX"], any>, synchronizer: RelaySynchronizer<any, T["TX"], any>, btcRpc: BitcoinRpcWithAddressIndex<any>, options?: AllOptional<FromBTCWrapperOptions>, events?: EventEmitter<{
|
|
56
|
+
swapState: [ISwap];
|
|
57
|
+
}>);
|
|
58
|
+
readonly pendingSwapStates: FromBTCSwapState[];
|
|
59
|
+
readonly tickSwapState: FromBTCSwapState[];
|
|
60
|
+
protected processEventInitialize(swap: FromBTCSwap<T>, event: InitializeEvent<T["Data"]>): Promise<boolean>;
|
|
61
|
+
protected processEventClaim(swap: FromBTCSwap<T>, event: ClaimEvent<T["Data"]>): Promise<boolean>;
|
|
62
|
+
protected processEventRefund(swap: FromBTCSwap<T>, event: RefundEvent<T["Data"]>): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Returns the swap expiry, leaving enough time for the user to send a transaction and for it to confirm
|
|
65
|
+
*
|
|
66
|
+
* @param data Parsed swap data
|
|
67
|
+
* @param requiredConfirmations Confirmations required to claim the tx
|
|
68
|
+
*/
|
|
69
|
+
getOnchainSendTimeout(data: SwapData, requiredConfirmations: number): bigint;
|
|
70
|
+
/**
|
|
71
|
+
* Pre-fetches claimer (watchtower) bounty data for the swap. Doesn't throw, instead returns null and aborts the
|
|
72
|
+
* provided abortController
|
|
73
|
+
*
|
|
74
|
+
* @param signer Smartchain signer address initiating the swap
|
|
75
|
+
* @param amountData
|
|
76
|
+
* @param options Options as passed to the swap creation function
|
|
77
|
+
* @param abortController
|
|
78
|
+
* @private
|
|
79
|
+
*/
|
|
80
|
+
private preFetchClaimerBounty;
|
|
81
|
+
/**
|
|
82
|
+
* Returns calculated claimer bounty calculated from the claimer bounty data as fetched from preFetchClaimerBounty()
|
|
83
|
+
*
|
|
84
|
+
* @param data Parsed swap data returned from the intermediary
|
|
85
|
+
* @param options Options as passed to the swap creation function
|
|
86
|
+
* @param claimerBounty Claimer bounty data as fetched from preFetchClaimerBounty() function
|
|
87
|
+
* @private
|
|
88
|
+
*/
|
|
89
|
+
private getClaimerBounty;
|
|
90
|
+
/**
|
|
91
|
+
* Verifies response returned from intermediary
|
|
92
|
+
*
|
|
93
|
+
* @param signer
|
|
94
|
+
* @param resp Response as returned by the intermediary
|
|
95
|
+
* @param amountData
|
|
96
|
+
* @param lp Intermediary
|
|
97
|
+
* @param options Options as passed to the swap creation function
|
|
98
|
+
* @param data Parsed swap data returned by the intermediary
|
|
99
|
+
* @param sequence Required swap sequence
|
|
100
|
+
* @param claimerBounty Claimer bount data as returned from the preFetchClaimerBounty() pre-fetch promise
|
|
101
|
+
* @param depositToken
|
|
102
|
+
* @private
|
|
103
|
+
* @throws {IntermediaryError} in case the response is invalid
|
|
104
|
+
*/
|
|
105
|
+
private verifyReturnedData;
|
|
106
|
+
/**
|
|
107
|
+
* Returns a newly created swap, receiving 'amount' on chain
|
|
108
|
+
*
|
|
109
|
+
* @param signer Smartchain signer's address intiating the swap
|
|
110
|
+
* @param amountData Amount of token & amount to swap
|
|
111
|
+
* @param lps LPs (liquidity providers) to get the quotes from
|
|
112
|
+
* @param options Quote options
|
|
113
|
+
* @param additionalParams Additional parameters sent to the LP when creating the swap
|
|
114
|
+
* @param abortSignal Abort signal for aborting the process
|
|
115
|
+
*/
|
|
116
|
+
create(signer: string, amountData: AmountData, lps: Intermediary[], options?: FromBTCOptions, additionalParams?: Record<string, any>, abortSignal?: AbortSignal): {
|
|
117
|
+
quote: Promise<FromBTCSwap<T>>;
|
|
118
|
+
intermediary: Intermediary;
|
|
119
|
+
}[];
|
|
120
|
+
}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FromBTCWrapper = void 0;
|
|
4
|
+
const IFromBTCWrapper_1 = require("../IFromBTCWrapper");
|
|
5
|
+
const FromBTCSwap_1 = require("./FromBTCSwap");
|
|
6
|
+
const base_1 = require("@atomiqlabs/base");
|
|
7
|
+
const buffer_1 = require("buffer");
|
|
8
|
+
const IntermediaryError_1 = require("../../../../errors/IntermediaryError");
|
|
9
|
+
const SwapType_1 = require("../../../../enums/SwapType");
|
|
10
|
+
const Utils_1 = require("../../../../utils/Utils");
|
|
11
|
+
const BitcoinUtils_1 = require("../../../../utils/BitcoinUtils");
|
|
12
|
+
const IntermediaryAPI_1 = require("../../../../intermediaries/apis/IntermediaryAPI");
|
|
13
|
+
const RequestError_1 = require("../../../../errors/RequestError");
|
|
14
|
+
const utils_1 = require("@scure/btc-signer/utils");
|
|
15
|
+
const RetryUtils_1 = require("../../../../utils/RetryUtils");
|
|
16
|
+
class FromBTCWrapper extends IFromBTCWrapper_1.IFromBTCWrapper {
|
|
17
|
+
/**
|
|
18
|
+
* @param chainIdentifier
|
|
19
|
+
* @param unifiedStorage Storage interface for the current environment
|
|
20
|
+
* @param unifiedChainEvents On-chain event listener
|
|
21
|
+
* @param chain
|
|
22
|
+
* @param contract Underlying contract handling the swaps
|
|
23
|
+
* @param prices Pricing to use
|
|
24
|
+
* @param tokens
|
|
25
|
+
* @param swapDataDeserializer Deserializer for SwapData
|
|
26
|
+
* @param btcRelay
|
|
27
|
+
* @param synchronizer Btc relay synchronizer
|
|
28
|
+
* @param btcRpc Bitcoin RPC which also supports getting transactions by txoHash
|
|
29
|
+
* @param options
|
|
30
|
+
* @param events Instance to use for emitting events
|
|
31
|
+
*/
|
|
32
|
+
constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, btcRelay, synchronizer, btcRpc, options, events) {
|
|
33
|
+
super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, {
|
|
34
|
+
bitcoinNetwork: options?.bitcoinNetwork ?? utils_1.TEST_NETWORK,
|
|
35
|
+
safetyFactor: options?.safetyFactor ?? 2,
|
|
36
|
+
blocksTillTxConfirms: options?.blocksTillTxConfirms ?? 12,
|
|
37
|
+
maxConfirmations: options?.maxConfirmations ?? 6,
|
|
38
|
+
minSendWindow: options?.minSendWindow ?? 30 * 60,
|
|
39
|
+
bitcoinBlocktime: options?.bitcoinBlocktime ?? 10 * 60
|
|
40
|
+
}, events);
|
|
41
|
+
this.claimableSwapStates = [FromBTCSwap_1.FromBTCSwapState.BTC_TX_CONFIRMED];
|
|
42
|
+
this.TYPE = SwapType_1.SwapType.FROM_BTC;
|
|
43
|
+
this.swapDeserializer = FromBTCSwap_1.FromBTCSwap;
|
|
44
|
+
this.pendingSwapStates = [
|
|
45
|
+
FromBTCSwap_1.FromBTCSwapState.PR_CREATED,
|
|
46
|
+
FromBTCSwap_1.FromBTCSwapState.QUOTE_SOFT_EXPIRED,
|
|
47
|
+
FromBTCSwap_1.FromBTCSwapState.CLAIM_COMMITED,
|
|
48
|
+
FromBTCSwap_1.FromBTCSwapState.BTC_TX_CONFIRMED,
|
|
49
|
+
FromBTCSwap_1.FromBTCSwapState.EXPIRED
|
|
50
|
+
];
|
|
51
|
+
this.tickSwapState = [FromBTCSwap_1.FromBTCSwapState.PR_CREATED, FromBTCSwap_1.FromBTCSwapState.CLAIM_COMMITED, FromBTCSwap_1.FromBTCSwapState.EXPIRED];
|
|
52
|
+
this.btcRelay = btcRelay;
|
|
53
|
+
this.synchronizer = synchronizer;
|
|
54
|
+
this.btcRpc = btcRpc;
|
|
55
|
+
}
|
|
56
|
+
processEventInitialize(swap, event) {
|
|
57
|
+
if (swap.state === FromBTCSwap_1.FromBTCSwapState.PR_CREATED || swap.state === FromBTCSwap_1.FromBTCSwapState.QUOTE_SOFT_EXPIRED) {
|
|
58
|
+
swap.state = FromBTCSwap_1.FromBTCSwapState.CLAIM_COMMITED;
|
|
59
|
+
return Promise.resolve(true);
|
|
60
|
+
}
|
|
61
|
+
return Promise.resolve(false);
|
|
62
|
+
}
|
|
63
|
+
async processEventClaim(swap, event) {
|
|
64
|
+
if (swap.state !== FromBTCSwap_1.FromBTCSwapState.FAILED && swap.state !== FromBTCSwap_1.FromBTCSwapState.CLAIM_CLAIMED) {
|
|
65
|
+
await swap._setBitcoinTxId(buffer_1.Buffer.from(event.result, "hex").reverse().toString("hex")).catch(e => {
|
|
66
|
+
this.logger.warn("processEventClaim(): Error setting bitcoin txId: ", e);
|
|
67
|
+
});
|
|
68
|
+
swap.state = FromBTCSwap_1.FromBTCSwapState.CLAIM_CLAIMED;
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
processEventRefund(swap, event) {
|
|
74
|
+
if (swap.state !== FromBTCSwap_1.FromBTCSwapState.CLAIM_CLAIMED && swap.state !== FromBTCSwap_1.FromBTCSwapState.FAILED) {
|
|
75
|
+
swap.state = FromBTCSwap_1.FromBTCSwapState.FAILED;
|
|
76
|
+
return Promise.resolve(true);
|
|
77
|
+
}
|
|
78
|
+
return Promise.resolve(false);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Returns the swap expiry, leaving enough time for the user to send a transaction and for it to confirm
|
|
82
|
+
*
|
|
83
|
+
* @param data Parsed swap data
|
|
84
|
+
* @param requiredConfirmations Confirmations required to claim the tx
|
|
85
|
+
*/
|
|
86
|
+
getOnchainSendTimeout(data, requiredConfirmations) {
|
|
87
|
+
const tsDelta = (this.options.blocksTillTxConfirms + requiredConfirmations) * this.options.bitcoinBlocktime * this.options.safetyFactor;
|
|
88
|
+
return data.getExpiry() - BigInt(tsDelta);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Pre-fetches claimer (watchtower) bounty data for the swap. Doesn't throw, instead returns null and aborts the
|
|
92
|
+
* provided abortController
|
|
93
|
+
*
|
|
94
|
+
* @param signer Smartchain signer address initiating the swap
|
|
95
|
+
* @param amountData
|
|
96
|
+
* @param options Options as passed to the swap creation function
|
|
97
|
+
* @param abortController
|
|
98
|
+
* @private
|
|
99
|
+
*/
|
|
100
|
+
async preFetchClaimerBounty(signer, amountData, options, abortController) {
|
|
101
|
+
const startTimestamp = BigInt(Math.floor(Date.now() / 1000));
|
|
102
|
+
if (options.unsafeZeroWatchtowerFee) {
|
|
103
|
+
return {
|
|
104
|
+
feePerBlock: 0n,
|
|
105
|
+
safetyFactor: options.blockSafetyFactor,
|
|
106
|
+
startTimestamp: startTimestamp,
|
|
107
|
+
addBlock: 0,
|
|
108
|
+
addFee: 0n
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const dummyAmount = BigInt(Math.floor(Math.random() * 0x1000000));
|
|
112
|
+
const dummySwapData = await this.contract.createSwapData(base_1.ChainSwapType.CHAIN, signer, signer, amountData.token, dummyAmount, this.contract.getHashForOnchain((0, Utils_1.randomBytes)(20), dummyAmount, 3).toString("hex"), this.getRandomSequence(), startTimestamp, false, true, BigInt(Math.floor(Math.random() * 0x10000)), BigInt(Math.floor(Math.random() * 0x10000)));
|
|
113
|
+
try {
|
|
114
|
+
const [feePerBlock, btcRelayData, currentBtcBlock, claimFeeRate] = await Promise.all([
|
|
115
|
+
this.btcRelay.getFeePerBlock(),
|
|
116
|
+
this.btcRelay.getTipData(),
|
|
117
|
+
this.btcRpc.getTipHeight(),
|
|
118
|
+
this.contract.getClaimFee(signer, dummySwapData)
|
|
119
|
+
]);
|
|
120
|
+
if (btcRelayData == null)
|
|
121
|
+
throw new Error("Btc relay not initialized!");
|
|
122
|
+
const currentBtcRelayBlock = btcRelayData.blockheight;
|
|
123
|
+
const addBlock = Math.max(currentBtcBlock - currentBtcRelayBlock, 0);
|
|
124
|
+
return {
|
|
125
|
+
feePerBlock: feePerBlock * options.feeSafetyFactor,
|
|
126
|
+
safetyFactor: options.blockSafetyFactor,
|
|
127
|
+
startTimestamp: startTimestamp,
|
|
128
|
+
addBlock,
|
|
129
|
+
addFee: claimFeeRate * options.feeSafetyFactor
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
abortController.abort(e);
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Returns calculated claimer bounty calculated from the claimer bounty data as fetched from preFetchClaimerBounty()
|
|
139
|
+
*
|
|
140
|
+
* @param data Parsed swap data returned from the intermediary
|
|
141
|
+
* @param options Options as passed to the swap creation function
|
|
142
|
+
* @param claimerBounty Claimer bounty data as fetched from preFetchClaimerBounty() function
|
|
143
|
+
* @private
|
|
144
|
+
*/
|
|
145
|
+
getClaimerBounty(data, options, claimerBounty) {
|
|
146
|
+
const tsDelta = data.getExpiry() - claimerBounty.startTimestamp;
|
|
147
|
+
const blocksDelta = tsDelta / BigInt(this.options.bitcoinBlocktime) * BigInt(options.blockSafetyFactor);
|
|
148
|
+
const totalBlock = blocksDelta + BigInt(claimerBounty.addBlock);
|
|
149
|
+
return claimerBounty.addFee + (totalBlock * claimerBounty.feePerBlock);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Verifies response returned from intermediary
|
|
153
|
+
*
|
|
154
|
+
* @param signer
|
|
155
|
+
* @param resp Response as returned by the intermediary
|
|
156
|
+
* @param amountData
|
|
157
|
+
* @param lp Intermediary
|
|
158
|
+
* @param options Options as passed to the swap creation function
|
|
159
|
+
* @param data Parsed swap data returned by the intermediary
|
|
160
|
+
* @param sequence Required swap sequence
|
|
161
|
+
* @param claimerBounty Claimer bount data as returned from the preFetchClaimerBounty() pre-fetch promise
|
|
162
|
+
* @param depositToken
|
|
163
|
+
* @private
|
|
164
|
+
* @throws {IntermediaryError} in case the response is invalid
|
|
165
|
+
*/
|
|
166
|
+
verifyReturnedData(signer, resp, amountData, lp, options, data, sequence, claimerBounty, depositToken) {
|
|
167
|
+
if (amountData.exactIn) {
|
|
168
|
+
if (resp.amount !== amountData.amount)
|
|
169
|
+
throw new IntermediaryError_1.IntermediaryError("Invalid amount returned");
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
if (resp.total !== amountData.amount)
|
|
173
|
+
throw new IntermediaryError_1.IntermediaryError("Invalid total returned");
|
|
174
|
+
}
|
|
175
|
+
const requiredConfirmations = resp.confirmations;
|
|
176
|
+
if (requiredConfirmations > this.options.maxConfirmations)
|
|
177
|
+
throw new IntermediaryError_1.IntermediaryError("Requires too many confirmations");
|
|
178
|
+
const totalClaimerBounty = this.getClaimerBounty(data, options, claimerBounty);
|
|
179
|
+
if (data.getClaimerBounty() !== totalClaimerBounty ||
|
|
180
|
+
data.getType() != base_1.ChainSwapType.CHAIN ||
|
|
181
|
+
data.getSequence() !== sequence ||
|
|
182
|
+
data.getAmount() !== resp.total ||
|
|
183
|
+
data.isPayIn() ||
|
|
184
|
+
!data.isToken(amountData.token) ||
|
|
185
|
+
!data.isOfferer(lp.getAddress(this.chainIdentifier)) ||
|
|
186
|
+
!data.isClaimer(signer) ||
|
|
187
|
+
!data.isDepositToken(depositToken) ||
|
|
188
|
+
data.hasSuccessAction()) {
|
|
189
|
+
throw new IntermediaryError_1.IntermediaryError("Invalid data returned");
|
|
190
|
+
}
|
|
191
|
+
//Check that we have enough time to send the TX and for it to confirm
|
|
192
|
+
const expiry = this.getOnchainSendTimeout(data, requiredConfirmations);
|
|
193
|
+
const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
|
|
194
|
+
if ((expiry - currentTimestamp) < BigInt(this.options.minSendWindow)) {
|
|
195
|
+
throw new IntermediaryError_1.IntermediaryError("Send window too low");
|
|
196
|
+
}
|
|
197
|
+
const lockingScript = (0, BitcoinUtils_1.toOutputScript)(this.options.bitcoinNetwork, resp.btcAddress);
|
|
198
|
+
const desiredExtraData = this.contract.getExtraData(lockingScript, resp.amount, requiredConfirmations);
|
|
199
|
+
const desiredClaimHash = this.contract.getHashForOnchain(lockingScript, resp.amount, requiredConfirmations);
|
|
200
|
+
if (!desiredClaimHash.equals(buffer_1.Buffer.from(data.getClaimHash(), "hex"))) {
|
|
201
|
+
throw new IntermediaryError_1.IntermediaryError("Invalid claim hash returned!");
|
|
202
|
+
}
|
|
203
|
+
const extraData = data.getExtraData();
|
|
204
|
+
if (extraData == null || !desiredExtraData.equals(buffer_1.Buffer.from(extraData, "hex"))) {
|
|
205
|
+
throw new IntermediaryError_1.IntermediaryError("Invalid extra data returned!");
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Returns a newly created swap, receiving 'amount' on chain
|
|
210
|
+
*
|
|
211
|
+
* @param signer Smartchain signer's address intiating the swap
|
|
212
|
+
* @param amountData Amount of token & amount to swap
|
|
213
|
+
* @param lps LPs (liquidity providers) to get the quotes from
|
|
214
|
+
* @param options Quote options
|
|
215
|
+
* @param additionalParams Additional parameters sent to the LP when creating the swap
|
|
216
|
+
* @param abortSignal Abort signal for aborting the process
|
|
217
|
+
*/
|
|
218
|
+
create(signer, amountData, lps, options, additionalParams, abortSignal) {
|
|
219
|
+
const _options = {
|
|
220
|
+
blockSafetyFactor: options?.blockSafetyFactor ?? 1,
|
|
221
|
+
feeSafetyFactor: options?.feeSafetyFactor ?? 2n,
|
|
222
|
+
unsafeZeroWatchtowerFee: options?.unsafeZeroWatchtowerFee ?? false
|
|
223
|
+
};
|
|
224
|
+
const sequence = this.getRandomSequence();
|
|
225
|
+
const _abortController = (0, Utils_1.extendAbortController)(abortSignal);
|
|
226
|
+
const pricePrefetchPromise = this.preFetchPrice(amountData, _abortController.signal);
|
|
227
|
+
const usdPricePrefetchPromise = this.preFetchUsdPrice(_abortController.signal);
|
|
228
|
+
const claimerBountyPrefetchPromise = this.preFetchClaimerBounty(signer, amountData, _options, _abortController);
|
|
229
|
+
const nativeTokenAddress = this.chain.getNativeCurrencyAddress();
|
|
230
|
+
const feeRatePromise = this.preFetchFeeRate(signer, amountData, undefined, _abortController);
|
|
231
|
+
const _signDataPromise = this.contract.preFetchBlockDataForSignatures == null ?
|
|
232
|
+
this.preFetchSignData(Promise.resolve(true)) :
|
|
233
|
+
undefined;
|
|
234
|
+
return lps.map(lp => {
|
|
235
|
+
return {
|
|
236
|
+
intermediary: lp,
|
|
237
|
+
quote: (async () => {
|
|
238
|
+
if (lp.services[SwapType_1.SwapType.FROM_BTC] == null)
|
|
239
|
+
throw new Error("LP service for processing from btc swaps not found!");
|
|
240
|
+
const abortController = (0, Utils_1.extendAbortController)(_abortController.signal);
|
|
241
|
+
const liquidityPromise = this.preFetchIntermediaryLiquidity(amountData, lp, abortController);
|
|
242
|
+
try {
|
|
243
|
+
const { signDataPromise, resp } = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
|
|
244
|
+
const { signDataPrefetch, response } = IntermediaryAPI_1.IntermediaryAPI.initFromBTC(this.chainIdentifier, lp.url, nativeTokenAddress, {
|
|
245
|
+
claimer: signer,
|
|
246
|
+
amount: amountData.amount,
|
|
247
|
+
token: amountData.token.toString(),
|
|
248
|
+
exactOut: !amountData.exactIn,
|
|
249
|
+
sequence,
|
|
250
|
+
claimerBounty: (0, Utils_1.throwIfUndefined)(claimerBountyPrefetchPromise),
|
|
251
|
+
feeRate: (0, Utils_1.throwIfUndefined)(feeRatePromise),
|
|
252
|
+
additionalParams
|
|
253
|
+
}, this.options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
|
|
254
|
+
return {
|
|
255
|
+
signDataPromise: _signDataPromise ?? this.preFetchSignData(signDataPrefetch),
|
|
256
|
+
resp: await response
|
|
257
|
+
};
|
|
258
|
+
}, undefined, e => e instanceof RequestError_1.RequestError, abortController.signal);
|
|
259
|
+
const data = new this.swapDataDeserializer(resp.data);
|
|
260
|
+
data.setClaimer(signer);
|
|
261
|
+
this.verifyReturnedData(signer, resp, amountData, lp, _options, data, sequence, (await claimerBountyPrefetchPromise), nativeTokenAddress);
|
|
262
|
+
const [pricingInfo, signatureExpiry] = await Promise.all([
|
|
263
|
+
//Get intermediary's liquidity
|
|
264
|
+
this.verifyReturnedPrice(lp.services[SwapType_1.SwapType.FROM_BTC], false, resp.amount, resp.total, amountData.token, {}, pricePrefetchPromise, usdPricePrefetchPromise, abortController.signal),
|
|
265
|
+
this.verifyReturnedSignature(signer, data, resp, feeRatePromise, signDataPromise, abortController.signal),
|
|
266
|
+
this.verifyIntermediaryLiquidity(data.getAmount(), (0, Utils_1.throwIfUndefined)(liquidityPromise)),
|
|
267
|
+
]);
|
|
268
|
+
const quote = new FromBTCSwap_1.FromBTCSwap(this, {
|
|
269
|
+
pricingInfo,
|
|
270
|
+
url: lp.url,
|
|
271
|
+
expiry: signatureExpiry,
|
|
272
|
+
swapFee: resp.swapFee,
|
|
273
|
+
swapFeeBtc: resp.swapFee * resp.amount / (data.getAmount() - resp.swapFee),
|
|
274
|
+
feeRate: (await feeRatePromise),
|
|
275
|
+
signatureData: resp,
|
|
276
|
+
data,
|
|
277
|
+
address: resp.btcAddress,
|
|
278
|
+
amount: resp.amount,
|
|
279
|
+
exactIn: amountData.exactIn ?? true,
|
|
280
|
+
requiredConfirmations: resp.confirmations
|
|
281
|
+
});
|
|
282
|
+
await quote._save();
|
|
283
|
+
return quote;
|
|
284
|
+
}
|
|
285
|
+
catch (e) {
|
|
286
|
+
abortController.abort(e);
|
|
287
|
+
throw e;
|
|
288
|
+
}
|
|
289
|
+
})()
|
|
290
|
+
};
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
exports.FromBTCWrapper = FromBTCWrapper;
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { IToBTCDefinition, IToBTCWrapper } from "./IToBTCWrapper";
|
|
2
|
+
import { ChainType, SignatureData, SwapCommitState, SwapData } from "@atomiqlabs/base";
|
|
3
|
+
import { RefundAuthorizationResponse } from "../../../intermediaries/apis/IntermediaryAPI";
|
|
4
|
+
import { Fee } from "../../../types/fees/Fee";
|
|
5
|
+
import { IEscrowSelfInitSwap, IEscrowSelfInitSwapInit } from "../IEscrowSelfInitSwap";
|
|
6
|
+
import { IRefundableSwap } from "../../IRefundableSwap";
|
|
7
|
+
import { FeeType } from "../../../enums/FeeType";
|
|
8
|
+
import { TokenAmount } from "../../../types/TokenAmount";
|
|
9
|
+
import { BtcToken, SCToken } from "../../../types/Token";
|
|
10
|
+
export type IToBTCSwapInit<T extends SwapData> = IEscrowSelfInitSwapInit<T> & {
|
|
11
|
+
signatureData?: SignatureData;
|
|
12
|
+
data: T;
|
|
13
|
+
networkFee: bigint;
|
|
14
|
+
networkFeeBtc: bigint;
|
|
15
|
+
};
|
|
16
|
+
export declare function isIToBTCSwapInit<T extends SwapData>(obj: any): obj is IToBTCSwapInit<T>;
|
|
17
|
+
export declare abstract class IToBTCSwap<T extends ChainType = ChainType, D extends IToBTCDefinition<T, IToBTCWrapper<T, D>, IToBTCSwap<T, D>> = IToBTCDefinition<T, IToBTCWrapper<T, any>, IToBTCSwap<T, any>>> extends IEscrowSelfInitSwap<T, D, ToBTCSwapState> implements IRefundableSwap<T, D, ToBTCSwapState> {
|
|
18
|
+
protected readonly networkFee: bigint;
|
|
19
|
+
protected networkFeeBtc: bigint;
|
|
20
|
+
protected readonly abstract outputToken: BtcToken;
|
|
21
|
+
readonly data: T["Data"];
|
|
22
|
+
readonly signatureData?: SignatureData;
|
|
23
|
+
protected constructor(wrapper: D["Wrapper"], serializedObject: any);
|
|
24
|
+
protected constructor(wrapper: D["Wrapper"], init: IToBTCSwapInit<T["Data"]>);
|
|
25
|
+
protected getSwapData(): T["Data"];
|
|
26
|
+
protected upgradeVersion(): void;
|
|
27
|
+
/**
|
|
28
|
+
* In case swapFee in BTC is not supplied it recalculates it based on swap price
|
|
29
|
+
* @protected
|
|
30
|
+
*/
|
|
31
|
+
protected tryRecomputeSwapPrice(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Returns the payment hash identifier to be sent to the LP for getStatus and getRefund
|
|
34
|
+
* @protected
|
|
35
|
+
*/
|
|
36
|
+
protected getLpIdentifier(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Sets the payment result for the swap, optionally also checking it (checking that tx exist or swap secret is valid)
|
|
39
|
+
*
|
|
40
|
+
* @param result Result returned by the LP
|
|
41
|
+
* @param check Whether to check the passed result
|
|
42
|
+
* @returns true if check passed, false if check failed with a soft error (e.g. tx not yet found in the mempool)
|
|
43
|
+
* @throws {IntermediaryError} When the data returned by the intermediary isn't valid
|
|
44
|
+
*/
|
|
45
|
+
abstract _setPaymentResult(result: {
|
|
46
|
+
secret?: string;
|
|
47
|
+
txId?: string;
|
|
48
|
+
}, check?: boolean): Promise<boolean>;
|
|
49
|
+
getInputAddress(): string | null;
|
|
50
|
+
getInputTxId(): string | null;
|
|
51
|
+
requiresAction(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Returns whether the swap is finished and in its terminal state (this can mean successful, refunded or failed)
|
|
54
|
+
*/
|
|
55
|
+
isFinished(): boolean;
|
|
56
|
+
isRefundable(): boolean;
|
|
57
|
+
isQuoteExpired(): boolean;
|
|
58
|
+
isQuoteSoftExpired(): boolean;
|
|
59
|
+
isSuccessful(): boolean;
|
|
60
|
+
isFailed(): boolean;
|
|
61
|
+
_getInitiator(): string;
|
|
62
|
+
protected getSwapFee(): Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
|
|
63
|
+
/**
|
|
64
|
+
* Returns network fee for the swap, the fee is represented in source currency & destination currency, but is
|
|
65
|
+
* paid only once
|
|
66
|
+
*/
|
|
67
|
+
protected getNetworkFee(): Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
|
|
68
|
+
getFee(): Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
|
|
69
|
+
getFeeBreakdown(): [
|
|
70
|
+
{
|
|
71
|
+
type: FeeType.SWAP;
|
|
72
|
+
fee: Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
type: FeeType.NETWORK_OUTPUT;
|
|
76
|
+
fee: Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
getInputToken(): SCToken<T["ChainId"]>;
|
|
80
|
+
getInput(): TokenAmount<T["ChainId"], SCToken<T["ChainId"]>>;
|
|
81
|
+
getInputWithoutFee(): TokenAmount<T["ChainId"], SCToken<T["ChainId"]>>;
|
|
82
|
+
/**
|
|
83
|
+
* Checks if the intiator/sender has enough balance to go through with the swap
|
|
84
|
+
*/
|
|
85
|
+
hasEnoughBalance(): Promise<{
|
|
86
|
+
enoughBalance: boolean;
|
|
87
|
+
balance: TokenAmount;
|
|
88
|
+
required: TokenAmount;
|
|
89
|
+
}>;
|
|
90
|
+
/**
|
|
91
|
+
* Check if the initiator/sender has enough balance to cover the transaction fee for processing the swap
|
|
92
|
+
*/
|
|
93
|
+
hasEnoughForTxFees(): Promise<{
|
|
94
|
+
enoughBalance: boolean;
|
|
95
|
+
balance: TokenAmount;
|
|
96
|
+
required: TokenAmount;
|
|
97
|
+
}>;
|
|
98
|
+
/**
|
|
99
|
+
* Executes the swap with the provided smart chain wallet/signer
|
|
100
|
+
*
|
|
101
|
+
* @param signer Smart chain wallet/signer to use to sign the transaction on the source chain
|
|
102
|
+
* @param callbacks Callbacks to track the progress of the swap
|
|
103
|
+
* @param options Optional options for the swap like feeRate, AbortSignal, and timeouts/intervals
|
|
104
|
+
*
|
|
105
|
+
* @returns {boolean} Whether the swap was successfully processed by the LP, in case `false` is returned
|
|
106
|
+
* the user can refund their funds back on the source chain by calling `swap.refund()`
|
|
107
|
+
*/
|
|
108
|
+
execute(signer: T["Signer"] | T["NativeSigner"], callbacks?: {
|
|
109
|
+
onSourceTransactionSent?: (sourceTxId: string) => void;
|
|
110
|
+
onSourceTransactionConfirmed?: (sourceTxId: string) => void;
|
|
111
|
+
onSwapSettled?: (destinationTxId: string) => void;
|
|
112
|
+
}, options?: {
|
|
113
|
+
abortSignal?: AbortSignal;
|
|
114
|
+
paymentCheckIntervalSeconds?: number;
|
|
115
|
+
maxWaitTillSwapProcessedSeconds?: number;
|
|
116
|
+
}): Promise<boolean>;
|
|
117
|
+
txsExecute(options?: {
|
|
118
|
+
skipChecks?: boolean;
|
|
119
|
+
}): Promise<{
|
|
120
|
+
name: "Commit";
|
|
121
|
+
description: string;
|
|
122
|
+
chain: T["ChainId"];
|
|
123
|
+
txs: T["TX"][];
|
|
124
|
+
}[]>;
|
|
125
|
+
/**
|
|
126
|
+
* Returns transactions for committing the swap on-chain, initiating the swap
|
|
127
|
+
*
|
|
128
|
+
* @param skipChecks Skip checks like making sure init signature is still valid and swap wasn't commited yet
|
|
129
|
+
* (this is handled on swap creation, if you commit right after quoting, you can use skipChecks=true)
|
|
130
|
+
*
|
|
131
|
+
* @throws {Error} When in invalid state (not PR_CREATED)
|
|
132
|
+
*/
|
|
133
|
+
txsCommit(skipChecks?: boolean): Promise<T["TX"][]>;
|
|
134
|
+
/**
|
|
135
|
+
* Commits the swap on-chain, initiating the swap
|
|
136
|
+
*
|
|
137
|
+
* @param _signer Signer to sign the transactions with, must be the same as used in the initialization
|
|
138
|
+
* @param abortSignal Abort signal
|
|
139
|
+
* @param skipChecks Skip checks like making sure init signature is still valid and swap wasn't commited yet
|
|
140
|
+
* (this is handled on swap creation, if you commit right after quoting, you can skipChecks)`
|
|
141
|
+
* @param onBeforeTxSent
|
|
142
|
+
* @throws {Error} If invalid signer is provided that doesn't match the swap data
|
|
143
|
+
*/
|
|
144
|
+
commit(_signer: T["Signer"] | T["NativeSigner"], abortSignal?: AbortSignal, skipChecks?: boolean, onBeforeTxSent?: (txId: string) => void): Promise<string>;
|
|
145
|
+
/**
|
|
146
|
+
* Waits till a swap is committed, should be called after sending the commit transactions manually
|
|
147
|
+
*
|
|
148
|
+
* @param abortSignal AbortSignal
|
|
149
|
+
* @throws {Error} If swap is not in the correct state (must be CREATED)
|
|
150
|
+
*/
|
|
151
|
+
waitTillCommited(abortSignal?: AbortSignal): Promise<void>;
|
|
152
|
+
protected waitTillIntermediarySwapProcessed(checkIntervalSeconds?: number, abortSignal?: AbortSignal): Promise<RefundAuthorizationResponse>;
|
|
153
|
+
/**
|
|
154
|
+
* Checks whether the swap was already processed by the LP and is either successful (requires proof which is
|
|
155
|
+
* either a HTLC pre-image for LN swaps or valid txId for on-chain swap) or failed and we can cooperatively
|
|
156
|
+
* refund.
|
|
157
|
+
*
|
|
158
|
+
* @param save whether to save the data
|
|
159
|
+
* @returns true if swap is processed, false if the swap is still ongoing
|
|
160
|
+
* @private
|
|
161
|
+
*/
|
|
162
|
+
protected checkIntermediarySwapProcessed(save?: boolean): Promise<boolean>;
|
|
163
|
+
/**
|
|
164
|
+
* A blocking promise resolving when swap was concluded by the intermediary,
|
|
165
|
+
* rejecting in case of failure
|
|
166
|
+
*
|
|
167
|
+
* @param maxWaitTimeSeconds Maximum time in seconds to wait for the swap to be settled, an error is thrown if the
|
|
168
|
+
* swap is taking too long to claim
|
|
169
|
+
* @param checkIntervalSeconds How often to poll the intermediary for answer
|
|
170
|
+
* @param abortSignal Abort signal
|
|
171
|
+
* @returns {Promise<boolean>} Was the payment successful? If not we can refund.
|
|
172
|
+
* @throws {IntermediaryError} If a swap is determined expired by the intermediary, but it is actually still valid
|
|
173
|
+
* @throws {SignatureVerificationError} If the swap should be cooperatively refundable but the intermediary returned
|
|
174
|
+
* invalid refund signature
|
|
175
|
+
* @throws {Error} When swap expires or if the swap has invalid state (must be COMMITED)
|
|
176
|
+
*/
|
|
177
|
+
waitForPayment(maxWaitTimeSeconds?: number, checkIntervalSeconds?: number, abortSignal?: AbortSignal): Promise<boolean>;
|
|
178
|
+
/**
|
|
179
|
+
* Get the estimated smart chain transaction fee of the refund transaction
|
|
180
|
+
*/
|
|
181
|
+
getRefundFee(): Promise<bigint>;
|
|
182
|
+
/**
|
|
183
|
+
* Returns transactions for refunding the swap if the swap is in refundable state, you can check so with isRefundable()
|
|
184
|
+
*
|
|
185
|
+
* @throws {IntermediaryError} If intermediary returns invalid response in case cooperative refund should be used
|
|
186
|
+
* @throws {SignatureVerificationError} If intermediary returned invalid cooperative refund signature
|
|
187
|
+
* @throws {Error} When state is not refundable
|
|
188
|
+
*/
|
|
189
|
+
txsRefund(signer?: string): Promise<T["TX"][]>;
|
|
190
|
+
/**
|
|
191
|
+
* Refunds the swap if the swap is in refundable state, you can check so with isRefundable()
|
|
192
|
+
*
|
|
193
|
+
* @param _signer Signer to sign the transactions with, must be the same as used in the initialization
|
|
194
|
+
* @param abortSignal Abort signal
|
|
195
|
+
* @throws {Error} If invalid signer is provided that doesn't match the swap data
|
|
196
|
+
*/
|
|
197
|
+
refund(_signer: T["Signer"] | T["NativeSigner"], abortSignal?: AbortSignal): Promise<string>;
|
|
198
|
+
/**
|
|
199
|
+
* Waits till a swap is refunded, should be called after sending the refund transactions manually
|
|
200
|
+
*
|
|
201
|
+
* @param abortSignal AbortSignal
|
|
202
|
+
* @throws {Error} When swap is not in a valid state (must be COMMITED)
|
|
203
|
+
* @throws {Error} If we tried to refund but claimer was able to claim first
|
|
204
|
+
*/
|
|
205
|
+
waitTillRefunded(abortSignal?: AbortSignal): Promise<void>;
|
|
206
|
+
serialize(): any;
|
|
207
|
+
/**
|
|
208
|
+
* Checks the swap's state on-chain and compares it to its internal state, updates/changes it according to on-chain
|
|
209
|
+
* data
|
|
210
|
+
*
|
|
211
|
+
* @private
|
|
212
|
+
*/
|
|
213
|
+
private syncStateFromChain;
|
|
214
|
+
_shouldFetchCommitStatus(): boolean;
|
|
215
|
+
_shouldFetchExpiryStatus(): boolean;
|
|
216
|
+
_sync(save?: boolean, quoteDefinitelyExpired?: boolean, commitStatus?: SwapCommitState): Promise<boolean>;
|
|
217
|
+
_tick(save?: boolean): Promise<boolean>;
|
|
218
|
+
}
|
|
219
|
+
export declare enum ToBTCSwapState {
|
|
220
|
+
REFUNDED = -3,
|
|
221
|
+
QUOTE_EXPIRED = -2,
|
|
222
|
+
QUOTE_SOFT_EXPIRED = -1,
|
|
223
|
+
CREATED = 0,
|
|
224
|
+
COMMITED = 1,
|
|
225
|
+
SOFT_CLAIMED = 2,
|
|
226
|
+
CLAIMED = 3,
|
|
227
|
+
REFUNDABLE = 4
|
|
228
|
+
}
|