@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,245 @@
|
|
|
1
|
+
import {IPriceProvider} from "./abstract/IPriceProvider";
|
|
2
|
+
import {BinancePriceProvider} from "./providers/BinancePriceProvider";
|
|
3
|
+
import {OKXPriceProvider} from "./providers/OKXPriceProvider";
|
|
4
|
+
import {CoinGeckoPriceProvider} from "./providers/CoinGeckoPriceProvider";
|
|
5
|
+
import {CoinPaprikaPriceProvider} from "./providers/CoinPaprikaPriceProvider";
|
|
6
|
+
import {promiseAny} from "../utils/Utils";
|
|
7
|
+
import {ICachedSwapPrice} from "./abstract/ICachedSwapPrice";
|
|
8
|
+
import {RequestError} from "../errors/RequestError";
|
|
9
|
+
import {ChainIds, MultiChain} from "../swapper/Swapper";
|
|
10
|
+
import {KrakenPriceProvider} from "./providers/KrakenPriceProvider";
|
|
11
|
+
import {getLogger} from "../utils/Logger";
|
|
12
|
+
import {tryWithRetries} from "../utils/RetryUtils";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Asset configuration for redundant swap pricing
|
|
16
|
+
* @category Pricing and LPs
|
|
17
|
+
*/
|
|
18
|
+
export type RedundantSwapPriceAssets<T extends MultiChain> = {
|
|
19
|
+
binancePair?: string,
|
|
20
|
+
okxPair?: string,
|
|
21
|
+
coinGeckoCoinId?: string,
|
|
22
|
+
coinPaprikaCoinId?: string,
|
|
23
|
+
krakenPair?: string,
|
|
24
|
+
chains: {
|
|
25
|
+
[chainIdentifier in keyof T]?: {
|
|
26
|
+
address: string,
|
|
27
|
+
decimals: number
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}[];
|
|
31
|
+
|
|
32
|
+
export type CtorCoinDecimals<T extends MultiChain> = {
|
|
33
|
+
chains: {
|
|
34
|
+
[chainIdentifier in keyof T]?: {
|
|
35
|
+
address: string,
|
|
36
|
+
decimals: number
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}[];
|
|
40
|
+
|
|
41
|
+
type CoinDecimals<T extends MultiChain> = {
|
|
42
|
+
[chainIdentifier in keyof T]?: {
|
|
43
|
+
[tokenAddress: string]: number
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const logger = getLogger("RedundantSwapPrice: ");
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Swap price API using multiple price sources, handles errors on the APIs and automatically switches between them, such
|
|
51
|
+
* that there always is a functional API
|
|
52
|
+
* @category Pricing and LPs
|
|
53
|
+
*/
|
|
54
|
+
export class RedundantSwapPrice<T extends MultiChain> extends ICachedSwapPrice<T> {
|
|
55
|
+
|
|
56
|
+
static createFromTokenMap<T extends MultiChain>(maxAllowedFeeDiffPPM: bigint, assets: RedundantSwapPriceAssets<T>, cacheTimeout?: number): RedundantSwapPrice<T> {
|
|
57
|
+
const priceApis = [
|
|
58
|
+
new BinancePriceProvider(assets.map(coinData => {
|
|
59
|
+
return {
|
|
60
|
+
coinId: coinData.binancePair,
|
|
61
|
+
chains: coinData.chains
|
|
62
|
+
};
|
|
63
|
+
})),
|
|
64
|
+
new OKXPriceProvider(assets.map(coinData => {
|
|
65
|
+
return {
|
|
66
|
+
coinId: coinData.okxPair,
|
|
67
|
+
chains: coinData.chains
|
|
68
|
+
};
|
|
69
|
+
})),
|
|
70
|
+
new CoinGeckoPriceProvider(assets.map(coinData => {
|
|
71
|
+
return {
|
|
72
|
+
coinId: coinData.coinGeckoCoinId,
|
|
73
|
+
chains: coinData.chains
|
|
74
|
+
};
|
|
75
|
+
})),
|
|
76
|
+
new CoinPaprikaPriceProvider(assets.map(coinData => {
|
|
77
|
+
return {
|
|
78
|
+
coinId: coinData.coinPaprikaCoinId,
|
|
79
|
+
chains: coinData.chains
|
|
80
|
+
};
|
|
81
|
+
})),
|
|
82
|
+
new KrakenPriceProvider(assets.map(coinData => {
|
|
83
|
+
return {
|
|
84
|
+
coinId: coinData.krakenPair,
|
|
85
|
+
chains: coinData.chains
|
|
86
|
+
};
|
|
87
|
+
}))
|
|
88
|
+
];
|
|
89
|
+
|
|
90
|
+
return new RedundantSwapPrice(maxAllowedFeeDiffPPM, assets, priceApis, cacheTimeout);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
coinsDecimals: CoinDecimals<T> = {};
|
|
94
|
+
priceApis: {
|
|
95
|
+
priceApi: IPriceProvider<T>,
|
|
96
|
+
operational?: boolean
|
|
97
|
+
}[];
|
|
98
|
+
|
|
99
|
+
constructor(maxAllowedFeeDiffPPM: bigint, coinsDecimals: CtorCoinDecimals<T>, priceApis: IPriceProvider<T>[], cacheTimeout?: number) {
|
|
100
|
+
super(maxAllowedFeeDiffPPM, cacheTimeout);
|
|
101
|
+
for(let coinData of coinsDecimals) {
|
|
102
|
+
for(let chainId in coinData.chains) {
|
|
103
|
+
const {address, decimals} = coinData.chains[chainId]!;
|
|
104
|
+
this.coinsDecimals[chainId] ??= {};
|
|
105
|
+
(this.coinsDecimals[chainId] as any)[address.toString()] = decimals;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
this.priceApis = priceApis.map(api => {
|
|
109
|
+
return {
|
|
110
|
+
priceApi: api
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Returns price api that should be operational
|
|
117
|
+
*
|
|
118
|
+
* @private
|
|
119
|
+
*/
|
|
120
|
+
private getOperationalPriceApi(): {priceApi: IPriceProvider<T>, operational?: boolean} | undefined {
|
|
121
|
+
return this.priceApis.find(e => e.operational===true);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Returns price apis that are maybe operational, in case none is considered operational returns all of the price
|
|
126
|
+
* apis such that they can be tested again whether they are operational
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
*/
|
|
130
|
+
private getMaybeOperationalPriceApis(): {priceApi: IPriceProvider<T>, operational?: boolean}[] {
|
|
131
|
+
let operational = this.priceApis.filter(e => e.operational===true || e.operational===undefined);
|
|
132
|
+
if(operational.length===0) {
|
|
133
|
+
this.priceApis.forEach(e => e.operational=undefined);
|
|
134
|
+
operational = this.priceApis;
|
|
135
|
+
}
|
|
136
|
+
return operational;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Fetches price in parallel from multiple maybe operational price APIs
|
|
141
|
+
*
|
|
142
|
+
* @param chainIdentifier
|
|
143
|
+
* @param token
|
|
144
|
+
* @param abortSignal
|
|
145
|
+
* @private
|
|
146
|
+
*/
|
|
147
|
+
private async fetchPriceFromMaybeOperationalPriceApis<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal) {
|
|
148
|
+
try {
|
|
149
|
+
return await promiseAny<bigint>(this.getMaybeOperationalPriceApis().map(
|
|
150
|
+
obj => (async () => {
|
|
151
|
+
try {
|
|
152
|
+
const price = await obj.priceApi.getPrice(chainIdentifier, token, abortSignal);
|
|
153
|
+
logger.debug("fetchPrice(): Price from "+obj.priceApi.constructor.name+": ", price.toString(10));
|
|
154
|
+
obj.operational = true;
|
|
155
|
+
return price;
|
|
156
|
+
} catch (e) {
|
|
157
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
158
|
+
obj.operational = false;
|
|
159
|
+
throw e;
|
|
160
|
+
}
|
|
161
|
+
})()
|
|
162
|
+
))
|
|
163
|
+
} catch (_e: any) {
|
|
164
|
+
const e = _e as any[];
|
|
165
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
166
|
+
throw e.find(err => !(err instanceof RequestError)) || e[0];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Fetches the prices, first tries to use the operational price API (if any) and if that fails it falls back
|
|
172
|
+
* to using maybe operational price APIs
|
|
173
|
+
*
|
|
174
|
+
* @param chainIdentifier
|
|
175
|
+
* @param token
|
|
176
|
+
* @param abortSignal
|
|
177
|
+
* @private
|
|
178
|
+
*/
|
|
179
|
+
protected fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint> {
|
|
180
|
+
return tryWithRetries(async () => {
|
|
181
|
+
const operationalPriceApi = this.getOperationalPriceApi();
|
|
182
|
+
if (operationalPriceApi != null) {
|
|
183
|
+
try {
|
|
184
|
+
return await operationalPriceApi.priceApi.getPrice(chainIdentifier, token, abortSignal);
|
|
185
|
+
} catch (err) {
|
|
186
|
+
if (abortSignal != null)
|
|
187
|
+
abortSignal.throwIfAborted();
|
|
188
|
+
operationalPriceApi.operational = false;
|
|
189
|
+
return await this.fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return await this.fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal);
|
|
193
|
+
}, undefined, RequestError, abortSignal);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
protected getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number | null {
|
|
197
|
+
if(this.coinsDecimals[chainIdentifier]==null) return null;
|
|
198
|
+
return this.coinsDecimals[chainIdentifier]?.[token.toString()] ?? null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Fetches BTC price in USD in parallel from multiple maybe operational price APIs
|
|
204
|
+
*
|
|
205
|
+
* @param abortSignal
|
|
206
|
+
* @private
|
|
207
|
+
*/
|
|
208
|
+
private async fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal?: AbortSignal): Promise<number> {
|
|
209
|
+
try {
|
|
210
|
+
return await promiseAny<number>(this.getMaybeOperationalPriceApis().map(
|
|
211
|
+
obj => (async () => {
|
|
212
|
+
try {
|
|
213
|
+
const price = await obj.priceApi.getUsdPrice(abortSignal);
|
|
214
|
+
logger.debug("fetchPrice(): USD price from "+obj.priceApi.constructor.name+": ", price.toString(10));
|
|
215
|
+
obj.operational = true;
|
|
216
|
+
return price;
|
|
217
|
+
} catch (e) {
|
|
218
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
219
|
+
obj.operational = false;
|
|
220
|
+
throw e;
|
|
221
|
+
}
|
|
222
|
+
})()
|
|
223
|
+
))
|
|
224
|
+
} catch (_e: any) {
|
|
225
|
+
const e = _e as any[];
|
|
226
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
227
|
+
throw e.find(err => !(err instanceof RequestError)) || e[0];
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
protected fetchUsdPrice(abortSignal?: AbortSignal): Promise<number> {
|
|
232
|
+
return tryWithRetries(() => {
|
|
233
|
+
const operationalPriceApi = this.getOperationalPriceApi();
|
|
234
|
+
if(operationalPriceApi!=null) {
|
|
235
|
+
return operationalPriceApi.priceApi.getUsdPrice(abortSignal).catch(err => {
|
|
236
|
+
if(abortSignal!=null) abortSignal.throwIfAborted();
|
|
237
|
+
operationalPriceApi.operational = false;
|
|
238
|
+
return this.fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
return this.fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal);
|
|
242
|
+
}, undefined, RequestError, abortSignal);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {IPriceProvider} from "./abstract/IPriceProvider";
|
|
2
|
+
import {ICachedSwapPrice} from "./abstract/ICachedSwapPrice";
|
|
3
|
+
import {ChainIds, MultiChain} from "../swapper/Swapper";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Swap price API using single price source
|
|
7
|
+
* @category Pricing and LPs
|
|
8
|
+
*/
|
|
9
|
+
export class SingleSwapPrice<T extends MultiChain> extends ICachedSwapPrice<T> {
|
|
10
|
+
|
|
11
|
+
priceProvider: IPriceProvider<T>;
|
|
12
|
+
|
|
13
|
+
constructor(maxAllowedFeeDiffPPM: bigint, priceProvider: IPriceProvider<T>, cacheTimeout?: number) {
|
|
14
|
+
super(maxAllowedFeeDiffPPM, cacheTimeout);
|
|
15
|
+
this.priceProvider = priceProvider;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Fetch price in uSats (micro sats) for a given token against BTC
|
|
20
|
+
*
|
|
21
|
+
* @param chainIdentifier
|
|
22
|
+
* @param token
|
|
23
|
+
* @param abortSignal
|
|
24
|
+
* @protected
|
|
25
|
+
* @returns token price in uSats (micro sats)
|
|
26
|
+
*/
|
|
27
|
+
protected fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint> {
|
|
28
|
+
return this.priceProvider.getPrice(chainIdentifier, token, abortSignal);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
|
|
33
|
+
* token is not found
|
|
34
|
+
*
|
|
35
|
+
* @param chainIdentifier
|
|
36
|
+
* @param token
|
|
37
|
+
* @protected
|
|
38
|
+
*/
|
|
39
|
+
protected getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number | null {
|
|
40
|
+
return this.priceProvider.getDecimals(chainIdentifier, token.toString());
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
protected fetchUsdPrice(abortSignal?: AbortSignal): Promise<number> {
|
|
44
|
+
return this.priceProvider.getUsdPrice(abortSignal);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import {ISwapPrice} from "./abstract/ISwapPrice";
|
|
2
|
+
import {ChainIds, MultiChain} from "../swapper/Swapper";
|
|
3
|
+
|
|
4
|
+
import {Token} from "../types/Token";
|
|
5
|
+
import {PriceInfoType} from "../types/PriceInfoType";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Chain-specific wrapper for swap pricing
|
|
9
|
+
* @category Pricing and LPs
|
|
10
|
+
*/
|
|
11
|
+
export class SwapPriceWithChain<T extends MultiChain, ChainIdentifier extends ChainIds<T>> {
|
|
12
|
+
|
|
13
|
+
swapPrice: ISwapPrice<T>;
|
|
14
|
+
chainIdentifier: ChainIdentifier;
|
|
15
|
+
maxAllowedFeeDifferencePPM: bigint;
|
|
16
|
+
|
|
17
|
+
constructor(swapPrice: ISwapPrice<T>, chainIdentifier: ChainIdentifier) {
|
|
18
|
+
this.swapPrice = swapPrice;
|
|
19
|
+
this.chainIdentifier = chainIdentifier;
|
|
20
|
+
this.maxAllowedFeeDifferencePPM = swapPrice.maxAllowedFeeDifferencePPM;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Checks whether the swap amounts are valid given the current market rate for a given pair
|
|
25
|
+
*
|
|
26
|
+
* @param amountSats Amount of sats (BTC) to be received from the swap
|
|
27
|
+
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
28
|
+
* @param feePPM PPM fee rate as reported by the intermediary
|
|
29
|
+
* @param paidToken Amount of token to be paid to the swap
|
|
30
|
+
* @param token
|
|
31
|
+
* @param abortSignal
|
|
32
|
+
* @param preFetchedPrice Already pre-fetched price
|
|
33
|
+
*/
|
|
34
|
+
public async isValidAmountSend(
|
|
35
|
+
amountSats: bigint,
|
|
36
|
+
satsBaseFee: bigint,
|
|
37
|
+
feePPM: bigint,
|
|
38
|
+
paidToken: bigint,
|
|
39
|
+
token: string,
|
|
40
|
+
abortSignal?: AbortSignal,
|
|
41
|
+
preFetchedPrice?: bigint
|
|
42
|
+
): Promise<PriceInfoType> {
|
|
43
|
+
return this.swapPrice.isValidAmountSend<ChainIdentifier>(
|
|
44
|
+
this.chainIdentifier, amountSats, satsBaseFee, feePPM, paidToken, token, abortSignal, preFetchedPrice
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Checks whether the swap amounts are valid given the current market rate for a given pair
|
|
50
|
+
*
|
|
51
|
+
* @param amountSats Amount of sats (BTC) to be paid to the swap
|
|
52
|
+
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
53
|
+
* @param feePPM PPM fee rate as reported by the intermediary
|
|
54
|
+
* @param receiveToken Amount of token to be received from the swap
|
|
55
|
+
* @param token
|
|
56
|
+
* @param abortSignal
|
|
57
|
+
* @param preFetchedPrice Already pre-fetched price
|
|
58
|
+
*/
|
|
59
|
+
public async isValidAmountReceive(
|
|
60
|
+
amountSats: bigint,
|
|
61
|
+
satsBaseFee: bigint,
|
|
62
|
+
feePPM: bigint,
|
|
63
|
+
receiveToken: bigint,
|
|
64
|
+
token: string,
|
|
65
|
+
abortSignal?: AbortSignal,
|
|
66
|
+
preFetchedPrice?: bigint
|
|
67
|
+
): Promise<PriceInfoType> {
|
|
68
|
+
return this.swapPrice.isValidAmountReceive<ChainIdentifier>(
|
|
69
|
+
this.chainIdentifier, amountSats, satsBaseFee, feePPM, receiveToken, token, abortSignal, preFetchedPrice
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public preFetchPrice(token: string, abortSignal?: AbortSignal): Promise<bigint> {
|
|
74
|
+
return this.swapPrice.preFetchPrice<ChainIdentifier>(this.chainIdentifier, token, abortSignal);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public preFetchUsdPrice(abortSignal?: AbortSignal): Promise<number> {
|
|
78
|
+
return this.swapPrice.preFetchUsdPrice(abortSignal);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Returns amount of {toToken} that are equivalent to {fromAmount} satoshis
|
|
83
|
+
*
|
|
84
|
+
* @param fromAmount Amount of satoshis
|
|
85
|
+
* @param toToken Token
|
|
86
|
+
* @param abortSignal
|
|
87
|
+
* @param preFetchedPrice
|
|
88
|
+
* @throws {Error} when token is not found
|
|
89
|
+
*/
|
|
90
|
+
public async getFromBtcSwapAmount(
|
|
91
|
+
fromAmount: bigint,
|
|
92
|
+
toToken: string,
|
|
93
|
+
abortSignal?: AbortSignal,
|
|
94
|
+
preFetchedPrice?: bigint
|
|
95
|
+
): Promise<bigint> {
|
|
96
|
+
return this.swapPrice.getFromBtcSwapAmount<ChainIdentifier>(
|
|
97
|
+
this.chainIdentifier, fromAmount, toToken, abortSignal, preFetchedPrice
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Returns amount of satoshis that are equivalent to {fromAmount} of {fromToken}
|
|
103
|
+
*
|
|
104
|
+
* @param fromAmount Amount of the token
|
|
105
|
+
* @param fromToken Token
|
|
106
|
+
* @param abortSignal
|
|
107
|
+
* @param preFetchedPrice Pre-fetched swap price if available
|
|
108
|
+
* @throws {Error} when token is not found
|
|
109
|
+
*/
|
|
110
|
+
public async getToBtcSwapAmount(
|
|
111
|
+
fromAmount: bigint,
|
|
112
|
+
fromToken: string,
|
|
113
|
+
abortSignal?: AbortSignal,
|
|
114
|
+
preFetchedPrice?: bigint
|
|
115
|
+
): Promise<bigint> {
|
|
116
|
+
return this.swapPrice.getToBtcSwapAmount<ChainIdentifier>(
|
|
117
|
+
this.chainIdentifier, fromAmount, fromToken, abortSignal, preFetchedPrice
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Returns whether the token should be ignored and pricing for it not calculated
|
|
123
|
+
*
|
|
124
|
+
* @param tokenAddress
|
|
125
|
+
* @throws {Error} if token is not found
|
|
126
|
+
*/
|
|
127
|
+
public shouldIgnore(tokenAddress: string): boolean {
|
|
128
|
+
return this.swapPrice.shouldIgnore<ChainIdentifier>(this.chainIdentifier, tokenAddress);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public async getBtcUsdValue(
|
|
132
|
+
btcSats: bigint,
|
|
133
|
+
abortSignal?: AbortSignal,
|
|
134
|
+
preFetchedPrice?: number
|
|
135
|
+
): Promise<number> {
|
|
136
|
+
return this.swapPrice.getBtcUsdValue(btcSats, abortSignal, preFetchedPrice);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
public async getTokenUsdValue(
|
|
140
|
+
tokenAmount: bigint,
|
|
141
|
+
token: string,
|
|
142
|
+
abortSignal?: AbortSignal,
|
|
143
|
+
preFetchedPrice?: number
|
|
144
|
+
): Promise<number> {
|
|
145
|
+
return this.swapPrice.getTokenUsdValue(this.chainIdentifier, tokenAmount, token, abortSignal, preFetchedPrice);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
public getUsdValue(
|
|
149
|
+
amount: bigint,
|
|
150
|
+
token: Token<ChainIdentifier>,
|
|
151
|
+
abortSignal?: AbortSignal,
|
|
152
|
+
preFetchedUsdPrice?: number
|
|
153
|
+
): Promise<number> {
|
|
154
|
+
return this.swapPrice.getUsdValue(amount, token, abortSignal, preFetchedUsdPrice);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {ISwapPrice} from "./ISwapPrice";
|
|
2
|
+
import {ChainIds, MultiChain} from "../../swapper/Swapper";
|
|
3
|
+
|
|
4
|
+
const DEFAULT_CACHE_DURATION = 10000;
|
|
5
|
+
|
|
6
|
+
export abstract class ICachedSwapPrice<T extends MultiChain> extends ISwapPrice<T> {
|
|
7
|
+
|
|
8
|
+
cache: {
|
|
9
|
+
[chainIdentifier in keyof T]?: {
|
|
10
|
+
[tokenAddress: string]: {
|
|
11
|
+
price: Promise<bigint>,
|
|
12
|
+
expiry: number
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
} = {};
|
|
16
|
+
usdCache?: {
|
|
17
|
+
price: Promise<number>,
|
|
18
|
+
expiry: number
|
|
19
|
+
};
|
|
20
|
+
cacheTimeout: number;
|
|
21
|
+
|
|
22
|
+
protected constructor(maxAllowedFeeDiffPPM: bigint, cacheTimeout?: number) {
|
|
23
|
+
super(maxAllowedFeeDiffPPM);
|
|
24
|
+
this.cacheTimeout = cacheTimeout || DEFAULT_CACHE_DURATION;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected abstract fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint>;
|
|
28
|
+
protected abstract fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
|
|
29
|
+
|
|
30
|
+
protected getPrice<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string, abortSignal?: AbortSignal): Promise<bigint> {
|
|
31
|
+
const token = tokenAddress.toString();
|
|
32
|
+
|
|
33
|
+
const chainCache = this.cache[chainIdentifier];
|
|
34
|
+
if(chainCache!=null) {
|
|
35
|
+
const cachedValue = chainCache[token];
|
|
36
|
+
if(cachedValue!=null && cachedValue.expiry>Date.now()) {
|
|
37
|
+
//Cache still fresh
|
|
38
|
+
return cachedValue.price.catch(e => this.fetchPrice(chainIdentifier, token, abortSignal));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//Refresh cache
|
|
43
|
+
const thisFetch = this.fetchPrice(chainIdentifier, token);
|
|
44
|
+
this.cache[chainIdentifier] ??= {};
|
|
45
|
+
(this.cache[chainIdentifier] as any)[token] = {
|
|
46
|
+
price: thisFetch,
|
|
47
|
+
expiry: Date.now()+this.cacheTimeout
|
|
48
|
+
};
|
|
49
|
+
thisFetch.catch(e => {
|
|
50
|
+
if(
|
|
51
|
+
this.cache?.[chainIdentifier]?.[token].price===thisFetch
|
|
52
|
+
) delete this.cache[token];
|
|
53
|
+
throw e;
|
|
54
|
+
});
|
|
55
|
+
return thisFetch;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Returns BTC price in USD (sats/USD)
|
|
60
|
+
*
|
|
61
|
+
* @param abortSignal
|
|
62
|
+
* @throws {Error} if token is not found
|
|
63
|
+
*/
|
|
64
|
+
protected getUsdPrice(abortSignal?: AbortSignal): Promise<number> {
|
|
65
|
+
if(this.usdCache!=null && this.usdCache.expiry>Date.now()) {
|
|
66
|
+
//Cache still fresh
|
|
67
|
+
return this.usdCache.price.catch(e => this.fetchUsdPrice(abortSignal));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
//Refresh cache
|
|
71
|
+
const thisFetch = this.fetchUsdPrice();
|
|
72
|
+
this.usdCache = {
|
|
73
|
+
price: thisFetch,
|
|
74
|
+
expiry: Date.now()+this.cacheTimeout
|
|
75
|
+
};
|
|
76
|
+
thisFetch.catch(e => {
|
|
77
|
+
if(
|
|
78
|
+
this.usdCache!=null &&
|
|
79
|
+
this.usdCache.price===thisFetch
|
|
80
|
+
) delete this.usdCache;
|
|
81
|
+
throw e;
|
|
82
|
+
});
|
|
83
|
+
return thisFetch;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {ChainIds, MultiChain} from "../../swapper/Swapper";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Coin type definition for price providers
|
|
5
|
+
* @category Pricing and LPs
|
|
6
|
+
*/
|
|
7
|
+
export type CoinType = {
|
|
8
|
+
coinId: string;
|
|
9
|
+
decimals: number;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Constructor coin types for price providers
|
|
14
|
+
* @category Pricing and LPs
|
|
15
|
+
*/
|
|
16
|
+
export type CtorCoinTypes<T extends MultiChain> = {
|
|
17
|
+
coinId?: string,
|
|
18
|
+
chains: {
|
|
19
|
+
[chainId in keyof T]?: {
|
|
20
|
+
address: string,
|
|
21
|
+
decimals: number,
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}[]
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Coin types mapping by chain
|
|
28
|
+
* @category Pricing and LPs
|
|
29
|
+
*/
|
|
30
|
+
export type CoinTypes<T extends MultiChain> = {
|
|
31
|
+
[chainId in keyof T]?: {
|
|
32
|
+
[address: string]: CoinType
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Abstract base class for price provider implementations
|
|
38
|
+
* @category Pricing and LPs
|
|
39
|
+
*/
|
|
40
|
+
export abstract class IPriceProvider<T extends MultiChain> {
|
|
41
|
+
|
|
42
|
+
coinsMap: CoinTypes<T> = {};
|
|
43
|
+
|
|
44
|
+
protected constructor(coins: CtorCoinTypes<T>) {
|
|
45
|
+
for(let coinData of coins) {
|
|
46
|
+
if(coinData.coinId==null) continue;
|
|
47
|
+
for(let chainId in coinData.chains) {
|
|
48
|
+
const {address, decimals} = coinData.chains[chainId]!;
|
|
49
|
+
this.coinsMap[chainId] ??= {};
|
|
50
|
+
(this.coinsMap[chainId] as any)[address.toString()] = {
|
|
51
|
+
coinId: coinData.coinId,
|
|
52
|
+
decimals
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Fetches the price for a given token against BTC
|
|
60
|
+
*
|
|
61
|
+
* @param token
|
|
62
|
+
* @param abortSignal
|
|
63
|
+
* @protected
|
|
64
|
+
* @returns Price per token in uSats (micro sats)
|
|
65
|
+
*/
|
|
66
|
+
protected abstract fetchPrice(token: CoinType, abortSignal?: AbortSignal): Promise<bigint>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Fetches the USD price of BTC
|
|
70
|
+
*
|
|
71
|
+
* @param abortSignal
|
|
72
|
+
* @protected
|
|
73
|
+
*/
|
|
74
|
+
protected abstract fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Returns coin price in uSat (microSat)
|
|
78
|
+
*
|
|
79
|
+
* @param chainIdentifier
|
|
80
|
+
* @param token
|
|
81
|
+
* @param abortSignal
|
|
82
|
+
* @throws {Error} if token is not found
|
|
83
|
+
*/
|
|
84
|
+
getPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint> {
|
|
85
|
+
let tokenAddress: string = token.toString();
|
|
86
|
+
|
|
87
|
+
const chainTokens = this.coinsMap[chainIdentifier];
|
|
88
|
+
if(chainTokens==null) throw new Error("Chain not found");
|
|
89
|
+
const coin = chainTokens[tokenAddress];
|
|
90
|
+
if(coin==null) throw new Error("Token not found");
|
|
91
|
+
|
|
92
|
+
if(coin.coinId.startsWith("$fixed-")) {
|
|
93
|
+
const amt: number = parseFloat(coin.coinId.substring(7));
|
|
94
|
+
return Promise.resolve(BigInt(Math.floor(amt*1000000).toString(10)));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return this.fetchPrice(coin, abortSignal);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Returns coin price in uSat (microSat)
|
|
102
|
+
*
|
|
103
|
+
* @param abortSignal
|
|
104
|
+
* @throws {Error} if token is not found
|
|
105
|
+
*/
|
|
106
|
+
getUsdPrice(abortSignal?: AbortSignal): Promise<number> {
|
|
107
|
+
return this.fetchUsdPrice(abortSignal);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
|
|
112
|
+
* token is not found
|
|
113
|
+
*
|
|
114
|
+
* @param chainIdentifier
|
|
115
|
+
* @param token
|
|
116
|
+
* @protected
|
|
117
|
+
* @throws {Error} If token is not found
|
|
118
|
+
*/
|
|
119
|
+
getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number {
|
|
120
|
+
const chainTokens = this.coinsMap[chainIdentifier];
|
|
121
|
+
if(chainTokens==null) throw new Error("Chain not found");
|
|
122
|
+
const coin = chainTokens[token.toString()];
|
|
123
|
+
if(coin==null) throw new Error("Token not found");
|
|
124
|
+
|
|
125
|
+
return coin.coinId==="$ignore" ? -1 : coin.decimals;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
}
|