@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
package/README.md
CHANGED
|
@@ -61,10 +61,14 @@ Create swapper factory, here we can pick and choose which chains we want to have
|
|
|
61
61
|
import {SolanaInitializer, SolanaInitializerType} from "@atomiqlabs/chain-solana";
|
|
62
62
|
import {StarknetInitializer, StarknetInitializerType} from "@atomiqlabs/chain-starknet";
|
|
63
63
|
import {CitreaInitializer, CitreaInitializerType} from "@atomiqlabs/chain-evm";
|
|
64
|
-
import {SwapperFactory} from "@atomiqlabs/sdk";
|
|
64
|
+
import {SwapperFactory, TypedTokens} from "@atomiqlabs/sdk";
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
const
|
|
66
|
+
//Define chains that you want to support here
|
|
67
|
+
const chains = [SolanaInitializer, StarknetInitializer, CitreaInitializer] as const;
|
|
68
|
+
type SupportedChains = typeof chains; //It's helpful that we also get the type of the chains array
|
|
69
|
+
|
|
70
|
+
const Factory = new SwapperFactory<SupportedChains>(chains); //Create swapper factory
|
|
71
|
+
const Tokens: TypedTokens<SupportedChains> = Factory.Tokens; //Get the supported tokens for all the specified chains.
|
|
68
72
|
```
|
|
69
73
|
|
|
70
74
|
#### Browser
|
|
@@ -72,21 +76,21 @@ const Tokens = Factory.Tokens; //Get the supported tokens for all the specified
|
|
|
72
76
|
This uses browser's Indexed DB by default
|
|
73
77
|
|
|
74
78
|
```typescript
|
|
75
|
-
import {BitcoinNetwork} from "@atomiqlabs/sdk";
|
|
79
|
+
import {BitcoinNetwork, TypedSwapper} from "@atomiqlabs/sdk";
|
|
76
80
|
|
|
77
|
-
const swapper = Factory.newSwapper({
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
},
|
|
85
|
-
CITREA: {
|
|
86
|
-
rpcUrl: citreaRpc, //You can also pass JsonApiProvider object here
|
|
87
|
-
}
|
|
81
|
+
const swapper: TypedSwapper<SupportedChains> = Factory.newSwapper({
|
|
82
|
+
chains: {
|
|
83
|
+
SOLANA: {
|
|
84
|
+
rpcUrl: solanaRpc //You can also pass Connection object here
|
|
85
|
+
},
|
|
86
|
+
STARKNET: {
|
|
87
|
+
rpcUrl: starknetRpc //You can also pass Provider object here
|
|
88
88
|
},
|
|
89
|
-
|
|
89
|
+
CITREA: {
|
|
90
|
+
rpcUrl: citreaRpc, //You can also pass JsonApiProvider object here
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
bitcoinNetwork: BitcoinNetwork.TESTNET //or BitcoinNetwork.MAINNET, BitcoinNetwork.TESTNET4 - this also sets the network to use for Solana (solana devnet for bitcoin testnet) & Starknet (sepolia for bitcoin testnet)
|
|
90
94
|
});
|
|
91
95
|
```
|
|
92
96
|
|
|
@@ -104,9 +108,9 @@ Then use pass it in the newSwapper function
|
|
|
104
108
|
|
|
105
109
|
```typescript
|
|
106
110
|
import {SqliteStorageManager, SqliteUnifiedStorage} from "@atomiqlabs/storage-sqlite";
|
|
107
|
-
import {BitcoinNetwork} from "@atomiqlabs/sdk";
|
|
111
|
+
import {BitcoinNetwork, TypedSwapper} from "@atomiqlabs/sdk";
|
|
108
112
|
|
|
109
|
-
const swapper = Factory.newSwapper({
|
|
113
|
+
const swapper: TypedSwapper<SupportedChains> = Factory.newSwapper({
|
|
110
114
|
chains: {
|
|
111
115
|
SOLANA: {
|
|
112
116
|
rpcUrl: solanaRpc //You can also pass Connection object here
|
|
@@ -194,7 +198,7 @@ Getting swap quote
|
|
|
194
198
|
|
|
195
199
|
```typescript
|
|
196
200
|
//Create the swap: swapping SOL to Bitcoin on-chain, receiving _amount of satoshis (smallest unit of bitcoin) to _address
|
|
197
|
-
const swap = await swapper.swap(
|
|
201
|
+
const swap: ToBTCSwap<SolanaChainType> = await swapper.swap(
|
|
198
202
|
Tokens.SOLANA.SOL, //From specified source token
|
|
199
203
|
Tokens.BITCOIN.BTC, //Swap to BTC
|
|
200
204
|
"0.0001", //Amount can be either passed in base units as bigint or in decimal format as string
|
|
@@ -321,7 +325,7 @@ Getting swap quote
|
|
|
321
325
|
|
|
322
326
|
```typescript
|
|
323
327
|
//Create the swap: swapping _amount of satoshis of Bitcoin on-chain to SOL
|
|
324
|
-
const swap = await swapper.swap(
|
|
328
|
+
const swap: FromBTCSwap<SolanaChainType> = await swapper.swap(
|
|
325
329
|
Tokens.BITCOIN.BTC, //Swap from BTC
|
|
326
330
|
Tokens.SOLANA.SOL, //Into specified destination token
|
|
327
331
|
"0.0001", //Amount can be either passed in base units as bigint or in decimal format as string
|
|
@@ -494,7 +498,7 @@ Getting swap quote
|
|
|
494
498
|
|
|
495
499
|
```typescript
|
|
496
500
|
//Create the swap: swapping _amount of satoshis of Bitcoin on-chain to SOL
|
|
497
|
-
const swap = await swapper.swap(
|
|
501
|
+
const swap: SpvFromBTCSwap<StarknetChainType> = await swapper.swap(
|
|
498
502
|
Tokens.BITCOIN.BTC, //Swap from BTC
|
|
499
503
|
Tokens.STARKNET.STRK, //Into specified destination token
|
|
500
504
|
"0.0001", //Amount can be either passed in base units as bigint or in decimal format as string
|
|
@@ -660,7 +664,7 @@ Getting swap quote
|
|
|
660
664
|
|
|
661
665
|
```typescript
|
|
662
666
|
//Create the swap: swapping SOL to Bitcoin lightning
|
|
663
|
-
const swap = await swapper.swap(
|
|
667
|
+
const swap: ToBTCLNSwap<SolanaChainType> = await swapper.swap(
|
|
664
668
|
Tokens.SOLANA.SOL, //From specified source token
|
|
665
669
|
Tokens.BITCOIN.BTCLN, //Swap to BTC-LN
|
|
666
670
|
undefined, //Amount is specified in the lightning network invoice!
|
|
@@ -787,7 +791,7 @@ NOTE: Solana uses an old swap protocol for Bitcoin lightning network -> Solana s
|
|
|
787
791
|
Getting swap quote
|
|
788
792
|
|
|
789
793
|
```typescript
|
|
790
|
-
const swap = await swapper.swap(
|
|
794
|
+
const swap: FromBTCLNSwap<SolanaChainType> = await swapper.swap(
|
|
791
795
|
Tokens.BITCOIN.BTCLN, //Swap from BTC-LN
|
|
792
796
|
Tokens.SOLANA.SOL, //Into specified destination token
|
|
793
797
|
10000n, //Amount can be either passed in base units as bigint or in decimal format as string
|
|
@@ -911,7 +915,7 @@ await swap.execute(
|
|
|
911
915
|
Getting swap quote
|
|
912
916
|
|
|
913
917
|
```typescript
|
|
914
|
-
const swap = await swapper.swap(
|
|
918
|
+
const swap: FromBTCLNAutoSwap<StarknetChainType> = await swapper.swap(
|
|
915
919
|
Tokens.BITCOIN.BTCLN, //Swap from BTC-LN
|
|
916
920
|
Tokens.STARKNET.STRK, //Into specified destination token
|
|
917
921
|
10000n, //Amount can be either passed in base units as bigint or in decimal format as string
|
|
@@ -1069,7 +1073,7 @@ Getting swap quote
|
|
|
1069
1073
|
|
|
1070
1074
|
```typescript
|
|
1071
1075
|
//Create the swap: swapping SOL to Bitcoin lightning
|
|
1072
|
-
const swap = await swapper.swap(
|
|
1076
|
+
const swap: ToBTCLNSwap<SolanaChainType> = await swapper.swap(
|
|
1073
1077
|
Tokens.SOLANA.SOL, //From specified source token
|
|
1074
1078
|
Tokens.BITCOIN.BTCLN, //Swap to BTC-LN
|
|
1075
1079
|
10000n, //Now we can specify an amount for a lightning network payment!
|
|
@@ -1189,7 +1193,7 @@ NOTE: Solana uses an old swap protocol for Bitcoin lightning network -> Solana s
|
|
|
1189
1193
|
Getting swap quote
|
|
1190
1194
|
|
|
1191
1195
|
```typescript
|
|
1192
|
-
const swap = await swapper.swap(
|
|
1196
|
+
const swap: FromBTCLNSwap<SolanaChainType> = await swapper.swap(
|
|
1193
1197
|
Tokens.BITCOIN.BTCLN, //Swap from BTC-LN
|
|
1194
1198
|
Tokens.SOLANA.SOL, //Into specified destination token
|
|
1195
1199
|
10000n,
|
|
@@ -1276,7 +1280,7 @@ await swap.execute(
|
|
|
1276
1280
|
Getting swap quote
|
|
1277
1281
|
|
|
1278
1282
|
```typescript
|
|
1279
|
-
const swap = await swapper.swap(
|
|
1283
|
+
const swap: FromBTCLNAutoSwap<StarknetChainType> = await swapper.swap(
|
|
1280
1284
|
Tokens.BITCOIN.BTCLN, //Swap from BTC-LN
|
|
1281
1285
|
Tokens.STARKNET.STRK, //Into specified destination token
|
|
1282
1286
|
10000n,
|
|
@@ -1378,7 +1382,7 @@ Getting swap quote
|
|
|
1378
1382
|
|
|
1379
1383
|
```typescript
|
|
1380
1384
|
//Create the swap: swapping SOL to Bitcoin lightning
|
|
1381
|
-
const swap = await swapper.swap(
|
|
1385
|
+
const swap: ToBTCLNSwap<SolanaChainType> = await swapper.swap(
|
|
1382
1386
|
Tokens.SOLANA.SOL, //From specified source token
|
|
1383
1387
|
Tokens.BITCOIN.BTCLN, //Swap to BTC-LN
|
|
1384
1388
|
1_000_000_000n, //We can specify an amount for a lightning network payment!
|
|
@@ -1571,7 +1575,19 @@ const swapId = swap.getId();
|
|
|
1571
1575
|
And then later retrieve it from the storage
|
|
1572
1576
|
|
|
1573
1577
|
```typescript
|
|
1574
|
-
|
|
1578
|
+
import {isSwapType} from "@atomiqlabs/sdk";
|
|
1579
|
+
|
|
1580
|
+
//Use this to obtain a correctly typed swap, returns `undefined` if the type of the
|
|
1581
|
+
// underlying swap is not as requested, `swapType` uses the SwapType enum
|
|
1582
|
+
const typedSwap = await swapper.getTypedSwapById(swapId, chainId, swapType);
|
|
1583
|
+
|
|
1584
|
+
//This returns just a base type `ISwap`, so you have to do typecasting yourself, useful
|
|
1585
|
+
// if you don't know which type of the swap to expect
|
|
1586
|
+
const swap = await swapper.getSwapById(swapId);
|
|
1587
|
+
//You can later narrow this down with the `isSwapType()` typeguard
|
|
1588
|
+
if(isSwapType(swap, swapType)) {
|
|
1589
|
+
//You now have a properly narrowed down type of the swap here
|
|
1590
|
+
}
|
|
1575
1591
|
```
|
|
1576
1592
|
|
|
1577
1593
|
#### Get refundable swaps
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset definitions for supported smart chain tokens with pricing information
|
|
3
|
+
* @category Tokens
|
|
4
|
+
*/
|
|
1
5
|
export declare const SmartChainAssets: {
|
|
2
6
|
readonly _TESTNET_WBTC_VESU: {
|
|
3
7
|
readonly pricing: {
|
|
@@ -31,11 +35,11 @@ export declare const SmartChainAssets: {
|
|
|
31
35
|
};
|
|
32
36
|
readonly TBTC: {
|
|
33
37
|
readonly pricing: {
|
|
34
|
-
readonly binancePair:
|
|
35
|
-
readonly okxPair:
|
|
38
|
+
readonly binancePair: undefined;
|
|
39
|
+
readonly okxPair: undefined;
|
|
36
40
|
readonly coinGeckoCoinId: "tbtc";
|
|
37
41
|
readonly coinPaprikaCoinId: "tbtc-tbtc";
|
|
38
|
-
readonly krakenPair:
|
|
42
|
+
readonly krakenPair: undefined;
|
|
39
43
|
};
|
|
40
44
|
readonly name: "Threshold BTC (tBTC)";
|
|
41
45
|
};
|
|
@@ -150,4 +154,8 @@ export declare const SmartChainAssets: {
|
|
|
150
154
|
readonly name: "pegBTC";
|
|
151
155
|
};
|
|
152
156
|
};
|
|
157
|
+
/**
|
|
158
|
+
* Type representing valid smart chain asset ticker symbols
|
|
159
|
+
* @category Tokens
|
|
160
|
+
*/
|
|
153
161
|
export type SmartChainAssetTickers = keyof typeof SmartChainAssets;
|
package/dist/SmartChainAssets.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SmartChainAssets = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Asset definitions for supported smart chain tokens with pricing information
|
|
6
|
+
* @category Tokens
|
|
7
|
+
*/
|
|
4
8
|
exports.SmartChainAssets = {
|
|
5
9
|
_TESTNET_WBTC_VESU: {
|
|
6
10
|
pricing: {
|
|
@@ -34,11 +38,11 @@ exports.SmartChainAssets = {
|
|
|
34
38
|
},
|
|
35
39
|
TBTC: {
|
|
36
40
|
pricing: {
|
|
37
|
-
binancePair:
|
|
38
|
-
okxPair:
|
|
41
|
+
binancePair: undefined,
|
|
42
|
+
okxPair: undefined,
|
|
39
43
|
coinGeckoCoinId: "tbtc",
|
|
40
44
|
coinPaprikaCoinId: "tbtc-tbtc",
|
|
41
|
-
krakenPair:
|
|
45
|
+
krakenPair: undefined
|
|
42
46
|
},
|
|
43
47
|
name: "Threshold BTC (tBTC)"
|
|
44
48
|
},
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { BitcoinRpc, BtcBlock, BtcTx } from "@atomiqlabs/base";
|
|
4
|
+
import { Buffer } from "buffer";
|
|
5
|
+
export type BtcTxWithBlockheight = BtcTx & {
|
|
6
|
+
blockheight?: number;
|
|
7
|
+
inputAddresses?: string[];
|
|
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
|
+
export interface BitcoinRpcWithAddressIndex<T extends BtcBlock> extends BitcoinRpc<T> {
|
|
19
|
+
getFeeRate(): Promise<number>;
|
|
20
|
+
getAddressBalances(address: string): Promise<{
|
|
21
|
+
confirmedBalance: bigint;
|
|
22
|
+
unconfirmedBalance: bigint;
|
|
23
|
+
}>;
|
|
24
|
+
getAddressUTXOs(address: string): Promise<BtcAddressUtxo[]>;
|
|
25
|
+
getCPFPData(txId: string): Promise<{
|
|
26
|
+
effectiveFeePerVsize: number;
|
|
27
|
+
adjustedVsize: number;
|
|
28
|
+
}>;
|
|
29
|
+
getTransaction(txId: string): Promise<BtcTxWithBlockheight | null>;
|
|
30
|
+
waitForTransaction(txId: string, requiredConfirmations: number, stateUpdateCbk: (btcTx?: BtcTxWithBlockheight, txEtaMS?: number) => void, abortSignal?: AbortSignal, intervalSeconds?: number): Promise<BtcTxWithBlockheight>;
|
|
31
|
+
/**
|
|
32
|
+
* Returns an estimate after which time the tx will confirm with the required amount of confirmations,
|
|
33
|
+
* confirmationDelay of -1 means the transaction won't confirm in the near future
|
|
34
|
+
*
|
|
35
|
+
* @param tx
|
|
36
|
+
* @param requiredConfirmations
|
|
37
|
+
* @private
|
|
38
|
+
*
|
|
39
|
+
* @returns estimated confirmation delay, -1 if the transaction won't confirm in the near future, null if the
|
|
40
|
+
* transaction was replaced or was confirmed in the meantime
|
|
41
|
+
*/
|
|
42
|
+
getConfirmationDelay(tx: BtcTx, requiredConfirmations: number): Promise<number | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Checks if an address received the transaction with the required txoHash, returns info about that
|
|
45
|
+
* specific transaction if found, or null if not found
|
|
46
|
+
*
|
|
47
|
+
* @param address Address that should receive the transaction
|
|
48
|
+
* @param txoHash Required output txoHash
|
|
49
|
+
*/
|
|
50
|
+
checkAddressTxos(address: string, txoHash: Buffer): Promise<{
|
|
51
|
+
tx: Omit<BtcTxWithBlockheight, "hex" | "raw">;
|
|
52
|
+
vout: number;
|
|
53
|
+
} | null>;
|
|
54
|
+
/**
|
|
55
|
+
* Waits till the address receives a transaction containing a specific txoHash
|
|
56
|
+
*
|
|
57
|
+
* @param address Address that should receive the transaction
|
|
58
|
+
* @param txoHash Required output txoHash
|
|
59
|
+
* @param requiredConfirmations Required confirmations of the transaction
|
|
60
|
+
* @param stateUpdateCbk Callback for transaction state updates
|
|
61
|
+
* @param abortSignal Abort signal
|
|
62
|
+
* @param intervalSeconds How often to check new transaction
|
|
63
|
+
*/
|
|
64
|
+
waitForAddressTxo(address: string, txoHash: Buffer, requiredConfirmations: number, stateUpdateCbk: (btcTx?: Omit<BtcTxWithBlockheight, "hex" | "raw">, vout?: number, txEtaMS?: number) => void, abortSignal?: AbortSignal, intervalSeconds?: number): Promise<{
|
|
65
|
+
tx: Omit<BtcTxWithBlockheight, "hex" | "raw">;
|
|
66
|
+
vout: number;
|
|
67
|
+
}>;
|
|
68
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type LNNodeLiquidity = {
|
|
2
|
+
publicKey: string;
|
|
3
|
+
capacity: bigint;
|
|
4
|
+
numChannels: number;
|
|
5
|
+
};
|
|
6
|
+
export interface LightningNetworkApi {
|
|
7
|
+
/**
|
|
8
|
+
* Returns the lightning network's node liquidity as identified by an identity public key
|
|
9
|
+
* @param pubkey
|
|
10
|
+
*/
|
|
11
|
+
getLNNodeLiquidity(pubkey: string): Promise<LNNodeLiquidity | null>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput } from "./utils";
|
|
2
|
+
export declare function accumulative(utxos: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, type: CoinselectAddressTypes, requiredInputs?: CoinselectTxInput[]): {
|
|
3
|
+
inputs?: CoinselectTxInput[];
|
|
4
|
+
outputs?: CoinselectTxOutput[];
|
|
5
|
+
fee: number;
|
|
6
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.accumulative = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
const Logger_1 = require("../../utils/Logger");
|
|
6
|
+
const logger = (0, Logger_1.getLogger)("CoinSelect: ");
|
|
7
|
+
// add inputs until we reach or surpass the target value (or deplete)
|
|
8
|
+
// worst-case: O(n)
|
|
9
|
+
function accumulative(utxos, outputs, feeRate, type, requiredInputs) {
|
|
10
|
+
if (!isFinite(utils_1.utils.uintOrNaN(feeRate)))
|
|
11
|
+
throw new Error("Invalid feeRate passed!");
|
|
12
|
+
const inputs = requiredInputs == null ? [] : [...requiredInputs];
|
|
13
|
+
let bytesAccum = utils_1.utils.transactionBytes(inputs, outputs, type);
|
|
14
|
+
let fee = feeRate * bytesAccum;
|
|
15
|
+
let cpfpAddFee = 0;
|
|
16
|
+
let inAccum = utils_1.utils.sumOrNaN(inputs);
|
|
17
|
+
const outAccum = utils_1.utils.sumOrNaN(outputs);
|
|
18
|
+
logger.debug("accumulative(): total output: ", outAccum);
|
|
19
|
+
for (let i = 0; i < utxos.length; ++i) {
|
|
20
|
+
const utxo = utxos[i];
|
|
21
|
+
const utxoBytes = utils_1.utils.inputBytes(utxo);
|
|
22
|
+
const utxoFee = feeRate * utxoBytes;
|
|
23
|
+
const utxoValue = utils_1.utils.uintOrNaN(utxo.value);
|
|
24
|
+
let cpfpFee = 0;
|
|
25
|
+
if (utxo.cpfp != null && utxo.cpfp.txEffectiveFeeRate < feeRate)
|
|
26
|
+
cpfpFee = Math.ceil(utxo.cpfp.txVsize * (feeRate - utxo.cpfp.txEffectiveFeeRate));
|
|
27
|
+
// skip detrimental input
|
|
28
|
+
if (utxoFee + cpfpFee > utxo.value) {
|
|
29
|
+
logger.debug("accumulative(" + i + "): Skipping detrimental output, cpfpFee: " + cpfpFee + " utxoFee: " + utxoFee + " value: " + utxo.value);
|
|
30
|
+
if (i === utxos.length - 1)
|
|
31
|
+
return { fee: (feeRate * (bytesAccum + utxoBytes)) + cpfpAddFee + cpfpFee };
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
bytesAccum += utxoBytes;
|
|
35
|
+
inAccum += utxoValue;
|
|
36
|
+
cpfpAddFee += cpfpFee;
|
|
37
|
+
inputs.push(utxo);
|
|
38
|
+
fee = Math.ceil((feeRate * bytesAccum) + cpfpAddFee);
|
|
39
|
+
logger.debug("accumulative(" + i + "): total fee: ", fee);
|
|
40
|
+
logger.debug("accumulative(" + i + "): input value: ", inAccum);
|
|
41
|
+
logger.debug("accumulative(" + i + "): cpfpAddFee: ", cpfpAddFee);
|
|
42
|
+
// go again?
|
|
43
|
+
if (inAccum < outAccum + fee)
|
|
44
|
+
continue;
|
|
45
|
+
logger.debug("accumulative(" + i + "): Finalizing transaction, inputs: ", inputs);
|
|
46
|
+
logger.debug("accumulative(" + i + "): Finalizing transaction, outputs: ", outputs);
|
|
47
|
+
logger.debug("accumulative(" + i + "): Finalizing transaction, feeRate: ", feeRate);
|
|
48
|
+
return utils_1.utils.finalize(inputs, outputs, feeRate, type, cpfpAddFee);
|
|
49
|
+
}
|
|
50
|
+
return { fee };
|
|
51
|
+
}
|
|
52
|
+
exports.accumulative = accumulative;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput } from "./utils";
|
|
2
|
+
export declare function blackjack(utxos: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, type: CoinselectAddressTypes, requiredInputs?: CoinselectTxInput[]): {
|
|
3
|
+
inputs?: CoinselectTxInput[];
|
|
4
|
+
outputs?: CoinselectTxOutput[];
|
|
5
|
+
fee: number;
|
|
6
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.blackjack = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
// add inputs until we reach or surpass the target value (or deplete)
|
|
6
|
+
// worst-case: O(n)
|
|
7
|
+
function blackjack(utxos, outputs, feeRate, type, requiredInputs) {
|
|
8
|
+
if (!isFinite(utils_1.utils.uintOrNaN(feeRate)))
|
|
9
|
+
throw new Error("Invalid feeRate passed!");
|
|
10
|
+
const inputs = requiredInputs == null ? [] : [...requiredInputs];
|
|
11
|
+
let bytesAccum = utils_1.utils.transactionBytes(inputs, outputs, type);
|
|
12
|
+
let inAccum = utils_1.utils.sumOrNaN(inputs);
|
|
13
|
+
let cpfpAddFee = 0;
|
|
14
|
+
const outAccum = utils_1.utils.sumOrNaN(outputs);
|
|
15
|
+
const threshold = utils_1.utils.dustThreshold({ type });
|
|
16
|
+
for (let i = 0; i < utxos.length; ++i) {
|
|
17
|
+
const input = utxos[i];
|
|
18
|
+
const inputBytes = utils_1.utils.inputBytes(input);
|
|
19
|
+
let cpfpFee = 0;
|
|
20
|
+
if (input.cpfp != null && input.cpfp.txEffectiveFeeRate < feeRate)
|
|
21
|
+
cpfpFee = Math.ceil(input.cpfp.txVsize * (feeRate - input.cpfp.txEffectiveFeeRate));
|
|
22
|
+
const fee = Math.ceil((feeRate * (bytesAccum + inputBytes)) + cpfpAddFee + cpfpFee);
|
|
23
|
+
const inputValue = utils_1.utils.uintOrNaN(input.value);
|
|
24
|
+
// would it waste value?
|
|
25
|
+
if ((inAccum + inputValue) > (outAccum + fee + threshold))
|
|
26
|
+
continue;
|
|
27
|
+
bytesAccum += inputBytes;
|
|
28
|
+
inAccum += inputValue;
|
|
29
|
+
cpfpAddFee += cpfpFee;
|
|
30
|
+
inputs.push(input);
|
|
31
|
+
// go again?
|
|
32
|
+
if (inAccum < outAccum + fee)
|
|
33
|
+
continue;
|
|
34
|
+
return utils_1.utils.finalize(inputs, outputs, feeRate, type, cpfpAddFee);
|
|
35
|
+
}
|
|
36
|
+
return { fee: (feeRate * bytesAccum) + cpfpAddFee };
|
|
37
|
+
}
|
|
38
|
+
exports.blackjack = blackjack;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, DUST_THRESHOLDS } from "./utils";
|
|
4
|
+
export { CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, DUST_THRESHOLDS };
|
|
5
|
+
export declare function coinSelect(utxos: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, type: CoinselectAddressTypes, requiredInputs?: CoinselectTxInput[]): {
|
|
6
|
+
inputs?: CoinselectTxInput[];
|
|
7
|
+
outputs?: CoinselectTxOutput[];
|
|
8
|
+
fee: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function maxSendable(utxos: CoinselectTxInput[], output: {
|
|
11
|
+
script: Buffer;
|
|
12
|
+
type: CoinselectAddressTypes;
|
|
13
|
+
}, feeRate: number, requiredInputs?: CoinselectTxInput[], additionalOutputs?: {
|
|
14
|
+
script: Buffer;
|
|
15
|
+
value: number;
|
|
16
|
+
}[]): {
|
|
17
|
+
value: number;
|
|
18
|
+
fee: number;
|
|
19
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.maxSendable = exports.coinSelect = exports.DUST_THRESHOLDS = void 0;
|
|
4
|
+
const accumulative_1 = require("./accumulative");
|
|
5
|
+
const blackjack_1 = require("./blackjack");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
Object.defineProperty(exports, "DUST_THRESHOLDS", { enumerable: true, get: function () { return utils_1.DUST_THRESHOLDS; } });
|
|
8
|
+
// order by descending value, minus the inputs approximate fee
|
|
9
|
+
function utxoScore(x, feeRate) {
|
|
10
|
+
let valueAfterFee = x.value - (feeRate * utils_1.utils.inputBytes(x));
|
|
11
|
+
if (x.cpfp != null && x.cpfp.txEffectiveFeeRate < feeRate)
|
|
12
|
+
valueAfterFee -= x.cpfp.txVsize * (feeRate - x.cpfp.txEffectiveFeeRate);
|
|
13
|
+
return valueAfterFee;
|
|
14
|
+
}
|
|
15
|
+
function coinSelect(utxos, outputs, feeRate, type, requiredInputs) {
|
|
16
|
+
// order by descending value, minus the inputs approximate fee
|
|
17
|
+
utxos = utxos.sort((a, b) => {
|
|
18
|
+
// if(a.cpfp!=null && b.cpfp==null) return 1;
|
|
19
|
+
// if(a.cpfp==null && b.cpfp!=null) return -1;
|
|
20
|
+
return utxoScore(b, feeRate) - utxoScore(a, feeRate);
|
|
21
|
+
});
|
|
22
|
+
// attempt to use the blackjack strategy first (no change output)
|
|
23
|
+
const base = (0, blackjack_1.blackjack)(utxos, outputs, feeRate, type, requiredInputs);
|
|
24
|
+
if (base.inputs)
|
|
25
|
+
return base;
|
|
26
|
+
// else, try the accumulative strategy
|
|
27
|
+
return (0, accumulative_1.accumulative)(utxos, outputs, feeRate, type, requiredInputs);
|
|
28
|
+
}
|
|
29
|
+
exports.coinSelect = coinSelect;
|
|
30
|
+
function maxSendable(utxos, output, feeRate, requiredInputs, additionalOutputs) {
|
|
31
|
+
if (!isFinite(utils_1.utils.uintOrNaN(feeRate)))
|
|
32
|
+
throw new Error("Invalid feeRate passed!");
|
|
33
|
+
const outputs = additionalOutputs ?? [];
|
|
34
|
+
const inputs = requiredInputs ?? [];
|
|
35
|
+
let bytesAccum = utils_1.utils.transactionBytes(inputs, outputs.concat([output]));
|
|
36
|
+
let cpfpAddFee = 0;
|
|
37
|
+
let inAccum = utils_1.utils.sumOrNaN(inputs);
|
|
38
|
+
let outAccum = utils_1.utils.sumOrNaN(outputs);
|
|
39
|
+
for (let i = 0; i < utxos.length; ++i) {
|
|
40
|
+
const utxo = utxos[i];
|
|
41
|
+
const utxoBytes = utils_1.utils.inputBytes(utxo);
|
|
42
|
+
const utxoFee = feeRate * utxoBytes;
|
|
43
|
+
let cpfpFee = 0;
|
|
44
|
+
if (utxo.cpfp != null && utxo.cpfp.txEffectiveFeeRate < feeRate)
|
|
45
|
+
cpfpFee = utxo.cpfp.txVsize * (feeRate - utxo.cpfp.txEffectiveFeeRate);
|
|
46
|
+
const utxoValue = utils_1.utils.uintOrNaN(utxo.value);
|
|
47
|
+
// skip detrimental input
|
|
48
|
+
if (utxoFee + cpfpFee > utxo.value) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
bytesAccum += utxoBytes;
|
|
52
|
+
inAccum += utxoValue;
|
|
53
|
+
cpfpAddFee += cpfpFee;
|
|
54
|
+
inputs.push(utxo);
|
|
55
|
+
}
|
|
56
|
+
const fee = (feeRate * bytesAccum) + cpfpAddFee;
|
|
57
|
+
const outputValue = inAccum - fee - outAccum;
|
|
58
|
+
const dustThreshold = utils_1.DUST_THRESHOLDS[output.type];
|
|
59
|
+
if (outputValue < dustThreshold)
|
|
60
|
+
return {
|
|
61
|
+
fee,
|
|
62
|
+
value: 0
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
fee,
|
|
66
|
+
value: outputValue
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
exports.maxSendable = maxSendable;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
export type CoinselectAddressTypes = "p2sh-p2wpkh" | "p2wpkh" | "p2wsh" | "p2tr" | "p2pkh";
|
|
4
|
+
export type CoinselectTxInput = {
|
|
5
|
+
script?: Buffer;
|
|
6
|
+
txId: string;
|
|
7
|
+
vout: number;
|
|
8
|
+
type?: CoinselectAddressTypes;
|
|
9
|
+
value: number;
|
|
10
|
+
outputScript?: Buffer;
|
|
11
|
+
address?: string;
|
|
12
|
+
cpfp?: {
|
|
13
|
+
txVsize: number;
|
|
14
|
+
txEffectiveFeeRate: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export type CoinselectTxOutput = {
|
|
18
|
+
script?: Buffer;
|
|
19
|
+
address?: string;
|
|
20
|
+
type?: CoinselectAddressTypes;
|
|
21
|
+
value: number;
|
|
22
|
+
};
|
|
23
|
+
declare function inputBytes(input: {
|
|
24
|
+
script?: Buffer;
|
|
25
|
+
type?: CoinselectAddressTypes;
|
|
26
|
+
}): number;
|
|
27
|
+
declare function outputBytes(output: {
|
|
28
|
+
script?: Buffer;
|
|
29
|
+
type?: CoinselectAddressTypes;
|
|
30
|
+
}): number;
|
|
31
|
+
export declare const DUST_THRESHOLDS: {
|
|
32
|
+
"p2sh-p2wpkh": number;
|
|
33
|
+
p2wpkh: number;
|
|
34
|
+
p2tr: number;
|
|
35
|
+
p2pkh: number;
|
|
36
|
+
p2wsh: number;
|
|
37
|
+
};
|
|
38
|
+
declare function dustThreshold(output: {
|
|
39
|
+
script?: Buffer;
|
|
40
|
+
type: CoinselectAddressTypes;
|
|
41
|
+
}): number;
|
|
42
|
+
declare function transactionBytes(inputs: {
|
|
43
|
+
script?: Buffer;
|
|
44
|
+
type?: CoinselectAddressTypes;
|
|
45
|
+
}[], outputs: {
|
|
46
|
+
script?: Buffer;
|
|
47
|
+
type?: CoinselectAddressTypes;
|
|
48
|
+
}[], changeType?: CoinselectAddressTypes): number;
|
|
49
|
+
declare function uintOrNaN(v: number): number;
|
|
50
|
+
declare function sumForgiving(range: {
|
|
51
|
+
value: number;
|
|
52
|
+
}[]): number;
|
|
53
|
+
declare function sumOrNaN(range: {
|
|
54
|
+
value: number;
|
|
55
|
+
}[]): number;
|
|
56
|
+
declare function finalize(inputs: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, changeType: CoinselectAddressTypes, cpfpAddFee?: number): {
|
|
57
|
+
inputs?: CoinselectTxInput[];
|
|
58
|
+
outputs?: CoinselectTxOutput[];
|
|
59
|
+
fee: number;
|
|
60
|
+
};
|
|
61
|
+
export declare const utils: {
|
|
62
|
+
dustThreshold: typeof dustThreshold;
|
|
63
|
+
finalize: typeof finalize;
|
|
64
|
+
inputBytes: typeof inputBytes;
|
|
65
|
+
outputBytes: typeof outputBytes;
|
|
66
|
+
sumOrNaN: typeof sumOrNaN;
|
|
67
|
+
sumForgiving: typeof sumForgiving;
|
|
68
|
+
transactionBytes: typeof transactionBytes;
|
|
69
|
+
uintOrNaN: typeof uintOrNaN;
|
|
70
|
+
};
|
|
71
|
+
export {};
|