@atomiqlabs/sdk 8.8.3 → 8.8.4
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/LICENSE +201 -201
- package/README.md +1760 -1760
- package/dist/SmartChainAssets.d.ts +181 -181
- package/dist/SmartChainAssets.js +181 -181
- package/dist/bitcoin/coinselect2/accumulative.d.ts +7 -7
- package/dist/bitcoin/coinselect2/accumulative.js +52 -52
- package/dist/bitcoin/coinselect2/blackjack.d.ts +7 -7
- package/dist/bitcoin/coinselect2/blackjack.js +38 -38
- package/dist/bitcoin/coinselect2/index.d.ts +20 -20
- package/dist/bitcoin/coinselect2/index.js +69 -69
- package/dist/bitcoin/coinselect2/utils.d.ts +82 -82
- package/dist/bitcoin/coinselect2/utils.js +158 -158
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +113 -113
- package/dist/bitcoin/wallet/BitcoinWallet.js +335 -335
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +116 -116
- package/dist/bitcoin/wallet/IBitcoinWallet.js +21 -21
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +106 -106
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +196 -196
- package/dist/enums/FeeType.d.ts +15 -15
- package/dist/enums/FeeType.js +19 -19
- package/dist/enums/SwapAmountType.d.ts +15 -15
- package/dist/enums/SwapAmountType.js +19 -19
- package/dist/enums/SwapDirection.d.ts +15 -15
- package/dist/enums/SwapDirection.js +19 -19
- package/dist/enums/SwapSide.d.ts +15 -15
- package/dist/enums/SwapSide.js +19 -19
- package/dist/enums/SwapType.d.ts +75 -75
- package/dist/enums/SwapType.js +79 -79
- package/dist/errors/IntermediaryError.d.ts +13 -13
- package/dist/errors/IntermediaryError.js +27 -27
- package/dist/errors/RequestError.d.ts +32 -32
- package/dist/errors/RequestError.js +54 -54
- package/dist/errors/UserError.d.ts +8 -8
- package/dist/errors/UserError.js +16 -16
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -23
- package/dist/events/UnifiedSwapEventListener.js +132 -132
- package/dist/http/HttpUtils.d.ts +27 -27
- package/dist/http/HttpUtils.js +91 -91
- package/dist/http/paramcoders/IParamReader.d.ts +8 -8
- package/dist/http/paramcoders/IParamReader.js +2 -2
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -44
- package/dist/http/paramcoders/ParamDecoder.js +137 -137
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -20
- package/dist/http/paramcoders/ParamEncoder.js +36 -36
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -26
- package/dist/http/paramcoders/SchemaVerifier.js +145 -145
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -11
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -57
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -13
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -26
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -16
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -174
- package/dist/index.d.ts +85 -85
- package/dist/index.js +158 -158
- package/dist/intermediaries/Intermediary.d.ts +178 -178
- package/dist/intermediaries/Intermediary.js +166 -166
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +211 -211
- package/dist/intermediaries/IntermediaryDiscovery.js +424 -424
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +450 -450
- package/dist/intermediaries/apis/IntermediaryAPI.js +618 -618
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +155 -155
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +137 -137
- package/dist/lnurl/LNURL.d.ts +102 -102
- package/dist/lnurl/LNURL.js +321 -321
- package/dist/prices/RedundantSwapPrice.d.ts +110 -110
- package/dist/prices/RedundantSwapPrice.js +222 -222
- package/dist/prices/SingleSwapPrice.d.ts +34 -34
- package/dist/prices/SingleSwapPrice.js +44 -44
- package/dist/prices/SwapPriceWithChain.d.ts +107 -107
- package/dist/prices/SwapPriceWithChain.js +128 -128
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -28
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -62
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -81
- package/dist/prices/abstract/IPriceProvider.js +74 -74
- package/dist/prices/abstract/ISwapPrice.d.ts +168 -168
- package/dist/prices/abstract/ISwapPrice.js +279 -279
- package/dist/prices/providers/BinancePriceProvider.d.ts +23 -23
- package/dist/prices/providers/BinancePriceProvider.js +30 -30
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +23 -23
- package/dist/prices/providers/CoinGeckoPriceProvider.js +29 -29
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +25 -25
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +29 -29
- package/dist/prices/providers/CustomPriceProvider.d.ts +24 -24
- package/dist/prices/providers/CustomPriceProvider.js +35 -35
- package/dist/prices/providers/KrakenPriceProvider.d.ts +38 -38
- package/dist/prices/providers/KrakenPriceProvider.js +45 -45
- package/dist/prices/providers/OKXPriceProvider.d.ts +34 -34
- package/dist/prices/providers/OKXPriceProvider.js +29 -29
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +17 -17
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +21 -21
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -7
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -12
- package/dist/storage/IUnifiedStorage.d.ts +85 -85
- package/dist/storage/IUnifiedStorage.js +2 -2
- package/dist/storage/UnifiedSwapStorage.d.ts +114 -114
- package/dist/storage/UnifiedSwapStorage.js +116 -116
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +63 -63
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +298 -298
- package/dist/storage-browser/LocalStorageManager.d.ts +49 -49
- package/dist/storage-browser/LocalStorageManager.js +93 -93
- package/dist/swapper/Swapper.d.ts +732 -732
- package/dist/swapper/Swapper.js +1713 -1713
- package/dist/swapper/SwapperFactory.d.ts +135 -135
- package/dist/swapper/SwapperFactory.js +162 -162
- package/dist/swapper/SwapperUtils.d.ts +206 -206
- package/dist/swapper/SwapperUtils.js +481 -481
- package/dist/swapper/SwapperWithChain.d.ts +404 -404
- package/dist/swapper/SwapperWithChain.js +469 -469
- package/dist/swapper/SwapperWithSigner.d.ts +322 -322
- package/dist/swapper/SwapperWithSigner.js +318 -318
- package/dist/swaps/IAddressSwap.d.ts +22 -22
- package/dist/swaps/IAddressSwap.js +14 -14
- package/dist/swaps/IBTCWalletSwap.d.ts +73 -73
- package/dist/swaps/IBTCWalletSwap.js +18 -18
- package/dist/swaps/IClaimableSwap.d.ts +49 -49
- package/dist/swaps/IClaimableSwap.js +15 -15
- package/dist/swaps/IClaimableSwapWrapper.d.ts +15 -15
- package/dist/swaps/IClaimableSwapWrapper.js +2 -2
- package/dist/swaps/IRefundableSwap.d.ts +43 -43
- package/dist/swaps/IRefundableSwap.js +14 -14
- package/dist/swaps/ISwap.d.ts +392 -392
- package/dist/swaps/ISwap.js +349 -349
- package/dist/swaps/ISwapWithGasDrop.d.ts +21 -21
- package/dist/swaps/ISwapWithGasDrop.js +12 -12
- package/dist/swaps/ISwapWrapper.d.ts +285 -285
- package/dist/swaps/ISwapWrapper.js +353 -353
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +98 -98
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +126 -126
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +139 -139
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +170 -170
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +128 -128
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +167 -167
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +105 -105
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +129 -129
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +162 -162
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +190 -190
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +64 -64
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +82 -82
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +531 -531
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +1285 -1285
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +190 -190
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +432 -432
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +583 -583
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +1371 -1371
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +235 -235
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +525 -525
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +458 -458
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +1126 -1126
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +202 -202
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +406 -406
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +403 -403
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +924 -924
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +68 -68
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +117 -117
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +127 -127
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +256 -256
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +251 -251
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +536 -536
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +73 -73
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +155 -155
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +132 -132
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +286 -286
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +637 -637
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1448 -1448
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +257 -257
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +947 -947
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +261 -261
- package/dist/swaps/trusted/ln/LnForGasSwap.js +511 -511
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +40 -40
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +83 -83
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +342 -342
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +715 -715
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +69 -69
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +93 -93
- package/dist/types/AmountData.d.ts +10 -10
- package/dist/types/AmountData.js +2 -2
- package/dist/types/CustomPriceFunction.d.ts +11 -11
- package/dist/types/CustomPriceFunction.js +2 -2
- package/dist/types/PriceInfoType.d.ts +28 -28
- package/dist/types/PriceInfoType.js +57 -57
- package/dist/types/SwapExecutionAction.d.ts +88 -88
- package/dist/types/SwapExecutionAction.js +2 -2
- package/dist/types/SwapStateInfo.d.ts +5 -5
- package/dist/types/SwapStateInfo.js +2 -2
- package/dist/types/SwapWithSigner.d.ts +17 -17
- package/dist/types/SwapWithSigner.js +43 -43
- package/dist/types/Token.d.ts +99 -99
- package/dist/types/Token.js +76 -76
- package/dist/types/TokenAmount.d.ts +69 -69
- package/dist/types/TokenAmount.js +60 -60
- package/dist/types/fees/Fee.d.ts +50 -50
- package/dist/types/fees/Fee.js +2 -2
- package/dist/types/fees/FeeBreakdown.d.ts +11 -11
- package/dist/types/fees/FeeBreakdown.js +2 -2
- package/dist/types/fees/PercentagePPM.d.ts +17 -17
- package/dist/types/fees/PercentagePPM.js +18 -18
- package/dist/types/lnurl/LNURLPay.d.ts +61 -61
- package/dist/types/lnurl/LNURLPay.js +31 -31
- package/dist/types/lnurl/LNURLWithdraw.d.ts +48 -48
- package/dist/types/lnurl/LNURLWithdraw.js +27 -27
- package/dist/types/wallets/LightningInvoiceCreateService.d.ts +24 -24
- package/dist/types/wallets/LightningInvoiceCreateService.js +15 -15
- package/dist/types/wallets/MinimalBitcoinWalletInterface.d.ts +23 -23
- package/dist/types/wallets/MinimalBitcoinWalletInterface.js +2 -2
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.d.ts +9 -9
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.js +2 -2
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -1
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -70
- package/dist/utils/BitcoinUtils.d.ts +16 -16
- package/dist/utils/BitcoinUtils.js +141 -141
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -7
- package/dist/utils/BitcoinWalletUtils.js +14 -14
- package/dist/utils/Logger.d.ts +7 -7
- package/dist/utils/Logger.js +12 -12
- package/dist/utils/RetryUtils.d.ts +22 -22
- package/dist/utils/RetryUtils.js +67 -67
- package/dist/utils/SwapUtils.d.ts +88 -88
- package/dist/utils/SwapUtils.js +72 -72
- package/dist/utils/TimeoutUtils.d.ts +17 -17
- package/dist/utils/TimeoutUtils.js +55 -55
- package/dist/utils/TokenUtils.d.ts +19 -19
- package/dist/utils/TokenUtils.js +37 -37
- package/dist/utils/TypeUtils.d.ts +7 -7
- package/dist/utils/TypeUtils.js +2 -2
- package/dist/utils/Utils.d.ts +67 -67
- package/dist/utils/Utils.js +208 -208
- package/package.json +43 -43
- package/src/SmartChainAssets.ts +186 -186
- package/src/bitcoin/coinselect2/accumulative.ts +69 -69
- package/src/bitcoin/coinselect2/blackjack.ts +50 -50
- package/src/bitcoin/coinselect2/index.ts +93 -93
- package/src/bitcoin/coinselect2/utils.ts +236 -236
- package/src/bitcoin/wallet/BitcoinWallet.ts +439 -439
- package/src/bitcoin/wallet/IBitcoinWallet.ts +140 -140
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +225 -225
- package/src/enums/FeeType.ts +15 -15
- package/src/enums/SwapAmountType.ts +16 -16
- package/src/enums/SwapDirection.ts +15 -15
- package/src/enums/SwapSide.ts +16 -16
- package/src/enums/SwapType.ts +75 -75
- package/src/errors/IntermediaryError.ts +28 -28
- package/src/errors/RequestError.ts +64 -64
- package/src/errors/UserError.ts +15 -15
- package/src/events/UnifiedSwapEventListener.ts +173 -173
- package/src/http/HttpUtils.ts +91 -91
- package/src/http/paramcoders/IParamReader.ts +9 -9
- package/src/http/paramcoders/ParamDecoder.ts +145 -145
- package/src/http/paramcoders/ParamEncoder.ts +40 -40
- package/src/http/paramcoders/SchemaVerifier.ts +153 -153
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +57 -57
- package/src/http/paramcoders/client/StreamParamEncoder.ts +28 -28
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +192 -192
- package/src/index.ts +140 -140
- package/src/intermediaries/Intermediary.ts +280 -280
- package/src/intermediaries/IntermediaryDiscovery.ts +541 -541
- package/src/intermediaries/apis/IntermediaryAPI.ts +963 -963
- package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -257
- package/src/lnurl/LNURL.ts +402 -402
- package/src/prices/RedundantSwapPrice.ts +264 -264
- package/src/prices/SingleSwapPrice.ts +50 -50
- package/src/prices/SwapPriceWithChain.ts +194 -194
- package/src/prices/abstract/ICachedSwapPrice.ts +85 -85
- package/src/prices/abstract/IPriceProvider.ts +127 -127
- package/src/prices/abstract/ISwapPrice.ts +390 -390
- package/src/prices/providers/BinancePriceProvider.ts +48 -48
- package/src/prices/providers/CoinGeckoPriceProvider.ts +46 -46
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +49 -49
- package/src/prices/providers/CustomPriceProvider.ts +40 -40
- package/src/prices/providers/KrakenPriceProvider.ts +83 -83
- package/src/prices/providers/OKXPriceProvider.ts +59 -59
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +31 -31
- package/src/prices/providers/abstract/HttpPriceProvider.ts +14 -14
- package/src/storage/IUnifiedStorage.ts +95 -95
- package/src/storage/UnifiedSwapStorage.ts +141 -141
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +350 -350
- package/src/storage-browser/LocalStorageManager.ts +106 -106
- package/src/swapper/Swapper.ts +2488 -2488
- package/src/swapper/SwapperFactory.ts +307 -307
- package/src/swapper/SwapperUtils.ts +570 -570
- package/src/swapper/SwapperWithChain.ts +707 -707
- package/src/swapper/SwapperWithSigner.ts +511 -511
- package/src/swaps/IAddressSwap.ts +30 -30
- package/src/swaps/IBTCWalletSwap.ts +92 -92
- package/src/swaps/IClaimableSwap.ts +65 -65
- package/src/swaps/IClaimableSwapWrapper.ts +17 -17
- package/src/swaps/IRefundableSwap.ts +58 -58
- package/src/swaps/ISwap.ts +703 -703
- package/src/swaps/ISwapWithGasDrop.ts +25 -25
- package/src/swaps/ISwapWrapper.ts +539 -539
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +217 -217
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +269 -269
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +282 -282
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +169 -169
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +300 -300
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +107 -107
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1473 -1474
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +601 -601
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1582 -1582
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +750 -750
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +1299 -1299
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +610 -610
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +1096 -1096
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +138 -138
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +304 -304
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +786 -786
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +206 -206
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +401 -401
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1812 -1812
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +1236 -1236
- package/src/swaps/trusted/ln/LnForGasSwap.ts +589 -589
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +91 -91
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +862 -862
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +131 -131
- package/src/types/AmountData.ts +9 -9
- package/src/types/CustomPriceFunction.ts +11 -11
- package/src/types/PriceInfoType.ts +66 -66
- package/src/types/SwapExecutionAction.ts +99 -99
- package/src/types/SwapStateInfo.ts +6 -6
- package/src/types/SwapWithSigner.ts +61 -61
- package/src/types/Token.ts +163 -163
- package/src/types/TokenAmount.ts +132 -132
- package/src/types/fees/Fee.ts +56 -56
- package/src/types/fees/FeeBreakdown.ts +11 -11
- package/src/types/fees/PercentagePPM.ts +26 -26
- package/src/types/lnurl/LNURLPay.ts +79 -79
- package/src/types/lnurl/LNURLWithdraw.ts +61 -61
- package/src/types/wallets/LightningInvoiceCreateService.ts +30 -30
- package/src/types/wallets/MinimalBitcoinWalletInterface.ts +21 -21
- package/src/types/wallets/MinimalLightningNetworkWalletInterface.ts +9 -9
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -71
- package/src/utils/BitcoinUtils.ts +132 -132
- package/src/utils/BitcoinWalletUtils.ts +15 -15
- package/src/utils/Logger.ts +14 -14
- package/src/utils/RetryUtils.ts +78 -78
- package/src/utils/SwapUtils.ts +99 -99
- package/src/utils/TimeoutUtils.ts +49 -49
- package/src/utils/TokenUtils.ts +33 -33
- package/src/utils/TypeUtils.ts +8 -8
- package/src/utils/Utils.ts +212 -212
|
@@ -1,390 +1,390 @@
|
|
|
1
|
-
import {ChainIds, MultiChain} from "../../swapper/Swapper";
|
|
2
|
-
import {Token} from "../../types/Token";
|
|
3
|
-
import {PriceInfoType} from "../../types/PriceInfoType";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Abstract base class for swap pricing implementations
|
|
7
|
-
*
|
|
8
|
-
* @category Pricing
|
|
9
|
-
*/
|
|
10
|
-
export abstract class ISwapPrice<T extends MultiChain = MultiChain> {
|
|
11
|
-
|
|
12
|
-
maxAllowedFeeDifferencePPM: bigint;
|
|
13
|
-
|
|
14
|
-
protected constructor(maxAllowedFeeDifferencePPM: bigint) {
|
|
15
|
-
this.maxAllowedFeeDifferencePPM = maxAllowedFeeDifferencePPM;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Gets the decimal places for a given token, returns `-1` if token should be ignored & `null` if token is not found
|
|
20
|
-
*
|
|
21
|
-
* @param chainIdentifier Chain identifier of the smart chain
|
|
22
|
-
* @param tokenAddress Token address
|
|
23
|
-
* @protected
|
|
24
|
-
*/
|
|
25
|
-
protected abstract getDecimals<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string): number | null;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Returns the price of the token in BTC uSats (microSats)
|
|
29
|
-
*
|
|
30
|
-
* @param chainIdentifier Chain identifier of the smart chain
|
|
31
|
-
* @param tokenAddress Token address
|
|
32
|
-
* @param abortSignal
|
|
33
|
-
* @protected
|
|
34
|
-
*/
|
|
35
|
-
protected abstract getPrice<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string, abortSignal?: AbortSignal): Promise<bigint>;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Returns the price of bitcoin in USD (sats/USD)
|
|
39
|
-
*
|
|
40
|
-
* @param abortSignal
|
|
41
|
-
* @protected
|
|
42
|
-
*/
|
|
43
|
-
protected abstract getUsdPrice(abortSignal?: AbortSignal): Promise<number>;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Gets the decimal places for a given token, returns `-1` if token should be ignored & throws if token is not found
|
|
47
|
-
*
|
|
48
|
-
* @param chainIdentifier Chain identifier of the smart chain
|
|
49
|
-
* @param tokenAddress Token address
|
|
50
|
-
* @throws {Error} When token is not known
|
|
51
|
-
* @protected
|
|
52
|
-
*/
|
|
53
|
-
protected getDecimalsThrowing<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string): number {
|
|
54
|
-
const decimals = this.getDecimals(chainIdentifier, tokenAddress);
|
|
55
|
-
if(decimals==null) throw new Error(`Cannot get decimal count for token ${chainIdentifier}:${tokenAddress}!`);
|
|
56
|
-
return decimals;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Recomputes pricing info without fetching the current price
|
|
61
|
-
*
|
|
62
|
-
* @param chainIdentifier Chain identifier of the smart chain
|
|
63
|
-
* @param amountSats Amount of sats (BTC) to be received from the swap
|
|
64
|
-
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
65
|
-
* @param feePPM PPM fee rate as reported by the intermediary
|
|
66
|
-
* @param paidToken Amount of token to be paid to the swap
|
|
67
|
-
* @param tokenAddress Token address to be paid
|
|
68
|
-
*/
|
|
69
|
-
public recomputePriceInfoSend<C extends ChainIds<T>>(
|
|
70
|
-
chainIdentifier: C,
|
|
71
|
-
amountSats: bigint,
|
|
72
|
-
satsBaseFee: bigint,
|
|
73
|
-
feePPM: bigint,
|
|
74
|
-
paidToken: bigint,
|
|
75
|
-
tokenAddress: string
|
|
76
|
-
): PriceInfoType {
|
|
77
|
-
const totalSats = (amountSats * (1000000n + feePPM) / 1000000n)
|
|
78
|
-
+ satsBaseFee;
|
|
79
|
-
const totalUSats = totalSats * 1000000n;
|
|
80
|
-
const swapPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / paidToken;
|
|
81
|
-
|
|
82
|
-
return {
|
|
83
|
-
isValid: true,
|
|
84
|
-
differencePPM: 0n,
|
|
85
|
-
satsBaseFee,
|
|
86
|
-
feePPM,
|
|
87
|
-
realPriceUSatPerToken: this.shouldIgnore(chainIdentifier, tokenAddress) ? undefined : swapPriceUSatPerToken,
|
|
88
|
-
swapPriceUSatPerToken
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Checks whether the swap amounts are valid given the current market rate for a given pair
|
|
94
|
-
*
|
|
95
|
-
* @param chainIdentifier Chain identifier of the smart chain
|
|
96
|
-
* @param amountSats Amount of sats (BTC) to be received from the swap
|
|
97
|
-
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
98
|
-
* @param feePPM PPM fee rate as reported by the intermediary
|
|
99
|
-
* @param paidToken Amount of token to be paid to the swap
|
|
100
|
-
* @param tokenAddress Token address to be paid
|
|
101
|
-
* @param abortSignal
|
|
102
|
-
* @param preFetchedPrice An optional price pre-fetched with {@link preFetchPrice}
|
|
103
|
-
* @param realSwapFeeSats
|
|
104
|
-
*/
|
|
105
|
-
public async isValidAmountSend<C extends ChainIds<T>>(
|
|
106
|
-
chainIdentifier: C,
|
|
107
|
-
amountSats: bigint,
|
|
108
|
-
satsBaseFee: bigint,
|
|
109
|
-
feePPM: bigint,
|
|
110
|
-
paidToken: bigint,
|
|
111
|
-
tokenAddress: string,
|
|
112
|
-
abortSignal?: AbortSignal,
|
|
113
|
-
preFetchedPrice?: bigint | null,
|
|
114
|
-
realSwapFeeSats?: bigint
|
|
115
|
-
): Promise<PriceInfoType> {
|
|
116
|
-
if(realSwapFeeSats!=undefined && realSwapFeeSats<0) throw new Error("Invalid swap fee! Swap fee cannot be negative!");
|
|
117
|
-
const totalSats = realSwapFeeSats!=undefined
|
|
118
|
-
? amountSats + realSwapFeeSats
|
|
119
|
-
: (amountSats * (1000000n + feePPM) / 1000000n) + satsBaseFee;
|
|
120
|
-
const totalUSats = totalSats * 1000000n;
|
|
121
|
-
|
|
122
|
-
const swapPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / paidToken;
|
|
123
|
-
|
|
124
|
-
if(this.shouldIgnore(chainIdentifier, tokenAddress)) return {
|
|
125
|
-
isValid: true,
|
|
126
|
-
differencePPM: 0n,
|
|
127
|
-
satsBaseFee,
|
|
128
|
-
feePPM,
|
|
129
|
-
realPriceUSatPerToken: undefined,
|
|
130
|
-
swapPriceUSatPerToken
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const calculatedAmtInToken = await this.getFromBtcSwapAmount(chainIdentifier, totalSats, tokenAddress, abortSignal, preFetchedPrice);
|
|
134
|
-
const realPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / calculatedAmtInToken;
|
|
135
|
-
|
|
136
|
-
const difference = paidToken - calculatedAmtInToken; //Will be >0 if we need to pay more than we should've
|
|
137
|
-
const differencePPM = difference * 1000000n / calculatedAmtInToken;
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
isValid: differencePPM <= this.maxAllowedFeeDifferencePPM,
|
|
141
|
-
differencePPM,
|
|
142
|
-
satsBaseFee,
|
|
143
|
-
feePPM,
|
|
144
|
-
realPriceUSatPerToken,
|
|
145
|
-
swapPriceUSatPerToken
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Recomputes pricing info without fetching the current price
|
|
151
|
-
*
|
|
152
|
-
* @param chainIdentifier Chain identifier of the smart chain
|
|
153
|
-
* @param amountSats Amount of sats (BTC) to be paid to the swap
|
|
154
|
-
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
155
|
-
* @param feePPM PPM fee rate as reported by the intermediary
|
|
156
|
-
* @param receiveToken Amount of token to be received from the swap
|
|
157
|
-
* @param tokenAddress Token address to be received
|
|
158
|
-
*/
|
|
159
|
-
public recomputePriceInfoReceive<C extends ChainIds<T>>(
|
|
160
|
-
chainIdentifier: C,
|
|
161
|
-
amountSats: bigint,
|
|
162
|
-
satsBaseFee: bigint,
|
|
163
|
-
feePPM: bigint,
|
|
164
|
-
receiveToken: bigint,
|
|
165
|
-
tokenAddress: string,
|
|
166
|
-
): PriceInfoType {
|
|
167
|
-
const totalSats = (amountSats * (1000000n - feePPM) / 1000000n)
|
|
168
|
-
- satsBaseFee;
|
|
169
|
-
const totalUSats = totalSats * 1000000n;
|
|
170
|
-
const swapPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / receiveToken;
|
|
171
|
-
|
|
172
|
-
return {
|
|
173
|
-
isValid: true,
|
|
174
|
-
differencePPM: 0n,
|
|
175
|
-
satsBaseFee,
|
|
176
|
-
feePPM,
|
|
177
|
-
realPriceUSatPerToken: this.shouldIgnore(chainIdentifier, tokenAddress) ? undefined : swapPriceUSatPerToken,
|
|
178
|
-
swapPriceUSatPerToken
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Checks whether the swap amounts are valid given the current market rate for a given pair
|
|
184
|
-
*
|
|
185
|
-
* @param chainIdentifier Chain identifier of the smart chain
|
|
186
|
-
* @param amountSats Amount of sats (BTC) to be paid to the swap
|
|
187
|
-
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
188
|
-
* @param feePPM PPM fee rate as reported by the intermediary
|
|
189
|
-
* @param receiveToken Amount of token to be received from the swap
|
|
190
|
-
* @param tokenAddress Token address to be received
|
|
191
|
-
* @param abortSignal
|
|
192
|
-
* @param preFetchedPrice An optional price pre-fetched with {@link preFetchPrice}
|
|
193
|
-
* @param realSwapFeeSats
|
|
194
|
-
*/
|
|
195
|
-
public async isValidAmountReceive<C extends ChainIds<T>>(
|
|
196
|
-
chainIdentifier: C,
|
|
197
|
-
amountSats: bigint,
|
|
198
|
-
satsBaseFee: bigint,
|
|
199
|
-
feePPM: bigint,
|
|
200
|
-
receiveToken: bigint,
|
|
201
|
-
tokenAddress: string,
|
|
202
|
-
abortSignal?: AbortSignal,
|
|
203
|
-
preFetchedPrice?: bigint | null,
|
|
204
|
-
realSwapFeeSats?: bigint
|
|
205
|
-
): Promise<PriceInfoType> {
|
|
206
|
-
if(realSwapFeeSats!=undefined) {
|
|
207
|
-
if(realSwapFeeSats>=amountSats) throw new Error("Invalid swap fee! Larger than or equal to total output amount!");
|
|
208
|
-
if(realSwapFeeSats<0) throw new Error("Invalid swap fee! Must be non-negative!");
|
|
209
|
-
}
|
|
210
|
-
const totalSats = realSwapFeeSats!=undefined
|
|
211
|
-
? amountSats - realSwapFeeSats
|
|
212
|
-
: (amountSats * (1000000n - feePPM) / 1000000n) - satsBaseFee;
|
|
213
|
-
const totalUSats = totalSats * 1000000n;
|
|
214
|
-
|
|
215
|
-
const swapPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / receiveToken;
|
|
216
|
-
|
|
217
|
-
if(this.shouldIgnore(chainIdentifier, tokenAddress)) return {
|
|
218
|
-
isValid: true,
|
|
219
|
-
differencePPM: 0n,
|
|
220
|
-
satsBaseFee,
|
|
221
|
-
feePPM,
|
|
222
|
-
realPriceUSatPerToken: undefined,
|
|
223
|
-
swapPriceUSatPerToken
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
const calculatedAmtInToken = await this.getFromBtcSwapAmount(chainIdentifier, totalSats, tokenAddress, abortSignal, preFetchedPrice);
|
|
227
|
-
const realPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / calculatedAmtInToken;
|
|
228
|
-
|
|
229
|
-
const difference = calculatedAmtInToken - receiveToken; //Will be >0 if we receive less than we should've
|
|
230
|
-
const differencePPM = difference * 100000n / calculatedAmtInToken;
|
|
231
|
-
|
|
232
|
-
return {
|
|
233
|
-
isValid: differencePPM <= this.maxAllowedFeeDifferencePPM,
|
|
234
|
-
differencePPM,
|
|
235
|
-
satsBaseFee,
|
|
236
|
-
feePPM,
|
|
237
|
-
realPriceUSatPerToken,
|
|
238
|
-
swapPriceUSatPerToken
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Pre-fetches the pricing data for a given token, such that further calls to {@link isValidAmountReceive} or
|
|
244
|
-
* {@link isValidAmountSend} are quicker and don't need to wait for the price fetch
|
|
245
|
-
*
|
|
246
|
-
* @param chainIdentifier Chain identifier of the smart chain
|
|
247
|
-
* @param tokenAddress Token address
|
|
248
|
-
* @param abortSignal
|
|
249
|
-
*/
|
|
250
|
-
public preFetchPrice<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string, abortSignal?: AbortSignal): Promise<bigint> {
|
|
251
|
-
return this.getPrice(chainIdentifier, tokenAddress, abortSignal);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* Pre-fetches the Bitcoin USD price data, such that further calls to {@link getBtcUsdValue},
|
|
256
|
-
* {@link getTokenUsdValue} or {@link getUsdValue} are quicker and don't need to wait for the price fetch
|
|
257
|
-
*
|
|
258
|
-
* @param abortSignal
|
|
259
|
-
*/
|
|
260
|
-
public preFetchUsdPrice(abortSignal?: AbortSignal): Promise<number> {
|
|
261
|
-
return this.getUsdPrice(abortSignal);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Returns amount of `toToken` that is equivalent to `fromAmount` satoshis
|
|
266
|
-
*
|
|
267
|
-
* @param chainIdentifier Chain identifier string for the smart chain
|
|
268
|
-
* @param fromAmount Amount of satoshis
|
|
269
|
-
* @param toToken Token address
|
|
270
|
-
* @param abortSignal
|
|
271
|
-
* @param preFetchedPrice An optional price pre-fetched with {@link preFetchPrice}
|
|
272
|
-
* @throws {Error} when token is not found
|
|
273
|
-
*/
|
|
274
|
-
public async getFromBtcSwapAmount<C extends ChainIds<T>>(
|
|
275
|
-
chainIdentifier: C,
|
|
276
|
-
fromAmount: bigint,
|
|
277
|
-
toToken: string,
|
|
278
|
-
abortSignal?: AbortSignal,
|
|
279
|
-
preFetchedPrice?: bigint | null
|
|
280
|
-
): Promise<bigint> {
|
|
281
|
-
if(this.getDecimals(chainIdentifier, toToken.toString())==null) throw new Error("Token not found!");
|
|
282
|
-
|
|
283
|
-
const price = preFetchedPrice || await this.getPrice(chainIdentifier, toToken, abortSignal);
|
|
284
|
-
|
|
285
|
-
return fromAmount
|
|
286
|
-
* (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, toToken.toString())))
|
|
287
|
-
* (1000000n) //To usat
|
|
288
|
-
/ (price);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* Returns amount of satoshis that are equivalent to `fromAmount` of `fromToken`
|
|
293
|
-
*
|
|
294
|
-
* @param chainIdentifier Chain identifier string for the smart chain
|
|
295
|
-
* @param fromAmount Amount of the token
|
|
296
|
-
* @param fromToken Token address
|
|
297
|
-
* @param abortSignal
|
|
298
|
-
* @param preFetchedPrice An optional price pre-fetched with {@link preFetchPrice}
|
|
299
|
-
* @throws {Error} when token is not found
|
|
300
|
-
*/
|
|
301
|
-
public async getToBtcSwapAmount<C extends ChainIds<T>>(
|
|
302
|
-
chainIdentifier: C,
|
|
303
|
-
fromAmount: bigint,
|
|
304
|
-
fromToken: string,
|
|
305
|
-
abortSignal?: AbortSignal,
|
|
306
|
-
preFetchedPrice?: bigint
|
|
307
|
-
): Promise<bigint> {
|
|
308
|
-
if(this.getDecimals(chainIdentifier, fromToken.toString())==null) throw new Error("Token not found");
|
|
309
|
-
|
|
310
|
-
const price = preFetchedPrice || await this.getPrice(chainIdentifier, fromToken, abortSignal);
|
|
311
|
-
|
|
312
|
-
return fromAmount
|
|
313
|
-
* price
|
|
314
|
-
/ 1000000n
|
|
315
|
-
/ (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, fromToken.toString())));
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Returns whether the token should be ignored and pricing for it not calculated
|
|
320
|
-
*
|
|
321
|
-
* @param chainIdentifier Chain identifier string for the smart chain
|
|
322
|
-
* @param tokenAddress Token address
|
|
323
|
-
* @throws {Error} if token is not found
|
|
324
|
-
*/
|
|
325
|
-
public shouldIgnore<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string): boolean {
|
|
326
|
-
const coin = this.getDecimals(chainIdentifier, tokenAddress.toString());
|
|
327
|
-
if(coin==null) throw new Error("Token not found");
|
|
328
|
-
return coin===-1;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Returns the USD value of the bitcoin amount
|
|
333
|
-
*
|
|
334
|
-
* @param btcSats Bitcoin amount in satoshis
|
|
335
|
-
* @param abortSignal
|
|
336
|
-
* @param preFetchedUsdPrice An optional price pre-fetched with {@link preFetchUsdPrice}
|
|
337
|
-
*/
|
|
338
|
-
public async getBtcUsdValue(
|
|
339
|
-
btcSats: bigint,
|
|
340
|
-
abortSignal?: AbortSignal,
|
|
341
|
-
preFetchedUsdPrice?: number
|
|
342
|
-
): Promise<number> {
|
|
343
|
-
return Number(btcSats)*(preFetchedUsdPrice || await this.getUsdPrice(abortSignal));
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Returns the USD value of the smart chain token amount
|
|
348
|
-
*
|
|
349
|
-
* @param chainIdentifier Chain identifier string for the smart chain
|
|
350
|
-
* @param tokenAmount Amount of the token in base units
|
|
351
|
-
* @param tokenAddress Token address
|
|
352
|
-
* @param abortSignal
|
|
353
|
-
* @param preFetchedUsdPrice An optional price pre-fetched with {@link preFetchUsdPrice}
|
|
354
|
-
*/
|
|
355
|
-
public async getTokenUsdValue<C extends ChainIds<T>>(
|
|
356
|
-
chainIdentifier: C,
|
|
357
|
-
tokenAmount: bigint,
|
|
358
|
-
tokenAddress: string,
|
|
359
|
-
abortSignal?: AbortSignal,
|
|
360
|
-
preFetchedUsdPrice?: number
|
|
361
|
-
): Promise<number> {
|
|
362
|
-
const [btcAmount, usdPrice] = await Promise.all([
|
|
363
|
-
this.getToBtcSwapAmount(chainIdentifier, tokenAmount, tokenAddress, abortSignal),
|
|
364
|
-
preFetchedUsdPrice==null ? this.preFetchUsdPrice(abortSignal) : Promise.resolve(preFetchedUsdPrice)
|
|
365
|
-
]);
|
|
366
|
-
return Number(btcAmount)*usdPrice;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* Returns the USD value of the token amount
|
|
371
|
-
*
|
|
372
|
-
* @param amount Amount in base units of the token
|
|
373
|
-
* @param token Token to fetch the usd price for
|
|
374
|
-
* @param abortSignal
|
|
375
|
-
* @param preFetchedUsdPrice An optional price pre-fetched with {@link preFetchUsdPrice}
|
|
376
|
-
*/
|
|
377
|
-
public getUsdValue<C extends ChainIds<T>>(
|
|
378
|
-
amount: bigint,
|
|
379
|
-
token: Token<C>,
|
|
380
|
-
abortSignal?: AbortSignal,
|
|
381
|
-
preFetchedUsdPrice?: number
|
|
382
|
-
): Promise<number> {
|
|
383
|
-
if(token.chain==="BTC") {
|
|
384
|
-
return this.getBtcUsdValue(amount, abortSignal, preFetchedUsdPrice);
|
|
385
|
-
} else {
|
|
386
|
-
return this.getTokenUsdValue(token.chainId, amount, token.address, abortSignal, preFetchedUsdPrice);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
}
|
|
1
|
+
import {ChainIds, MultiChain} from "../../swapper/Swapper";
|
|
2
|
+
import {Token} from "../../types/Token";
|
|
3
|
+
import {PriceInfoType} from "../../types/PriceInfoType";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Abstract base class for swap pricing implementations
|
|
7
|
+
*
|
|
8
|
+
* @category Pricing
|
|
9
|
+
*/
|
|
10
|
+
export abstract class ISwapPrice<T extends MultiChain = MultiChain> {
|
|
11
|
+
|
|
12
|
+
maxAllowedFeeDifferencePPM: bigint;
|
|
13
|
+
|
|
14
|
+
protected constructor(maxAllowedFeeDifferencePPM: bigint) {
|
|
15
|
+
this.maxAllowedFeeDifferencePPM = maxAllowedFeeDifferencePPM;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Gets the decimal places for a given token, returns `-1` if token should be ignored & `null` if token is not found
|
|
20
|
+
*
|
|
21
|
+
* @param chainIdentifier Chain identifier of the smart chain
|
|
22
|
+
* @param tokenAddress Token address
|
|
23
|
+
* @protected
|
|
24
|
+
*/
|
|
25
|
+
protected abstract getDecimals<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string): number | null;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Returns the price of the token in BTC uSats (microSats)
|
|
29
|
+
*
|
|
30
|
+
* @param chainIdentifier Chain identifier of the smart chain
|
|
31
|
+
* @param tokenAddress Token address
|
|
32
|
+
* @param abortSignal
|
|
33
|
+
* @protected
|
|
34
|
+
*/
|
|
35
|
+
protected abstract getPrice<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string, abortSignal?: AbortSignal): Promise<bigint>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Returns the price of bitcoin in USD (sats/USD)
|
|
39
|
+
*
|
|
40
|
+
* @param abortSignal
|
|
41
|
+
* @protected
|
|
42
|
+
*/
|
|
43
|
+
protected abstract getUsdPrice(abortSignal?: AbortSignal): Promise<number>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Gets the decimal places for a given token, returns `-1` if token should be ignored & throws if token is not found
|
|
47
|
+
*
|
|
48
|
+
* @param chainIdentifier Chain identifier of the smart chain
|
|
49
|
+
* @param tokenAddress Token address
|
|
50
|
+
* @throws {Error} When token is not known
|
|
51
|
+
* @protected
|
|
52
|
+
*/
|
|
53
|
+
protected getDecimalsThrowing<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string): number {
|
|
54
|
+
const decimals = this.getDecimals(chainIdentifier, tokenAddress);
|
|
55
|
+
if(decimals==null) throw new Error(`Cannot get decimal count for token ${chainIdentifier}:${tokenAddress}!`);
|
|
56
|
+
return decimals;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Recomputes pricing info without fetching the current price
|
|
61
|
+
*
|
|
62
|
+
* @param chainIdentifier Chain identifier of the smart chain
|
|
63
|
+
* @param amountSats Amount of sats (BTC) to be received from the swap
|
|
64
|
+
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
65
|
+
* @param feePPM PPM fee rate as reported by the intermediary
|
|
66
|
+
* @param paidToken Amount of token to be paid to the swap
|
|
67
|
+
* @param tokenAddress Token address to be paid
|
|
68
|
+
*/
|
|
69
|
+
public recomputePriceInfoSend<C extends ChainIds<T>>(
|
|
70
|
+
chainIdentifier: C,
|
|
71
|
+
amountSats: bigint,
|
|
72
|
+
satsBaseFee: bigint,
|
|
73
|
+
feePPM: bigint,
|
|
74
|
+
paidToken: bigint,
|
|
75
|
+
tokenAddress: string
|
|
76
|
+
): PriceInfoType {
|
|
77
|
+
const totalSats = (amountSats * (1000000n + feePPM) / 1000000n)
|
|
78
|
+
+ satsBaseFee;
|
|
79
|
+
const totalUSats = totalSats * 1000000n;
|
|
80
|
+
const swapPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / paidToken;
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
isValid: true,
|
|
84
|
+
differencePPM: 0n,
|
|
85
|
+
satsBaseFee,
|
|
86
|
+
feePPM,
|
|
87
|
+
realPriceUSatPerToken: this.shouldIgnore(chainIdentifier, tokenAddress) ? undefined : swapPriceUSatPerToken,
|
|
88
|
+
swapPriceUSatPerToken
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Checks whether the swap amounts are valid given the current market rate for a given pair
|
|
94
|
+
*
|
|
95
|
+
* @param chainIdentifier Chain identifier of the smart chain
|
|
96
|
+
* @param amountSats Amount of sats (BTC) to be received from the swap
|
|
97
|
+
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
98
|
+
* @param feePPM PPM fee rate as reported by the intermediary
|
|
99
|
+
* @param paidToken Amount of token to be paid to the swap
|
|
100
|
+
* @param tokenAddress Token address to be paid
|
|
101
|
+
* @param abortSignal
|
|
102
|
+
* @param preFetchedPrice An optional price pre-fetched with {@link preFetchPrice}
|
|
103
|
+
* @param realSwapFeeSats
|
|
104
|
+
*/
|
|
105
|
+
public async isValidAmountSend<C extends ChainIds<T>>(
|
|
106
|
+
chainIdentifier: C,
|
|
107
|
+
amountSats: bigint,
|
|
108
|
+
satsBaseFee: bigint,
|
|
109
|
+
feePPM: bigint,
|
|
110
|
+
paidToken: bigint,
|
|
111
|
+
tokenAddress: string,
|
|
112
|
+
abortSignal?: AbortSignal,
|
|
113
|
+
preFetchedPrice?: bigint | null,
|
|
114
|
+
realSwapFeeSats?: bigint
|
|
115
|
+
): Promise<PriceInfoType> {
|
|
116
|
+
if(realSwapFeeSats!=undefined && realSwapFeeSats<0) throw new Error("Invalid swap fee! Swap fee cannot be negative!");
|
|
117
|
+
const totalSats = realSwapFeeSats!=undefined
|
|
118
|
+
? amountSats + realSwapFeeSats
|
|
119
|
+
: (amountSats * (1000000n + feePPM) / 1000000n) + satsBaseFee;
|
|
120
|
+
const totalUSats = totalSats * 1000000n;
|
|
121
|
+
|
|
122
|
+
const swapPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / paidToken;
|
|
123
|
+
|
|
124
|
+
if(this.shouldIgnore(chainIdentifier, tokenAddress)) return {
|
|
125
|
+
isValid: true,
|
|
126
|
+
differencePPM: 0n,
|
|
127
|
+
satsBaseFee,
|
|
128
|
+
feePPM,
|
|
129
|
+
realPriceUSatPerToken: undefined,
|
|
130
|
+
swapPriceUSatPerToken
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const calculatedAmtInToken = await this.getFromBtcSwapAmount(chainIdentifier, totalSats, tokenAddress, abortSignal, preFetchedPrice);
|
|
134
|
+
const realPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / calculatedAmtInToken;
|
|
135
|
+
|
|
136
|
+
const difference = paidToken - calculatedAmtInToken; //Will be >0 if we need to pay more than we should've
|
|
137
|
+
const differencePPM = difference * 1000000n / calculatedAmtInToken;
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
isValid: differencePPM <= this.maxAllowedFeeDifferencePPM,
|
|
141
|
+
differencePPM,
|
|
142
|
+
satsBaseFee,
|
|
143
|
+
feePPM,
|
|
144
|
+
realPriceUSatPerToken,
|
|
145
|
+
swapPriceUSatPerToken
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Recomputes pricing info without fetching the current price
|
|
151
|
+
*
|
|
152
|
+
* @param chainIdentifier Chain identifier of the smart chain
|
|
153
|
+
* @param amountSats Amount of sats (BTC) to be paid to the swap
|
|
154
|
+
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
155
|
+
* @param feePPM PPM fee rate as reported by the intermediary
|
|
156
|
+
* @param receiveToken Amount of token to be received from the swap
|
|
157
|
+
* @param tokenAddress Token address to be received
|
|
158
|
+
*/
|
|
159
|
+
public recomputePriceInfoReceive<C extends ChainIds<T>>(
|
|
160
|
+
chainIdentifier: C,
|
|
161
|
+
amountSats: bigint,
|
|
162
|
+
satsBaseFee: bigint,
|
|
163
|
+
feePPM: bigint,
|
|
164
|
+
receiveToken: bigint,
|
|
165
|
+
tokenAddress: string,
|
|
166
|
+
): PriceInfoType {
|
|
167
|
+
const totalSats = (amountSats * (1000000n - feePPM) / 1000000n)
|
|
168
|
+
- satsBaseFee;
|
|
169
|
+
const totalUSats = totalSats * 1000000n;
|
|
170
|
+
const swapPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / receiveToken;
|
|
171
|
+
|
|
172
|
+
return {
|
|
173
|
+
isValid: true,
|
|
174
|
+
differencePPM: 0n,
|
|
175
|
+
satsBaseFee,
|
|
176
|
+
feePPM,
|
|
177
|
+
realPriceUSatPerToken: this.shouldIgnore(chainIdentifier, tokenAddress) ? undefined : swapPriceUSatPerToken,
|
|
178
|
+
swapPriceUSatPerToken
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Checks whether the swap amounts are valid given the current market rate for a given pair
|
|
184
|
+
*
|
|
185
|
+
* @param chainIdentifier Chain identifier of the smart chain
|
|
186
|
+
* @param amountSats Amount of sats (BTC) to be paid to the swap
|
|
187
|
+
* @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
|
|
188
|
+
* @param feePPM PPM fee rate as reported by the intermediary
|
|
189
|
+
* @param receiveToken Amount of token to be received from the swap
|
|
190
|
+
* @param tokenAddress Token address to be received
|
|
191
|
+
* @param abortSignal
|
|
192
|
+
* @param preFetchedPrice An optional price pre-fetched with {@link preFetchPrice}
|
|
193
|
+
* @param realSwapFeeSats
|
|
194
|
+
*/
|
|
195
|
+
public async isValidAmountReceive<C extends ChainIds<T>>(
|
|
196
|
+
chainIdentifier: C,
|
|
197
|
+
amountSats: bigint,
|
|
198
|
+
satsBaseFee: bigint,
|
|
199
|
+
feePPM: bigint,
|
|
200
|
+
receiveToken: bigint,
|
|
201
|
+
tokenAddress: string,
|
|
202
|
+
abortSignal?: AbortSignal,
|
|
203
|
+
preFetchedPrice?: bigint | null,
|
|
204
|
+
realSwapFeeSats?: bigint
|
|
205
|
+
): Promise<PriceInfoType> {
|
|
206
|
+
if(realSwapFeeSats!=undefined) {
|
|
207
|
+
if(realSwapFeeSats>=amountSats) throw new Error("Invalid swap fee! Larger than or equal to total output amount!");
|
|
208
|
+
if(realSwapFeeSats<0) throw new Error("Invalid swap fee! Must be non-negative!");
|
|
209
|
+
}
|
|
210
|
+
const totalSats = realSwapFeeSats!=undefined
|
|
211
|
+
? amountSats - realSwapFeeSats
|
|
212
|
+
: (amountSats * (1000000n - feePPM) / 1000000n) - satsBaseFee;
|
|
213
|
+
const totalUSats = totalSats * 1000000n;
|
|
214
|
+
|
|
215
|
+
const swapPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / receiveToken;
|
|
216
|
+
|
|
217
|
+
if(this.shouldIgnore(chainIdentifier, tokenAddress)) return {
|
|
218
|
+
isValid: true,
|
|
219
|
+
differencePPM: 0n,
|
|
220
|
+
satsBaseFee,
|
|
221
|
+
feePPM,
|
|
222
|
+
realPriceUSatPerToken: undefined,
|
|
223
|
+
swapPriceUSatPerToken
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
const calculatedAmtInToken = await this.getFromBtcSwapAmount(chainIdentifier, totalSats, tokenAddress, abortSignal, preFetchedPrice);
|
|
227
|
+
const realPriceUSatPerToken = totalUSats * (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, tokenAddress))) / calculatedAmtInToken;
|
|
228
|
+
|
|
229
|
+
const difference = calculatedAmtInToken - receiveToken; //Will be >0 if we receive less than we should've
|
|
230
|
+
const differencePPM = difference * 100000n / calculatedAmtInToken;
|
|
231
|
+
|
|
232
|
+
return {
|
|
233
|
+
isValid: differencePPM <= this.maxAllowedFeeDifferencePPM,
|
|
234
|
+
differencePPM,
|
|
235
|
+
satsBaseFee,
|
|
236
|
+
feePPM,
|
|
237
|
+
realPriceUSatPerToken,
|
|
238
|
+
swapPriceUSatPerToken
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Pre-fetches the pricing data for a given token, such that further calls to {@link isValidAmountReceive} or
|
|
244
|
+
* {@link isValidAmountSend} are quicker and don't need to wait for the price fetch
|
|
245
|
+
*
|
|
246
|
+
* @param chainIdentifier Chain identifier of the smart chain
|
|
247
|
+
* @param tokenAddress Token address
|
|
248
|
+
* @param abortSignal
|
|
249
|
+
*/
|
|
250
|
+
public preFetchPrice<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string, abortSignal?: AbortSignal): Promise<bigint> {
|
|
251
|
+
return this.getPrice(chainIdentifier, tokenAddress, abortSignal);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Pre-fetches the Bitcoin USD price data, such that further calls to {@link getBtcUsdValue},
|
|
256
|
+
* {@link getTokenUsdValue} or {@link getUsdValue} are quicker and don't need to wait for the price fetch
|
|
257
|
+
*
|
|
258
|
+
* @param abortSignal
|
|
259
|
+
*/
|
|
260
|
+
public preFetchUsdPrice(abortSignal?: AbortSignal): Promise<number> {
|
|
261
|
+
return this.getUsdPrice(abortSignal);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Returns amount of `toToken` that is equivalent to `fromAmount` satoshis
|
|
266
|
+
*
|
|
267
|
+
* @param chainIdentifier Chain identifier string for the smart chain
|
|
268
|
+
* @param fromAmount Amount of satoshis
|
|
269
|
+
* @param toToken Token address
|
|
270
|
+
* @param abortSignal
|
|
271
|
+
* @param preFetchedPrice An optional price pre-fetched with {@link preFetchPrice}
|
|
272
|
+
* @throws {Error} when token is not found
|
|
273
|
+
*/
|
|
274
|
+
public async getFromBtcSwapAmount<C extends ChainIds<T>>(
|
|
275
|
+
chainIdentifier: C,
|
|
276
|
+
fromAmount: bigint,
|
|
277
|
+
toToken: string,
|
|
278
|
+
abortSignal?: AbortSignal,
|
|
279
|
+
preFetchedPrice?: bigint | null
|
|
280
|
+
): Promise<bigint> {
|
|
281
|
+
if(this.getDecimals(chainIdentifier, toToken.toString())==null) throw new Error("Token not found!");
|
|
282
|
+
|
|
283
|
+
const price = preFetchedPrice || await this.getPrice(chainIdentifier, toToken, abortSignal);
|
|
284
|
+
|
|
285
|
+
return fromAmount
|
|
286
|
+
* (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, toToken.toString())))
|
|
287
|
+
* (1000000n) //To usat
|
|
288
|
+
/ (price);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Returns amount of satoshis that are equivalent to `fromAmount` of `fromToken`
|
|
293
|
+
*
|
|
294
|
+
* @param chainIdentifier Chain identifier string for the smart chain
|
|
295
|
+
* @param fromAmount Amount of the token
|
|
296
|
+
* @param fromToken Token address
|
|
297
|
+
* @param abortSignal
|
|
298
|
+
* @param preFetchedPrice An optional price pre-fetched with {@link preFetchPrice}
|
|
299
|
+
* @throws {Error} when token is not found
|
|
300
|
+
*/
|
|
301
|
+
public async getToBtcSwapAmount<C extends ChainIds<T>>(
|
|
302
|
+
chainIdentifier: C,
|
|
303
|
+
fromAmount: bigint,
|
|
304
|
+
fromToken: string,
|
|
305
|
+
abortSignal?: AbortSignal,
|
|
306
|
+
preFetchedPrice?: bigint
|
|
307
|
+
): Promise<bigint> {
|
|
308
|
+
if(this.getDecimals(chainIdentifier, fromToken.toString())==null) throw new Error("Token not found");
|
|
309
|
+
|
|
310
|
+
const price = preFetchedPrice || await this.getPrice(chainIdentifier, fromToken, abortSignal);
|
|
311
|
+
|
|
312
|
+
return fromAmount
|
|
313
|
+
* price
|
|
314
|
+
/ 1000000n
|
|
315
|
+
/ (10n ** BigInt(this.getDecimalsThrowing(chainIdentifier, fromToken.toString())));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Returns whether the token should be ignored and pricing for it not calculated
|
|
320
|
+
*
|
|
321
|
+
* @param chainIdentifier Chain identifier string for the smart chain
|
|
322
|
+
* @param tokenAddress Token address
|
|
323
|
+
* @throws {Error} if token is not found
|
|
324
|
+
*/
|
|
325
|
+
public shouldIgnore<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string): boolean {
|
|
326
|
+
const coin = this.getDecimals(chainIdentifier, tokenAddress.toString());
|
|
327
|
+
if(coin==null) throw new Error("Token not found");
|
|
328
|
+
return coin===-1;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Returns the USD value of the bitcoin amount
|
|
333
|
+
*
|
|
334
|
+
* @param btcSats Bitcoin amount in satoshis
|
|
335
|
+
* @param abortSignal
|
|
336
|
+
* @param preFetchedUsdPrice An optional price pre-fetched with {@link preFetchUsdPrice}
|
|
337
|
+
*/
|
|
338
|
+
public async getBtcUsdValue(
|
|
339
|
+
btcSats: bigint,
|
|
340
|
+
abortSignal?: AbortSignal,
|
|
341
|
+
preFetchedUsdPrice?: number
|
|
342
|
+
): Promise<number> {
|
|
343
|
+
return Number(btcSats)*(preFetchedUsdPrice || await this.getUsdPrice(abortSignal));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Returns the USD value of the smart chain token amount
|
|
348
|
+
*
|
|
349
|
+
* @param chainIdentifier Chain identifier string for the smart chain
|
|
350
|
+
* @param tokenAmount Amount of the token in base units
|
|
351
|
+
* @param tokenAddress Token address
|
|
352
|
+
* @param abortSignal
|
|
353
|
+
* @param preFetchedUsdPrice An optional price pre-fetched with {@link preFetchUsdPrice}
|
|
354
|
+
*/
|
|
355
|
+
public async getTokenUsdValue<C extends ChainIds<T>>(
|
|
356
|
+
chainIdentifier: C,
|
|
357
|
+
tokenAmount: bigint,
|
|
358
|
+
tokenAddress: string,
|
|
359
|
+
abortSignal?: AbortSignal,
|
|
360
|
+
preFetchedUsdPrice?: number
|
|
361
|
+
): Promise<number> {
|
|
362
|
+
const [btcAmount, usdPrice] = await Promise.all([
|
|
363
|
+
this.getToBtcSwapAmount(chainIdentifier, tokenAmount, tokenAddress, abortSignal),
|
|
364
|
+
preFetchedUsdPrice==null ? this.preFetchUsdPrice(abortSignal) : Promise.resolve(preFetchedUsdPrice)
|
|
365
|
+
]);
|
|
366
|
+
return Number(btcAmount)*usdPrice;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Returns the USD value of the token amount
|
|
371
|
+
*
|
|
372
|
+
* @param amount Amount in base units of the token
|
|
373
|
+
* @param token Token to fetch the usd price for
|
|
374
|
+
* @param abortSignal
|
|
375
|
+
* @param preFetchedUsdPrice An optional price pre-fetched with {@link preFetchUsdPrice}
|
|
376
|
+
*/
|
|
377
|
+
public getUsdValue<C extends ChainIds<T>>(
|
|
378
|
+
amount: bigint,
|
|
379
|
+
token: Token<C>,
|
|
380
|
+
abortSignal?: AbortSignal,
|
|
381
|
+
preFetchedUsdPrice?: number
|
|
382
|
+
): Promise<number> {
|
|
383
|
+
if(token.chain==="BTC") {
|
|
384
|
+
return this.getBtcUsdValue(amount, abortSignal, preFetchedUsdPrice);
|
|
385
|
+
} else {
|
|
386
|
+
return this.getTokenUsdValue(token.chainId, amount, token.address, abortSignal, preFetchedUsdPrice);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
}
|