@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.
- package/dist/info/InfoHandler.js +3 -12
- package/dist/plugins/IPlugin.d.ts +34 -35
- package/dist/plugins/IPlugin.js +7 -8
- package/dist/plugins/PluginManager.d.ts +29 -30
- package/dist/plugins/PluginManager.js +160 -188
- package/dist/prices/BinanceSwapPrice.d.ts +1 -2
- package/dist/prices/BinanceSwapPrice.js +56 -70
- package/dist/prices/CoinGeckoSwapPrice.d.ts +2 -3
- package/dist/prices/CoinGeckoSwapPrice.js +30 -42
- package/dist/prices/OKXSwapPrice.d.ts +1 -2
- package/dist/prices/OKXSwapPrice.js +56 -70
- package/dist/storage/IIntermediaryStorage.d.ts +8 -5
- package/dist/storagemanager/IntermediaryStorageManager.d.ts +8 -5
- package/dist/storagemanager/IntermediaryStorageManager.js +52 -61
- package/dist/storagemanager/StorageManager.js +42 -59
- package/dist/swaps/FromBtcBaseSwap.d.ts +7 -8
- package/dist/swaps/FromBtcBaseSwap.js +2 -3
- package/dist/swaps/FromBtcBaseSwapHandler.d.ts +44 -31
- package/dist/swaps/FromBtcBaseSwapHandler.js +217 -196
- package/dist/swaps/FromBtcLnBaseSwapHandler.d.ts +1 -2
- package/dist/swaps/FromBtcLnBaseSwapHandler.js +13 -24
- package/dist/swaps/ISwapPrice.d.ts +4 -5
- package/dist/swaps/ISwapPrice.js +8 -30
- package/dist/swaps/SwapHandler.d.ts +26 -15
- package/dist/swaps/SwapHandler.js +107 -66
- package/dist/swaps/SwapHandlerSwap.d.ts +22 -11
- package/dist/swaps/SwapHandlerSwap.js +32 -8
- package/dist/swaps/ToBtcBaseSwap.d.ts +16 -17
- package/dist/swaps/ToBtcBaseSwap.js +4 -4
- package/dist/swaps/ToBtcBaseSwapHandler.d.ts +17 -17
- package/dist/swaps/ToBtcBaseSwapHandler.js +140 -155
- package/dist/swaps/frombtc_abstract/FromBtcAbs.d.ts +8 -15
- package/dist/swaps/frombtc_abstract/FromBtcAbs.js +131 -196
- package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.d.ts +3 -5
- package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.js +4 -4
- package/dist/swaps/frombtc_trusted/FromBtcTrusted.d.ts +10 -8
- package/dist/swaps/frombtc_trusted/FromBtcTrusted.js +330 -362
- package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.d.ts +10 -10
- package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.js +7 -4
- package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.d.ts +8 -8
- package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.js +330 -400
- package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.d.ts +10 -4
- package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.js +36 -6
- package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.d.ts +8 -7
- package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.js +251 -273
- package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.d.ts +5 -5
- package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.js +7 -5
- package/dist/swaps/tobtc_abstract/ToBtcAbs.d.ts +13 -12
- package/dist/swaps/tobtc_abstract/ToBtcAbs.js +261 -323
- package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.d.ts +4 -4
- package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.js +7 -6
- package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.d.ts +22 -21
- package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.js +398 -453
- package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.d.ts +3 -2
- package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.js +10 -6
- package/dist/utils/Utils.d.ts +2 -3
- package/dist/utils/Utils.js +4 -14
- package/dist/utils/paramcoders/LegacyParamEncoder.js +3 -14
- package/dist/utils/paramcoders/ParamDecoder.js +53 -65
- package/dist/utils/paramcoders/SchemaVerifier.d.ts +4 -5
- package/dist/utils/paramcoders/SchemaVerifier.js +8 -9
- package/dist/utils/paramcoders/server/ServerParamDecoder.js +1 -1
- package/dist/utils/paramcoders/server/ServerParamEncoder.js +3 -14
- package/dist/wallets/IBitcoinWallet.d.ts +4 -5
- package/dist/wallets/ILightningWallet.d.ts +20 -21
- package/dist/wallets/ILightningWallet.js +1 -1
- package/package.json +4 -6
- package/src/plugins/IPlugin.ts +28 -29
- package/src/plugins/PluginManager.ts +21 -22
- package/src/prices/BinanceSwapPrice.ts +3 -4
- package/src/prices/CoinGeckoSwapPrice.ts +4 -5
- package/src/prices/OKXSwapPrice.ts +3 -4
- package/src/storage/IIntermediaryStorage.ts +4 -5
- package/src/storagemanager/IntermediaryStorageManager.ts +17 -9
- package/src/swaps/FromBtcBaseSwap.ts +9 -10
- package/src/swaps/FromBtcBaseSwapHandler.ts +133 -91
- package/src/swaps/FromBtcLnBaseSwapHandler.ts +2 -3
- package/src/swaps/ISwapPrice.ts +10 -20
- package/src/swaps/SwapHandler.ts +101 -35
- package/src/swaps/SwapHandlerSwap.ts +42 -17
- package/src/swaps/ToBtcBaseSwap.ts +20 -18
- package/src/swaps/ToBtcBaseSwapHandler.ts +33 -33
- package/src/swaps/frombtc_abstract/FromBtcAbs.ts +64 -97
- package/src/swaps/frombtc_abstract/FromBtcSwapAbs.ts +7 -8
- package/src/swaps/frombtc_trusted/FromBtcTrusted.ts +56 -55
- package/src/swaps/frombtc_trusted/FromBtcTrustedSwap.ts +28 -21
- package/src/swaps/frombtcln_abstract/FromBtcLnAbs.ts +81 -116
- package/src/swaps/frombtcln_abstract/FromBtcLnSwapAbs.ts +73 -9
- package/src/swaps/frombtcln_trusted/FromBtcLnTrusted.ts +39 -36
- package/src/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.ts +26 -12
- package/src/swaps/tobtc_abstract/ToBtcAbs.ts +82 -98
- package/src/swaps/tobtc_abstract/ToBtcSwapAbs.ts +25 -20
- package/src/swaps/tobtcln_abstract/ToBtcLnAbs.ts +106 -118
- package/src/swaps/tobtcln_abstract/ToBtcLnSwapAbs.ts +17 -9
- package/src/utils/Utils.ts +3 -4
- package/src/utils/paramcoders/ParamDecoder.ts +5 -5
- package/src/utils/paramcoders/SchemaVerifier.ts +10 -11
- package/src/utils/paramcoders/server/ServerParamDecoder.ts +1 -1
- package/src/wallets/IBitcoinWallet.ts +4 -5
- 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:
|
|
33
|
-
gracePeriod:
|
|
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:
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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(
|
|
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.
|
|
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.
|
|
313
|
-
const
|
|
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<
|
|
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:
|
|
293
|
+
let expiryTimeout: bigint;
|
|
324
294
|
try {
|
|
325
295
|
//Check if we have enough liquidity to proceed
|
|
326
|
-
await this.checkBalance(
|
|
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.
|
|
315
|
+
invoiceData.claimer,
|
|
346
316
|
useToken,
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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.
|
|
356
|
-
|
|
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.
|
|
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.
|
|
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<
|
|
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 =
|
|
427
|
+
const blockDelta = BigInt(timeout - current_block_height);
|
|
459
428
|
|
|
460
|
-
const htlcExpiresTooSoon = blockDelta
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
497
|
-
paymentHash,
|
|
498
|
-
|
|
499
|
-
|
|
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
|
-
|
|
505
|
-
|
|
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.
|
|
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 {
|
|
634
|
-
|
|
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<
|
|
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:
|
|
639
|
+
cltvDelta: Number(this.config.minCltv) + 5,
|
|
662
640
|
expiresAt: Date.now()+(this.config.invoiceTimeoutSeconds*1000),
|
|
663
641
|
id: parsedBody.paymentHash,
|
|
664
|
-
mtokens: amountBD
|
|
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
|
|
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,
|
|
656
|
+
baseSDPromise, depositToken, depositTokenPricePrefetchPromise,
|
|
687
657
|
abortController.signal, metadata
|
|
688
658
|
);
|
|
689
659
|
metadata.times.securityDepositCalculated = Date.now();
|
|
690
660
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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()
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
50
|
-
return
|
|
109
|
+
getIdentifierHash(): string {
|
|
110
|
+
return this.lnPaymentHash;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
getSequence(): bigint {
|
|
114
|
+
return 0n;
|
|
51
115
|
}
|
|
52
116
|
|
|
53
117
|
isInitiated(): boolean {
|