@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.
- 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 +402 -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 +110 -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,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 {
|
|
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:
|
|
33
|
+
routingFeeMultiplier: bigint,
|
|
27
34
|
|
|
28
|
-
minSendCltv:
|
|
35
|
+
minSendCltv: bigint,
|
|
29
36
|
|
|
30
37
|
allowProbeFailedSwaps: boolean,
|
|
31
38
|
allowShortExpiry: boolean,
|
|
32
39
|
|
|
33
|
-
minLnRoutingFeePPM?:
|
|
34
|
-
minLnBaseFee?:
|
|
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:
|
|
51
|
+
amount: bigint,
|
|
45
52
|
initialInvoice: ParsedPaymentRequest,
|
|
46
53
|
|
|
47
|
-
quotedNetworkFeeInToken:
|
|
48
|
-
swapFeeInToken:
|
|
49
|
-
total:
|
|
54
|
+
quotedNetworkFeeInToken: bigint,
|
|
55
|
+
swapFeeInToken: bigint,
|
|
56
|
+
total: bigint,
|
|
50
57
|
confidence: number,
|
|
51
|
-
quotedNetworkFee:
|
|
52
|
-
swapFee:
|
|
58
|
+
quotedNetworkFee: bigint,
|
|
59
|
+
swapFee: bigint,
|
|
53
60
|
|
|
54
61
|
token: string,
|
|
55
|
-
swapExpiry:
|
|
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:
|
|
71
|
-
expiryTimestamp:
|
|
77
|
+
maxFee: bigint,
|
|
78
|
+
expiryTimestamp: bigint,
|
|
72
79
|
token: string,
|
|
73
80
|
offerer: string,
|
|
74
81
|
exactIn?: boolean,
|
|
75
|
-
amount?:
|
|
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:
|
|
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:
|
|
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
|
|
119
|
+
anyConfig.minTsSendCltv = config.gracePeriod + (config.bitcoinBlocktime * config.minSendCltv * config.safetyFactor);
|
|
112
120
|
this.config = anyConfig;
|
|
113
|
-
this.config.minLnRoutingFeePPM = this.config.minLnRoutingFeePPM ||
|
|
114
|
-
this.config.minLnBaseFee = this.config.minLnBaseFee ||
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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:
|
|
306
|
-
const currentTimestamp:
|
|
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
|
|
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
|
|
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
|
|
337
|
-
maxTimeoutHeight: blockHeight+maxUsableCLTVdelta
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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:
|
|
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:
|
|
464
|
-
if(maxFee
|
|
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.
|
|
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:
|
|
525
|
-
const expiresTooSoon = expiryTimestamp
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
577
|
+
networkFee: bigint
|
|
591
578
|
}> {
|
|
592
|
-
const maxUsableCLTV:
|
|
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 =
|
|
585
|
+
const maxTimeoutBlockheight = BigInt(blockHeight) + maxUsableCLTV;
|
|
599
586
|
|
|
600
587
|
const req: ProbeAndRouteInit = {
|
|
601
588
|
request: pr,
|
|
602
|
-
amountMtokens: amountBD
|
|
603
|
-
maxFeeMtokens: maxFee
|
|
604
|
-
maxTimeoutHeight: maxTimeoutBlockheight
|
|
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
|
|
628
|
+
const safeFeeTokens = (probeOrRouteResp.feeMtokens + 999n) / 1000n;
|
|
642
629
|
|
|
643
|
-
let actualRoutingFee:
|
|
630
|
+
let actualRoutingFee: bigint = safeFeeTokens * this.config.routingFeeMultiplier;
|
|
644
631
|
|
|
645
|
-
const minRoutingFee:
|
|
646
|
-
if(actualRoutingFee
|
|
632
|
+
const minRoutingFee: bigint = (amountBD * this.config.minLnRoutingFeePPM / 1000000n) + this.config.minLnBaseFee;
|
|
633
|
+
if(actualRoutingFee < minRoutingFee) {
|
|
647
634
|
actualRoutingFee = minRoutingFee;
|
|
648
|
-
if(actualRoutingFee
|
|
635
|
+
if(actualRoutingFee > maxFee) {
|
|
649
636
|
probeOrRouteResp.confidence = 0;
|
|
650
637
|
}
|
|
651
638
|
}
|
|
652
639
|
|
|
653
|
-
if(actualRoutingFee
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
747
|
+
claimHash.toString("hex"),
|
|
760
748
|
sequence,
|
|
761
749
|
parsedAuth.swapExpiry,
|
|
762
|
-
new BN(0),
|
|
763
|
-
0,
|
|
764
750
|
true,
|
|
765
751
|
false,
|
|
766
|
-
|
|
767
|
-
|
|
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.
|
|
849
|
-
expiryTimestamp: FieldTypeEnum.
|
|
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.
|
|
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:
|
|
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
|
|
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:
|
|
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 =
|
|
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
|
-
|
|
966
|
+
claimHash.toString("hex"),
|
|
975
967
|
sequence,
|
|
976
968
|
parsedBody.expiryTimestamp,
|
|
977
|
-
new BN(0),
|
|
978
|
-
0,
|
|
979
969
|
true,
|
|
980
970
|
false,
|
|
981
|
-
|
|
982
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
1147
|
-
minTimestampCltv: this.config.minTsSendCltv
|
|
1138
|
+
minCltv: Number(this.config.minSendCltv),
|
|
1139
|
+
minTimestampCltv: Number(this.config.minTsSendCltv)
|
|
1148
1140
|
};
|
|
1149
1141
|
}
|
|
1150
1142
|
|