@atomiqlabs/lp-lib 11.0.5 → 12.0.0-beta.0

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 (100) hide show
  1. package/dist/info/InfoHandler.js +3 -12
  2. package/dist/plugins/IPlugin.d.ts +34 -35
  3. package/dist/plugins/IPlugin.js +7 -8
  4. package/dist/plugins/PluginManager.d.ts +29 -30
  5. package/dist/plugins/PluginManager.js +160 -188
  6. package/dist/prices/BinanceSwapPrice.d.ts +1 -2
  7. package/dist/prices/BinanceSwapPrice.js +56 -70
  8. package/dist/prices/CoinGeckoSwapPrice.d.ts +2 -3
  9. package/dist/prices/CoinGeckoSwapPrice.js +30 -42
  10. package/dist/prices/OKXSwapPrice.d.ts +1 -2
  11. package/dist/prices/OKXSwapPrice.js +56 -70
  12. package/dist/storage/IIntermediaryStorage.d.ts +8 -5
  13. package/dist/storagemanager/IntermediaryStorageManager.d.ts +8 -5
  14. package/dist/storagemanager/IntermediaryStorageManager.js +52 -61
  15. package/dist/storagemanager/StorageManager.js +42 -59
  16. package/dist/swaps/FromBtcBaseSwap.d.ts +7 -8
  17. package/dist/swaps/FromBtcBaseSwap.js +2 -3
  18. package/dist/swaps/FromBtcBaseSwapHandler.d.ts +44 -31
  19. package/dist/swaps/FromBtcBaseSwapHandler.js +217 -196
  20. package/dist/swaps/FromBtcLnBaseSwapHandler.d.ts +1 -2
  21. package/dist/swaps/FromBtcLnBaseSwapHandler.js +13 -24
  22. package/dist/swaps/ISwapPrice.d.ts +4 -5
  23. package/dist/swaps/ISwapPrice.js +8 -30
  24. package/dist/swaps/SwapHandler.d.ts +26 -15
  25. package/dist/swaps/SwapHandler.js +107 -66
  26. package/dist/swaps/SwapHandlerSwap.d.ts +22 -11
  27. package/dist/swaps/SwapHandlerSwap.js +32 -8
  28. package/dist/swaps/ToBtcBaseSwap.d.ts +16 -17
  29. package/dist/swaps/ToBtcBaseSwap.js +4 -4
  30. package/dist/swaps/ToBtcBaseSwapHandler.d.ts +17 -17
  31. package/dist/swaps/ToBtcBaseSwapHandler.js +140 -155
  32. package/dist/swaps/frombtc_abstract/FromBtcAbs.d.ts +8 -15
  33. package/dist/swaps/frombtc_abstract/FromBtcAbs.js +131 -196
  34. package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.d.ts +3 -5
  35. package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.js +4 -4
  36. package/dist/swaps/frombtc_trusted/FromBtcTrusted.d.ts +10 -8
  37. package/dist/swaps/frombtc_trusted/FromBtcTrusted.js +330 -362
  38. package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.d.ts +10 -10
  39. package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.js +7 -4
  40. package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.d.ts +8 -8
  41. package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.js +330 -400
  42. package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.d.ts +10 -4
  43. package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.js +36 -6
  44. package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.d.ts +8 -7
  45. package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.js +251 -273
  46. package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.d.ts +5 -5
  47. package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.js +7 -5
  48. package/dist/swaps/tobtc_abstract/ToBtcAbs.d.ts +13 -12
  49. package/dist/swaps/tobtc_abstract/ToBtcAbs.js +261 -323
  50. package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.d.ts +4 -4
  51. package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.js +7 -6
  52. package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.d.ts +22 -21
  53. package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.js +398 -453
  54. package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.d.ts +3 -2
  55. package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.js +10 -6
  56. package/dist/utils/Utils.d.ts +2 -3
  57. package/dist/utils/Utils.js +4 -14
  58. package/dist/utils/paramcoders/LegacyParamEncoder.js +3 -14
  59. package/dist/utils/paramcoders/ParamDecoder.js +53 -65
  60. package/dist/utils/paramcoders/SchemaVerifier.d.ts +4 -5
  61. package/dist/utils/paramcoders/SchemaVerifier.js +8 -9
  62. package/dist/utils/paramcoders/server/ServerParamDecoder.js +1 -1
  63. package/dist/utils/paramcoders/server/ServerParamEncoder.js +3 -14
  64. package/dist/wallets/IBitcoinWallet.d.ts +4 -5
  65. package/dist/wallets/ILightningWallet.d.ts +20 -21
  66. package/dist/wallets/ILightningWallet.js +1 -1
  67. package/package.json +4 -6
  68. package/src/plugins/IPlugin.ts +28 -29
  69. package/src/plugins/PluginManager.ts +21 -22
  70. package/src/prices/BinanceSwapPrice.ts +3 -4
  71. package/src/prices/CoinGeckoSwapPrice.ts +4 -5
  72. package/src/prices/OKXSwapPrice.ts +3 -4
  73. package/src/storage/IIntermediaryStorage.ts +4 -5
  74. package/src/storagemanager/IntermediaryStorageManager.ts +17 -9
  75. package/src/swaps/FromBtcBaseSwap.ts +9 -10
  76. package/src/swaps/FromBtcBaseSwapHandler.ts +133 -91
  77. package/src/swaps/FromBtcLnBaseSwapHandler.ts +2 -3
  78. package/src/swaps/ISwapPrice.ts +10 -20
  79. package/src/swaps/SwapHandler.ts +101 -35
  80. package/src/swaps/SwapHandlerSwap.ts +42 -17
  81. package/src/swaps/ToBtcBaseSwap.ts +20 -18
  82. package/src/swaps/ToBtcBaseSwapHandler.ts +33 -33
  83. package/src/swaps/frombtc_abstract/FromBtcAbs.ts +64 -97
  84. package/src/swaps/frombtc_abstract/FromBtcSwapAbs.ts +7 -8
  85. package/src/swaps/frombtc_trusted/FromBtcTrusted.ts +56 -55
  86. package/src/swaps/frombtc_trusted/FromBtcTrustedSwap.ts +28 -21
  87. package/src/swaps/frombtcln_abstract/FromBtcLnAbs.ts +81 -116
  88. package/src/swaps/frombtcln_abstract/FromBtcLnSwapAbs.ts +73 -9
  89. package/src/swaps/frombtcln_trusted/FromBtcLnTrusted.ts +39 -36
  90. package/src/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.ts +26 -12
  91. package/src/swaps/tobtc_abstract/ToBtcAbs.ts +82 -98
  92. package/src/swaps/tobtc_abstract/ToBtcSwapAbs.ts +25 -20
  93. package/src/swaps/tobtcln_abstract/ToBtcLnAbs.ts +106 -118
  94. package/src/swaps/tobtcln_abstract/ToBtcLnSwapAbs.ts +17 -9
  95. package/src/utils/Utils.ts +3 -4
  96. package/src/utils/paramcoders/ParamDecoder.ts +5 -5
  97. package/src/utils/paramcoders/SchemaVerifier.ts +10 -11
  98. package/src/utils/paramcoders/server/ServerParamDecoder.ts +1 -1
  99. package/src/wallets/IBitcoinWallet.ts +4 -5
  100. package/src/wallets/ILightningWallet.ts +21 -22
@@ -1,9 +1,16 @@
1
- import * as BN from "bn.js";
2
1
  import {Express, Request, Response} from "express";
3
2
  import {ToBtcLnSwapAbs, ToBtcLnSwapState} from "./ToBtcLnSwapAbs";
4
3
  import {MultichainData, SwapHandlerType} from "../SwapHandler";
5
4
  import {ISwapPrice} from "../ISwapPrice";
6
- import {ChainSwapType, ClaimEvent, InitializeEvent, RefundEvent, SwapCommitStatus, SwapData} from "@atomiqlabs/base";
5
+ import {
6
+ BigIntBufferUtils,
7
+ ChainSwapType,
8
+ ClaimEvent,
9
+ InitializeEvent,
10
+ RefundEvent,
11
+ SwapCommitStatus,
12
+ SwapData
13
+ } from "@atomiqlabs/base";
7
14
  import {expressHandlerWrapper, HEX_REGEX, isDefinedRuntimeError} from "../../utils/Utils";
8
15
  import {PluginManager} from "../../plugins/PluginManager";
9
16
  import {IIntermediaryStorage} from "../../storage/IIntermediaryStorage";
@@ -23,15 +30,15 @@ import {
23
30
  } from "../../wallets/ILightningWallet";
24
31
 
25
32
  export type ToBtcLnConfig = ToBtcBaseConfig & {
26
- routingFeeMultiplier: BN,
33
+ routingFeeMultiplier: bigint,
27
34
 
28
- minSendCltv: BN,
35
+ minSendCltv: bigint,
29
36
 
30
37
  allowProbeFailedSwaps: boolean,
31
38
  allowShortExpiry: boolean,
32
39
 
33
- minLnRoutingFeePPM?: BN,
34
- minLnBaseFee?: BN,
40
+ minLnRoutingFeePPM?: bigint,
41
+ minLnBaseFee?: bigint,
35
42
 
36
43
  exactInExpiry?: number
37
44
  };
@@ -41,18 +48,18 @@ type ExactInAuthorization = {
41
48
  reqId: string,
42
49
  expiry: number,
43
50
 
44
- amount: BN,
51
+ amount: bigint,
45
52
  initialInvoice: ParsedPaymentRequest,
46
53
 
47
- quotedNetworkFeeInToken: BN,
48
- swapFeeInToken: BN,
49
- total: BN,
54
+ quotedNetworkFeeInToken: bigint,
55
+ swapFeeInToken: bigint,
56
+ total: bigint,
50
57
  confidence: number,
51
- quotedNetworkFee: BN,
52
- swapFee: BN,
58
+ quotedNetworkFee: bigint,
59
+ swapFee: bigint,
53
60
 
54
61
  token: string,
55
- swapExpiry: BN,
62
+ swapExpiry: bigint,
56
63
  offerer: string,
57
64
 
58
65
  preFetchSignData: any,
@@ -67,12 +74,12 @@ type ExactInAuthorization = {
67
74
 
68
75
  export type ToBtcLnRequestType = {
69
76
  pr: string,
70
- maxFee: BN,
71
- expiryTimestamp: BN,
77
+ maxFee: bigint,
78
+ expiryTimestamp: bigint,
72
79
  token: string,
73
80
  offerer: string,
74
81
  exactIn?: boolean,
75
- amount?: BN
82
+ amount?: bigint
76
83
  };
77
84
 
78
85
  /**
@@ -83,13 +90,14 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
83
90
 
84
91
  activeSubscriptions: Set<string> = new Set<string>();
85
92
  lightningLiquidityCache: {
86
- liquidity: BN,
93
+ liquidity: bigint,
87
94
  timestamp: number
88
95
  };
89
96
 
90
97
  readonly type = SwapHandlerType.TO_BTCLN;
98
+ readonly swapType = ChainSwapType.HTLC;
91
99
 
92
- readonly config: ToBtcLnConfig & {minTsSendCltv: BN};
100
+ readonly config: ToBtcLnConfig & {minTsSendCltv: bigint};
93
101
 
94
102
  readonly exactInAuths: {
95
103
  [reqId: string]: ExactInAuthorization
@@ -108,10 +116,10 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
108
116
  super(storageDirectory, path, chainData, swapPricing);
109
117
  this.lightning = lightning;
110
118
  const anyConfig = config as any;
111
- anyConfig.minTsSendCltv = config.gracePeriod.add(config.bitcoinBlocktime.mul(config.minSendCltv).mul(config.safetyFactor));
119
+ anyConfig.minTsSendCltv = config.gracePeriod + (config.bitcoinBlocktime * config.minSendCltv * config.safetyFactor);
112
120
  this.config = anyConfig;
113
- this.config.minLnRoutingFeePPM = this.config.minLnRoutingFeePPM || new BN(1000);
114
- this.config.minLnBaseFee = this.config.minLnBaseFee || new BN(5);
121
+ this.config.minLnRoutingFeePPM = this.config.minLnRoutingFeePPM || 1000n;
122
+ this.config.minLnBaseFee = this.config.minLnBaseFee || 5n;
115
123
  this.config.exactInExpiry = this.config.exactInExpiry || 10*1000;
116
124
  }
117
125
 
@@ -145,7 +153,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
145
153
  } else {
146
154
  this.swapLogger.info(swap, "processPastSwap(state=SAVED): swap committed (detected from processPastSwap), invoice: "+swap.pr);
147
155
  await swap.setState(ToBtcLnSwapState.COMMITED);
148
- await this.storageManager.saveData(swap.data.getHash(), swap.getSequence(), swap);
156
+ await this.saveSwapData(swap);
149
157
  }
150
158
  }
151
159
  //Cancel the swaps where lightning invoice is expired
@@ -166,7 +174,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
166
174
  if (swap.state === ToBtcLnSwapState.NON_PAYABLE) {
167
175
  //Remove expired swaps (as these can already be unilaterally refunded by the client), so we don't need
168
176
  // to be able to cooperatively refund them
169
- if(swapContract.isExpired(signer.getAddress(), swap.data)) {
177
+ if(await swapContract.isExpired(signer.getAddress(), swap.data)) {
170
178
  this.swapLogger.info(swap, "processPastSwap(state=NON_PAYABLE): swap expired, removing swap data, invoice: "+swap.pr);
171
179
  await this.removeSwapData(swap);
172
180
  }
@@ -191,7 +199,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
191
199
  }
192
200
  ]);
193
201
 
194
- for(let swap of queriedData) {
202
+ for(let {obj: swap} of queriedData) {
195
203
  await this.processPastSwap(swap);
196
204
  }
197
205
  }
@@ -241,17 +249,17 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
241
249
  case "failed":
242
250
  this.swapLogger.info(swap, "processPaymentResult(): invoice payment failed, cancelling swap, invoice: "+swap.pr);
243
251
  await swap.setState(ToBtcLnSwapState.NON_PAYABLE);
244
- await this.storageManager.saveData(swap.data.getHash(), swap.data.getSequence(), swap);
252
+ await this.saveSwapData(swap);
245
253
  return;
246
254
 
247
255
  case "confirmed":
248
256
  const {swapContract, signer} = this.getChain(swap.chainIdentifier);
249
257
 
250
258
  swap.secret = lnPaymentStatus.secret;
251
- swap.setRealNetworkFee(lnPaymentStatus.feeMtokens.div(new BN(1000)));
259
+ swap.setRealNetworkFee(lnPaymentStatus.feeMtokens / 1000n);
252
260
  this.swapLogger.info(swap, "processPaymentResult(): invoice paid, secret: "+swap.secret+" realRoutingFee: "+swap.realNetworkFee.toString(10)+" invoice: "+swap.pr);
253
261
  await swap.setState(ToBtcLnSwapState.PAID);
254
- await this.storageManager.saveData(swap.data.getHash(), swap.data.getSequence(), swap);
262
+ await this.saveSwapData(swap);
255
263
 
256
264
  //Check if escrow state exists
257
265
  const isCommited = await swapContract.isCommited(swap.data);
@@ -286,7 +294,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
286
294
  * @param invoiceData
287
295
  */
288
296
  private subscribeToPayment(invoiceData: ToBtcLnSwapAbs): boolean {
289
- const paymentHash = invoiceData.data.getHash();
297
+ const paymentHash = invoiceData.lnPaymentHash;
290
298
  if(this.activeSubscriptions.has(paymentHash)) return false;
291
299
 
292
300
  this.lightning.waitForPayment(paymentHash).then(result => {
@@ -302,11 +310,11 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
302
310
 
303
311
  private async sendLightningPayment(swap: ToBtcLnSwapAbs): Promise<void> {
304
312
  const decodedPR = await this.lightning.parsePaymentRequest(swap.pr);
305
- const expiryTimestamp: BN = swap.data.getExpiry();
306
- const currentTimestamp: BN = new BN(Math.floor(Date.now()/1000));
313
+ const expiryTimestamp: bigint = swap.data.getExpiry();
314
+ const currentTimestamp: bigint = BigInt(Math.floor(Date.now()/1000));
307
315
 
308
316
  //Run checks
309
- const hasEnoughTimeToPay = expiryTimestamp.sub(currentTimestamp).gte(this.config.minTsSendCltv);
317
+ const hasEnoughTimeToPay = (expiryTimestamp - currentTimestamp) >= this.config.minTsSendCltv;
310
318
  if(!hasEnoughTimeToPay) throw {
311
319
  code: 90005,
312
320
  msg: "Not enough time to reliably pay the invoice"
@@ -320,7 +328,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
320
328
 
321
329
  //Compute max cltv delta
322
330
  const maxFee = swap.quotedNetworkFee;
323
- const maxUsableCLTVdelta = expiryTimestamp.sub(currentTimestamp).sub(this.config.gracePeriod).div(this.config.bitcoinBlocktime.mul(this.config.safetyFactor));
331
+ const maxUsableCLTVdelta = (expiryTimestamp - currentTimestamp - this.config.gracePeriod)
332
+ / (this.config.bitcoinBlocktime * this.config.safetyFactor);
324
333
 
325
334
  //Initiate payment
326
335
  this.swapLogger.info(swap, "sendLightningPayment(): paying lightning network invoice,"+
@@ -333,8 +342,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
333
342
  try {
334
343
  await this.lightning.pay({
335
344
  request: swap.pr,
336
- maxFeeMtokens: maxFee.mul(new BN(1000)),
337
- maxTimeoutHeight: blockHeight+maxUsableCLTVdelta.toNumber()
345
+ maxFeeMtokens: maxFee * 1000n,
346
+ maxTimeoutHeight: blockHeight+Number(maxUsableCLTVdelta)
338
347
  })
339
348
  } catch (e) {
340
349
  throw {
@@ -356,7 +365,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
356
365
  private async processInitialized(swap: ToBtcLnSwapAbs) {
357
366
  //Check if payment was already made
358
367
  if(swap.state===ToBtcLnSwapState.COMMITED) {
359
- let lnPaymentStatus = await this.lightning.getPayment(swap.getHash());
368
+ if(swap.metadata!=null) swap.metadata.times.payPaymentChecked = Date.now();
369
+ let lnPaymentStatus = await this.lightning.getPayment(swap.lnPaymentHash);
360
370
  if(lnPaymentStatus!=null) {
361
371
  if(lnPaymentStatus.status==="pending") {
362
372
  //Payment still ongoing, process the result
@@ -375,7 +385,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
375
385
 
376
386
  if(swap.state===ToBtcLnSwapState.SAVED) {
377
387
  await swap.setState(ToBtcLnSwapState.COMMITED);
378
- await this.storageManager.saveData(swap.data.getHash(), swap.data.getSequence(), swap);
388
+ await this.saveSwapData(swap);
379
389
  try {
380
390
  await this.sendLightningPayment(swap);
381
391
  } catch (e) {
@@ -383,7 +393,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
383
393
  if(isDefinedRuntimeError(e)) {
384
394
  if(swap.metadata!=null) swap.metadata.payError = e;
385
395
  await swap.setState(ToBtcLnSwapState.NON_PAYABLE);
386
- await this.storageManager.saveData(swap.data.getHash(), swap.data.getSequence(), swap);
396
+ await this.saveSwapData(swap);
387
397
  return;
388
398
  } else throw e;
389
399
  }
@@ -392,17 +402,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
392
402
  }
393
403
  }
394
404
 
395
- protected async processInitializeEvent(chainIdentifier: string, event: InitializeEvent<SwapData>): Promise<void> {
396
- if(event.swapType!==ChainSwapType.HTLC) return;
397
-
398
- const paymentHash = event.paymentHash;
399
-
400
- const swap = await this.storageManager.getData(paymentHash, event.sequence);
401
- if(swap==null || swap.chainIdentifier!==chainIdentifier) return;
402
-
403
- swap.txIds.init = (event as any).meta?.txId;
404
- if(swap.metadata!=null) swap.metadata.times.txReceived = Date.now();
405
-
405
+ protected async processInitializeEvent(chainIdentifier: string, swap: ToBtcLnSwapAbs, event: InitializeEvent<SwapData>): Promise<void> {
406
406
  this.swapLogger.info(swap, "SC: InitializeEvent: swap initialized by the client, invoice: "+swap.pr);
407
407
 
408
408
  //Only process swaps in SAVED state
@@ -410,27 +410,13 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
410
410
  await this.processInitialized(swap);
411
411
  }
412
412
 
413
- protected async processClaimEvent(chainIdentifier: string, event: ClaimEvent<SwapData>): Promise<void> {
414
- const paymentHash = event.paymentHash;
415
-
416
- const swap = await this.storageManager.getData(paymentHash, event.sequence);
417
- if(swap==null || swap.chainIdentifier!==chainIdentifier) return;
418
-
419
- swap.txIds.claim = (event as any).meta?.txId;
420
-
421
- this.swapLogger.info(swap, "SC: ClaimEvent: swap claimed to us, secret: "+event.secret+" invoice: "+swap.pr);
413
+ protected async processClaimEvent(chainIdentifier: string, swap: ToBtcLnSwapAbs, event: ClaimEvent<SwapData>): Promise<void> {
414
+ this.swapLogger.info(swap, "SC: ClaimEvent: swap claimed to us, secret: "+event.result+" invoice: "+swap.pr);
422
415
 
423
416
  await this.removeSwapData(swap, ToBtcLnSwapState.CLAIMED);
424
417
  }
425
418
 
426
- protected async processRefundEvent(chainIdentifier: string, event: RefundEvent<SwapData>): Promise<void> {
427
- const paymentHash = event.paymentHash;
428
-
429
- const swap = await this.storageManager.getData(paymentHash, event.sequence);
430
- if(swap==null || swap.chainIdentifier!==chainIdentifier) return;
431
-
432
- swap.txIds.refund = (event as any).meta?.txId;
433
-
419
+ protected async processRefundEvent(chainIdentifier: string, swap: ToBtcLnSwapAbs, event: RefundEvent<SwapData>): Promise<void> {
434
420
  this.swapLogger.info(swap, "SC: RefundEvent: swap refunded back to the client, invoice: "+swap.pr);
435
421
 
436
422
  await this.removeSwapData(swap, ToBtcLnSwapState.REFUNDED);
@@ -443,7 +429,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
443
429
  * @param exactIn
444
430
  * @throws {DefinedRuntimeError} will throw an error if the swap was exactIn, but amount not specified
445
431
  */
446
- private checkAmount(amount: BN, exactIn: boolean): void {
432
+ private checkAmount(amount: bigint, exactIn: boolean): void {
447
433
  if(exactIn) {
448
434
  if(amount==null) {
449
435
  throw {
@@ -460,8 +446,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
460
446
  * @param maxFee
461
447
  * @throws {DefinedRuntimeError} will throw an error if the maxFee is zero or negative
462
448
  */
463
- private checkMaxFee(maxFee: BN): void {
464
- if(maxFee.isNeg() || maxFee.isZero()) {
449
+ private checkMaxFee(maxFee: bigint): void {
450
+ if(maxFee <= 0) {
465
451
  throw {
466
452
  code: 20030,
467
453
  msg: "Invalid request body (maxFee too low)!"
@@ -472,10 +458,11 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
472
458
  /**
473
459
  * Checks and parses a payment request (bolt11 invoice), additionally also checks expiration time of the invoice
474
460
  *
461
+ * @param chainIdentifier
475
462
  * @param pr
476
463
  * @throws {DefinedRuntimeError} will throw an error if the pr is invalid, without amount or expired
477
464
  */
478
- private async checkPaymentRequest(pr: string): Promise<{
465
+ private async checkPaymentRequest(chainIdentifier: string, pr: string): Promise<{
479
466
  parsedPR: ParsedPaymentRequest,
480
467
  halfConfidence: boolean
481
468
  }> {
@@ -496,7 +483,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
496
483
  };
497
484
 
498
485
  let halfConfidence = false;
499
- if(parsedPR.expiryEpochMillis < Date.now()+((this.config.authorizationTimeout+(2*60))*1000) ) {
486
+ if(parsedPR.expiryEpochMillis < Date.now()+((this.getInitAuthorizationTimeout(chainIdentifier)+(2*60))*1000) ) {
500
487
  if(!this.config.allowShortExpiry) {
501
488
  throw {
502
489
  code: 20020,
@@ -521,8 +508,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
521
508
  * @param currentTimestamp
522
509
  * @throws {DefinedRuntimeError} will throw an error if the expiry time is too short
523
510
  */
524
- private checkExpiry(expiryTimestamp: BN, currentTimestamp: BN): void {
525
- const expiresTooSoon = expiryTimestamp.sub(currentTimestamp).lt(this.config.minTsSendCltv);
511
+ private checkExpiry(expiryTimestamp: bigint, currentTimestamp: bigint): void {
512
+ const expiresTooSoon = (expiryTimestamp - currentTimestamp) < this.config.minTsSendCltv;
526
513
  if(expiresTooSoon) {
527
514
  throw {
528
515
  code: 20001,
@@ -555,7 +542,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
555
542
  * @param useCached Whether to use cached liquidity values
556
543
  * @throws {DefinedRuntimeError} will throw an error if there isn't enough liquidity
557
544
  */
558
- private async checkLiquidity(amount: BN, abortSignal: AbortSignal, useCached: boolean = false): Promise<void> {
545
+ private async checkLiquidity(amount: bigint, abortSignal: AbortSignal, useCached: boolean = false): Promise<void> {
559
546
  if(!useCached || this.lightningLiquidityCache==null || this.lightningLiquidityCache.timestamp<Date.now()-this.LIGHTNING_LIQUIDITY_CACHE_TIMEOUT) {
560
547
  const channelBalances = await this.lightning.getLightningBalance();
561
548
  this.lightningLiquidityCache = {
@@ -563,7 +550,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
563
550
  timestamp: Date.now()
564
551
  }
565
552
  }
566
- if(amount.gt(this.lightningLiquidityCache.liquidity)) {
553
+ if(amount > this.lightningLiquidityCache.liquidity) {
567
554
  throw {
568
555
  code: 20002,
569
556
  msg: "Not enough liquidity"
@@ -585,23 +572,23 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
585
572
  * @param abortSignal
586
573
  * @throws {DefinedRuntimeError} will throw an error if the destination is unreachable
587
574
  */
588
- private async checkAndGetNetworkFee(amountBD: BN, maxFee: BN, expiryTimestamp: BN, currentTimestamp: BN, pr: string, metadata: any, abortSignal: AbortSignal): Promise<{
575
+ private async checkAndGetNetworkFee(amountBD: bigint, maxFee: bigint, expiryTimestamp: bigint, currentTimestamp: bigint, pr: string, metadata: any, abortSignal: AbortSignal): Promise<{
589
576
  confidence: number,
590
- networkFee: BN
577
+ networkFee: bigint
591
578
  }> {
592
- const maxUsableCLTV: BN = expiryTimestamp.sub(currentTimestamp).sub(this.config.gracePeriod).div(this.config.bitcoinBlocktime.mul(this.config.safetyFactor));
579
+ const maxUsableCLTV: bigint = (expiryTimestamp - currentTimestamp - this.config.gracePeriod) / (this.config.bitcoinBlocktime * this.config.safetyFactor);
593
580
 
594
581
  const blockHeight = await this.lightning.getBlockheight();
595
582
  abortSignal.throwIfAborted();
596
583
  metadata.times.blockheightFetched = Date.now();
597
584
 
598
- const maxTimeoutBlockheight = new BN(blockHeight).add(maxUsableCLTV);
585
+ const maxTimeoutBlockheight = BigInt(blockHeight) + maxUsableCLTV;
599
586
 
600
587
  const req: ProbeAndRouteInit = {
601
588
  request: pr,
602
- amountMtokens: amountBD.mul(new BN(1000)),
603
- maxFeeMtokens: maxFee.mul(new BN(1000)),
604
- maxTimeoutHeight: maxTimeoutBlockheight.toNumber()
589
+ amountMtokens: amountBD * 1000n,
590
+ maxFeeMtokens: maxFee * 1000n,
591
+ maxTimeoutHeight: Number(maxTimeoutBlockheight)
605
592
  };
606
593
 
607
594
  let probeOrRouteResp: ProbeAndRouteResponse = await this.lightning.probe(req);
@@ -638,19 +625,19 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
638
625
  " fee mtokens: "+probeOrRouteResp.feeMtokens.toString(10));
639
626
  }
640
627
 
641
- const safeFeeTokens = probeOrRouteResp.feeMtokens.add(new BN(999)).div(new BN(1000));
628
+ const safeFeeTokens = (probeOrRouteResp.feeMtokens + 999n) / 1000n;
642
629
 
643
- let actualRoutingFee: BN = safeFeeTokens.mul(this.config.routingFeeMultiplier);
630
+ let actualRoutingFee: bigint = safeFeeTokens * this.config.routingFeeMultiplier;
644
631
 
645
- const minRoutingFee: BN = amountBD.mul(this.config.minLnRoutingFeePPM).div(new BN(1000000)).add(this.config.minLnBaseFee);
646
- if(actualRoutingFee.lt(minRoutingFee)) {
632
+ const minRoutingFee: bigint = (amountBD * this.config.minLnRoutingFeePPM / 1000000n) + this.config.minLnBaseFee;
633
+ if(actualRoutingFee < minRoutingFee) {
647
634
  actualRoutingFee = minRoutingFee;
648
- if(actualRoutingFee.gt(maxFee)) {
635
+ if(actualRoutingFee > maxFee) {
649
636
  probeOrRouteResp.confidence = 0;
650
637
  }
651
638
  }
652
639
 
653
- if(actualRoutingFee.gt(maxFee)) {
640
+ if(actualRoutingFee > maxFee) {
654
641
  actualRoutingFee = maxFee;
655
642
  }
656
643
 
@@ -698,7 +685,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
698
685
  if(
699
686
  parsedRequest.destination!==parsedAuth.initialInvoice.destination ||
700
687
  parsedRequest.cltvDelta!==parsedAuth.initialInvoice.cltvDelta ||
701
- !parsedRequest.mtokens.eq(parsedAuth.amount.mul(new BN(1000)))
688
+ parsedRequest.mtokens!==parsedAuth.amount * 1000n
702
689
  ) {
703
690
  throw {
704
691
  code: 20102,
@@ -740,14 +727,15 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
740
727
 
741
728
  //Check request params
742
729
  const parsedAuth = this.checkExactInAuthorization(parsedBody.reqId);
743
- const {parsedPR, halfConfidence} = await this.checkPaymentRequest(parsedBody.pr);
730
+ const {parsedPR, halfConfidence} = await this.checkPaymentRequest(parsedAuth.chainIdentifier, parsedBody.pr);
744
731
  await this.checkPaymentRequestMatchesInitial(parsedBody.pr, parsedAuth);
745
732
 
746
733
  const metadata = parsedAuth.metadata;
747
734
 
748
- const sequence = new BN(randomBytes(8));
735
+ const sequence = BigIntBufferUtils.fromBuffer(randomBytes(8));
749
736
 
750
737
  const {swapContract, signer} = this.getChain(parsedAuth.chainIdentifier);
738
+ const claimHash = swapContract.getHashForHtlc(Buffer.from(parsedPR.id, "hex"))
751
739
 
752
740
  //Create swap data
753
741
  const payObject: SwapData = await swapContract.createSwapData(
@@ -756,15 +744,13 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
756
744
  signer.getAddress(),
757
745
  parsedAuth.token,
758
746
  parsedAuth.total,
759
- parsedPR.id,
747
+ claimHash.toString("hex"),
760
748
  sequence,
761
749
  parsedAuth.swapExpiry,
762
- new BN(0),
763
- 0,
764
750
  true,
765
751
  false,
766
- new BN(0),
767
- new BN(0)
752
+ 0n,
753
+ 0n
768
754
  );
769
755
  metadata.times.swapCreated = Date.now();
770
756
 
@@ -776,6 +762,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
776
762
  //Create swap
777
763
  const createdSwap = new ToBtcLnSwapAbs(
778
764
  parsedAuth.chainIdentifier,
765
+ parsedPR.id,
779
766
  parsedBody.pr,
780
767
  parsedPR.mtokens,
781
768
  parsedAuth.swapFee,
@@ -849,8 +836,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
849
836
  */
850
837
  const parsedBody: ToBtcLnRequestType = await req.paramReader.getParams({
851
838
  pr: FieldTypeEnum.String,
852
- maxFee: FieldTypeEnum.BN,
853
- expiryTimestamp: FieldTypeEnum.BN,
839
+ maxFee: FieldTypeEnum.BigInt,
840
+ expiryTimestamp: FieldTypeEnum.BigInt,
854
841
  token: (val: string) => val!=null &&
855
842
  typeof(val)==="string" &&
856
843
  this.isTokenSupported(chainIdentifier, val) ? val : null,
@@ -858,7 +845,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
858
845
  typeof(val)==="string" &&
859
846
  swapContract.isValidAddress(val) ? val : null,
860
847
  exactIn: FieldTypeEnum.BooleanOptional,
861
- amount: FieldTypeEnum.BNOptional
848
+ amount: FieldTypeEnum.BigIntOptional
862
849
  });
863
850
  if (parsedBody==null) {
864
851
  throw {
@@ -878,17 +865,17 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
878
865
 
879
866
  const responseStream = res.responseStream;
880
867
 
881
- const currentTimestamp: BN = new BN(Math.floor(Date.now()/1000));
868
+ const currentTimestamp: bigint = BigInt(Math.floor(Date.now()/1000));
882
869
 
883
870
  //Check request params
884
871
  this.checkAmount(parsedBody.amount, parsedBody.exactIn);
885
872
  this.checkMaxFee(parsedBody.maxFee);
886
873
  this.checkExpiry(parsedBody.expiryTimestamp, currentTimestamp);
887
874
  await this.checkVaultInitialized(chainIdentifier, parsedBody.token);
888
- const {parsedPR, halfConfidence} = await this.checkPaymentRequest(parsedBody.pr);
875
+ const {parsedPR, halfConfidence} = await this.checkPaymentRequest(chainIdentifier, parsedBody.pr);
889
876
  const requestedAmount = {
890
877
  input: !!parsedBody.exactIn,
891
- amount: !!parsedBody.exactIn ? parsedBody.amount : parsedPR.mtokens.add(new BN(999)).div(new BN(1000))
878
+ amount: !!parsedBody.exactIn ? parsedBody.amount : (parsedPR.mtokens + 999n) / 1000n
892
879
  };
893
880
  const fees = await this.preCheckAmounts(request, requestedAmount, useToken);
894
881
  metadata.times.requestChecked = Date.now();
@@ -911,7 +898,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
911
898
  swapFee,
912
899
  swapFeeInToken,
913
900
  networkFeeInToken
914
- } = await this.checkToBtcAmount(request, requestedAmount, fees, useToken, async (amountBD: BN) => {
901
+ } = await this.checkToBtcAmount(request, requestedAmount, fees, useToken, async (amountBD: bigint) => {
915
902
  //Check if we have enough liquidity to process the swap
916
903
  await this.checkLiquidity(amountBD, abortController.signal, true);
917
904
  metadata.times.liquidityChecked = Date.now();
@@ -966,7 +953,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
966
953
  return;
967
954
  }
968
955
 
969
- const sequence = new BN(randomBytes(8));
956
+ const sequence = BigIntBufferUtils.fromBuffer(randomBytes(8));
957
+ const claimHash = swapContract.getHashForHtlc(Buffer.from(parsedPR.id, "hex"));
970
958
 
971
959
  //Create swap data
972
960
  const payObject: SwapData = await swapContract.createSwapData(
@@ -975,15 +963,13 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
975
963
  signer.getAddress(),
976
964
  useToken,
977
965
  totalInToken,
978
- parsedPR.id,
966
+ claimHash.toString("hex"),
979
967
  sequence,
980
968
  parsedBody.expiryTimestamp,
981
- new BN(0),
982
- 0,
983
969
  true,
984
970
  false,
985
- new BN(0),
986
- new BN(0)
971
+ 0n,
972
+ 0n
987
973
  );
988
974
  abortController.signal.throwIfAborted();
989
975
  metadata.times.swapCreated = Date.now();
@@ -995,6 +981,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
995
981
  //Create swap
996
982
  const createdSwap = new ToBtcLnSwapAbs(
997
983
  chainIdentifier,
984
+ parsedPR.id,
998
985
  parsedBody.pr,
999
986
  parsedPR.mtokens,
1000
987
  swapFee,
@@ -1010,7 +997,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1010
997
  createdSwap.feeRate = sigData.feeRate;
1011
998
 
1012
999
  await PluginManager.swapCreate(createdSwap);
1013
- await this.storageManager.saveData(parsedPR.id, sequence, createdSwap);
1000
+ await this.saveSwapData(createdSwap);
1014
1001
 
1015
1002
  this.swapLogger.info(createdSwap, "REST: /payInvoice: created swap,"+
1016
1003
  " amount: "+amountBD.toString(10)+
@@ -1047,7 +1034,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1047
1034
  typeof(val)==="string" &&
1048
1035
  val.length===64 &&
1049
1036
  HEX_REGEX.test(val) ? val: null,
1050
- sequence: FieldTypeEnum.BN
1037
+ sequence: FieldTypeEnum.BigInt
1051
1038
  });
1052
1039
  if (parsedBody==null) throw {
1053
1040
  code: 20100,
@@ -1062,14 +1049,14 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1062
1049
  if(isSwapFound) {
1063
1050
  const {signer, swapContract} = this.getChain(data.chainIdentifier);
1064
1051
 
1065
- if(swapContract.isExpired(signer.getAddress(), data.data)) throw {
1052
+ if(await swapContract.isExpired(signer.getAddress(), data.data)) throw {
1066
1053
  _httpStatus: 200,
1067
1054
  code: 20010,
1068
1055
  msg: "Payment expired"
1069
1056
  };
1070
1057
 
1071
1058
  if(data.state===ToBtcLnSwapState.NON_PAYABLE) {
1072
- const refundSigData = await swapContract.getRefundSignature(signer, data.data, this.config.authorizationTimeout);
1059
+ const refundSigData = await swapContract.getRefundSignature(signer, data.data, this.config.refundAuthorizationTimeout);
1073
1060
 
1074
1061
  //Double check the state after promise result
1075
1062
  if (data.state !== ToBtcLnSwapState.NON_PAYABLE) throw {
@@ -1133,12 +1120,13 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1133
1120
  }
1134
1121
 
1135
1122
  async init() {
1136
- await this.storageManager.loadData(ToBtcLnSwapAbs);
1123
+ await this.loadData(ToBtcLnSwapAbs);
1137
1124
  //Check if all swaps contain a valid amount
1138
- for(let swap of await this.storageManager.query([])) {
1139
- if(swap.amount==null) {
1125
+ for(let {obj: swap} of await this.storageManager.query([])) {
1126
+ if(swap.amount==null || swap.lnPaymentHash==null) {
1140
1127
  const parsedPR = await this.lightning.parsePaymentRequest(swap.pr);
1141
- swap.amount = parsedPR.mtokens.add(new BN(999)).div(new BN(1000));
1128
+ swap.amount = (parsedPR.mtokens + 999n) / 1000n;
1129
+ swap.lnPaymentHash = parsedPR.id;
1142
1130
  }
1143
1131
  }
1144
1132
  this.subscribeToEvents();
@@ -1147,8 +1135,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1147
1135
 
1148
1136
  getInfoData(): any {
1149
1137
  return {
1150
- minCltv: this.config.minSendCltv.toNumber(),
1151
- minTimestampCltv: this.config.minTsSendCltv.toNumber()
1138
+ minCltv: Number(this.config.minSendCltv),
1139
+ minTimestampCltv: Number(this.config.minTsSendCltv)
1152
1140
  };
1153
1141
  }
1154
1142
 
@@ -1,7 +1,6 @@
1
- import * as BN from "bn.js";
2
1
  import {SwapData} from "@atomiqlabs/base";
3
2
  import {SwapHandlerType} from "../..";
4
- import {deserializeBN, serializeBN} from "../../utils/Utils";
3
+ import {deserializeBN} from "../../utils/Utils";
5
4
  import {ToBtcBaseSwap} from "../ToBtcBaseSwap";
6
5
 
7
6
  export enum ToBtcLnSwapState {
@@ -16,30 +15,34 @@ export enum ToBtcLnSwapState {
16
15
 
17
16
  export class ToBtcLnSwapAbs<T extends SwapData = SwapData> extends ToBtcBaseSwap<T, ToBtcLnSwapState> {
18
17
 
18
+ lnPaymentHash: string;
19
19
  readonly pr: string;
20
20
 
21
21
  secret: string;
22
22
 
23
23
  constructor(
24
24
  chainIdentifier: string,
25
+ lnPaymentHash: string,
25
26
  pr: string,
26
- amountMtokens: BN,
27
- swapFee: BN,
28
- swapFeeInToken: BN,
29
- quotedNetworkFee: BN,
30
- quotedNetworkFeeInToken: BN,
27
+ amountMtokens: bigint,
28
+ swapFee: bigint,
29
+ swapFeeInToken: bigint,
30
+ quotedNetworkFee: bigint,
31
+ quotedNetworkFeeInToken: bigint,
31
32
  );
32
33
  constructor(obj: any);
33
34
 
34
- constructor(chainIdOrObj: string | any, pr?: string, amount?: BN, swapFee?: BN, swapFeeInToken?: BN, quotedNetworkFee?: BN, quotedNetworkFeeInToken?: BN) {
35
+ constructor(chainIdOrObj: string | any, lnPaymentHash?: string, pr?: string, amount?: bigint, swapFee?: bigint, swapFeeInToken?: bigint, quotedNetworkFee?: bigint, quotedNetworkFeeInToken?: bigint) {
35
36
  if(typeof(chainIdOrObj)==="string") {
36
- super(chainIdOrObj, amount.add(new BN(999)).div(new BN(1000)), swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken);
37
+ super(chainIdOrObj, (amount + 999n) / 1000n, swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken);
37
38
  this.state = ToBtcLnSwapState.SAVED;
39
+ this.lnPaymentHash = lnPaymentHash;
38
40
  this.pr = pr;
39
41
  } else {
40
42
  super(chainIdOrObj);
41
43
  this.pr = chainIdOrObj.pr;
42
44
  this.secret = chainIdOrObj.secret;
45
+ this.lnPaymentHash = chainIdOrObj.lnPaymentHash;
43
46
 
44
47
  //Compatibility with older versions
45
48
  this.quotedNetworkFee ??= deserializeBN(chainIdOrObj.maxFee);
@@ -48,9 +51,14 @@ export class ToBtcLnSwapAbs<T extends SwapData = SwapData> extends ToBtcBaseSwap
48
51
  this.type = SwapHandlerType.TO_BTCLN;
49
52
  }
50
53
 
54
+ getIdentifierHash(): string {
55
+ return this.lnPaymentHash;
56
+ }
57
+
51
58
  serialize(): any {
52
59
  const partialSerialized = super.serialize();
53
60
  partialSerialized.pr = this.pr;
61
+ partialSerialized.lnPaymentHash = this.lnPaymentHash;
54
62
  partialSerialized.secret = this.secret;
55
63
  return partialSerialized;
56
64
  }