@atomiqlabs/sdk 8.6.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 +1 -12
  3. package/dist/swapper/Swapper.js +25 -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 +8 -0
  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 +8 -6
  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 +1 -0
  27. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +3 -2
  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 +27 -27
  34. package/src/swapper/SwapperFactory.ts +12 -6
  35. package/src/swaps/ISwap.ts +8 -0
  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 +8 -7
  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 +5 -2
  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
@@ -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,7 +211,6 @@ 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
216
  if(swap.hasSecretPreimage()) swap._broadcastSecret().catch(e => {
@@ -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);
@@ -354,7 +354,7 @@ export class SpvFromBTCSwap<T extends ChainType>
354
354
  */
355
355
  protected upgradeVersion() {
356
356
  if(this.version===1) {
357
- this.posted = this.initiated;
357
+ this.posted = this.initiated && this._data!=null;
358
358
  this.version = 2;
359
359
  }
360
360
  }
@@ -1571,6 +1571,8 @@ export class SpvFromBTCSwap<T extends ChainType>
1571
1571
  this._senderAddress = btcTx.inputAddresses[1];
1572
1572
  }
1573
1573
 
1574
+ private btcTxLastChecked?: number;
1575
+
1574
1576
  /**
1575
1577
  * @internal
1576
1578
  */
@@ -1578,6 +1580,7 @@ export class SpvFromBTCSwap<T extends ChainType>
1578
1580
  if(this._data?.btcTx==null) return false;
1579
1581
 
1580
1582
  //Check if bitcoin payment was confirmed
1583
+ this.btcTxLastChecked = Date.now();
1581
1584
  const res = await this.getBitcoinPayment();
1582
1585
  if(res==null) {
1583
1586
  //Check inputs double-spent
@@ -1724,7 +1727,7 @@ export class SpvFromBTCSwap<T extends ChainType>
1724
1727
  }
1725
1728
  }
1726
1729
 
1727
- if(Math.floor(Date.now()/1000)%120===0) {
1730
+ if(this.btcTxLastChecked==null || Date.now() - this.btcTxLastChecked > 120_000) {
1728
1731
  if (
1729
1732
  this._state === SpvFromBTCSwapState.POSTED ||
1730
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