@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,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,
|
|
@@ -849,8 +836,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
849
836
|
*/
|
|
850
837
|
const parsedBody: ToBtcLnRequestType = await req.paramReader.getParams({
|
|
851
838
|
pr: FieldTypeEnum.String,
|
|
852
|
-
maxFee: FieldTypeEnum.
|
|
853
|
-
expiryTimestamp: FieldTypeEnum.
|
|
839
|
+
maxFee: FieldTypeEnum.BigInt,
|
|
840
|
+
expiryTimestamp: FieldTypeEnum.BigInt,
|
|
854
841
|
token: (val: string) => val!=null &&
|
|
855
842
|
typeof(val)==="string" &&
|
|
856
843
|
this.isTokenSupported(chainIdentifier, val) ? val : null,
|
|
@@ -858,7 +845,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
858
845
|
typeof(val)==="string" &&
|
|
859
846
|
swapContract.isValidAddress(val) ? val : null,
|
|
860
847
|
exactIn: FieldTypeEnum.BooleanOptional,
|
|
861
|
-
amount: FieldTypeEnum.
|
|
848
|
+
amount: FieldTypeEnum.BigIntOptional
|
|
862
849
|
});
|
|
863
850
|
if (parsedBody==null) {
|
|
864
851
|
throw {
|
|
@@ -878,17 +865,17 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
878
865
|
|
|
879
866
|
const responseStream = res.responseStream;
|
|
880
867
|
|
|
881
|
-
const currentTimestamp:
|
|
868
|
+
const currentTimestamp: bigint = BigInt(Math.floor(Date.now()/1000));
|
|
882
869
|
|
|
883
870
|
//Check request params
|
|
884
871
|
this.checkAmount(parsedBody.amount, parsedBody.exactIn);
|
|
885
872
|
this.checkMaxFee(parsedBody.maxFee);
|
|
886
873
|
this.checkExpiry(parsedBody.expiryTimestamp, currentTimestamp);
|
|
887
874
|
await this.checkVaultInitialized(chainIdentifier, parsedBody.token);
|
|
888
|
-
const {parsedPR, halfConfidence} = await this.checkPaymentRequest(parsedBody.pr);
|
|
875
|
+
const {parsedPR, halfConfidence} = await this.checkPaymentRequest(chainIdentifier, parsedBody.pr);
|
|
889
876
|
const requestedAmount = {
|
|
890
877
|
input: !!parsedBody.exactIn,
|
|
891
|
-
amount: !!parsedBody.exactIn ? parsedBody.amount : parsedPR.mtokens
|
|
878
|
+
amount: !!parsedBody.exactIn ? parsedBody.amount : (parsedPR.mtokens + 999n) / 1000n
|
|
892
879
|
};
|
|
893
880
|
const fees = await this.preCheckAmounts(request, requestedAmount, useToken);
|
|
894
881
|
metadata.times.requestChecked = Date.now();
|
|
@@ -911,7 +898,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
911
898
|
swapFee,
|
|
912
899
|
swapFeeInToken,
|
|
913
900
|
networkFeeInToken
|
|
914
|
-
} = await this.checkToBtcAmount(request, requestedAmount, fees, useToken, async (amountBD:
|
|
901
|
+
} = await this.checkToBtcAmount(request, requestedAmount, fees, useToken, async (amountBD: bigint) => {
|
|
915
902
|
//Check if we have enough liquidity to process the swap
|
|
916
903
|
await this.checkLiquidity(amountBD, abortController.signal, true);
|
|
917
904
|
metadata.times.liquidityChecked = Date.now();
|
|
@@ -966,7 +953,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
966
953
|
return;
|
|
967
954
|
}
|
|
968
955
|
|
|
969
|
-
const sequence =
|
|
956
|
+
const sequence = BigIntBufferUtils.fromBuffer(randomBytes(8));
|
|
957
|
+
const claimHash = swapContract.getHashForHtlc(Buffer.from(parsedPR.id, "hex"));
|
|
970
958
|
|
|
971
959
|
//Create swap data
|
|
972
960
|
const payObject: SwapData = await swapContract.createSwapData(
|
|
@@ -975,15 +963,13 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
975
963
|
signer.getAddress(),
|
|
976
964
|
useToken,
|
|
977
965
|
totalInToken,
|
|
978
|
-
|
|
966
|
+
claimHash.toString("hex"),
|
|
979
967
|
sequence,
|
|
980
968
|
parsedBody.expiryTimestamp,
|
|
981
|
-
new BN(0),
|
|
982
|
-
0,
|
|
983
969
|
true,
|
|
984
970
|
false,
|
|
985
|
-
|
|
986
|
-
|
|
971
|
+
0n,
|
|
972
|
+
0n
|
|
987
973
|
);
|
|
988
974
|
abortController.signal.throwIfAborted();
|
|
989
975
|
metadata.times.swapCreated = Date.now();
|
|
@@ -995,6 +981,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
995
981
|
//Create swap
|
|
996
982
|
const createdSwap = new ToBtcLnSwapAbs(
|
|
997
983
|
chainIdentifier,
|
|
984
|
+
parsedPR.id,
|
|
998
985
|
parsedBody.pr,
|
|
999
986
|
parsedPR.mtokens,
|
|
1000
987
|
swapFee,
|
|
@@ -1010,7 +997,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
1010
997
|
createdSwap.feeRate = sigData.feeRate;
|
|
1011
998
|
|
|
1012
999
|
await PluginManager.swapCreate(createdSwap);
|
|
1013
|
-
await this.
|
|
1000
|
+
await this.saveSwapData(createdSwap);
|
|
1014
1001
|
|
|
1015
1002
|
this.swapLogger.info(createdSwap, "REST: /payInvoice: created swap,"+
|
|
1016
1003
|
" amount: "+amountBD.toString(10)+
|
|
@@ -1047,7 +1034,7 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
1047
1034
|
typeof(val)==="string" &&
|
|
1048
1035
|
val.length===64 &&
|
|
1049
1036
|
HEX_REGEX.test(val) ? val: null,
|
|
1050
|
-
sequence: FieldTypeEnum.
|
|
1037
|
+
sequence: FieldTypeEnum.BigInt
|
|
1051
1038
|
});
|
|
1052
1039
|
if (parsedBody==null) throw {
|
|
1053
1040
|
code: 20100,
|
|
@@ -1062,14 +1049,14 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
1062
1049
|
if(isSwapFound) {
|
|
1063
1050
|
const {signer, swapContract} = this.getChain(data.chainIdentifier);
|
|
1064
1051
|
|
|
1065
|
-
if(swapContract.isExpired(signer.getAddress(), data.data)) throw {
|
|
1052
|
+
if(await swapContract.isExpired(signer.getAddress(), data.data)) throw {
|
|
1066
1053
|
_httpStatus: 200,
|
|
1067
1054
|
code: 20010,
|
|
1068
1055
|
msg: "Payment expired"
|
|
1069
1056
|
};
|
|
1070
1057
|
|
|
1071
1058
|
if(data.state===ToBtcLnSwapState.NON_PAYABLE) {
|
|
1072
|
-
const refundSigData = await swapContract.getRefundSignature(signer, data.data, this.config.
|
|
1059
|
+
const refundSigData = await swapContract.getRefundSignature(signer, data.data, this.config.refundAuthorizationTimeout);
|
|
1073
1060
|
|
|
1074
1061
|
//Double check the state after promise result
|
|
1075
1062
|
if (data.state !== ToBtcLnSwapState.NON_PAYABLE) throw {
|
|
@@ -1133,12 +1120,13 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
1133
1120
|
}
|
|
1134
1121
|
|
|
1135
1122
|
async init() {
|
|
1136
|
-
await this.
|
|
1123
|
+
await this.loadData(ToBtcLnSwapAbs);
|
|
1137
1124
|
//Check if all swaps contain a valid amount
|
|
1138
|
-
for(let swap of await this.storageManager.query([])) {
|
|
1139
|
-
if(swap.amount==null) {
|
|
1125
|
+
for(let {obj: swap} of await this.storageManager.query([])) {
|
|
1126
|
+
if(swap.amount==null || swap.lnPaymentHash==null) {
|
|
1140
1127
|
const parsedPR = await this.lightning.parsePaymentRequest(swap.pr);
|
|
1141
|
-
swap.amount = parsedPR.mtokens
|
|
1128
|
+
swap.amount = (parsedPR.mtokens + 999n) / 1000n;
|
|
1129
|
+
swap.lnPaymentHash = parsedPR.id;
|
|
1142
1130
|
}
|
|
1143
1131
|
}
|
|
1144
1132
|
this.subscribeToEvents();
|
|
@@ -1147,8 +1135,8 @@ export class ToBtcLnAbs extends ToBtcBaseSwapHandler<ToBtcLnSwapAbs, ToBtcLnSwap
|
|
|
1147
1135
|
|
|
1148
1136
|
getInfoData(): any {
|
|
1149
1137
|
return {
|
|
1150
|
-
minCltv: this.config.minSendCltv
|
|
1151
|
-
minTimestampCltv: this.config.minTsSendCltv
|
|
1138
|
+
minCltv: Number(this.config.minSendCltv),
|
|
1139
|
+
minTimestampCltv: Number(this.config.minTsSendCltv)
|
|
1152
1140
|
};
|
|
1153
1141
|
}
|
|
1154
1142
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import * as BN from "bn.js";
|
|
2
1
|
import {SwapData} from "@atomiqlabs/base";
|
|
3
2
|
import {SwapHandlerType} from "../..";
|
|
4
|
-
import {deserializeBN
|
|
3
|
+
import {deserializeBN} from "../../utils/Utils";
|
|
5
4
|
import {ToBtcBaseSwap} from "../ToBtcBaseSwap";
|
|
6
5
|
|
|
7
6
|
export enum ToBtcLnSwapState {
|
|
@@ -16,30 +15,34 @@ export enum ToBtcLnSwapState {
|
|
|
16
15
|
|
|
17
16
|
export class ToBtcLnSwapAbs<T extends SwapData = SwapData> extends ToBtcBaseSwap<T, ToBtcLnSwapState> {
|
|
18
17
|
|
|
18
|
+
lnPaymentHash: string;
|
|
19
19
|
readonly pr: string;
|
|
20
20
|
|
|
21
21
|
secret: string;
|
|
22
22
|
|
|
23
23
|
constructor(
|
|
24
24
|
chainIdentifier: string,
|
|
25
|
+
lnPaymentHash: string,
|
|
25
26
|
pr: string,
|
|
26
|
-
amountMtokens:
|
|
27
|
-
swapFee:
|
|
28
|
-
swapFeeInToken:
|
|
29
|
-
quotedNetworkFee:
|
|
30
|
-
quotedNetworkFeeInToken:
|
|
27
|
+
amountMtokens: bigint,
|
|
28
|
+
swapFee: bigint,
|
|
29
|
+
swapFeeInToken: bigint,
|
|
30
|
+
quotedNetworkFee: bigint,
|
|
31
|
+
quotedNetworkFeeInToken: bigint,
|
|
31
32
|
);
|
|
32
33
|
constructor(obj: any);
|
|
33
34
|
|
|
34
|
-
constructor(chainIdOrObj: string | any, pr?: string, amount?:
|
|
35
|
+
constructor(chainIdOrObj: string | any, lnPaymentHash?: string, pr?: string, amount?: bigint, swapFee?: bigint, swapFeeInToken?: bigint, quotedNetworkFee?: bigint, quotedNetworkFeeInToken?: bigint) {
|
|
35
36
|
if(typeof(chainIdOrObj)==="string") {
|
|
36
|
-
super(chainIdOrObj, amount
|
|
37
|
+
super(chainIdOrObj, (amount + 999n) / 1000n, swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken);
|
|
37
38
|
this.state = ToBtcLnSwapState.SAVED;
|
|
39
|
+
this.lnPaymentHash = lnPaymentHash;
|
|
38
40
|
this.pr = pr;
|
|
39
41
|
} else {
|
|
40
42
|
super(chainIdOrObj);
|
|
41
43
|
this.pr = chainIdOrObj.pr;
|
|
42
44
|
this.secret = chainIdOrObj.secret;
|
|
45
|
+
this.lnPaymentHash = chainIdOrObj.lnPaymentHash;
|
|
43
46
|
|
|
44
47
|
//Compatibility with older versions
|
|
45
48
|
this.quotedNetworkFee ??= deserializeBN(chainIdOrObj.maxFee);
|
|
@@ -48,9 +51,14 @@ export class ToBtcLnSwapAbs<T extends SwapData = SwapData> extends ToBtcBaseSwap
|
|
|
48
51
|
this.type = SwapHandlerType.TO_BTCLN;
|
|
49
52
|
}
|
|
50
53
|
|
|
54
|
+
getIdentifierHash(): string {
|
|
55
|
+
return this.lnPaymentHash;
|
|
56
|
+
}
|
|
57
|
+
|
|
51
58
|
serialize(): any {
|
|
52
59
|
const partialSerialized = super.serialize();
|
|
53
60
|
partialSerialized.pr = this.pr;
|
|
61
|
+
partialSerialized.lnPaymentHash = this.lnPaymentHash;
|
|
54
62
|
partialSerialized.secret = this.secret;
|
|
55
63
|
return partialSerialized;
|
|
56
64
|
}
|