@atomiqlabs/sdk 8.5.0 → 8.6.2
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/storage/UnifiedSwapStorage.js +13 -8
- package/dist/swapper/Swapper.d.ts +10 -15
- package/dist/swapper/Swapper.js +26 -26
- package/dist/swapper/SwapperFactory.d.ts +1 -0
- package/dist/swapper/SwapperFactory.js +9 -4
- package/dist/swaps/ISwap.d.ts +8 -0
- package/dist/swaps/ISwap.js +10 -2
- package/dist/swaps/ISwapWrapper.d.ts +23 -1
- package/dist/swaps/ISwapWrapper.js +88 -28
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +4 -1
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +2 -2
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +1 -1
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +2 -2
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +16 -6
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +8 -2
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +1 -1
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +14 -4
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +12 -9
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +2 -1
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +7 -5
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +8 -2
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +1 -1
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +0 -6
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +8 -3
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +8 -2
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +3 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +14 -4
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +1 -3
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +0 -1
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +0 -1
- package/package.json +1 -1
- package/src/storage/UnifiedSwapStorage.ts +13 -8
- package/src/swapper/Swapper.ts +37 -30
- package/src/swapper/SwapperFactory.ts +12 -6
- package/src/swaps/ISwap.ts +11 -3
- package/src/swaps/ISwapWrapper.ts +104 -28
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +5 -1
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +3 -3
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +17 -8
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +8 -3
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +13 -5
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +9 -8
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +9 -5
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +7 -2
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +1 -1
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +0 -3
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +7 -3
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +7 -2
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +19 -4
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +1 -3
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +0 -1
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +0 -1
|
@@ -566,7 +566,7 @@ export class FromBTCLNAutoSwap<T extends ChainType = ChainType>
|
|
|
566
566
|
* @internal
|
|
567
567
|
*/
|
|
568
568
|
protected getInputAmountWithoutFee(): bigint | null {
|
|
569
|
-
if(this.btcAmountGas==null || this.btcAmountSwap) return null;
|
|
569
|
+
if(this.btcAmountGas==null || this.btcAmountSwap==null) return null;
|
|
570
570
|
return this.getInputSwapAmountWithoutFee()! + this.getInputGasAmountWithoutFee()! - this.getWatchtowerFeeAmountBtc()!;
|
|
571
571
|
}
|
|
572
572
|
|
|
@@ -1144,7 +1144,17 @@ export class FromBTCLNAutoSwap<T extends ChainType = ChainType>
|
|
|
1144
1144
|
*
|
|
1145
1145
|
* @throws {Error} If in invalid state (must be {@link FromBTCLNAutoSwapState.CLAIM_COMMITED})
|
|
1146
1146
|
*/
|
|
1147
|
-
async txsClaim(_signer?: T["Signer"] | T["NativeSigner"], secret?: string): Promise<T["TX"][]> {
|
|
1147
|
+
async txsClaim(_signer?: string | T["Signer"] | T["NativeSigner"], secret?: string): Promise<T["TX"][]> {
|
|
1148
|
+
let address: string | undefined = undefined;
|
|
1149
|
+
if(_signer!=null) {
|
|
1150
|
+
if (typeof (_signer) === "string") {
|
|
1151
|
+
address = _signer;
|
|
1152
|
+
} else if (isAbstractSigner(_signer)) {
|
|
1153
|
+
address = _signer.getAddress();
|
|
1154
|
+
} else {
|
|
1155
|
+
address = (await this.wrapper._chain.wrapSigner(_signer)).getAddress();
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1148
1158
|
if(this._state!==FromBTCLNAutoSwapState.CLAIM_COMMITED) throw new Error("Must be in CLAIM_COMMITED state!");
|
|
1149
1159
|
if(this._data==null) throw new Error("Unknown data, wrong state?");
|
|
1150
1160
|
|
|
@@ -1155,9 +1165,7 @@ export class FromBTCLNAutoSwap<T extends ChainType = ChainType>
|
|
|
1155
1165
|
throw new Error("Invalid swap secret pre-image provided!");
|
|
1156
1166
|
|
|
1157
1167
|
return await this.wrapper._contract.txsClaimWithSecret(
|
|
1158
|
-
|
|
1159
|
-
this._getInitiator() :
|
|
1160
|
-
(isAbstractSigner(_signer) ? _signer : await this.wrapper._chain.wrapSigner(_signer)),
|
|
1168
|
+
address ?? this._getInitiator(),
|
|
1161
1169
|
this._data, useSecret, true, true
|
|
1162
1170
|
);
|
|
1163
1171
|
}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
ChainSwapType,
|
|
4
4
|
ChainType,
|
|
5
5
|
ClaimEvent,
|
|
6
|
-
InitializeEvent, LightningNetworkApi, Messenger,
|
|
6
|
+
InitializeEvent, LightningNetworkApi, LNNodeLiquidity, Messenger,
|
|
7
7
|
RefundEvent, SwapCommitState, SwapCommitStateType
|
|
8
8
|
} from "@atomiqlabs/base";
|
|
9
9
|
import {Intermediary} from "../../../../intermediaries/Intermediary";
|
|
@@ -174,6 +174,7 @@ export class FromBTCLNAutoWrapper<
|
|
|
174
174
|
super(
|
|
175
175
|
chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, lnApi,
|
|
176
176
|
{
|
|
177
|
+
...options,
|
|
177
178
|
safetyFactor: options?.safetyFactor ?? 2,
|
|
178
179
|
bitcoinBlocktime: options?.bitcoinBlocktime ?? 10*60,
|
|
179
180
|
unsafeSkipLnNodeCheck: options?.unsafeSkipLnNodeCheck ?? false
|
|
@@ -210,10 +211,9 @@ export class FromBTCLNAutoWrapper<
|
|
|
210
211
|
return false;
|
|
211
212
|
}
|
|
212
213
|
|
|
213
|
-
swap._commitTxId = event.meta?.txId;
|
|
214
214
|
swap._commitedAt ??= Date.now();
|
|
215
215
|
swap._state = FromBTCLNAutoSwapState.CLAIM_COMMITED;
|
|
216
|
-
swap._broadcastSecret().catch(e => {
|
|
216
|
+
if(swap.hasSecretPreimage()) swap._broadcastSecret().catch(e => {
|
|
217
217
|
this.logger.error("processEventInitialize("+swap.getId()+"): Error when broadcasting swap secret: ", e);
|
|
218
218
|
});
|
|
219
219
|
return true;
|
|
@@ -227,7 +227,6 @@ export class FromBTCLNAutoWrapper<
|
|
|
227
227
|
*/
|
|
228
228
|
protected processEventClaim(swap: FromBTCLNAutoSwap<T>, event: ClaimEvent<T["Data"]>): Promise<boolean> {
|
|
229
229
|
if(swap._state!==FromBTCLNAutoSwapState.FAILED && swap._state!==FromBTCLNAutoSwapState.CLAIM_CLAIMED) {
|
|
230
|
-
swap._claimTxId = event.meta?.txId;
|
|
231
230
|
swap._state = FromBTCLNAutoSwapState.CLAIM_CLAIMED;
|
|
232
231
|
swap._setSwapSecret(event.result);
|
|
233
232
|
return Promise.resolve(true);
|
|
@@ -241,7 +240,6 @@ export class FromBTCLNAutoWrapper<
|
|
|
241
240
|
*/
|
|
242
241
|
protected processEventRefund(swap: FromBTCLNAutoSwap<T>, event: RefundEvent<T["Data"]>): Promise<boolean> {
|
|
243
242
|
if(swap._state!==FromBTCLNAutoSwapState.CLAIM_CLAIMED && swap._state!==FromBTCLNAutoSwapState.FAILED) {
|
|
244
|
-
swap._refundTxId ??= event.meta?.txId;
|
|
245
243
|
swap._state = FromBTCLNAutoSwapState.FAILED;
|
|
246
244
|
return Promise.resolve(true);
|
|
247
245
|
}
|
|
@@ -435,8 +433,13 @@ export class FromBTCLNAutoWrapper<
|
|
|
435
433
|
this._options.postRequestTimeout, abortController.signal, retryCount>0 ? false : undefined
|
|
436
434
|
);
|
|
437
435
|
|
|
436
|
+
let lnCapacityPromise: Promise<LNNodeLiquidity | null> | undefined;
|
|
437
|
+
if(!_options.unsafeSkipLnNodeCheck) {
|
|
438
|
+
lnCapacityPromise = this.preFetchLnCapacity(lnPublicKey);
|
|
439
|
+
} else lnPublicKey.catch(() => {});
|
|
440
|
+
|
|
438
441
|
return {
|
|
439
|
-
lnCapacityPromise
|
|
442
|
+
lnCapacityPromise,
|
|
440
443
|
resp: await response
|
|
441
444
|
};
|
|
442
445
|
}, undefined, RequestError, abortController.signal);
|
|
@@ -493,8 +496,6 @@ export class FromBTCLNAutoWrapper<
|
|
|
493
496
|
exactIn: amountData.exactIn ?? true
|
|
494
497
|
};
|
|
495
498
|
const quote = new FromBTCLNAutoSwap<T>(this, swapInit);
|
|
496
|
-
await quote._save();
|
|
497
|
-
this.logger.debug("create(): Created new FromBTCLNAutoSwap quote, claimHash (pseudo escrowHash): ", quote._getEscrowHash());
|
|
498
499
|
return quote;
|
|
499
500
|
} catch (e) {
|
|
500
501
|
abortController.abort(e);
|
|
@@ -333,8 +333,8 @@ export class FromBTCSwap<T extends ChainType = ChainType>
|
|
|
333
333
|
* @inheritDoc
|
|
334
334
|
* @internal
|
|
335
335
|
*/
|
|
336
|
-
protected canCommit(): boolean {
|
|
337
|
-
if(this._state!==FromBTCSwapState.PR_CREATED) return false;
|
|
336
|
+
protected canCommit(skipQuoteExpiryChecks?: boolean): boolean {
|
|
337
|
+
if(this._state!==FromBTCSwapState.PR_CREATED && (!skipQuoteExpiryChecks || this._state!==FromBTCSwapState.QUOTE_SOFT_EXPIRED)) return false;
|
|
338
338
|
if(this.requiredConfirmations==null) return false;
|
|
339
339
|
const expiry = this.wrapper._getOnchainSendTimeout(this._data, this.requiredConfirmations);
|
|
340
340
|
const currentTimestamp = BigInt(Math.floor(Date.now()/1000));
|
|
@@ -900,7 +900,7 @@ export class FromBTCSwap<T extends ChainType = ChainType>
|
|
|
900
900
|
);
|
|
901
901
|
|
|
902
902
|
this._commitTxId = result[result.length - 1];
|
|
903
|
-
if(this._state===FromBTCSwapState.PR_CREATED || this._state===FromBTCSwapState.QUOTE_SOFT_EXPIRED) {
|
|
903
|
+
if(this._state===FromBTCSwapState.PR_CREATED || this._state===FromBTCSwapState.QUOTE_SOFT_EXPIRED || this._state===FromBTCSwapState.QUOTE_EXPIRED) {
|
|
904
904
|
await this._saveAndEmit(FromBTCSwapState.CLAIM_COMMITED);
|
|
905
905
|
}
|
|
906
906
|
return this._commitTxId;
|
|
@@ -1191,6 +1191,8 @@ export class FromBTCSwap<T extends ChainType = ChainType>
|
|
|
1191
1191
|
return changed;
|
|
1192
1192
|
}
|
|
1193
1193
|
|
|
1194
|
+
private btcTxLastChecked?: number;
|
|
1195
|
+
|
|
1194
1196
|
/**
|
|
1195
1197
|
* @inheritDoc
|
|
1196
1198
|
* @internal
|
|
@@ -1222,6 +1224,7 @@ export class FromBTCSwap<T extends ChainType = ChainType>
|
|
|
1222
1224
|
}
|
|
1223
1225
|
if(this.address==null) return save;
|
|
1224
1226
|
|
|
1227
|
+
this.btcTxLastChecked = Date.now();
|
|
1225
1228
|
const res = await this.getBitcoinPayment();
|
|
1226
1229
|
if(res!=null) {
|
|
1227
1230
|
if(this.txId!==res.txId) {
|
|
@@ -1261,9 +1264,10 @@ export class FromBTCSwap<T extends ChainType = ChainType>
|
|
|
1261
1264
|
return true;
|
|
1262
1265
|
}
|
|
1263
1266
|
case FromBTCSwapState.EXPIRED:
|
|
1264
|
-
//Check if bitcoin payment was received every 2 minutes
|
|
1265
|
-
if(
|
|
1267
|
+
//Check if bitcoin payment was received at least every 2 minutes
|
|
1268
|
+
if(this.btcTxLastChecked==null || Date.now() - this.btcTxLastChecked > 120_000) {
|
|
1266
1269
|
if(this.address!=null) try {
|
|
1270
|
+
this.btcTxLastChecked = Date.now();
|
|
1267
1271
|
const res = await this.getBitcoinPayment();
|
|
1268
1272
|
if(res!=null) {
|
|
1269
1273
|
let shouldSave: boolean = false;
|
|
@@ -150,6 +150,7 @@ export class FromBTCWrapper<
|
|
|
150
150
|
super(
|
|
151
151
|
chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer,
|
|
152
152
|
{
|
|
153
|
+
...options,
|
|
153
154
|
bitcoinNetwork: options?.bitcoinNetwork ?? TEST_NETWORK,
|
|
154
155
|
safetyFactor: options?.safetyFactor ?? 2,
|
|
155
156
|
blocksTillTxConfirms: options?.blocksTillTxConfirms ?? 12,
|
|
@@ -472,8 +473,13 @@ export class FromBTCWrapper<
|
|
|
472
473
|
this._options.postRequestTimeout, abortController.signal, retryCount>0 ? false : undefined
|
|
473
474
|
);
|
|
474
475
|
|
|
476
|
+
let signDataPromise = _signDataPromise;
|
|
477
|
+
if(signDataPromise==null) {
|
|
478
|
+
signDataPromise = this.preFetchSignData(signDataPrefetch);
|
|
479
|
+
} else signDataPrefetch.catch(() => {});
|
|
480
|
+
|
|
475
481
|
return {
|
|
476
|
-
signDataPromise
|
|
482
|
+
signDataPromise,
|
|
477
483
|
resp: await response
|
|
478
484
|
};
|
|
479
485
|
}, undefined, e => e instanceof RequestError, abortController.signal);
|
|
@@ -506,7 +512,6 @@ export class FromBTCWrapper<
|
|
|
506
512
|
exactIn: amountData.exactIn ?? true,
|
|
507
513
|
requiredConfirmations: resp.confirmations
|
|
508
514
|
} as FromBTCSwapInit<T["Data"]>);
|
|
509
|
-
await quote._save();
|
|
510
515
|
return quote;
|
|
511
516
|
} catch (e) {
|
|
512
517
|
abortController.abort(e);
|
|
@@ -593,7 +593,7 @@ export abstract class IToBTCSwap<
|
|
|
593
593
|
* @throws {Error} When in invalid state (not {@link ToBTCSwapState.CREATED})
|
|
594
594
|
*/
|
|
595
595
|
async txsCommit(skipChecks?: boolean): Promise<T["TX"][]> {
|
|
596
|
-
if(this._state!==ToBTCSwapState.CREATED) throw new Error("Must be in CREATED state!");
|
|
596
|
+
if(this._state!==ToBTCSwapState.CREATED && (!skipChecks || this._state!==ToBTCSwapState.QUOTE_SOFT_EXPIRED)) throw new Error("Must be in CREATED state!");
|
|
597
597
|
if(this.signatureData==null) throw new Error("Init signature data not known, cannot commit!");
|
|
598
598
|
|
|
599
599
|
if(!this.initiated) {
|
|
@@ -90,7 +90,6 @@ export abstract class IToBTCWrapper<
|
|
|
90
90
|
protected async processEventInitialize(swap: D["Swap"], event: InitializeEvent<T["Data"]>): Promise<boolean> {
|
|
91
91
|
if(swap._state===ToBTCSwapState.CREATED || swap._state===ToBTCSwapState.QUOTE_SOFT_EXPIRED) {
|
|
92
92
|
swap._state = ToBTCSwapState.COMMITED;
|
|
93
|
-
if(swap._commitTxId==null) swap._commitTxId = event.meta?.txId;
|
|
94
93
|
return true;
|
|
95
94
|
}
|
|
96
95
|
return false;
|
|
@@ -108,7 +107,6 @@ export abstract class IToBTCWrapper<
|
|
|
108
107
|
this.logger.warn(`processEventClaim(): Failed to set payment result ${event.result}: `, e);
|
|
109
108
|
});
|
|
110
109
|
swap._state = ToBTCSwapState.CLAIMED;
|
|
111
|
-
if(swap._claimTxId==null) swap._claimTxId = event.meta?.txId;
|
|
112
110
|
return true;
|
|
113
111
|
}
|
|
114
112
|
return false;
|
|
@@ -120,7 +118,6 @@ export abstract class IToBTCWrapper<
|
|
|
120
118
|
protected processEventRefund(swap: D["Swap"], event: RefundEvent<T["Data"]>): Promise<boolean> {
|
|
121
119
|
if(swap._state!==ToBTCSwapState.CLAIMED && swap._state!==ToBTCSwapState.REFUNDED) {
|
|
122
120
|
swap._state = ToBTCSwapState.REFUNDED;
|
|
123
|
-
if(swap._refundTxId==null) swap._refundTxId = event.meta?.txId;
|
|
124
121
|
return Promise.resolve(true);
|
|
125
122
|
}
|
|
126
123
|
return Promise.resolve(false);
|
|
@@ -112,6 +112,7 @@ export class ToBTCLNWrapper<T extends ChainType> extends IToBTCWrapper<T, ToBTCL
|
|
|
112
112
|
super(
|
|
113
113
|
chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer,
|
|
114
114
|
{
|
|
115
|
+
...options,
|
|
115
116
|
paymentTimeoutSeconds: options?.paymentTimeoutSeconds ?? 5*24*60*60,
|
|
116
117
|
lightningBaseFee: options?.lightningBaseFee ?? 10,
|
|
117
118
|
lightningFeePPM: options?.lightningFeePPM ?? 2000
|
|
@@ -289,8 +290,13 @@ export class ToBTCLNWrapper<T extends ChainType> extends IToBTCWrapper<T, ToBTCL
|
|
|
289
290
|
additionalParams
|
|
290
291
|
}, this._options.postRequestTimeout, abortController.signal, retryCount>0 ? false : undefined);
|
|
291
292
|
|
|
293
|
+
let signDataPromise = preFetches.signDataPrefetchPromise;
|
|
294
|
+
if(signDataPromise==null) {
|
|
295
|
+
signDataPromise = this.preFetchSignData(signDataPrefetch);
|
|
296
|
+
} else signDataPrefetch.catch(() => {});
|
|
297
|
+
|
|
292
298
|
return {
|
|
293
|
-
signDataPromise
|
|
299
|
+
signDataPromise,
|
|
294
300
|
resp: await response
|
|
295
301
|
};
|
|
296
302
|
}, undefined, e => e instanceof RequestError, abortController.signal);
|
|
@@ -335,7 +341,6 @@ export class ToBTCLNWrapper<T extends ChainType> extends IToBTCWrapper<T, ToBTCL
|
|
|
335
341
|
pr,
|
|
336
342
|
exactIn: false
|
|
337
343
|
} as IToBTCSwapInit<T["Data"]>);
|
|
338
|
-
await quote._save();
|
|
339
344
|
return quote;
|
|
340
345
|
} catch (e) {
|
|
341
346
|
abortController.abort(e);
|
|
@@ -539,7 +544,6 @@ export class ToBTCLNWrapper<T extends ChainType> extends IToBTCWrapper<T, ToBTCL
|
|
|
539
544
|
pr: invoice,
|
|
540
545
|
exactIn: true
|
|
541
546
|
} as IToBTCSwapInit<T["Data"]>);
|
|
542
|
-
await quote._save();
|
|
543
547
|
return quote;
|
|
544
548
|
} catch (e) {
|
|
545
549
|
abortController.abort(e);
|
|
@@ -97,6 +97,7 @@ export class ToBTCWrapper<T extends ChainType> extends IToBTCWrapper<T, ToBTCDef
|
|
|
97
97
|
super(
|
|
98
98
|
chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer,
|
|
99
99
|
{
|
|
100
|
+
...options,
|
|
100
101
|
bitcoinNetwork: options?.bitcoinNetwork ?? TEST_NETWORK,
|
|
101
102
|
safetyFactor: options?.safetyFactor ?? 2,
|
|
102
103
|
maxConfirmations: options?.maxConfirmations ?? 6,
|
|
@@ -272,8 +273,13 @@ export class ToBTCWrapper<T extends ChainType> extends IToBTCWrapper<T, ToBTCDef
|
|
|
272
273
|
additionalParams
|
|
273
274
|
}, this._options.postRequestTimeout, abortController.signal, retryCount>0 ? false : undefined);
|
|
274
275
|
|
|
276
|
+
let signDataPromise = _signDataPromise;
|
|
277
|
+
if(signDataPromise==null) {
|
|
278
|
+
signDataPromise = this.preFetchSignData(signDataPrefetch);
|
|
279
|
+
} else signDataPrefetch.catch(() => {});
|
|
280
|
+
|
|
275
281
|
return {
|
|
276
|
-
signDataPromise
|
|
282
|
+
signDataPromise,
|
|
277
283
|
resp: await response
|
|
278
284
|
};
|
|
279
285
|
}, undefined, RequestError, abortController.signal);
|
|
@@ -319,7 +325,6 @@ export class ToBTCWrapper<T extends ChainType> extends IToBTCWrapper<T, ToBTCDef
|
|
|
319
325
|
requiredConfirmations: _options.confirmations,
|
|
320
326
|
nonce
|
|
321
327
|
} as ToBTCSwapInit<T["Data"]>);
|
|
322
|
-
await quote._save();
|
|
323
328
|
return quote;
|
|
324
329
|
} catch (e) {
|
|
325
330
|
abortController.abort(e);
|
|
@@ -193,6 +193,8 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
193
193
|
extends ISwap<T, SpvFromBTCTypeDefinition<T>>
|
|
194
194
|
implements IBTCWalletSwap, ISwapWithGasDrop<T>, IClaimableSwap<T, SpvFromBTCTypeDefinition<T>, SpvFromBTCSwapState> {
|
|
195
195
|
|
|
196
|
+
protected readonly currentVersion: number = 2;
|
|
197
|
+
|
|
196
198
|
readonly TYPE: SwapType.SPV_VAULT_FROM_BTC = SwapType.SPV_VAULT_FROM_BTC;
|
|
197
199
|
|
|
198
200
|
/**
|
|
@@ -240,6 +242,8 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
240
242
|
|
|
241
243
|
private readonly gasPricingInfo?: PriceInfoType;
|
|
242
244
|
|
|
245
|
+
private posted?: boolean;
|
|
246
|
+
|
|
243
247
|
/**
|
|
244
248
|
* @internal
|
|
245
249
|
*/
|
|
@@ -337,6 +341,7 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
337
341
|
this._frontTxId = initOrObject.frontTxId;
|
|
338
342
|
this.gasPricingInfo = deserializePriceInfoType(initOrObject.gasPricingInfo);
|
|
339
343
|
this.btcTxConfirmedAt = initOrObject.btcTxConfirmedAt;
|
|
344
|
+
this.posted = initOrObject.posted;
|
|
340
345
|
if(initOrObject.data!=null) this._data = new this.wrapper._spvWithdrawalDataDeserializer(initOrObject.data);
|
|
341
346
|
}
|
|
342
347
|
this.tryCalculateSwapFee();
|
|
@@ -347,7 +352,12 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
347
352
|
* @inheritDoc
|
|
348
353
|
* @internal
|
|
349
354
|
*/
|
|
350
|
-
protected upgradeVersion() {
|
|
355
|
+
protected upgradeVersion() {
|
|
356
|
+
if(this.version===1) {
|
|
357
|
+
this.posted = this.initiated && this._data!=null;
|
|
358
|
+
this.version = 2;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
351
361
|
|
|
352
362
|
/**
|
|
353
363
|
* @inheritDoc
|
|
@@ -973,6 +983,7 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
973
983
|
|
|
974
984
|
this._data = data;
|
|
975
985
|
this.initiated = true;
|
|
986
|
+
this.posted = true;
|
|
976
987
|
await this._saveAndEmit(SpvFromBTCSwapState.SIGNED);
|
|
977
988
|
|
|
978
989
|
try {
|
|
@@ -1186,7 +1197,7 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
1186
1197
|
if(
|
|
1187
1198
|
this._state!==SpvFromBTCSwapState.POSTED &&
|
|
1188
1199
|
this._state!==SpvFromBTCSwapState.BROADCASTED &&
|
|
1189
|
-
!(this._state===SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED && this.
|
|
1200
|
+
!(this._state===SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED && this.posted)
|
|
1190
1201
|
) throw new Error("Must be in POSTED or BROADCASTED state!");
|
|
1191
1202
|
if(this._data==null) throw new Error("Expected swap to have withdrawal data filled!");
|
|
1192
1203
|
|
|
@@ -1529,6 +1540,7 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
1529
1540
|
executionFeeShare: this.executionFeeShare.toString(10),
|
|
1530
1541
|
genesisSmartChainBlockHeight: this._genesisSmartChainBlockHeight,
|
|
1531
1542
|
gasPricingInfo: serializePriceInfoType(this.gasPricingInfo),
|
|
1543
|
+
posted: this.posted,
|
|
1532
1544
|
|
|
1533
1545
|
senderAddress: this._senderAddress,
|
|
1534
1546
|
claimTxId: this._claimTxId,
|
|
@@ -1559,6 +1571,8 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
1559
1571
|
this._senderAddress = btcTx.inputAddresses[1];
|
|
1560
1572
|
}
|
|
1561
1573
|
|
|
1574
|
+
private btcTxLastChecked?: number;
|
|
1575
|
+
|
|
1562
1576
|
/**
|
|
1563
1577
|
* @internal
|
|
1564
1578
|
*/
|
|
@@ -1566,6 +1580,7 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
1566
1580
|
if(this._data?.btcTx==null) return false;
|
|
1567
1581
|
|
|
1568
1582
|
//Check if bitcoin payment was confirmed
|
|
1583
|
+
this.btcTxLastChecked = Date.now();
|
|
1569
1584
|
const res = await this.getBitcoinPayment();
|
|
1570
1585
|
if(res==null) {
|
|
1571
1586
|
//Check inputs double-spent
|
|
@@ -1704,7 +1719,7 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
1704
1719
|
}
|
|
1705
1720
|
}
|
|
1706
1721
|
|
|
1707
|
-
if(this._state===SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED && !this.
|
|
1722
|
+
if(this._state===SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED && !this.posted) {
|
|
1708
1723
|
if(this.expiry<Date.now()) {
|
|
1709
1724
|
this._state = SpvFromBTCSwapState.QUOTE_EXPIRED;
|
|
1710
1725
|
if(save) await this._saveAndEmit();
|
|
@@ -1712,7 +1727,7 @@ export class SpvFromBTCSwap<T extends ChainType>
|
|
|
1712
1727
|
}
|
|
1713
1728
|
}
|
|
1714
1729
|
|
|
1715
|
-
if(
|
|
1730
|
+
if(this.btcTxLastChecked==null || Date.now() - this.btcTxLastChecked > 120_000) {
|
|
1716
1731
|
if (
|
|
1717
1732
|
this._state === SpvFromBTCSwapState.POSTED ||
|
|
1718
1733
|
this._state === SpvFromBTCSwapState.BROADCASTED
|
|
@@ -186,6 +186,7 @@ export class SpvFromBTCWrapper<
|
|
|
186
186
|
super(
|
|
187
187
|
chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens,
|
|
188
188
|
{
|
|
189
|
+
...options,
|
|
189
190
|
bitcoinNetwork: options?.bitcoinNetwork ?? TEST_NETWORK,
|
|
190
191
|
maxConfirmations: options?.maxConfirmations ?? 6,
|
|
191
192
|
bitcoinBlocktime: options?.bitcoinBlocktime ?? 10*60,
|
|
@@ -210,7 +211,6 @@ export class SpvFromBTCWrapper<
|
|
|
210
211
|
swap._state===SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap._state===SpvFromBTCSwapState.BTC_TX_CONFIRMED
|
|
211
212
|
) {
|
|
212
213
|
swap._state = SpvFromBTCSwapState.FRONTED;
|
|
213
|
-
swap._frontTxId = event.meta?.txId;
|
|
214
214
|
await swap._setBitcoinTxId(event.btcTxId).catch(e => {
|
|
215
215
|
this.logger.warn("processEventFront(): Failed to set bitcoin txId: ", e);
|
|
216
216
|
});
|
|
@@ -227,7 +227,6 @@ export class SpvFromBTCWrapper<
|
|
|
227
227
|
swap._state===SpvFromBTCSwapState.BTC_TX_CONFIRMED
|
|
228
228
|
) {
|
|
229
229
|
swap._state = SpvFromBTCSwapState.CLAIMED;
|
|
230
|
-
swap._claimTxId = event.meta?.txId;
|
|
231
230
|
await swap._setBitcoinTxId(event.btcTxId).catch(e => {
|
|
232
231
|
this.logger.warn("processEventClaim(): Failed to set bitcoin txId: ", e);
|
|
233
232
|
});
|
|
@@ -708,7 +707,6 @@ export class SpvFromBTCWrapper<
|
|
|
708
707
|
)
|
|
709
708
|
};
|
|
710
709
|
const quote = new SpvFromBTCSwap<T>(this, swapInit);
|
|
711
|
-
await quote._save();
|
|
712
710
|
return quote;
|
|
713
711
|
} catch (e) {
|
|
714
712
|
abortController.abort(e);
|