@atomiqlabs/sdk 7.0.12 → 8.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -29
- package/dist/SmartChainAssets.d.ts +11 -3
- package/dist/SmartChainAssets.js +7 -3
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
- package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
- package/dist/bitcoin/LightningNetworkApi.js +2 -0
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
- package/dist/bitcoin/coinselect2/accumulative.js +52 -0
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
- package/dist/bitcoin/coinselect2/blackjack.js +38 -0
- package/dist/bitcoin/coinselect2/index.d.ts +19 -0
- package/dist/bitcoin/coinselect2/index.js +69 -0
- package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
- package/dist/bitcoin/coinselect2/utils.js +123 -0
- package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
- package/dist/bitcoin/mempool/MempoolApi.js +311 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
- package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
- package/dist/enums/FeeType.d.ts +8 -0
- package/dist/enums/FeeType.js +12 -0
- package/dist/enums/SwapAmountType.d.ts +8 -0
- package/dist/enums/SwapAmountType.js +12 -0
- package/dist/enums/SwapDirection.d.ts +8 -0
- package/dist/enums/SwapDirection.js +12 -0
- package/dist/enums/SwapType.d.ts +14 -0
- package/dist/enums/SwapType.js +18 -0
- package/dist/errors/IntermediaryError.d.ts +9 -0
- package/dist/errors/IntermediaryError.js +26 -0
- package/dist/errors/PaymentAuthError.d.ts +11 -0
- package/dist/errors/PaymentAuthError.js +23 -0
- package/dist/errors/RequestError.d.ts +18 -0
- package/dist/errors/RequestError.js +46 -0
- package/dist/errors/UserError.d.ts +7 -0
- package/dist/errors/UserError.js +15 -0
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
- package/dist/events/UnifiedSwapEventListener.js +130 -0
- package/dist/http/HttpUtils.d.ts +27 -0
- package/dist/http/HttpUtils.js +91 -0
- package/dist/http/paramcoders/IParamReader.d.ts +8 -0
- package/dist/http/paramcoders/IParamReader.js +2 -0
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
- package/dist/http/paramcoders/ParamDecoder.js +132 -0
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
- package/dist/http/paramcoders/ParamEncoder.js +31 -0
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
- package/dist/http/paramcoders/SchemaVerifier.js +145 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
- package/dist/index.d.ts +82 -4
- package/dist/index.js +128 -4
- package/dist/intermediaries/Intermediary.d.ts +111 -0
- package/dist/intermediaries/Intermediary.js +115 -0
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
- package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
- package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
- package/dist/lnurl/LNURL.d.ts +102 -0
- package/dist/lnurl/LNURL.js +321 -0
- package/dist/prices/RedundantSwapPrice.d.ts +89 -0
- package/dist/prices/RedundantSwapPrice.js +202 -0
- package/dist/prices/SingleSwapPrice.d.ts +31 -0
- package/dist/prices/SingleSwapPrice.js +41 -0
- package/dist/prices/SwapPriceWithChain.d.ts +70 -0
- package/dist/prices/SwapPriceWithChain.js +91 -0
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
- package/dist/prices/abstract/IPriceProvider.js +74 -0
- package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
- package/dist/prices/abstract/ISwapPrice.js +219 -0
- package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
- package/dist/prices/providers/BinancePriceProvider.js +23 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
- package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
- package/dist/prices/providers/CustomPriceProvider.js +24 -0
- package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
- package/dist/prices/providers/KrakenPriceProvider.js +36 -0
- package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
- package/dist/prices/providers/OKXPriceProvider.js +23 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
- package/dist/storage/IUnifiedStorage.d.ts +73 -0
- package/dist/storage/IUnifiedStorage.js +2 -0
- package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
- package/dist/storage/UnifiedSwapStorage.js +83 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
- package/dist/swapper/Swapper.d.ts +533 -0
- package/dist/swapper/Swapper.js +1566 -0
- package/dist/swapper/SwapperFactory.d.ts +87 -0
- package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +37 -19
- package/dist/swapper/SwapperUtils.d.ts +153 -0
- package/dist/swapper/SwapperUtils.js +420 -0
- package/dist/swapper/SwapperWithChain.d.ts +214 -0
- package/dist/swapper/SwapperWithChain.js +315 -0
- package/dist/swapper/SwapperWithSigner.d.ts +178 -0
- package/dist/swapper/SwapperWithSigner.js +172 -0
- package/dist/swaps/IAddressSwap.d.ts +13 -0
- package/dist/swaps/IAddressSwap.js +13 -0
- package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
- package/dist/swaps/IBTCWalletSwap.js +17 -0
- package/dist/swaps/IClaimableSwap.d.ts +17 -0
- package/dist/swaps/IClaimableSwap.js +14 -0
- package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
- package/dist/swaps/IClaimableSwapWrapper.js +2 -0
- package/dist/swaps/IRefundableSwap.d.ts +17 -0
- package/dist/swaps/IRefundableSwap.js +13 -0
- package/dist/swaps/ISwap.d.ts +207 -0
- package/dist/swaps/ISwap.js +264 -0
- package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
- package/dist/swaps/ISwapWithGasDrop.js +11 -0
- package/dist/swaps/ISwapWrapper.d.ts +153 -0
- package/dist/swaps/ISwapWrapper.js +227 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
- package/dist/types/AmountData.d.ts +9 -0
- package/dist/types/AmountData.js +2 -0
- package/dist/types/CustomPriceFunction.d.ts +5 -0
- package/dist/types/CustomPriceFunction.js +2 -0
- package/dist/types/PriceInfoType.d.ts +28 -0
- package/dist/types/PriceInfoType.js +57 -0
- package/dist/types/SwapExecutionAction.d.ts +7 -0
- package/dist/types/SwapExecutionAction.js +2 -0
- package/dist/types/SwapWithSigner.d.ts +14 -0
- package/dist/types/SwapWithSigner.js +40 -0
- package/dist/types/Token.d.ts +53 -0
- package/dist/types/Token.js +58 -0
- package/dist/types/TokenAmount.d.ts +57 -0
- package/dist/types/TokenAmount.js +47 -0
- package/dist/types/fees/Fee.d.ts +49 -0
- package/dist/types/fees/Fee.js +2 -0
- package/dist/types/fees/FeeBreakdown.d.ts +10 -0
- package/dist/types/fees/FeeBreakdown.js +2 -0
- package/dist/types/fees/PercentagePPM.d.ts +15 -0
- package/dist/types/fees/PercentagePPM.js +17 -0
- package/dist/types/lnurl/LNURLPay.d.ts +54 -0
- package/dist/types/lnurl/LNURLPay.js +28 -0
- package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
- package/dist/types/lnurl/LNURLWithdraw.js +24 -0
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
- package/dist/utils/BitcoinUtils.d.ts +13 -0
- package/dist/utils/BitcoinUtils.js +98 -0
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
- package/dist/utils/BitcoinWalletUtils.js +14 -0
- package/dist/utils/Logger.d.ts +7 -0
- package/dist/utils/Logger.js +12 -0
- package/dist/utils/RetryUtils.d.ts +21 -0
- package/dist/utils/RetryUtils.js +66 -0
- package/dist/utils/SwapUtils.d.ts +31 -0
- package/dist/utils/SwapUtils.js +18 -0
- package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
- package/dist/utils/TimeoutUtils.js +55 -0
- package/dist/utils/TokenUtils.d.ts +11 -0
- package/dist/utils/TokenUtils.js +29 -0
- package/dist/utils/TypeUtils.d.ts +7 -0
- package/dist/utils/TypeUtils.js +2 -0
- package/dist/utils/Utils.d.ts +57 -0
- package/dist/utils/Utils.js +178 -0
- package/package.json +14 -6
- package/src/SmartChainAssets.ts +11 -3
- package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
- package/src/bitcoin/LightningNetworkApi.ts +16 -0
- package/src/bitcoin/coinselect2/accumulative.ts +68 -0
- package/src/bitcoin/coinselect2/blackjack.ts +49 -0
- package/src/bitcoin/coinselect2/index.ts +92 -0
- package/src/bitcoin/coinselect2/utils.ts +189 -0
- package/src/bitcoin/mempool/MempoolApi.ts +554 -0
- package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
- package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
- package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
- package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
- package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
- package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
- package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
- package/src/enums/FeeType.ts +9 -0
- package/src/enums/SwapAmountType.ts +9 -0
- package/src/enums/SwapDirection.ts +9 -0
- package/src/enums/SwapType.ts +15 -0
- package/src/errors/IntermediaryError.ts +24 -0
- package/src/errors/PaymentAuthError.ts +26 -0
- package/src/errors/RequestError.ts +51 -0
- package/src/errors/UserError.ts +14 -0
- package/src/events/UnifiedSwapEventListener.ts +171 -0
- package/src/http/HttpUtils.ts +92 -0
- package/src/http/paramcoders/IParamReader.ts +10 -0
- package/src/http/paramcoders/ParamDecoder.ts +142 -0
- package/src/http/paramcoders/ParamEncoder.ts +37 -0
- package/src/http/paramcoders/SchemaVerifier.ts +153 -0
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
- package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
- package/src/index.ts +102 -4
- package/src/intermediaries/Intermediary.ts +204 -0
- package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
- package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
- package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
- package/src/lnurl/LNURL.ts +403 -0
- package/src/prices/RedundantSwapPrice.ts +245 -0
- package/src/prices/SingleSwapPrice.ts +47 -0
- package/src/prices/SwapPriceWithChain.ts +157 -0
- package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
- package/src/prices/abstract/IPriceProvider.ts +128 -0
- package/src/prices/abstract/ISwapPrice.ts +328 -0
- package/src/prices/providers/BinancePriceProvider.ts +41 -0
- package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
- package/src/prices/providers/CustomPriceProvider.ts +29 -0
- package/src/prices/providers/KrakenPriceProvider.ts +74 -0
- package/src/prices/providers/OKXPriceProvider.ts +53 -0
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
- package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
- package/src/storage/IUnifiedStorage.ts +83 -0
- package/src/storage/UnifiedSwapStorage.ts +104 -0
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
- package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
- package/src/swapper/Swapper.ts +2107 -0
- package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +113 -72
- package/src/swapper/SwapperUtils.ts +510 -0
- package/src/swapper/SwapperWithChain.ts +464 -0
- package/src/swapper/SwapperWithSigner.ts +300 -0
- package/src/swaps/IAddressSwap.ts +20 -0
- package/src/swaps/IBTCWalletSwap.ts +77 -0
- package/src/swaps/IClaimableSwap.ts +30 -0
- package/src/swaps/IClaimableSwapWrapper.ts +9 -0
- package/src/swaps/IRefundableSwap.ts +29 -0
- package/src/swaps/ISwap.ts +490 -0
- package/src/swaps/ISwapWithGasDrop.ts +19 -0
- package/src/swaps/ISwapWrapper.ts +344 -0
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
- package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
- package/src/types/AmountData.ts +9 -0
- package/src/types/CustomPriceFunction.ts +5 -0
- package/src/types/PriceInfoType.ts +67 -0
- package/src/types/SwapExecutionAction.ts +8 -0
- package/src/types/SwapWithSigner.ts +57 -0
- package/src/types/Token.ts +90 -0
- package/src/types/TokenAmount.ts +110 -0
- package/src/types/fees/Fee.ts +55 -0
- package/src/types/fees/FeeBreakdown.ts +11 -0
- package/src/types/fees/PercentagePPM.ts +24 -0
- package/src/types/lnurl/LNURLPay.ts +72 -0
- package/src/types/lnurl/LNURLWithdraw.ts +55 -0
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
- package/src/utils/BitcoinUtils.ts +86 -0
- package/src/utils/BitcoinWalletUtils.ts +16 -0
- package/src/utils/Logger.ts +15 -0
- package/src/utils/RetryUtils.ts +71 -0
- package/src/utils/SwapUtils.ts +38 -0
- package/src/utils/TimeoutUtils.ts +50 -0
- package/src/utils/TokenUtils.ts +25 -0
- package/src/utils/TypeUtils.ts +9 -0
- package/src/utils/Utils.ts +182 -0
- package/dist/SwapperFactory.d.ts +0 -52
- package/dist/Utils.js +0 -37
- package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
- package/dist/fs-storage/FileSystemStorageManager.js +0 -60
- package/dist/fs-storage/index.d.ts +0 -1
- package/dist/fs-storage/index.js +0 -17
- package/src/SmartChainAssets.js +0 -75
- package/src/SwapperFactory.js +0 -120
- package/src/Utils.js +0 -37
- package/src/Utils.ts +0 -31
- package/src/fs-storage/FileSystemStorageManager.ts +0 -71
- package/src/fs-storage/index.ts +0 -1
- package/src/index.js +0 -21
- package/src/storage/LocalStorageManager.js +0 -72
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { Buffer } from "buffer";
|
|
4
|
+
/**
|
|
5
|
+
* Returns a promise that rejects if the passed promise resolves to `undefined` or `null`
|
|
6
|
+
*
|
|
7
|
+
* @param promise Promise to check resolve value of
|
|
8
|
+
* @param msg Optional message to pass to the thrown `Error`
|
|
9
|
+
* @category Utilities
|
|
10
|
+
*/
|
|
11
|
+
export declare function throwIfUndefined<T>(promise: Promise<T | undefined>, msg?: string): Promise<T>;
|
|
12
|
+
/**
|
|
13
|
+
* Returns a promise that resolves when any of the passed promises resolves, and rejects if all the underlying
|
|
14
|
+
* promises fail with an array of errors returned by the respective promises
|
|
15
|
+
*
|
|
16
|
+
* @param promises A list of promises
|
|
17
|
+
* @category Utilities
|
|
18
|
+
*/
|
|
19
|
+
export declare function promiseAny<T>(promises: Promise<T>[]): Promise<T>;
|
|
20
|
+
/**
|
|
21
|
+
* Maps a JS object to another JS object based on the translation function, the translation function is called for every
|
|
22
|
+
* property (value/key) of the old object and returns the new value of for this property
|
|
23
|
+
*
|
|
24
|
+
* @param obj
|
|
25
|
+
* @param translator
|
|
26
|
+
*/
|
|
27
|
+
export declare function objectMap<InputObject extends {
|
|
28
|
+
[key in string]: any;
|
|
29
|
+
}, OutputObject extends {
|
|
30
|
+
[key in keyof InputObject]: any;
|
|
31
|
+
}>(obj: InputObject, translator: <InputKey extends Extract<keyof InputObject, string>>(value: InputObject[InputKey], key: InputKey) => OutputObject[InputKey]): {
|
|
32
|
+
[key in keyof InputObject]: OutputObject[key];
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Maps the entries from the map to the array using the translator function
|
|
36
|
+
*
|
|
37
|
+
* @param map
|
|
38
|
+
* @param translator
|
|
39
|
+
*/
|
|
40
|
+
export declare function mapToArray<K, V, Output>(map: Map<K, V>, translator: (key: K, value: V) => Output): Output[];
|
|
41
|
+
/**
|
|
42
|
+
* Creates a new abort controller that will abort if the passed abort signal aborts
|
|
43
|
+
*
|
|
44
|
+
* @param abortSignal
|
|
45
|
+
*/
|
|
46
|
+
export declare function extendAbortController(abortSignal?: AbortSignal): AbortController;
|
|
47
|
+
export declare function bigIntMin(a: bigint, b: bigint): bigint;
|
|
48
|
+
export declare function bigIntMin(a?: bigint, b?: bigint): bigint | undefined;
|
|
49
|
+
export declare function bigIntMax(a: bigint, b: bigint): bigint;
|
|
50
|
+
export declare function bigIntMax(a?: bigint, b?: bigint): bigint | undefined;
|
|
51
|
+
export declare function bigIntCompare(a: bigint, b: bigint): -1 | 0 | 1;
|
|
52
|
+
export declare function toBigInt(value: string): bigint;
|
|
53
|
+
export declare function toBigInt(value: undefined): undefined;
|
|
54
|
+
export declare function randomBytes(bytesLength: number): Buffer;
|
|
55
|
+
export declare function getTxoHash(outputScriptHex: string, value: number): Buffer;
|
|
56
|
+
export declare function fromDecimal(amount: string, decimalCount: number): bigint;
|
|
57
|
+
export declare function toDecimal(amount: bigint, decimalCount: number, cut?: boolean, displayDecimals?: number): string;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toDecimal = exports.fromDecimal = exports.getTxoHash = exports.randomBytes = exports.toBigInt = exports.bigIntCompare = exports.bigIntMax = exports.bigIntMin = exports.extendAbortController = exports.mapToArray = exports.objectMap = exports.promiseAny = exports.throwIfUndefined = void 0;
|
|
4
|
+
const buffer_1 = require("buffer");
|
|
5
|
+
const utils_1 = require("@noble/hashes/utils");
|
|
6
|
+
const sha2_1 = require("@noble/hashes/sha2");
|
|
7
|
+
const base_1 = require("@atomiqlabs/base");
|
|
8
|
+
/**
|
|
9
|
+
* Returns a promise that rejects if the passed promise resolves to `undefined` or `null`
|
|
10
|
+
*
|
|
11
|
+
* @param promise Promise to check resolve value of
|
|
12
|
+
* @param msg Optional message to pass to the thrown `Error`
|
|
13
|
+
* @category Utilities
|
|
14
|
+
*/
|
|
15
|
+
function throwIfUndefined(promise, msg) {
|
|
16
|
+
return promise.then(val => {
|
|
17
|
+
if (val == undefined)
|
|
18
|
+
throw new Error(msg ?? "Promise value is undefined!");
|
|
19
|
+
return val;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
exports.throwIfUndefined = throwIfUndefined;
|
|
23
|
+
/**
|
|
24
|
+
* Returns a promise that resolves when any of the passed promises resolves, and rejects if all the underlying
|
|
25
|
+
* promises fail with an array of errors returned by the respective promises
|
|
26
|
+
*
|
|
27
|
+
* @param promises A list of promises
|
|
28
|
+
* @category Utilities
|
|
29
|
+
*/
|
|
30
|
+
function promiseAny(promises) {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
let numRejected = 0;
|
|
33
|
+
const rejectReasons = Array(promises.length);
|
|
34
|
+
promises.forEach((promise, index) => {
|
|
35
|
+
promise.then((val) => {
|
|
36
|
+
if (resolve != null)
|
|
37
|
+
resolve(val);
|
|
38
|
+
resolve = null;
|
|
39
|
+
}).catch(err => {
|
|
40
|
+
rejectReasons[index] = err;
|
|
41
|
+
numRejected++;
|
|
42
|
+
if (numRejected === promises.length) {
|
|
43
|
+
reject(rejectReasons);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
exports.promiseAny = promiseAny;
|
|
50
|
+
/**
|
|
51
|
+
* Maps a JS object to another JS object based on the translation function, the translation function is called for every
|
|
52
|
+
* property (value/key) of the old object and returns the new value of for this property
|
|
53
|
+
*
|
|
54
|
+
* @param obj
|
|
55
|
+
* @param translator
|
|
56
|
+
*/
|
|
57
|
+
function objectMap(obj, translator) {
|
|
58
|
+
const resp = {};
|
|
59
|
+
for (let key in obj) {
|
|
60
|
+
resp[key] = translator(obj[key], key);
|
|
61
|
+
}
|
|
62
|
+
return resp;
|
|
63
|
+
}
|
|
64
|
+
exports.objectMap = objectMap;
|
|
65
|
+
/**
|
|
66
|
+
* Maps the entries from the map to the array using the translator function
|
|
67
|
+
*
|
|
68
|
+
* @param map
|
|
69
|
+
* @param translator
|
|
70
|
+
*/
|
|
71
|
+
function mapToArray(map, translator) {
|
|
72
|
+
const arr = Array(map.size);
|
|
73
|
+
let pointer = 0;
|
|
74
|
+
for (let entry of map.entries()) {
|
|
75
|
+
arr[pointer++] = translator(entry[0], entry[1]);
|
|
76
|
+
}
|
|
77
|
+
return arr;
|
|
78
|
+
}
|
|
79
|
+
exports.mapToArray = mapToArray;
|
|
80
|
+
/**
|
|
81
|
+
* Creates a new abort controller that will abort if the passed abort signal aborts
|
|
82
|
+
*
|
|
83
|
+
* @param abortSignal
|
|
84
|
+
*/
|
|
85
|
+
function extendAbortController(abortSignal) {
|
|
86
|
+
const _abortController = new AbortController();
|
|
87
|
+
if (abortSignal != null) {
|
|
88
|
+
abortSignal.throwIfAborted();
|
|
89
|
+
abortSignal.onabort = () => _abortController.abort(abortSignal.reason);
|
|
90
|
+
}
|
|
91
|
+
return _abortController;
|
|
92
|
+
}
|
|
93
|
+
exports.extendAbortController = extendAbortController;
|
|
94
|
+
function bigIntMin(a, b) {
|
|
95
|
+
if (a == null)
|
|
96
|
+
return b;
|
|
97
|
+
if (b == null)
|
|
98
|
+
return a;
|
|
99
|
+
return a > b ? b : a;
|
|
100
|
+
}
|
|
101
|
+
exports.bigIntMin = bigIntMin;
|
|
102
|
+
function bigIntMax(a, b) {
|
|
103
|
+
if (a == null)
|
|
104
|
+
return b;
|
|
105
|
+
if (b == null)
|
|
106
|
+
return a;
|
|
107
|
+
return b > a ? b : a;
|
|
108
|
+
}
|
|
109
|
+
exports.bigIntMax = bigIntMax;
|
|
110
|
+
function bigIntCompare(a, b) {
|
|
111
|
+
return a > b ? 1 : a === b ? 0 : -1;
|
|
112
|
+
}
|
|
113
|
+
exports.bigIntCompare = bigIntCompare;
|
|
114
|
+
function toBigInt(value) {
|
|
115
|
+
if (value == null)
|
|
116
|
+
return undefined;
|
|
117
|
+
return BigInt(value);
|
|
118
|
+
}
|
|
119
|
+
exports.toBigInt = toBigInt;
|
|
120
|
+
function randomBytes(bytesLength) {
|
|
121
|
+
return buffer_1.Buffer.from((0, utils_1.randomBytes)(bytesLength));
|
|
122
|
+
}
|
|
123
|
+
exports.randomBytes = randomBytes;
|
|
124
|
+
function getTxoHash(outputScriptHex, value) {
|
|
125
|
+
return buffer_1.Buffer.from((0, sha2_1.sha256)(buffer_1.Buffer.concat([
|
|
126
|
+
base_1.BigIntBufferUtils.toBuffer(BigInt(value), "le", 8),
|
|
127
|
+
buffer_1.Buffer.from(outputScriptHex, "hex")
|
|
128
|
+
])));
|
|
129
|
+
}
|
|
130
|
+
exports.getTxoHash = getTxoHash;
|
|
131
|
+
function fromDecimal(amount, decimalCount) {
|
|
132
|
+
if (amount.includes(".")) {
|
|
133
|
+
const [before, after] = amount.split(".");
|
|
134
|
+
if (decimalCount < 0) {
|
|
135
|
+
return BigInt(before.substring(0, before.length + decimalCount));
|
|
136
|
+
}
|
|
137
|
+
if (after.length > decimalCount) {
|
|
138
|
+
//Cut the last digits
|
|
139
|
+
return BigInt((before === "0" ? "" : before) + after.substring(0, decimalCount));
|
|
140
|
+
}
|
|
141
|
+
return BigInt((before === "0" ? "" : before) + after.padEnd(decimalCount, "0"));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
if (decimalCount < 0) {
|
|
145
|
+
return BigInt(amount.substring(0, amount.length + decimalCount));
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
return BigInt(amount + "0".repeat(decimalCount));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.fromDecimal = fromDecimal;
|
|
153
|
+
function toDecimal(amount, decimalCount, cut, displayDecimals) {
|
|
154
|
+
if (decimalCount <= 0) {
|
|
155
|
+
return amount.toString(10) + "0".repeat(-decimalCount);
|
|
156
|
+
}
|
|
157
|
+
const amountStr = amount.toString(10).padStart(decimalCount + 1, "0");
|
|
158
|
+
const splitPoint = amountStr.length - decimalCount;
|
|
159
|
+
const decimalPart = amountStr.substring(splitPoint, amountStr.length);
|
|
160
|
+
let cutTo = decimalPart.length;
|
|
161
|
+
if (cut && cutTo > 0) {
|
|
162
|
+
for (let i = decimalPart.length - 1; i--; i >= 0) {
|
|
163
|
+
if (decimalPart.charAt(i) === "0") {
|
|
164
|
+
cutTo = i;
|
|
165
|
+
}
|
|
166
|
+
else
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
if (cutTo === 0)
|
|
170
|
+
cutTo = 1;
|
|
171
|
+
}
|
|
172
|
+
if (displayDecimals === 0)
|
|
173
|
+
return amountStr.substring(0, splitPoint);
|
|
174
|
+
if (displayDecimals != null && cutTo > displayDecimals)
|
|
175
|
+
cutTo = displayDecimals;
|
|
176
|
+
return amountStr.substring(0, splitPoint) + "." + decimalPart.substring(0, cutTo);
|
|
177
|
+
}
|
|
178
|
+
exports.toDecimal = toDecimal;
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atomiqlabs/sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.7",
|
|
4
4
|
"description": "atomiq labs SDK for cross-chain swaps between smart chains and bitcoin",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types:": "./dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
9
|
+
"build:ts4": "npx -p typescript@4.9 tsc --noEmit",
|
|
10
|
+
"build:ts5": "npx -p typescript@5.9 tsc --noEmit"
|
|
9
11
|
},
|
|
10
12
|
"files": [
|
|
11
13
|
"/dist",
|
|
@@ -21,12 +23,18 @@
|
|
|
21
23
|
"author": "adambor",
|
|
22
24
|
"license": "ISC",
|
|
23
25
|
"dependencies": {
|
|
24
|
-
"@atomiqlabs/base": "^
|
|
25
|
-
"@atomiqlabs/
|
|
26
|
-
"@atomiqlabs/
|
|
26
|
+
"@atomiqlabs/base": "^13.0.4",
|
|
27
|
+
"@atomiqlabs/bolt11": "1.6.1",
|
|
28
|
+
"@atomiqlabs/messenger-nostr": "^2.0.0",
|
|
29
|
+
"@noble/ciphers": "^1.2.1",
|
|
30
|
+
"@noble/hashes": "^1.7.1",
|
|
31
|
+
"@scure/base": "^1.2.4",
|
|
32
|
+
"@scure/btc-signer": "1.7.0",
|
|
33
|
+
"buffer": "6.0.3",
|
|
34
|
+
"events": "3.3.0"
|
|
27
35
|
},
|
|
28
36
|
"devDependencies": {
|
|
29
37
|
"@types/node": "22.13.5",
|
|
30
|
-
"typescript": "4
|
|
38
|
+
"typescript": ">=4"
|
|
31
39
|
}
|
|
32
40
|
}
|
package/src/SmartChainAssets.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
|
|
2
|
+
/**
|
|
3
|
+
* Asset definitions for supported smart chain tokens with pricing information
|
|
4
|
+
* @category Tokens
|
|
5
|
+
*/
|
|
2
6
|
export const SmartChainAssets = {
|
|
3
7
|
_TESTNET_WBTC_VESU: {
|
|
4
8
|
pricing: {
|
|
@@ -32,11 +36,11 @@ export const SmartChainAssets = {
|
|
|
32
36
|
},
|
|
33
37
|
TBTC: {
|
|
34
38
|
pricing: {
|
|
35
|
-
binancePair:
|
|
36
|
-
okxPair:
|
|
39
|
+
binancePair: undefined,
|
|
40
|
+
okxPair: undefined,
|
|
37
41
|
coinGeckoCoinId: "tbtc",
|
|
38
42
|
coinPaprikaCoinId: "tbtc-tbtc",
|
|
39
|
-
krakenPair:
|
|
43
|
+
krakenPair: undefined
|
|
40
44
|
},
|
|
41
45
|
name: "Threshold BTC (tBTC)"
|
|
42
46
|
},
|
|
@@ -155,4 +159,8 @@ export const SmartChainAssets = {
|
|
|
155
159
|
}
|
|
156
160
|
} as const;
|
|
157
161
|
|
|
162
|
+
/**
|
|
163
|
+
* Type representing valid smart chain asset ticker symbols
|
|
164
|
+
* @category Tokens
|
|
165
|
+
*/
|
|
158
166
|
export type SmartChainAssetTickers = keyof typeof SmartChainAssets;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {BitcoinRpc, BtcBlock, BtcTx} from "@atomiqlabs/base";
|
|
2
|
+
import {Buffer} from "buffer";
|
|
3
|
+
|
|
4
|
+
export type BtcTxWithBlockheight = BtcTx & {
|
|
5
|
+
blockheight?: number,
|
|
6
|
+
inputAddresses?: string[]
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type BtcAddressUtxo = {
|
|
10
|
+
txid: string,
|
|
11
|
+
vout: number,
|
|
12
|
+
confirmed: boolean,
|
|
13
|
+
block_height: number,
|
|
14
|
+
block_hash: string,
|
|
15
|
+
block_time: number
|
|
16
|
+
value: bigint
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export interface BitcoinRpcWithAddressIndex<T extends BtcBlock> extends BitcoinRpc<T> {
|
|
20
|
+
|
|
21
|
+
getFeeRate(): Promise<number>;
|
|
22
|
+
getAddressBalances(address: string): Promise<{
|
|
23
|
+
confirmedBalance: bigint,
|
|
24
|
+
unconfirmedBalance: bigint
|
|
25
|
+
}>;
|
|
26
|
+
getAddressUTXOs(address: string): Promise<BtcAddressUtxo[]>;
|
|
27
|
+
getCPFPData(txId: string): Promise<{
|
|
28
|
+
effectiveFeePerVsize: number,
|
|
29
|
+
adjustedVsize: number
|
|
30
|
+
}>;
|
|
31
|
+
getTransaction(txId: string): Promise<BtcTxWithBlockheight | null>;
|
|
32
|
+
waitForTransaction(
|
|
33
|
+
txId: string,
|
|
34
|
+
requiredConfirmations: number,
|
|
35
|
+
stateUpdateCbk: (btcTx?: BtcTxWithBlockheight, txEtaMS?: number) => void,
|
|
36
|
+
abortSignal?: AbortSignal,
|
|
37
|
+
intervalSeconds?: number
|
|
38
|
+
): Promise<BtcTxWithBlockheight>;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns an estimate after which time the tx will confirm with the required amount of confirmations,
|
|
42
|
+
* confirmationDelay of -1 means the transaction won't confirm in the near future
|
|
43
|
+
*
|
|
44
|
+
* @param tx
|
|
45
|
+
* @param requiredConfirmations
|
|
46
|
+
* @private
|
|
47
|
+
*
|
|
48
|
+
* @returns estimated confirmation delay, -1 if the transaction won't confirm in the near future, null if the
|
|
49
|
+
* transaction was replaced or was confirmed in the meantime
|
|
50
|
+
*/
|
|
51
|
+
getConfirmationDelay(tx: BtcTx, requiredConfirmations: number): Promise<number | null>
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Checks if an address received the transaction with the required txoHash, returns info about that
|
|
55
|
+
* specific transaction if found, or null if not found
|
|
56
|
+
*
|
|
57
|
+
* @param address Address that should receive the transaction
|
|
58
|
+
* @param txoHash Required output txoHash
|
|
59
|
+
*/
|
|
60
|
+
checkAddressTxos(address: string, txoHash: Buffer): Promise<{
|
|
61
|
+
tx: Omit<BtcTxWithBlockheight, "hex" | "raw">,
|
|
62
|
+
vout: number
|
|
63
|
+
} | null>;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Waits till the address receives a transaction containing a specific txoHash
|
|
67
|
+
*
|
|
68
|
+
* @param address Address that should receive the transaction
|
|
69
|
+
* @param txoHash Required output txoHash
|
|
70
|
+
* @param requiredConfirmations Required confirmations of the transaction
|
|
71
|
+
* @param stateUpdateCbk Callback for transaction state updates
|
|
72
|
+
* @param abortSignal Abort signal
|
|
73
|
+
* @param intervalSeconds How often to check new transaction
|
|
74
|
+
*/
|
|
75
|
+
waitForAddressTxo(
|
|
76
|
+
address: string,
|
|
77
|
+
txoHash: Buffer,
|
|
78
|
+
requiredConfirmations: number,
|
|
79
|
+
stateUpdateCbk: (btcTx?: Omit<BtcTxWithBlockheight, "hex" | "raw">, vout?: number, txEtaMS?: number) => void,
|
|
80
|
+
abortSignal?: AbortSignal,
|
|
81
|
+
intervalSeconds?: number
|
|
82
|
+
): Promise<{
|
|
83
|
+
tx: Omit<BtcTxWithBlockheight, "hex" | "raw">,
|
|
84
|
+
vout: number
|
|
85
|
+
}>;
|
|
86
|
+
|
|
87
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
export type LNNodeLiquidity = {
|
|
3
|
+
publicKey: string,
|
|
4
|
+
capacity: bigint,
|
|
5
|
+
numChannels: number
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export interface LightningNetworkApi {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Returns the lightning network's node liquidity as identified by an identity public key
|
|
12
|
+
* @param pubkey
|
|
13
|
+
*/
|
|
14
|
+
getLNNodeLiquidity(pubkey: string): Promise<LNNodeLiquidity | null>
|
|
15
|
+
|
|
16
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import {CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, utils} from "./utils";
|
|
2
|
+
|
|
3
|
+
import {getLogger} from "../../utils/Logger";
|
|
4
|
+
|
|
5
|
+
const logger = getLogger("CoinSelect: ");
|
|
6
|
+
|
|
7
|
+
// add inputs until we reach or surpass the target value (or deplete)
|
|
8
|
+
// worst-case: O(n)
|
|
9
|
+
export function accumulative (
|
|
10
|
+
utxos: CoinselectTxInput[],
|
|
11
|
+
outputs: CoinselectTxOutput[],
|
|
12
|
+
feeRate: number,
|
|
13
|
+
type: CoinselectAddressTypes,
|
|
14
|
+
requiredInputs?: CoinselectTxInput[]
|
|
15
|
+
): {
|
|
16
|
+
inputs?: CoinselectTxInput[],
|
|
17
|
+
outputs?: CoinselectTxOutput[],
|
|
18
|
+
fee: number
|
|
19
|
+
} {
|
|
20
|
+
if (!isFinite(utils.uintOrNaN(feeRate))) throw new Error("Invalid feeRate passed!");
|
|
21
|
+
|
|
22
|
+
const inputs = requiredInputs==null ? [] : [...requiredInputs];
|
|
23
|
+
let bytesAccum = utils.transactionBytes(inputs, outputs, type);
|
|
24
|
+
let fee = feeRate * bytesAccum;
|
|
25
|
+
let cpfpAddFee = 0;
|
|
26
|
+
let inAccum = utils.sumOrNaN(inputs);
|
|
27
|
+
const outAccum = utils.sumOrNaN(outputs);
|
|
28
|
+
|
|
29
|
+
logger.debug("accumulative(): total output: ",outAccum);
|
|
30
|
+
|
|
31
|
+
for (let i = 0; i < utxos.length; ++i) {
|
|
32
|
+
const utxo = utxos[i];
|
|
33
|
+
const utxoBytes = utils.inputBytes(utxo);
|
|
34
|
+
const utxoFee = feeRate * utxoBytes;
|
|
35
|
+
const utxoValue = utils.uintOrNaN(utxo.value);
|
|
36
|
+
|
|
37
|
+
let cpfpFee = 0;
|
|
38
|
+
if(utxo.cpfp!=null && utxo.cpfp.txEffectiveFeeRate<feeRate) cpfpFee = Math.ceil(utxo.cpfp.txVsize * (feeRate - utxo.cpfp.txEffectiveFeeRate));
|
|
39
|
+
|
|
40
|
+
// skip detrimental input
|
|
41
|
+
if (utxoFee + cpfpFee > utxo.value) {
|
|
42
|
+
logger.debug("accumulative("+i+"): Skipping detrimental output, cpfpFee: "+cpfpFee+" utxoFee: "+utxoFee+" value: "+utxo.value);
|
|
43
|
+
if (i === utxos.length - 1) return { fee: (feeRate * (bytesAccum + utxoBytes)) + cpfpAddFee + cpfpFee };
|
|
44
|
+
continue
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
bytesAccum += utxoBytes;
|
|
48
|
+
inAccum += utxoValue;
|
|
49
|
+
cpfpAddFee += cpfpFee;
|
|
50
|
+
inputs.push(utxo);
|
|
51
|
+
|
|
52
|
+
fee = Math.ceil((feeRate * bytesAccum) + cpfpAddFee);
|
|
53
|
+
|
|
54
|
+
logger.debug("accumulative("+i+"): total fee: ", fee);
|
|
55
|
+
logger.debug("accumulative("+i+"): input value: ", inAccum);
|
|
56
|
+
logger.debug("accumulative("+i+"): cpfpAddFee: ", cpfpAddFee);
|
|
57
|
+
|
|
58
|
+
// go again?
|
|
59
|
+
if (inAccum < outAccum + fee) continue;
|
|
60
|
+
|
|
61
|
+
logger.debug("accumulative("+i+"): Finalizing transaction, inputs: ", inputs);
|
|
62
|
+
logger.debug("accumulative("+i+"): Finalizing transaction, outputs: ", outputs);
|
|
63
|
+
logger.debug("accumulative("+i+"): Finalizing transaction, feeRate: ", feeRate);
|
|
64
|
+
return utils.finalize(inputs, outputs, feeRate, type, cpfpAddFee);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return { fee };
|
|
68
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, utils} from "./utils";
|
|
2
|
+
|
|
3
|
+
// add inputs until we reach or surpass the target value (or deplete)
|
|
4
|
+
// worst-case: O(n)
|
|
5
|
+
export function blackjack (
|
|
6
|
+
utxos: CoinselectTxInput[],
|
|
7
|
+
outputs: CoinselectTxOutput[],
|
|
8
|
+
feeRate: number,
|
|
9
|
+
type: CoinselectAddressTypes,
|
|
10
|
+
requiredInputs?: CoinselectTxInput[]
|
|
11
|
+
): {
|
|
12
|
+
inputs?: CoinselectTxInput[],
|
|
13
|
+
outputs?: CoinselectTxOutput[],
|
|
14
|
+
fee: number
|
|
15
|
+
} {
|
|
16
|
+
if (!isFinite(utils.uintOrNaN(feeRate))) throw new Error("Invalid feeRate passed!");
|
|
17
|
+
|
|
18
|
+
const inputs = requiredInputs==null ? [] : [...requiredInputs];
|
|
19
|
+
let bytesAccum = utils.transactionBytes(inputs, outputs, type);
|
|
20
|
+
let inAccum = utils.sumOrNaN(inputs);
|
|
21
|
+
let cpfpAddFee = 0;
|
|
22
|
+
const outAccum = utils.sumOrNaN(outputs);
|
|
23
|
+
const threshold = utils.dustThreshold({type});
|
|
24
|
+
|
|
25
|
+
for (let i = 0; i < utxos.length; ++i) {
|
|
26
|
+
const input = utxos[i];
|
|
27
|
+
const inputBytes = utils.inputBytes(input);
|
|
28
|
+
let cpfpFee = 0;
|
|
29
|
+
if(input.cpfp!=null && input.cpfp.txEffectiveFeeRate<feeRate) cpfpFee = Math.ceil(input.cpfp.txVsize * (feeRate - input.cpfp.txEffectiveFeeRate));
|
|
30
|
+
|
|
31
|
+
const fee = Math.ceil((feeRate * (bytesAccum + inputBytes)) + cpfpAddFee + cpfpFee);
|
|
32
|
+
const inputValue = utils.uintOrNaN(input.value);
|
|
33
|
+
|
|
34
|
+
// would it waste value?
|
|
35
|
+
if ((inAccum + inputValue) > (outAccum + fee + threshold)) continue;
|
|
36
|
+
|
|
37
|
+
bytesAccum += inputBytes;
|
|
38
|
+
inAccum += inputValue;
|
|
39
|
+
cpfpAddFee += cpfpFee;
|
|
40
|
+
inputs.push(input);
|
|
41
|
+
|
|
42
|
+
// go again?
|
|
43
|
+
if (inAccum < outAccum + fee) continue;
|
|
44
|
+
|
|
45
|
+
return utils.finalize(inputs, outputs, feeRate, type, cpfpAddFee);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return { fee: (feeRate * bytesAccum) + cpfpAddFee };
|
|
49
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import {accumulative} from "./accumulative"
|
|
2
|
+
import {blackjack} from "./blackjack"
|
|
3
|
+
import {CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, DUST_THRESHOLDS, utils} from "./utils"
|
|
4
|
+
|
|
5
|
+
// order by descending value, minus the inputs approximate fee
|
|
6
|
+
function utxoScore (x: CoinselectTxInput, feeRate: number) {
|
|
7
|
+
let valueAfterFee = x.value - (feeRate * utils.inputBytes(x))
|
|
8
|
+
if(x.cpfp!=null && x.cpfp.txEffectiveFeeRate<feeRate) valueAfterFee -= x.cpfp.txVsize*(feeRate - x.cpfp.txEffectiveFeeRate);
|
|
9
|
+
return valueAfterFee;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export {CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, DUST_THRESHOLDS};
|
|
13
|
+
|
|
14
|
+
export function coinSelect (
|
|
15
|
+
utxos: CoinselectTxInput[],
|
|
16
|
+
outputs: CoinselectTxOutput[],
|
|
17
|
+
feeRate: number,
|
|
18
|
+
type: CoinselectAddressTypes,
|
|
19
|
+
requiredInputs?: CoinselectTxInput[]
|
|
20
|
+
): {
|
|
21
|
+
inputs?: CoinselectTxInput[],
|
|
22
|
+
outputs?: CoinselectTxOutput[],
|
|
23
|
+
fee: number
|
|
24
|
+
} {
|
|
25
|
+
// order by descending value, minus the inputs approximate fee
|
|
26
|
+
utxos = utxos.sort((a, b) => {
|
|
27
|
+
// if(a.cpfp!=null && b.cpfp==null) return 1;
|
|
28
|
+
// if(a.cpfp==null && b.cpfp!=null) return -1;
|
|
29
|
+
return utxoScore(b, feeRate) - utxoScore(a, feeRate);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// attempt to use the blackjack strategy first (no change output)
|
|
33
|
+
const base = blackjack(utxos, outputs, feeRate, type, requiredInputs);
|
|
34
|
+
if (base.inputs) return base;
|
|
35
|
+
|
|
36
|
+
// else, try the accumulative strategy
|
|
37
|
+
return accumulative(utxos, outputs, feeRate, type, requiredInputs);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function maxSendable (
|
|
41
|
+
utxos: CoinselectTxInput[],
|
|
42
|
+
output: {script: Buffer, type: CoinselectAddressTypes},
|
|
43
|
+
feeRate: number,
|
|
44
|
+
requiredInputs?: CoinselectTxInput[],
|
|
45
|
+
additionalOutputs?: {script: Buffer, value: number}[],
|
|
46
|
+
): {
|
|
47
|
+
value: number,
|
|
48
|
+
fee: number
|
|
49
|
+
} {
|
|
50
|
+
if (!isFinite(utils.uintOrNaN(feeRate))) throw new Error("Invalid feeRate passed!");
|
|
51
|
+
|
|
52
|
+
const outputs = additionalOutputs ?? [];
|
|
53
|
+
const inputs = requiredInputs ?? [];
|
|
54
|
+
let bytesAccum = utils.transactionBytes(inputs, (outputs as {script: Buffer}[]).concat([output]));
|
|
55
|
+
let cpfpAddFee = 0;
|
|
56
|
+
let inAccum = utils.sumOrNaN(inputs);
|
|
57
|
+
let outAccum = utils.sumOrNaN(outputs);
|
|
58
|
+
|
|
59
|
+
for (let i = 0; i < utxos.length; ++i) {
|
|
60
|
+
const utxo = utxos[i];
|
|
61
|
+
const utxoBytes = utils.inputBytes(utxo);
|
|
62
|
+
const utxoFee = feeRate * utxoBytes;
|
|
63
|
+
let cpfpFee = 0;
|
|
64
|
+
if(utxo.cpfp!=null && utxo.cpfp.txEffectiveFeeRate<feeRate) cpfpFee = utxo.cpfp.txVsize*(feeRate - utxo.cpfp.txEffectiveFeeRate);
|
|
65
|
+
const utxoValue = utils.uintOrNaN(utxo.value);
|
|
66
|
+
|
|
67
|
+
// skip detrimental input
|
|
68
|
+
if (utxoFee + cpfpFee > utxo.value) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
bytesAccum += utxoBytes;
|
|
73
|
+
inAccum += utxoValue;
|
|
74
|
+
cpfpAddFee += cpfpFee;
|
|
75
|
+
inputs.push(utxo);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const fee = (feeRate * bytesAccum) + cpfpAddFee;
|
|
79
|
+
const outputValue = inAccum - fee - outAccum;
|
|
80
|
+
|
|
81
|
+
const dustThreshold = DUST_THRESHOLDS[output.type];
|
|
82
|
+
|
|
83
|
+
if(outputValue<dustThreshold) return {
|
|
84
|
+
fee,
|
|
85
|
+
value: 0
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
fee,
|
|
90
|
+
value: outputValue
|
|
91
|
+
};
|
|
92
|
+
}
|