@atomiqlabs/sdk 7.0.12 → 8.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -29
- package/dist/SmartChainAssets.d.ts +11 -3
- package/dist/SmartChainAssets.js +7 -3
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
- package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
- package/dist/bitcoin/LightningNetworkApi.js +2 -0
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
- package/dist/bitcoin/coinselect2/accumulative.js +52 -0
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
- package/dist/bitcoin/coinselect2/blackjack.js +38 -0
- package/dist/bitcoin/coinselect2/index.d.ts +19 -0
- package/dist/bitcoin/coinselect2/index.js +69 -0
- package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
- package/dist/bitcoin/coinselect2/utils.js +123 -0
- package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
- package/dist/bitcoin/mempool/MempoolApi.js +311 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
- package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
- package/dist/enums/FeeType.d.ts +8 -0
- package/dist/enums/FeeType.js +12 -0
- package/dist/enums/SwapAmountType.d.ts +8 -0
- package/dist/enums/SwapAmountType.js +12 -0
- package/dist/enums/SwapDirection.d.ts +8 -0
- package/dist/enums/SwapDirection.js +12 -0
- package/dist/enums/SwapType.d.ts +14 -0
- package/dist/enums/SwapType.js +18 -0
- package/dist/errors/IntermediaryError.d.ts +9 -0
- package/dist/errors/IntermediaryError.js +26 -0
- package/dist/errors/PaymentAuthError.d.ts +11 -0
- package/dist/errors/PaymentAuthError.js +23 -0
- package/dist/errors/RequestError.d.ts +18 -0
- package/dist/errors/RequestError.js +46 -0
- package/dist/errors/UserError.d.ts +7 -0
- package/dist/errors/UserError.js +15 -0
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
- package/dist/events/UnifiedSwapEventListener.js +130 -0
- package/dist/http/HttpUtils.d.ts +27 -0
- package/dist/http/HttpUtils.js +91 -0
- package/dist/http/paramcoders/IParamReader.d.ts +8 -0
- package/dist/http/paramcoders/IParamReader.js +2 -0
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
- package/dist/http/paramcoders/ParamDecoder.js +132 -0
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
- package/dist/http/paramcoders/ParamEncoder.js +31 -0
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
- package/dist/http/paramcoders/SchemaVerifier.js +145 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
- package/dist/index.d.ts +82 -4
- package/dist/index.js +128 -4
- package/dist/intermediaries/Intermediary.d.ts +111 -0
- package/dist/intermediaries/Intermediary.js +115 -0
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
- package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
- package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
- package/dist/lnurl/LNURL.d.ts +102 -0
- package/dist/lnurl/LNURL.js +321 -0
- package/dist/prices/RedundantSwapPrice.d.ts +89 -0
- package/dist/prices/RedundantSwapPrice.js +202 -0
- package/dist/prices/SingleSwapPrice.d.ts +31 -0
- package/dist/prices/SingleSwapPrice.js +41 -0
- package/dist/prices/SwapPriceWithChain.d.ts +70 -0
- package/dist/prices/SwapPriceWithChain.js +91 -0
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
- package/dist/prices/abstract/IPriceProvider.js +74 -0
- package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
- package/dist/prices/abstract/ISwapPrice.js +219 -0
- package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
- package/dist/prices/providers/BinancePriceProvider.js +23 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
- package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
- package/dist/prices/providers/CustomPriceProvider.js +24 -0
- package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
- package/dist/prices/providers/KrakenPriceProvider.js +36 -0
- package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
- package/dist/prices/providers/OKXPriceProvider.js +23 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
- package/dist/storage/IUnifiedStorage.d.ts +73 -0
- package/dist/storage/IUnifiedStorage.js +2 -0
- package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
- package/dist/storage/UnifiedSwapStorage.js +83 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
- package/dist/swapper/Swapper.d.ts +533 -0
- package/dist/swapper/Swapper.js +1566 -0
- package/dist/swapper/SwapperFactory.d.ts +87 -0
- package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +37 -19
- package/dist/swapper/SwapperUtils.d.ts +153 -0
- package/dist/swapper/SwapperUtils.js +420 -0
- package/dist/swapper/SwapperWithChain.d.ts +214 -0
- package/dist/swapper/SwapperWithChain.js +315 -0
- package/dist/swapper/SwapperWithSigner.d.ts +178 -0
- package/dist/swapper/SwapperWithSigner.js +172 -0
- package/dist/swaps/IAddressSwap.d.ts +13 -0
- package/dist/swaps/IAddressSwap.js +13 -0
- package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
- package/dist/swaps/IBTCWalletSwap.js +17 -0
- package/dist/swaps/IClaimableSwap.d.ts +17 -0
- package/dist/swaps/IClaimableSwap.js +14 -0
- package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
- package/dist/swaps/IClaimableSwapWrapper.js +2 -0
- package/dist/swaps/IRefundableSwap.d.ts +17 -0
- package/dist/swaps/IRefundableSwap.js +13 -0
- package/dist/swaps/ISwap.d.ts +207 -0
- package/dist/swaps/ISwap.js +264 -0
- package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
- package/dist/swaps/ISwapWithGasDrop.js +11 -0
- package/dist/swaps/ISwapWrapper.d.ts +153 -0
- package/dist/swaps/ISwapWrapper.js +227 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
- package/dist/types/AmountData.d.ts +9 -0
- package/dist/types/AmountData.js +2 -0
- package/dist/types/CustomPriceFunction.d.ts +5 -0
- package/dist/types/CustomPriceFunction.js +2 -0
- package/dist/types/PriceInfoType.d.ts +28 -0
- package/dist/types/PriceInfoType.js +57 -0
- package/dist/types/SwapExecutionAction.d.ts +7 -0
- package/dist/types/SwapExecutionAction.js +2 -0
- package/dist/types/SwapWithSigner.d.ts +14 -0
- package/dist/types/SwapWithSigner.js +40 -0
- package/dist/types/Token.d.ts +53 -0
- package/dist/types/Token.js +58 -0
- package/dist/types/TokenAmount.d.ts +57 -0
- package/dist/types/TokenAmount.js +47 -0
- package/dist/types/fees/Fee.d.ts +49 -0
- package/dist/types/fees/Fee.js +2 -0
- package/dist/types/fees/FeeBreakdown.d.ts +10 -0
- package/dist/types/fees/FeeBreakdown.js +2 -0
- package/dist/types/fees/PercentagePPM.d.ts +15 -0
- package/dist/types/fees/PercentagePPM.js +17 -0
- package/dist/types/lnurl/LNURLPay.d.ts +54 -0
- package/dist/types/lnurl/LNURLPay.js +28 -0
- package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
- package/dist/types/lnurl/LNURLWithdraw.js +24 -0
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
- package/dist/utils/BitcoinUtils.d.ts +13 -0
- package/dist/utils/BitcoinUtils.js +98 -0
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
- package/dist/utils/BitcoinWalletUtils.js +14 -0
- package/dist/utils/Logger.d.ts +7 -0
- package/dist/utils/Logger.js +12 -0
- package/dist/utils/RetryUtils.d.ts +21 -0
- package/dist/utils/RetryUtils.js +66 -0
- package/dist/utils/SwapUtils.d.ts +31 -0
- package/dist/utils/SwapUtils.js +18 -0
- package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
- package/dist/utils/TimeoutUtils.js +55 -0
- package/dist/utils/TokenUtils.d.ts +11 -0
- package/dist/utils/TokenUtils.js +29 -0
- package/dist/utils/TypeUtils.d.ts +7 -0
- package/dist/utils/TypeUtils.js +2 -0
- package/dist/utils/Utils.d.ts +57 -0
- package/dist/utils/Utils.js +178 -0
- package/package.json +14 -6
- package/src/SmartChainAssets.ts +11 -3
- package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
- package/src/bitcoin/LightningNetworkApi.ts +16 -0
- package/src/bitcoin/coinselect2/accumulative.ts +68 -0
- package/src/bitcoin/coinselect2/blackjack.ts +49 -0
- package/src/bitcoin/coinselect2/index.ts +92 -0
- package/src/bitcoin/coinselect2/utils.ts +189 -0
- package/src/bitcoin/mempool/MempoolApi.ts +554 -0
- package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
- package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
- package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
- package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
- package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
- package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
- package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
- package/src/enums/FeeType.ts +9 -0
- package/src/enums/SwapAmountType.ts +9 -0
- package/src/enums/SwapDirection.ts +9 -0
- package/src/enums/SwapType.ts +15 -0
- package/src/errors/IntermediaryError.ts +24 -0
- package/src/errors/PaymentAuthError.ts +26 -0
- package/src/errors/RequestError.ts +51 -0
- package/src/errors/UserError.ts +14 -0
- package/src/events/UnifiedSwapEventListener.ts +171 -0
- package/src/http/HttpUtils.ts +92 -0
- package/src/http/paramcoders/IParamReader.ts +10 -0
- package/src/http/paramcoders/ParamDecoder.ts +142 -0
- package/src/http/paramcoders/ParamEncoder.ts +37 -0
- package/src/http/paramcoders/SchemaVerifier.ts +153 -0
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
- package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
- package/src/index.ts +102 -4
- package/src/intermediaries/Intermediary.ts +204 -0
- package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
- package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
- package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
- package/src/lnurl/LNURL.ts +403 -0
- package/src/prices/RedundantSwapPrice.ts +245 -0
- package/src/prices/SingleSwapPrice.ts +47 -0
- package/src/prices/SwapPriceWithChain.ts +157 -0
- package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
- package/src/prices/abstract/IPriceProvider.ts +128 -0
- package/src/prices/abstract/ISwapPrice.ts +328 -0
- package/src/prices/providers/BinancePriceProvider.ts +41 -0
- package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
- package/src/prices/providers/CustomPriceProvider.ts +29 -0
- package/src/prices/providers/KrakenPriceProvider.ts +74 -0
- package/src/prices/providers/OKXPriceProvider.ts +53 -0
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
- package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
- package/src/storage/IUnifiedStorage.ts +83 -0
- package/src/storage/UnifiedSwapStorage.ts +104 -0
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
- package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
- package/src/swapper/Swapper.ts +2107 -0
- package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +113 -72
- package/src/swapper/SwapperUtils.ts +510 -0
- package/src/swapper/SwapperWithChain.ts +464 -0
- package/src/swapper/SwapperWithSigner.ts +300 -0
- package/src/swaps/IAddressSwap.ts +20 -0
- package/src/swaps/IBTCWalletSwap.ts +77 -0
- package/src/swaps/IClaimableSwap.ts +30 -0
- package/src/swaps/IClaimableSwapWrapper.ts +9 -0
- package/src/swaps/IRefundableSwap.ts +29 -0
- package/src/swaps/ISwap.ts +490 -0
- package/src/swaps/ISwapWithGasDrop.ts +19 -0
- package/src/swaps/ISwapWrapper.ts +344 -0
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
- package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
- package/src/types/AmountData.ts +9 -0
- package/src/types/CustomPriceFunction.ts +5 -0
- package/src/types/PriceInfoType.ts +67 -0
- package/src/types/SwapExecutionAction.ts +8 -0
- package/src/types/SwapWithSigner.ts +57 -0
- package/src/types/Token.ts +90 -0
- package/src/types/TokenAmount.ts +110 -0
- package/src/types/fees/Fee.ts +55 -0
- package/src/types/fees/FeeBreakdown.ts +11 -0
- package/src/types/fees/PercentagePPM.ts +24 -0
- package/src/types/lnurl/LNURLPay.ts +72 -0
- package/src/types/lnurl/LNURLWithdraw.ts +55 -0
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
- package/src/utils/BitcoinUtils.ts +86 -0
- package/src/utils/BitcoinWalletUtils.ts +16 -0
- package/src/utils/Logger.ts +15 -0
- package/src/utils/RetryUtils.ts +71 -0
- package/src/utils/SwapUtils.ts +38 -0
- package/src/utils/TimeoutUtils.ts +50 -0
- package/src/utils/TokenUtils.ts +25 -0
- package/src/utils/TypeUtils.ts +9 -0
- package/src/utils/Utils.ts +182 -0
- package/dist/SwapperFactory.d.ts +0 -52
- package/dist/Utils.js +0 -37
- package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
- package/dist/fs-storage/FileSystemStorageManager.js +0 -60
- package/dist/fs-storage/index.d.ts +0 -1
- package/dist/fs-storage/index.js +0 -17
- package/src/SmartChainAssets.js +0 -75
- package/src/SwapperFactory.js +0 -120
- package/src/Utils.js +0 -37
- package/src/Utils.ts +0 -31
- package/src/fs-storage/FileSystemStorageManager.ts +0 -71
- package/src/fs-storage/index.ts +0 -1
- package/src/index.js +0 -21
- package/src/storage/LocalStorageManager.js +0 -72
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LNURL = exports.isLNURLPaySuccessAction = void 0;
|
|
4
|
+
const RequestError_1 = require("../errors/RequestError");
|
|
5
|
+
const bolt11_1 = require("@atomiqlabs/bolt11");
|
|
6
|
+
const UserError_1 = require("../errors/UserError");
|
|
7
|
+
const base_1 = require("@scure/base");
|
|
8
|
+
const aes_1 = require("@noble/ciphers/aes");
|
|
9
|
+
const buffer_1 = require("buffer");
|
|
10
|
+
const sha2_1 = require("@noble/hashes/sha2");
|
|
11
|
+
const HttpUtils_1 = require("../http/HttpUtils");
|
|
12
|
+
const LNURLWithdraw_1 = require("../types/lnurl/LNURLWithdraw");
|
|
13
|
+
const LNURLPay_1 = require("../types/lnurl/LNURLPay");
|
|
14
|
+
const RetryUtils_1 = require("../utils/RetryUtils");
|
|
15
|
+
function isLNURLError(obj) {
|
|
16
|
+
return obj.status === "ERROR" &&
|
|
17
|
+
(obj.reason == null || typeof obj.reason === "string");
|
|
18
|
+
}
|
|
19
|
+
function isLNURLPayResult(obj, domain) {
|
|
20
|
+
return typeof obj.pr === "string" &&
|
|
21
|
+
(obj.routes == null || Array.isArray(obj.routes)) &&
|
|
22
|
+
(obj.disposable === null || obj.disposable === undefined || typeof obj.disposable === "boolean") &&
|
|
23
|
+
(obj.successAction == null || isLNURLPaySuccessAction(obj.successAction, domain));
|
|
24
|
+
}
|
|
25
|
+
function isLNURLPaySuccessAction(obj, domain) {
|
|
26
|
+
if (obj == null || typeof obj !== 'object' || typeof obj.tag !== 'string')
|
|
27
|
+
return false;
|
|
28
|
+
switch (obj.tag) {
|
|
29
|
+
case "message":
|
|
30
|
+
return obj.message != null && obj.message.length <= 144;
|
|
31
|
+
case "url":
|
|
32
|
+
return obj.description != null && obj.description.length <= 144 &&
|
|
33
|
+
obj.url != null &&
|
|
34
|
+
(domain == null || new URL(obj.url).hostname === domain);
|
|
35
|
+
case "aes":
|
|
36
|
+
return obj.description != null && obj.description.length <= 144 &&
|
|
37
|
+
obj.ciphertext != null && obj.ciphertext.length <= 4096 && BASE64_REGEX.test(obj.ciphertext) &&
|
|
38
|
+
obj.iv != null && obj.iv.length <= 24 && BASE64_REGEX.test(obj.iv);
|
|
39
|
+
default:
|
|
40
|
+
//Unsupported action
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.isLNURLPaySuccessAction = isLNURLPaySuccessAction;
|
|
45
|
+
const BASE64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
|
|
46
|
+
const MAIL_REGEX = /(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[A-z0-9](?:[A-z0-9-]*[A-z0-9])?\.)+[A-z0-9](?:[A-z0-9-]*[A-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[A-z0-9-]*[A-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
|
|
47
|
+
/**
|
|
48
|
+
* LNURL encoding/decoding and callback handling
|
|
49
|
+
* @category Bitcoin
|
|
50
|
+
*/
|
|
51
|
+
class LNURL {
|
|
52
|
+
static findBech32LNURL(str) {
|
|
53
|
+
const arr = /,*?((lnurl)([0-9]{1,}[a-z0-9]+){1})/.exec(str.toLowerCase());
|
|
54
|
+
if (arr == null)
|
|
55
|
+
return null;
|
|
56
|
+
return arr[1];
|
|
57
|
+
}
|
|
58
|
+
static isBech32LNURL(str) {
|
|
59
|
+
return this.findBech32LNURL(str) != null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Checks whether a provided string is bare (non bech32 encoded) lnurl
|
|
63
|
+
* @param str
|
|
64
|
+
* @private
|
|
65
|
+
*/
|
|
66
|
+
static isBareLNURL(str) {
|
|
67
|
+
try {
|
|
68
|
+
return str.startsWith("lnurlw://") || str.startsWith("lnurlp://");
|
|
69
|
+
}
|
|
70
|
+
catch (e) { }
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Checks if the provided string is a lightning network address (e.g. satoshi@nakamoto.com)
|
|
75
|
+
* @param str
|
|
76
|
+
* @private
|
|
77
|
+
*/
|
|
78
|
+
static isLightningAddress(str) {
|
|
79
|
+
return MAIL_REGEX.test(str);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Checks whether a given string is a LNURL or lightning address
|
|
83
|
+
* @param str
|
|
84
|
+
*/
|
|
85
|
+
static isLNURL(str) {
|
|
86
|
+
return LNURL.isBech32LNURL(str) || LNURL.isLightningAddress(str) || LNURL.isBareLNURL(str);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Extracts the URL that needs to be request from LNURL or lightning address
|
|
90
|
+
* @param str
|
|
91
|
+
* @private
|
|
92
|
+
* @returns An URL to send the request to, or null if it cannot be parsed
|
|
93
|
+
*/
|
|
94
|
+
static extractCallUrl(str) {
|
|
95
|
+
if (MAIL_REGEX.test(str)) {
|
|
96
|
+
//lightning e-mail like address
|
|
97
|
+
const arr = str.split("@");
|
|
98
|
+
const username = arr[0];
|
|
99
|
+
const domain = arr[1];
|
|
100
|
+
let scheme = "https";
|
|
101
|
+
if (domain.endsWith(".onion")) {
|
|
102
|
+
scheme = "http";
|
|
103
|
+
}
|
|
104
|
+
return scheme + "://" + domain + "/.well-known/lnurlp/" + username;
|
|
105
|
+
}
|
|
106
|
+
else if (LNURL.isBareLNURL(str)) {
|
|
107
|
+
//non-bech32m encoded lnurl
|
|
108
|
+
const data = str.substring("lnurlw://".length);
|
|
109
|
+
const httpUrl = new URL("http://" + data);
|
|
110
|
+
let scheme = "https";
|
|
111
|
+
if (httpUrl.hostname.endsWith(".onion")) {
|
|
112
|
+
scheme = "http";
|
|
113
|
+
}
|
|
114
|
+
return scheme + "://" + data;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const lnurl = LNURL.findBech32LNURL(str);
|
|
118
|
+
if (lnurl != null) {
|
|
119
|
+
let { prefix: hrp, words: dataPart } = base_1.bech32.decode(lnurl, 2000);
|
|
120
|
+
let requestByteArray = base_1.bech32.fromWords(dataPart);
|
|
121
|
+
return buffer_1.Buffer.from(requestByteArray).toString();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Sends a request to obtain data about a specific LNURL or lightning address
|
|
128
|
+
*
|
|
129
|
+
* @param str A lnurl or lightning address
|
|
130
|
+
* @param shouldRetry Whether we should retry in case of network failure
|
|
131
|
+
* @param timeout Request timeout in milliseconds
|
|
132
|
+
* @param abortSignal
|
|
133
|
+
*/
|
|
134
|
+
static async getLNURL(str, shouldRetry = true, timeout, abortSignal) {
|
|
135
|
+
if (shouldRetry == null)
|
|
136
|
+
shouldRetry = true;
|
|
137
|
+
const url = LNURL.extractCallUrl(str);
|
|
138
|
+
if (url == null)
|
|
139
|
+
return null;
|
|
140
|
+
const sendRequest = () => (0, HttpUtils_1.httpGet)(url, timeout, abortSignal, true);
|
|
141
|
+
let response = shouldRetry ?
|
|
142
|
+
await (0, RetryUtils_1.tryWithRetries)(sendRequest, undefined, RequestError_1.RequestError, abortSignal) :
|
|
143
|
+
await sendRequest();
|
|
144
|
+
if (isLNURLError(response))
|
|
145
|
+
return null;
|
|
146
|
+
if (response.tag === "payRequest")
|
|
147
|
+
try {
|
|
148
|
+
response.decodedMetadata = JSON.parse(response.metadata);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
response.decodedMetadata = [];
|
|
152
|
+
}
|
|
153
|
+
if (!(0, LNURLPay_1.isLNURLPayParams)(response) && !(0, LNURLWithdraw_1.isLNURLWithdrawParams)(response))
|
|
154
|
+
return null;
|
|
155
|
+
return {
|
|
156
|
+
...response,
|
|
157
|
+
url: str
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Sends a request to obtain data about a specific LNURL or lightning address
|
|
162
|
+
*
|
|
163
|
+
* @param str A lnurl or lightning address
|
|
164
|
+
* @param shouldRetry Whether we should retry in case of network failure
|
|
165
|
+
* @param timeout Request timeout in milliseconds
|
|
166
|
+
* @param abortSignal
|
|
167
|
+
*/
|
|
168
|
+
static async getLNURLType(str, shouldRetry, timeout, abortSignal) {
|
|
169
|
+
let res = await LNURL.getLNURL(str, shouldRetry, timeout, abortSignal);
|
|
170
|
+
if (res.tag === "payRequest") {
|
|
171
|
+
const payRequest = res;
|
|
172
|
+
let shortDescription = undefined;
|
|
173
|
+
let longDescription = undefined;
|
|
174
|
+
let icon = undefined;
|
|
175
|
+
payRequest.decodedMetadata.forEach(data => {
|
|
176
|
+
switch (data[0]) {
|
|
177
|
+
case "text/plain":
|
|
178
|
+
shortDescription = data[1];
|
|
179
|
+
break;
|
|
180
|
+
case "text/long-desc":
|
|
181
|
+
longDescription = data[1];
|
|
182
|
+
break;
|
|
183
|
+
case "image/png;base64":
|
|
184
|
+
icon = "data:" + data[0] + "," + data[1];
|
|
185
|
+
break;
|
|
186
|
+
case "image/jpeg;base64":
|
|
187
|
+
icon = "data:" + data[0] + "," + data[1];
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
type: "pay",
|
|
193
|
+
min: BigInt(payRequest.minSendable) / 1000n,
|
|
194
|
+
max: BigInt(payRequest.maxSendable) / 1000n,
|
|
195
|
+
commentMaxLength: payRequest.commentAllowed || 0,
|
|
196
|
+
shortDescription,
|
|
197
|
+
longDescription,
|
|
198
|
+
icon,
|
|
199
|
+
params: payRequest
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (res.tag === "withdrawRequest") {
|
|
203
|
+
const payRequest = res;
|
|
204
|
+
return {
|
|
205
|
+
type: "withdraw",
|
|
206
|
+
min: BigInt(payRequest.minWithdrawable) / 1000n,
|
|
207
|
+
max: BigInt(payRequest.maxWithdrawable) / 1000n,
|
|
208
|
+
params: payRequest
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Uses a LNURL-pay request by obtaining a lightning network invoice from it
|
|
215
|
+
*
|
|
216
|
+
* @param payRequest LNURL params as returned from the getLNURL call
|
|
217
|
+
* @param amount Amount of sats (BTC) to pay
|
|
218
|
+
* @param comment Optional comment for the payment request
|
|
219
|
+
* @param timeout Request timeout in milliseconds
|
|
220
|
+
* @param abortSignal
|
|
221
|
+
* @throws {RequestError} If the response is non-200, status: ERROR, or invalid format
|
|
222
|
+
*/
|
|
223
|
+
static async useLNURLPay(payRequest, amount, comment, timeout, abortSignal) {
|
|
224
|
+
const params = ["amount=" + (amount * 1000n).toString(10)];
|
|
225
|
+
if (comment != null) {
|
|
226
|
+
params.push("comment=" + encodeURIComponent(comment));
|
|
227
|
+
}
|
|
228
|
+
const queryParams = (payRequest.callback.includes("?") ? "&" : "?") + params.join("&");
|
|
229
|
+
const response = await (0, RetryUtils_1.tryWithRetries)(() => (0, HttpUtils_1.httpGet)(payRequest.callback + queryParams, timeout, abortSignal, true), undefined, RequestError_1.RequestError, abortSignal);
|
|
230
|
+
if (isLNURLError(response))
|
|
231
|
+
throw new RequestError_1.RequestError("LNURL callback error: " + response.reason, 200);
|
|
232
|
+
if (!isLNURLPayResult(response))
|
|
233
|
+
throw new RequestError_1.RequestError("Invalid LNURL response!", 200);
|
|
234
|
+
const parsedPR = (0, bolt11_1.decode)(response.pr);
|
|
235
|
+
const descHash = buffer_1.Buffer.from((0, sha2_1.sha256)(payRequest.metadata)).toString("hex");
|
|
236
|
+
if (parsedPR.tagsObject.purpose_commit_hash !== descHash)
|
|
237
|
+
throw new RequestError_1.RequestError("Invalid invoice received (description hash)!", 200);
|
|
238
|
+
const msats = parsedPR.millisatoshis;
|
|
239
|
+
if (msats == null)
|
|
240
|
+
throw new RequestError_1.RequestError("Invalid invoice received (amount msats not defined)", 200);
|
|
241
|
+
const invoiceMSats = BigInt(msats);
|
|
242
|
+
if (invoiceMSats !== (amount * 1000n))
|
|
243
|
+
throw new RequestError_1.RequestError("Invalid invoice received (amount)!", 200);
|
|
244
|
+
return {
|
|
245
|
+
invoice: response.pr,
|
|
246
|
+
parsedInvoice: parsedPR,
|
|
247
|
+
successAction: response.successAction ?? undefined
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Submits the bolt11 lightning invoice to the lnurl withdraw url
|
|
252
|
+
*
|
|
253
|
+
* @param withdrawRequest Withdraw request to use
|
|
254
|
+
* @param withdrawRequest.k1 K1 parameter
|
|
255
|
+
* @param withdrawRequest.callback A URL to call
|
|
256
|
+
* @param lnpr bolt11 lightning network invoice to submit to the withdrawal endpoint
|
|
257
|
+
* @throws {RequestError} If the response is non-200 or status: ERROR
|
|
258
|
+
*/
|
|
259
|
+
static async postInvoiceToLNURLWithdraw(withdrawRequest, lnpr) {
|
|
260
|
+
const params = [
|
|
261
|
+
"pr=" + lnpr,
|
|
262
|
+
"k1=" + withdrawRequest.k1
|
|
263
|
+
];
|
|
264
|
+
const queryParams = (withdrawRequest.callback.includes("?") ? "&" : "?") + params.join("&");
|
|
265
|
+
const response = await (0, RetryUtils_1.tryWithRetries)(() => (0, HttpUtils_1.httpGet)(withdrawRequest.callback + queryParams, undefined, undefined, true), undefined, RequestError_1.RequestError);
|
|
266
|
+
if (isLNURLError(response))
|
|
267
|
+
throw new RequestError_1.RequestError("LNURL callback error: " + response.reason, 200);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Uses a LNURL-withdraw request by submitting a lightning network invoice to it
|
|
271
|
+
*
|
|
272
|
+
* @param withdrawRequest Withdrawal request as returned from getLNURL call
|
|
273
|
+
* @param lnpr bolt11 lightning network invoice to submit to the withdrawal endpoint
|
|
274
|
+
* @throws {UserError} In case the provided bolt11 lightning invoice has an amount that is out of bounds for
|
|
275
|
+
* the specified LNURL-withdraw request
|
|
276
|
+
*/
|
|
277
|
+
static async useLNURLWithdraw(withdrawRequest, lnpr) {
|
|
278
|
+
const min = BigInt(withdrawRequest.minWithdrawable) / 1000n;
|
|
279
|
+
const max = BigInt(withdrawRequest.maxWithdrawable) / 1000n;
|
|
280
|
+
const parsedPR = (0, bolt11_1.decode)(lnpr);
|
|
281
|
+
const msats = parsedPR.millisatoshis;
|
|
282
|
+
if (msats == null)
|
|
283
|
+
throw new UserError_1.UserError("Invoice without msats value field!");
|
|
284
|
+
const amount = (BigInt(msats) + 999n) / 1000n;
|
|
285
|
+
if (amount < min)
|
|
286
|
+
throw new UserError_1.UserError("Invoice amount less than minimum LNURL-withdraw limit");
|
|
287
|
+
if (amount > max)
|
|
288
|
+
throw new UserError_1.UserError("Invoice amount more than maximum LNURL-withdraw limit");
|
|
289
|
+
return await LNURL.postInvoiceToLNURLWithdraw(withdrawRequest, lnpr);
|
|
290
|
+
}
|
|
291
|
+
static decodeSuccessAction(successAction, secret) {
|
|
292
|
+
if (secret == null)
|
|
293
|
+
return null;
|
|
294
|
+
if (successAction == null)
|
|
295
|
+
return null;
|
|
296
|
+
if (successAction.tag === "message" && successAction.message != null) {
|
|
297
|
+
return {
|
|
298
|
+
description: successAction.message
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
if (successAction.tag === "url" && successAction.description != null && successAction.url != null) {
|
|
302
|
+
return {
|
|
303
|
+
description: successAction.description,
|
|
304
|
+
url: successAction.url
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
if (successAction.tag === "aes" && successAction.iv != null && successAction.ciphertext != null && successAction.description != null) {
|
|
308
|
+
const CBC = (0, aes_1.cbc)(buffer_1.Buffer.from(secret, "hex"), buffer_1.Buffer.from(successAction.iv, "hex"));
|
|
309
|
+
let plaintext = CBC.decrypt(buffer_1.Buffer.from(successAction.ciphertext, "base64"));
|
|
310
|
+
// remove padding
|
|
311
|
+
const size = plaintext.length;
|
|
312
|
+
const pad = plaintext[size - 1];
|
|
313
|
+
return {
|
|
314
|
+
description: successAction.description,
|
|
315
|
+
text: buffer_1.Buffer.from(plaintext).toString("utf8", 0, size - pad)
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
exports.LNURL = LNURL;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { IPriceProvider } from "./abstract/IPriceProvider";
|
|
2
|
+
import { ICachedSwapPrice } from "./abstract/ICachedSwapPrice";
|
|
3
|
+
import { ChainIds, MultiChain } from "../swapper/Swapper";
|
|
4
|
+
/**
|
|
5
|
+
* Asset configuration for redundant swap pricing
|
|
6
|
+
* @category Pricing and LPs
|
|
7
|
+
*/
|
|
8
|
+
export type RedundantSwapPriceAssets<T extends MultiChain> = {
|
|
9
|
+
binancePair?: string;
|
|
10
|
+
okxPair?: string;
|
|
11
|
+
coinGeckoCoinId?: string;
|
|
12
|
+
coinPaprikaCoinId?: string;
|
|
13
|
+
krakenPair?: string;
|
|
14
|
+
chains: {
|
|
15
|
+
[chainIdentifier in keyof T]?: {
|
|
16
|
+
address: string;
|
|
17
|
+
decimals: number;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
}[];
|
|
21
|
+
export type CtorCoinDecimals<T extends MultiChain> = {
|
|
22
|
+
chains: {
|
|
23
|
+
[chainIdentifier in keyof T]?: {
|
|
24
|
+
address: string;
|
|
25
|
+
decimals: number;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
}[];
|
|
29
|
+
type CoinDecimals<T extends MultiChain> = {
|
|
30
|
+
[chainIdentifier in keyof T]?: {
|
|
31
|
+
[tokenAddress: string]: number;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Swap price API using multiple price sources, handles errors on the APIs and automatically switches between them, such
|
|
36
|
+
* that there always is a functional API
|
|
37
|
+
* @category Pricing and LPs
|
|
38
|
+
*/
|
|
39
|
+
export declare class RedundantSwapPrice<T extends MultiChain> extends ICachedSwapPrice<T> {
|
|
40
|
+
static createFromTokenMap<T extends MultiChain>(maxAllowedFeeDiffPPM: bigint, assets: RedundantSwapPriceAssets<T>, cacheTimeout?: number): RedundantSwapPrice<T>;
|
|
41
|
+
coinsDecimals: CoinDecimals<T>;
|
|
42
|
+
priceApis: {
|
|
43
|
+
priceApi: IPriceProvider<T>;
|
|
44
|
+
operational?: boolean;
|
|
45
|
+
}[];
|
|
46
|
+
constructor(maxAllowedFeeDiffPPM: bigint, coinsDecimals: CtorCoinDecimals<T>, priceApis: IPriceProvider<T>[], cacheTimeout?: number);
|
|
47
|
+
/**
|
|
48
|
+
* Returns price api that should be operational
|
|
49
|
+
*
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
52
|
+
private getOperationalPriceApi;
|
|
53
|
+
/**
|
|
54
|
+
* Returns price apis that are maybe operational, in case none is considered operational returns all of the price
|
|
55
|
+
* apis such that they can be tested again whether they are operational
|
|
56
|
+
*
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
private getMaybeOperationalPriceApis;
|
|
60
|
+
/**
|
|
61
|
+
* Fetches price in parallel from multiple maybe operational price APIs
|
|
62
|
+
*
|
|
63
|
+
* @param chainIdentifier
|
|
64
|
+
* @param token
|
|
65
|
+
* @param abortSignal
|
|
66
|
+
* @private
|
|
67
|
+
*/
|
|
68
|
+
private fetchPriceFromMaybeOperationalPriceApis;
|
|
69
|
+
/**
|
|
70
|
+
* Fetches the prices, first tries to use the operational price API (if any) and if that fails it falls back
|
|
71
|
+
* to using maybe operational price APIs
|
|
72
|
+
*
|
|
73
|
+
* @param chainIdentifier
|
|
74
|
+
* @param token
|
|
75
|
+
* @param abortSignal
|
|
76
|
+
* @private
|
|
77
|
+
*/
|
|
78
|
+
protected fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint>;
|
|
79
|
+
protected getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number | null;
|
|
80
|
+
/**
|
|
81
|
+
* Fetches BTC price in USD in parallel from multiple maybe operational price APIs
|
|
82
|
+
*
|
|
83
|
+
* @param abortSignal
|
|
84
|
+
* @private
|
|
85
|
+
*/
|
|
86
|
+
private fetchUsdPriceFromMaybeOperationalPriceApis;
|
|
87
|
+
protected fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
|
|
88
|
+
}
|
|
89
|
+
export {};
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedundantSwapPrice = void 0;
|
|
4
|
+
const BinancePriceProvider_1 = require("./providers/BinancePriceProvider");
|
|
5
|
+
const OKXPriceProvider_1 = require("./providers/OKXPriceProvider");
|
|
6
|
+
const CoinGeckoPriceProvider_1 = require("./providers/CoinGeckoPriceProvider");
|
|
7
|
+
const CoinPaprikaPriceProvider_1 = require("./providers/CoinPaprikaPriceProvider");
|
|
8
|
+
const Utils_1 = require("../utils/Utils");
|
|
9
|
+
const ICachedSwapPrice_1 = require("./abstract/ICachedSwapPrice");
|
|
10
|
+
const RequestError_1 = require("../errors/RequestError");
|
|
11
|
+
const KrakenPriceProvider_1 = require("./providers/KrakenPriceProvider");
|
|
12
|
+
const Logger_1 = require("../utils/Logger");
|
|
13
|
+
const RetryUtils_1 = require("../utils/RetryUtils");
|
|
14
|
+
const logger = (0, Logger_1.getLogger)("RedundantSwapPrice: ");
|
|
15
|
+
/**
|
|
16
|
+
* Swap price API using multiple price sources, handles errors on the APIs and automatically switches between them, such
|
|
17
|
+
* that there always is a functional API
|
|
18
|
+
* @category Pricing and LPs
|
|
19
|
+
*/
|
|
20
|
+
class RedundantSwapPrice extends ICachedSwapPrice_1.ICachedSwapPrice {
|
|
21
|
+
static createFromTokenMap(maxAllowedFeeDiffPPM, assets, cacheTimeout) {
|
|
22
|
+
const priceApis = [
|
|
23
|
+
new BinancePriceProvider_1.BinancePriceProvider(assets.map(coinData => {
|
|
24
|
+
return {
|
|
25
|
+
coinId: coinData.binancePair,
|
|
26
|
+
chains: coinData.chains
|
|
27
|
+
};
|
|
28
|
+
})),
|
|
29
|
+
new OKXPriceProvider_1.OKXPriceProvider(assets.map(coinData => {
|
|
30
|
+
return {
|
|
31
|
+
coinId: coinData.okxPair,
|
|
32
|
+
chains: coinData.chains
|
|
33
|
+
};
|
|
34
|
+
})),
|
|
35
|
+
new CoinGeckoPriceProvider_1.CoinGeckoPriceProvider(assets.map(coinData => {
|
|
36
|
+
return {
|
|
37
|
+
coinId: coinData.coinGeckoCoinId,
|
|
38
|
+
chains: coinData.chains
|
|
39
|
+
};
|
|
40
|
+
})),
|
|
41
|
+
new CoinPaprikaPriceProvider_1.CoinPaprikaPriceProvider(assets.map(coinData => {
|
|
42
|
+
return {
|
|
43
|
+
coinId: coinData.coinPaprikaCoinId,
|
|
44
|
+
chains: coinData.chains
|
|
45
|
+
};
|
|
46
|
+
})),
|
|
47
|
+
new KrakenPriceProvider_1.KrakenPriceProvider(assets.map(coinData => {
|
|
48
|
+
return {
|
|
49
|
+
coinId: coinData.krakenPair,
|
|
50
|
+
chains: coinData.chains
|
|
51
|
+
};
|
|
52
|
+
}))
|
|
53
|
+
];
|
|
54
|
+
return new RedundantSwapPrice(maxAllowedFeeDiffPPM, assets, priceApis, cacheTimeout);
|
|
55
|
+
}
|
|
56
|
+
constructor(maxAllowedFeeDiffPPM, coinsDecimals, priceApis, cacheTimeout) {
|
|
57
|
+
super(maxAllowedFeeDiffPPM, cacheTimeout);
|
|
58
|
+
this.coinsDecimals = {};
|
|
59
|
+
for (let coinData of coinsDecimals) {
|
|
60
|
+
for (let chainId in coinData.chains) {
|
|
61
|
+
const { address, decimals } = coinData.chains[chainId];
|
|
62
|
+
this.coinsDecimals[chainId] ??= {};
|
|
63
|
+
this.coinsDecimals[chainId][address.toString()] = decimals;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
this.priceApis = priceApis.map(api => {
|
|
67
|
+
return {
|
|
68
|
+
priceApi: api
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Returns price api that should be operational
|
|
74
|
+
*
|
|
75
|
+
* @private
|
|
76
|
+
*/
|
|
77
|
+
getOperationalPriceApi() {
|
|
78
|
+
return this.priceApis.find(e => e.operational === true);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Returns price apis that are maybe operational, in case none is considered operational returns all of the price
|
|
82
|
+
* apis such that they can be tested again whether they are operational
|
|
83
|
+
*
|
|
84
|
+
* @private
|
|
85
|
+
*/
|
|
86
|
+
getMaybeOperationalPriceApis() {
|
|
87
|
+
let operational = this.priceApis.filter(e => e.operational === true || e.operational === undefined);
|
|
88
|
+
if (operational.length === 0) {
|
|
89
|
+
this.priceApis.forEach(e => e.operational = undefined);
|
|
90
|
+
operational = this.priceApis;
|
|
91
|
+
}
|
|
92
|
+
return operational;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Fetches price in parallel from multiple maybe operational price APIs
|
|
96
|
+
*
|
|
97
|
+
* @param chainIdentifier
|
|
98
|
+
* @param token
|
|
99
|
+
* @param abortSignal
|
|
100
|
+
* @private
|
|
101
|
+
*/
|
|
102
|
+
async fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal) {
|
|
103
|
+
try {
|
|
104
|
+
return await (0, Utils_1.promiseAny)(this.getMaybeOperationalPriceApis().map(obj => (async () => {
|
|
105
|
+
try {
|
|
106
|
+
const price = await obj.priceApi.getPrice(chainIdentifier, token, abortSignal);
|
|
107
|
+
logger.debug("fetchPrice(): Price from " + obj.priceApi.constructor.name + ": ", price.toString(10));
|
|
108
|
+
obj.operational = true;
|
|
109
|
+
return price;
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
if (abortSignal != null)
|
|
113
|
+
abortSignal.throwIfAborted();
|
|
114
|
+
obj.operational = false;
|
|
115
|
+
throw e;
|
|
116
|
+
}
|
|
117
|
+
})()));
|
|
118
|
+
}
|
|
119
|
+
catch (_e) {
|
|
120
|
+
const e = _e;
|
|
121
|
+
if (abortSignal != null)
|
|
122
|
+
abortSignal.throwIfAborted();
|
|
123
|
+
throw e.find(err => !(err instanceof RequestError_1.RequestError)) || e[0];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Fetches the prices, first tries to use the operational price API (if any) and if that fails it falls back
|
|
128
|
+
* to using maybe operational price APIs
|
|
129
|
+
*
|
|
130
|
+
* @param chainIdentifier
|
|
131
|
+
* @param token
|
|
132
|
+
* @param abortSignal
|
|
133
|
+
* @private
|
|
134
|
+
*/
|
|
135
|
+
fetchPrice(chainIdentifier, token, abortSignal) {
|
|
136
|
+
return (0, RetryUtils_1.tryWithRetries)(async () => {
|
|
137
|
+
const operationalPriceApi = this.getOperationalPriceApi();
|
|
138
|
+
if (operationalPriceApi != null) {
|
|
139
|
+
try {
|
|
140
|
+
return await operationalPriceApi.priceApi.getPrice(chainIdentifier, token, abortSignal);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
if (abortSignal != null)
|
|
144
|
+
abortSignal.throwIfAborted();
|
|
145
|
+
operationalPriceApi.operational = false;
|
|
146
|
+
return await this.fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return await this.fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal);
|
|
150
|
+
}, undefined, RequestError_1.RequestError, abortSignal);
|
|
151
|
+
}
|
|
152
|
+
getDecimals(chainIdentifier, token) {
|
|
153
|
+
if (this.coinsDecimals[chainIdentifier] == null)
|
|
154
|
+
return null;
|
|
155
|
+
return this.coinsDecimals[chainIdentifier]?.[token.toString()] ?? null;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Fetches BTC price in USD in parallel from multiple maybe operational price APIs
|
|
159
|
+
*
|
|
160
|
+
* @param abortSignal
|
|
161
|
+
* @private
|
|
162
|
+
*/
|
|
163
|
+
async fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal) {
|
|
164
|
+
try {
|
|
165
|
+
return await (0, Utils_1.promiseAny)(this.getMaybeOperationalPriceApis().map(obj => (async () => {
|
|
166
|
+
try {
|
|
167
|
+
const price = await obj.priceApi.getUsdPrice(abortSignal);
|
|
168
|
+
logger.debug("fetchPrice(): USD price from " + obj.priceApi.constructor.name + ": ", price.toString(10));
|
|
169
|
+
obj.operational = true;
|
|
170
|
+
return price;
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
if (abortSignal != null)
|
|
174
|
+
abortSignal.throwIfAborted();
|
|
175
|
+
obj.operational = false;
|
|
176
|
+
throw e;
|
|
177
|
+
}
|
|
178
|
+
})()));
|
|
179
|
+
}
|
|
180
|
+
catch (_e) {
|
|
181
|
+
const e = _e;
|
|
182
|
+
if (abortSignal != null)
|
|
183
|
+
abortSignal.throwIfAborted();
|
|
184
|
+
throw e.find(err => !(err instanceof RequestError_1.RequestError)) || e[0];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
fetchUsdPrice(abortSignal) {
|
|
188
|
+
return (0, RetryUtils_1.tryWithRetries)(() => {
|
|
189
|
+
const operationalPriceApi = this.getOperationalPriceApi();
|
|
190
|
+
if (operationalPriceApi != null) {
|
|
191
|
+
return operationalPriceApi.priceApi.getUsdPrice(abortSignal).catch(err => {
|
|
192
|
+
if (abortSignal != null)
|
|
193
|
+
abortSignal.throwIfAborted();
|
|
194
|
+
operationalPriceApi.operational = false;
|
|
195
|
+
return this.fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return this.fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal);
|
|
199
|
+
}, undefined, RequestError_1.RequestError, abortSignal);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
exports.RedundantSwapPrice = RedundantSwapPrice;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { IPriceProvider } from "./abstract/IPriceProvider";
|
|
2
|
+
import { ICachedSwapPrice } from "./abstract/ICachedSwapPrice";
|
|
3
|
+
import { ChainIds, MultiChain } from "../swapper/Swapper";
|
|
4
|
+
/**
|
|
5
|
+
* Swap price API using single price source
|
|
6
|
+
* @category Pricing and LPs
|
|
7
|
+
*/
|
|
8
|
+
export declare class SingleSwapPrice<T extends MultiChain> extends ICachedSwapPrice<T> {
|
|
9
|
+
priceProvider: IPriceProvider<T>;
|
|
10
|
+
constructor(maxAllowedFeeDiffPPM: bigint, priceProvider: IPriceProvider<T>, cacheTimeout?: number);
|
|
11
|
+
/**
|
|
12
|
+
* Fetch price in uSats (micro sats) for a given token against BTC
|
|
13
|
+
*
|
|
14
|
+
* @param chainIdentifier
|
|
15
|
+
* @param token
|
|
16
|
+
* @param abortSignal
|
|
17
|
+
* @protected
|
|
18
|
+
* @returns token price in uSats (micro sats)
|
|
19
|
+
*/
|
|
20
|
+
protected fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint>;
|
|
21
|
+
/**
|
|
22
|
+
* Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
|
|
23
|
+
* token is not found
|
|
24
|
+
*
|
|
25
|
+
* @param chainIdentifier
|
|
26
|
+
* @param token
|
|
27
|
+
* @protected
|
|
28
|
+
*/
|
|
29
|
+
protected getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number | null;
|
|
30
|
+
protected fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SingleSwapPrice = void 0;
|
|
4
|
+
const ICachedSwapPrice_1 = require("./abstract/ICachedSwapPrice");
|
|
5
|
+
/**
|
|
6
|
+
* Swap price API using single price source
|
|
7
|
+
* @category Pricing and LPs
|
|
8
|
+
*/
|
|
9
|
+
class SingleSwapPrice extends ICachedSwapPrice_1.ICachedSwapPrice {
|
|
10
|
+
constructor(maxAllowedFeeDiffPPM, priceProvider, cacheTimeout) {
|
|
11
|
+
super(maxAllowedFeeDiffPPM, cacheTimeout);
|
|
12
|
+
this.priceProvider = priceProvider;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetch price in uSats (micro sats) for a given token against BTC
|
|
16
|
+
*
|
|
17
|
+
* @param chainIdentifier
|
|
18
|
+
* @param token
|
|
19
|
+
* @param abortSignal
|
|
20
|
+
* @protected
|
|
21
|
+
* @returns token price in uSats (micro sats)
|
|
22
|
+
*/
|
|
23
|
+
fetchPrice(chainIdentifier, token, abortSignal) {
|
|
24
|
+
return this.priceProvider.getPrice(chainIdentifier, token, abortSignal);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
|
|
28
|
+
* token is not found
|
|
29
|
+
*
|
|
30
|
+
* @param chainIdentifier
|
|
31
|
+
* @param token
|
|
32
|
+
* @protected
|
|
33
|
+
*/
|
|
34
|
+
getDecimals(chainIdentifier, token) {
|
|
35
|
+
return this.priceProvider.getDecimals(chainIdentifier, token.toString());
|
|
36
|
+
}
|
|
37
|
+
fetchUsdPrice(abortSignal) {
|
|
38
|
+
return this.priceProvider.getUsdPrice(abortSignal);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.SingleSwapPrice = SingleSwapPrice;
|