@atomiqlabs/sdk 8.1.8 → 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 +302 -221
- 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 +512 -378
- 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
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {SwapType} from "../../../enums/SwapType";
|
|
2
2
|
import {ChainType} from "@atomiqlabs/base";
|
|
3
|
-
import {PaymentAuthError} from "../../../errors/PaymentAuthError";
|
|
4
3
|
import {toBigInt} from "../../../utils/Utils";
|
|
5
4
|
import {parsePsbtTransaction, toOutputScript} from "../../../utils/BitcoinUtils";
|
|
6
5
|
import {isISwapInit, ISwap, ISwapInit} from "../../ISwap";
|
|
@@ -24,17 +23,37 @@ import {BitcoinTokens, BtcToken, SCToken} from "../../../types/Token";
|
|
|
24
23
|
import {getLogger, LoggerType} from "../../../utils/Logger";
|
|
25
24
|
import {timeoutPromise} from "../../../utils/TimeoutUtils";
|
|
26
25
|
import {toBitcoinWallet} from "../../../utils/BitcoinWalletUtils";
|
|
26
|
+
import {SwapExecutionActionBitcoin} from "../../../types/SwapExecutionAction";
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* State enum for trusted on-chain gas swaps
|
|
30
|
+
*
|
|
30
31
|
* @category Swaps
|
|
31
32
|
*/
|
|
32
33
|
export enum OnchainForGasSwapState {
|
|
34
|
+
/**
|
|
35
|
+
* The swap quote expired without user sending in the BTC
|
|
36
|
+
*/
|
|
33
37
|
EXPIRED = -3,
|
|
38
|
+
/**
|
|
39
|
+
* The swap has failed after the intermediary already received the BTC on the source chain
|
|
40
|
+
*/
|
|
34
41
|
FAILED = -2,
|
|
42
|
+
/**
|
|
43
|
+
* Swap was refunded and BTC returned to the user's refund address
|
|
44
|
+
*/
|
|
35
45
|
REFUNDED = -1,
|
|
46
|
+
/**
|
|
47
|
+
* Swap was created
|
|
48
|
+
*/
|
|
36
49
|
PR_CREATED = 0,
|
|
50
|
+
/**
|
|
51
|
+
* The swap is finished after the intermediary sent funds on the destination chain
|
|
52
|
+
*/
|
|
37
53
|
FINISHED = 1,
|
|
54
|
+
/**
|
|
55
|
+
* Swap is refundable because the intermediary cannot honor the swap request on the destination chain
|
|
56
|
+
*/
|
|
38
57
|
REFUNDABLE = 2
|
|
39
58
|
}
|
|
40
59
|
|
|
@@ -62,12 +81,16 @@ export function isOnchainForGasSwapInit(obj: any): obj is OnchainForGasSwapInit
|
|
|
62
81
|
}
|
|
63
82
|
|
|
64
83
|
/**
|
|
65
|
-
* Trusted
|
|
84
|
+
* Trusted swap for Bitcoin -> Smart chains, to be used for minor amounts to get gas tokens on the
|
|
85
|
+
* destination chain, which is only needed for Solana, which still uses legacy swaps
|
|
86
|
+
*
|
|
66
87
|
* @category Swaps
|
|
67
88
|
*/
|
|
68
89
|
export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T, OnchainForGasSwapTypeDefinition<T>> implements IAddressSwap, IBTCWalletSwap {
|
|
69
|
-
|
|
70
|
-
|
|
90
|
+
protected readonly TYPE: SwapType.TRUSTED_FROM_BTC = SwapType.TRUSTED_FROM_BTC;
|
|
91
|
+
/**
|
|
92
|
+
* @internal
|
|
93
|
+
*/
|
|
71
94
|
protected readonly logger: LoggerType;
|
|
72
95
|
|
|
73
96
|
//State: PR_CREATED
|
|
@@ -81,13 +104,28 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
81
104
|
private refundAddress?: string;
|
|
82
105
|
|
|
83
106
|
//State: FINISHED
|
|
84
|
-
|
|
85
|
-
|
|
107
|
+
/**
|
|
108
|
+
* Destination transaction ID on the smart chain side
|
|
109
|
+
* @private
|
|
110
|
+
*/
|
|
111
|
+
private scTxId?: string;
|
|
112
|
+
/**
|
|
113
|
+
* Source transaction ID on the source (bitcoin) side
|
|
114
|
+
* @private
|
|
115
|
+
*/
|
|
116
|
+
private txId?: string;
|
|
86
117
|
|
|
87
118
|
//State: REFUNDED
|
|
88
|
-
|
|
119
|
+
/**
|
|
120
|
+
* Transaction ID on the source (bitcoin) side used for refunding the funds back to the user
|
|
121
|
+
* @private
|
|
122
|
+
*/
|
|
123
|
+
private refundTxId?: string;
|
|
89
124
|
|
|
90
|
-
|
|
125
|
+
/**
|
|
126
|
+
* @internal
|
|
127
|
+
*/
|
|
128
|
+
protected readonly wrapper: OnchainForGasWrapper<T>;
|
|
91
129
|
|
|
92
130
|
constructor(wrapper: OnchainForGasWrapper<T>, init: OnchainForGasSwapInit);
|
|
93
131
|
constructor(wrapper: OnchainForGasWrapper<T>, obj: any);
|
|
@@ -107,7 +145,7 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
107
145
|
this.recipient = initOrObj.recipient;
|
|
108
146
|
this.token = initOrObj.token;
|
|
109
147
|
this.refundAddress = initOrObj.refundAddress;
|
|
110
|
-
this.
|
|
148
|
+
this._state = OnchainForGasSwapState.PR_CREATED;
|
|
111
149
|
} else {
|
|
112
150
|
this.paymentHash = initOrObj.paymentHash;
|
|
113
151
|
this.sequence = toBigInt(initOrObj.sequence);
|
|
@@ -125,6 +163,10 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
125
163
|
this.tryRecomputeSwapPrice();
|
|
126
164
|
}
|
|
127
165
|
|
|
166
|
+
/**
|
|
167
|
+
* @inheritDoc
|
|
168
|
+
* @internal
|
|
169
|
+
*/
|
|
128
170
|
protected upgradeVersion() {
|
|
129
171
|
if(this.version == null) {
|
|
130
172
|
//Noop
|
|
@@ -133,8 +175,8 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
133
175
|
}
|
|
134
176
|
|
|
135
177
|
/**
|
|
136
|
-
*
|
|
137
|
-
* @
|
|
178
|
+
* @inheritDoc
|
|
179
|
+
* @internal
|
|
138
180
|
*/
|
|
139
181
|
protected tryRecomputeSwapPrice() {
|
|
140
182
|
if(this.swapFeeBtc==null && this.swapFee!=null) {
|
|
@@ -147,64 +189,119 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
147
189
|
//////////////////////////////
|
|
148
190
|
//// Getters & utils
|
|
149
191
|
|
|
192
|
+
/**
|
|
193
|
+
* @inheritDoc
|
|
194
|
+
* @internal
|
|
195
|
+
*/
|
|
150
196
|
_getEscrowHash(): string {
|
|
151
197
|
return this.paymentHash;
|
|
152
198
|
}
|
|
153
199
|
|
|
200
|
+
/**
|
|
201
|
+
* @inheritDoc
|
|
202
|
+
*/
|
|
154
203
|
getOutputAddress(): string | null {
|
|
155
204
|
return this.recipient;
|
|
156
205
|
}
|
|
157
206
|
|
|
207
|
+
/**
|
|
208
|
+
* @inheritDoc
|
|
209
|
+
*/
|
|
158
210
|
getInputAddress(): string | null {
|
|
159
211
|
//TODO: Fuck this, it's not used anyway
|
|
160
212
|
return null;
|
|
161
213
|
}
|
|
162
214
|
|
|
215
|
+
/**
|
|
216
|
+
* @inheritDoc
|
|
217
|
+
*/
|
|
163
218
|
getInputTxId(): string | null {
|
|
164
219
|
return this.txId ?? null;
|
|
165
220
|
}
|
|
166
221
|
|
|
222
|
+
/**
|
|
223
|
+
* @inheritDoc
|
|
224
|
+
*/
|
|
167
225
|
getOutputTxId(): string | null {
|
|
168
226
|
return this.scTxId ?? null;
|
|
169
227
|
}
|
|
170
228
|
|
|
229
|
+
/**
|
|
230
|
+
* @inheritDoc
|
|
231
|
+
*/
|
|
171
232
|
getId(): string {
|
|
172
233
|
return this.paymentHash;
|
|
173
234
|
}
|
|
174
235
|
|
|
236
|
+
/**
|
|
237
|
+
* @inheritDoc
|
|
238
|
+
*/
|
|
175
239
|
getAddress(): string {
|
|
176
240
|
return this.address;
|
|
177
241
|
}
|
|
178
242
|
|
|
243
|
+
/**
|
|
244
|
+
* @inheritDoc
|
|
245
|
+
*/
|
|
179
246
|
getHyperlink(): string {
|
|
180
247
|
return "bitcoin:"+this.address+"?amount="+encodeURIComponent((Number(this.inputAmount)/100000000).toString(10));
|
|
181
248
|
}
|
|
182
249
|
|
|
250
|
+
/**
|
|
251
|
+
* @inheritDoc
|
|
252
|
+
*/
|
|
183
253
|
requiresAction(): boolean {
|
|
184
|
-
return this.
|
|
254
|
+
return this._state===OnchainForGasSwapState.REFUNDABLE;
|
|
185
255
|
}
|
|
186
256
|
|
|
257
|
+
/**
|
|
258
|
+
* @inheritDoc
|
|
259
|
+
*/
|
|
187
260
|
isFinished(): boolean {
|
|
188
|
-
return this.
|
|
261
|
+
return this._state===OnchainForGasSwapState.FINISHED || this._state===OnchainForGasSwapState.FAILED || this._state===OnchainForGasSwapState.EXPIRED || this._state===OnchainForGasSwapState.REFUNDED;
|
|
189
262
|
}
|
|
190
263
|
|
|
264
|
+
/**
|
|
265
|
+
* @inheritDoc
|
|
266
|
+
*/
|
|
191
267
|
isQuoteExpired(): boolean {
|
|
192
|
-
return this.
|
|
268
|
+
return this._state===OnchainForGasSwapState.EXPIRED;
|
|
193
269
|
}
|
|
194
270
|
|
|
271
|
+
/**
|
|
272
|
+
* @inheritDoc
|
|
273
|
+
*/
|
|
195
274
|
isQuoteSoftExpired(): boolean {
|
|
196
275
|
return this.expiry<Date.now();
|
|
197
276
|
}
|
|
198
277
|
|
|
278
|
+
/**
|
|
279
|
+
* @inheritDoc
|
|
280
|
+
*/
|
|
199
281
|
isFailed(): boolean {
|
|
200
|
-
return this.
|
|
282
|
+
return this._state===OnchainForGasSwapState.FAILED;
|
|
201
283
|
}
|
|
202
284
|
|
|
285
|
+
/**
|
|
286
|
+
* @inheritDoc
|
|
287
|
+
*/
|
|
203
288
|
isSuccessful(): boolean {
|
|
204
|
-
return this.
|
|
289
|
+
return this._state===OnchainForGasSwapState.FINISHED;
|
|
205
290
|
}
|
|
206
291
|
|
|
207
|
-
|
|
292
|
+
/**
|
|
293
|
+
* @inheritDoc
|
|
294
|
+
* @internal
|
|
295
|
+
*/
|
|
296
|
+
_verifyQuoteDefinitelyExpired(): Promise<boolean> {
|
|
297
|
+
return Promise.resolve(this.expiry<Date.now());
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* @inheritDoc
|
|
302
|
+
* @internal
|
|
303
|
+
*/
|
|
304
|
+
_verifyQuoteValid(): Promise<boolean> {
|
|
208
305
|
return Promise.resolve(this.expiry>Date.now());
|
|
209
306
|
}
|
|
210
307
|
|
|
@@ -212,64 +309,96 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
212
309
|
//////////////////////////////
|
|
213
310
|
//// Amounts & fees
|
|
214
311
|
|
|
312
|
+
/**
|
|
313
|
+
* Returns an output amount in base units without a swap fee included, hence this value
|
|
314
|
+
* is larger than the actual output amount
|
|
315
|
+
*
|
|
316
|
+
* @internal
|
|
317
|
+
*/
|
|
215
318
|
protected getOutAmountWithoutFee(): bigint {
|
|
216
319
|
return this.outputAmount + (this.swapFee ?? 0n);
|
|
217
320
|
}
|
|
218
321
|
|
|
322
|
+
/**
|
|
323
|
+
* @inheritDoc
|
|
324
|
+
*/
|
|
219
325
|
getOutputToken(): SCToken<T["ChainId"]> {
|
|
220
|
-
return this.wrapper.
|
|
326
|
+
return this.wrapper._tokens[this.wrapper._chain.getNativeCurrencyAddress()];
|
|
221
327
|
}
|
|
222
328
|
|
|
329
|
+
/**
|
|
330
|
+
* @inheritDoc
|
|
331
|
+
*/
|
|
223
332
|
getOutput(): TokenAmount<T["ChainId"], SCToken<T["ChainId"]>, true> {
|
|
224
333
|
return toTokenAmount(
|
|
225
|
-
this.outputAmount, this.wrapper.
|
|
226
|
-
this.wrapper.
|
|
334
|
+
this.outputAmount, this.wrapper._tokens[this.wrapper._chain.getNativeCurrencyAddress()],
|
|
335
|
+
this.wrapper._prices, this.pricingInfo
|
|
227
336
|
);
|
|
228
337
|
}
|
|
229
338
|
|
|
339
|
+
/**
|
|
340
|
+
* @inheritDoc
|
|
341
|
+
*/
|
|
230
342
|
getInputToken(): BtcToken<false> {
|
|
231
343
|
return BitcoinTokens.BTC;
|
|
232
344
|
}
|
|
233
345
|
|
|
346
|
+
/**
|
|
347
|
+
* @inheritDoc
|
|
348
|
+
*/
|
|
234
349
|
getInput(): TokenAmount<T["ChainId"], BtcToken<false>, true> {
|
|
235
|
-
return toTokenAmount(this.inputAmount, BitcoinTokens.BTC, this.wrapper.
|
|
350
|
+
return toTokenAmount(this.inputAmount, BitcoinTokens.BTC, this.wrapper._prices, this.pricingInfo);
|
|
236
351
|
}
|
|
237
352
|
|
|
353
|
+
/**
|
|
354
|
+
* @inheritDoc
|
|
355
|
+
*/
|
|
238
356
|
getInputWithoutFee(): TokenAmount<T["ChainId"], BtcToken<false>, true> {
|
|
239
357
|
return toTokenAmount(
|
|
240
358
|
this.inputAmount - (this.swapFeeBtc ?? 0n), BitcoinTokens.BTC,
|
|
241
|
-
this.wrapper.
|
|
359
|
+
this.wrapper._prices, this.pricingInfo
|
|
242
360
|
);
|
|
243
361
|
}
|
|
244
362
|
|
|
363
|
+
/**
|
|
364
|
+
* Returns the swap fee charged by the intermediary (LP) on this swap
|
|
365
|
+
*
|
|
366
|
+
* @internal
|
|
367
|
+
*/
|
|
245
368
|
protected getSwapFee(): Fee<T["ChainId"], BtcToken<false>, SCToken<T["ChainId"]>> {
|
|
246
369
|
if(this.pricingInfo==null) throw new Error("No pricing info known!");
|
|
247
370
|
const feeWithoutBaseFee = this.swapFeeBtc==null ? 0n : this.swapFeeBtc - this.pricingInfo.satsBaseFee;
|
|
248
371
|
const swapFeePPM = feeWithoutBaseFee * 1000000n / this.getInputWithoutFee().rawAmount;
|
|
249
372
|
|
|
250
373
|
const amountInSrcToken = toTokenAmount(
|
|
251
|
-
this.swapFeeBtc ?? 0n, BitcoinTokens.BTC, this.wrapper.
|
|
374
|
+
this.swapFeeBtc ?? 0n, BitcoinTokens.BTC, this.wrapper._prices, this.pricingInfo
|
|
252
375
|
);
|
|
253
376
|
return {
|
|
254
377
|
amountInSrcToken,
|
|
255
378
|
amountInDstToken: toTokenAmount(
|
|
256
|
-
this.swapFee ?? 0n, this.wrapper.
|
|
257
|
-
this.wrapper.
|
|
379
|
+
this.swapFee ?? 0n, this.wrapper._tokens[this.wrapper._chain.getNativeCurrencyAddress()],
|
|
380
|
+
this.wrapper._prices, this.pricingInfo
|
|
258
381
|
),
|
|
259
382
|
currentUsdValue: amountInSrcToken.currentUsdValue,
|
|
260
383
|
usdValue: amountInSrcToken.usdValue,
|
|
261
384
|
pastUsdValue: amountInSrcToken.pastUsdValue,
|
|
262
385
|
composition: {
|
|
263
|
-
base: toTokenAmount(this.pricingInfo.satsBaseFee, BitcoinTokens.BTC, this.wrapper.
|
|
386
|
+
base: toTokenAmount(this.pricingInfo.satsBaseFee, BitcoinTokens.BTC, this.wrapper._prices, this.pricingInfo),
|
|
264
387
|
percentage: ppmToPercentage(swapFeePPM)
|
|
265
388
|
}
|
|
266
389
|
};
|
|
267
390
|
}
|
|
268
391
|
|
|
392
|
+
/**
|
|
393
|
+
* @inheritDoc
|
|
394
|
+
*/
|
|
269
395
|
getFee(): Fee<T["ChainId"], BtcToken<false>, SCToken<T["ChainId"]>> {
|
|
270
396
|
return this.getSwapFee();
|
|
271
397
|
}
|
|
272
398
|
|
|
399
|
+
/**
|
|
400
|
+
* @inheritDoc
|
|
401
|
+
*/
|
|
273
402
|
getFeeBreakdown(): [{type: FeeType.SWAP, fee: Fee<T["ChainId"], BtcToken<false>, SCToken<T["ChainId"]>>}] {
|
|
274
403
|
return [{
|
|
275
404
|
type: FeeType.SWAP,
|
|
@@ -277,32 +406,29 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
277
406
|
}];
|
|
278
407
|
}
|
|
279
408
|
|
|
409
|
+
/**
|
|
410
|
+
* @inheritDoc
|
|
411
|
+
*/
|
|
280
412
|
getRequiredConfirmationsCount(): number {
|
|
281
413
|
return 1;
|
|
282
414
|
}
|
|
283
415
|
|
|
284
416
|
/**
|
|
285
|
-
*
|
|
286
|
-
* also returns inputs indices that need to be signed by the wallet before submitting the PSBT back to the SDK with
|
|
287
|
-
* `swap.submitPsbt()`
|
|
288
|
-
*
|
|
289
|
-
* @param _bitcoinWallet Sender's bitcoin wallet
|
|
290
|
-
* @param feeRate Optional fee rate for the transaction, needs to be at least as big as {minimumBtcFeeRate} field
|
|
291
|
-
* @param additionalOutputs additional outputs to add to the PSBT - can be used to collect fees from users
|
|
417
|
+
* @inheritDoc
|
|
292
418
|
*/
|
|
293
419
|
async getFundedPsbt(
|
|
294
420
|
_bitcoinWallet: IBitcoinWallet | MinimalBitcoinWalletInterface,
|
|
295
421
|
feeRate?: number,
|
|
296
422
|
additionalOutputs?: ({amount: bigint, outputScript: Uint8Array} | {amount: bigint, address: string})[]
|
|
297
423
|
): Promise<{psbt: Transaction, psbtHex: string, psbtBase64: string, signInputs: number[]}> {
|
|
298
|
-
if(this.
|
|
424
|
+
if(this._state!==OnchainForGasSwapState.PR_CREATED)
|
|
299
425
|
throw new Error("Swap already paid for!");
|
|
300
426
|
|
|
301
427
|
let bitcoinWallet: IBitcoinWallet;
|
|
302
428
|
if(isIBitcoinWallet(_bitcoinWallet)) {
|
|
303
429
|
bitcoinWallet = _bitcoinWallet;
|
|
304
430
|
} else {
|
|
305
|
-
bitcoinWallet = new SingleAddressBitcoinWallet(this.wrapper.
|
|
431
|
+
bitcoinWallet = new SingleAddressBitcoinWallet(this.wrapper._btcRpc, this.wrapper._options.bitcoinNetwork, _bitcoinWallet);
|
|
306
432
|
}
|
|
307
433
|
//TODO: Maybe re-introduce fee rate check here if passed from the user
|
|
308
434
|
if(feeRate==null) {
|
|
@@ -315,12 +441,12 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
315
441
|
});
|
|
316
442
|
basePsbt.addOutput({
|
|
317
443
|
amount: this.outputAmount,
|
|
318
|
-
script: toOutputScript(this.wrapper.
|
|
444
|
+
script: toOutputScript(this.wrapper._options.bitcoinNetwork, this.address)
|
|
319
445
|
});
|
|
320
446
|
if(additionalOutputs!=null) additionalOutputs.forEach(output => {
|
|
321
447
|
basePsbt.addOutput({
|
|
322
448
|
amount: output.amount,
|
|
323
|
-
script: (output as {outputScript: Uint8Array}).outputScript ?? toOutputScript(this.wrapper.
|
|
449
|
+
script: (output as {outputScript: Uint8Array}).outputScript ?? toOutputScript(this.wrapper._options.bitcoinNetwork, (output as {address: string}).address)
|
|
324
450
|
});
|
|
325
451
|
});
|
|
326
452
|
|
|
@@ -340,13 +466,11 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
340
466
|
}
|
|
341
467
|
|
|
342
468
|
/**
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
* @param _psbt A psbt - either a Transaction object or a hex or base64 encoded PSBT string
|
|
469
|
+
* @inheritDoc
|
|
346
470
|
*/
|
|
347
471
|
async submitPsbt(_psbt: Transaction | string): Promise<string> {
|
|
348
472
|
const psbt = parsePsbtTransaction(_psbt);
|
|
349
|
-
if(this.
|
|
473
|
+
if(this._state!==OnchainForGasSwapState.PR_CREATED)
|
|
350
474
|
throw new Error("Swap already paid for!");
|
|
351
475
|
|
|
352
476
|
//Ensure not expired
|
|
@@ -357,24 +481,30 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
357
481
|
const output0 = psbt.getOutput(0);
|
|
358
482
|
if(output0.amount!==this.outputAmount)
|
|
359
483
|
throw new Error("PSBT output amount invalid, expected: "+this.outputAmount+" got: "+output0.amount);
|
|
360
|
-
const expectedOutputScript = toOutputScript(this.wrapper.
|
|
484
|
+
const expectedOutputScript = toOutputScript(this.wrapper._options.bitcoinNetwork, this.address);
|
|
361
485
|
if(output0.script==null || !expectedOutputScript.equals(output0.script))
|
|
362
486
|
throw new Error("PSBT output script invalid!");
|
|
363
487
|
|
|
364
488
|
if(!psbt.isFinal) psbt.finalize();
|
|
365
489
|
|
|
366
|
-
return await this.wrapper.
|
|
490
|
+
return await this.wrapper._btcRpc.sendRawTransaction(Buffer.from(psbt.toBytes(true, true)).toString("hex"));
|
|
367
491
|
}
|
|
368
492
|
|
|
493
|
+
/**
|
|
494
|
+
* @inheritDoc
|
|
495
|
+
*/
|
|
369
496
|
async estimateBitcoinFee(_bitcoinWallet: IBitcoinWallet | MinimalBitcoinWalletInterface, feeRate?: number): Promise<TokenAmount<any, BtcToken<false>, true> | null> {
|
|
370
|
-
const bitcoinWallet: IBitcoinWallet = toBitcoinWallet(_bitcoinWallet, this.wrapper.
|
|
497
|
+
const bitcoinWallet: IBitcoinWallet = toBitcoinWallet(_bitcoinWallet, this.wrapper._btcRpc, this.wrapper._options.bitcoinNetwork);
|
|
371
498
|
const txFee = await bitcoinWallet.getTransactionFee(this.address, this.inputAmount, feeRate);
|
|
372
499
|
if(txFee==null) return null;
|
|
373
|
-
return toTokenAmount(BigInt(txFee), BitcoinTokens.BTC, this.wrapper.
|
|
500
|
+
return toTokenAmount(BigInt(txFee), BitcoinTokens.BTC, this.wrapper._prices, this.pricingInfo);
|
|
374
501
|
}
|
|
375
502
|
|
|
503
|
+
/**
|
|
504
|
+
* @inheritDoc
|
|
505
|
+
*/
|
|
376
506
|
async sendBitcoinTransaction(wallet: IBitcoinWallet | MinimalBitcoinWalletInterfaceWithSigner, feeRate?: number): Promise<string> {
|
|
377
|
-
if(this.
|
|
507
|
+
if(this._state!==OnchainForGasSwapState.PR_CREATED)
|
|
378
508
|
throw new Error("Swap already paid for!");
|
|
379
509
|
|
|
380
510
|
//Ensure not expired
|
|
@@ -393,11 +523,19 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
393
523
|
}
|
|
394
524
|
}
|
|
395
525
|
|
|
526
|
+
/**
|
|
527
|
+
* @inheritDoc
|
|
528
|
+
*
|
|
529
|
+
* @param options.bitcoinWallet Optional bitcoin wallet address specification to return a funded PSBT,
|
|
530
|
+
* if not provided an address is returned instead.
|
|
531
|
+
*/
|
|
396
532
|
async txsExecute(options?: {
|
|
397
533
|
bitcoinWallet?: MinimalBitcoinWalletInterface
|
|
398
|
-
})
|
|
399
|
-
|
|
400
|
-
|
|
534
|
+
}): Promise<[
|
|
535
|
+
SwapExecutionActionBitcoin<"ADDRESS" | "FUNDED_PSBT">
|
|
536
|
+
]> {
|
|
537
|
+
if(this._state===OnchainForGasSwapState.PR_CREATED) {
|
|
538
|
+
if(!await this._verifyQuoteValid()) throw new Error("Quote already expired or close to expiry!");
|
|
401
539
|
return [
|
|
402
540
|
{
|
|
403
541
|
name: "Payment" as const,
|
|
@@ -425,17 +563,25 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
425
563
|
//////////////////////////////
|
|
426
564
|
//// Payment
|
|
427
565
|
|
|
566
|
+
/**
|
|
567
|
+
* Queries the intermediary (LP) node for the state of the swap
|
|
568
|
+
*
|
|
569
|
+
* @param save Whether the save the result or not
|
|
570
|
+
*
|
|
571
|
+
* @returns Whether the swap was successful as `boolean` or `null` if the swap is still pending
|
|
572
|
+
* @internal
|
|
573
|
+
*/
|
|
428
574
|
protected async checkAddress(save: boolean = true): Promise<boolean | null> {
|
|
429
575
|
if(
|
|
430
|
-
this.
|
|
431
|
-
this.
|
|
432
|
-
this.
|
|
576
|
+
this._state===OnchainForGasSwapState.FAILED ||
|
|
577
|
+
this._state===OnchainForGasSwapState.EXPIRED ||
|
|
578
|
+
this._state===OnchainForGasSwapState.REFUNDED
|
|
433
579
|
) return false;
|
|
434
|
-
if(this.
|
|
580
|
+
if(this._state===OnchainForGasSwapState.FINISHED) return false;
|
|
435
581
|
if(this.url==null) return false;
|
|
436
582
|
|
|
437
583
|
const response = await TrustedIntermediaryAPI.getAddressStatus(
|
|
438
|
-
this.url, this.paymentHash, this.sequence, this.wrapper.
|
|
584
|
+
this.url, this.paymentHash, this.sequence, this.wrapper._options.getRequestTimeout
|
|
439
585
|
);
|
|
440
586
|
switch(response.code) {
|
|
441
587
|
case AddressStatusResponseCodes.AWAIT_PAYMENT:
|
|
@@ -468,35 +614,41 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
468
614
|
}
|
|
469
615
|
return false;
|
|
470
616
|
case AddressStatusResponseCodes.PAID:
|
|
471
|
-
const txStatus = await this.wrapper.
|
|
617
|
+
const txStatus = await this.wrapper._chain.getTxIdStatus(response.data.txId);
|
|
472
618
|
if(txStatus==="success") {
|
|
473
|
-
this.
|
|
619
|
+
this._state = OnchainForGasSwapState.FINISHED;
|
|
474
620
|
this.scTxId = response.data.txId;
|
|
475
621
|
if(save) await this._saveAndEmit();
|
|
476
622
|
return true;
|
|
477
623
|
}
|
|
478
624
|
return false;
|
|
479
625
|
case AddressStatusResponseCodes.EXPIRED:
|
|
480
|
-
this.
|
|
626
|
+
this._state = OnchainForGasSwapState.EXPIRED;
|
|
481
627
|
if(save) await this._saveAndEmit();
|
|
482
628
|
return true;
|
|
483
629
|
case AddressStatusResponseCodes.REFUNDABLE:
|
|
484
|
-
if(this.
|
|
485
|
-
this.
|
|
630
|
+
if(this._state===OnchainForGasSwapState.REFUNDABLE) return null;
|
|
631
|
+
this._state = OnchainForGasSwapState.REFUNDABLE;
|
|
486
632
|
if(save) await this._saveAndEmit();
|
|
487
633
|
return true;
|
|
488
634
|
case AddressStatusResponseCodes.REFUNDED:
|
|
489
|
-
this.
|
|
635
|
+
this._state = OnchainForGasSwapState.REFUNDED;
|
|
490
636
|
this.refundTxId = response.data.txId;
|
|
491
637
|
if(save) await this._saveAndEmit();
|
|
492
638
|
return true;
|
|
493
639
|
default:
|
|
494
|
-
this.
|
|
640
|
+
this._state = OnchainForGasSwapState.FAILED;
|
|
495
641
|
if(save) await this._saveAndEmit();
|
|
496
642
|
return true;
|
|
497
643
|
}
|
|
498
644
|
}
|
|
499
645
|
|
|
646
|
+
/**
|
|
647
|
+
* Sets the bitcoin address used for possible refunds in case something goes wrong with the swap
|
|
648
|
+
*
|
|
649
|
+
* @param refundAddress Bitcoin address to receive the refund to
|
|
650
|
+
* @internal
|
|
651
|
+
*/
|
|
500
652
|
protected async setRefundAddress(refundAddress: string): Promise<void> {
|
|
501
653
|
if(this.refundAddress!=null) {
|
|
502
654
|
if(this.refundAddress!==refundAddress) throw new Error("Different refund address already set!");
|
|
@@ -504,27 +656,20 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
504
656
|
}
|
|
505
657
|
if(this.url==null) throw new Error("LP URL not known, cannot set refund address!");
|
|
506
658
|
await TrustedIntermediaryAPI.setRefundAddress(
|
|
507
|
-
this.url, this.paymentHash, this.sequence, refundAddress, this.wrapper.
|
|
659
|
+
this.url, this.paymentHash, this.sequence, refundAddress, this.wrapper._options.getRequestTimeout
|
|
508
660
|
);
|
|
509
661
|
this.refundAddress = refundAddress;
|
|
510
662
|
}
|
|
511
663
|
|
|
512
664
|
/**
|
|
513
|
-
*
|
|
514
|
-
* rejecting in case of failure
|
|
515
|
-
*
|
|
516
|
-
* @param abortSignal Abort signal
|
|
517
|
-
* @param checkIntervalSeconds How often to poll the intermediary for answer
|
|
518
|
-
* @param updateCallback Callback called when txId is found, and also called with subsequent confirmations
|
|
519
|
-
* @throws {PaymentAuthError} If swap expired or failed
|
|
520
|
-
* @throws {Error} When in invalid state (not PR_CREATED)
|
|
665
|
+
* @inheritDoc
|
|
521
666
|
*/
|
|
522
667
|
async waitForBitcoinTransaction(
|
|
523
668
|
updateCallback?: (txId?: string, confirmations?: number, targetConfirmations?: number, txEtaMs?: number) => void,
|
|
524
669
|
checkIntervalSeconds: number = 5,
|
|
525
670
|
abortSignal?: AbortSignal
|
|
526
671
|
): Promise<string> {
|
|
527
|
-
if(this.
|
|
672
|
+
if(this._state!==OnchainForGasSwapState.PR_CREATED) throw new Error("Must be in PR_CREATED state!");
|
|
528
673
|
|
|
529
674
|
if(!this.initiated) {
|
|
530
675
|
this.initiated = true;
|
|
@@ -533,53 +678,67 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
533
678
|
|
|
534
679
|
while(
|
|
535
680
|
!abortSignal?.aborted &&
|
|
536
|
-
this.
|
|
681
|
+
this._state===OnchainForGasSwapState.PR_CREATED
|
|
537
682
|
) {
|
|
538
683
|
await this.checkAddress(true);
|
|
539
684
|
if(this.txId!=null && updateCallback!=null) {
|
|
540
|
-
const res = await this.wrapper.
|
|
685
|
+
const res = await this.wrapper._btcRpc.getTransaction(this.txId);
|
|
541
686
|
if(res==null) {
|
|
542
687
|
updateCallback();
|
|
543
688
|
} else if(res.confirmations!=null && res.confirmations>0) {
|
|
544
689
|
updateCallback(res.txid, res.confirmations, 1, 0);
|
|
545
690
|
} else {
|
|
546
|
-
const delay = await this.wrapper.
|
|
691
|
+
const delay = await this.wrapper._btcRpc.getConfirmationDelay(res, 1);
|
|
547
692
|
updateCallback(res.txid, 0, 1, delay ?? undefined);
|
|
548
693
|
}
|
|
549
694
|
}
|
|
550
|
-
if(this.
|
|
695
|
+
if(this._state===OnchainForGasSwapState.PR_CREATED)
|
|
551
696
|
await timeoutPromise(checkIntervalSeconds*1000, abortSignal);
|
|
552
697
|
}
|
|
553
698
|
|
|
554
699
|
if(
|
|
555
|
-
(this.
|
|
556
|
-
(this.
|
|
700
|
+
(this._state as OnchainForGasSwapState)===OnchainForGasSwapState.REFUNDABLE ||
|
|
701
|
+
(this._state as OnchainForGasSwapState)===OnchainForGasSwapState.REFUNDED
|
|
557
702
|
) return this.txId!;
|
|
558
|
-
if(this.isQuoteExpired()) throw new
|
|
559
|
-
if(this.isFailed()) throw new
|
|
703
|
+
if(this.isQuoteExpired()) throw new Error("Swap expired");
|
|
704
|
+
if(this.isFailed()) throw new Error("Swap failed");
|
|
560
705
|
return this.txId!;
|
|
561
706
|
}
|
|
562
707
|
|
|
708
|
+
/**
|
|
709
|
+
* Waits till the LP processes a refund for a failed swap. The swap must be in
|
|
710
|
+
* {@link OnchainForGasSwapState.REFUNDABLE} state
|
|
711
|
+
*
|
|
712
|
+
* @param checkIntervalSeconds How often to check (default 5 seconds)
|
|
713
|
+
* @param abortSignal Abort signal
|
|
714
|
+
*/
|
|
563
715
|
async waitTillRefunded(
|
|
564
716
|
checkIntervalSeconds?: number,
|
|
565
717
|
abortSignal?: AbortSignal
|
|
566
718
|
): Promise<void> {
|
|
567
719
|
checkIntervalSeconds ??= 5;
|
|
568
|
-
if(this.
|
|
569
|
-
if(this.
|
|
720
|
+
if(this._state===OnchainForGasSwapState.REFUNDED) return;
|
|
721
|
+
if(this._state!==OnchainForGasSwapState.REFUNDABLE) throw new Error("Must be in REFUNDABLE state!");
|
|
570
722
|
|
|
571
723
|
while(
|
|
572
724
|
!abortSignal?.aborted &&
|
|
573
|
-
this.
|
|
725
|
+
this._state===OnchainForGasSwapState.REFUNDABLE
|
|
574
726
|
) {
|
|
575
727
|
await this.checkAddress(true);
|
|
576
|
-
if(this.
|
|
728
|
+
if(this._state===OnchainForGasSwapState.REFUNDABLE)
|
|
577
729
|
await timeoutPromise(checkIntervalSeconds*1000, abortSignal);
|
|
578
730
|
}
|
|
579
|
-
if(this.isQuoteExpired()) throw new
|
|
580
|
-
if(this.isFailed()) throw new
|
|
731
|
+
if(this.isQuoteExpired()) throw new Error("Swap expired");
|
|
732
|
+
if(this.isFailed()) throw new Error("Swap failed");
|
|
581
733
|
}
|
|
582
734
|
|
|
735
|
+
/**
|
|
736
|
+
* Requests a refund after the swap failed, this also waits till the refund is actually sent by the
|
|
737
|
+
* intermediary (LP). The swap must be in {@link OnchainForGasSwapState.REFUNDABLE} state
|
|
738
|
+
*
|
|
739
|
+
* @param refundAddress Bitcoin address to receive the refund to
|
|
740
|
+
* @param abortSignal Abort signal
|
|
741
|
+
*/
|
|
583
742
|
async requestRefund(refundAddress?: string, abortSignal?: AbortSignal): Promise<void> {
|
|
584
743
|
if(refundAddress!=null) await this.setRefundAddress(refundAddress);
|
|
585
744
|
await this.waitTillRefunded(undefined, abortSignal);
|
|
@@ -589,6 +748,9 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
589
748
|
//////////////////////////////
|
|
590
749
|
//// Storage
|
|
591
750
|
|
|
751
|
+
/**
|
|
752
|
+
* @inheritDoc
|
|
753
|
+
*/
|
|
592
754
|
serialize(): any{
|
|
593
755
|
return {
|
|
594
756
|
...super.serialize(),
|
|
@@ -606,6 +768,10 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
606
768
|
};
|
|
607
769
|
}
|
|
608
770
|
|
|
771
|
+
/**
|
|
772
|
+
* @inheritDoc
|
|
773
|
+
* @internal
|
|
774
|
+
*/
|
|
609
775
|
_getInitiator(): string {
|
|
610
776
|
return this.recipient;
|
|
611
777
|
}
|
|
@@ -614,8 +780,12 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
614
780
|
//////////////////////////////
|
|
615
781
|
//// Swap ticks & sync
|
|
616
782
|
|
|
783
|
+
/**
|
|
784
|
+
* @inheritDoc
|
|
785
|
+
* @internal
|
|
786
|
+
*/
|
|
617
787
|
async _sync(save?: boolean): Promise<boolean> {
|
|
618
|
-
if(this.
|
|
788
|
+
if(this._state===OnchainForGasSwapState.PR_CREATED) {
|
|
619
789
|
//Check if it's maybe already paid
|
|
620
790
|
const result = await this.checkAddress(false);
|
|
621
791
|
if(result) {
|
|
@@ -626,6 +796,10 @@ export class OnchainForGasSwap<T extends ChainType = ChainType> extends ISwap<T,
|
|
|
626
796
|
return false;
|
|
627
797
|
}
|
|
628
798
|
|
|
799
|
+
/**
|
|
800
|
+
* @inheritDoc
|
|
801
|
+
* @internal
|
|
802
|
+
*/
|
|
629
803
|
_tick(save?: boolean): Promise<boolean> {
|
|
630
804
|
return Promise.resolve(false);
|
|
631
805
|
}
|