@atomiqlabs/sdk 7.0.11 → 8.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -29
- package/dist/SmartChainAssets.d.ts +11 -3
- package/dist/SmartChainAssets.js +7 -3
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
- package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
- package/dist/bitcoin/LightningNetworkApi.js +2 -0
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
- package/dist/bitcoin/coinselect2/accumulative.js +52 -0
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
- package/dist/bitcoin/coinselect2/blackjack.js +38 -0
- package/dist/bitcoin/coinselect2/index.d.ts +19 -0
- package/dist/bitcoin/coinselect2/index.js +69 -0
- package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
- package/dist/bitcoin/coinselect2/utils.js +123 -0
- package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
- package/dist/bitcoin/mempool/MempoolApi.js +311 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
- package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
- package/dist/enums/FeeType.d.ts +8 -0
- package/dist/enums/FeeType.js +12 -0
- package/dist/enums/SwapAmountType.d.ts +8 -0
- package/dist/enums/SwapAmountType.js +12 -0
- package/dist/enums/SwapDirection.d.ts +8 -0
- package/dist/enums/SwapDirection.js +12 -0
- package/dist/enums/SwapType.d.ts +14 -0
- package/dist/enums/SwapType.js +18 -0
- package/dist/errors/IntermediaryError.d.ts +9 -0
- package/dist/errors/IntermediaryError.js +26 -0
- package/dist/errors/PaymentAuthError.d.ts +11 -0
- package/dist/errors/PaymentAuthError.js +23 -0
- package/dist/errors/RequestError.d.ts +18 -0
- package/dist/errors/RequestError.js +46 -0
- package/dist/errors/UserError.d.ts +7 -0
- package/dist/errors/UserError.js +15 -0
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
- package/dist/events/UnifiedSwapEventListener.js +130 -0
- package/dist/http/HttpUtils.d.ts +27 -0
- package/dist/http/HttpUtils.js +91 -0
- package/dist/http/paramcoders/IParamReader.d.ts +8 -0
- package/dist/http/paramcoders/IParamReader.js +2 -0
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
- package/dist/http/paramcoders/ParamDecoder.js +132 -0
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
- package/dist/http/paramcoders/ParamEncoder.js +31 -0
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
- package/dist/http/paramcoders/SchemaVerifier.js +145 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
- package/dist/index.d.ts +82 -4
- package/dist/index.js +128 -4
- package/dist/intermediaries/Intermediary.d.ts +111 -0
- package/dist/intermediaries/Intermediary.js +115 -0
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
- package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
- package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
- package/dist/lnurl/LNURL.d.ts +102 -0
- package/dist/lnurl/LNURL.js +321 -0
- package/dist/prices/RedundantSwapPrice.d.ts +89 -0
- package/dist/prices/RedundantSwapPrice.js +202 -0
- package/dist/prices/SingleSwapPrice.d.ts +31 -0
- package/dist/prices/SingleSwapPrice.js +41 -0
- package/dist/prices/SwapPriceWithChain.d.ts +70 -0
- package/dist/prices/SwapPriceWithChain.js +91 -0
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
- package/dist/prices/abstract/IPriceProvider.js +74 -0
- package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
- package/dist/prices/abstract/ISwapPrice.js +219 -0
- package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
- package/dist/prices/providers/BinancePriceProvider.js +23 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
- package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
- package/dist/prices/providers/CustomPriceProvider.js +24 -0
- package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
- package/dist/prices/providers/KrakenPriceProvider.js +36 -0
- package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
- package/dist/prices/providers/OKXPriceProvider.js +23 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
- package/dist/storage/IUnifiedStorage.d.ts +73 -0
- package/dist/storage/IUnifiedStorage.js +2 -0
- package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
- package/dist/storage/UnifiedSwapStorage.js +83 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
- package/dist/swapper/Swapper.d.ts +533 -0
- package/dist/swapper/Swapper.js +1566 -0
- package/dist/swapper/SwapperFactory.d.ts +87 -0
- package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +40 -22
- package/dist/swapper/SwapperUtils.d.ts +153 -0
- package/dist/swapper/SwapperUtils.js +420 -0
- package/dist/swapper/SwapperWithChain.d.ts +214 -0
- package/dist/swapper/SwapperWithChain.js +315 -0
- package/dist/swapper/SwapperWithSigner.d.ts +178 -0
- package/dist/swapper/SwapperWithSigner.js +172 -0
- package/dist/swaps/IAddressSwap.d.ts +13 -0
- package/dist/swaps/IAddressSwap.js +13 -0
- package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
- package/dist/swaps/IBTCWalletSwap.js +17 -0
- package/dist/swaps/IClaimableSwap.d.ts +17 -0
- package/dist/swaps/IClaimableSwap.js +14 -0
- package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
- package/dist/swaps/IClaimableSwapWrapper.js +2 -0
- package/dist/swaps/IRefundableSwap.d.ts +17 -0
- package/dist/swaps/IRefundableSwap.js +13 -0
- package/dist/swaps/ISwap.d.ts +207 -0
- package/dist/swaps/ISwap.js +264 -0
- package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
- package/dist/swaps/ISwapWithGasDrop.js +11 -0
- package/dist/swaps/ISwapWrapper.d.ts +153 -0
- package/dist/swaps/ISwapWrapper.js +227 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
- package/dist/types/AmountData.d.ts +9 -0
- package/dist/types/AmountData.js +2 -0
- package/dist/types/CustomPriceFunction.d.ts +5 -0
- package/dist/types/CustomPriceFunction.js +2 -0
- package/dist/types/PriceInfoType.d.ts +28 -0
- package/dist/types/PriceInfoType.js +57 -0
- package/dist/types/SwapExecutionAction.d.ts +7 -0
- package/dist/types/SwapExecutionAction.js +2 -0
- package/dist/types/SwapWithSigner.d.ts +14 -0
- package/dist/types/SwapWithSigner.js +40 -0
- package/dist/types/Token.d.ts +53 -0
- package/dist/types/Token.js +58 -0
- package/dist/types/TokenAmount.d.ts +57 -0
- package/dist/types/TokenAmount.js +47 -0
- package/dist/types/fees/Fee.d.ts +49 -0
- package/dist/types/fees/Fee.js +2 -0
- package/dist/types/fees/FeeBreakdown.d.ts +10 -0
- package/dist/types/fees/FeeBreakdown.js +2 -0
- package/dist/types/fees/PercentagePPM.d.ts +15 -0
- package/dist/types/fees/PercentagePPM.js +17 -0
- package/dist/types/lnurl/LNURLPay.d.ts +54 -0
- package/dist/types/lnurl/LNURLPay.js +28 -0
- package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
- package/dist/types/lnurl/LNURLWithdraw.js +24 -0
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
- package/dist/utils/BitcoinUtils.d.ts +13 -0
- package/dist/utils/BitcoinUtils.js +98 -0
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
- package/dist/utils/BitcoinWalletUtils.js +14 -0
- package/dist/utils/Logger.d.ts +7 -0
- package/dist/utils/Logger.js +12 -0
- package/dist/utils/RetryUtils.d.ts +21 -0
- package/dist/utils/RetryUtils.js +66 -0
- package/dist/utils/SwapUtils.d.ts +31 -0
- package/dist/utils/SwapUtils.js +18 -0
- package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
- package/dist/utils/TimeoutUtils.js +55 -0
- package/dist/utils/TokenUtils.d.ts +11 -0
- package/dist/utils/TokenUtils.js +29 -0
- package/dist/utils/TypeUtils.d.ts +7 -0
- package/dist/utils/TypeUtils.js +2 -0
- package/dist/utils/Utils.d.ts +57 -0
- package/dist/utils/Utils.js +178 -0
- package/package.json +14 -6
- package/src/SmartChainAssets.ts +11 -3
- package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
- package/src/bitcoin/LightningNetworkApi.ts +16 -0
- package/src/bitcoin/coinselect2/accumulative.ts +68 -0
- package/src/bitcoin/coinselect2/blackjack.ts +49 -0
- package/src/bitcoin/coinselect2/index.ts +92 -0
- package/src/bitcoin/coinselect2/utils.ts +189 -0
- package/src/bitcoin/mempool/MempoolApi.ts +554 -0
- package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
- package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
- package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
- package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
- package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
- package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
- package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
- package/src/enums/FeeType.ts +9 -0
- package/src/enums/SwapAmountType.ts +9 -0
- package/src/enums/SwapDirection.ts +9 -0
- package/src/enums/SwapType.ts +15 -0
- package/src/errors/IntermediaryError.ts +24 -0
- package/src/errors/PaymentAuthError.ts +26 -0
- package/src/errors/RequestError.ts +51 -0
- package/src/errors/UserError.ts +14 -0
- package/src/events/UnifiedSwapEventListener.ts +171 -0
- package/src/http/HttpUtils.ts +92 -0
- package/src/http/paramcoders/IParamReader.ts +10 -0
- package/src/http/paramcoders/ParamDecoder.ts +142 -0
- package/src/http/paramcoders/ParamEncoder.ts +37 -0
- package/src/http/paramcoders/SchemaVerifier.ts +153 -0
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
- package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
- package/src/index.ts +102 -4
- package/src/intermediaries/Intermediary.ts +204 -0
- package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
- package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
- package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
- package/src/lnurl/LNURL.ts +403 -0
- package/src/prices/RedundantSwapPrice.ts +245 -0
- package/src/prices/SingleSwapPrice.ts +47 -0
- package/src/prices/SwapPriceWithChain.ts +157 -0
- package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
- package/src/prices/abstract/IPriceProvider.ts +128 -0
- package/src/prices/abstract/ISwapPrice.ts +328 -0
- package/src/prices/providers/BinancePriceProvider.ts +41 -0
- package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
- package/src/prices/providers/CustomPriceProvider.ts +29 -0
- package/src/prices/providers/KrakenPriceProvider.ts +74 -0
- package/src/prices/providers/OKXPriceProvider.ts +53 -0
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
- package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
- package/src/storage/IUnifiedStorage.ts +83 -0
- package/src/storage/UnifiedSwapStorage.ts +104 -0
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
- package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
- package/src/swapper/Swapper.ts +2107 -0
- package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +116 -75
- package/src/swapper/SwapperUtils.ts +510 -0
- package/src/swapper/SwapperWithChain.ts +464 -0
- package/src/swapper/SwapperWithSigner.ts +300 -0
- package/src/swaps/IAddressSwap.ts +20 -0
- package/src/swaps/IBTCWalletSwap.ts +77 -0
- package/src/swaps/IClaimableSwap.ts +30 -0
- package/src/swaps/IClaimableSwapWrapper.ts +9 -0
- package/src/swaps/IRefundableSwap.ts +29 -0
- package/src/swaps/ISwap.ts +490 -0
- package/src/swaps/ISwapWithGasDrop.ts +19 -0
- package/src/swaps/ISwapWrapper.ts +344 -0
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
- package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
- package/src/types/AmountData.ts +9 -0
- package/src/types/CustomPriceFunction.ts +5 -0
- package/src/types/PriceInfoType.ts +67 -0
- package/src/types/SwapExecutionAction.ts +8 -0
- package/src/types/SwapWithSigner.ts +57 -0
- package/src/types/Token.ts +90 -0
- package/src/types/TokenAmount.ts +110 -0
- package/src/types/fees/Fee.ts +55 -0
- package/src/types/fees/FeeBreakdown.ts +11 -0
- package/src/types/fees/PercentagePPM.ts +24 -0
- package/src/types/lnurl/LNURLPay.ts +72 -0
- package/src/types/lnurl/LNURLWithdraw.ts +55 -0
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
- package/src/utils/BitcoinUtils.ts +86 -0
- package/src/utils/BitcoinWalletUtils.ts +16 -0
- package/src/utils/Logger.ts +15 -0
- package/src/utils/RetryUtils.ts +71 -0
- package/src/utils/SwapUtils.ts +38 -0
- package/src/utils/TimeoutUtils.ts +50 -0
- package/src/utils/TokenUtils.ts +25 -0
- package/src/utils/TypeUtils.ts +9 -0
- package/src/utils/Utils.ts +182 -0
- package/dist/SwapperFactory.d.ts +0 -52
- package/dist/Utils.js +0 -37
- package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
- package/dist/fs-storage/FileSystemStorageManager.js +0 -60
- package/dist/fs-storage/index.d.ts +0 -1
- package/dist/fs-storage/index.js +0 -17
- package/src/SmartChainAssets.js +0 -75
- package/src/SwapperFactory.js +0 -120
- package/src/Utils.js +0 -37
- package/src/Utils.ts +0 -31
- package/src/fs-storage/FileSystemStorageManager.ts +0 -71
- package/src/fs-storage/index.ts +0 -1
- package/src/index.js +0 -21
- package/src/storage/LocalStorageManager.js +0 -72
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import {ChainEvent, ChainType} from "@atomiqlabs/base";
|
|
2
|
+
import {EventEmitter} from "events";
|
|
3
|
+
import {ISwap} from "./ISwap";
|
|
4
|
+
import {ISwapPrice} from "../prices/abstract/ISwapPrice";
|
|
5
|
+
import {IntermediaryError} from "../errors/IntermediaryError";
|
|
6
|
+
import {ChainIds, MultiChain} from "../swapper/Swapper";
|
|
7
|
+
import {UnifiedSwapEventListener} from "../events/UnifiedSwapEventListener";
|
|
8
|
+
import {SwapType} from "../enums/SwapType";
|
|
9
|
+
import {UnifiedSwapStorage} from "../storage/UnifiedSwapStorage";
|
|
10
|
+
import {SCToken} from "../types/Token";
|
|
11
|
+
import {getLogger} from "../utils/Logger";
|
|
12
|
+
import {PriceInfoType} from "../types/PriceInfoType";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Options for swap wrapper configuration
|
|
16
|
+
* @category Swaps
|
|
17
|
+
*/
|
|
18
|
+
export type ISwapWrapperOptions = {
|
|
19
|
+
getRequestTimeout?: number,
|
|
20
|
+
postRequestTimeout?: number
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Token configuration for wrapper constructors
|
|
25
|
+
* @category Swaps
|
|
26
|
+
*/
|
|
27
|
+
export type WrapperCtorTokens<T extends MultiChain = MultiChain> = {
|
|
28
|
+
ticker: string,
|
|
29
|
+
name: string,
|
|
30
|
+
chains: {[chainId in ChainIds<T>]?: {
|
|
31
|
+
address: string,
|
|
32
|
+
decimals: number,
|
|
33
|
+
displayDecimals?: number
|
|
34
|
+
}}
|
|
35
|
+
}[];
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Type definition linking wrapper and swap types
|
|
39
|
+
* @category Swaps
|
|
40
|
+
*/
|
|
41
|
+
export type SwapTypeDefinition<T extends ChainType, W extends ISwapWrapper<T, any>, S extends ISwap<T>> = {
|
|
42
|
+
Wrapper: W;
|
|
43
|
+
Swap: S;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Base abstract class for swap wrapper implementations
|
|
48
|
+
* @category Swaps
|
|
49
|
+
*/
|
|
50
|
+
export abstract class ISwapWrapper<
|
|
51
|
+
T extends ChainType,
|
|
52
|
+
D extends SwapTypeDefinition<T, ISwapWrapper<T, D>, ISwap<T, D>>,
|
|
53
|
+
O extends ISwapWrapperOptions = ISwapWrapperOptions
|
|
54
|
+
> {
|
|
55
|
+
abstract readonly TYPE: SwapType;
|
|
56
|
+
protected readonly logger = getLogger(this.constructor.name+": ");
|
|
57
|
+
|
|
58
|
+
public readonly abstract swapDeserializer: new (wrapper: D["Wrapper"], data: any) => D["Swap"];
|
|
59
|
+
|
|
60
|
+
readonly unifiedStorage: UnifiedSwapStorage<T>;
|
|
61
|
+
readonly unifiedChainEvents: UnifiedSwapEventListener<T>;
|
|
62
|
+
|
|
63
|
+
readonly chainIdentifier: T["ChainId"];
|
|
64
|
+
readonly chain: T["ChainInterface"];
|
|
65
|
+
readonly prices: ISwapPrice;
|
|
66
|
+
readonly events: EventEmitter<{swapState: [D["Swap"]]}>;
|
|
67
|
+
readonly options: O;
|
|
68
|
+
readonly tokens: {
|
|
69
|
+
[tokenAddress: string]: SCToken<T["ChainId"]>
|
|
70
|
+
};
|
|
71
|
+
readonly pendingSwaps: Map<string, WeakRef<D["Swap"]>> = new Map();
|
|
72
|
+
|
|
73
|
+
isInitialized: boolean = false;
|
|
74
|
+
tickInterval?: NodeJS.Timeout;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @param chainIdentifier
|
|
78
|
+
* @param unifiedStorage
|
|
79
|
+
* @param unifiedChainEvents
|
|
80
|
+
* @param chain
|
|
81
|
+
* @param prices Swap pricing handler
|
|
82
|
+
* @param tokens Chain specific token data
|
|
83
|
+
* @param options
|
|
84
|
+
* @param events Instance to use for emitting events
|
|
85
|
+
*/
|
|
86
|
+
constructor(
|
|
87
|
+
chainIdentifier: T["ChainId"],
|
|
88
|
+
unifiedStorage: UnifiedSwapStorage<T>,
|
|
89
|
+
unifiedChainEvents: UnifiedSwapEventListener<T>,
|
|
90
|
+
chain: T["ChainInterface"],
|
|
91
|
+
prices: ISwapPrice,
|
|
92
|
+
tokens: WrapperCtorTokens,
|
|
93
|
+
options: O,
|
|
94
|
+
events?: EventEmitter<{swapState: [ISwap]}>
|
|
95
|
+
) {
|
|
96
|
+
this.unifiedStorage = unifiedStorage;
|
|
97
|
+
this.unifiedChainEvents = unifiedChainEvents;
|
|
98
|
+
|
|
99
|
+
this.chainIdentifier = chainIdentifier;
|
|
100
|
+
this.chain = chain;
|
|
101
|
+
this.prices = prices;
|
|
102
|
+
this.events = events || new EventEmitter();
|
|
103
|
+
this.options = options;
|
|
104
|
+
this.tokens = {};
|
|
105
|
+
for(let tokenData of tokens) {
|
|
106
|
+
const chainData = tokenData.chains[chainIdentifier];
|
|
107
|
+
if(chainData==null) continue;
|
|
108
|
+
this.tokens[chainData.address] = {
|
|
109
|
+
chain: "SC",
|
|
110
|
+
chainId: this.chainIdentifier,
|
|
111
|
+
address: chainData.address,
|
|
112
|
+
decimals: chainData.decimals,
|
|
113
|
+
ticker: tokenData.ticker,
|
|
114
|
+
name: tokenData.name,
|
|
115
|
+
displayDecimals: chainData.displayDecimals
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Pre-fetches swap price for a given swap
|
|
122
|
+
*
|
|
123
|
+
* @param amountData
|
|
124
|
+
* @param abortSignal
|
|
125
|
+
* @protected
|
|
126
|
+
* @returns Price of the token in uSats (micro sats)
|
|
127
|
+
*/
|
|
128
|
+
protected preFetchPrice(amountData: { token: string }, abortSignal?: AbortSignal): Promise<bigint | undefined> {
|
|
129
|
+
return this.prices.preFetchPrice(this.chainIdentifier, amountData.token, abortSignal).catch(e => {
|
|
130
|
+
this.logger.error("preFetchPrice.token(): Error: ", e);
|
|
131
|
+
return undefined;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Pre-fetches bitcoin's USD price
|
|
137
|
+
*
|
|
138
|
+
* @param abortSignal
|
|
139
|
+
* @protected
|
|
140
|
+
*/
|
|
141
|
+
protected preFetchUsdPrice(abortSignal?: AbortSignal): Promise<number | undefined> {
|
|
142
|
+
return this.prices.preFetchUsdPrice(abortSignal).catch(e => {
|
|
143
|
+
this.logger.error("preFetchPrice.usd(): Error: ", e);
|
|
144
|
+
return undefined;
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Verifies returned price for swaps
|
|
150
|
+
*
|
|
151
|
+
* @param lpServiceData Service data for the service in question (TO_BTCLN, TO_BTC, etc.) of the given intermediary
|
|
152
|
+
* @param send Whether this is a send (SOL -> SC) or receive (BTC -> SC) swap
|
|
153
|
+
* @param amountSats Amount in BTC
|
|
154
|
+
* @param amountToken Amount in token
|
|
155
|
+
* @param token Token used in the swap
|
|
156
|
+
* @param feeData Fee data as returned by the intermediary
|
|
157
|
+
* @param pricePrefetchPromise Price pre-fetch promise
|
|
158
|
+
* @param usdPricePrefetchPromise
|
|
159
|
+
* @param abortSignal
|
|
160
|
+
* @protected
|
|
161
|
+
* @returns Price info object
|
|
162
|
+
* @throws {IntermediaryError} if the calculated fee is too high
|
|
163
|
+
*/
|
|
164
|
+
protected async verifyReturnedPrice(
|
|
165
|
+
lpServiceData: {swapBaseFee: number, swapFeePPM: number},
|
|
166
|
+
send: boolean,
|
|
167
|
+
amountSats: bigint,
|
|
168
|
+
amountToken: bigint,
|
|
169
|
+
token: string,
|
|
170
|
+
feeData: {
|
|
171
|
+
networkFee?: bigint
|
|
172
|
+
},
|
|
173
|
+
pricePrefetchPromise: Promise<bigint | undefined> = Promise.resolve(undefined),
|
|
174
|
+
usdPricePrefetchPromise: Promise<number | undefined> = Promise.resolve(undefined),
|
|
175
|
+
abortSignal?: AbortSignal
|
|
176
|
+
): Promise<PriceInfoType> {
|
|
177
|
+
const swapBaseFee = BigInt(lpServiceData.swapBaseFee);
|
|
178
|
+
const swapFeePPM = BigInt(lpServiceData.swapFeePPM);
|
|
179
|
+
if(send && feeData.networkFee!=null) amountToken = amountToken - feeData.networkFee;
|
|
180
|
+
|
|
181
|
+
const [isValidAmount, usdPrice] = await Promise.all([
|
|
182
|
+
send ?
|
|
183
|
+
this.prices.isValidAmountSend(this.chainIdentifier, amountSats, swapBaseFee, swapFeePPM, amountToken, token, abortSignal, await pricePrefetchPromise) :
|
|
184
|
+
this.prices.isValidAmountReceive(this.chainIdentifier, amountSats, swapBaseFee, swapFeePPM, amountToken, token, abortSignal, await pricePrefetchPromise),
|
|
185
|
+
usdPricePrefetchPromise.then(value => {
|
|
186
|
+
if(value!=null) return value;
|
|
187
|
+
return this.prices.preFetchUsdPrice(abortSignal);
|
|
188
|
+
})
|
|
189
|
+
]);
|
|
190
|
+
if(!isValidAmount.isValid) throw new IntermediaryError("Fee too high");
|
|
191
|
+
isValidAmount.realPriceUsdPerBitcoin = usdPrice;
|
|
192
|
+
|
|
193
|
+
return isValidAmount;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public abstract readonly pendingSwapStates: Array<D["Swap"]["state"]>;
|
|
197
|
+
public abstract readonly tickSwapState?: Array<D["Swap"]["state"]>;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Processes a single SC on-chain event
|
|
201
|
+
* @private
|
|
202
|
+
* @param event
|
|
203
|
+
* @param swap
|
|
204
|
+
*/
|
|
205
|
+
protected abstract processEvent?(event: ChainEvent<T["Data"]>, swap: D["Swap"]): Promise<void>;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Initializes the swap wrapper, needs to be called before any other action can be taken
|
|
209
|
+
*/
|
|
210
|
+
public async init(noTimers: boolean = false, noCheckPastSwaps: boolean = false): Promise<void> {
|
|
211
|
+
if(this.isInitialized) return;
|
|
212
|
+
|
|
213
|
+
if(!noCheckPastSwaps) {
|
|
214
|
+
//Save events received in the meantime into the event queue and process them only after we've checked and
|
|
215
|
+
// processed all the past swaps
|
|
216
|
+
let eventQueue: {
|
|
217
|
+
event: ChainEvent<T["Data"]>,
|
|
218
|
+
swap: D["Swap"]
|
|
219
|
+
}[] = [];
|
|
220
|
+
const initListener = (event: ChainEvent<T["Data"]>, swap: D["Swap"]) => {
|
|
221
|
+
eventQueue.push({event, swap});
|
|
222
|
+
return Promise.resolve();
|
|
223
|
+
}
|
|
224
|
+
if(this.processEvent!=null) this.unifiedChainEvents.registerListener(this.TYPE, initListener, this.swapDeserializer.bind(null, this));
|
|
225
|
+
|
|
226
|
+
await this.checkPastSwaps();
|
|
227
|
+
|
|
228
|
+
if(this.processEvent!=null) {
|
|
229
|
+
//Process accumulated event queue
|
|
230
|
+
for(let event of eventQueue) {
|
|
231
|
+
await this.processEvent(event.event, event.swap);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
//Unregister the temporary event handler
|
|
235
|
+
this.unifiedChainEvents.unregisterListener(this.TYPE);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if(this.processEvent!=null) this.unifiedChainEvents.registerListener(this.TYPE, this.processEvent.bind(this), this.swapDeserializer.bind(null, this));
|
|
240
|
+
|
|
241
|
+
if(!noTimers) this.startTickInterval();
|
|
242
|
+
|
|
243
|
+
// this.logger.info("init(): Swap wrapper initialized");
|
|
244
|
+
|
|
245
|
+
this.isInitialized = true;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
protected startTickInterval(): void {
|
|
249
|
+
if(this.tickSwapState==null || this.tickSwapState.length===0) return;
|
|
250
|
+
this.tickInterval = setInterval(() => {
|
|
251
|
+
this.tick();
|
|
252
|
+
}, 1000);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
protected async _checkPastSwaps(pastSwaps: D["Swap"][]): Promise<{changedSwaps: D["Swap"][], removeSwaps: D["Swap"][]}> {
|
|
256
|
+
const changedSwaps: D["Swap"][] = [];
|
|
257
|
+
const removeSwaps: D["Swap"][] = [];
|
|
258
|
+
|
|
259
|
+
await Promise.all(pastSwaps.map((swap: D["Swap"]) =>
|
|
260
|
+
swap._sync(false).then(changed => {
|
|
261
|
+
if(swap.isQuoteExpired()) {
|
|
262
|
+
removeSwaps.push(swap);
|
|
263
|
+
this.logger.debug("_checkPastSwaps(): Removing expired swap: "+swap.getId());
|
|
264
|
+
} else {
|
|
265
|
+
if(changed) changedSwaps.push(swap);
|
|
266
|
+
}
|
|
267
|
+
}).catch(e => this.logger.error("_checkPastSwaps(): Error when checking swap "+swap.getId()+": ", e))
|
|
268
|
+
));
|
|
269
|
+
|
|
270
|
+
return {changedSwaps, removeSwaps};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async checkPastSwaps(pastSwaps?: D["Swap"][], noSave?: boolean): Promise<{ removeSwaps: D["Swap"][], changedSwaps: D["Swap"][] }> {
|
|
274
|
+
if (pastSwaps == null) pastSwaps = await this.unifiedStorage.query<D["Swap"]>(
|
|
275
|
+
[[{key: "type", value: this.TYPE}, {key: "state", value: this.pendingSwapStates}]],
|
|
276
|
+
(val: any) => new this.swapDeserializer(this, val)
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
const {removeSwaps, changedSwaps} = await this._checkPastSwaps(pastSwaps);
|
|
280
|
+
|
|
281
|
+
if (!noSave) {
|
|
282
|
+
await this.unifiedStorage.removeAll(removeSwaps);
|
|
283
|
+
await this.unifiedStorage.saveAll(changedSwaps);
|
|
284
|
+
changedSwaps.forEach(swap => swap._emitEvent());
|
|
285
|
+
removeSwaps.forEach(swap => swap._emitEvent());
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return {
|
|
289
|
+
removeSwaps,
|
|
290
|
+
changedSwaps
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
async tick(swaps?: D["Swap"][]): Promise<void> {
|
|
295
|
+
if(swaps==null) swaps = await this.unifiedStorage.query<D["Swap"]>(
|
|
296
|
+
[[{key: "type", value: this.TYPE}, {key: "state", value: this.tickSwapState}]],
|
|
297
|
+
(val: any) => new this.swapDeserializer(this, val)
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
for(let pendingSwap of this.pendingSwaps.values()) {
|
|
301
|
+
const value = pendingSwap.deref();
|
|
302
|
+
if(value != null) value._tick(true);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
swaps.forEach(value => {
|
|
306
|
+
value._tick(true)
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
saveSwapData(swap: D["Swap"]): Promise<void> {
|
|
311
|
+
if(!swap.isInitiated()) {
|
|
312
|
+
this.logger.debug("saveSwapData(): Swap "+swap.getId()+" not initiated, saving to pending swaps");
|
|
313
|
+
this.pendingSwaps.set(swap.getId(), new WeakRef<D["Swap"]>(swap));
|
|
314
|
+
return Promise.resolve();
|
|
315
|
+
} else {
|
|
316
|
+
this.pendingSwaps.delete(swap.getId());
|
|
317
|
+
}
|
|
318
|
+
return this.unifiedStorage.save(swap);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
removeSwapData(swap: D["Swap"]): Promise<void> {
|
|
322
|
+
this.pendingSwaps.delete(swap.getId());
|
|
323
|
+
if(!swap.isInitiated()) return Promise.resolve();
|
|
324
|
+
return this.unifiedStorage.remove(swap);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Un-subscribes from event listeners on Solana
|
|
329
|
+
*/
|
|
330
|
+
public async stop() {
|
|
331
|
+
this.isInitialized = false;
|
|
332
|
+
this.unifiedChainEvents.unregisterListener(this.TYPE);
|
|
333
|
+
this.logger.info("stop(): Swap wrapper stopped");
|
|
334
|
+
if(this.tickInterval!=null) clearInterval(this.tickInterval);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Returns the smart chain's native token used to pay for fees
|
|
339
|
+
*/
|
|
340
|
+
public getNativeToken(): SCToken<T["ChainId"]> {
|
|
341
|
+
return this.tokens[this.chain.getNativeCurrencyAddress()];
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import {IEscrowSwap, IEscrowSwapInit, isIEscrowSwapInit} from "./IEscrowSwap";
|
|
2
|
+
import {ChainType, SignatureData, SignatureVerificationError, SwapData} from "@atomiqlabs/base";
|
|
3
|
+
import {IEscrowSwapDefinition, IEscrowSwapWrapper} from "./IEscrowSwapWrapper";
|
|
4
|
+
import {SwapTypeDefinition} from "../ISwapWrapper";
|
|
5
|
+
import {TokenAmount, toTokenAmount} from "../../types/TokenAmount";
|
|
6
|
+
import {SCToken} from "../../types/Token";
|
|
7
|
+
import {timeoutPromise} from "../../utils/TimeoutUtils";
|
|
8
|
+
|
|
9
|
+
export type IEscrowSelfInitSwapInit<T extends SwapData> = IEscrowSwapInit<T> & {
|
|
10
|
+
feeRate: string,
|
|
11
|
+
signatureData?: SignatureData,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function isIEscrowSelfInitSwapInit<T extends SwapData>(obj: any): obj is IEscrowSelfInitSwapInit<T> {
|
|
15
|
+
return typeof obj === "object" &&
|
|
16
|
+
typeof(obj.feeRate) === "string" &&
|
|
17
|
+
(obj.signatureData == null || (
|
|
18
|
+
typeof(obj.signatureData) === "object" &&
|
|
19
|
+
typeof(obj.signatureData.prefix)==="string" &&
|
|
20
|
+
typeof(obj.signatureData.timeout)==="string" &&
|
|
21
|
+
typeof(obj.signatureData.signature)==="string"
|
|
22
|
+
)) &&
|
|
23
|
+
isIEscrowSwapInit(obj);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type IEscrowSelfInitSwapDefinition<T extends ChainType, W extends IEscrowSwapWrapper<T, any>, S extends IEscrowSelfInitSwap<T>> = SwapTypeDefinition<T, W, S>;
|
|
27
|
+
|
|
28
|
+
export abstract class IEscrowSelfInitSwap<
|
|
29
|
+
T extends ChainType = ChainType,
|
|
30
|
+
D extends IEscrowSelfInitSwapDefinition<T, IEscrowSwapWrapper<T, D>, IEscrowSelfInitSwap<T, D, S>> = IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, any>, IEscrowSelfInitSwap<T, any, any>>,
|
|
31
|
+
S extends number = number
|
|
32
|
+
> extends IEscrowSwap<T, D, S> {
|
|
33
|
+
|
|
34
|
+
feeRate: string;
|
|
35
|
+
signatureData?: SignatureData;
|
|
36
|
+
|
|
37
|
+
protected constructor(wrapper: D["Wrapper"], obj: any);
|
|
38
|
+
protected constructor(wrapper: D["Wrapper"], swapInit: IEscrowSelfInitSwapInit<T["Data"]>);
|
|
39
|
+
protected constructor(
|
|
40
|
+
wrapper: D["Wrapper"],
|
|
41
|
+
swapInitOrObj: IEscrowSelfInitSwapInit<T["Data"]> | any,
|
|
42
|
+
) {
|
|
43
|
+
super(wrapper, swapInitOrObj);
|
|
44
|
+
|
|
45
|
+
if(isIEscrowSelfInitSwapInit(swapInitOrObj)) {
|
|
46
|
+
this.feeRate = swapInitOrObj.feeRate;
|
|
47
|
+
this.signatureData = swapInitOrObj.signatureData;
|
|
48
|
+
} else {
|
|
49
|
+
if(swapInitOrObj.signature!=null) this.signatureData ={
|
|
50
|
+
prefix: swapInitOrObj.prefix,
|
|
51
|
+
timeout: swapInitOrObj.timeout,
|
|
52
|
+
signature: swapInitOrObj.signature
|
|
53
|
+
};
|
|
54
|
+
this.feeRate = swapInitOrObj.feeRate;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//////////////////////////////
|
|
59
|
+
//// Watchdogs
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Periodically checks for init signature's expiry
|
|
63
|
+
*
|
|
64
|
+
* @param intervalSeconds How often to check (in seconds), default to 5s
|
|
65
|
+
* @param abortSignal
|
|
66
|
+
* @protected
|
|
67
|
+
*/
|
|
68
|
+
protected async watchdogWaitTillSignatureExpiry(intervalSeconds?: number, abortSignal?: AbortSignal): Promise<void> {
|
|
69
|
+
if(this.data==null || this.signatureData==null)
|
|
70
|
+
throw new Error("Tried to await signature expiry but data or signature is null, invalid state?");
|
|
71
|
+
|
|
72
|
+
intervalSeconds ??= 5;
|
|
73
|
+
let expired = false
|
|
74
|
+
while(!expired) {
|
|
75
|
+
await timeoutPromise(intervalSeconds*1000, abortSignal);
|
|
76
|
+
try {
|
|
77
|
+
expired = await this.wrapper.contract.isInitAuthorizationExpired(this.data, this.signatureData);
|
|
78
|
+
} catch (e) {
|
|
79
|
+
this.logger.error("watchdogWaitTillSignatureExpiry(): Error when checking signature expiry: ", e);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
//////////////////////////////
|
|
87
|
+
//// Amounts & fees
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get the estimated smart chain fee of the commit transaction
|
|
91
|
+
*/
|
|
92
|
+
protected getCommitFee(): Promise<bigint> {
|
|
93
|
+
return this.wrapper.contract.getCommitFee(this._getInitiator(), this.getSwapData(), this.feeRate);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Returns the transaction fee paid on the smart chain
|
|
98
|
+
*/
|
|
99
|
+
async getSmartChainNetworkFee(): Promise<TokenAmount<T["ChainId"], SCToken<T["ChainId"]>>> {
|
|
100
|
+
const swapContract: T["Contract"] = this.wrapper.contract;
|
|
101
|
+
return toTokenAmount(
|
|
102
|
+
await (
|
|
103
|
+
swapContract.getRawCommitFee!=null ?
|
|
104
|
+
swapContract.getRawCommitFee(this._getInitiator(), this.getSwapData(), this.feeRate) :
|
|
105
|
+
swapContract.getCommitFee(this._getInitiator(), this.getSwapData(), this.feeRate)
|
|
106
|
+
),
|
|
107
|
+
this.wrapper.getNativeToken(),
|
|
108
|
+
this.wrapper.prices
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Checks if the initiator/sender has enough balance to cover the transaction fee for processing the swap
|
|
114
|
+
*/
|
|
115
|
+
abstract hasEnoughForTxFees(): Promise<{enoughBalance: boolean, balance: TokenAmount, required: TokenAmount}>;
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
//////////////////////////////
|
|
119
|
+
//// Commit and claim
|
|
120
|
+
|
|
121
|
+
abstract txsCommit(skipChecks?: boolean): Promise<T["TX"][]>;
|
|
122
|
+
abstract commit(_signer: T["Signer"] | T["NativeSigner"], abortSignal?: AbortSignal, skipChecks?: boolean, onBeforeTxSent?: (txId: string) => void): Promise<string>;
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
//////////////////////////////
|
|
126
|
+
//// Quote verification
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Checks if the swap's quote is expired for good (i.e. the swap strictly cannot be committed on-chain anymore)
|
|
130
|
+
*/
|
|
131
|
+
async _verifyQuoteDefinitelyExpired(): Promise<boolean> {
|
|
132
|
+
if(this.data==null || this.signatureData==null) throw new Error("data or signature data are null!");
|
|
133
|
+
|
|
134
|
+
return this.wrapper.contract.isInitAuthorizationExpired(
|
|
135
|
+
this.data!, this.signatureData!
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Checks if the swap's quote is still valid
|
|
141
|
+
*/
|
|
142
|
+
async verifyQuoteValid(): Promise<boolean> {
|
|
143
|
+
if(this.data==null || this.signatureData==null) throw new Error("data or signature data are null!");
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
await this.wrapper.contract.isValidInitAuthorization(
|
|
147
|
+
this._getInitiator(), this.data!, this.signatureData!, this.feeRate
|
|
148
|
+
);
|
|
149
|
+
return true;
|
|
150
|
+
} catch (e) {
|
|
151
|
+
if(e instanceof SignatureVerificationError) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
throw e;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
serialize(): any {
|
|
159
|
+
return {
|
|
160
|
+
...super.serialize(),
|
|
161
|
+
prefix: this.signatureData?.prefix,
|
|
162
|
+
timeout: this.signatureData?.timeout,
|
|
163
|
+
signature: this.signatureData?.signature,
|
|
164
|
+
feeRate: this.feeRate==null ? null : this.feeRate.toString(),
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
}
|