@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,10 +1,10 @@
1
- import * as BN from "bn.js";
2
1
  import {Express, Request, Response} from "express";
3
- import {createHash} from "crypto";
2
+ import {createHash, randomBytes} from "crypto";
4
3
  import {FromBtcLnSwapAbs, FromBtcLnSwapState} from "./FromBtcLnSwapAbs";
5
4
  import {MultichainData, SwapHandlerType} from "../SwapHandler";
6
5
  import {ISwapPrice} from "../ISwapPrice";
7
6
  import {
7
+ BigIntBufferUtils,
8
8
  ChainSwapType,
9
9
  ClaimEvent,
10
10
  InitializeEvent,
@@ -29,14 +29,14 @@ import {
29
29
 
30
30
  export type FromBtcLnConfig = FromBtcBaseConfig & {
31
31
  invoiceTimeoutSeconds?: number,
32
- minCltv: BN,
33
- gracePeriod: BN
32
+ minCltv: bigint,
33
+ gracePeriod: bigint
34
34
  }
35
35
 
36
36
  export type FromBtcLnRequestType = {
37
37
  address: string,
38
38
  paymentHash: string,
39
- amount: BN,
39
+ amount: bigint,
40
40
  token: string,
41
41
  descriptionHash?: string,
42
42
  exactOut?: boolean
@@ -46,8 +46,8 @@ export type FromBtcLnRequestType = {
46
46
  * Swap handler handling from BTCLN swaps using submarine swaps
47
47
  */
48
48
  export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, FromBtcLnSwapState> {
49
-
50
49
  readonly type = SwapHandlerType.FROM_BTCLN;
50
+ readonly swapType = ChainSwapType.HTLC;
51
51
 
52
52
  readonly config: FromBtcLnConfig;
53
53
 
@@ -112,12 +112,12 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
112
112
 
113
113
  this.swapLogger.info(swap, "processPastSwap(state=RECEIVED): swap committed (detected from processPastSwap), invoice: "+swap.pr);
114
114
  await swap.setState(FromBtcLnSwapState.COMMITED);
115
- await this.storageManager.saveData(swap.data.getHash(), null, swap);
115
+ await this.saveSwapData(swap);
116
116
  }
117
117
  }
118
118
 
119
119
  if(swap.state===FromBtcLnSwapState.RECEIVED || swap.state===FromBtcLnSwapState.COMMITED) {
120
- if(!swapContract.isExpired(signer.getAddress(), swap.data)) return null;
120
+ if(!await swapContract.isExpired(signer.getAddress(), swap.data)) return null;
121
121
 
122
122
  const isCommited = await swapContract.isCommited(swap.data);
123
123
  if(isCommited) {
@@ -151,7 +151,7 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
151
151
  protected async cancelInvoices(swaps: FromBtcLnSwapAbs[]) {
152
152
  for(let swap of swaps) {
153
153
  //Refund
154
- const paymentHash = swap.data.getHash();
154
+ const paymentHash = swap.lnPaymentHash;
155
155
  try {
156
156
  await this.lightning.cancelHodlInvoice(paymentHash);
157
157
  this.swapLogger.info(swap, "cancelInvoices(): invoice cancelled!");
@@ -198,7 +198,7 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
198
198
  }
199
199
  ]);
200
200
 
201
- for(let swap of queriedData) {
201
+ for(let {obj: swap} of queriedData) {
202
202
  switch(await this.processPastSwap(swap)) {
203
203
  case "CANCEL":
204
204
  cancelInvoices.push(swap);
@@ -217,45 +217,24 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
217
217
  await this.settleInvoices(settleInvoices);
218
218
  }
219
219
 
220
- protected async processInitializeEvent(chainIdentifier: string, event: InitializeEvent<SwapData>): Promise<void> {
221
- //Only process HTLC requests
222
- if (event.swapType !== ChainSwapType.HTLC) return;
223
-
224
- const swapData = await event.swapData();
225
-
226
- const {swapContract, signer} = this.getChain(chainIdentifier);
227
- if (!swapData.isOfferer(signer.getAddress())) return;
228
- if (swapData.isPayIn()) return;
229
-
230
- const paymentHash = event.paymentHash;
231
-
232
- const savedSwap = await this.storageManager.getData(paymentHash, null);
233
- if (savedSwap==null || savedSwap.chainIdentifier!==chainIdentifier) return;
234
-
220
+ protected async processInitializeEvent(chainIdentifier: string, savedSwap: FromBtcLnSwapAbs, event: InitializeEvent<SwapData>): Promise<void> {
235
221
  this.swapLogger.info(savedSwap, "SC: InitializeEvent: HTLC initialized by the client, invoice: "+savedSwap.pr);
236
222
 
237
- savedSwap.txIds.init = (event as any).meta?.txId;
238
- if(savedSwap.metadata!=null) savedSwap.metadata.times.initTxReceived = Date.now();
239
223
  if(savedSwap.state===FromBtcLnSwapState.RECEIVED) {
240
224
  await savedSwap.setState(FromBtcLnSwapState.COMMITED);
241
- savedSwap.data = swapData;
242
- await this.storageManager.saveData(paymentHash, null, savedSwap);
225
+ await this.saveSwapData(savedSwap);
243
226
  }
244
227
  }
245
228
 
246
- protected async processClaimEvent(chainIdentifier: string, event: ClaimEvent<SwapData>): Promise<void> {
229
+ protected async processClaimEvent(chainIdentifier: string, savedSwap: FromBtcLnSwapAbs, event: ClaimEvent<SwapData>): Promise<void> {
247
230
  //Claim
248
231
  //This is the important part, we need to catch the claim TX, else we may lose money
249
- const secret: Buffer = Buffer.from(event.secret, "hex");
232
+ const secret: Buffer = Buffer.from(event.result, "hex");
250
233
  const paymentHash: Buffer = createHash("sha256").update(secret).digest();
251
234
  const secretHex = secret.toString("hex");
252
235
  const paymentHashHex = paymentHash.toString("hex");
253
236
 
254
- const savedSwap = await this.storageManager.getData(paymentHashHex, null);
255
- if (savedSwap==null || savedSwap.chainIdentifier!==chainIdentifier) return;
256
-
257
- savedSwap.txIds.claim = (event as any).meta?.txId;
258
- if(savedSwap.metadata!=null) savedSwap.metadata.times.claimTxReceived = Date.now();
237
+ if (savedSwap.lnPaymentHash!==paymentHashHex) return;
259
238
 
260
239
  this.swapLogger.info(savedSwap, "SC: ClaimEvent: swap HTLC successfully claimed by the client, invoice: "+savedSwap.pr);
261
240
 
@@ -269,32 +248,23 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
269
248
  this.swapLogger.error(savedSwap, "SC: ClaimEvent: cannot settle invoice", e);
270
249
  savedSwap.secret = secretHex;
271
250
  await savedSwap.setState(FromBtcLnSwapState.CLAIMED);
272
- await this.storageManager.saveData(paymentHashHex, null, savedSwap);
251
+ await this.saveSwapData(savedSwap);
273
252
  }
274
253
 
275
254
  }
276
255
 
277
- protected async processRefundEvent(chainIdentifier: string, event: RefundEvent<SwapData>): Promise<void> {
278
- //Refund
279
- //Try to get the hash from the refundMap
280
- if (event.paymentHash == null) return;
281
-
282
- const savedSwap = await this.storageManager.getData(event.paymentHash, null);
283
- if (savedSwap==null || savedSwap.chainIdentifier!==chainIdentifier) return;
284
-
285
- savedSwap.txIds.refund = (event as any).meta?.txId;
286
-
256
+ protected async processRefundEvent(chainIdentifier: string, savedSwap: FromBtcLnSwapAbs, event: RefundEvent<SwapData>): Promise<void> {
287
257
  this.swapLogger.info(savedSwap, "SC: RefundEvent: swap refunded to us, invoice: "+savedSwap.pr);
288
258
 
289
259
  try {
290
- await this.lightning.cancelHodlInvoice(event.paymentHash);
260
+ await this.lightning.cancelHodlInvoice(savedSwap.lnPaymentHash);
291
261
  this.swapLogger.info(savedSwap, "SC: RefundEvent: invoice cancelled");
292
262
  await this.removeSwapData(savedSwap, FromBtcLnSwapState.REFUNDED);
293
263
  } catch (e) {
294
264
  this.swapLogger.error(savedSwap, "SC: RefundEvent: cannot cancel invoice", e);
295
265
  await savedSwap.setState(FromBtcLnSwapState.CANCELED);
296
266
  // await PluginManager.swapStateChange(savedSwap);
297
- await this.storageManager.saveData(event.paymentHash, null, savedSwap);
267
+ await this.saveSwapData(savedSwap);
298
268
  }
299
269
  }
300
270
 
@@ -309,21 +279,21 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
309
279
  this.swapLogger.debug(invoiceData, "htlcReceived(): invoice: ", invoice);
310
280
  if(invoiceData.metadata!=null) invoiceData.metadata.times.htlcReceived = Date.now();
311
281
 
312
- const useToken = invoiceData.data.getToken();
313
- const sendAmount: BN = invoiceData.data.getAmount();
282
+ const useToken = invoiceData.token;
283
+ const escrowAmount: bigint = invoiceData.totalTokens;
314
284
 
315
285
  //Create abort controller for parallel fetches
316
286
  const abortController = new AbortController();
317
287
 
318
288
  //Pre-fetch data
319
- const balancePrefetch: Promise<BN> = this.getBalancePrefetch(invoiceData.chainIdentifier, useToken, abortController);
289
+ const balancePrefetch: Promise<bigint> = this.getBalancePrefetch(invoiceData.chainIdentifier, useToken, abortController);
320
290
  const blockheightPrefetch = this.getBlockheightPrefetch(abortController);
321
291
  const signDataPrefetchPromise: Promise<any> = this.getSignDataPrefetch(invoiceData.chainIdentifier, abortController);
322
292
 
323
- let expiryTimeout: BN;
293
+ let expiryTimeout: bigint;
324
294
  try {
325
295
  //Check if we have enough liquidity to proceed
326
- await this.checkBalance(sendAmount, balancePrefetch, abortController.signal);
296
+ await this.checkBalance(escrowAmount, balancePrefetch, abortController.signal);
327
297
  if(invoiceData.metadata!=null) invoiceData.metadata.times.htlcBalanceChecked = Date.now();
328
298
 
329
299
  //Check if HTLC expiry is long enough
@@ -342,18 +312,17 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
342
312
  const payInvoiceObject: SwapData = await swapContract.createSwapData(
343
313
  ChainSwapType.HTLC,
344
314
  signer.getAddress(),
345
- invoiceData.data.getClaimer(),
315
+ invoiceData.claimer,
346
316
  useToken,
347
- sendAmount,
348
- invoice.id,
349
- new BN(0),
350
- new BN(Math.floor(Date.now() / 1000)).add(expiryTimeout),
351
- new BN(0),
352
- 0,
317
+ escrowAmount,
318
+ invoiceData.claimHash,
319
+ 0n,
320
+ BigInt(Math.floor(Date.now() / 1000)) + expiryTimeout,
353
321
  false,
354
322
  true,
355
- invoiceData.data.getSecurityDeposit(),
356
- new BN(0)
323
+ invoiceData.securityDeposit,
324
+ 0n,
325
+ invoiceData.depositToken
357
326
  );
358
327
  abortController.signal.throwIfAborted();
359
328
  if(invoiceData.metadata!=null) invoiceData.metadata.times.htlcSwapCreated = Date.now();
@@ -362,7 +331,7 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
362
331
  const sigData = await swapContract.getInitSignature(
363
332
  signer,
364
333
  payInvoiceObject,
365
- this.config.authorizationTimeout,
334
+ this.getInitAuthorizationTimeout(invoiceData.chainIdentifier),
366
335
  signDataPrefetchPromise==null ? null : await signDataPrefetchPromise,
367
336
  invoiceData.feeRate
368
337
  );
@@ -379,7 +348,7 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
379
348
  //Setting the state variable is done outside the promise, so is done synchronously
380
349
  await invoiceData.setState(FromBtcLnSwapState.RECEIVED);
381
350
 
382
- await this.storageManager.saveData(invoice.id, null, invoiceData);
351
+ await this.saveSwapData(invoiceData);
383
352
  return;
384
353
  }
385
354
  }
@@ -450,14 +419,14 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
450
419
  * @throws {DefinedRuntimeError} Will throw if HTLC expires too soon and therefore cannot be processed
451
420
  * @returns expiry timeout in seconds
452
421
  */
453
- private async checkHtlcExpiry(invoice: LightningNetworkInvoice, blockheightPrefetch: Promise<number>, signal: AbortSignal): Promise<BN> {
422
+ private async checkHtlcExpiry(invoice: LightningNetworkInvoice, blockheightPrefetch: Promise<number>, signal: AbortSignal): Promise<bigint> {
454
423
  const timeout: number = this.getInvoicePaymentsTimeout(invoice);
455
424
  const current_block_height = await blockheightPrefetch;
456
425
  signal.throwIfAborted();
457
426
 
458
- const blockDelta = new BN(timeout - current_block_height);
427
+ const blockDelta = BigInt(timeout - current_block_height);
459
428
 
460
- const htlcExpiresTooSoon = blockDelta.lt(this.config.minCltv);
429
+ const htlcExpiresTooSoon = blockDelta < this.config.minCltv;
461
430
  if(htlcExpiresTooSoon) {
462
431
  throw {
463
432
  code: 20002,
@@ -469,7 +438,7 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
469
438
  };
470
439
  }
471
440
 
472
- return this.config.minCltv.mul(this.config.bitcoinBlocktime.div(this.config.safetyFactor)).sub(this.config.gracePeriod);
441
+ return (this.config.minCltv * this.config.bitcoinBlocktime / this.config.safetyFactor) - this.config.gracePeriod;
473
442
  }
474
443
 
475
444
  /**
@@ -480,29 +449,27 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
480
449
  private async cancelSwapAndInvoice(invoiceData: FromBtcLnSwapAbs): Promise<void> {
481
450
  if(invoiceData.state!==FromBtcLnSwapState.CREATED) return;
482
451
  await invoiceData.setState(FromBtcLnSwapState.CANCELED);
483
- const paymentHash = invoiceData.data.getHash();
484
- await this.lightning.cancelHodlInvoice(paymentHash);
452
+ await this.lightning.cancelHodlInvoice(invoiceData.lnPaymentHash);
485
453
  await this.removeSwapData(invoiceData);
486
454
  this.swapLogger.info(invoiceData, "cancelSwapAndInvoice(): swap removed & invoice cancelled, invoice: ", invoiceData.pr);
487
455
  };
488
456
 
489
457
  private getDummySwapData(chainIdentifier: string, useToken: string, address: string, paymentHash: string) {
490
458
  const {swapContract, signer} = this.getChain(chainIdentifier);
459
+ const dummyAmount = BigInt(Math.floor(Math.random() * 0x1000000));
491
460
  return swapContract.createSwapData(
492
461
  ChainSwapType.HTLC,
493
462
  signer.getAddress(),
494
463
  address,
495
464
  useToken,
496
- null,
497
- paymentHash,
498
- new BN(0),
499
- null,
500
- null,
501
- 0,
465
+ dummyAmount,
466
+ swapContract.getHashForHtlc(Buffer.from(paymentHash, "hex")).toString("hex"),
467
+ BigIntBufferUtils.fromBuffer(randomBytes(8)),
468
+ BigInt(Math.floor(Date.now()/1000)),
502
469
  false,
503
470
  true,
504
- null,
505
- new BN(0)
471
+ BigInt(Math.floor(Math.random() * 0x10000)),
472
+ 0n
506
473
  );
507
474
  }
508
475
 
@@ -576,9 +543,12 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
576
543
 
577
544
  const chainIdentifier = req.query.chain as string ?? this.chains.default;
578
545
  const {swapContract, signer} = this.getChain(chainIdentifier);
546
+ const depositToken = req.query.depositToken as string ?? swapContract.getNativeCurrencyAddress();
547
+ this.checkAllowedDepositToken(chainIdentifier, depositToken);
579
548
 
580
549
  metadata.times.requestReceived = Date.now();
581
550
 
551
+
582
552
  /**
583
553
  * address: string solana address of the recipient
584
554
  * paymentHash: string payment hash of the to-be-created invoice
@@ -598,7 +568,7 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
598
568
  typeof(val)==="string" &&
599
569
  val.length===64 &&
600
570
  HEX_REGEX.test(val) ? val: null,
601
- amount: FieldTypeEnum.BN,
571
+ amount: FieldTypeEnum.BigInt,
602
572
  token: (val: string) => val!=null &&
603
573
  typeof(val)==="string" &&
604
574
  this.isTokenSupported(chainIdentifier, val) ? val : null,
@@ -630,13 +600,21 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
630
600
  const abortController = this.getAbortController(responseStream);
631
601
 
632
602
  //Pre-fetch data
633
- const {pricePrefetchPromise, securityDepositPricePrefetchPromise} = this.getFromBtcPricePrefetches(chainIdentifier, useToken, abortController);
634
- const balancePrefetch: Promise<BN> = this.getBalancePrefetch(chainIdentifier, useToken, abortController);
603
+ const {
604
+ pricePrefetchPromise,
605
+ gasTokenPricePrefetchPromise,
606
+ depositTokenPricePrefetchPromise
607
+ } = this.getFromBtcPricePrefetches(chainIdentifier, useToken, depositToken, abortController);
608
+ const balancePrefetch: Promise<bigint> = this.getBalancePrefetch(chainIdentifier, useToken, abortController);
635
609
  const channelsPrefetch: Promise<LightningNetworkChannel[]> = this.getChannelsPrefetch(abortController);
636
610
 
637
611
  const dummySwapData = await this.getDummySwapData(chainIdentifier, useToken, parsedBody.address, parsedBody.paymentHash);
638
612
  abortController.signal.throwIfAborted();
639
- const baseSDPromise: Promise<BN> = this.getBaseSecurityDepositPrefetch(chainIdentifier, dummySwapData, abortController);
613
+ const baseSDPromise: Promise<bigint> = this.getBaseSecurityDepositPrefetch(
614
+ chainIdentifier, dummySwapData, depositToken,
615
+ gasTokenPricePrefetchPromise, depositTokenPricePrefetchPromise,
616
+ abortController
617
+ );
640
618
 
641
619
  //Asynchronously send the node's public key to the client
642
620
  this.sendPublicKeyAsync(responseStream);
@@ -658,10 +636,10 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
658
636
  //Create swap
659
637
  const hodlInvoiceObj: HodlInvoiceInit = {
660
638
  description: chainIdentifier+"-"+parsedBody.address,
661
- cltvDelta: this.config.minCltv.add(new BN(5)).toNumber(),
639
+ cltvDelta: Number(this.config.minCltv) + 5,
662
640
  expiresAt: Date.now()+(this.config.invoiceTimeoutSeconds*1000),
663
641
  id: parsedBody.paymentHash,
664
- mtokens: amountBD.mul(new BN(1000)),
642
+ mtokens: amountBD * 1000n,
665
643
  descriptionHash: parsedBody.descriptionHash
666
644
  };
667
645
  metadata.invoiceRequest = hodlInvoiceObj;
@@ -671,41 +649,29 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
671
649
  metadata.times.invoiceCreated = Date.now();
672
650
  metadata.invoiceResponse = {...hodlInvoice};
673
651
 
674
- const createdSwap = new FromBtcLnSwapAbs(
675
- chainIdentifier,
676
- hodlInvoice.request,
677
- hodlInvoice.mtokens,
678
- swapFee,
679
- swapFeeInToken
680
- );
681
-
682
652
  //Pre-compute the security deposit
683
- const expiryTimeout = this.config.minCltv.mul(this.config.bitcoinBlocktime.div(this.config.safetyFactor)).sub(this.config.gracePeriod);
653
+ const expiryTimeout = (this.config.minCltv * this.config.bitcoinBlocktime / this.config.safetyFactor) - this.config.gracePeriod;
684
654
  const totalSecurityDeposit = await this.getSecurityDeposit(
685
655
  chainIdentifier, amountBD, swapFee, expiryTimeout,
686
- baseSDPromise, securityDepositPricePrefetchPromise,
656
+ baseSDPromise, depositToken, depositTokenPricePrefetchPromise,
687
657
  abortController.signal, metadata
688
658
  );
689
659
  metadata.times.securityDepositCalculated = Date.now();
690
660
 
691
- //Create swap data
692
- createdSwap.data = await swapContract.createSwapData(
693
- ChainSwapType.HTLC,
694
- signer.getAddress(),
661
+ const createdSwap = new FromBtcLnSwapAbs(
662
+ chainIdentifier,
663
+ hodlInvoice.request,
664
+ parsedBody.paymentHash,
665
+ hodlInvoice.mtokens,
666
+ swapFee,
667
+ swapFeeInToken,
695
668
  parsedBody.address,
696
669
  useToken,
697
670
  totalInToken,
698
- parsedBody.paymentHash,
699
- new BN(0),
700
- null,
701
- null,
702
- 0,
703
- false,
704
- true,
671
+ swapContract.getHashForHtlc(Buffer.from(parsedBody.paymentHash, "hex")).toString("hex"),
705
672
  totalSecurityDeposit,
706
- new BN(0)
673
+ depositToken
707
674
  );
708
- abortController.signal.throwIfAborted();
709
675
  metadata.times.swapCreated = Date.now();
710
676
 
711
677
  createdSwap.metadata = metadata;
@@ -713,12 +679,12 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
713
679
  //Save the desired fee rate for the signature
714
680
  const feeRateObj = await req.paramReader.getParams({
715
681
  feeRate: FieldTypeEnum.String
716
- }).catch(e => null);
682
+ }).catch(() => null);
717
683
  abortController.signal.throwIfAborted();
718
684
  createdSwap.feeRate = feeRateObj?.feeRate!=null && typeof(feeRateObj.feeRate)==="string" ? feeRateObj.feeRate : null;
719
685
 
720
686
  await PluginManager.swapCreate(createdSwap);
721
- await this.storageManager.saveData(parsedBody.paymentHash, null, createdSwap);
687
+ await this.saveSwapData(createdSwap);
722
688
 
723
689
  this.swapLogger.info(createdSwap, "REST: /createInvoice: Created swap invoice: "+hodlInvoice.request+" amount: "+amountBD.toString(10));
724
690
 
@@ -816,8 +782,7 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
816
782
  msg: "Success",
817
783
  data: {
818
784
  address: signer.getAddress(),
819
- data: swap.serialize().data,
820
- nonce: swap.nonce,
785
+ data: swap.data.serialize(),
821
786
  prefix: swap.prefix,
822
787
  timeout: swap.timeout,
823
788
  signature: swap.signature
@@ -832,12 +797,12 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
832
797
  }
833
798
 
834
799
  async init() {
835
- await this.storageManager.loadData(FromBtcLnSwapAbs);
800
+ await this.loadData(FromBtcLnSwapAbs);
836
801
  //Check if all swaps contain a valid amount
837
- for(let swap of await this.storageManager.query([])) {
802
+ for(let {obj: swap} of await this.storageManager.query([])) {
838
803
  if(swap.amount==null) {
839
804
  const parsedPR = await this.lightning.parsePaymentRequest(swap.pr);
840
- swap.amount = parsedPR.mtokens.add(new BN(999)).div(new BN(1000));
805
+ swap.amount = (parsedPR.mtokens + 999n) / 1000n;
841
806
  }
842
807
  }
843
808
  this.subscribeToEvents();
@@ -846,7 +811,7 @@ export class FromBtcLnAbs extends FromBtcLnBaseSwapHandler<FromBtcLnSwapAbs, Fro
846
811
 
847
812
  getInfoData(): any {
848
813
  return {
849
- minCltv: this.config.minCltv.toNumber()
814
+ minCltv: Number(this.config.minCltv)
850
815
  };
851
816
  }
852
817
 
@@ -1,7 +1,7 @@
1
- import * as BN from "bn.js";
2
1
  import {SwapData} from "@atomiqlabs/base";
3
2
  import {SwapHandlerType} from "../..";
4
3
  import {FromBtcBaseSwap} from "../FromBtcBaseSwap";
4
+ import {deserializeBN, serializeBN} from "../../utils/Utils";
5
5
 
6
6
  export enum FromBtcLnSwapState {
7
7
  REFUNDED = -2,
@@ -16,24 +16,78 @@ export enum FromBtcLnSwapState {
16
16
  export class FromBtcLnSwapAbs<T extends SwapData = SwapData> extends FromBtcBaseSwap<T, FromBtcLnSwapState> {
17
17
 
18
18
  readonly pr: string;
19
+ lnPaymentHash: string;
19
20
 
20
- nonce: number;
21
+ readonly claimer: string;
22
+ readonly token: string;
23
+ readonly totalTokens: bigint;
24
+ readonly claimHash: string;
25
+ readonly securityDeposit: bigint;
26
+ readonly depositToken: string;
21
27
 
22
28
  secret: string;
23
29
 
24
- constructor(chainIdentifier: string, pr: string, amountMtokens: BN, swapFee: BN, swapFeeInToken: BN);
30
+ constructor(
31
+ chainIdentifier: string,
32
+ pr: string,
33
+ lnPaymentHash: string,
34
+ amountMtokens: bigint,
35
+ swapFee: bigint,
36
+ swapFeeInToken: bigint,
37
+ claimer: string,
38
+ token: string,
39
+ totalTokens: bigint,
40
+ claimHash: string,
41
+ securityDeposit: bigint,
42
+ depositToken: string
43
+ );
25
44
  constructor(obj: any);
26
45
 
27
- constructor(chainIdOrObj: string | any, pr?: string, amountMtokens?: BN, swapFee?: BN, swapFeeInToken?: BN) {
46
+ constructor(
47
+ chainIdOrObj: string | any,
48
+ pr?: string,
49
+ lnPaymentHash?: string,
50
+ amountMtokens?: bigint,
51
+ swapFee?: bigint,
52
+ swapFeeInToken?: bigint,
53
+ claimer?: string,
54
+ token?: string,
55
+ totalTokens?: bigint,
56
+ claimHash?: string,
57
+ securityDeposit?: bigint,
58
+ depositToken?: string
59
+ ) {
28
60
  if(typeof(chainIdOrObj)==="string") {
29
- super(chainIdOrObj, amountMtokens.add(new BN(999)).div(new BN(1000)), swapFee, swapFeeInToken);
61
+ super(chainIdOrObj, (amountMtokens + 999n) / 1000n, swapFee, swapFeeInToken);
30
62
  this.state = FromBtcLnSwapState.CREATED;
31
63
  this.pr = pr;
64
+ this.lnPaymentHash = lnPaymentHash;
65
+ this.claimer = claimer;
66
+ this.token = token;
67
+ this.totalTokens = totalTokens;
68
+ this.claimHash = claimHash;
69
+ this.securityDeposit = securityDeposit;
70
+ this.depositToken = depositToken;
32
71
  } else {
33
72
  super(chainIdOrObj);
34
73
  this.pr = chainIdOrObj.pr;
74
+ this.lnPaymentHash = chainIdOrObj.lnPaymentHash;
75
+ this.claimer = chainIdOrObj.claimer;
76
+ this.token = chainIdOrObj.token;
77
+ this.totalTokens = deserializeBN(chainIdOrObj.totalTokens);
78
+ this.claimHash = chainIdOrObj.claimHash;
79
+ this.securityDeposit = deserializeBN(chainIdOrObj.securityDeposit);
35
80
  this.secret = chainIdOrObj.secret;
36
- this.nonce = chainIdOrObj.nonce;
81
+ this.depositToken = chainIdOrObj.depositToken;
82
+
83
+ //Compatibility
84
+ if(this.state===FromBtcLnSwapState.CREATED && this.data!=null) {
85
+ this.claimer = this.data.getClaimer();
86
+ this.token = this.data.getToken();
87
+ this.totalTokens = this.data.getAmount();
88
+ this.claimHash = this.data.getClaimHash();
89
+ this.securityDeposit = this.data.getSecurityDeposit();
90
+ }
37
91
  }
38
92
  this.type = SwapHandlerType.FROM_BTCLN;
39
93
  }
@@ -42,12 +96,22 @@ export class FromBtcLnSwapAbs<T extends SwapData = SwapData> extends FromBtcBase
42
96
  const partialSerialized = super.serialize();
43
97
  partialSerialized.pr = this.pr;
44
98
  partialSerialized.secret = this.secret;
45
- partialSerialized.nonce = this.nonce;
99
+ partialSerialized.lnPaymentHash = this.lnPaymentHash;
100
+ partialSerialized.claimer = this.claimer;
101
+ partialSerialized.token = this.token;
102
+ partialSerialized.totalTokens = serializeBN(this.totalTokens);
103
+ partialSerialized.claimHash = this.claimHash;
104
+ partialSerialized.securityDeposit = serializeBN(this.securityDeposit);
105
+ partialSerialized.depositToken = this.depositToken;
46
106
  return partialSerialized;
47
107
  }
48
108
 
49
- getSequence(): BN {
50
- return null;
109
+ getIdentifierHash(): string {
110
+ return this.lnPaymentHash;
111
+ }
112
+
113
+ getSequence(): bigint {
114
+ return 0n;
51
115
  }
52
116
 
53
117
  isInitiated(): boolean {