@atomiqlabs/sdk 8.6.6 → 8.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +176 -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
|
@@ -1,467 +1,467 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SwapperUtils = void 0;
|
|
4
|
-
const bolt11_1 = require("@atomiqlabs/bolt11");
|
|
5
|
-
const btc_signer_1 = require("@scure/btc-signer");
|
|
6
|
-
const LNURL_1 = require("../lnurl/LNURL");
|
|
7
|
-
const SwapType_1 = require("../enums/SwapType");
|
|
8
|
-
const SingleAddressBitcoinWallet_1 = require("../bitcoin/wallet/SingleAddressBitcoinWallet");
|
|
9
|
-
const base_1 = require("@atomiqlabs/base");
|
|
10
|
-
const Utils_1 = require("../utils/Utils");
|
|
11
|
-
const TokenAmount_1 = require("../types/TokenAmount");
|
|
12
|
-
const Token_1 = require("../types/Token");
|
|
13
|
-
const LNURLWithdraw_1 = require("../types/lnurl/LNURLWithdraw");
|
|
14
|
-
const LNURLPay_1 = require("../types/lnurl/LNURLPay");
|
|
15
|
-
const BitcoinWalletUtils_1 = require("../utils/BitcoinWalletUtils");
|
|
16
|
-
/**
|
|
17
|
-
* Utility class providing helper methods for address parsing, token balances, serialization
|
|
18
|
-
* and other miscellaneous things.
|
|
19
|
-
*
|
|
20
|
-
* @category Core
|
|
21
|
-
*/
|
|
22
|
-
class SwapperUtils {
|
|
23
|
-
constructor(root) {
|
|
24
|
-
this.bitcoinNetwork = root._btcNetwork;
|
|
25
|
-
this.root = root;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Checks whether a passed address is a valid address on the smart chain
|
|
29
|
-
*
|
|
30
|
-
* @param address Address
|
|
31
|
-
* @param chainId Smart chain identifier string to check the address for
|
|
32
|
-
*/
|
|
33
|
-
isValidSmartChainAddress(address, chainId) {
|
|
34
|
-
if (chainId != null) {
|
|
35
|
-
if (this.root._chains[chainId] == null)
|
|
36
|
-
throw new Error(`Unknown chain id: ${chainId}`);
|
|
37
|
-
return this.root._chains[chainId].chainInterface.isValidAddress(address);
|
|
38
|
-
}
|
|
39
|
-
for (let chainId of this.root.getSmartChains()) {
|
|
40
|
-
if (this.root._chains[chainId].chainInterface.isValidAddress(address))
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Checks whether an address is a valid BOLT11 bitcoin lightning invoice
|
|
47
|
-
*
|
|
48
|
-
* @param address Address to check
|
|
49
|
-
*/
|
|
50
|
-
isLightningInvoice(address) {
|
|
51
|
-
try {
|
|
52
|
-
(0, bolt11_1.decode)(address);
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
catch (e) { }
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Checks whether an address is a valid bitcoin address
|
|
60
|
-
*
|
|
61
|
-
* @param address Address to check
|
|
62
|
-
*/
|
|
63
|
-
isValidBitcoinAddress(address) {
|
|
64
|
-
try {
|
|
65
|
-
(0, btc_signer_1.Address)(this.bitcoinNetwork).decode(address);
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
catch (e) {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Checks whether an address is a valid BOLT11 bitcoin lightning invoice WITH AMOUNT
|
|
74
|
-
*
|
|
75
|
-
* @param address Address to check
|
|
76
|
-
*/
|
|
77
|
-
isValidLightningInvoice(address) {
|
|
78
|
-
try {
|
|
79
|
-
const parsed = (0, bolt11_1.decode)(address);
|
|
80
|
-
if (parsed.millisatoshis != null)
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
catch (e) { }
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Checks whether an address is a valid LNURL (no checking on type is performed)
|
|
88
|
-
*
|
|
89
|
-
* @param address Address to check
|
|
90
|
-
*/
|
|
91
|
-
isValidLNURL(address) {
|
|
92
|
-
return LNURL_1.LNURL.isLNURL(address);
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Returns type and data about an LNURL
|
|
96
|
-
*
|
|
97
|
-
* @param lnurl LNURL link to check, can be either `pay` or `withdraw` type
|
|
98
|
-
* @param shouldRetry Optional whether HTTP requests should retried on failure
|
|
99
|
-
*/
|
|
100
|
-
getLNURLTypeAndData(lnurl, shouldRetry) {
|
|
101
|
-
return LNURL_1.LNURL.getLNURLType(lnurl, shouldRetry);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Returns satoshi value of BOLT11 bitcoin lightning invoice WITH AMOUNT, returns null otherwise
|
|
105
|
-
*
|
|
106
|
-
* @param lnpr
|
|
107
|
-
*/
|
|
108
|
-
getLightningInvoiceValue(lnpr) {
|
|
109
|
-
const parsed = (0, bolt11_1.decode)(lnpr);
|
|
110
|
-
if (parsed.millisatoshis != null)
|
|
111
|
-
return (BigInt(parsed.millisatoshis) + 999n) / 1000n;
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
parseBitcoinAddress(resultText) {
|
|
115
|
-
let _amount = undefined;
|
|
116
|
-
if (resultText.includes("?")) {
|
|
117
|
-
const arr = resultText.split("?");
|
|
118
|
-
resultText = arr[0];
|
|
119
|
-
const params = arr[1].split("&");
|
|
120
|
-
for (let param of params) {
|
|
121
|
-
const arr2 = param.split("=");
|
|
122
|
-
const key = arr2[0];
|
|
123
|
-
const value = decodeURIComponent(arr2[1]);
|
|
124
|
-
if (key === "amount") {
|
|
125
|
-
_amount = (0, Utils_1.fromDecimal)(parseFloat(value).toFixed(8), 8);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (this.isValidBitcoinAddress(resultText)) {
|
|
130
|
-
return {
|
|
131
|
-
address: resultText,
|
|
132
|
-
type: "BITCOIN",
|
|
133
|
-
swapType: SwapType_1.SwapType.TO_BTC,
|
|
134
|
-
amount: _amount == null ? undefined : (0, TokenAmount_1.toTokenAmount)(_amount, Token_1.BitcoinTokens.BTC, this.root.prices)
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
parseLNURLSync(resultText) {
|
|
140
|
-
if (this.isValidLNURL(resultText)) {
|
|
141
|
-
return {
|
|
142
|
-
address: resultText,
|
|
143
|
-
type: "LNURL",
|
|
144
|
-
swapType: null
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
async parseLNURL(resultText) {
|
|
150
|
-
if (this.isValidLNURL(resultText)) {
|
|
151
|
-
try {
|
|
152
|
-
const result = await this.getLNURLTypeAndData(resultText);
|
|
153
|
-
if (result == null)
|
|
154
|
-
throw new Error("Invalid LNURL specified!");
|
|
155
|
-
const swapType = (0, LNURLPay_1.isLNURLPay)(result) ? SwapType_1.SwapType.TO_BTCLN : (0, LNURLWithdraw_1.isLNURLWithdraw)(result) ? SwapType_1.SwapType.FROM_BTCLN : null;
|
|
156
|
-
if (swapType == null)
|
|
157
|
-
return null;
|
|
158
|
-
const response = {
|
|
159
|
-
address: resultText,
|
|
160
|
-
type: "LNURL",
|
|
161
|
-
swapType,
|
|
162
|
-
lnurl: result
|
|
163
|
-
};
|
|
164
|
-
if (result.min === result.max) {
|
|
165
|
-
return {
|
|
166
|
-
...response,
|
|
167
|
-
amount: result.min == null ? undefined : (0, TokenAmount_1.toTokenAmount)(result.min, Token_1.BitcoinTokens.BTCLN, this.root.prices)
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
return {
|
|
172
|
-
...response,
|
|
173
|
-
min: result.min == null ? undefined : (0, TokenAmount_1.toTokenAmount)(result.min, Token_1.BitcoinTokens.BTCLN, this.root.prices),
|
|
174
|
-
max: result.min == null ? undefined : (0, TokenAmount_1.toTokenAmount)(result.max, Token_1.BitcoinTokens.BTCLN, this.root.prices)
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
catch (e) {
|
|
179
|
-
throw new Error("Failed to contact LNURL service, check your internet connection and retry later.");
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return null;
|
|
183
|
-
}
|
|
184
|
-
parseLightningInvoice(resultText) {
|
|
185
|
-
if (this.isLightningInvoice(resultText)) {
|
|
186
|
-
if (this.isValidLightningInvoice(resultText)) {
|
|
187
|
-
const amount = this.getLightningInvoiceValue(resultText);
|
|
188
|
-
if (amount == null)
|
|
189
|
-
throw new Error();
|
|
190
|
-
return {
|
|
191
|
-
address: resultText,
|
|
192
|
-
type: "LIGHTNING",
|
|
193
|
-
swapType: SwapType_1.SwapType.TO_BTCLN,
|
|
194
|
-
amount: (0, TokenAmount_1.toTokenAmount)(amount, Token_1.BitcoinTokens.BTCLN, this.root.prices)
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
throw new Error("Lightning invoice needs to contain an amount!");
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return null;
|
|
202
|
-
}
|
|
203
|
-
parseSmartchainAddress(resultText) {
|
|
204
|
-
for (let chainId of this.root.getSmartChains()) {
|
|
205
|
-
if (this.root._chains[chainId].chainInterface.isValidAddress(resultText)) {
|
|
206
|
-
return {
|
|
207
|
-
address: resultText,
|
|
208
|
-
type: chainId,
|
|
209
|
-
swapType: null
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return null;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* General parser for bitcoin addresses, LNURLs, lightning invoices, smart chain addresses. Also fetches LNURL data
|
|
217
|
-
* (hence async and returns Promise).
|
|
218
|
-
*
|
|
219
|
-
* @param addressString Address to parse
|
|
220
|
-
* @throws {Error} Error in address parsing
|
|
221
|
-
* @returns Address data or `null` if address doesn't conform to any known format
|
|
222
|
-
*/
|
|
223
|
-
async parseAddress(addressString) {
|
|
224
|
-
if (addressString.startsWith("bitcoin:")) {
|
|
225
|
-
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString.substring(8));
|
|
226
|
-
if (parsedBitcoinAddress != null)
|
|
227
|
-
return parsedBitcoinAddress;
|
|
228
|
-
throw new Error("Invalid bitcoin address!");
|
|
229
|
-
}
|
|
230
|
-
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString);
|
|
231
|
-
if (parsedBitcoinAddress != null)
|
|
232
|
-
return parsedBitcoinAddress;
|
|
233
|
-
if (addressString.startsWith("lightning:")) {
|
|
234
|
-
const resultText = addressString.substring(10);
|
|
235
|
-
const resultLnurl = await this.parseLNURL(resultText);
|
|
236
|
-
if (resultLnurl != null)
|
|
237
|
-
return resultLnurl;
|
|
238
|
-
const resultLightningInvoice = this.parseLightningInvoice(resultText);
|
|
239
|
-
if (resultLightningInvoice != null)
|
|
240
|
-
return resultLightningInvoice;
|
|
241
|
-
throw new Error("Invalid lightning network invoice or LNURL!");
|
|
242
|
-
}
|
|
243
|
-
const resultLnurl = await this.parseLNURL(addressString);
|
|
244
|
-
if (resultLnurl != null)
|
|
245
|
-
return resultLnurl;
|
|
246
|
-
const resultLightningInvoice = this.parseLightningInvoice(addressString);
|
|
247
|
-
if (resultLightningInvoice != null)
|
|
248
|
-
return resultLightningInvoice;
|
|
249
|
-
return this.parseSmartchainAddress(addressString);
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Synchronous general parser for bitcoin addresses, LNURLs, lightning invoices, smart chain addresses, doesn't fetch
|
|
253
|
-
* LNURL data, returns `swapType: null` instead to prevent returning a Promise
|
|
254
|
-
*
|
|
255
|
-
* @param addressString Address to parse
|
|
256
|
-
* @throws {Error} Error in address parsing
|
|
257
|
-
* @returns Address data or `null` if address doesn't conform to any known format
|
|
258
|
-
*/
|
|
259
|
-
parseAddressSync(addressString) {
|
|
260
|
-
if (addressString.startsWith("bitcoin:")) {
|
|
261
|
-
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString.substring(8));
|
|
262
|
-
if (parsedBitcoinAddress != null)
|
|
263
|
-
return parsedBitcoinAddress;
|
|
264
|
-
throw new Error("Invalid bitcoin address!");
|
|
265
|
-
}
|
|
266
|
-
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString);
|
|
267
|
-
if (parsedBitcoinAddress != null)
|
|
268
|
-
return parsedBitcoinAddress;
|
|
269
|
-
if (addressString.startsWith("lightning:")) {
|
|
270
|
-
const resultText = addressString.substring(10);
|
|
271
|
-
const resultLnurl = this.parseLNURLSync(resultText);
|
|
272
|
-
if (resultLnurl != null)
|
|
273
|
-
return resultLnurl;
|
|
274
|
-
const resultLightningInvoice = this.parseLightningInvoice(resultText);
|
|
275
|
-
if (resultLightningInvoice != null)
|
|
276
|
-
return resultLightningInvoice;
|
|
277
|
-
throw new Error("Invalid lightning network invoice or LNURL!");
|
|
278
|
-
}
|
|
279
|
-
const resultLnurl = this.parseLNURLSync(addressString);
|
|
280
|
-
if (resultLnurl != null)
|
|
281
|
-
return resultLnurl;
|
|
282
|
-
const resultLightningInvoice = this.parseLightningInvoice(addressString);
|
|
283
|
-
if (resultLightningInvoice != null)
|
|
284
|
-
return resultLightningInvoice;
|
|
285
|
-
return this.parseSmartchainAddress(addressString);
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Returns a random PSBT that can be used for fee estimation for SPV vault (UTXO-controlled vault) based swaps
|
|
289
|
-
* {@link SwapType.SPV_VAULT_FROM_BTC}, the last output (the LP output) is omitted to allow for coinselection
|
|
290
|
-
* algorithm to determine maximum sendable amount there
|
|
291
|
-
*
|
|
292
|
-
* @param chainIdentifier Smart chain to swap to
|
|
293
|
-
* @param includeGasToken Whether to return the PSBT also with the gas token amount (increases the vSize by 8)
|
|
294
|
-
*/
|
|
295
|
-
getRandomSpvVaultPsbt(chainIdentifier, includeGasToken) {
|
|
296
|
-
const wrapper = this.root._chains[chainIdentifier].wrappers[SwapType_1.SwapType.SPV_VAULT_FROM_BTC];
|
|
297
|
-
if (wrapper == null)
|
|
298
|
-
throw new Error("Chain doesn't support spv vault swaps!");
|
|
299
|
-
return wrapper.getDummySwapPsbt(includeGasToken);
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Returns the spendable balance of a bitcoin wallet
|
|
303
|
-
*
|
|
304
|
-
* @param wallet Bitcoin wallet to check the spendable balance for, can either be a simple
|
|
305
|
-
* bitcoin address string or a wallet object
|
|
306
|
-
* @param targetChain Destination smart chain for the swap, the ensures proper spendable balance
|
|
307
|
-
* is estimated taking into consideration different swap primitives available on different chains
|
|
308
|
-
* @param options Additional options
|
|
309
|
-
*/
|
|
310
|
-
async getBitcoinSpendableBalance(wallet, targetChain, options) {
|
|
311
|
-
let bitcoinWallet;
|
|
312
|
-
if (typeof (wallet) === "string") {
|
|
313
|
-
bitcoinWallet = new SingleAddressBitcoinWallet_1.SingleAddressBitcoinWallet(this.root._bitcoinRpc, this.bitcoinNetwork, { address: wallet, publicKey: "" });
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
bitcoinWallet = (0, BitcoinWalletUtils_1.toBitcoinWallet)(wallet, this.root._bitcoinRpc, this.bitcoinNetwork);
|
|
317
|
-
}
|
|
318
|
-
let feeRate = options?.feeRate ?? await bitcoinWallet.getFeeRate();
|
|
319
|
-
if (options?.minFeeRate != null)
|
|
320
|
-
feeRate = Math.max(feeRate, options.minFeeRate);
|
|
321
|
-
let result;
|
|
322
|
-
if (targetChain != null && this.root.supportsSwapType(targetChain, SwapType_1.SwapType.SPV_VAULT_FROM_BTC)) {
|
|
323
|
-
result = await bitcoinWallet.getSpendableBalance(this.getRandomSpvVaultPsbt(targetChain, options?.gasDrop), feeRate);
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
result = await bitcoinWallet.getSpendableBalance(undefined, feeRate);
|
|
327
|
-
}
|
|
328
|
-
return {
|
|
329
|
-
balance: (0, TokenAmount_1.toTokenAmount)(result.balance, Token_1.BitcoinTokens.BTC, this.root.prices),
|
|
330
|
-
feeRate: result.feeRate
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Returns the maximum spendable balance of the smart chain wallet, deducting the fee needed
|
|
335
|
-
* to initiate a swap for native balances
|
|
336
|
-
*/
|
|
337
|
-
async getSpendableBalance(wallet, token, options) {
|
|
338
|
-
if (this.root._chains[token.chainId] == null)
|
|
339
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + token.chainId);
|
|
340
|
-
const { swapContract, chainInterface } = this.root._chains[token.chainId];
|
|
341
|
-
let signer;
|
|
342
|
-
if (typeof (wallet) === "string") {
|
|
343
|
-
signer = wallet;
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
const abstractSigner = (0, base_1.isAbstractSigner)(wallet) ? wallet : await chainInterface.wrapSigner(wallet);
|
|
347
|
-
signer = abstractSigner.getAddress();
|
|
348
|
-
}
|
|
349
|
-
let finalBalance;
|
|
350
|
-
if (chainInterface.getNativeCurrencyAddress() !== token.address) {
|
|
351
|
-
finalBalance = await chainInterface.getBalance(signer, token.address);
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
let [balance, commitFee] = await Promise.all([
|
|
355
|
-
chainInterface.getBalance(signer, token.address),
|
|
356
|
-
swapContract.getCommitFee(signer,
|
|
357
|
-
//Use large amount, such that the fee for wrapping more tokens is always included!
|
|
358
|
-
await swapContract.createSwapData(base_1.ChainSwapType.HTLC, signer, chainInterface.randomAddress(), token.address, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn, swapContract.getHashForHtlc((0, Utils_1.randomBytes)(32)).toString("hex"), base_1.BigIntBufferUtils.fromBuffer((0, Utils_1.randomBytes)(8)), BigInt(Math.floor(Date.now() / 1000)), true, false, base_1.BigIntBufferUtils.fromBuffer((0, Utils_1.randomBytes)(2)), base_1.BigIntBufferUtils.fromBuffer((0, Utils_1.randomBytes)(2))), options?.feeRate)
|
|
359
|
-
]);
|
|
360
|
-
if (options?.feeMultiplier != null) {
|
|
361
|
-
commitFee = commitFee * (BigInt(Math.floor(options.feeMultiplier * 1000000))) / 1000000n;
|
|
362
|
-
}
|
|
363
|
-
finalBalance = (0, Utils_1.bigIntMax)(balance - commitFee, 0n);
|
|
364
|
-
}
|
|
365
|
-
return (0, TokenAmount_1.toTokenAmount)(finalBalance, token, this.root.prices);
|
|
366
|
-
}
|
|
367
|
-
/**
|
|
368
|
-
* Returns the address of the native currency of the smart chain
|
|
369
|
-
*/
|
|
370
|
-
getNativeToken(chainIdentifier) {
|
|
371
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
372
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
373
|
-
return this.root._tokens[chainIdentifier][this.root._chains[chainIdentifier].chainInterface.getNativeCurrencyAddress()];
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Returns a random signer for a given smart chain
|
|
377
|
-
*
|
|
378
|
-
* @param chainIdentifier
|
|
379
|
-
*/
|
|
380
|
-
randomSigner(chainIdentifier) {
|
|
381
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
382
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
383
|
-
return this.root._chains[chainIdentifier].chainInterface.randomSigner();
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Returns a random address for a given smart chain
|
|
387
|
-
*
|
|
388
|
-
* @param chainIdentifier
|
|
389
|
-
*/
|
|
390
|
-
randomAddress(chainIdentifier) {
|
|
391
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
392
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
393
|
-
return this.root._chains[chainIdentifier].chainInterface.randomAddress();
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Signs and broadcasts the supplied smart chain transaction
|
|
397
|
-
*
|
|
398
|
-
* @param chainIdentifier Smart chain identifier string
|
|
399
|
-
* @param signer Signer to use for signing the transactions
|
|
400
|
-
* @param txs An array of transactions to sign
|
|
401
|
-
* @param abortSignal Abort signal
|
|
402
|
-
* @param onBeforePublish Callback invoked before a transaction is sent (invoked for every transaction to be sent)
|
|
403
|
-
*/
|
|
404
|
-
sendAndConfirm(chainIdentifier, signer, txs, abortSignal, onBeforePublish) {
|
|
405
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
406
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
407
|
-
return this.root._chains[chainIdentifier].chainInterface.sendAndConfirm(signer, txs, true, abortSignal, false, onBeforePublish);
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* Broadcasts already signed smart chain transactions
|
|
411
|
-
*
|
|
412
|
-
* @param chainIdentifier Smart chain identifier string
|
|
413
|
-
* @param txs An array of already signed transactions
|
|
414
|
-
* @param abortSignal Abort signal
|
|
415
|
-
* @param onBeforePublish Callback invoked before a transaction is sent (invoked for every transaction to be sent)
|
|
416
|
-
*/
|
|
417
|
-
sendSignedAndConfirm(chainIdentifier, txs, abortSignal, onBeforePublish) {
|
|
418
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
419
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
420
|
-
return this.root._chains[chainIdentifier].chainInterface.sendSignedAndConfirm(txs, true, abortSignal, false, onBeforePublish);
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Serializes an unsigned smart chain transaction
|
|
424
|
-
*
|
|
425
|
-
* @param chainIdentifier Smart chain string identifier
|
|
426
|
-
* @param tx An unsigned transaction to serialize
|
|
427
|
-
*/
|
|
428
|
-
serializeUnsignedTransaction(chainIdentifier, tx) {
|
|
429
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
430
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
431
|
-
return this.root._chains[chainIdentifier].chainInterface.serializeTx(tx);
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Deserializes an unsigned smart chain transaction
|
|
435
|
-
*
|
|
436
|
-
* @param chainIdentifier Smart chain string identifier
|
|
437
|
-
* @param tx Serialized unsigned transaction
|
|
438
|
-
*/
|
|
439
|
-
deserializeUnsignedTransaction(chainIdentifier, tx) {
|
|
440
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
441
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
442
|
-
return this.root._chains[chainIdentifier].chainInterface.deserializeTx(tx);
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Serializes a signed smart chain transaction
|
|
446
|
-
*
|
|
447
|
-
* @param chainIdentifier Smart chain string identifier
|
|
448
|
-
* @param tx A signed transaction to serialize
|
|
449
|
-
*/
|
|
450
|
-
serializeSignedTransaction(chainIdentifier, tx) {
|
|
451
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
452
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
453
|
-
return this.root._chains[chainIdentifier].chainInterface.serializeSignedTx(tx);
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* Deserializes a signed smart chain transaction
|
|
457
|
-
*
|
|
458
|
-
* @param chainIdentifier Smart chain string identifier
|
|
459
|
-
* @param tx Serialized signed transaction
|
|
460
|
-
*/
|
|
461
|
-
deserializeSignedTransaction(chainIdentifier, tx) {
|
|
462
|
-
if (this.root._chains[chainIdentifier] == null)
|
|
463
|
-
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
464
|
-
return this.root._chains[chainIdentifier].chainInterface.deserializeSignedTx(tx);
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
exports.SwapperUtils = SwapperUtils;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SwapperUtils = void 0;
|
|
4
|
+
const bolt11_1 = require("@atomiqlabs/bolt11");
|
|
5
|
+
const btc_signer_1 = require("@scure/btc-signer");
|
|
6
|
+
const LNURL_1 = require("../lnurl/LNURL");
|
|
7
|
+
const SwapType_1 = require("../enums/SwapType");
|
|
8
|
+
const SingleAddressBitcoinWallet_1 = require("../bitcoin/wallet/SingleAddressBitcoinWallet");
|
|
9
|
+
const base_1 = require("@atomiqlabs/base");
|
|
10
|
+
const Utils_1 = require("../utils/Utils");
|
|
11
|
+
const TokenAmount_1 = require("../types/TokenAmount");
|
|
12
|
+
const Token_1 = require("../types/Token");
|
|
13
|
+
const LNURLWithdraw_1 = require("../types/lnurl/LNURLWithdraw");
|
|
14
|
+
const LNURLPay_1 = require("../types/lnurl/LNURLPay");
|
|
15
|
+
const BitcoinWalletUtils_1 = require("../utils/BitcoinWalletUtils");
|
|
16
|
+
/**
|
|
17
|
+
* Utility class providing helper methods for address parsing, token balances, serialization
|
|
18
|
+
* and other miscellaneous things.
|
|
19
|
+
*
|
|
20
|
+
* @category Core
|
|
21
|
+
*/
|
|
22
|
+
class SwapperUtils {
|
|
23
|
+
constructor(root) {
|
|
24
|
+
this.bitcoinNetwork = root._btcNetwork;
|
|
25
|
+
this.root = root;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Checks whether a passed address is a valid address on the smart chain
|
|
29
|
+
*
|
|
30
|
+
* @param address Address
|
|
31
|
+
* @param chainId Smart chain identifier string to check the address for
|
|
32
|
+
*/
|
|
33
|
+
isValidSmartChainAddress(address, chainId) {
|
|
34
|
+
if (chainId != null) {
|
|
35
|
+
if (this.root._chains[chainId] == null)
|
|
36
|
+
throw new Error(`Unknown chain id: ${chainId}`);
|
|
37
|
+
return this.root._chains[chainId].chainInterface.isValidAddress(address);
|
|
38
|
+
}
|
|
39
|
+
for (let chainId of this.root.getSmartChains()) {
|
|
40
|
+
if (this.root._chains[chainId].chainInterface.isValidAddress(address))
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Checks whether an address is a valid BOLT11 bitcoin lightning invoice
|
|
47
|
+
*
|
|
48
|
+
* @param address Address to check
|
|
49
|
+
*/
|
|
50
|
+
isLightningInvoice(address) {
|
|
51
|
+
try {
|
|
52
|
+
(0, bolt11_1.decode)(address);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch (e) { }
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Checks whether an address is a valid bitcoin address
|
|
60
|
+
*
|
|
61
|
+
* @param address Address to check
|
|
62
|
+
*/
|
|
63
|
+
isValidBitcoinAddress(address) {
|
|
64
|
+
try {
|
|
65
|
+
(0, btc_signer_1.Address)(this.bitcoinNetwork).decode(address);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Checks whether an address is a valid BOLT11 bitcoin lightning invoice WITH AMOUNT
|
|
74
|
+
*
|
|
75
|
+
* @param address Address to check
|
|
76
|
+
*/
|
|
77
|
+
isValidLightningInvoice(address) {
|
|
78
|
+
try {
|
|
79
|
+
const parsed = (0, bolt11_1.decode)(address);
|
|
80
|
+
if (parsed.millisatoshis != null)
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch (e) { }
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Checks whether an address is a valid LNURL (no checking on type is performed)
|
|
88
|
+
*
|
|
89
|
+
* @param address Address to check
|
|
90
|
+
*/
|
|
91
|
+
isValidLNURL(address) {
|
|
92
|
+
return LNURL_1.LNURL.isLNURL(address);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Returns type and data about an LNURL
|
|
96
|
+
*
|
|
97
|
+
* @param lnurl LNURL link to check, can be either `pay` or `withdraw` type
|
|
98
|
+
* @param shouldRetry Optional whether HTTP requests should retried on failure
|
|
99
|
+
*/
|
|
100
|
+
getLNURLTypeAndData(lnurl, shouldRetry) {
|
|
101
|
+
return LNURL_1.LNURL.getLNURLType(lnurl, shouldRetry);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Returns satoshi value of BOLT11 bitcoin lightning invoice WITH AMOUNT, returns null otherwise
|
|
105
|
+
*
|
|
106
|
+
* @param lnpr
|
|
107
|
+
*/
|
|
108
|
+
getLightningInvoiceValue(lnpr) {
|
|
109
|
+
const parsed = (0, bolt11_1.decode)(lnpr);
|
|
110
|
+
if (parsed.millisatoshis != null)
|
|
111
|
+
return (BigInt(parsed.millisatoshis) + 999n) / 1000n;
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
parseBitcoinAddress(resultText) {
|
|
115
|
+
let _amount = undefined;
|
|
116
|
+
if (resultText.includes("?")) {
|
|
117
|
+
const arr = resultText.split("?");
|
|
118
|
+
resultText = arr[0];
|
|
119
|
+
const params = arr[1].split("&");
|
|
120
|
+
for (let param of params) {
|
|
121
|
+
const arr2 = param.split("=");
|
|
122
|
+
const key = arr2[0];
|
|
123
|
+
const value = decodeURIComponent(arr2[1]);
|
|
124
|
+
if (key === "amount") {
|
|
125
|
+
_amount = (0, Utils_1.fromDecimal)(parseFloat(value).toFixed(8), 8);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (this.isValidBitcoinAddress(resultText)) {
|
|
130
|
+
return {
|
|
131
|
+
address: resultText,
|
|
132
|
+
type: "BITCOIN",
|
|
133
|
+
swapType: SwapType_1.SwapType.TO_BTC,
|
|
134
|
+
amount: _amount == null ? undefined : (0, TokenAmount_1.toTokenAmount)(_amount, Token_1.BitcoinTokens.BTC, this.root.prices)
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
parseLNURLSync(resultText) {
|
|
140
|
+
if (this.isValidLNURL(resultText)) {
|
|
141
|
+
return {
|
|
142
|
+
address: resultText,
|
|
143
|
+
type: "LNURL",
|
|
144
|
+
swapType: null
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
async parseLNURL(resultText) {
|
|
150
|
+
if (this.isValidLNURL(resultText)) {
|
|
151
|
+
try {
|
|
152
|
+
const result = await this.getLNURLTypeAndData(resultText);
|
|
153
|
+
if (result == null)
|
|
154
|
+
throw new Error("Invalid LNURL specified!");
|
|
155
|
+
const swapType = (0, LNURLPay_1.isLNURLPay)(result) ? SwapType_1.SwapType.TO_BTCLN : (0, LNURLWithdraw_1.isLNURLWithdraw)(result) ? SwapType_1.SwapType.FROM_BTCLN : null;
|
|
156
|
+
if (swapType == null)
|
|
157
|
+
return null;
|
|
158
|
+
const response = {
|
|
159
|
+
address: resultText,
|
|
160
|
+
type: "LNURL",
|
|
161
|
+
swapType,
|
|
162
|
+
lnurl: result
|
|
163
|
+
};
|
|
164
|
+
if (result.min === result.max) {
|
|
165
|
+
return {
|
|
166
|
+
...response,
|
|
167
|
+
amount: result.min == null ? undefined : (0, TokenAmount_1.toTokenAmount)(result.min, Token_1.BitcoinTokens.BTCLN, this.root.prices)
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return {
|
|
172
|
+
...response,
|
|
173
|
+
min: result.min == null ? undefined : (0, TokenAmount_1.toTokenAmount)(result.min, Token_1.BitcoinTokens.BTCLN, this.root.prices),
|
|
174
|
+
max: result.min == null ? undefined : (0, TokenAmount_1.toTokenAmount)(result.max, Token_1.BitcoinTokens.BTCLN, this.root.prices)
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
throw new Error("Failed to contact LNURL service, check your internet connection and retry later.");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
parseLightningInvoice(resultText) {
|
|
185
|
+
if (this.isLightningInvoice(resultText)) {
|
|
186
|
+
if (this.isValidLightningInvoice(resultText)) {
|
|
187
|
+
const amount = this.getLightningInvoiceValue(resultText);
|
|
188
|
+
if (amount == null)
|
|
189
|
+
throw new Error();
|
|
190
|
+
return {
|
|
191
|
+
address: resultText,
|
|
192
|
+
type: "LIGHTNING",
|
|
193
|
+
swapType: SwapType_1.SwapType.TO_BTCLN,
|
|
194
|
+
amount: (0, TokenAmount_1.toTokenAmount)(amount, Token_1.BitcoinTokens.BTCLN, this.root.prices)
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
throw new Error("Lightning invoice needs to contain an amount!");
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
parseSmartchainAddress(resultText) {
|
|
204
|
+
for (let chainId of this.root.getSmartChains()) {
|
|
205
|
+
if (this.root._chains[chainId].chainInterface.isValidAddress(resultText)) {
|
|
206
|
+
return {
|
|
207
|
+
address: resultText,
|
|
208
|
+
type: chainId,
|
|
209
|
+
swapType: null
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* General parser for bitcoin addresses, LNURLs, lightning invoices, smart chain addresses. Also fetches LNURL data
|
|
217
|
+
* (hence async and returns Promise).
|
|
218
|
+
*
|
|
219
|
+
* @param addressString Address to parse
|
|
220
|
+
* @throws {Error} Error in address parsing
|
|
221
|
+
* @returns Address data or `null` if address doesn't conform to any known format
|
|
222
|
+
*/
|
|
223
|
+
async parseAddress(addressString) {
|
|
224
|
+
if (addressString.startsWith("bitcoin:")) {
|
|
225
|
+
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString.substring(8));
|
|
226
|
+
if (parsedBitcoinAddress != null)
|
|
227
|
+
return parsedBitcoinAddress;
|
|
228
|
+
throw new Error("Invalid bitcoin address!");
|
|
229
|
+
}
|
|
230
|
+
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString);
|
|
231
|
+
if (parsedBitcoinAddress != null)
|
|
232
|
+
return parsedBitcoinAddress;
|
|
233
|
+
if (addressString.startsWith("lightning:")) {
|
|
234
|
+
const resultText = addressString.substring(10);
|
|
235
|
+
const resultLnurl = await this.parseLNURL(resultText);
|
|
236
|
+
if (resultLnurl != null)
|
|
237
|
+
return resultLnurl;
|
|
238
|
+
const resultLightningInvoice = this.parseLightningInvoice(resultText);
|
|
239
|
+
if (resultLightningInvoice != null)
|
|
240
|
+
return resultLightningInvoice;
|
|
241
|
+
throw new Error("Invalid lightning network invoice or LNURL!");
|
|
242
|
+
}
|
|
243
|
+
const resultLnurl = await this.parseLNURL(addressString);
|
|
244
|
+
if (resultLnurl != null)
|
|
245
|
+
return resultLnurl;
|
|
246
|
+
const resultLightningInvoice = this.parseLightningInvoice(addressString);
|
|
247
|
+
if (resultLightningInvoice != null)
|
|
248
|
+
return resultLightningInvoice;
|
|
249
|
+
return this.parseSmartchainAddress(addressString);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Synchronous general parser for bitcoin addresses, LNURLs, lightning invoices, smart chain addresses, doesn't fetch
|
|
253
|
+
* LNURL data, returns `swapType: null` instead to prevent returning a Promise
|
|
254
|
+
*
|
|
255
|
+
* @param addressString Address to parse
|
|
256
|
+
* @throws {Error} Error in address parsing
|
|
257
|
+
* @returns Address data or `null` if address doesn't conform to any known format
|
|
258
|
+
*/
|
|
259
|
+
parseAddressSync(addressString) {
|
|
260
|
+
if (addressString.startsWith("bitcoin:")) {
|
|
261
|
+
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString.substring(8));
|
|
262
|
+
if (parsedBitcoinAddress != null)
|
|
263
|
+
return parsedBitcoinAddress;
|
|
264
|
+
throw new Error("Invalid bitcoin address!");
|
|
265
|
+
}
|
|
266
|
+
const parsedBitcoinAddress = this.parseBitcoinAddress(addressString);
|
|
267
|
+
if (parsedBitcoinAddress != null)
|
|
268
|
+
return parsedBitcoinAddress;
|
|
269
|
+
if (addressString.startsWith("lightning:")) {
|
|
270
|
+
const resultText = addressString.substring(10);
|
|
271
|
+
const resultLnurl = this.parseLNURLSync(resultText);
|
|
272
|
+
if (resultLnurl != null)
|
|
273
|
+
return resultLnurl;
|
|
274
|
+
const resultLightningInvoice = this.parseLightningInvoice(resultText);
|
|
275
|
+
if (resultLightningInvoice != null)
|
|
276
|
+
return resultLightningInvoice;
|
|
277
|
+
throw new Error("Invalid lightning network invoice or LNURL!");
|
|
278
|
+
}
|
|
279
|
+
const resultLnurl = this.parseLNURLSync(addressString);
|
|
280
|
+
if (resultLnurl != null)
|
|
281
|
+
return resultLnurl;
|
|
282
|
+
const resultLightningInvoice = this.parseLightningInvoice(addressString);
|
|
283
|
+
if (resultLightningInvoice != null)
|
|
284
|
+
return resultLightningInvoice;
|
|
285
|
+
return this.parseSmartchainAddress(addressString);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Returns a random PSBT that can be used for fee estimation for SPV vault (UTXO-controlled vault) based swaps
|
|
289
|
+
* {@link SwapType.SPV_VAULT_FROM_BTC}, the last output (the LP output) is omitted to allow for coinselection
|
|
290
|
+
* algorithm to determine maximum sendable amount there
|
|
291
|
+
*
|
|
292
|
+
* @param chainIdentifier Smart chain to swap to
|
|
293
|
+
* @param includeGasToken Whether to return the PSBT also with the gas token amount (increases the vSize by 8)
|
|
294
|
+
*/
|
|
295
|
+
getRandomSpvVaultPsbt(chainIdentifier, includeGasToken) {
|
|
296
|
+
const wrapper = this.root._chains[chainIdentifier].wrappers[SwapType_1.SwapType.SPV_VAULT_FROM_BTC];
|
|
297
|
+
if (wrapper == null)
|
|
298
|
+
throw new Error("Chain doesn't support spv vault swaps!");
|
|
299
|
+
return wrapper.getDummySwapPsbt(includeGasToken);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Returns the spendable balance of a bitcoin wallet
|
|
303
|
+
*
|
|
304
|
+
* @param wallet Bitcoin wallet to check the spendable balance for, can either be a simple
|
|
305
|
+
* bitcoin address string or a wallet object
|
|
306
|
+
* @param targetChain Destination smart chain for the swap, the ensures proper spendable balance
|
|
307
|
+
* is estimated taking into consideration different swap primitives available on different chains
|
|
308
|
+
* @param options Additional options
|
|
309
|
+
*/
|
|
310
|
+
async getBitcoinSpendableBalance(wallet, targetChain, options) {
|
|
311
|
+
let bitcoinWallet;
|
|
312
|
+
if (typeof (wallet) === "string") {
|
|
313
|
+
bitcoinWallet = new SingleAddressBitcoinWallet_1.SingleAddressBitcoinWallet(this.root._bitcoinRpc, this.bitcoinNetwork, { address: wallet, publicKey: "" });
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
bitcoinWallet = (0, BitcoinWalletUtils_1.toBitcoinWallet)(wallet, this.root._bitcoinRpc, this.bitcoinNetwork);
|
|
317
|
+
}
|
|
318
|
+
let feeRate = options?.feeRate ?? await bitcoinWallet.getFeeRate();
|
|
319
|
+
if (options?.minFeeRate != null)
|
|
320
|
+
feeRate = Math.max(feeRate, options.minFeeRate);
|
|
321
|
+
let result;
|
|
322
|
+
if (targetChain != null && this.root.supportsSwapType(targetChain, SwapType_1.SwapType.SPV_VAULT_FROM_BTC)) {
|
|
323
|
+
result = await bitcoinWallet.getSpendableBalance(this.getRandomSpvVaultPsbt(targetChain, options?.gasDrop), feeRate);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
result = await bitcoinWallet.getSpendableBalance(undefined, feeRate);
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
balance: (0, TokenAmount_1.toTokenAmount)(result.balance, Token_1.BitcoinTokens.BTC, this.root.prices),
|
|
330
|
+
feeRate: result.feeRate
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Returns the maximum spendable balance of the smart chain wallet, deducting the fee needed
|
|
335
|
+
* to initiate a swap for native balances
|
|
336
|
+
*/
|
|
337
|
+
async getSpendableBalance(wallet, token, options) {
|
|
338
|
+
if (this.root._chains[token.chainId] == null)
|
|
339
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + token.chainId);
|
|
340
|
+
const { swapContract, chainInterface } = this.root._chains[token.chainId];
|
|
341
|
+
let signer;
|
|
342
|
+
if (typeof (wallet) === "string") {
|
|
343
|
+
signer = wallet;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
const abstractSigner = (0, base_1.isAbstractSigner)(wallet) ? wallet : await chainInterface.wrapSigner(wallet);
|
|
347
|
+
signer = abstractSigner.getAddress();
|
|
348
|
+
}
|
|
349
|
+
let finalBalance;
|
|
350
|
+
if (chainInterface.getNativeCurrencyAddress() !== token.address) {
|
|
351
|
+
finalBalance = await chainInterface.getBalance(signer, token.address);
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
let [balance, commitFee] = await Promise.all([
|
|
355
|
+
chainInterface.getBalance(signer, token.address),
|
|
356
|
+
swapContract.getCommitFee(signer,
|
|
357
|
+
//Use large amount, such that the fee for wrapping more tokens is always included!
|
|
358
|
+
await swapContract.createSwapData(base_1.ChainSwapType.HTLC, signer, chainInterface.randomAddress(), token.address, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn, swapContract.getHashForHtlc((0, Utils_1.randomBytes)(32)).toString("hex"), base_1.BigIntBufferUtils.fromBuffer((0, Utils_1.randomBytes)(8)), BigInt(Math.floor(Date.now() / 1000)), true, false, base_1.BigIntBufferUtils.fromBuffer((0, Utils_1.randomBytes)(2)), base_1.BigIntBufferUtils.fromBuffer((0, Utils_1.randomBytes)(2))), options?.feeRate)
|
|
359
|
+
]);
|
|
360
|
+
if (options?.feeMultiplier != null) {
|
|
361
|
+
commitFee = commitFee * (BigInt(Math.floor(options.feeMultiplier * 1000000))) / 1000000n;
|
|
362
|
+
}
|
|
363
|
+
finalBalance = (0, Utils_1.bigIntMax)(balance - commitFee, 0n);
|
|
364
|
+
}
|
|
365
|
+
return (0, TokenAmount_1.toTokenAmount)(finalBalance, token, this.root.prices);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Returns the address of the native currency of the smart chain
|
|
369
|
+
*/
|
|
370
|
+
getNativeToken(chainIdentifier) {
|
|
371
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
372
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
373
|
+
return this.root._tokens[chainIdentifier][this.root._chains[chainIdentifier].chainInterface.getNativeCurrencyAddress()];
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Returns a random signer for a given smart chain
|
|
377
|
+
*
|
|
378
|
+
* @param chainIdentifier
|
|
379
|
+
*/
|
|
380
|
+
randomSigner(chainIdentifier) {
|
|
381
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
382
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
383
|
+
return this.root._chains[chainIdentifier].chainInterface.randomSigner();
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Returns a random address for a given smart chain
|
|
387
|
+
*
|
|
388
|
+
* @param chainIdentifier
|
|
389
|
+
*/
|
|
390
|
+
randomAddress(chainIdentifier) {
|
|
391
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
392
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
393
|
+
return this.root._chains[chainIdentifier].chainInterface.randomAddress();
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Signs and broadcasts the supplied smart chain transaction
|
|
397
|
+
*
|
|
398
|
+
* @param chainIdentifier Smart chain identifier string
|
|
399
|
+
* @param signer Signer to use for signing the transactions
|
|
400
|
+
* @param txs An array of transactions to sign
|
|
401
|
+
* @param abortSignal Abort signal
|
|
402
|
+
* @param onBeforePublish Callback invoked before a transaction is sent (invoked for every transaction to be sent)
|
|
403
|
+
*/
|
|
404
|
+
sendAndConfirm(chainIdentifier, signer, txs, abortSignal, onBeforePublish) {
|
|
405
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
406
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
407
|
+
return this.root._chains[chainIdentifier].chainInterface.sendAndConfirm(signer, txs, true, abortSignal, false, onBeforePublish);
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Broadcasts already signed smart chain transactions
|
|
411
|
+
*
|
|
412
|
+
* @param chainIdentifier Smart chain identifier string
|
|
413
|
+
* @param txs An array of already signed transactions
|
|
414
|
+
* @param abortSignal Abort signal
|
|
415
|
+
* @param onBeforePublish Callback invoked before a transaction is sent (invoked for every transaction to be sent)
|
|
416
|
+
*/
|
|
417
|
+
sendSignedAndConfirm(chainIdentifier, txs, abortSignal, onBeforePublish) {
|
|
418
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
419
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
420
|
+
return this.root._chains[chainIdentifier].chainInterface.sendSignedAndConfirm(txs, true, abortSignal, false, onBeforePublish);
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Serializes an unsigned smart chain transaction
|
|
424
|
+
*
|
|
425
|
+
* @param chainIdentifier Smart chain string identifier
|
|
426
|
+
* @param tx An unsigned transaction to serialize
|
|
427
|
+
*/
|
|
428
|
+
serializeUnsignedTransaction(chainIdentifier, tx) {
|
|
429
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
430
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
431
|
+
return this.root._chains[chainIdentifier].chainInterface.serializeTx(tx);
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Deserializes an unsigned smart chain transaction
|
|
435
|
+
*
|
|
436
|
+
* @param chainIdentifier Smart chain string identifier
|
|
437
|
+
* @param tx Serialized unsigned transaction
|
|
438
|
+
*/
|
|
439
|
+
deserializeUnsignedTransaction(chainIdentifier, tx) {
|
|
440
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
441
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
442
|
+
return this.root._chains[chainIdentifier].chainInterface.deserializeTx(tx);
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Serializes a signed smart chain transaction
|
|
446
|
+
*
|
|
447
|
+
* @param chainIdentifier Smart chain string identifier
|
|
448
|
+
* @param tx A signed transaction to serialize
|
|
449
|
+
*/
|
|
450
|
+
serializeSignedTransaction(chainIdentifier, tx) {
|
|
451
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
452
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
453
|
+
return this.root._chains[chainIdentifier].chainInterface.serializeSignedTx(tx);
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Deserializes a signed smart chain transaction
|
|
457
|
+
*
|
|
458
|
+
* @param chainIdentifier Smart chain string identifier
|
|
459
|
+
* @param tx Serialized signed transaction
|
|
460
|
+
*/
|
|
461
|
+
deserializeSignedTransaction(chainIdentifier, tx) {
|
|
462
|
+
if (this.root._chains[chainIdentifier] == null)
|
|
463
|
+
throw new Error("Invalid chain identifier! Unknown chain: " + chainIdentifier);
|
|
464
|
+
return this.root._chains[chainIdentifier].chainInterface.deserializeSignedTx(tx);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
exports.SwapperUtils = SwapperUtils;
|