@atomiqlabs/sdk 8.1.7 → 8.3.1
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/bitcoin/wallet/BitcoinWallet.d.ts +41 -5
- package/dist/bitcoin/wallet/BitcoinWallet.js +36 -1
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +52 -2
- package/dist/bitcoin/wallet/IBitcoinWallet.js +2 -1
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +42 -7
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +36 -1
- package/dist/enums/FeeType.d.ts +7 -0
- package/dist/enums/FeeType.js +7 -0
- package/dist/enums/SwapAmountType.d.ts +7 -0
- package/dist/enums/SwapAmountType.js +7 -0
- package/dist/enums/SwapDirection.d.ts +7 -0
- package/dist/enums/SwapDirection.js +7 -0
- package/dist/enums/SwapType.d.ts +62 -1
- package/dist/enums/SwapType.js +62 -1
- package/dist/errors/IntermediaryError.d.ts +4 -0
- package/dist/errors/IntermediaryError.js +1 -0
- package/dist/errors/RequestError.d.ts +15 -1
- package/dist/errors/RequestError.js +8 -0
- package/dist/errors/UserError.d.ts +1 -0
- package/dist/errors/UserError.js +1 -0
- package/dist/index.d.ts +4 -5
- package/dist/index.js +3 -4
- package/dist/intermediaries/Intermediary.d.ts +57 -10
- package/dist/intermediaries/Intermediary.js +37 -10
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +55 -22
- package/dist/intermediaries/IntermediaryDiscovery.js +35 -22
- package/dist/prices/RedundantSwapPrice.d.ts +24 -3
- package/dist/prices/RedundantSwapPrice.js +21 -1
- package/dist/prices/SingleSwapPrice.d.ts +9 -6
- package/dist/prices/SingleSwapPrice.js +10 -7
- package/dist/prices/SwapPriceWithChain.d.ts +54 -16
- package/dist/prices/SwapPriceWithChain.js +58 -20
- package/dist/prices/abstract/ISwapPrice.d.ts +94 -45
- package/dist/prices/abstract/ISwapPrice.js +103 -55
- package/dist/prices/providers/BinancePriceProvider.d.ts +7 -0
- package/dist/prices/providers/BinancePriceProvider.js +7 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +6 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.js +6 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +6 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +6 -0
- package/dist/prices/providers/CustomPriceProvider.d.ts +11 -0
- package/dist/prices/providers/CustomPriceProvider.js +11 -0
- package/dist/prices/providers/KrakenPriceProvider.d.ts +9 -0
- package/dist/prices/providers/KrakenPriceProvider.js +9 -0
- package/dist/prices/providers/OKXPriceProvider.d.ts +6 -0
- package/dist/prices/providers/OKXPriceProvider.js +6 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +3 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +3 -0
- package/dist/storage/IUnifiedStorage.d.ts +19 -7
- package/dist/storage/UnifiedSwapStorage.d.ts +33 -3
- package/dist/storage/UnifiedSwapStorage.js +29 -1
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +31 -7
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +29 -6
- package/dist/storage-browser/LocalStorageManager.d.ts +25 -1
- package/dist/storage-browser/LocalStorageManager.js +25 -1
- package/dist/swapper/Swapper.d.ts +303 -222
- package/dist/swapper/Swapper.js +376 -344
- package/dist/swapper/SwapperFactory.d.ts +41 -17
- package/dist/swapper/SwapperFactory.js +23 -2
- package/dist/swapper/SwapperUtils.d.ts +75 -28
- package/dist/swapper/SwapperUtils.js +107 -60
- package/dist/swapper/SwapperWithChain.d.ts +286 -91
- package/dist/swapper/SwapperWithChain.js +218 -64
- package/dist/swapper/SwapperWithSigner.d.ts +229 -80
- package/dist/swapper/SwapperWithSigner.js +190 -44
- package/dist/swaps/IAddressSwap.d.ts +10 -1
- package/dist/swaps/IAddressSwap.js +2 -1
- package/dist/swaps/IBTCWalletSwap.d.ts +24 -6
- package/dist/swaps/IBTCWalletSwap.js +2 -1
- package/dist/swaps/IClaimableSwap.d.ts +36 -4
- package/dist/swaps/IClaimableSwap.js +2 -1
- package/dist/swaps/IClaimableSwapWrapper.d.ts +11 -1
- package/dist/swaps/IRefundableSwap.d.ts +29 -3
- package/dist/swaps/IRefundableSwap.js +2 -1
- package/dist/swaps/ISwap.d.ts +159 -21
- package/dist/swaps/ISwap.js +90 -33
- package/dist/swaps/ISwapWithGasDrop.d.ts +6 -0
- package/dist/swaps/ISwapWithGasDrop.js +1 -0
- package/dist/swaps/ISwapWrapper.d.ts +157 -48
- package/dist/swaps/ISwapWrapper.js +130 -72
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +49 -6
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +22 -12
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +65 -12
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +38 -19
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +39 -9
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +30 -21
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +31 -15
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +33 -18
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +94 -29
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +90 -27
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +22 -9
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +24 -11
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +275 -58
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +516 -239
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +76 -25
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +131 -49
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +311 -51
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +542 -193
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +87 -26
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +147 -58
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +209 -53
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +449 -242
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +77 -23
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +116 -46
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +197 -56
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +326 -189
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +30 -5
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +44 -19
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +60 -19
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +74 -31
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +76 -50
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +106 -101
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +36 -13
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +65 -19
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +46 -17
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +82 -27
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +328 -92
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +460 -219
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +76 -24
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +244 -124
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +146 -18
- package/dist/swaps/trusted/ln/LnForGasSwap.js +173 -43
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +29 -10
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +30 -11
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +200 -47
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +230 -78
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +34 -12
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +33 -14
- package/dist/types/AmountData.d.ts +2 -1
- package/dist/types/CustomPriceFunction.d.ts +7 -1
- package/dist/types/SwapExecutionAction.d.ts +74 -4
- package/dist/types/SwapWithSigner.d.ts +4 -1
- package/dist/types/SwapWithSigner.js +5 -2
- package/dist/types/Token.d.ts +11 -5
- package/dist/types/Token.js +6 -3
- package/dist/types/TokenAmount.d.ts +3 -0
- package/dist/types/TokenAmount.js +2 -0
- package/dist/types/fees/Fee.d.ts +2 -1
- package/dist/types/fees/FeeBreakdown.d.ts +2 -1
- package/dist/types/fees/PercentagePPM.d.ts +2 -0
- package/dist/types/fees/PercentagePPM.js +1 -0
- package/dist/types/lnurl/LNURLPay.d.ts +14 -6
- package/dist/types/lnurl/LNURLPay.js +6 -2
- package/dist/types/lnurl/LNURLWithdraw.d.ts +12 -5
- package/dist/types/lnurl/LNURLWithdraw.js +6 -2
- package/dist/types/wallets/LightningInvoiceCreateService.d.ts +20 -0
- package/dist/types/wallets/LightningInvoiceCreateService.js +15 -0
- package/dist/types/wallets/MinimalBitcoinWalletInterface.d.ts +3 -1
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.d.ts +3 -1
- package/dist/utils/BitcoinUtils.d.ts +1 -0
- package/dist/utils/BitcoinUtils.js +5 -1
- package/dist/utils/SwapUtils.d.ts +56 -1
- package/dist/utils/SwapUtils.js +53 -1
- package/dist/utils/TokenUtils.d.ts +10 -2
- package/dist/utils/TokenUtils.js +12 -4
- package/package.json +3 -3
- package/src/bitcoin/wallet/BitcoinWallet.ts +41 -5
- package/src/bitcoin/wallet/IBitcoinWallet.ts +57 -2
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +42 -6
- package/src/enums/FeeType.ts +7 -0
- package/src/enums/SwapAmountType.ts +7 -0
- package/src/enums/SwapDirection.ts +7 -0
- package/src/enums/SwapType.ts +62 -2
- package/src/errors/IntermediaryError.ts +4 -0
- package/src/errors/RequestError.ts +15 -1
- package/src/errors/UserError.ts +1 -0
- package/src/index.ts +6 -5
- package/src/intermediaries/Intermediary.ts +57 -10
- package/src/intermediaries/IntermediaryDiscovery.ts +60 -27
- package/src/prices/RedundantSwapPrice.ts +24 -4
- package/src/prices/SingleSwapPrice.ts +10 -7
- package/src/prices/SwapPriceWithChain.ts +59 -21
- package/src/prices/abstract/ISwapPrice.ts +114 -65
- package/src/prices/providers/BinancePriceProvider.ts +7 -0
- package/src/prices/providers/CoinGeckoPriceProvider.ts +6 -0
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +6 -0
- package/src/prices/providers/CustomPriceProvider.ts +11 -0
- package/src/prices/providers/KrakenPriceProvider.ts +9 -0
- package/src/prices/providers/OKXPriceProvider.ts +6 -0
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +3 -0
- package/src/storage/IUnifiedStorage.ts +19 -7
- package/src/storage/UnifiedSwapStorage.ts +33 -3
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +31 -8
- package/src/storage-browser/LocalStorageManager.ts +25 -1
- package/src/swapper/Swapper.ts +513 -379
- package/src/swapper/SwapperFactory.ts +44 -21
- package/src/swapper/SwapperUtils.ts +107 -60
- package/src/swapper/SwapperWithChain.ts +320 -81
- package/src/swapper/SwapperWithSigner.ts +263 -56
- package/src/swaps/IAddressSwap.ts +11 -1
- package/src/swaps/IBTCWalletSwap.ts +24 -8
- package/src/swaps/IClaimableSwap.ts +39 -4
- package/src/swaps/IClaimableSwapWrapper.ts +11 -2
- package/src/swaps/IRefundableSwap.ts +32 -3
- package/src/swaps/ISwap.ts +221 -82
- package/src/swaps/ISwapWithGasDrop.ts +6 -0
- package/src/swaps/ISwapWrapper.ts +212 -94
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +62 -18
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +83 -37
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +61 -30
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +37 -19
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +120 -51
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +24 -11
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +559 -256
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +155 -61
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +590 -226
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +177 -74
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +470 -243
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +141 -59
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +352 -193
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +48 -23
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +86 -39
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +110 -110
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +88 -33
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +101 -31
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +534 -263
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +289 -148
- package/src/swaps/trusted/ln/LnForGasSwap.ts +184 -45
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +34 -15
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +260 -86
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +41 -19
- package/src/types/AmountData.ts +2 -1
- package/src/types/CustomPriceFunction.ts +7 -1
- package/src/types/SwapExecutionAction.ts +84 -5
- package/src/types/SwapWithSigner.ts +7 -3
- package/src/types/Token.ts +12 -5
- package/src/types/TokenAmount.ts +3 -0
- package/src/types/fees/Fee.ts +2 -1
- package/src/types/fees/FeeBreakdown.ts +2 -1
- package/src/types/fees/PercentagePPM.ts +2 -0
- package/src/types/lnurl/LNURLPay.ts +14 -6
- package/src/types/lnurl/LNURLWithdraw.ts +12 -5
- package/src/types/wallets/LightningInvoiceCreateService.ts +26 -0
- package/src/types/wallets/MinimalBitcoinWalletInterface.ts +3 -1
- package/src/types/wallets/MinimalLightningNetworkWalletInterface.ts +3 -1
- package/src/utils/BitcoinUtils.ts +5 -0
- package/src/utils/SwapUtils.ts +61 -1
- package/src/utils/TokenUtils.ts +12 -4
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +0 -68
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +0 -2
- package/dist/bitcoin/LightningNetworkApi.d.ts +0 -12
- package/dist/bitcoin/LightningNetworkApi.js +0 -2
- package/dist/bitcoin/mempool/MempoolApi.d.ts +0 -350
- package/dist/bitcoin/mempool/MempoolApi.js +0 -311
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +0 -44
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +0 -48
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +0 -119
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +0 -361
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +0 -22
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +0 -105
- package/dist/errors/PaymentAuthError.d.ts +0 -11
- package/dist/errors/PaymentAuthError.js +0 -23
- package/src/errors/PaymentAuthError.ts +0 -26
|
@@ -13,6 +13,13 @@ const RequestError_1 = require("../../errors/RequestError");
|
|
|
13
13
|
const IntermediaryError_1 = require("../../errors/IntermediaryError");
|
|
14
14
|
const btc_signer_1 = require("@scure/btc-signer");
|
|
15
15
|
const RetryUtils_1 = require("../../utils/RetryUtils");
|
|
16
|
+
/**
|
|
17
|
+
* New spv vault (UTXO-controlled vault) based swaps for Bitcoin -> Smart chain swaps not requiring
|
|
18
|
+
* any initiation on the destination chain, and with the added possibility for the user to receive
|
|
19
|
+
* a native token on the destination chain as part of the swap (a "gas drop" feature).
|
|
20
|
+
*
|
|
21
|
+
* @category Swaps
|
|
22
|
+
*/
|
|
16
23
|
class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
17
24
|
/**
|
|
18
25
|
* @param chainIdentifier
|
|
@@ -30,97 +37,104 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
30
37
|
* @param events Instance to use for emitting events
|
|
31
38
|
*/
|
|
32
39
|
constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, spvWithdrawalDataDeserializer, btcRelay, synchronizer, btcRpc, options, events) {
|
|
33
|
-
if (options == null)
|
|
34
|
-
options = {};
|
|
35
|
-
options.bitcoinNetwork ??= utils_1.TEST_NETWORK;
|
|
36
|
-
options.maxConfirmations ??= 6;
|
|
37
|
-
options.bitcoinBlocktime ??= 10 * 60;
|
|
38
|
-
options.maxTransactionsDelta ??= 3;
|
|
39
|
-
options.maxRawAmountAdjustmentDifferencePPM ??= 100;
|
|
40
|
-
options.maxBtcFeeOffset ??= 5;
|
|
41
|
-
options.maxBtcFeeMultiplier ??= 1.5;
|
|
42
40
|
super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, {
|
|
43
|
-
bitcoinNetwork: options
|
|
44
|
-
maxConfirmations: options
|
|
45
|
-
bitcoinBlocktime: options
|
|
46
|
-
maxTransactionsDelta: options
|
|
47
|
-
maxRawAmountAdjustmentDifferencePPM: options
|
|
48
|
-
maxBtcFeeOffset: options
|
|
49
|
-
maxBtcFeeMultiplier: options
|
|
41
|
+
bitcoinNetwork: options?.bitcoinNetwork ?? utils_1.TEST_NETWORK,
|
|
42
|
+
maxConfirmations: options?.maxConfirmations ?? 6,
|
|
43
|
+
bitcoinBlocktime: options?.bitcoinBlocktime ?? 10 * 60,
|
|
44
|
+
maxTransactionsDelta: options?.maxTransactionsDelta ?? 3,
|
|
45
|
+
maxRawAmountAdjustmentDifferencePPM: options?.maxRawAmountAdjustmentDifferencePPM ?? 100,
|
|
46
|
+
maxBtcFeeOffset: options?.maxBtcFeeOffset ?? 10,
|
|
47
|
+
maxBtcFeeMultiplier: options?.maxBtcFeeMultiplier ?? 1.5
|
|
50
48
|
}, events);
|
|
51
|
-
this.claimableSwapStates = [SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED];
|
|
52
49
|
this.TYPE = SwapType_1.SwapType.SPV_VAULT_FROM_BTC;
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
/**
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
this._claimableSwapStates = [SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED];
|
|
54
|
+
/**
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
this._swapDeserializer = SpvFromBTCSwap_1.SpvFromBTCSwap;
|
|
58
|
+
/**
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
this.tickSwapState = [
|
|
55
62
|
SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED,
|
|
63
|
+
SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED,
|
|
56
64
|
SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED,
|
|
57
65
|
SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED,
|
|
58
|
-
SpvFromBTCSwap_1.SpvFromBTCSwapState.
|
|
59
|
-
SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED,
|
|
60
|
-
SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED,
|
|
61
|
-
SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED
|
|
66
|
+
SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED
|
|
62
67
|
];
|
|
63
|
-
|
|
68
|
+
/**
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
this._pendingSwapStates = [
|
|
64
72
|
SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED,
|
|
65
|
-
SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED,
|
|
66
73
|
SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED,
|
|
67
74
|
SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED,
|
|
68
|
-
SpvFromBTCSwap_1.SpvFromBTCSwapState.
|
|
75
|
+
SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED,
|
|
76
|
+
SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED,
|
|
77
|
+
SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED,
|
|
78
|
+
SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED
|
|
69
79
|
];
|
|
70
|
-
this.
|
|
71
|
-
this.
|
|
80
|
+
this._spvWithdrawalDataDeserializer = spvWithdrawalDataDeserializer;
|
|
81
|
+
this._contract = contract;
|
|
72
82
|
this.btcRelay = btcRelay;
|
|
73
|
-
this.
|
|
74
|
-
this.
|
|
83
|
+
this._synchronizer = synchronizer;
|
|
84
|
+
this._btcRpc = btcRpc;
|
|
75
85
|
}
|
|
76
86
|
async processEventFront(event, swap) {
|
|
77
|
-
if (swap.
|
|
78
|
-
swap.
|
|
79
|
-
swap.
|
|
87
|
+
if (swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
|
|
88
|
+
swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
|
|
89
|
+
swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
|
|
80
90
|
await swap._setBitcoinTxId(event.btcTxId).catch(e => {
|
|
81
91
|
this.logger.warn("processEventFront(): Failed to set bitcoin txId: ", e);
|
|
82
92
|
});
|
|
83
|
-
swap.
|
|
93
|
+
swap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.FRONTED;
|
|
84
94
|
return true;
|
|
85
95
|
}
|
|
86
96
|
return false;
|
|
87
97
|
}
|
|
88
98
|
async processEventClaim(event, swap) {
|
|
89
|
-
if (swap.
|
|
90
|
-
swap.
|
|
91
|
-
swap.
|
|
99
|
+
if (swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
|
|
100
|
+
swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
|
|
101
|
+
swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
|
|
92
102
|
await swap._setBitcoinTxId(event.btcTxId).catch(e => {
|
|
93
103
|
this.logger.warn("processEventClaim(): Failed to set bitcoin txId: ", e);
|
|
94
104
|
});
|
|
95
|
-
swap.
|
|
105
|
+
swap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLAIMED;
|
|
96
106
|
return true;
|
|
97
107
|
}
|
|
98
108
|
return false;
|
|
99
109
|
}
|
|
100
110
|
processEventClose(event, swap) {
|
|
101
|
-
if (swap.
|
|
102
|
-
swap.
|
|
103
|
-
swap.
|
|
104
|
-
swap.
|
|
111
|
+
if (swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
|
|
112
|
+
swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
|
|
113
|
+
swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
|
|
114
|
+
swap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLOSED;
|
|
105
115
|
return Promise.resolve(true);
|
|
106
116
|
}
|
|
107
117
|
return Promise.resolve(false);
|
|
108
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* @inheritDoc
|
|
121
|
+
* @internal
|
|
122
|
+
*/
|
|
109
123
|
async processEvent(event, swap) {
|
|
110
124
|
if (swap == null)
|
|
111
125
|
return;
|
|
112
126
|
let swapChanged = false;
|
|
113
127
|
if (event instanceof base_1.SpvVaultFrontEvent) {
|
|
114
128
|
swapChanged = await this.processEventFront(event, swap);
|
|
115
|
-
if (event.meta?.txId != null && swap.
|
|
116
|
-
swap.
|
|
129
|
+
if (event.meta?.txId != null && swap._frontTxId !== event.meta.txId) {
|
|
130
|
+
swap._frontTxId = event.meta.txId;
|
|
117
131
|
swapChanged ||= true;
|
|
118
132
|
}
|
|
119
133
|
}
|
|
120
134
|
if (event instanceof base_1.SpvVaultClaimEvent) {
|
|
121
135
|
swapChanged = await this.processEventClaim(event, swap);
|
|
122
|
-
if (event.meta?.txId != null && swap.
|
|
123
|
-
swap.
|
|
136
|
+
if (event.meta?.txId != null && swap._claimTxId !== event.meta.txId) {
|
|
137
|
+
swap._claimTxId = event.meta.txId;
|
|
124
138
|
swapChanged ||= true;
|
|
125
139
|
}
|
|
126
140
|
}
|
|
@@ -140,7 +154,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
140
154
|
*/
|
|
141
155
|
async preFetchFinalizedBlockHeight(abortController) {
|
|
142
156
|
try {
|
|
143
|
-
const block = await this.
|
|
157
|
+
const block = await this._chain.getFinalizedBlock();
|
|
144
158
|
return block.height;
|
|
145
159
|
}
|
|
146
160
|
catch (e) {
|
|
@@ -167,33 +181,33 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
167
181
|
const [feePerBlock, btcRelayData, currentBtcBlock, claimFeeRate, nativeTokenPrice] = await Promise.all([
|
|
168
182
|
this.btcRelay.getFeePerBlock(),
|
|
169
183
|
this.btcRelay.getTipData(),
|
|
170
|
-
this.
|
|
171
|
-
this.
|
|
172
|
-
nativeTokenPricePrefetch ?? (amountData.token === this.
|
|
184
|
+
this._btcRpc.getTipHeight(),
|
|
185
|
+
this._contract.getClaimFee(this._chain.randomAddress()),
|
|
186
|
+
nativeTokenPricePrefetch ?? (amountData.token === this._chain.getNativeCurrencyAddress() ?
|
|
173
187
|
pricePrefetch :
|
|
174
|
-
this.
|
|
188
|
+
this._prices.preFetchPrice(this.chainIdentifier, this._chain.getNativeCurrencyAddress(), abortController.signal))
|
|
175
189
|
]);
|
|
176
190
|
if (btcRelayData == null)
|
|
177
191
|
throw new Error("Btc relay doesn't seem to be initialized!");
|
|
178
192
|
const currentBtcRelayBlock = btcRelayData.blockheight;
|
|
179
|
-
const blockDelta = Math.max(currentBtcBlock - currentBtcRelayBlock + this.
|
|
193
|
+
const blockDelta = Math.max(currentBtcBlock - currentBtcRelayBlock + this._options.maxConfirmations, 0);
|
|
180
194
|
const totalFeeInNativeToken = ((BigInt(blockDelta) * feePerBlock) +
|
|
181
|
-
(claimFeeRate * BigInt(this.
|
|
195
|
+
(claimFeeRate * BigInt(this._options.maxTransactionsDelta))) * BigInt(Math.floor(options.feeSafetyFactor * 1000000)) / 1000000n;
|
|
182
196
|
let payoutAmount;
|
|
183
197
|
if (amountData.exactIn) {
|
|
184
198
|
//Convert input amount in BTC to
|
|
185
|
-
const amountInNativeToken = await this.
|
|
199
|
+
const amountInNativeToken = await this._prices.getFromBtcSwapAmount(this.chainIdentifier, amountData.amount, this._chain.getNativeCurrencyAddress(), abortController.signal, nativeTokenPrice);
|
|
186
200
|
payoutAmount = amountInNativeToken - totalFeeInNativeToken;
|
|
187
201
|
}
|
|
188
202
|
else {
|
|
189
|
-
if (amountData.token === this.
|
|
203
|
+
if (amountData.token === this._chain.getNativeCurrencyAddress()) {
|
|
190
204
|
//Both amounts in same currency
|
|
191
205
|
payoutAmount = amountData.amount;
|
|
192
206
|
}
|
|
193
207
|
else {
|
|
194
208
|
//Need to convert both to native currency
|
|
195
|
-
const btcAmount = await this.
|
|
196
|
-
payoutAmount = await this.
|
|
209
|
+
const btcAmount = await this._prices.getToBtcSwapAmount(this.chainIdentifier, amountData.amount, amountData.token, abortController.signal, await pricePrefetch);
|
|
210
|
+
payoutAmount = await this._prices.getFromBtcSwapAmount(this.chainIdentifier, btcAmount, this._chain.getNativeCurrencyAddress(), abortController.signal, nativeTokenPrice);
|
|
197
211
|
}
|
|
198
212
|
}
|
|
199
213
|
this.logger.debug("preFetchCallerFeeShare(): Caller fee in native token: " + totalFeeInNativeToken.toString(10) + " total payout in native token: " + payoutAmount.toString(10));
|
|
@@ -225,16 +239,16 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
225
239
|
const btcFeeRate = await (0, Utils_1.throwIfUndefined)(bitcoinFeeRatePromise, "Bitcoin fee rate promise failed!");
|
|
226
240
|
abortSignal.throwIfAborted();
|
|
227
241
|
if (btcFeeRate != null && resp.btcFeeRate > btcFeeRate)
|
|
228
|
-
throw new IntermediaryError_1.IntermediaryError(
|
|
242
|
+
throw new IntermediaryError_1.IntermediaryError(`Required bitcoin fee rate returned from the LP is too high! Maximum accepted: ${btcFeeRate} sats/vB, required by LP: ${resp.btcFeeRate} sats/vB`);
|
|
229
243
|
//Vault related
|
|
230
244
|
let vaultScript;
|
|
231
245
|
let vaultAddressType;
|
|
232
246
|
let btcAddressScript;
|
|
233
247
|
//Ensure valid btc addresses returned
|
|
234
248
|
try {
|
|
235
|
-
vaultScript = (0, BitcoinUtils_1.toOutputScript)(this.
|
|
249
|
+
vaultScript = (0, BitcoinUtils_1.toOutputScript)(this._options.bitcoinNetwork, resp.vaultBtcAddress);
|
|
236
250
|
vaultAddressType = (0, BitcoinUtils_1.toCoinselectAddressType)(vaultScript);
|
|
237
|
-
btcAddressScript = (0, BitcoinUtils_1.toOutputScript)(this.
|
|
251
|
+
btcAddressScript = (0, BitcoinUtils_1.toOutputScript)(this._options.bitcoinNetwork, resp.btcAddress);
|
|
238
252
|
}
|
|
239
253
|
catch (e) {
|
|
240
254
|
throw new IntermediaryError_1.IntermediaryError("Invalid btc address data returned", e);
|
|
@@ -271,7 +285,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
271
285
|
//Fetch vault data
|
|
272
286
|
let vault;
|
|
273
287
|
try {
|
|
274
|
-
vault = await this.
|
|
288
|
+
vault = await this._contract.getVaultData(resp.address, resp.vaultId);
|
|
275
289
|
}
|
|
276
290
|
catch (e) {
|
|
277
291
|
this.logger.error("Error getting spv vault (owner: " + resp.address + " vaultId: " + resp.vaultId.toString(10) + "): ", e);
|
|
@@ -282,7 +296,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
282
296
|
if (vault == null || !vault.isOpened())
|
|
283
297
|
throw new IntermediaryError_1.IntermediaryError("Returned spv swap vault is not opened!");
|
|
284
298
|
//Make sure the vault doesn't require insane amount of confirmations
|
|
285
|
-
if (vault.getConfirmations() > this.
|
|
299
|
+
if (vault.getConfirmations() > this._options.maxConfirmations)
|
|
286
300
|
throw new IntermediaryError_1.IntermediaryError("SPV swap vault needs too many confirmations: " + vault.getConfirmations());
|
|
287
301
|
const tokenData = vault.getTokenData();
|
|
288
302
|
//Amounts - make sure the amounts match
|
|
@@ -294,7 +308,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
294
308
|
//Check the difference between amount adjusted due to scaling to raw amount
|
|
295
309
|
const adjustedAmount = amountData.amount / tokenData[0].multiplier * tokenData[0].multiplier;
|
|
296
310
|
const adjustmentPPM = (amountData.amount - adjustedAmount) * 1000000n / amountData.amount;
|
|
297
|
-
if (adjustmentPPM > this.
|
|
311
|
+
if (adjustmentPPM > this._options.maxRawAmountAdjustmentDifferencePPM)
|
|
298
312
|
throw new IntermediaryError_1.IntermediaryError("Invalid amount0 multiplier used, rawAmount diff too high");
|
|
299
313
|
if (resp.total !== adjustedAmount)
|
|
300
314
|
throw new IntermediaryError_1.IntermediaryError("Invalid total returned");
|
|
@@ -307,7 +321,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
307
321
|
//Check the difference between amount adjusted due to scaling to raw amount
|
|
308
322
|
const adjustedGasAmount = options.gasAmount / tokenData[0].multiplier * tokenData[0].multiplier;
|
|
309
323
|
const adjustmentPPM = (options.gasAmount - adjustedGasAmount) * 1000000n / options.gasAmount;
|
|
310
|
-
if (adjustmentPPM > this.
|
|
324
|
+
if (adjustmentPPM > this._options.maxRawAmountAdjustmentDifferencePPM)
|
|
311
325
|
throw new IntermediaryError_1.IntermediaryError("Invalid amount1 multiplier used, rawAmount diff too high");
|
|
312
326
|
if (resp.totalGas !== adjustedGasAmount)
|
|
313
327
|
throw new IntermediaryError_1.IntermediaryError("Invalid gas total returned");
|
|
@@ -316,7 +330,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
316
330
|
})(),
|
|
317
331
|
(async () => {
|
|
318
332
|
//Require the vault UTXO to have at least 1 confirmation
|
|
319
|
-
let btcTx = await this.
|
|
333
|
+
let btcTx = await this._btcRpc.getTransaction(txId);
|
|
320
334
|
if (btcTx == null)
|
|
321
335
|
throw new IntermediaryError_1.IntermediaryError("Invalid UTXO, doesn't exist (txId)");
|
|
322
336
|
abortController.signal.throwIfAborted();
|
|
@@ -330,7 +344,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
330
344
|
})(),
|
|
331
345
|
(async () => {
|
|
332
346
|
//Require vault UTXO is unspent
|
|
333
|
-
if (await this.
|
|
347
|
+
if (await this._btcRpc.isSpent(utxo))
|
|
334
348
|
throw new IntermediaryError_1.IntermediaryError("Returned spv vault UTXO is already spent", null, true);
|
|
335
349
|
abortController.signal.throwIfAborted();
|
|
336
350
|
})()
|
|
@@ -345,18 +359,18 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
345
359
|
const [txId, voutStr] = utxo.split(":");
|
|
346
360
|
//Such that 1st tx isn't fetched twice
|
|
347
361
|
if (btcTx.txid !== txId) {
|
|
348
|
-
const _btcTx = await this.
|
|
362
|
+
const _btcTx = await this._btcRpc.getTransaction(txId);
|
|
349
363
|
if (_btcTx == null)
|
|
350
364
|
throw new IntermediaryError_1.IntermediaryError("Invalid ancestor transaction (not found)");
|
|
351
365
|
btcTx = _btcTx;
|
|
352
366
|
}
|
|
353
|
-
const withdrawalData = await this.
|
|
367
|
+
const withdrawalData = await this._contract.getWithdrawalData(btcTx);
|
|
354
368
|
abortSignal.throwIfAborted();
|
|
355
369
|
pendingWithdrawals.unshift(withdrawalData);
|
|
356
370
|
utxo = pendingWithdrawals[0].getSpentVaultUtxo();
|
|
357
371
|
this.logger.debug("verifyReturnedData(): Vault UTXO: " + vault.getUtxo() + " current utxo: " + utxo);
|
|
358
|
-
if (pendingWithdrawals.length >= this.
|
|
359
|
-
throw new IntermediaryError_1.IntermediaryError("BTC <> SC state difference too deep, maximum: " + this.
|
|
372
|
+
if (pendingWithdrawals.length >= this._options.maxTransactionsDelta)
|
|
373
|
+
throw new IntermediaryError_1.IntermediaryError("BTC <> SC state difference too deep, maximum: " + this._options.maxTransactionsDelta);
|
|
360
374
|
}
|
|
361
375
|
//Verify that the vault has enough balance after processing all pending withdrawals
|
|
362
376
|
let vaultBalances;
|
|
@@ -376,7 +390,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
376
390
|
//Also verify that all the withdrawal txns are valid, this is an extra sanity check
|
|
377
391
|
try {
|
|
378
392
|
for (let withdrawal of pendingWithdrawals) {
|
|
379
|
-
await this.
|
|
393
|
+
await this._contract.checkWithdrawalTx(withdrawal);
|
|
380
394
|
}
|
|
381
395
|
}
|
|
382
396
|
catch (e) {
|
|
@@ -390,16 +404,18 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
390
404
|
};
|
|
391
405
|
}
|
|
392
406
|
/**
|
|
393
|
-
* Returns a newly created swap
|
|
407
|
+
* Returns a newly created Bitcoin -> Smart chain swap using the SPV vault (UTXO-controlled vault) swap protocol,
|
|
408
|
+
* with the passed amount. Also allows specifying additional "gas drop" native token that the receipient receives
|
|
409
|
+
* on the destination chain in the `options` argument.
|
|
394
410
|
*
|
|
395
|
-
* @param
|
|
396
|
-
* @param amountData
|
|
397
|
-
* @param lps
|
|
398
|
-
* @param options
|
|
399
|
-
* @param additionalParams
|
|
400
|
-
* @param abortSignal
|
|
411
|
+
* @param recipient Recipient address on the destination smart chain
|
|
412
|
+
* @param amountData Amount, token and exact input/output data for to swap
|
|
413
|
+
* @param lps An array of intermediaries (LPs) to get the quotes from
|
|
414
|
+
* @param options Optional additional quote options
|
|
415
|
+
* @param additionalParams Optional additional parameters sent to the LP when creating the swap
|
|
416
|
+
* @param abortSignal Abort signal
|
|
401
417
|
*/
|
|
402
|
-
create(
|
|
418
|
+
create(recipient, amountData, lps, options, additionalParams, abortSignal) {
|
|
403
419
|
const _options = {
|
|
404
420
|
gasAmount: options?.gasAmount ?? 0n,
|
|
405
421
|
unsafeZeroWatchtowerFee: options?.unsafeZeroWatchtowerFee ?? false,
|
|
@@ -410,14 +426,14 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
410
426
|
const pricePrefetchPromise = this.preFetchPrice(amountData, _abortController.signal);
|
|
411
427
|
const usdPricePrefetchPromise = this.preFetchUsdPrice(_abortController.signal);
|
|
412
428
|
const finalizedBlockHeightPrefetchPromise = this.preFetchFinalizedBlockHeight(_abortController);
|
|
413
|
-
const nativeTokenAddress = this.
|
|
429
|
+
const nativeTokenAddress = this._chain.getNativeCurrencyAddress();
|
|
414
430
|
const gasTokenPricePrefetchPromise = _options.gasAmount === 0n ?
|
|
415
431
|
undefined :
|
|
416
432
|
this.preFetchPrice({ token: nativeTokenAddress }, _abortController.signal);
|
|
417
433
|
const callerFeePrefetchPromise = this.preFetchCallerFeeShare(amountData, _options, pricePrefetchPromise, gasTokenPricePrefetchPromise, _abortController);
|
|
418
434
|
const bitcoinFeeRatePromise = _options.maxAllowedNetworkFeeRate != Infinity ?
|
|
419
435
|
Promise.resolve(_options.maxAllowedNetworkFeeRate) :
|
|
420
|
-
this.
|
|
436
|
+
this._btcRpc.getFeeRate().then(x => this._options.maxBtcFeeOffset + (x * this._options.maxBtcFeeMultiplier)).catch(e => {
|
|
421
437
|
_abortController.abort(e);
|
|
422
438
|
return undefined;
|
|
423
439
|
});
|
|
@@ -431,7 +447,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
431
447
|
try {
|
|
432
448
|
const resp = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
|
|
433
449
|
return await IntermediaryAPI_1.IntermediaryAPI.prepareSpvFromBTC(this.chainIdentifier, lp.url, {
|
|
434
|
-
address:
|
|
450
|
+
address: recipient,
|
|
435
451
|
amount: amountData.amount,
|
|
436
452
|
token: amountData.token.toString(),
|
|
437
453
|
exactOut: !amountData.exactIn,
|
|
@@ -440,7 +456,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
440
456
|
callerFeeRate: (0, Utils_1.throwIfUndefined)(callerFeePrefetchPromise, "Caller fee prefetch failed!"),
|
|
441
457
|
frontingFeeRate: 0n,
|
|
442
458
|
additionalParams
|
|
443
|
-
}, this.
|
|
459
|
+
}, this._options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
|
|
444
460
|
}, undefined, e => e instanceof RequestError_1.RequestError, abortController.signal);
|
|
445
461
|
this.logger.debug("create(" + lp.url + "): LP response: ", resp);
|
|
446
462
|
const callerFeeShare = (await callerFeePrefetchPromise);
|
|
@@ -458,7 +474,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
458
474
|
swapFeeBtc: resp.swapFeeBtc,
|
|
459
475
|
exactIn: amountData.exactIn ?? true,
|
|
460
476
|
quoteId: resp.quoteId,
|
|
461
|
-
recipient
|
|
477
|
+
recipient,
|
|
462
478
|
vaultOwner: resp.address,
|
|
463
479
|
vaultId: resp.vaultId,
|
|
464
480
|
vaultRequiredConfirmations: vault.getConfirmations(),
|
|
@@ -495,11 +511,114 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
495
511
|
};
|
|
496
512
|
});
|
|
497
513
|
}
|
|
514
|
+
/**
|
|
515
|
+
* Recovers an SPV vault (UTXO-controlled vault) based swap from smart chain on-chain data
|
|
516
|
+
*
|
|
517
|
+
* @param state State of the spv vault withdrawal recovered from on-chain data
|
|
518
|
+
* @param vault SPV vault processing the swap
|
|
519
|
+
* @param lp Intermediary (LP) used as a counterparty for the swap
|
|
520
|
+
*/
|
|
521
|
+
async recoverFromState(state, vault, lp) {
|
|
522
|
+
//Get the vault
|
|
523
|
+
vault ??= await this._contract.getVaultData(state.owner, state.vaultId);
|
|
524
|
+
if (vault == null)
|
|
525
|
+
return null;
|
|
526
|
+
if (state.btcTxId == null)
|
|
527
|
+
return null;
|
|
528
|
+
const btcTx = await this._btcRpc.getTransaction(state.btcTxId);
|
|
529
|
+
if (btcTx == null)
|
|
530
|
+
return null;
|
|
531
|
+
const withdrawalData = await this._contract.getWithdrawalData(btcTx)
|
|
532
|
+
.catch(e => {
|
|
533
|
+
this.logger.warn(`Error parsing withdrawal data for tx ${btcTx.txid}: `, e);
|
|
534
|
+
return null;
|
|
535
|
+
});
|
|
536
|
+
if (withdrawalData == null)
|
|
537
|
+
return null;
|
|
538
|
+
const vaultTokens = vault.getTokenData();
|
|
539
|
+
const withdrawalDataOutputs = withdrawalData.getTotalOutput();
|
|
540
|
+
const txBlock = await state.getTxBlock?.();
|
|
541
|
+
const swapInit = {
|
|
542
|
+
pricingInfo: {
|
|
543
|
+
isValid: true,
|
|
544
|
+
satsBaseFee: 0n,
|
|
545
|
+
swapPriceUSatPerToken: 100000000000000n,
|
|
546
|
+
realPriceUSatPerToken: 100000000000000n,
|
|
547
|
+
differencePPM: 0n,
|
|
548
|
+
feePPM: 0n,
|
|
549
|
+
},
|
|
550
|
+
url: lp?.url,
|
|
551
|
+
expiry: 0,
|
|
552
|
+
swapFee: 0n,
|
|
553
|
+
swapFeeBtc: 0n,
|
|
554
|
+
exactIn: true,
|
|
555
|
+
//Use bitcoin tx id as quote id, even though this is not strictly correct as this
|
|
556
|
+
// is an off-chain identifier presented by the LP that cannot be recovered from on-chain
|
|
557
|
+
// data
|
|
558
|
+
quoteId: btcTx.txid,
|
|
559
|
+
recipient: state.recipient,
|
|
560
|
+
vaultOwner: state.owner,
|
|
561
|
+
vaultId: state.vaultId,
|
|
562
|
+
vaultRequiredConfirmations: vault.getConfirmations(),
|
|
563
|
+
vaultTokenMultipliers: vault.getTokenData().map(val => val.multiplier),
|
|
564
|
+
vaultBtcAddress: (0, BitcoinUtils_1.fromOutputScript)(this._options.bitcoinNetwork, withdrawalData.getNewVaultScript().toString("hex")),
|
|
565
|
+
vaultUtxo: withdrawalData.getSpentVaultUtxo(),
|
|
566
|
+
vaultUtxoValue: BigInt(withdrawalData.getNewVaultBtcAmount()),
|
|
567
|
+
btcDestinationAddress: (0, BitcoinUtils_1.fromOutputScript)(this._options.bitcoinNetwork, btcTx.outs[2].scriptPubKey.hex),
|
|
568
|
+
btcAmount: BigInt(btcTx.outs[2].value),
|
|
569
|
+
btcAmountSwap: BigInt(btcTx.outs[2].value),
|
|
570
|
+
btcAmountGas: 0n,
|
|
571
|
+
minimumBtcFeeRate: 0,
|
|
572
|
+
outputTotalSwap: withdrawalDataOutputs[0] * vaultTokens[0].multiplier,
|
|
573
|
+
outputSwapToken: vaultTokens[0].token,
|
|
574
|
+
outputTotalGas: withdrawalDataOutputs[1] * vaultTokens[1].multiplier,
|
|
575
|
+
outputGasToken: vaultTokens[1].token,
|
|
576
|
+
gasSwapFeeBtc: 0n,
|
|
577
|
+
gasSwapFee: 0n,
|
|
578
|
+
gasPricingInfo: {
|
|
579
|
+
isValid: true,
|
|
580
|
+
satsBaseFee: 0n,
|
|
581
|
+
swapPriceUSatPerToken: 100000000000000n,
|
|
582
|
+
realPriceUSatPerToken: 100000000000000n,
|
|
583
|
+
differencePPM: 0n,
|
|
584
|
+
feePPM: 0n,
|
|
585
|
+
},
|
|
586
|
+
callerFeeShare: withdrawalData.callerFeeRate,
|
|
587
|
+
frontingFeeShare: withdrawalData.frontingFeeRate,
|
|
588
|
+
executionFeeShare: withdrawalData.executionFeeRate,
|
|
589
|
+
genesisSmartChainBlockHeight: txBlock?.blockHeight ?? 0
|
|
590
|
+
};
|
|
591
|
+
const quote = new SpvFromBTCSwap_1.SpvFromBTCSwap(this, swapInit);
|
|
592
|
+
quote._data = withdrawalData;
|
|
593
|
+
if (txBlock != null) {
|
|
594
|
+
quote.createdAt = txBlock.blockTime * 1000;
|
|
595
|
+
}
|
|
596
|
+
else if (btcTx.blockhash == null) {
|
|
597
|
+
quote.createdAt = Date.now();
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
600
|
+
const blockHeader = await this._btcRpc.getBlockHeader(btcTx.blockhash);
|
|
601
|
+
quote.createdAt = blockHeader == null ? Date.now() : blockHeader.getTimestamp() * 1000;
|
|
602
|
+
}
|
|
603
|
+
quote._setInitiated();
|
|
604
|
+
if (btcTx.inputAddresses != null)
|
|
605
|
+
quote._senderAddress = btcTx.inputAddresses[1];
|
|
606
|
+
if (state.type === base_1.SpvWithdrawalStateType.FRONTED) {
|
|
607
|
+
quote._frontTxId = state.txId;
|
|
608
|
+
quote._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.FRONTED;
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
quote._claimTxId = state.txId;
|
|
612
|
+
quote._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLAIMED;
|
|
613
|
+
}
|
|
614
|
+
await quote._save();
|
|
615
|
+
return quote;
|
|
616
|
+
}
|
|
498
617
|
/**
|
|
499
618
|
* Returns a random dummy PSBT that can be used for fee estimation, the last output (the LP output) is omitted
|
|
500
619
|
* to allow for coinselection algorithm to determine maximum sendable amount there
|
|
501
620
|
*
|
|
502
|
-
* @param includeGasToken
|
|
621
|
+
* @param includeGasToken Whether to return the PSBT also with the gas token amount (increases the vSize by 8)
|
|
503
622
|
*/
|
|
504
623
|
getDummySwapPsbt(includeGasToken = false) {
|
|
505
624
|
//Construct dummy swap psbt
|
|
@@ -521,7 +640,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
521
640
|
script: randomVaultOutScript,
|
|
522
641
|
amount: 600n
|
|
523
642
|
});
|
|
524
|
-
const opReturnData = this.
|
|
643
|
+
const opReturnData = this._contract.toOpReturnData(this._chain.randomAddress(), includeGasToken ? [0xffffffffffffffffn, 0xffffffffffffffffn] : [0xffffffffffffffffn]);
|
|
525
644
|
psbt.addOutput({
|
|
526
645
|
script: Buffer.concat([
|
|
527
646
|
opReturnData.length <= 75 ? Buffer.from([0x6a, opReturnData.length]) : Buffer.from([0x6a, 0x4c, opReturnData.length]),
|
|
@@ -531,31 +650,35 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
531
650
|
});
|
|
532
651
|
return psbt;
|
|
533
652
|
}
|
|
653
|
+
/**
|
|
654
|
+
* @inheritDoc
|
|
655
|
+
* @internal
|
|
656
|
+
*/
|
|
534
657
|
async _checkPastSwaps(pastSwaps) {
|
|
535
658
|
const changedSwaps = new Set();
|
|
536
659
|
const removeSwaps = [];
|
|
537
660
|
const broadcastedOrConfirmedSwaps = [];
|
|
538
661
|
for (let pastSwap of pastSwaps) {
|
|
539
662
|
let changed = false;
|
|
540
|
-
if (pastSwap.
|
|
541
|
-
pastSwap.
|
|
542
|
-
pastSwap.
|
|
543
|
-
pastSwap.
|
|
544
|
-
pastSwap.
|
|
545
|
-
pastSwap.
|
|
663
|
+
if (pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED ||
|
|
664
|
+
pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
|
|
665
|
+
pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED ||
|
|
666
|
+
pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED ||
|
|
667
|
+
pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
|
|
668
|
+
pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
|
|
546
669
|
//Check BTC transaction
|
|
547
670
|
if (await pastSwap._syncStateFromBitcoin(false))
|
|
548
671
|
changed ||= true;
|
|
549
672
|
}
|
|
550
|
-
if (pastSwap.
|
|
551
|
-
pastSwap.
|
|
552
|
-
pastSwap.
|
|
553
|
-
if (pastSwap.
|
|
554
|
-
if (pastSwap.
|
|
555
|
-
pastSwap.
|
|
673
|
+
if (pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED ||
|
|
674
|
+
pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED ||
|
|
675
|
+
pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED) {
|
|
676
|
+
if (await pastSwap._verifyQuoteDefinitelyExpired()) {
|
|
677
|
+
if (pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED) {
|
|
678
|
+
pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_EXPIRED;
|
|
556
679
|
}
|
|
557
680
|
else {
|
|
558
|
-
pastSwap.
|
|
681
|
+
pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED;
|
|
559
682
|
}
|
|
560
683
|
changed ||= true;
|
|
561
684
|
}
|
|
@@ -566,56 +689,53 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
|
|
|
566
689
|
}
|
|
567
690
|
if (changed)
|
|
568
691
|
changedSwaps.add(pastSwap);
|
|
569
|
-
if (pastSwap.
|
|
570
|
-
if (pastSwap.
|
|
692
|
+
if (pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
|
|
693
|
+
if (pastSwap._data != null)
|
|
571
694
|
broadcastedOrConfirmedSwaps.push(pastSwap);
|
|
572
695
|
}
|
|
573
696
|
}
|
|
574
697
|
const checkWithdrawalStateSwaps = [];
|
|
575
|
-
const _fronts = await this.
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
withdrawal: val.data
|
|
579
|
-
})));
|
|
580
|
-
const _vaultUtxos = await this.contract.getVaultLatestUtxos(broadcastedOrConfirmedSwaps.map(val => ({
|
|
581
|
-
owner: val.vaultOwner,
|
|
582
|
-
vaultId: val.vaultId
|
|
698
|
+
const _fronts = await this._contract.getFronterAddresses(broadcastedOrConfirmedSwaps.map(val => ({
|
|
699
|
+
...val.getSpvVaultData(),
|
|
700
|
+
withdrawal: val._data
|
|
583
701
|
})));
|
|
702
|
+
const _vaultUtxos = await this._contract.getVaultLatestUtxos(broadcastedOrConfirmedSwaps.map(val => val.getSpvVaultData()));
|
|
584
703
|
for (const pastSwap of broadcastedOrConfirmedSwaps) {
|
|
585
|
-
const fronterAddress = _fronts[pastSwap.
|
|
586
|
-
const
|
|
704
|
+
const fronterAddress = _fronts[pastSwap._data.getTxId()];
|
|
705
|
+
const vault = pastSwap.getSpvVaultData();
|
|
706
|
+
const latestVaultUtxo = _vaultUtxos[vault.owner]?.[vault.vaultId.toString(10)];
|
|
587
707
|
if (fronterAddress === undefined)
|
|
588
|
-
this.logger.warn(`_checkPastSwaps(): No fronter address returned for ${pastSwap.
|
|
708
|
+
this.logger.warn(`_checkPastSwaps(): No fronter address returned for ${pastSwap._data.getTxId()}`);
|
|
589
709
|
if (latestVaultUtxo === undefined)
|
|
590
|
-
this.logger.warn(`_checkPastSwaps(): No last vault utxo returned for ${pastSwap.
|
|
710
|
+
this.logger.warn(`_checkPastSwaps(): No last vault utxo returned for ${pastSwap._data.getTxId()}`);
|
|
591
711
|
if (await pastSwap._shouldCheckWithdrawalState(fronterAddress, latestVaultUtxo))
|
|
592
712
|
checkWithdrawalStateSwaps.push(pastSwap);
|
|
593
713
|
}
|
|
594
|
-
const withdrawalStates = await this.
|
|
595
|
-
withdrawal: val.
|
|
596
|
-
scStartBlockheight: val.
|
|
714
|
+
const withdrawalStates = await this._contract.getWithdrawalStates(checkWithdrawalStateSwaps.map(val => ({
|
|
715
|
+
withdrawal: val._data,
|
|
716
|
+
scStartBlockheight: val._genesisSmartChainBlockHeight
|
|
597
717
|
})));
|
|
598
718
|
for (const pastSwap of checkWithdrawalStateSwaps) {
|
|
599
|
-
const status = withdrawalStates[pastSwap.
|
|
719
|
+
const status = withdrawalStates[pastSwap._data.getTxId()];
|
|
600
720
|
if (status == null) {
|
|
601
|
-
this.logger.warn(`_checkPastSwaps(): No withdrawal state returned for ${pastSwap.
|
|
721
|
+
this.logger.warn(`_checkPastSwaps(): No withdrawal state returned for ${pastSwap._data.getTxId()}`);
|
|
602
722
|
continue;
|
|
603
723
|
}
|
|
604
|
-
this.logger.debug("syncStateFromChain(): status of " + pastSwap.
|
|
724
|
+
this.logger.debug("syncStateFromChain(): status of " + pastSwap._data.btcTx.txid, status?.type);
|
|
605
725
|
let changed = false;
|
|
606
726
|
switch (status.type) {
|
|
607
727
|
case base_1.SpvWithdrawalStateType.FRONTED:
|
|
608
|
-
pastSwap.
|
|
609
|
-
pastSwap.
|
|
728
|
+
pastSwap._frontTxId = status.txId;
|
|
729
|
+
pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.FRONTED;
|
|
610
730
|
changed ||= true;
|
|
611
731
|
break;
|
|
612
732
|
case base_1.SpvWithdrawalStateType.CLAIMED:
|
|
613
|
-
pastSwap.
|
|
614
|
-
pastSwap.
|
|
733
|
+
pastSwap._claimTxId = status.txId;
|
|
734
|
+
pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLAIMED;
|
|
615
735
|
changed ||= true;
|
|
616
736
|
break;
|
|
617
737
|
case base_1.SpvWithdrawalStateType.CLOSED:
|
|
618
|
-
pastSwap.
|
|
738
|
+
pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLOSED;
|
|
619
739
|
changed ||= true;
|
|
620
740
|
break;
|
|
621
741
|
}
|