@atomiqlabs/sdk 8.6.6 → 8.6.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/dist/SmartChainAssets.d.ts +181 -181
- package/dist/SmartChainAssets.js +181 -181
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -6
- package/dist/bitcoin/coinselect2/accumulative.js +52 -51
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -6
- package/dist/bitcoin/coinselect2/blackjack.js +38 -37
- package/dist/bitcoin/coinselect2/index.d.ts +19 -17
- package/dist/bitcoin/coinselect2/index.js +69 -69
- package/dist/bitcoin/coinselect2/utils.d.ts +77 -75
- package/dist/bitcoin/coinselect2/utils.js +123 -123
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +130 -128
- package/dist/bitcoin/wallet/BitcoinWallet.js +322 -322
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +78 -78
- package/dist/bitcoin/wallet/IBitcoinWallet.js +21 -20
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +101 -99
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +190 -176
- 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 +130 -130
- package/dist/http/HttpUtils.d.ts +27 -27
- package/dist/http/HttpUtils.js +91 -90
- 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 -42
- package/dist/http/paramcoders/ParamDecoder.js +137 -137
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -18
- 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 -11
- 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 -173
- package/dist/index.d.ts +85 -85
- package/dist/index.js +158 -158
- package/dist/intermediaries/Intermediary.d.ts +157 -157
- package/dist/intermediaries/Intermediary.js +142 -142
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +199 -198
- package/dist/intermediaries/IntermediaryDiscovery.js +406 -406
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +439 -437
- package/dist/intermediaries/apis/IntermediaryAPI.js +603 -603
- 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 +687 -686
- package/dist/swapper/Swapper.js +1603 -1603
- package/dist/swapper/SwapperFactory.d.ts +135 -135
- package/dist/swapper/SwapperFactory.js +162 -162
- package/dist/swapper/SwapperUtils.d.ts +200 -200
- package/dist/swapper/SwapperUtils.js +467 -467
- 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 -13
- package/dist/swaps/IBTCWalletSwap.d.ts +73 -73
- package/dist/swaps/IBTCWalletSwap.js +18 -17
- package/dist/swaps/IClaimableSwap.d.ts +49 -49
- package/dist/swaps/IClaimableSwap.js +15 -14
- 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 -13
- package/dist/swaps/ISwap.d.ts +387 -386
- package/dist/swaps/ISwap.js +346 -346
- package/dist/swaps/ISwapWithGasDrop.d.ts +21 -21
- package/dist/swaps/ISwapWithGasDrop.js +12 -11
- package/dist/swaps/ISwapWrapper.d.ts +285 -283
- 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 +135 -133
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +169 -169
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +115 -114
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +134 -134
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +101 -98
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +130 -130
- 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 +58 -58
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +78 -78
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +531 -529
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +1285 -1285
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +184 -181
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +418 -418
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +583 -581
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +1371 -1371
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +228 -225
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +506 -506
- 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 +191 -190
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +378 -378
- 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 +62 -62
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +112 -112
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +127 -125
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +256 -256
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +242 -241
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -520
- 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 +128 -127
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +278 -278
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +630 -630
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1443 -1443
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +214 -213
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +756 -756
- 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 +82 -82
- 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 -68
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +92 -92
- 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 -56
- 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 -42
- 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 -59
- 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 -17
- package/dist/types/lnurl/LNURLPay.d.ts +61 -61
- package/dist/types/lnurl/LNURLPay.js +31 -30
- package/dist/types/lnurl/LNURLWithdraw.d.ts +48 -48
- package/dist/types/lnurl/LNURLWithdraw.js +27 -26
- package/dist/types/wallets/LightningInvoiceCreateService.d.ts +24 -24
- package/dist/types/wallets/LightningInvoiceCreateService.js +15 -14
- 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 -69
- package/dist/utils/BitcoinUtils.d.ts +14 -12
- package/dist/utils/BitcoinUtils.js +102 -101
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -7
- package/dist/utils/BitcoinWalletUtils.js +14 -13
- package/dist/utils/Logger.d.ts +7 -7
- package/dist/utils/Logger.js +12 -11
- package/dist/utils/RetryUtils.d.ts +22 -22
- package/dist/utils/RetryUtils.js +67 -66
- 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 -54
- package/dist/utils/TokenUtils.d.ts +19 -19
- package/dist/utils/TokenUtils.js +37 -36
- package/dist/utils/TypeUtils.d.ts +7 -7
- package/dist/utils/TypeUtils.js +2 -2
- package/dist/utils/Utils.d.ts +58 -56
- package/dist/utils/Utils.js +194 -193
- package/package.json +1 -1
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +14 -2
|
@@ -1,353 +1,353 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ISwapWrapper = exports.DEFAULT_MAX_PARALLEL_SWAP_SYNCS = exports.DEFAULT_MAX_PARALLEL_SWAP_TICKS = void 0;
|
|
4
|
-
const events_1 = require("events");
|
|
5
|
-
const IntermediaryError_1 = require("../errors/IntermediaryError");
|
|
6
|
-
const Logger_1 = require("../utils/Logger");
|
|
7
|
-
const TokenUtils_1 = require("../utils/TokenUtils");
|
|
8
|
-
const UserError_1 = require("../errors/UserError");
|
|
9
|
-
exports.DEFAULT_MAX_PARALLEL_SWAP_TICKS = 50;
|
|
10
|
-
exports.DEFAULT_MAX_PARALLEL_SWAP_SYNCS = 50;
|
|
11
|
-
/**
|
|
12
|
-
* Base abstract class for swap handler implementations
|
|
13
|
-
*
|
|
14
|
-
* @category Swaps/Base
|
|
15
|
-
*/
|
|
16
|
-
class ISwapWrapper {
|
|
17
|
-
constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, options, events) {
|
|
18
|
-
/**
|
|
19
|
-
* Logger instance
|
|
20
|
-
* @internal
|
|
21
|
-
*/
|
|
22
|
-
this.logger = (0, Logger_1.getLogger)(this.constructor.name + ": ");
|
|
23
|
-
/**
|
|
24
|
-
* In-memory mapping of pending (not initiated) swaps, utilizing weak references to automatically
|
|
25
|
-
* free memory when swaps are dereferenced in not initiated state
|
|
26
|
-
* @internal
|
|
27
|
-
*/
|
|
28
|
-
this.pendingSwaps = new Map();
|
|
29
|
-
/**
|
|
30
|
-
* Whether this wrapper is initialized (have to call {@link init} to initialize a wrapper)
|
|
31
|
-
* @internal
|
|
32
|
-
*/
|
|
33
|
-
this.isInitialized = false;
|
|
34
|
-
if (options?.maxParallelSwapTicks != null && options.maxParallelSwapTicks < 1)
|
|
35
|
-
throw new Error("maxParallelSwapTicks must be at least 1!");
|
|
36
|
-
if (options?.maxParallelSwapSyncs != null && options.maxParallelSwapSyncs < 1)
|
|
37
|
-
throw new Error("maxParallelSwapSyncs must be at least 1!");
|
|
38
|
-
this.unifiedStorage = unifiedStorage;
|
|
39
|
-
this.unifiedChainEvents = unifiedChainEvents;
|
|
40
|
-
this.chainIdentifier = chainIdentifier;
|
|
41
|
-
this._chain = chain;
|
|
42
|
-
this._prices = prices;
|
|
43
|
-
this.events = events || new events_1.EventEmitter();
|
|
44
|
-
this._options = options;
|
|
45
|
-
this._tokens = tokens;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Parses the provided gas amount from its `string` or `bigint` representation to `bigint` base units.
|
|
49
|
-
*
|
|
50
|
-
* Defaults to `0n` if no gasAmount is provided
|
|
51
|
-
*
|
|
52
|
-
* @param gasAmount
|
|
53
|
-
* @internal
|
|
54
|
-
*/
|
|
55
|
-
parseGasAmount(gasAmount) {
|
|
56
|
-
let result;
|
|
57
|
-
if (typeof (gasAmount) === "string") {
|
|
58
|
-
result = (0, TokenUtils_1.fromHumanReadableString)(gasAmount, this._getNativeToken());
|
|
59
|
-
if (result == null)
|
|
60
|
-
throw new UserError_1.UserError("Invalid `gasAmount` option provided, not a numerical string!");
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
result = gasAmount;
|
|
64
|
-
}
|
|
65
|
-
return result ?? 0n;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Pre-fetches swap price for a given swap
|
|
69
|
-
*
|
|
70
|
-
* @param amountData Amount data
|
|
71
|
-
* @param abortSignal Abort signal
|
|
72
|
-
* @returns Price of the token in uSats (micro sats)
|
|
73
|
-
* @internal
|
|
74
|
-
*/
|
|
75
|
-
preFetchPrice(amountData, abortSignal) {
|
|
76
|
-
return this._prices.preFetchPrice(this.chainIdentifier, amountData.token, abortSignal).catch(e => {
|
|
77
|
-
this.logger.error("preFetchPrice.token(): Error: ", e);
|
|
78
|
-
return undefined;
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Pre-fetches bitcoin's USD price
|
|
83
|
-
*
|
|
84
|
-
* @param abortSignal Abort signal
|
|
85
|
-
* @internal
|
|
86
|
-
*/
|
|
87
|
-
preFetchUsdPrice(abortSignal) {
|
|
88
|
-
return this._prices.preFetchUsdPrice(abortSignal).catch(e => {
|
|
89
|
-
this.logger.error("preFetchPrice.usd(): Error: ", e);
|
|
90
|
-
return undefined;
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Verifies returned price for swaps
|
|
95
|
-
*
|
|
96
|
-
* @param lpServiceData Service data for the service in question (TO_BTCLN, TO_BTC, etc.) of the given intermediary
|
|
97
|
-
* @param send Whether this is a send (Smart chain -> Bitcoin) or receive (Bitcoin -> Smart chain) swap
|
|
98
|
-
* @param amountSats Amount in BTC
|
|
99
|
-
* @param amountToken Amount in token
|
|
100
|
-
* @param token Token used in the swap
|
|
101
|
-
* @param feeData Fee data as returned by the intermediary
|
|
102
|
-
* @param pricePrefetchPromise Optional price pre-fetch promise
|
|
103
|
-
* @param usdPricePrefetchPromise Optiona USD price pre-fetch promise
|
|
104
|
-
* @param abortSignal Abort signal
|
|
105
|
-
* @returns Price info object
|
|
106
|
-
* @throws {IntermediaryError} if the calculated fee is too high
|
|
107
|
-
*
|
|
108
|
-
* @internal
|
|
109
|
-
*/
|
|
110
|
-
async verifyReturnedPrice(lpServiceData, send, amountSats, amountToken, token, feeData, pricePrefetchPromise = Promise.resolve(undefined), usdPricePrefetchPromise = Promise.resolve(undefined), abortSignal) {
|
|
111
|
-
const swapBaseFee = BigInt(lpServiceData.swapBaseFee);
|
|
112
|
-
const swapFeePPM = BigInt(lpServiceData.swapFeePPM);
|
|
113
|
-
if (send && feeData.networkFee != null)
|
|
114
|
-
amountToken = amountToken - feeData.networkFee;
|
|
115
|
-
const [isValidAmount, usdPrice] = await Promise.all([
|
|
116
|
-
send ?
|
|
117
|
-
this._prices.isValidAmountSend(this.chainIdentifier, amountSats, swapBaseFee, swapFeePPM, amountToken, token, abortSignal, await pricePrefetchPromise, feeData.swapFeeBtc) :
|
|
118
|
-
this._prices.isValidAmountReceive(this.chainIdentifier, amountSats, swapBaseFee, swapFeePPM, amountToken, token, abortSignal, await pricePrefetchPromise, feeData.swapFeeBtc),
|
|
119
|
-
usdPricePrefetchPromise.then(value => {
|
|
120
|
-
if (value != null)
|
|
121
|
-
return value;
|
|
122
|
-
return this._prices.preFetchUsdPrice(abortSignal);
|
|
123
|
-
})
|
|
124
|
-
]);
|
|
125
|
-
if (!isValidAmount.isValid)
|
|
126
|
-
throw new IntermediaryError_1.IntermediaryError("Fee too high");
|
|
127
|
-
isValidAmount.realPriceUsdPerBitcoin = usdPrice;
|
|
128
|
-
return isValidAmount;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Starts the interval calling the {@link ISwap._tick} on all the known swaps in tick-enabled states
|
|
132
|
-
* @internal
|
|
133
|
-
*/
|
|
134
|
-
startTickInterval() {
|
|
135
|
-
if (this.tickSwapState == null || this.tickSwapState.length === 0)
|
|
136
|
-
return;
|
|
137
|
-
if (this.tickAbortController != null)
|
|
138
|
-
this.tickAbortController.abort("New tick interval has been started!");
|
|
139
|
-
const abortController = this.tickAbortController = new AbortController();
|
|
140
|
-
let run;
|
|
141
|
-
run = async () => {
|
|
142
|
-
if (!this.isInitialized)
|
|
143
|
-
return;
|
|
144
|
-
await this.tick(undefined, abortController.signal).catch(e => {
|
|
145
|
-
if (abortController.signal.aborted)
|
|
146
|
-
return;
|
|
147
|
-
this.logger.warn("startTickInterval(): Tick on swaps failed, error: ", e);
|
|
148
|
-
});
|
|
149
|
-
if (abortController.signal.aborted)
|
|
150
|
-
return;
|
|
151
|
-
if (!this.isInitialized)
|
|
152
|
-
return;
|
|
153
|
-
this.tickInterval = setTimeout(run, 1000);
|
|
154
|
-
};
|
|
155
|
-
run();
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Runs checks on passed swaps, syncing their state from on-chain data
|
|
159
|
-
*
|
|
160
|
-
* @param pastSwaps Swaps to check
|
|
161
|
-
* @internal
|
|
162
|
-
*/
|
|
163
|
-
async _checkPastSwaps(pastSwaps) {
|
|
164
|
-
const changedSwaps = [];
|
|
165
|
-
const removeSwaps = [];
|
|
166
|
-
await Promise.all(pastSwaps.map((swap) => swap._sync(false).then(changed => {
|
|
167
|
-
if (swap.isQuoteExpired()) {
|
|
168
|
-
removeSwaps.push(swap);
|
|
169
|
-
this.logger.debug("_checkPastSwaps(): Removing expired swap: " + swap.getId());
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
if (changed)
|
|
173
|
-
changedSwaps.push(swap);
|
|
174
|
-
}
|
|
175
|
-
}).catch(e => this.logger.error("_checkPastSwaps(): Error when checking swap " + swap.getId() + ": ", e))));
|
|
176
|
-
return { changedSwaps, removeSwaps };
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Initializes the swap wrapper, needs to be called before any other action can be taken
|
|
180
|
-
*
|
|
181
|
-
* @param noTimers Whether to skip scheduling a tick timer for the swaps, if the tick timer is not initiated
|
|
182
|
-
* the swap states depending on e.g. expiry can be out of sync with the actual expiration of the swap
|
|
183
|
-
* @param noCheckPastSwaps Whether to skip checking past swaps on initialization (by default all pending swaps
|
|
184
|
-
* are re-checked on init, and their state is synchronized from the on-chain data)
|
|
185
|
-
*/
|
|
186
|
-
async init(noTimers = false, noCheckPastSwaps = false) {
|
|
187
|
-
if (this.isInitialized)
|
|
188
|
-
return;
|
|
189
|
-
if (!noCheckPastSwaps) {
|
|
190
|
-
//Save events received in the meantime into the event queue and process them only after we've checked and
|
|
191
|
-
// processed all the past swaps
|
|
192
|
-
let eventQueue = [];
|
|
193
|
-
const initListener = (event, swap) => {
|
|
194
|
-
eventQueue.push({ event, swap });
|
|
195
|
-
return Promise.resolve();
|
|
196
|
-
};
|
|
197
|
-
if (this.processEvent != null)
|
|
198
|
-
this.unifiedChainEvents.registerListener(this.TYPE, initListener, this._swapDeserializer.bind(null, this));
|
|
199
|
-
await this.checkPastSwaps();
|
|
200
|
-
if (this.processEvent != null) {
|
|
201
|
-
//Process accumulated event queue
|
|
202
|
-
for (let event of eventQueue) {
|
|
203
|
-
await this.processEvent(event.event, event.swap);
|
|
204
|
-
}
|
|
205
|
-
//Unregister the temporary event handler
|
|
206
|
-
this.unifiedChainEvents.unregisterListener(this.TYPE);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
if (this.processEvent != null)
|
|
210
|
-
this.unifiedChainEvents.registerListener(this.TYPE, this.processEvent.bind(this), this._swapDeserializer.bind(null, this));
|
|
211
|
-
this.isInitialized = true;
|
|
212
|
-
if (!noTimers)
|
|
213
|
-
this.startTickInterval();
|
|
214
|
-
// this.logger.info("init(): Swap wrapper initialized");
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Un-subscribes from event listeners on the smart chain, terminates the tick interval and stops this wrapper
|
|
218
|
-
*/
|
|
219
|
-
async stop() {
|
|
220
|
-
this.isInitialized = false;
|
|
221
|
-
this.unifiedChainEvents.unregisterListener(this.TYPE);
|
|
222
|
-
this.logger.info("stop(): Swap wrapper stopped");
|
|
223
|
-
if (this.tickInterval != null) {
|
|
224
|
-
clearTimeout(this.tickInterval);
|
|
225
|
-
delete this.tickInterval;
|
|
226
|
-
}
|
|
227
|
-
if (this.tickAbortController != null) {
|
|
228
|
-
this.tickAbortController.abort("Wrapper instance stopped!");
|
|
229
|
-
delete this.tickAbortController;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Runs checks on all the known pending swaps, syncing their state from on-chain data
|
|
234
|
-
*
|
|
235
|
-
* @remarks Doesn't work properly if you pass non-persisted swaps
|
|
236
|
-
*
|
|
237
|
-
* @param pastSwaps Optional array of past swaps to check, otherwise all relevant swaps will be fetched
|
|
238
|
-
* from the persistent storage
|
|
239
|
-
* @param noSave Whether to skip saving the swap changes in the persistent storage
|
|
240
|
-
*/
|
|
241
|
-
async checkPastSwaps(pastSwaps, noSave) {
|
|
242
|
-
if (pastSwaps == null)
|
|
243
|
-
pastSwaps = await this.unifiedStorage.query([[{ key: "type", value: this.TYPE }, { key: "state", value: this._pendingSwapStates }]], (val) => new this._swapDeserializer(this, val));
|
|
244
|
-
const maxParallelSyncs = this._options.maxParallelSwapSyncs ?? exports.DEFAULT_MAX_PARALLEL_SWAP_SYNCS;
|
|
245
|
-
const totalRemoveSwaps = [];
|
|
246
|
-
const totalChangedSwaps = [];
|
|
247
|
-
for (let i = 0; i < pastSwaps.length; i += maxParallelSyncs) {
|
|
248
|
-
const { removeSwaps, changedSwaps } = await this._checkPastSwaps(pastSwaps.slice(i, i + maxParallelSyncs));
|
|
249
|
-
if (!noSave) {
|
|
250
|
-
await this.unifiedStorage.removeAll(removeSwaps);
|
|
251
|
-
await this.unifiedStorage.saveAll(changedSwaps);
|
|
252
|
-
changedSwaps.forEach(swap => swap._emitEvent());
|
|
253
|
-
removeSwaps.forEach(swap => swap._emitEvent());
|
|
254
|
-
}
|
|
255
|
-
totalRemoveSwaps.push(...removeSwaps);
|
|
256
|
-
totalChangedSwaps.push(...changedSwaps);
|
|
257
|
-
}
|
|
258
|
-
return {
|
|
259
|
-
removeSwaps: totalRemoveSwaps,
|
|
260
|
-
changedSwaps: totalChangedSwaps
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Invokes {@link ISwap._tick} on all the known swaps
|
|
265
|
-
*
|
|
266
|
-
* @param swaps Optional array of swaps to invoke `_tick()` on, otherwise all relevant swaps will be fetched
|
|
267
|
-
* from the persistent storage
|
|
268
|
-
* @param abortSignal Abort signal
|
|
269
|
-
*/
|
|
270
|
-
async tick(swaps, abortSignal) {
|
|
271
|
-
if (swaps == null)
|
|
272
|
-
swaps = await this.unifiedStorage.query([[{ key: "type", value: this.TYPE }, { key: "state", value: this.tickSwapState }]], (val) => new this._swapDeserializer(this, val));
|
|
273
|
-
abortSignal?.throwIfAborted();
|
|
274
|
-
const parallelTicks = this._options.maxParallelSwapTicks ?? exports.DEFAULT_MAX_PARALLEL_SWAP_TICKS;
|
|
275
|
-
let promises = [];
|
|
276
|
-
for (let pendingSwap of this.pendingSwaps.values()) {
|
|
277
|
-
const value = pendingSwap.deref();
|
|
278
|
-
if (value != null)
|
|
279
|
-
promises.push(value._tick(true).catch(e => {
|
|
280
|
-
this.logger.warn(`tick(): Error ticking swap ${value.getId()}: `, e);
|
|
281
|
-
}));
|
|
282
|
-
if (promises.length >= parallelTicks) {
|
|
283
|
-
await Promise.all(promises);
|
|
284
|
-
abortSignal?.throwIfAborted();
|
|
285
|
-
promises = [];
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
for (let value of swaps) {
|
|
289
|
-
promises.push(value._tick(true).catch(e => {
|
|
290
|
-
this.logger.warn(`tick(): Error ticking swap ${value.getId()}: `, e);
|
|
291
|
-
}));
|
|
292
|
-
if (promises.length >= parallelTicks) {
|
|
293
|
-
await Promise.all(promises);
|
|
294
|
-
abortSignal?.throwIfAborted();
|
|
295
|
-
promises = [];
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
if (promises.length > 0)
|
|
299
|
-
await Promise.all(promises);
|
|
300
|
-
abortSignal?.throwIfAborted();
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Returns the smart chain's native token used to pay for fees
|
|
304
|
-
* @internal
|
|
305
|
-
*/
|
|
306
|
-
_getNativeToken() {
|
|
307
|
-
return this._tokens[this._chain.getNativeCurrencyAddress()];
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Saves the swap, if it is not initiated it is only saved to pending swaps
|
|
311
|
-
*
|
|
312
|
-
* @param swap Swap to save
|
|
313
|
-
*
|
|
314
|
-
* @internal
|
|
315
|
-
*/
|
|
316
|
-
_saveSwapData(swap) {
|
|
317
|
-
if (!this._options.saveUninitializedSwaps) {
|
|
318
|
-
if (!swap.isInitiated()) {
|
|
319
|
-
this.logger.debug("saveSwapData(): Swap " + swap.getId() + " not initiated, saving to pending swaps");
|
|
320
|
-
this.pendingSwaps.set(swap.getId(), new WeakRef(swap));
|
|
321
|
-
return Promise.resolve();
|
|
322
|
-
}
|
|
323
|
-
else {
|
|
324
|
-
this.pendingSwaps.delete(swap.getId());
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
return this.unifiedStorage.save(swap);
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Removes the swap from the persistent storage and pending swaps
|
|
331
|
-
*
|
|
332
|
-
* @param swap Swap to remove
|
|
333
|
-
*
|
|
334
|
-
* @internal
|
|
335
|
-
*/
|
|
336
|
-
_removeSwapData(swap) {
|
|
337
|
-
this.pendingSwaps.delete(swap.getId());
|
|
338
|
-
if (!swap._persisted)
|
|
339
|
-
return Promise.resolve();
|
|
340
|
-
return this.unifiedStorage.remove(swap);
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Retrieves a swap by its ID from the pending swap mapping
|
|
344
|
-
*
|
|
345
|
-
* @param id
|
|
346
|
-
*
|
|
347
|
-
* @internal
|
|
348
|
-
*/
|
|
349
|
-
_getPendingSwap(id) {
|
|
350
|
-
return this.pendingSwaps.get(id)?.deref() ?? null;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
exports.ISwapWrapper = ISwapWrapper;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ISwapWrapper = exports.DEFAULT_MAX_PARALLEL_SWAP_SYNCS = exports.DEFAULT_MAX_PARALLEL_SWAP_TICKS = void 0;
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
const IntermediaryError_1 = require("../errors/IntermediaryError");
|
|
6
|
+
const Logger_1 = require("../utils/Logger");
|
|
7
|
+
const TokenUtils_1 = require("../utils/TokenUtils");
|
|
8
|
+
const UserError_1 = require("../errors/UserError");
|
|
9
|
+
exports.DEFAULT_MAX_PARALLEL_SWAP_TICKS = 50;
|
|
10
|
+
exports.DEFAULT_MAX_PARALLEL_SWAP_SYNCS = 50;
|
|
11
|
+
/**
|
|
12
|
+
* Base abstract class for swap handler implementations
|
|
13
|
+
*
|
|
14
|
+
* @category Swaps/Base
|
|
15
|
+
*/
|
|
16
|
+
class ISwapWrapper {
|
|
17
|
+
constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, options, events) {
|
|
18
|
+
/**
|
|
19
|
+
* Logger instance
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
this.logger = (0, Logger_1.getLogger)(this.constructor.name + ": ");
|
|
23
|
+
/**
|
|
24
|
+
* In-memory mapping of pending (not initiated) swaps, utilizing weak references to automatically
|
|
25
|
+
* free memory when swaps are dereferenced in not initiated state
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
this.pendingSwaps = new Map();
|
|
29
|
+
/**
|
|
30
|
+
* Whether this wrapper is initialized (have to call {@link init} to initialize a wrapper)
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
this.isInitialized = false;
|
|
34
|
+
if (options?.maxParallelSwapTicks != null && options.maxParallelSwapTicks < 1)
|
|
35
|
+
throw new Error("maxParallelSwapTicks must be at least 1!");
|
|
36
|
+
if (options?.maxParallelSwapSyncs != null && options.maxParallelSwapSyncs < 1)
|
|
37
|
+
throw new Error("maxParallelSwapSyncs must be at least 1!");
|
|
38
|
+
this.unifiedStorage = unifiedStorage;
|
|
39
|
+
this.unifiedChainEvents = unifiedChainEvents;
|
|
40
|
+
this.chainIdentifier = chainIdentifier;
|
|
41
|
+
this._chain = chain;
|
|
42
|
+
this._prices = prices;
|
|
43
|
+
this.events = events || new events_1.EventEmitter();
|
|
44
|
+
this._options = options;
|
|
45
|
+
this._tokens = tokens;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parses the provided gas amount from its `string` or `bigint` representation to `bigint` base units.
|
|
49
|
+
*
|
|
50
|
+
* Defaults to `0n` if no gasAmount is provided
|
|
51
|
+
*
|
|
52
|
+
* @param gasAmount
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
parseGasAmount(gasAmount) {
|
|
56
|
+
let result;
|
|
57
|
+
if (typeof (gasAmount) === "string") {
|
|
58
|
+
result = (0, TokenUtils_1.fromHumanReadableString)(gasAmount, this._getNativeToken());
|
|
59
|
+
if (result == null)
|
|
60
|
+
throw new UserError_1.UserError("Invalid `gasAmount` option provided, not a numerical string!");
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
result = gasAmount;
|
|
64
|
+
}
|
|
65
|
+
return result ?? 0n;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Pre-fetches swap price for a given swap
|
|
69
|
+
*
|
|
70
|
+
* @param amountData Amount data
|
|
71
|
+
* @param abortSignal Abort signal
|
|
72
|
+
* @returns Price of the token in uSats (micro sats)
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
preFetchPrice(amountData, abortSignal) {
|
|
76
|
+
return this._prices.preFetchPrice(this.chainIdentifier, amountData.token, abortSignal).catch(e => {
|
|
77
|
+
this.logger.error("preFetchPrice.token(): Error: ", e);
|
|
78
|
+
return undefined;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Pre-fetches bitcoin's USD price
|
|
83
|
+
*
|
|
84
|
+
* @param abortSignal Abort signal
|
|
85
|
+
* @internal
|
|
86
|
+
*/
|
|
87
|
+
preFetchUsdPrice(abortSignal) {
|
|
88
|
+
return this._prices.preFetchUsdPrice(abortSignal).catch(e => {
|
|
89
|
+
this.logger.error("preFetchPrice.usd(): Error: ", e);
|
|
90
|
+
return undefined;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Verifies returned price for swaps
|
|
95
|
+
*
|
|
96
|
+
* @param lpServiceData Service data for the service in question (TO_BTCLN, TO_BTC, etc.) of the given intermediary
|
|
97
|
+
* @param send Whether this is a send (Smart chain -> Bitcoin) or receive (Bitcoin -> Smart chain) swap
|
|
98
|
+
* @param amountSats Amount in BTC
|
|
99
|
+
* @param amountToken Amount in token
|
|
100
|
+
* @param token Token used in the swap
|
|
101
|
+
* @param feeData Fee data as returned by the intermediary
|
|
102
|
+
* @param pricePrefetchPromise Optional price pre-fetch promise
|
|
103
|
+
* @param usdPricePrefetchPromise Optiona USD price pre-fetch promise
|
|
104
|
+
* @param abortSignal Abort signal
|
|
105
|
+
* @returns Price info object
|
|
106
|
+
* @throws {IntermediaryError} if the calculated fee is too high
|
|
107
|
+
*
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
async verifyReturnedPrice(lpServiceData, send, amountSats, amountToken, token, feeData, pricePrefetchPromise = Promise.resolve(undefined), usdPricePrefetchPromise = Promise.resolve(undefined), abortSignal) {
|
|
111
|
+
const swapBaseFee = BigInt(lpServiceData.swapBaseFee);
|
|
112
|
+
const swapFeePPM = BigInt(lpServiceData.swapFeePPM);
|
|
113
|
+
if (send && feeData.networkFee != null)
|
|
114
|
+
amountToken = amountToken - feeData.networkFee;
|
|
115
|
+
const [isValidAmount, usdPrice] = await Promise.all([
|
|
116
|
+
send ?
|
|
117
|
+
this._prices.isValidAmountSend(this.chainIdentifier, amountSats, swapBaseFee, swapFeePPM, amountToken, token, abortSignal, await pricePrefetchPromise, feeData.swapFeeBtc) :
|
|
118
|
+
this._prices.isValidAmountReceive(this.chainIdentifier, amountSats, swapBaseFee, swapFeePPM, amountToken, token, abortSignal, await pricePrefetchPromise, feeData.swapFeeBtc),
|
|
119
|
+
usdPricePrefetchPromise.then(value => {
|
|
120
|
+
if (value != null)
|
|
121
|
+
return value;
|
|
122
|
+
return this._prices.preFetchUsdPrice(abortSignal);
|
|
123
|
+
})
|
|
124
|
+
]);
|
|
125
|
+
if (!isValidAmount.isValid)
|
|
126
|
+
throw new IntermediaryError_1.IntermediaryError("Fee too high");
|
|
127
|
+
isValidAmount.realPriceUsdPerBitcoin = usdPrice;
|
|
128
|
+
return isValidAmount;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Starts the interval calling the {@link ISwap._tick} on all the known swaps in tick-enabled states
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
startTickInterval() {
|
|
135
|
+
if (this.tickSwapState == null || this.tickSwapState.length === 0)
|
|
136
|
+
return;
|
|
137
|
+
if (this.tickAbortController != null)
|
|
138
|
+
this.tickAbortController.abort("New tick interval has been started!");
|
|
139
|
+
const abortController = this.tickAbortController = new AbortController();
|
|
140
|
+
let run;
|
|
141
|
+
run = async () => {
|
|
142
|
+
if (!this.isInitialized)
|
|
143
|
+
return;
|
|
144
|
+
await this.tick(undefined, abortController.signal).catch(e => {
|
|
145
|
+
if (abortController.signal.aborted)
|
|
146
|
+
return;
|
|
147
|
+
this.logger.warn("startTickInterval(): Tick on swaps failed, error: ", e);
|
|
148
|
+
});
|
|
149
|
+
if (abortController.signal.aborted)
|
|
150
|
+
return;
|
|
151
|
+
if (!this.isInitialized)
|
|
152
|
+
return;
|
|
153
|
+
this.tickInterval = setTimeout(run, 1000);
|
|
154
|
+
};
|
|
155
|
+
run();
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Runs checks on passed swaps, syncing their state from on-chain data
|
|
159
|
+
*
|
|
160
|
+
* @param pastSwaps Swaps to check
|
|
161
|
+
* @internal
|
|
162
|
+
*/
|
|
163
|
+
async _checkPastSwaps(pastSwaps) {
|
|
164
|
+
const changedSwaps = [];
|
|
165
|
+
const removeSwaps = [];
|
|
166
|
+
await Promise.all(pastSwaps.map((swap) => swap._sync(false).then(changed => {
|
|
167
|
+
if (swap.isQuoteExpired()) {
|
|
168
|
+
removeSwaps.push(swap);
|
|
169
|
+
this.logger.debug("_checkPastSwaps(): Removing expired swap: " + swap.getId());
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
if (changed)
|
|
173
|
+
changedSwaps.push(swap);
|
|
174
|
+
}
|
|
175
|
+
}).catch(e => this.logger.error("_checkPastSwaps(): Error when checking swap " + swap.getId() + ": ", e))));
|
|
176
|
+
return { changedSwaps, removeSwaps };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Initializes the swap wrapper, needs to be called before any other action can be taken
|
|
180
|
+
*
|
|
181
|
+
* @param noTimers Whether to skip scheduling a tick timer for the swaps, if the tick timer is not initiated
|
|
182
|
+
* the swap states depending on e.g. expiry can be out of sync with the actual expiration of the swap
|
|
183
|
+
* @param noCheckPastSwaps Whether to skip checking past swaps on initialization (by default all pending swaps
|
|
184
|
+
* are re-checked on init, and their state is synchronized from the on-chain data)
|
|
185
|
+
*/
|
|
186
|
+
async init(noTimers = false, noCheckPastSwaps = false) {
|
|
187
|
+
if (this.isInitialized)
|
|
188
|
+
return;
|
|
189
|
+
if (!noCheckPastSwaps) {
|
|
190
|
+
//Save events received in the meantime into the event queue and process them only after we've checked and
|
|
191
|
+
// processed all the past swaps
|
|
192
|
+
let eventQueue = [];
|
|
193
|
+
const initListener = (event, swap) => {
|
|
194
|
+
eventQueue.push({ event, swap });
|
|
195
|
+
return Promise.resolve();
|
|
196
|
+
};
|
|
197
|
+
if (this.processEvent != null)
|
|
198
|
+
this.unifiedChainEvents.registerListener(this.TYPE, initListener, this._swapDeserializer.bind(null, this));
|
|
199
|
+
await this.checkPastSwaps();
|
|
200
|
+
if (this.processEvent != null) {
|
|
201
|
+
//Process accumulated event queue
|
|
202
|
+
for (let event of eventQueue) {
|
|
203
|
+
await this.processEvent(event.event, event.swap);
|
|
204
|
+
}
|
|
205
|
+
//Unregister the temporary event handler
|
|
206
|
+
this.unifiedChainEvents.unregisterListener(this.TYPE);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (this.processEvent != null)
|
|
210
|
+
this.unifiedChainEvents.registerListener(this.TYPE, this.processEvent.bind(this), this._swapDeserializer.bind(null, this));
|
|
211
|
+
this.isInitialized = true;
|
|
212
|
+
if (!noTimers)
|
|
213
|
+
this.startTickInterval();
|
|
214
|
+
// this.logger.info("init(): Swap wrapper initialized");
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Un-subscribes from event listeners on the smart chain, terminates the tick interval and stops this wrapper
|
|
218
|
+
*/
|
|
219
|
+
async stop() {
|
|
220
|
+
this.isInitialized = false;
|
|
221
|
+
this.unifiedChainEvents.unregisterListener(this.TYPE);
|
|
222
|
+
this.logger.info("stop(): Swap wrapper stopped");
|
|
223
|
+
if (this.tickInterval != null) {
|
|
224
|
+
clearTimeout(this.tickInterval);
|
|
225
|
+
delete this.tickInterval;
|
|
226
|
+
}
|
|
227
|
+
if (this.tickAbortController != null) {
|
|
228
|
+
this.tickAbortController.abort("Wrapper instance stopped!");
|
|
229
|
+
delete this.tickAbortController;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Runs checks on all the known pending swaps, syncing their state from on-chain data
|
|
234
|
+
*
|
|
235
|
+
* @remarks Doesn't work properly if you pass non-persisted swaps
|
|
236
|
+
*
|
|
237
|
+
* @param pastSwaps Optional array of past swaps to check, otherwise all relevant swaps will be fetched
|
|
238
|
+
* from the persistent storage
|
|
239
|
+
* @param noSave Whether to skip saving the swap changes in the persistent storage
|
|
240
|
+
*/
|
|
241
|
+
async checkPastSwaps(pastSwaps, noSave) {
|
|
242
|
+
if (pastSwaps == null)
|
|
243
|
+
pastSwaps = await this.unifiedStorage.query([[{ key: "type", value: this.TYPE }, { key: "state", value: this._pendingSwapStates }]], (val) => new this._swapDeserializer(this, val));
|
|
244
|
+
const maxParallelSyncs = this._options.maxParallelSwapSyncs ?? exports.DEFAULT_MAX_PARALLEL_SWAP_SYNCS;
|
|
245
|
+
const totalRemoveSwaps = [];
|
|
246
|
+
const totalChangedSwaps = [];
|
|
247
|
+
for (let i = 0; i < pastSwaps.length; i += maxParallelSyncs) {
|
|
248
|
+
const { removeSwaps, changedSwaps } = await this._checkPastSwaps(pastSwaps.slice(i, i + maxParallelSyncs));
|
|
249
|
+
if (!noSave) {
|
|
250
|
+
await this.unifiedStorage.removeAll(removeSwaps);
|
|
251
|
+
await this.unifiedStorage.saveAll(changedSwaps);
|
|
252
|
+
changedSwaps.forEach(swap => swap._emitEvent());
|
|
253
|
+
removeSwaps.forEach(swap => swap._emitEvent());
|
|
254
|
+
}
|
|
255
|
+
totalRemoveSwaps.push(...removeSwaps);
|
|
256
|
+
totalChangedSwaps.push(...changedSwaps);
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
removeSwaps: totalRemoveSwaps,
|
|
260
|
+
changedSwaps: totalChangedSwaps
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Invokes {@link ISwap._tick} on all the known swaps
|
|
265
|
+
*
|
|
266
|
+
* @param swaps Optional array of swaps to invoke `_tick()` on, otherwise all relevant swaps will be fetched
|
|
267
|
+
* from the persistent storage
|
|
268
|
+
* @param abortSignal Abort signal
|
|
269
|
+
*/
|
|
270
|
+
async tick(swaps, abortSignal) {
|
|
271
|
+
if (swaps == null)
|
|
272
|
+
swaps = await this.unifiedStorage.query([[{ key: "type", value: this.TYPE }, { key: "state", value: this.tickSwapState }]], (val) => new this._swapDeserializer(this, val));
|
|
273
|
+
abortSignal?.throwIfAborted();
|
|
274
|
+
const parallelTicks = this._options.maxParallelSwapTicks ?? exports.DEFAULT_MAX_PARALLEL_SWAP_TICKS;
|
|
275
|
+
let promises = [];
|
|
276
|
+
for (let pendingSwap of this.pendingSwaps.values()) {
|
|
277
|
+
const value = pendingSwap.deref();
|
|
278
|
+
if (value != null)
|
|
279
|
+
promises.push(value._tick(true).catch(e => {
|
|
280
|
+
this.logger.warn(`tick(): Error ticking swap ${value.getId()}: `, e);
|
|
281
|
+
}));
|
|
282
|
+
if (promises.length >= parallelTicks) {
|
|
283
|
+
await Promise.all(promises);
|
|
284
|
+
abortSignal?.throwIfAborted();
|
|
285
|
+
promises = [];
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
for (let value of swaps) {
|
|
289
|
+
promises.push(value._tick(true).catch(e => {
|
|
290
|
+
this.logger.warn(`tick(): Error ticking swap ${value.getId()}: `, e);
|
|
291
|
+
}));
|
|
292
|
+
if (promises.length >= parallelTicks) {
|
|
293
|
+
await Promise.all(promises);
|
|
294
|
+
abortSignal?.throwIfAborted();
|
|
295
|
+
promises = [];
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (promises.length > 0)
|
|
299
|
+
await Promise.all(promises);
|
|
300
|
+
abortSignal?.throwIfAborted();
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Returns the smart chain's native token used to pay for fees
|
|
304
|
+
* @internal
|
|
305
|
+
*/
|
|
306
|
+
_getNativeToken() {
|
|
307
|
+
return this._tokens[this._chain.getNativeCurrencyAddress()];
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Saves the swap, if it is not initiated it is only saved to pending swaps
|
|
311
|
+
*
|
|
312
|
+
* @param swap Swap to save
|
|
313
|
+
*
|
|
314
|
+
* @internal
|
|
315
|
+
*/
|
|
316
|
+
_saveSwapData(swap) {
|
|
317
|
+
if (!this._options.saveUninitializedSwaps) {
|
|
318
|
+
if (!swap.isInitiated()) {
|
|
319
|
+
this.logger.debug("saveSwapData(): Swap " + swap.getId() + " not initiated, saving to pending swaps");
|
|
320
|
+
this.pendingSwaps.set(swap.getId(), new WeakRef(swap));
|
|
321
|
+
return Promise.resolve();
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
this.pendingSwaps.delete(swap.getId());
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return this.unifiedStorage.save(swap);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Removes the swap from the persistent storage and pending swaps
|
|
331
|
+
*
|
|
332
|
+
* @param swap Swap to remove
|
|
333
|
+
*
|
|
334
|
+
* @internal
|
|
335
|
+
*/
|
|
336
|
+
_removeSwapData(swap) {
|
|
337
|
+
this.pendingSwaps.delete(swap.getId());
|
|
338
|
+
if (!swap._persisted)
|
|
339
|
+
return Promise.resolve();
|
|
340
|
+
return this.unifiedStorage.remove(swap);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Retrieves a swap by its ID from the pending swap mapping
|
|
344
|
+
*
|
|
345
|
+
* @param id
|
|
346
|
+
*
|
|
347
|
+
* @internal
|
|
348
|
+
*/
|
|
349
|
+
_getPendingSwap(id) {
|
|
350
|
+
return this.pendingSwaps.get(id)?.deref() ?? null;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
exports.ISwapWrapper = ISwapWrapper;
|