@atomiqlabs/sdk 7.0.12 → 8.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -29
- package/dist/SmartChainAssets.d.ts +11 -3
- package/dist/SmartChainAssets.js +7 -3
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
- package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
- package/dist/bitcoin/LightningNetworkApi.js +2 -0
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
- package/dist/bitcoin/coinselect2/accumulative.js +52 -0
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
- package/dist/bitcoin/coinselect2/blackjack.js +38 -0
- package/dist/bitcoin/coinselect2/index.d.ts +19 -0
- package/dist/bitcoin/coinselect2/index.js +69 -0
- package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
- package/dist/bitcoin/coinselect2/utils.js +123 -0
- package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
- package/dist/bitcoin/mempool/MempoolApi.js +311 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
- package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
- package/dist/enums/FeeType.d.ts +8 -0
- package/dist/enums/FeeType.js +12 -0
- package/dist/enums/SwapAmountType.d.ts +8 -0
- package/dist/enums/SwapAmountType.js +12 -0
- package/dist/enums/SwapDirection.d.ts +8 -0
- package/dist/enums/SwapDirection.js +12 -0
- package/dist/enums/SwapType.d.ts +14 -0
- package/dist/enums/SwapType.js +18 -0
- package/dist/errors/IntermediaryError.d.ts +9 -0
- package/dist/errors/IntermediaryError.js +26 -0
- package/dist/errors/PaymentAuthError.d.ts +11 -0
- package/dist/errors/PaymentAuthError.js +23 -0
- package/dist/errors/RequestError.d.ts +18 -0
- package/dist/errors/RequestError.js +46 -0
- package/dist/errors/UserError.d.ts +7 -0
- package/dist/errors/UserError.js +15 -0
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
- package/dist/events/UnifiedSwapEventListener.js +130 -0
- package/dist/http/HttpUtils.d.ts +27 -0
- package/dist/http/HttpUtils.js +91 -0
- package/dist/http/paramcoders/IParamReader.d.ts +8 -0
- package/dist/http/paramcoders/IParamReader.js +2 -0
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
- package/dist/http/paramcoders/ParamDecoder.js +132 -0
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
- package/dist/http/paramcoders/ParamEncoder.js +31 -0
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
- package/dist/http/paramcoders/SchemaVerifier.js +145 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
- package/dist/index.d.ts +82 -4
- package/dist/index.js +128 -4
- package/dist/intermediaries/Intermediary.d.ts +111 -0
- package/dist/intermediaries/Intermediary.js +115 -0
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
- package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
- package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
- package/dist/lnurl/LNURL.d.ts +102 -0
- package/dist/lnurl/LNURL.js +321 -0
- package/dist/prices/RedundantSwapPrice.d.ts +89 -0
- package/dist/prices/RedundantSwapPrice.js +202 -0
- package/dist/prices/SingleSwapPrice.d.ts +31 -0
- package/dist/prices/SingleSwapPrice.js +41 -0
- package/dist/prices/SwapPriceWithChain.d.ts +70 -0
- package/dist/prices/SwapPriceWithChain.js +91 -0
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
- package/dist/prices/abstract/IPriceProvider.js +74 -0
- package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
- package/dist/prices/abstract/ISwapPrice.js +219 -0
- package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
- package/dist/prices/providers/BinancePriceProvider.js +23 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
- package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
- package/dist/prices/providers/CustomPriceProvider.js +24 -0
- package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
- package/dist/prices/providers/KrakenPriceProvider.js +36 -0
- package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
- package/dist/prices/providers/OKXPriceProvider.js +23 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
- package/dist/storage/IUnifiedStorage.d.ts +73 -0
- package/dist/storage/IUnifiedStorage.js +2 -0
- package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
- package/dist/storage/UnifiedSwapStorage.js +83 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
- package/dist/swapper/Swapper.d.ts +533 -0
- package/dist/swapper/Swapper.js +1566 -0
- package/dist/swapper/SwapperFactory.d.ts +87 -0
- package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +37 -19
- package/dist/swapper/SwapperUtils.d.ts +153 -0
- package/dist/swapper/SwapperUtils.js +420 -0
- package/dist/swapper/SwapperWithChain.d.ts +214 -0
- package/dist/swapper/SwapperWithChain.js +315 -0
- package/dist/swapper/SwapperWithSigner.d.ts +178 -0
- package/dist/swapper/SwapperWithSigner.js +172 -0
- package/dist/swaps/IAddressSwap.d.ts +13 -0
- package/dist/swaps/IAddressSwap.js +13 -0
- package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
- package/dist/swaps/IBTCWalletSwap.js +17 -0
- package/dist/swaps/IClaimableSwap.d.ts +17 -0
- package/dist/swaps/IClaimableSwap.js +14 -0
- package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
- package/dist/swaps/IClaimableSwapWrapper.js +2 -0
- package/dist/swaps/IRefundableSwap.d.ts +17 -0
- package/dist/swaps/IRefundableSwap.js +13 -0
- package/dist/swaps/ISwap.d.ts +207 -0
- package/dist/swaps/ISwap.js +264 -0
- package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
- package/dist/swaps/ISwapWithGasDrop.js +11 -0
- package/dist/swaps/ISwapWrapper.d.ts +153 -0
- package/dist/swaps/ISwapWrapper.js +227 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
- package/dist/types/AmountData.d.ts +9 -0
- package/dist/types/AmountData.js +2 -0
- package/dist/types/CustomPriceFunction.d.ts +5 -0
- package/dist/types/CustomPriceFunction.js +2 -0
- package/dist/types/PriceInfoType.d.ts +28 -0
- package/dist/types/PriceInfoType.js +57 -0
- package/dist/types/SwapExecutionAction.d.ts +7 -0
- package/dist/types/SwapExecutionAction.js +2 -0
- package/dist/types/SwapWithSigner.d.ts +14 -0
- package/dist/types/SwapWithSigner.js +40 -0
- package/dist/types/Token.d.ts +53 -0
- package/dist/types/Token.js +58 -0
- package/dist/types/TokenAmount.d.ts +57 -0
- package/dist/types/TokenAmount.js +47 -0
- package/dist/types/fees/Fee.d.ts +49 -0
- package/dist/types/fees/Fee.js +2 -0
- package/dist/types/fees/FeeBreakdown.d.ts +10 -0
- package/dist/types/fees/FeeBreakdown.js +2 -0
- package/dist/types/fees/PercentagePPM.d.ts +15 -0
- package/dist/types/fees/PercentagePPM.js +17 -0
- package/dist/types/lnurl/LNURLPay.d.ts +54 -0
- package/dist/types/lnurl/LNURLPay.js +28 -0
- package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
- package/dist/types/lnurl/LNURLWithdraw.js +24 -0
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
- package/dist/utils/BitcoinUtils.d.ts +13 -0
- package/dist/utils/BitcoinUtils.js +98 -0
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
- package/dist/utils/BitcoinWalletUtils.js +14 -0
- package/dist/utils/Logger.d.ts +7 -0
- package/dist/utils/Logger.js +12 -0
- package/dist/utils/RetryUtils.d.ts +21 -0
- package/dist/utils/RetryUtils.js +66 -0
- package/dist/utils/SwapUtils.d.ts +31 -0
- package/dist/utils/SwapUtils.js +18 -0
- package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
- package/dist/utils/TimeoutUtils.js +55 -0
- package/dist/utils/TokenUtils.d.ts +11 -0
- package/dist/utils/TokenUtils.js +29 -0
- package/dist/utils/TypeUtils.d.ts +7 -0
- package/dist/utils/TypeUtils.js +2 -0
- package/dist/utils/Utils.d.ts +57 -0
- package/dist/utils/Utils.js +178 -0
- package/package.json +14 -6
- package/src/SmartChainAssets.ts +11 -3
- package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
- package/src/bitcoin/LightningNetworkApi.ts +16 -0
- package/src/bitcoin/coinselect2/accumulative.ts +68 -0
- package/src/bitcoin/coinselect2/blackjack.ts +49 -0
- package/src/bitcoin/coinselect2/index.ts +92 -0
- package/src/bitcoin/coinselect2/utils.ts +189 -0
- package/src/bitcoin/mempool/MempoolApi.ts +554 -0
- package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
- package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
- package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
- package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
- package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
- package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
- package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
- package/src/enums/FeeType.ts +9 -0
- package/src/enums/SwapAmountType.ts +9 -0
- package/src/enums/SwapDirection.ts +9 -0
- package/src/enums/SwapType.ts +15 -0
- package/src/errors/IntermediaryError.ts +24 -0
- package/src/errors/PaymentAuthError.ts +26 -0
- package/src/errors/RequestError.ts +51 -0
- package/src/errors/UserError.ts +14 -0
- package/src/events/UnifiedSwapEventListener.ts +171 -0
- package/src/http/HttpUtils.ts +92 -0
- package/src/http/paramcoders/IParamReader.ts +10 -0
- package/src/http/paramcoders/ParamDecoder.ts +142 -0
- package/src/http/paramcoders/ParamEncoder.ts +37 -0
- package/src/http/paramcoders/SchemaVerifier.ts +153 -0
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
- package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
- package/src/index.ts +102 -4
- package/src/intermediaries/Intermediary.ts +204 -0
- package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
- package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
- package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
- package/src/lnurl/LNURL.ts +403 -0
- package/src/prices/RedundantSwapPrice.ts +245 -0
- package/src/prices/SingleSwapPrice.ts +47 -0
- package/src/prices/SwapPriceWithChain.ts +157 -0
- package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
- package/src/prices/abstract/IPriceProvider.ts +128 -0
- package/src/prices/abstract/ISwapPrice.ts +328 -0
- package/src/prices/providers/BinancePriceProvider.ts +41 -0
- package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
- package/src/prices/providers/CustomPriceProvider.ts +29 -0
- package/src/prices/providers/KrakenPriceProvider.ts +74 -0
- package/src/prices/providers/OKXPriceProvider.ts +53 -0
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
- package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
- package/src/storage/IUnifiedStorage.ts +83 -0
- package/src/storage/UnifiedSwapStorage.ts +104 -0
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
- package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
- package/src/swapper/Swapper.ts +2107 -0
- package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +113 -72
- package/src/swapper/SwapperUtils.ts +510 -0
- package/src/swapper/SwapperWithChain.ts +464 -0
- package/src/swapper/SwapperWithSigner.ts +300 -0
- package/src/swaps/IAddressSwap.ts +20 -0
- package/src/swaps/IBTCWalletSwap.ts +77 -0
- package/src/swaps/IClaimableSwap.ts +30 -0
- package/src/swaps/IClaimableSwapWrapper.ts +9 -0
- package/src/swaps/IRefundableSwap.ts +29 -0
- package/src/swaps/ISwap.ts +490 -0
- package/src/swaps/ISwapWithGasDrop.ts +19 -0
- package/src/swaps/ISwapWrapper.ts +344 -0
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
- package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
- package/src/types/AmountData.ts +9 -0
- package/src/types/CustomPriceFunction.ts +5 -0
- package/src/types/PriceInfoType.ts +67 -0
- package/src/types/SwapExecutionAction.ts +8 -0
- package/src/types/SwapWithSigner.ts +57 -0
- package/src/types/Token.ts +90 -0
- package/src/types/TokenAmount.ts +110 -0
- package/src/types/fees/Fee.ts +55 -0
- package/src/types/fees/FeeBreakdown.ts +11 -0
- package/src/types/fees/PercentagePPM.ts +24 -0
- package/src/types/lnurl/LNURLPay.ts +72 -0
- package/src/types/lnurl/LNURLWithdraw.ts +55 -0
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
- package/src/utils/BitcoinUtils.ts +86 -0
- package/src/utils/BitcoinWalletUtils.ts +16 -0
- package/src/utils/Logger.ts +15 -0
- package/src/utils/RetryUtils.ts +71 -0
- package/src/utils/SwapUtils.ts +38 -0
- package/src/utils/TimeoutUtils.ts +50 -0
- package/src/utils/TokenUtils.ts +25 -0
- package/src/utils/TypeUtils.ts +9 -0
- package/src/utils/Utils.ts +182 -0
- package/dist/SwapperFactory.d.ts +0 -52
- package/dist/Utils.js +0 -37
- package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
- package/dist/fs-storage/FileSystemStorageManager.js +0 -60
- package/dist/fs-storage/index.d.ts +0 -1
- package/dist/fs-storage/index.js +0 -17
- package/src/SmartChainAssets.js +0 -75
- package/src/SwapperFactory.js +0 -120
- package/src/Utils.js +0 -37
- package/src/Utils.ts +0 -31
- package/src/fs-storage/FileSystemStorageManager.ts +0 -71
- package/src/fs-storage/index.ts +0 -1
- package/src/index.js +0 -21
- package/src/storage/LocalStorageManager.js +0 -72
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import {decode as bolt11Decode} from "@atomiqlabs/bolt11";
|
|
2
|
+
import {Address, Transaction} from "@scure/btc-signer";
|
|
3
|
+
import {LNURL} from "../lnurl/LNURL";
|
|
4
|
+
import {BTC_NETWORK} from "@scure/btc-signer/utils";
|
|
5
|
+
import {SwapType} from "../enums/SwapType";
|
|
6
|
+
import {ChainIds, MultiChain, Swapper} from "./Swapper";
|
|
7
|
+
import {IBitcoinWallet} from "../bitcoin/wallet/IBitcoinWallet";
|
|
8
|
+
import {SingleAddressBitcoinWallet} from "../bitcoin/wallet/SingleAddressBitcoinWallet";
|
|
9
|
+
import {BigIntBufferUtils, ChainSwapType, isAbstractSigner} from "@atomiqlabs/base";
|
|
10
|
+
import {bigIntMax, fromDecimal, randomBytes} from "../utils/Utils";
|
|
11
|
+
import {MinimalBitcoinWalletInterface} from "../bitcoin/wallet/MinimalBitcoinWalletInterface";
|
|
12
|
+
import {TokenAmount, toTokenAmount} from "../types/TokenAmount";
|
|
13
|
+
import {BitcoinTokens, SCToken} from "../types/Token";
|
|
14
|
+
import {isLNURLWithdraw, LNURLWithdraw} from "../types/lnurl/LNURLWithdraw";
|
|
15
|
+
import {isLNURLPay, LNURLPay} from "../types/lnurl/LNURLPay";
|
|
16
|
+
import {toBitcoinWallet} from "../utils/BitcoinWalletUtils";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Utility class providing helper methods for swap operations
|
|
20
|
+
* @category Core
|
|
21
|
+
*/
|
|
22
|
+
export class SwapperUtils<T extends MultiChain> {
|
|
23
|
+
|
|
24
|
+
readonly bitcoinNetwork: BTC_NETWORK;
|
|
25
|
+
private readonly root: Swapper<T>;
|
|
26
|
+
|
|
27
|
+
constructor(root: Swapper<T>) {
|
|
28
|
+
this.bitcoinNetwork = root.bitcoinNetwork;
|
|
29
|
+
this.root = root;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
isValidSmartChainAddress(address: string, chainId?: ChainIds<T>): boolean {
|
|
33
|
+
if(chainId!=null) {
|
|
34
|
+
if(this.root.chains[chainId]==null) throw new Error(`Unknown chain id: ${chainId}`);
|
|
35
|
+
return this.root.chains[chainId].chainInterface.isValidAddress(address);
|
|
36
|
+
}
|
|
37
|
+
for(let chainId of this.root.getSmartChains()) {
|
|
38
|
+
if(this.root.chains[chainId].chainInterface.isValidAddress(address)) return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Returns true if string is a valid BOLT11 bitcoin lightning invoice
|
|
45
|
+
*
|
|
46
|
+
* @param lnpr
|
|
47
|
+
*/
|
|
48
|
+
isLightningInvoice(lnpr: string): boolean {
|
|
49
|
+
try {
|
|
50
|
+
bolt11Decode(lnpr);
|
|
51
|
+
return true;
|
|
52
|
+
} catch (e) {}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Returns true if string is a valid bitcoin address
|
|
58
|
+
*
|
|
59
|
+
* @param addr
|
|
60
|
+
*/
|
|
61
|
+
isValidBitcoinAddress(addr: string): boolean {
|
|
62
|
+
try {
|
|
63
|
+
Address(this.bitcoinNetwork).decode(addr);
|
|
64
|
+
return true;
|
|
65
|
+
} catch (e) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Returns true if string is a valid BOLT11 bitcoin lightning invoice WITH AMOUNT
|
|
72
|
+
*
|
|
73
|
+
* @param lnpr
|
|
74
|
+
*/
|
|
75
|
+
isValidLightningInvoice(lnpr: string): boolean {
|
|
76
|
+
try {
|
|
77
|
+
const parsed = bolt11Decode(lnpr);
|
|
78
|
+
if(parsed.millisatoshis!=null) return true;
|
|
79
|
+
} catch (e) {}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Returns true if string is a valid LNURL (no checking on type is performed)
|
|
85
|
+
*
|
|
86
|
+
* @param lnurl
|
|
87
|
+
*/
|
|
88
|
+
isValidLNURL(lnurl: string): boolean {
|
|
89
|
+
return LNURL.isLNURL(lnurl);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Returns type and data about an LNURL
|
|
94
|
+
*
|
|
95
|
+
* @param lnurl
|
|
96
|
+
* @param shouldRetry
|
|
97
|
+
*/
|
|
98
|
+
getLNURLTypeAndData(lnurl: string, shouldRetry?: boolean): Promise<LNURLPay | LNURLWithdraw | null> {
|
|
99
|
+
return LNURL.getLNURLType(lnurl, shouldRetry);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Returns satoshi value of BOLT11 bitcoin lightning invoice WITH AMOUNT, returns null otherwise
|
|
104
|
+
*
|
|
105
|
+
* @param lnpr
|
|
106
|
+
*/
|
|
107
|
+
getLightningInvoiceValue(lnpr: string): bigint | null {
|
|
108
|
+
const parsed = bolt11Decode(lnpr);
|
|
109
|
+
if(parsed.millisatoshis!=null) return (BigInt(parsed.millisatoshis) + 999n) / 1000n;
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private parseBitcoinAddress(resultText: string): {
|
|
114
|
+
address: string,
|
|
115
|
+
type: "BITCOIN",
|
|
116
|
+
swapType: SwapType.TO_BTC,
|
|
117
|
+
amount?: TokenAmount
|
|
118
|
+
} | null {
|
|
119
|
+
let _amount: bigint | undefined = undefined;
|
|
120
|
+
if(resultText.includes("?")) {
|
|
121
|
+
const arr = resultText.split("?");
|
|
122
|
+
resultText = arr[0];
|
|
123
|
+
const params = arr[1].split("&");
|
|
124
|
+
for(let param of params) {
|
|
125
|
+
const arr2 = param.split("=");
|
|
126
|
+
const key = arr2[0];
|
|
127
|
+
const value = decodeURIComponent(arr2[1]);
|
|
128
|
+
if(key==="amount") {
|
|
129
|
+
_amount = fromDecimal(parseFloat(value).toFixed(8), 8);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if(this.isValidBitcoinAddress(resultText)) {
|
|
134
|
+
return {
|
|
135
|
+
address: resultText,
|
|
136
|
+
type: "BITCOIN",
|
|
137
|
+
swapType: SwapType.TO_BTC,
|
|
138
|
+
amount: _amount==null ? undefined : toTokenAmount(_amount, BitcoinTokens.BTC, this.root.prices)
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private parseLNURLSync(resultText: string): {
|
|
145
|
+
address: string,
|
|
146
|
+
type: "LNURL",
|
|
147
|
+
swapType: null
|
|
148
|
+
} | null {
|
|
149
|
+
if(this.isValidLNURL(resultText)) {
|
|
150
|
+
return {
|
|
151
|
+
address: resultText,
|
|
152
|
+
type: "LNURL",
|
|
153
|
+
swapType: null
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private async parseLNURL(resultText: string): Promise<{
|
|
160
|
+
address: string,
|
|
161
|
+
type: "LNURL",
|
|
162
|
+
swapType: SwapType.TO_BTCLN | SwapType.FROM_BTCLN,
|
|
163
|
+
lnurl: LNURLPay | LNURLWithdraw,
|
|
164
|
+
min?: TokenAmount,
|
|
165
|
+
max?: TokenAmount,
|
|
166
|
+
amount?: TokenAmount
|
|
167
|
+
} | null> {
|
|
168
|
+
if(this.isValidLNURL(resultText)) {
|
|
169
|
+
try {
|
|
170
|
+
const result = await this.getLNURLTypeAndData(resultText);
|
|
171
|
+
if(result==null) throw new Error("Invalid LNURL specified!");
|
|
172
|
+
const swapType = isLNURLPay(result) ? SwapType.TO_BTCLN : isLNURLWithdraw(result) ? SwapType.FROM_BTCLN : null;
|
|
173
|
+
if(swapType==null) return null;
|
|
174
|
+
const response = {
|
|
175
|
+
address: resultText,
|
|
176
|
+
type: "LNURL",
|
|
177
|
+
swapType,
|
|
178
|
+
lnurl: result
|
|
179
|
+
} as const;
|
|
180
|
+
if(result.min===result.max) {
|
|
181
|
+
return {
|
|
182
|
+
...response,
|
|
183
|
+
amount: result.min==null ? undefined : toTokenAmount(result.min, BitcoinTokens.BTCLN, this.root.prices)
|
|
184
|
+
}
|
|
185
|
+
} else {
|
|
186
|
+
return {
|
|
187
|
+
...response,
|
|
188
|
+
min: result.min==null ? undefined : toTokenAmount(result.min, BitcoinTokens.BTCLN, this.root.prices),
|
|
189
|
+
max: result.min==null ? undefined : toTokenAmount(result.max, BitcoinTokens.BTCLN, this.root.prices)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
} catch (e) {
|
|
193
|
+
throw new Error("Failed to contact LNURL service, check your internet connection and retry later.");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private parseLightningInvoice(resultText: string): {
|
|
200
|
+
address: string,
|
|
201
|
+
type: "LIGHTNING",
|
|
202
|
+
swapType: SwapType.TO_BTCLN,
|
|
203
|
+
amount: TokenAmount
|
|
204
|
+
} | null {
|
|
205
|
+
if(this.isLightningInvoice(resultText)) {
|
|
206
|
+
if(this.isValidLightningInvoice(resultText)) {
|
|
207
|
+
const amount = this.getLightningInvoiceValue(resultText);
|
|
208
|
+
if(amount==null) throw new Error();
|
|
209
|
+
return {
|
|
210
|
+
address: resultText,
|
|
211
|
+
type: "LIGHTNING",
|
|
212
|
+
swapType: SwapType.TO_BTCLN,
|
|
213
|
+
amount: toTokenAmount(amount, BitcoinTokens.BTCLN, this.root.prices)
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
throw new Error("Lightning invoice needs to contain an amount!");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private parseSmartchainAddress(resultText: string): {
|
|
223
|
+
address: string,
|
|
224
|
+
type: ChainIds<T>,
|
|
225
|
+
swapType: null,
|
|
226
|
+
min?: TokenAmount,
|
|
227
|
+
max?: TokenAmount
|
|
228
|
+
} | null {
|
|
229
|
+
for(let chainId of this.root.getSmartChains()) {
|
|
230
|
+
if(this.root.chains[chainId].chainInterface.isValidAddress(resultText)) {
|
|
231
|
+
return {
|
|
232
|
+
address: resultText,
|
|
233
|
+
type: chainId,
|
|
234
|
+
swapType: null
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* General parser for bitcoin addresses, LNURLs, lightning invoices, smart chain addresses, also fetches LNURL data
|
|
243
|
+
* (hence returns Promise)
|
|
244
|
+
*
|
|
245
|
+
* @param addressString Address to parse
|
|
246
|
+
* @throws {Error} Error in address parsing
|
|
247
|
+
* @returns Address data or null if address doesn't conform to any known format
|
|
248
|
+
*/
|
|
249
|
+
async parseAddress(addressString: string): Promise<{
|
|
250
|
+
address: string,
|
|
251
|
+
type: "BITCOIN" | "LIGHTNING" | "LNURL" | ChainIds<T>,
|
|
252
|
+
swapType: SwapType.TO_BTC | SwapType.TO_BTCLN | SwapType.SPV_VAULT_FROM_BTC | SwapType.FROM_BTCLN | null,
|
|
253
|
+
lnurl?: LNURLPay | LNURLWithdraw,
|
|
254
|
+
min?: TokenAmount,
|
|
255
|
+
max?: TokenAmount,
|
|
256
|
+
amount?: TokenAmount
|
|
257
|
+
} | null> {
|
|
258
|
+
if(addressString.startsWith("bitcoin:")) {
|
|
259
|
+
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString.substring(8));
|
|
260
|
+
if(parsedBitcoinAddress!=null) return parsedBitcoinAddress;
|
|
261
|
+
throw new Error("Invalid bitcoin address!");
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString);
|
|
265
|
+
if(parsedBitcoinAddress!=null) return parsedBitcoinAddress;
|
|
266
|
+
|
|
267
|
+
if(addressString.startsWith("lightning:")) {
|
|
268
|
+
const resultText = addressString.substring(10);
|
|
269
|
+
const resultLnurl = await this.parseLNURL(resultText);
|
|
270
|
+
if(resultLnurl!=null) return resultLnurl;
|
|
271
|
+
|
|
272
|
+
const resultLightningInvoice = this.parseLightningInvoice(resultText);
|
|
273
|
+
if(resultLightningInvoice!=null) return resultLightningInvoice;
|
|
274
|
+
|
|
275
|
+
throw new Error("Invalid lightning network invoice or LNURL!");
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const resultLnurl = await this.parseLNURL(addressString);
|
|
279
|
+
if(resultLnurl!=null) return resultLnurl;
|
|
280
|
+
|
|
281
|
+
const resultLightningInvoice = this.parseLightningInvoice(addressString);
|
|
282
|
+
if(resultLightningInvoice!=null) return resultLightningInvoice;
|
|
283
|
+
|
|
284
|
+
return this.parseSmartchainAddress(addressString);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Synchronous general parser for bitcoin addresses, LNURLs, lightning invoices, smart chain addresses, doesn't fetch
|
|
289
|
+
* LNURL data, reports swapType: null instead to prevent returning a Promise
|
|
290
|
+
*
|
|
291
|
+
* @param addressString Address to parse
|
|
292
|
+
* @throws {Error} Error in address parsing
|
|
293
|
+
* @returns Address data or null if address doesn't conform to any known format
|
|
294
|
+
*/
|
|
295
|
+
parseAddressSync(addressString: string): {
|
|
296
|
+
address: string,
|
|
297
|
+
type: "BITCOIN" | "LIGHTNING" | "LNURL" | ChainIds<T>,
|
|
298
|
+
swapType: SwapType.TO_BTC | SwapType.TO_BTCLN | SwapType.SPV_VAULT_FROM_BTC | null,
|
|
299
|
+
min?: TokenAmount,
|
|
300
|
+
max?: TokenAmount,
|
|
301
|
+
amount?: TokenAmount
|
|
302
|
+
} | null {
|
|
303
|
+
if(addressString.startsWith("bitcoin:")) {
|
|
304
|
+
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString.substring(8));
|
|
305
|
+
if(parsedBitcoinAddress!=null) return parsedBitcoinAddress;
|
|
306
|
+
throw new Error("Invalid bitcoin address!");
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString);
|
|
310
|
+
if(parsedBitcoinAddress!=null) return parsedBitcoinAddress;
|
|
311
|
+
|
|
312
|
+
if(addressString.startsWith("lightning:")) {
|
|
313
|
+
const resultText = addressString.substring(10);
|
|
314
|
+
const resultLnurl = this.parseLNURLSync(resultText);
|
|
315
|
+
if(resultLnurl!=null) return resultLnurl;
|
|
316
|
+
|
|
317
|
+
const resultLightningInvoice = this.parseLightningInvoice(resultText);
|
|
318
|
+
if(resultLightningInvoice!=null) return resultLightningInvoice;
|
|
319
|
+
|
|
320
|
+
throw new Error("Invalid lightning network invoice or LNURL!");
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const resultLnurl = this.parseLNURLSync(addressString);
|
|
324
|
+
if(resultLnurl!=null) return resultLnurl;
|
|
325
|
+
|
|
326
|
+
const resultLightningInvoice = this.parseLightningInvoice(addressString);
|
|
327
|
+
if(resultLightningInvoice!=null) return resultLightningInvoice;
|
|
328
|
+
|
|
329
|
+
return this.parseSmartchainAddress(addressString);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Returns a random PSBT that can be used for fee estimation, the last output (the LP output) is omitted
|
|
334
|
+
* to allow for coinselection algorithm to determine maximum sendable amount there
|
|
335
|
+
*
|
|
336
|
+
* @param chainIdentifier
|
|
337
|
+
* @param includeGasToken Whether to return the PSBT also with the gas token amount (increases the vSize by 8)
|
|
338
|
+
*/
|
|
339
|
+
getRandomSpvVaultPsbt<ChainIdentifier extends ChainIds<T>>(chainIdentifier: ChainIdentifier, includeGasToken?: boolean): Transaction {
|
|
340
|
+
const wrapper = this.root.chains[chainIdentifier].wrappers[SwapType.SPV_VAULT_FROM_BTC];
|
|
341
|
+
if(wrapper==null) throw new Error("Chain doesn't support spv vault swaps!");
|
|
342
|
+
return wrapper.getDummySwapPsbt(includeGasToken);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Returns the spendable balance of a bitcoin wallet
|
|
347
|
+
*
|
|
348
|
+
* @param wallet
|
|
349
|
+
* @param targetChain
|
|
350
|
+
* @param options Additional options
|
|
351
|
+
*/
|
|
352
|
+
async getBitcoinSpendableBalance(
|
|
353
|
+
wallet: string | IBitcoinWallet | MinimalBitcoinWalletInterface,
|
|
354
|
+
targetChain?: ChainIds<T>,
|
|
355
|
+
options?: {
|
|
356
|
+
gasDrop?: boolean,
|
|
357
|
+
feeRate?: number,
|
|
358
|
+
minFeeRate?: number
|
|
359
|
+
}
|
|
360
|
+
): Promise<{
|
|
361
|
+
balance: TokenAmount,
|
|
362
|
+
feeRate: number
|
|
363
|
+
}> {
|
|
364
|
+
let bitcoinWallet: IBitcoinWallet;
|
|
365
|
+
if(typeof(wallet)==="string") {
|
|
366
|
+
bitcoinWallet = new SingleAddressBitcoinWallet(this.root.bitcoinRpc, this.bitcoinNetwork, {address: wallet, publicKey: ""});
|
|
367
|
+
} else {
|
|
368
|
+
bitcoinWallet = toBitcoinWallet(wallet, this.root.bitcoinRpc, this.bitcoinNetwork);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
let feeRate = options?.feeRate ?? await bitcoinWallet.getFeeRate();
|
|
372
|
+
if(options?.minFeeRate!=null) feeRate = Math.max(feeRate, options.minFeeRate);
|
|
373
|
+
|
|
374
|
+
let result: {balance: bigint, feeRate: number, totalFee: number};
|
|
375
|
+
if(targetChain!=null && this.root.supportsSwapType(targetChain, SwapType.SPV_VAULT_FROM_BTC)) {
|
|
376
|
+
result = await bitcoinWallet.getSpendableBalance(this.getRandomSpvVaultPsbt(targetChain, options?.gasDrop), feeRate);
|
|
377
|
+
} else {
|
|
378
|
+
result = await bitcoinWallet.getSpendableBalance(undefined, feeRate);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
return {
|
|
382
|
+
balance: toTokenAmount(result.balance, BitcoinTokens.BTC, this.root.prices),
|
|
383
|
+
feeRate: result.feeRate
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Returns the maximum spendable balance of the wallet, deducting the fee needed to initiate a swap for native balances
|
|
389
|
+
*/
|
|
390
|
+
async getSpendableBalance<ChainIdentifier extends ChainIds<T>>(wallet: string | T[ChainIdentifier]["Signer"] | T[ChainIdentifier]["NativeSigner"], token: SCToken<ChainIdentifier>, options?: {
|
|
391
|
+
feeMultiplier?: number,
|
|
392
|
+
feeRate?: any
|
|
393
|
+
}): Promise<TokenAmount> {
|
|
394
|
+
if(this.root.chains[token.chainId]==null) throw new Error("Invalid chain identifier! Unknown chain: "+token.chainId);
|
|
395
|
+
const {swapContract, chainInterface} = this.root.chains[token.chainId];
|
|
396
|
+
|
|
397
|
+
let signer: string;
|
|
398
|
+
if(typeof(wallet)==="string") {
|
|
399
|
+
signer = wallet;
|
|
400
|
+
} else {
|
|
401
|
+
const abstractSigner = isAbstractSigner(wallet) ? wallet : await chainInterface.wrapSigner(wallet);
|
|
402
|
+
signer = abstractSigner.getAddress();
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
let finalBalance: bigint;
|
|
406
|
+
if(chainInterface.getNativeCurrencyAddress()!==token.address) {
|
|
407
|
+
finalBalance = await chainInterface.getBalance(signer, token.address);
|
|
408
|
+
} else {
|
|
409
|
+
let [balance, commitFee] = await Promise.all([
|
|
410
|
+
chainInterface.getBalance(signer, token.address),
|
|
411
|
+
swapContract.getCommitFee(
|
|
412
|
+
signer,
|
|
413
|
+
//Use large amount, such that the fee for wrapping more tokens is always included!
|
|
414
|
+
await swapContract.createSwapData(
|
|
415
|
+
ChainSwapType.HTLC, signer, chainInterface.randomAddress(), token.address,
|
|
416
|
+
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn,
|
|
417
|
+
swapContract.getHashForHtlc(randomBytes(32)).toString("hex"),
|
|
418
|
+
BigIntBufferUtils.fromBuffer(randomBytes(8)), BigInt(Math.floor(Date.now()/1000)),
|
|
419
|
+
true, false, BigIntBufferUtils.fromBuffer(randomBytes(2)), BigIntBufferUtils.fromBuffer(randomBytes(2))
|
|
420
|
+
),
|
|
421
|
+
options?.feeRate
|
|
422
|
+
)
|
|
423
|
+
]);
|
|
424
|
+
|
|
425
|
+
if(options?.feeMultiplier!=null) {
|
|
426
|
+
commitFee = commitFee * (BigInt(Math.floor(options.feeMultiplier*1000000))) / 1000000n;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
finalBalance = bigIntMax(balance - commitFee, 0n);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return toTokenAmount(finalBalance, token, this.root.prices);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Returns the address of the native currency of the chain
|
|
437
|
+
*/
|
|
438
|
+
getNativeToken<ChainIdentifier extends ChainIds<T>>(chainIdentifier: ChainIdentifier): SCToken<ChainIdentifier> {
|
|
439
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
440
|
+
return this.root.tokens[chainIdentifier][this.root.chains[chainIdentifier].chainInterface.getNativeCurrencyAddress()] as SCToken<ChainIdentifier>;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Returns a random signer for a given smart chain
|
|
445
|
+
*
|
|
446
|
+
* @param chainIdentifier
|
|
447
|
+
*/
|
|
448
|
+
randomSigner<ChainIdentifier extends ChainIds<T>>(chainIdentifier: ChainIdentifier): T[ChainIdentifier]["Signer"] {
|
|
449
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
450
|
+
return this.root.chains[chainIdentifier].chainInterface.randomSigner();
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Returns a random address for a given smart chain
|
|
455
|
+
*
|
|
456
|
+
* @param chainIdentifier
|
|
457
|
+
*/
|
|
458
|
+
randomAddress<ChainIdentifier extends ChainIds<T>>(chainIdentifier: ChainIdentifier): string {
|
|
459
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
460
|
+
return this.root.chains[chainIdentifier].chainInterface.randomAddress();
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Signs and broadcasts the supplied smart chain transaction
|
|
465
|
+
*/
|
|
466
|
+
sendAndConfirm<ChainIdentifier extends ChainIds<T>>(
|
|
467
|
+
chainIdentifier: ChainIdentifier,
|
|
468
|
+
signer: T[ChainIdentifier]["NativeSigner"] | T[ChainIdentifier]["Signer"],
|
|
469
|
+
txs: T[ChainIdentifier]["TX"][],
|
|
470
|
+
abortSignal?: AbortSignal,
|
|
471
|
+
onBeforePublish?: (txId: string, rawTx: string) => Promise<void>
|
|
472
|
+
): Promise<string[]> {
|
|
473
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
474
|
+
return this.root.chains[chainIdentifier].chainInterface.sendAndConfirm(signer, txs, true, abortSignal, false, onBeforePublish);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Broadcasts already signed smart chain transactions
|
|
479
|
+
*/
|
|
480
|
+
sendSignedAndConfirm<ChainIdentifier extends ChainIds<T>>(
|
|
481
|
+
chainIdentifier: ChainIdentifier,
|
|
482
|
+
txs: T[ChainIdentifier]["SignedTXType"][],
|
|
483
|
+
abortSignal?: AbortSignal,
|
|
484
|
+
onBeforePublish?: (txId: string, rawTx: string) => Promise<void>
|
|
485
|
+
): Promise<string[]> {
|
|
486
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
487
|
+
return this.root.chains[chainIdentifier].chainInterface.sendSignedAndConfirm(txs, true, abortSignal, false, onBeforePublish);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
serializeUnsignedTransaction<ChainIdentifier extends ChainIds<T>>(chainIdentifier: ChainIdentifier, tx: T[ChainIdentifier]["TX"]): Promise<string> {
|
|
491
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
492
|
+
return this.root.chains[chainIdentifier].chainInterface.serializeTx(tx);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
deserializeUnsignedTransaction<ChainIdentifier extends ChainIds<T>>(chainIdentifier: ChainIdentifier, tx: string): Promise<T[ChainIdentifier]["TX"]> {
|
|
496
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
497
|
+
return this.root.chains[chainIdentifier].chainInterface.deserializeTx(tx);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
serializeSignedTransaction<ChainIdentifier extends ChainIds<T>>(chainIdentifier: ChainIdentifier, tx: T[ChainIdentifier]["SignedTXType"]): Promise<string> {
|
|
501
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
502
|
+
return this.root.chains[chainIdentifier].chainInterface.serializeSignedTx(tx);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
deserializeSignedTransaction<ChainIdentifier extends ChainIds<T>>(chainIdentifier: ChainIdentifier, tx: string): Promise<T[ChainIdentifier]["SignedTXType"]> {
|
|
506
|
+
if(this.root.chains[chainIdentifier]==null) throw new Error("Invalid chain identifier! Unknown chain: "+chainIdentifier);
|
|
507
|
+
return this.root.chains[chainIdentifier].chainInterface.deserializeSignedTx(tx);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
}
|