@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.
Files changed (52) hide show
  1. package/dist/storage/UnifiedSwapStorage.js +13 -8
  2. package/dist/swapper/Swapper.d.ts +10 -15
  3. package/dist/swapper/Swapper.js +26 -26
  4. package/dist/swapper/SwapperFactory.d.ts +1 -0
  5. package/dist/swapper/SwapperFactory.js +9 -4
  6. package/dist/swaps/ISwap.d.ts +8 -0
  7. package/dist/swaps/ISwap.js +10 -2
  8. package/dist/swaps/ISwapWrapper.d.ts +23 -1
  9. package/dist/swaps/ISwapWrapper.js +88 -28
  10. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +4 -1
  11. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +2 -2
  12. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +1 -1
  13. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +2 -2
  14. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +16 -6
  15. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +8 -2
  16. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +1 -1
  17. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +14 -4
  18. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +12 -9
  19. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +2 -1
  20. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +7 -5
  21. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +8 -2
  22. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +1 -1
  23. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +0 -6
  24. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +8 -3
  25. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +8 -2
  26. package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +3 -0
  27. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +14 -4
  28. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +1 -3
  29. package/dist/swaps/trusted/ln/LnForGasWrapper.js +0 -1
  30. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +0 -1
  31. package/package.json +1 -1
  32. package/src/storage/UnifiedSwapStorage.ts +13 -8
  33. package/src/swapper/Swapper.ts +37 -30
  34. package/src/swapper/SwapperFactory.ts +12 -6
  35. package/src/swaps/ISwap.ts +11 -3
  36. package/src/swaps/ISwapWrapper.ts +104 -28
  37. package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +5 -1
  38. package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +3 -3
  39. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +17 -8
  40. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +8 -3
  41. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +13 -5
  42. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +9 -8
  43. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +9 -5
  44. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +7 -2
  45. package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +1 -1
  46. package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +0 -3
  47. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +7 -3
  48. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +7 -2
  49. package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +19 -4
  50. package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +1 -3
  51. package/src/swaps/trusted/ln/LnForGasWrapper.ts +0 -1
  52. 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
- _signer==null ?
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: _options.unsafeSkipLnNodeCheck ? undefined : this.preFetchLnCapacity(lnPublicKey),
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(Math.floor(Date.now()/1000)%120===0) {
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: _signDataPromise ?? this.preFetchSignData(signDataPrefetch),
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: preFetches.signDataPrefetchPromise ?? this.preFetchSignData(signDataPrefetch),
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: _signDataPromise ?? this.preFetchSignData(signDataPrefetch),
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() { /*NOOP*/ }
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.initiated)
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.initiated) {
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(Math.floor(Date.now()/1000)%120===0) {
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);
@@ -84,7 +84,6 @@ export class LnForGasWrapper<T extends ChainType> extends ISwapWrapper<T, LnForG
84
84
  exactIn: false
85
85
  };
86
86
  const quote = new LnForGasSwap(this, quoteInit);
87
- await quote._save();
88
87
  return quote;
89
88
  }
90
89
 
@@ -124,7 +124,6 @@ export class OnchainForGasWrapper<T extends ChainType> extends ISwapWrapper<T, O
124
124
  exactIn: false,
125
125
  token
126
126
  } as OnchainForGasSwapInit);
127
- await quote._save();
128
127
  return quote;
129
128
  }
130
129