@atomiqlabs/lp-lib 11.0.4 → 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 +402 -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 +110 -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,
@@ -785,6 +772,10 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
785
772
  );
786
773
  createdSwap.data = payObject;
787
774
  createdSwap.metadata = metadata;
775
+ createdSwap.prefix = sigData.prefix;
776
+ createdSwap.timeout = sigData.timeout;
777
+ createdSwap.signature = sigData.signature
778
+ createdSwap.feeRate = sigData.feeRate;
788
779
 
789
780
  await PluginManager.swapCreate(createdSwap);
790
781
  await this.storageManager.saveData(parsedPR.id, sequence, createdSwap);
@@ -845,8 +836,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
845
836
  */
846
837
  const parsedBody: ToBtcLnRequestType = await req.paramReader.getParams({
847
838
  pr: FieldTypeEnum.String,
848
- maxFee: FieldTypeEnum.BN,
849
- expiryTimestamp: FieldTypeEnum.BN,
839
+ maxFee: FieldTypeEnum.BigInt,
840
+ expiryTimestamp: FieldTypeEnum.BigInt,
850
841
  token: (val: string) => val!=null &&
851
842
  typeof(val)==="string" &&
852
843
  this.isTokenSupported(chainIdentifier, val) ? val : null,
@@ -854,7 +845,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
854
845
  typeof(val)==="string" &&
855
846
  swapContract.isValidAddress(val) ? val : null,
856
847
  exactIn: FieldTypeEnum.BooleanOptional,
857
- amount: FieldTypeEnum.BNOptional
848
+ amount: FieldTypeEnum.BigIntOptional
858
849
  });
859
850
  if (parsedBody==null) {
860
851
  throw {
@@ -874,17 +865,17 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
874
865
 
875
866
  const responseStream = res.responseStream;
876
867
 
877
- const currentTimestamp: BN = new BN(Math.floor(Date.now()/1000));
868
+ const currentTimestamp: bigint = BigInt(Math.floor(Date.now()/1000));
878
869
 
879
870
  //Check request params
880
871
  this.checkAmount(parsedBody.amount, parsedBody.exactIn);
881
872
  this.checkMaxFee(parsedBody.maxFee);
882
873
  this.checkExpiry(parsedBody.expiryTimestamp, currentTimestamp);
883
874
  await this.checkVaultInitialized(chainIdentifier, parsedBody.token);
884
- const {parsedPR, halfConfidence} = await this.checkPaymentRequest(parsedBody.pr);
875
+ const {parsedPR, halfConfidence} = await this.checkPaymentRequest(chainIdentifier, parsedBody.pr);
885
876
  const requestedAmount = {
886
877
  input: !!parsedBody.exactIn,
887
- 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
888
879
  };
889
880
  const fees = await this.preCheckAmounts(request, requestedAmount, useToken);
890
881
  metadata.times.requestChecked = Date.now();
@@ -907,7 +898,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
907
898
  swapFee,
908
899
  swapFeeInToken,
909
900
  networkFeeInToken
910
- } = await this.checkToBtcAmount(request, requestedAmount, fees, useToken, async (amountBD: BN) => {
901
+ } = await this.checkToBtcAmount(request, requestedAmount, fees, useToken, async (amountBD: bigint) => {
911
902
  //Check if we have enough liquidity to process the swap
912
903
  await this.checkLiquidity(amountBD, abortController.signal, true);
913
904
  metadata.times.liquidityChecked = Date.now();
@@ -962,7 +953,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
962
953
  return;
963
954
  }
964
955
 
965
- const sequence = new BN(randomBytes(8));
956
+ const sequence = BigIntBufferUtils.fromBuffer(randomBytes(8));
957
+ const claimHash = swapContract.getHashForHtlc(Buffer.from(parsedPR.id, "hex"));
966
958
 
967
959
  //Create swap data
968
960
  const payObject: SwapData = await swapContract.createSwapData(
@@ -971,15 +963,13 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
971
963
  signer.getAddress(),
972
964
  useToken,
973
965
  totalInToken,
974
- parsedPR.id,
966
+ claimHash.toString("hex"),
975
967
  sequence,
976
968
  parsedBody.expiryTimestamp,
977
- new BN(0),
978
- 0,
979
969
  true,
980
970
  false,
981
- new BN(0),
982
- new BN(0)
971
+ 0n,
972
+ 0n
983
973
  );
984
974
  abortController.signal.throwIfAborted();
985
975
  metadata.times.swapCreated = Date.now();
@@ -991,6 +981,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
991
981
  //Create swap
992
982
  const createdSwap = new ToBtcLnSwapAbs(
993
983
  chainIdentifier,
984
+ parsedPR.id,
994
985
  parsedBody.pr,
995
986
  parsedPR.mtokens,
996
987
  swapFee,
@@ -1006,7 +997,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1006
997
  createdSwap.feeRate = sigData.feeRate;
1007
998
 
1008
999
  await PluginManager.swapCreate(createdSwap);
1009
- await this.storageManager.saveData(parsedPR.id, sequence, createdSwap);
1000
+ await this.saveSwapData(createdSwap);
1010
1001
 
1011
1002
  this.swapLogger.info(createdSwap, "REST: /payInvoice: created swap,"+
1012
1003
  " amount: "+amountBD.toString(10)+
@@ -1043,7 +1034,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1043
1034
  typeof(val)==="string" &&
1044
1035
  val.length===64 &&
1045
1036
  HEX_REGEX.test(val) ? val: null,
1046
- sequence: FieldTypeEnum.BN
1037
+ sequence: FieldTypeEnum.BigInt
1047
1038
  });
1048
1039
  if (parsedBody==null) throw {
1049
1040
  code: 20100,
@@ -1058,14 +1049,14 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1058
1049
  if(isSwapFound) {
1059
1050
  const {signer, swapContract} = this.getChain(data.chainIdentifier);
1060
1051
 
1061
- if(swapContract.isExpired(signer.getAddress(), data.data)) throw {
1052
+ if(await swapContract.isExpired(signer.getAddress(), data.data)) throw {
1062
1053
  _httpStatus: 200,
1063
1054
  code: 20010,
1064
1055
  msg: "Payment expired"
1065
1056
  };
1066
1057
 
1067
1058
  if(data.state===ToBtcLnSwapState.NON_PAYABLE) {
1068
- const refundSigData = await swapContract.getRefundSignature(signer, data.data, this.config.authorizationTimeout);
1059
+ const refundSigData = await swapContract.getRefundSignature(signer, data.data, this.config.refundAuthorizationTimeout);
1069
1060
 
1070
1061
  //Double check the state after promise result
1071
1062
  if (data.state !== ToBtcLnSwapState.NON_PAYABLE) throw {
@@ -1129,12 +1120,13 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1129
1120
  }
1130
1121
 
1131
1122
  async init() {
1132
- await this.storageManager.loadData(ToBtcLnSwapAbs);
1123
+ await this.loadData(ToBtcLnSwapAbs);
1133
1124
  //Check if all swaps contain a valid amount
1134
- for(let swap of await this.storageManager.query([])) {
1135
- if(swap.amount==null) {
1125
+ for(let {obj: swap} of await this.storageManager.query([])) {
1126
+ if(swap.amount==null || swap.lnPaymentHash==null) {
1136
1127
  const parsedPR = await this.lightning.parsePaymentRequest(swap.pr);
1137
- swap.amount = parsedPR.mtokens.add(new BN(999)).div(new BN(1000));
1128
+ swap.amount = (parsedPR.mtokens + 999n) / 1000n;
1129
+ swap.lnPaymentHash = parsedPR.id;
1138
1130
  }
1139
1131
  }
1140
1132
  this.subscribeToEvents();
@@ -1143,8 +1135,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
1143
1135
 
1144
1136
  getInfoData(): any {
1145
1137
  return {
1146
- minCltv: this.config.minSendCltv.toNumber(),
1147
- minTimestampCltv: this.config.minTsSendCltv.toNumber()
1138
+ minCltv: Number(this.config.minSendCltv),
1139
+ minTimestampCltv: Number(this.config.minTsSendCltv)
1148
1140
  };
1149
1141
  }
1150
1142