@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,437 @@
|
|
|
1
|
+
import {BtcBlockWithTxs, BtcSyncInfo, BtcTx} from "@atomiqlabs/base";
|
|
2
|
+
import {MempoolBitcoinBlock} from "./MempoolBitcoinBlock";
|
|
3
|
+
import {BitcoinTransaction, MempoolApi, TxVout} from "./MempoolApi";
|
|
4
|
+
import {Buffer} from "buffer";
|
|
5
|
+
import {BitcoinRpcWithAddressIndex, BtcTxWithBlockheight} from "../BitcoinRpcWithAddressIndex";
|
|
6
|
+
import {LightningNetworkApi, LNNodeLiquidity} from "../LightningNetworkApi";
|
|
7
|
+
import {getTxoHash} from "../../utils/Utils";
|
|
8
|
+
import {Script, Transaction} from "@scure/btc-signer";
|
|
9
|
+
import {sha256} from "@noble/hashes/sha2";
|
|
10
|
+
import {timeoutPromise} from "../../utils/TimeoutUtils";
|
|
11
|
+
|
|
12
|
+
const BITCOIN_BLOCKTIME = 600 * 1000;
|
|
13
|
+
const BITCOIN_BLOCKSIZE = 1024*1024;
|
|
14
|
+
|
|
15
|
+
function bitcoinTxToBtcTx(btcTx: Transaction): BtcTx {
|
|
16
|
+
return {
|
|
17
|
+
locktime: btcTx.lockTime,
|
|
18
|
+
version: btcTx.version,
|
|
19
|
+
confirmations: 0,
|
|
20
|
+
txid: Buffer.from(sha256(sha256(btcTx.toBytes(true, false)))).reverse().toString("hex"),
|
|
21
|
+
hex: Buffer.from(btcTx.toBytes(true, false)).toString("hex"),
|
|
22
|
+
raw: Buffer.from(btcTx.toBytes(true, true)).toString("hex"),
|
|
23
|
+
vsize: btcTx.isFinal ? btcTx.vsize : NaN,
|
|
24
|
+
|
|
25
|
+
outs: Array.from({length: btcTx.outputsLength}, (_, i) => i).map((index) => {
|
|
26
|
+
const output = btcTx.getOutput(index);
|
|
27
|
+
return {
|
|
28
|
+
value: Number(output.amount),
|
|
29
|
+
n: index,
|
|
30
|
+
scriptPubKey: {
|
|
31
|
+
asm: Script.decode(output.script!).map(val => typeof(val)==="object" ? Buffer.from(val).toString("hex") : val.toString()).join(" "),
|
|
32
|
+
hex: Buffer.from(output.script!).toString("hex")
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}),
|
|
36
|
+
ins: Array.from({length: btcTx.inputsLength}, (_, i) => i).map(index => {
|
|
37
|
+
const input = btcTx.getInput(index);
|
|
38
|
+
return {
|
|
39
|
+
txid: Buffer.from(input.txid!).toString("hex"),
|
|
40
|
+
vout: input.index!,
|
|
41
|
+
scriptSig: {
|
|
42
|
+
asm: Script.decode(input.finalScriptSig!).map(val => typeof(val)==="object" ? Buffer.from(val).toString("hex") : val.toString()).join(" "),
|
|
43
|
+
hex: Buffer.from(input.finalScriptSig!).toString("hex")
|
|
44
|
+
},
|
|
45
|
+
sequence: input.sequence!,
|
|
46
|
+
txinwitness: input.finalScriptWitness==null ? [] : input.finalScriptWitness.map(witness => Buffer.from(witness).toString("hex"))
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Bitcoin RPC implementation via Mempool.space API
|
|
54
|
+
* @category Bitcoin
|
|
55
|
+
*/
|
|
56
|
+
export class MempoolBitcoinRpc implements BitcoinRpcWithAddressIndex<MempoolBitcoinBlock>, LightningNetworkApi {
|
|
57
|
+
|
|
58
|
+
api: MempoolApi;
|
|
59
|
+
|
|
60
|
+
constructor(urlOrMempoolApi: MempoolApi | string | string[]) {
|
|
61
|
+
this.api = urlOrMempoolApi instanceof MempoolApi ? urlOrMempoolApi : new MempoolApi(urlOrMempoolApi);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns a txo hash for a specific transaction vout
|
|
66
|
+
*
|
|
67
|
+
* @param vout
|
|
68
|
+
* @private
|
|
69
|
+
*/
|
|
70
|
+
private static getTxoHash(vout: TxVout): Buffer {
|
|
71
|
+
return getTxoHash(vout.scriptpubkey, vout.value);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Returns delay in milliseconds till an unconfirmed transaction is expected to confirm, returns -1
|
|
76
|
+
* if the transaction won't confirm any time soon
|
|
77
|
+
*
|
|
78
|
+
* @param feeRate
|
|
79
|
+
* @private
|
|
80
|
+
*/
|
|
81
|
+
private async getTimeTillConfirmation(feeRate: number): Promise<number> {
|
|
82
|
+
const mempoolBlocks = await this.api.getPendingBlocks();
|
|
83
|
+
const mempoolBlockIndex = mempoolBlocks.findIndex(block => block.feeRange[0]<=feeRate);
|
|
84
|
+
if(mempoolBlockIndex===-1) return -1;
|
|
85
|
+
//Last returned block is usually an aggregate (or a stack) of multiple btc blocks, if tx falls in this block
|
|
86
|
+
// and the last returned block really is an aggregate one (size bigger than BITCOIN_BLOCKSIZE) we return -1
|
|
87
|
+
if(
|
|
88
|
+
mempoolBlockIndex+1===mempoolBlocks.length &&
|
|
89
|
+
mempoolBlocks[mempoolBlocks.length-1].blockVSize>BITCOIN_BLOCKSIZE
|
|
90
|
+
) return -1;
|
|
91
|
+
return (mempoolBlockIndex+1) * BITCOIN_BLOCKTIME;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Returns an estimate after which time the tx will confirm with the required amount of confirmations,
|
|
96
|
+
* confirmationDelay of -1 means the transaction won't confirm in the near future
|
|
97
|
+
*
|
|
98
|
+
* @param tx
|
|
99
|
+
* @param requiredConfirmations
|
|
100
|
+
* @private
|
|
101
|
+
*
|
|
102
|
+
* @returns estimated confirmation delay, -1 if the transaction won't confirm in the near future, null if the
|
|
103
|
+
* transaction was replaced or was confirmed in the meantime
|
|
104
|
+
*/
|
|
105
|
+
async getConfirmationDelay(tx: {txid: string, confirmations?: number}, requiredConfirmations: number): Promise<number | null> {
|
|
106
|
+
if(tx.confirmations==null || tx.confirmations===0) {
|
|
107
|
+
//Get CPFP data
|
|
108
|
+
const cpfpData = await this.api.getCPFPData(tx.txid);
|
|
109
|
+
if(cpfpData.effectiveFeePerVsize==null) {
|
|
110
|
+
//Transaction is either confirmed in the meantime, or replaced
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
let confirmationDelay = (await this.getTimeTillConfirmation(cpfpData.effectiveFeePerVsize));
|
|
114
|
+
if(confirmationDelay!==-1) confirmationDelay += (requiredConfirmations-1)*BITCOIN_BLOCKTIME;
|
|
115
|
+
return confirmationDelay;
|
|
116
|
+
}
|
|
117
|
+
if(tx.confirmations>requiredConfirmations) return 0;
|
|
118
|
+
return ((requiredConfirmations-tx.confirmations)*BITCOIN_BLOCKTIME);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Converts mempool API's transaction to BtcTx object while fetching the raw tx separately
|
|
123
|
+
* @param tx Transaction to convert
|
|
124
|
+
* @private
|
|
125
|
+
*/
|
|
126
|
+
private async toBtcTx(tx: BitcoinTransaction): Promise<BtcTxWithBlockheight | null> {
|
|
127
|
+
const base = await this.toBtcTxWithoutRawData(tx);
|
|
128
|
+
if(base==null) return null;
|
|
129
|
+
const rawTx = await this.api.getRawTransaction(tx.txid);
|
|
130
|
+
if(rawTx==null) return null;
|
|
131
|
+
//Strip witness data
|
|
132
|
+
const btcTx = Transaction.fromRaw(rawTx, {
|
|
133
|
+
allowLegacyWitnessUtxo: true,
|
|
134
|
+
allowUnknownInputs: true,
|
|
135
|
+
allowUnknownOutputs: true,
|
|
136
|
+
disableScriptCheck: true
|
|
137
|
+
});
|
|
138
|
+
const strippedRawTx = Buffer.from(btcTx.toBytes(true, false)).toString("hex");
|
|
139
|
+
|
|
140
|
+
return {
|
|
141
|
+
...base,
|
|
142
|
+
hex: strippedRawTx,
|
|
143
|
+
raw: rawTx.toString("hex")
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Converts mempool API's transaction to BtcTx object, doesn't populate raw and hex fields
|
|
149
|
+
* @param tx Transaction to convert
|
|
150
|
+
* @private
|
|
151
|
+
*/
|
|
152
|
+
private async toBtcTxWithoutRawData(tx: BitcoinTransaction): Promise<Omit<BtcTxWithBlockheight, "raw" | "hex">> {
|
|
153
|
+
let confirmations: number = 0;
|
|
154
|
+
if(tx.status!=null && tx.status.confirmed) {
|
|
155
|
+
const blockheight = await this.api.getTipBlockHeight();
|
|
156
|
+
confirmations = blockheight-tx.status.block_height+1;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
locktime: tx.locktime,
|
|
161
|
+
version: tx.version,
|
|
162
|
+
blockheight: tx.status?.block_height,
|
|
163
|
+
blockhash: tx.status?.block_hash,
|
|
164
|
+
confirmations,
|
|
165
|
+
txid: tx.txid,
|
|
166
|
+
vsize: tx.weight/4,
|
|
167
|
+
outs: tx.vout.map((e, index) => {
|
|
168
|
+
return {
|
|
169
|
+
value: e.value,
|
|
170
|
+
n: index,
|
|
171
|
+
scriptPubKey: {
|
|
172
|
+
hex: e.scriptpubkey,
|
|
173
|
+
asm: e.scriptpubkey_asm
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}),
|
|
177
|
+
ins: tx.vin.map(e => {
|
|
178
|
+
return {
|
|
179
|
+
txid: e.txid,
|
|
180
|
+
vout: e.vout,
|
|
181
|
+
scriptSig: {
|
|
182
|
+
hex: e.scriptsig,
|
|
183
|
+
asm: e.scriptsig_asm
|
|
184
|
+
},
|
|
185
|
+
sequence: e.sequence,
|
|
186
|
+
txinwitness: e.witness
|
|
187
|
+
}
|
|
188
|
+
}),
|
|
189
|
+
inputAddresses: tx.vin.map(e => e.prevout.scriptpubkey_address)
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
getTipHeight(): Promise<number> {
|
|
194
|
+
return this.api.getTipBlockHeight();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async getBlockHeader(blockhash: string): Promise<MempoolBitcoinBlock> {
|
|
198
|
+
return new MempoolBitcoinBlock(await this.api.getBlockHeader(blockhash));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async getMerkleProof(txId: string, blockhash: string): Promise<{
|
|
202
|
+
reversedTxId: Buffer;
|
|
203
|
+
pos: number;
|
|
204
|
+
merkle: Buffer[];
|
|
205
|
+
blockheight: number
|
|
206
|
+
}> {
|
|
207
|
+
const proof = await this.api.getTransactionProof(txId);
|
|
208
|
+
return {
|
|
209
|
+
reversedTxId: Buffer.from(txId, "hex").reverse(),
|
|
210
|
+
pos: proof.pos,
|
|
211
|
+
merkle: proof.merkle.map(e => Buffer.from(e, "hex").reverse()),
|
|
212
|
+
blockheight: proof.block_height
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async getTransaction(txId: string): Promise<BtcTxWithBlockheight | null> {
|
|
217
|
+
const tx = await this.api.getTransaction(txId);
|
|
218
|
+
if(tx==null) return null;
|
|
219
|
+
return await this.toBtcTx(tx);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
async isInMainChain(blockhash: string): Promise<boolean> {
|
|
223
|
+
const blockStatus = await this.api.getBlockStatus(blockhash);
|
|
224
|
+
return blockStatus.in_best_chain;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
getBlockhash(height: number): Promise<string> {
|
|
228
|
+
return this.api.getBlockHash(height);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
getBlockWithTransactions(blockhash: string): Promise<BtcBlockWithTxs> {
|
|
232
|
+
throw new Error("Unsupported.");
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async getSyncInfo(): Promise<BtcSyncInfo> {
|
|
236
|
+
const tipHeight = await this.api.getTipBlockHeight();
|
|
237
|
+
return {
|
|
238
|
+
verificationProgress: 1,
|
|
239
|
+
blocks: tipHeight,
|
|
240
|
+
headers: tipHeight,
|
|
241
|
+
ibd: false
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
async getPast15Blocks(height: number): Promise<MempoolBitcoinBlock[]> {
|
|
246
|
+
return (await this.api.getPast15BlockHeaders(height)).map(blockHeader => new MempoolBitcoinBlock(blockHeader));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
async checkAddressTxos(address: string, txoHash: Buffer): Promise<{
|
|
250
|
+
tx: Omit<BtcTxWithBlockheight, "hex" | "raw">,
|
|
251
|
+
vout: number
|
|
252
|
+
} | null> {
|
|
253
|
+
const allTxs = await this.api.getAddressTransactions(address);
|
|
254
|
+
|
|
255
|
+
const relevantTxs = allTxs
|
|
256
|
+
.map(tx => {
|
|
257
|
+
return {
|
|
258
|
+
tx,
|
|
259
|
+
vout: tx.vout.findIndex(vout => MempoolBitcoinRpc.getTxoHash(vout).equals(txoHash))
|
|
260
|
+
}
|
|
261
|
+
})
|
|
262
|
+
.filter(obj => obj.vout>=0)
|
|
263
|
+
.sort((a, b) => {
|
|
264
|
+
if(a.tx.status.confirmed && !b.tx.status.confirmed) return -1;
|
|
265
|
+
if(!a.tx.status.confirmed && b.tx.status.confirmed) return 1;
|
|
266
|
+
if(a.tx.status.confirmed && b.tx.status.confirmed) return a.tx.status.block_height-b.tx.status.block_height;
|
|
267
|
+
return 0;
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
if(relevantTxs.length===0) return null;
|
|
271
|
+
|
|
272
|
+
return {
|
|
273
|
+
tx: await this.toBtcTxWithoutRawData(relevantTxs[0].tx),
|
|
274
|
+
vout: relevantTxs[0].vout
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Waits till the address receives a transaction containing a specific txoHash
|
|
280
|
+
*
|
|
281
|
+
* @param address
|
|
282
|
+
* @param txoHash
|
|
283
|
+
* @param requiredConfirmations
|
|
284
|
+
* @param stateUpdateCbk
|
|
285
|
+
* @param abortSignal
|
|
286
|
+
* @param intervalSeconds
|
|
287
|
+
*/
|
|
288
|
+
async waitForAddressTxo(
|
|
289
|
+
address: string,
|
|
290
|
+
txoHash: Buffer,
|
|
291
|
+
requiredConfirmations: number,
|
|
292
|
+
stateUpdateCbk: (btcTx?: Omit<BtcTxWithBlockheight, "hex" | "raw">, vout?: number, txEtaMS?: number) => void,
|
|
293
|
+
abortSignal?: AbortSignal,
|
|
294
|
+
intervalSeconds?: number
|
|
295
|
+
): Promise<{
|
|
296
|
+
tx: Omit<BtcTxWithBlockheight, "hex" | "raw">,
|
|
297
|
+
vout: number
|
|
298
|
+
}> {
|
|
299
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
300
|
+
|
|
301
|
+
while(abortSignal==null || !abortSignal.aborted) {
|
|
302
|
+
await timeoutPromise((intervalSeconds || 5)*1000, abortSignal);
|
|
303
|
+
|
|
304
|
+
const result = await this.checkAddressTxos(address, txoHash);
|
|
305
|
+
if(result==null) {
|
|
306
|
+
stateUpdateCbk();
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const confirmationDelay = await this.getConfirmationDelay(result.tx, requiredConfirmations);
|
|
311
|
+
if(confirmationDelay==null) continue;
|
|
312
|
+
|
|
313
|
+
if(stateUpdateCbk!=null) stateUpdateCbk(
|
|
314
|
+
result.tx,
|
|
315
|
+
result.vout,
|
|
316
|
+
confirmationDelay
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
if(confirmationDelay===0) return result;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
throw abortSignal.reason;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
async waitForTransaction(
|
|
327
|
+
txId: string, requiredConfirmations: number,
|
|
328
|
+
stateUpdateCbk: (btcTx?: BtcTxWithBlockheight, txEtaMS?: number) => void,
|
|
329
|
+
abortSignal?: AbortSignal, intervalSeconds?: number
|
|
330
|
+
): Promise<BtcTxWithBlockheight> {
|
|
331
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
332
|
+
|
|
333
|
+
while(abortSignal==null || !abortSignal.aborted) {
|
|
334
|
+
await timeoutPromise((intervalSeconds || 5)*1000, abortSignal);
|
|
335
|
+
|
|
336
|
+
const result = await this.getTransaction(txId);
|
|
337
|
+
if(result==null) {
|
|
338
|
+
stateUpdateCbk();
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const confirmationDelay = await this.getConfirmationDelay(result, requiredConfirmations);
|
|
343
|
+
if(confirmationDelay==null) continue;
|
|
344
|
+
|
|
345
|
+
if(stateUpdateCbk!=null) stateUpdateCbk(
|
|
346
|
+
result,
|
|
347
|
+
confirmationDelay
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
if(confirmationDelay===0) return result;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
throw abortSignal.reason;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
async getLNNodeLiquidity(pubkey: string): Promise<LNNodeLiquidity | null> {
|
|
357
|
+
const nodeInfo = await this.api.getLNNodeInfo(pubkey);
|
|
358
|
+
if(nodeInfo==null) return null;
|
|
359
|
+
return {
|
|
360
|
+
publicKey: nodeInfo.public_key,
|
|
361
|
+
capacity: BigInt(nodeInfo.capacity),
|
|
362
|
+
numChannels: nodeInfo.active_channel_count
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
sendRawTransaction(rawTx: string): Promise<string> {
|
|
367
|
+
return this.api.sendTransaction(rawTx);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
sendRawPackage(rawTx: string[]): Promise<string[]> {
|
|
371
|
+
throw new Error("Unsupported");
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
async isSpent(utxo: string, confirmed?: boolean): Promise<boolean> {
|
|
375
|
+
const [txId, voutStr] = utxo.split(":");
|
|
376
|
+
const vout = parseInt(voutStr);
|
|
377
|
+
const outspends = await this.api.getOutspends(txId);
|
|
378
|
+
if(outspends[vout]==null) return true;
|
|
379
|
+
if(confirmed) {
|
|
380
|
+
return outspends[vout].spent && outspends[vout].status.confirmed;
|
|
381
|
+
}
|
|
382
|
+
return outspends[vout].spent;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
parseTransaction(rawTx: string): Promise<BtcTx> {
|
|
386
|
+
const btcTx = Transaction.fromRaw(Buffer.from(rawTx, "hex"), {
|
|
387
|
+
allowLegacyWitnessUtxo: true,
|
|
388
|
+
allowUnknownInputs: true,
|
|
389
|
+
allowUnknownOutputs: true,
|
|
390
|
+
disableScriptCheck: true
|
|
391
|
+
});
|
|
392
|
+
return Promise.resolve(bitcoinTxToBtcTx(btcTx));
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
getEffectiveFeeRate(btcTx: BtcTx): Promise<{ vsize: number; fee: number; feeRate: number }> {
|
|
396
|
+
throw new Error("Unsupported.");
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
async getFeeRate(): Promise<number> {
|
|
400
|
+
return (await this.api.getFees()).fastestFee;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
getAddressBalances(address: string): Promise<{
|
|
404
|
+
confirmedBalance: bigint,
|
|
405
|
+
unconfirmedBalance: bigint
|
|
406
|
+
}> {
|
|
407
|
+
return this.api.getAddressBalances(address);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
async getAddressUTXOs(address:string): Promise<{
|
|
411
|
+
txid: string,
|
|
412
|
+
vout: number,
|
|
413
|
+
confirmed: boolean,
|
|
414
|
+
block_height: number,
|
|
415
|
+
block_hash: string,
|
|
416
|
+
block_time: number
|
|
417
|
+
value: bigint
|
|
418
|
+
}[]> {
|
|
419
|
+
return (await this.api.getAddressUTXOs(address)).map(val => ({
|
|
420
|
+
txid: val.txid,
|
|
421
|
+
vout: val.vout,
|
|
422
|
+
confirmed: val.status.confirmed,
|
|
423
|
+
block_height: val.status.block_height,
|
|
424
|
+
block_hash: val.status.block_hash,
|
|
425
|
+
block_time: val.status.block_time,
|
|
426
|
+
value: val.value
|
|
427
|
+
}));
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
getCPFPData(txId: string): Promise<{
|
|
431
|
+
effectiveFeePerVsize: number,
|
|
432
|
+
adjustedVsize: number
|
|
433
|
+
}> {
|
|
434
|
+
return this.api.getCPFPData(txId)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import {BtcRelay, BtcStoredHeader, RelaySynchronizer} from "@atomiqlabs/base";
|
|
2
|
+
import {MempoolBitcoinBlock} from "../MempoolBitcoinBlock";
|
|
3
|
+
import {MempoolBitcoinRpc} from "../MempoolBitcoinRpc";
|
|
4
|
+
|
|
5
|
+
import {getLogger} from "../../../utils/Logger";
|
|
6
|
+
import {timeoutPromise} from "../../../utils/TimeoutUtils";
|
|
7
|
+
|
|
8
|
+
const logger = getLogger("MempoolBtcRelaySynchronizer: ")
|
|
9
|
+
|
|
10
|
+
export class MempoolBtcRelaySynchronizer<B extends BtcStoredHeader<any>, TX> implements RelaySynchronizer<B, TX, MempoolBitcoinBlock > {
|
|
11
|
+
|
|
12
|
+
bitcoinRpc: MempoolBitcoinRpc;
|
|
13
|
+
btcRelay: BtcRelay<B, TX, MempoolBitcoinBlock>;
|
|
14
|
+
|
|
15
|
+
constructor(btcRelay: BtcRelay<B, TX, MempoolBitcoinBlock>, bitcoinRpc: MempoolBitcoinRpc) {
|
|
16
|
+
this.btcRelay = btcRelay;
|
|
17
|
+
this.bitcoinRpc = bitcoinRpc;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async syncToLatestTxs(signer: string, feeRate?: string): Promise<{
|
|
21
|
+
txs: TX[]
|
|
22
|
+
targetCommitedHeader: B,
|
|
23
|
+
computedHeaderMap: {[blockheight: number]: B},
|
|
24
|
+
blockHeaderMap: {[blockheight: number]: MempoolBitcoinBlock},
|
|
25
|
+
btcRelayTipCommitedHeader: B,
|
|
26
|
+
btcRelayTipBlockHeader: MempoolBitcoinBlock,
|
|
27
|
+
latestBlockHeader: MempoolBitcoinBlock,
|
|
28
|
+
startForkId?: number
|
|
29
|
+
}> {
|
|
30
|
+
const tipData = await this.btcRelay.getTipData();
|
|
31
|
+
if(tipData==null) throw new Error("BtcRelay tip data not found - probably not initialized?");
|
|
32
|
+
|
|
33
|
+
const latestKnownBlockLogData = await this.btcRelay.retrieveLatestKnownBlockLog();
|
|
34
|
+
if(latestKnownBlockLogData==null) throw new Error("Failed to get latest known block log");
|
|
35
|
+
const {resultStoredHeader, resultBitcoinHeader} = latestKnownBlockLogData;
|
|
36
|
+
|
|
37
|
+
let cacheData: {
|
|
38
|
+
forkId: number,
|
|
39
|
+
lastStoredHeader: B,
|
|
40
|
+
tx?: TX,
|
|
41
|
+
computedCommitedHeaders: B[]
|
|
42
|
+
} = {
|
|
43
|
+
forkId: resultStoredHeader.getBlockheight()<tipData.blockheight ? -1 : 0, //Indicate that we will be submitting blocks to fork
|
|
44
|
+
lastStoredHeader: resultStoredHeader,
|
|
45
|
+
computedCommitedHeaders: []
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
let spvTipBlockHeader = latestKnownBlockLogData.resultBitcoinHeader;
|
|
49
|
+
|
|
50
|
+
logger.debug("Retrieved stored header with commitment: ", cacheData.lastStoredHeader);
|
|
51
|
+
logger.debug("SPV tip bitcoin RPC block header: ", spvTipBlockHeader);
|
|
52
|
+
|
|
53
|
+
let spvTipBlockHeight = spvTipBlockHeader.height;
|
|
54
|
+
|
|
55
|
+
const txsList: TX[] = [];
|
|
56
|
+
const blockHeaderMap: {[blockheight: number]: MempoolBitcoinBlock} = {
|
|
57
|
+
[resultBitcoinHeader.getHeight()]: resultBitcoinHeader
|
|
58
|
+
};
|
|
59
|
+
const computedHeaderMap: {[blockheight: number]: B} = {
|
|
60
|
+
[resultStoredHeader.getBlockheight()]: resultStoredHeader
|
|
61
|
+
};
|
|
62
|
+
let startForkId: number | undefined = undefined;
|
|
63
|
+
|
|
64
|
+
let forkFee: string | undefined = feeRate;
|
|
65
|
+
let mainFee: string | undefined = feeRate;
|
|
66
|
+
const saveHeaders = async (headerCache: MempoolBitcoinBlock[]) => {
|
|
67
|
+
if(cacheData.forkId===-1) {
|
|
68
|
+
if(mainFee==null) mainFee = await this.btcRelay.getMainFeeRate(signer);
|
|
69
|
+
cacheData = await this.btcRelay.saveNewForkHeaders(signer, headerCache, cacheData.lastStoredHeader, tipData.chainWork, mainFee);
|
|
70
|
+
} else if(cacheData.forkId===0) {
|
|
71
|
+
if(mainFee==null) mainFee = await this.btcRelay.getMainFeeRate(signer);
|
|
72
|
+
cacheData = await this.btcRelay.saveMainHeaders(signer, headerCache, cacheData.lastStoredHeader, mainFee);
|
|
73
|
+
} else {
|
|
74
|
+
if(forkFee==null) forkFee = await this.btcRelay.getForkFeeRate(signer, cacheData.forkId);
|
|
75
|
+
cacheData = await this.btcRelay.saveForkHeaders(signer, headerCache, cacheData.lastStoredHeader, cacheData.forkId, tipData.chainWork, forkFee)
|
|
76
|
+
}
|
|
77
|
+
if(cacheData.forkId!==-1 && cacheData.forkId!==0) startForkId = cacheData.forkId;
|
|
78
|
+
txsList.push(cacheData.tx!);
|
|
79
|
+
for(let storedHeader of cacheData.computedCommitedHeaders) {
|
|
80
|
+
computedHeaderMap[storedHeader.getBlockheight()] = storedHeader;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
let headerCache: MempoolBitcoinBlock[] = [];
|
|
85
|
+
|
|
86
|
+
while(true) {
|
|
87
|
+
const retrievedHeaders = await this.bitcoinRpc.getPast15Blocks(spvTipBlockHeight+15);
|
|
88
|
+
let startIndex = retrievedHeaders.findIndex(val => val.height === spvTipBlockHeight);
|
|
89
|
+
if(startIndex === -1) startIndex = retrievedHeaders.length; //Start from the last block
|
|
90
|
+
|
|
91
|
+
for(let i=startIndex-1;i>=0;i--) {
|
|
92
|
+
const header = retrievedHeaders[i];
|
|
93
|
+
|
|
94
|
+
blockHeaderMap[header.height] = header;
|
|
95
|
+
headerCache.push(header);
|
|
96
|
+
|
|
97
|
+
if(cacheData.forkId===0 ?
|
|
98
|
+
headerCache.length>=this.btcRelay.maxHeadersPerTx :
|
|
99
|
+
headerCache.length>=this.btcRelay.maxForkHeadersPerTx) {
|
|
100
|
+
|
|
101
|
+
await saveHeaders(headerCache);
|
|
102
|
+
headerCache = [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if(retrievedHeaders.length>0) {
|
|
107
|
+
if(spvTipBlockHeight === retrievedHeaders[0].height) break; //Already at the tip
|
|
108
|
+
spvTipBlockHeight = retrievedHeaders[0].height;
|
|
109
|
+
await timeoutPromise(1000);
|
|
110
|
+
} else break;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if(headerCache.length>0) await saveHeaders(headerCache);
|
|
114
|
+
|
|
115
|
+
if(cacheData.forkId!==0) {
|
|
116
|
+
throw new Error("Unable to synchronize on-chain bitcoin light client! Not enough chainwork at connected RPC.");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
txs: txsList,
|
|
121
|
+
targetCommitedHeader: cacheData.lastStoredHeader,
|
|
122
|
+
|
|
123
|
+
blockHeaderMap,
|
|
124
|
+
computedHeaderMap,
|
|
125
|
+
|
|
126
|
+
btcRelayTipCommitedHeader: resultStoredHeader,
|
|
127
|
+
btcRelayTipBlockHeader: resultBitcoinHeader,
|
|
128
|
+
|
|
129
|
+
latestBlockHeader: spvTipBlockHeader,
|
|
130
|
+
startForkId
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
}
|