@atomiqlabs/lp-lib 10.3.11 → 11.0.1
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/index.d.ts +3 -1
- package/dist/index.js +3 -4
- package/dist/plugins/IPlugin.d.ts +3 -2
- package/dist/plugins/PluginManager.d.ts +3 -2
- package/dist/plugins/PluginManager.js +2 -2
- package/dist/prices/OKXSwapPrice.d.ts +27 -0
- package/dist/prices/OKXSwapPrice.js +106 -0
- package/dist/swaps/FromBtcBaseSwap.d.ts +5 -1
- package/dist/swaps/FromBtcBaseSwap.js +20 -0
- package/dist/swaps/FromBtcBaseSwapHandler.d.ts +1 -0
- package/dist/swaps/FromBtcBaseSwapHandler.js +1 -1
- package/dist/swaps/FromBtcLnBaseSwapHandler.d.ts +8 -6
- package/dist/swaps/FromBtcLnBaseSwapHandler.js +7 -5
- package/dist/swaps/SwapHandler.d.ts +1 -4
- package/dist/swaps/SwapHandler.js +1 -2
- package/dist/swaps/SwapHandlerSwap.d.ts +4 -0
- package/dist/swaps/SwapHandlerSwap.js +9 -1
- package/dist/swaps/ToBtcBaseSwap.d.ts +3 -1
- package/dist/swaps/ToBtcBaseSwap.js +8 -2
- package/dist/swaps/ToBtcBaseSwapHandler.d.ts +1 -0
- package/dist/swaps/ToBtcBaseSwapHandler.js +1 -1
- package/dist/swaps/frombtc_abstract/FromBtcAbs.d.ts +3 -5
- package/dist/swaps/frombtc_abstract/FromBtcAbs.js +18 -25
- package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.d.ts +1 -4
- package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.js +3 -16
- package/dist/swaps/frombtc_trusted/FromBtcTrusted.d.ts +6 -9
- package/dist/swaps/frombtc_trusted/FromBtcTrusted.js +238 -137
- package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.d.ts +9 -6
- package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.js +15 -10
- package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.d.ts +2 -2
- package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.js +42 -62
- package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.d.ts +1 -6
- package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.js +2 -14
- package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.d.ts +3 -5
- package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.js +90 -87
- package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.d.ts +1 -2
- package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.js +5 -8
- package/dist/swaps/tobtc_abstract/ToBtcAbs.d.ts +5 -125
- package/dist/swaps/tobtc_abstract/ToBtcAbs.js +41 -334
- package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.d.ts +1 -4
- package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.js +2 -11
- package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.d.ts +5 -55
- package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.js +152 -398
- package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.d.ts +1 -6
- package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.js +2 -15
- package/dist/utils/Utils.d.ts +0 -10
- package/dist/utils/Utils.js +1 -34
- package/dist/wallets/IBitcoinWallet.d.ts +62 -0
- package/dist/wallets/IBitcoinWallet.js +2 -0
- package/dist/wallets/ILightningWallet.d.ts +118 -0
- package/dist/wallets/ILightningWallet.js +37 -0
- package/package.json +4 -9
- package/src/index.ts +4 -5
- package/src/plugins/IPlugin.ts +4 -2
- package/src/plugins/PluginManager.ts +6 -3
- package/src/prices/OKXSwapPrice.ts +114 -0
- package/src/swaps/FromBtcBaseSwap.ts +24 -1
- package/src/swaps/FromBtcBaseSwapHandler.ts +6 -2
- package/src/swaps/FromBtcLnBaseSwapHandler.ts +22 -6
- package/src/swaps/SwapHandler.ts +1 -8
- package/src/swaps/SwapHandlerSwap.ts +14 -1
- package/src/swaps/ToBtcBaseSwap.ts +12 -3
- package/src/swaps/ToBtcBaseSwapHandler.ts +6 -2
- package/src/swaps/frombtc_abstract/FromBtcAbs.ts +24 -28
- package/src/swaps/frombtc_abstract/FromBtcSwapAbs.ts +3 -18
- package/src/swaps/frombtc_trusted/FromBtcTrusted.ts +260 -159
- package/src/swaps/frombtc_trusted/FromBtcTrustedSwap.ts +22 -15
- package/src/swaps/frombtcln_abstract/FromBtcLnAbs.ts +69 -79
- package/src/swaps/frombtcln_abstract/FromBtcLnSwapAbs.ts +3 -20
- package/src/swaps/frombtcln_trusted/FromBtcLnTrusted.ts +108 -103
- package/src/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.ts +6 -9
- package/src/swaps/tobtc_abstract/ToBtcAbs.ts +52 -410
- package/src/swaps/tobtc_abstract/ToBtcSwapAbs.ts +3 -18
- package/src/swaps/tobtcln_abstract/ToBtcLnAbs.ts +157 -434
- package/src/swaps/tobtcln_abstract/ToBtcLnSwapAbs.ts +3 -20
- package/src/utils/Utils.ts +0 -31
- package/src/wallets/IBitcoinWallet.ts +66 -0
- package/src/wallets/ILightningWallet.ts +179 -0
- package/dist/fees/OneDollarFeeEstimator.d.ts +0 -16
- package/dist/fees/OneDollarFeeEstimator.js +0 -71
- package/dist/utils/coinselect2/accumulative.d.ts +0 -6
- package/dist/utils/coinselect2/accumulative.js +0 -44
- package/dist/utils/coinselect2/blackjack.d.ts +0 -6
- package/dist/utils/coinselect2/blackjack.js +0 -41
- package/dist/utils/coinselect2/index.d.ts +0 -16
- package/dist/utils/coinselect2/index.js +0 -40
- package/dist/utils/coinselect2/utils.d.ts +0 -64
- package/dist/utils/coinselect2/utils.js +0 -121
- package/src/fees/OneDollarFeeEstimator.ts +0 -95
- package/src/utils/coinselect2/accumulative.js +0 -32
- package/src/utils/coinselect2/accumulative.ts +0 -58
- package/src/utils/coinselect2/blackjack.js +0 -29
- package/src/utils/coinselect2/blackjack.ts +0 -54
- package/src/utils/coinselect2/index.js +0 -16
- package/src/utils/coinselect2/index.ts +0 -50
- package/src/utils/coinselect2/utils.js +0 -110
- package/src/utils/coinselect2/utils.ts +0 -183
|
@@ -2,11 +2,27 @@ import {SwapHandlerSwap} from "./SwapHandlerSwap";
|
|
|
2
2
|
import {SwapData} from "@atomiqlabs/base";
|
|
3
3
|
import {FromBtcBaseSwapHandler} from "./FromBtcBaseSwapHandler";
|
|
4
4
|
import * as BN from "bn.js";
|
|
5
|
-
import
|
|
5
|
+
import {ILightningWallet, LightningNetworkChannel} from "../wallets/ILightningWallet";
|
|
6
|
+
import {IIntermediaryStorage} from "../storage/IIntermediaryStorage";
|
|
7
|
+
import {MultichainData} from "./SwapHandler";
|
|
8
|
+
import {ISwapPrice} from "./ISwapPrice";
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
export abstract class FromBtcLnBaseSwapHandler<V extends SwapHandlerSwap<SwapData, S>, S> extends FromBtcBaseSwapHandler<V, S> {
|
|
9
12
|
|
|
13
|
+
readonly lightning: ILightningWallet;
|
|
14
|
+
|
|
15
|
+
constructor(
|
|
16
|
+
storageDirectory: IIntermediaryStorage<V>,
|
|
17
|
+
path: string,
|
|
18
|
+
chains: MultichainData,
|
|
19
|
+
lightning: ILightningWallet,
|
|
20
|
+
swapPricing: ISwapPrice
|
|
21
|
+
) {
|
|
22
|
+
super(storageDirectory, path, chains, swapPricing);
|
|
23
|
+
this.lightning = lightning;
|
|
24
|
+
}
|
|
25
|
+
|
|
10
26
|
/**
|
|
11
27
|
* Checks if we have enough inbound liquidity to be able to receive an LN payment (without MPP)
|
|
12
28
|
*
|
|
@@ -15,14 +31,14 @@ export abstract class FromBtcLnBaseSwapHandler<V extends SwapHandlerSwap<SwapDat
|
|
|
15
31
|
* @param signal
|
|
16
32
|
* @throws {DefinedRuntimeError} will throw an error if there isn't enough inbound liquidity to receive the LN payment
|
|
17
33
|
*/
|
|
18
|
-
protected async checkInboundLiquidity(amountBD: BN, channelsPrefetch: Promise<
|
|
34
|
+
protected async checkInboundLiquidity(amountBD: BN, channelsPrefetch: Promise<LightningNetworkChannel[]>, signal: AbortSignal) {
|
|
19
35
|
const channelsResponse = await channelsPrefetch;
|
|
20
36
|
|
|
21
37
|
signal.throwIfAborted();
|
|
22
38
|
|
|
23
39
|
let hasEnoughInboundLiquidity = false;
|
|
24
|
-
channelsResponse.
|
|
25
|
-
if(
|
|
40
|
+
channelsResponse.forEach(channel => {
|
|
41
|
+
if(channel.remoteBalance.gte(amountBD)) hasEnoughInboundLiquidity = true;
|
|
26
42
|
});
|
|
27
43
|
if(!hasEnoughInboundLiquidity) {
|
|
28
44
|
throw {
|
|
@@ -37,8 +53,8 @@ export abstract class FromBtcLnBaseSwapHandler<V extends SwapHandlerSwap<SwapDat
|
|
|
37
53
|
*
|
|
38
54
|
* @param abortController
|
|
39
55
|
*/
|
|
40
|
-
protected getChannelsPrefetch(abortController: AbortController): Promise<
|
|
41
|
-
return
|
|
56
|
+
protected getChannelsPrefetch(abortController: AbortController): Promise<LightningNetworkChannel[]> {
|
|
57
|
+
return this.lightning.getChannels(true).catch(e => {
|
|
42
58
|
this.logger.error("getChannelsPrefetch(): error", e);
|
|
43
59
|
abortController.abort(e);
|
|
44
60
|
return null;
|
package/src/swaps/SwapHandler.ts
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import {Express, Request
|
|
1
|
+
import {Express, Request} from "express";
|
|
2
2
|
import {ISwapPrice} from "./ISwapPrice";
|
|
3
3
|
import {
|
|
4
|
-
AbstractSigner,
|
|
5
4
|
ChainType,
|
|
6
5
|
ClaimEvent,
|
|
7
6
|
InitializeEvent, RefundEvent,
|
|
8
|
-
SwapContract,
|
|
9
7
|
SwapData,
|
|
10
8
|
SwapEvent
|
|
11
9
|
} from "@atomiqlabs/base";
|
|
12
|
-
import {AuthenticatedLnd} from "lightning";
|
|
13
10
|
import {SwapHandlerSwap} from "./SwapHandlerSwap";
|
|
14
11
|
import {PluginManager} from "../plugins/PluginManager";
|
|
15
12
|
import {IIntermediaryStorage} from "../storage/IIntermediaryStorage";
|
|
@@ -48,7 +45,6 @@ export type SwapBaseConfig = {
|
|
|
48
45
|
feePPM: BN,
|
|
49
46
|
max: BN,
|
|
50
47
|
min: BN,
|
|
51
|
-
maxSkew: number,
|
|
52
48
|
safetyFactor: BN,
|
|
53
49
|
swapCheckInterval: number
|
|
54
50
|
};
|
|
@@ -88,7 +84,6 @@ export abstract class SwapHandler<V extends SwapHandlerSwap<SwapData, S> = SwapH
|
|
|
88
84
|
readonly chains: MultichainData;
|
|
89
85
|
readonly allowedTokens: {[chainId: string]: Set<string>};
|
|
90
86
|
readonly swapPricing: ISwapPrice;
|
|
91
|
-
readonly LND: AuthenticatedLnd;
|
|
92
87
|
|
|
93
88
|
abstract config: SwapBaseConfig;
|
|
94
89
|
|
|
@@ -110,14 +105,12 @@ export abstract class SwapHandler<V extends SwapHandlerSwap<SwapData, S> = SwapH
|
|
|
110
105
|
storageDirectory: IIntermediaryStorage<V>,
|
|
111
106
|
path: string,
|
|
112
107
|
chainsData: MultichainData,
|
|
113
|
-
lnd: AuthenticatedLnd,
|
|
114
108
|
swapPricing: ISwapPrice
|
|
115
109
|
) {
|
|
116
110
|
this.storageManager = storageDirectory;
|
|
117
111
|
this.chains = chainsData;
|
|
118
112
|
if(this.chains.chains[this.chains.default]==null) throw new Error("Invalid default chain specified");
|
|
119
113
|
this.path = path;
|
|
120
|
-
this.LND = lnd;
|
|
121
114
|
this.swapPricing = swapPricing;
|
|
122
115
|
this.allowedTokens = {};
|
|
123
116
|
for(let chainId in chainsData.chains) {
|
|
@@ -24,6 +24,11 @@ export abstract class SwapHandlerSwap<T extends SwapData = SwapData, S = any> ex
|
|
|
24
24
|
readonly swapFee: BN;
|
|
25
25
|
readonly swapFeeInToken: BN;
|
|
26
26
|
|
|
27
|
+
prefix: string;
|
|
28
|
+
timeout: string;
|
|
29
|
+
signature: string;
|
|
30
|
+
feeRate: string;
|
|
31
|
+
|
|
27
32
|
protected constructor(chainIdentifier: string, swapFee: BN, swapFeeInToken: BN);
|
|
28
33
|
protected constructor(obj: any);
|
|
29
34
|
|
|
@@ -42,6 +47,10 @@ export abstract class SwapHandlerSwap<T extends SwapData = SwapData, S = any> ex
|
|
|
42
47
|
this.state = obj.state;
|
|
43
48
|
this.swapFee = deserializeBN(obj.swapFee);
|
|
44
49
|
this.swapFeeInToken = deserializeBN(obj.swapFeeInToken);
|
|
50
|
+
this.prefix = obj.prefix;
|
|
51
|
+
this.timeout = obj.timeout;
|
|
52
|
+
this.signature = obj.signature;
|
|
53
|
+
this.feeRate = obj.feeRate;
|
|
45
54
|
}
|
|
46
55
|
}
|
|
47
56
|
|
|
@@ -53,7 +62,11 @@ export abstract class SwapHandlerSwap<T extends SwapData = SwapData, S = any> ex
|
|
|
53
62
|
metadata: this.metadata,
|
|
54
63
|
txIds: this.txIds,
|
|
55
64
|
swapFee: serializeBN(this.swapFee),
|
|
56
|
-
swapFeeInToken: serializeBN(this.swapFeeInToken)
|
|
65
|
+
swapFeeInToken: serializeBN(this.swapFeeInToken),
|
|
66
|
+
prefix: this.prefix,
|
|
67
|
+
timeout: this.timeout,
|
|
68
|
+
signature: this.signature,
|
|
69
|
+
feeRate: this.feeRate
|
|
57
70
|
}
|
|
58
71
|
}
|
|
59
72
|
|
|
@@ -6,22 +6,26 @@ import {deserializeBN, serializeBN} from "../utils/Utils";
|
|
|
6
6
|
|
|
7
7
|
export abstract class ToBtcBaseSwap<T extends SwapData = SwapData, S = any> extends SwapHandlerSwap<T, S> {
|
|
8
8
|
|
|
9
|
+
amount: BN;
|
|
10
|
+
|
|
9
11
|
quotedNetworkFee: BN;
|
|
10
12
|
readonly quotedNetworkFeeInToken: BN;
|
|
11
13
|
realNetworkFee: BN;
|
|
12
14
|
realNetworkFeeInToken: BN;
|
|
13
15
|
|
|
14
|
-
protected constructor(chainIdentifier: string, swapFee: BN, swapFeeInToken: BN, quotedNetworkFee: BN, quotedNetworkFeeInToken: BN);
|
|
16
|
+
protected constructor(chainIdentifier: string, amount: BN, swapFee: BN, swapFeeInToken: BN, quotedNetworkFee: BN, quotedNetworkFeeInToken: BN);
|
|
15
17
|
protected constructor(obj: any);
|
|
16
18
|
|
|
17
|
-
protected constructor(obj?: any | string, swapFee?: BN, swapFeeInToken?: BN, quotedNetworkFee?: BN, quotedNetworkFeeInToken?: BN) {
|
|
18
|
-
if(typeof(obj)==="string" && BN.isBN(swapFee) && BN.isBN(swapFeeInToken) && BN.isBN(quotedNetworkFee) && BN.isBN(quotedNetworkFeeInToken)) {
|
|
19
|
+
protected constructor(obj?: any | string, amount?: BN, swapFee?: BN, swapFeeInToken?: BN, quotedNetworkFee?: BN, quotedNetworkFeeInToken?: BN) {
|
|
20
|
+
if(typeof(obj)==="string" && BN.isBN(amount) && BN.isBN(swapFee) && BN.isBN(swapFeeInToken) && BN.isBN(quotedNetworkFee) && BN.isBN(quotedNetworkFeeInToken)) {
|
|
19
21
|
super(obj, swapFee, swapFeeInToken);
|
|
22
|
+
this.amount = amount;
|
|
20
23
|
this.quotedNetworkFee = quotedNetworkFee;
|
|
21
24
|
this.quotedNetworkFeeInToken = quotedNetworkFeeInToken;
|
|
22
25
|
return;
|
|
23
26
|
} else {
|
|
24
27
|
super(obj);
|
|
28
|
+
this.amount = deserializeBN(obj.amount);
|
|
25
29
|
this.quotedNetworkFee = deserializeBN(obj.quotedNetworkFee);
|
|
26
30
|
this.quotedNetworkFeeInToken = deserializeBN(obj.quotedNetworkFeeInToken);
|
|
27
31
|
this.realNetworkFee = deserializeBN(obj.realNetworkFee);
|
|
@@ -31,6 +35,7 @@ export abstract class ToBtcBaseSwap<T extends SwapData = SwapData, S = any> exte
|
|
|
31
35
|
|
|
32
36
|
serialize(): any {
|
|
33
37
|
const obj = super.serialize();
|
|
38
|
+
obj.amount = serializeBN(this.amount);
|
|
34
39
|
obj.quotedNetworkFee = serializeBN(this.quotedNetworkFee);
|
|
35
40
|
obj.quotedNetworkFeeInToken = serializeBN(this.quotedNetworkFeeInToken);
|
|
36
41
|
obj.realNetworkFee = serializeBN(this.realNetworkFee);
|
|
@@ -73,4 +78,8 @@ export abstract class ToBtcBaseSwap<T extends SwapData = SwapData, S = any> exte
|
|
|
73
78
|
return {inInputToken: this.realNetworkFeeInToken, inOutputToken: this.realNetworkFee};
|
|
74
79
|
}
|
|
75
80
|
|
|
81
|
+
getOutputAmount(): BN {
|
|
82
|
+
return this.amount;
|
|
83
|
+
}
|
|
84
|
+
|
|
76
85
|
}
|
|
@@ -280,7 +280,8 @@ export abstract class ToBtcBaseSwapHandler<V extends SwapHandlerSwap<SwapData, S
|
|
|
280
280
|
): Promise<{
|
|
281
281
|
prefix: string,
|
|
282
282
|
timeout: string,
|
|
283
|
-
signature: string
|
|
283
|
+
signature: string,
|
|
284
|
+
feeRate: string
|
|
284
285
|
}> {
|
|
285
286
|
const prefetchedSignData = signDataPrefetchPromise!=null ? await signDataPrefetchPromise : null;
|
|
286
287
|
if(prefetchedSignData!=null) this.logger.debug("getToBtcSignatureData(): pre-fetched signature data: ", prefetchedSignData);
|
|
@@ -303,7 +304,10 @@ export abstract class ToBtcBaseSwapHandler<V extends SwapHandlerSwap<SwapData, S
|
|
|
303
304
|
);
|
|
304
305
|
abortSignal.throwIfAborted();
|
|
305
306
|
|
|
306
|
-
return
|
|
307
|
+
return {
|
|
308
|
+
...sigData,
|
|
309
|
+
feeRate
|
|
310
|
+
};
|
|
307
311
|
}
|
|
308
312
|
|
|
309
313
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as BN from "bn.js";
|
|
2
|
-
import * as lncli from "ln-service";
|
|
3
2
|
import {Express, Request, Response} from "express";
|
|
4
3
|
import {FromBtcSwapAbs, FromBtcSwapState} from "./FromBtcSwapAbs";
|
|
5
4
|
import {MultichainData, SwapHandlerType} from "../SwapHandler";
|
|
@@ -11,8 +10,6 @@ import {
|
|
|
11
10
|
RefundEvent,
|
|
12
11
|
SwapData
|
|
13
12
|
} from "@atomiqlabs/base";
|
|
14
|
-
import {AuthenticatedLnd} from "lightning";
|
|
15
|
-
import * as bitcoin from "bitcoinjs-lib";
|
|
16
13
|
import {createHash} from "crypto";
|
|
17
14
|
import {expressHandlerWrapper} from "../../utils/Utils";
|
|
18
15
|
import {PluginManager} from "../../plugins/PluginManager";
|
|
@@ -22,9 +19,9 @@ import {serverParamDecoder} from "../../utils/paramcoders/server/ServerParamDeco
|
|
|
22
19
|
import {IParamReader} from "../../utils/paramcoders/IParamReader";
|
|
23
20
|
import {ServerParamEncoder} from "../../utils/paramcoders/server/ServerParamEncoder";
|
|
24
21
|
import {FromBtcBaseConfig, FromBtcBaseSwapHandler} from "../FromBtcBaseSwapHandler";
|
|
22
|
+
import {IBitcoinWallet} from "../../wallets/IBitcoinWallet";
|
|
25
23
|
|
|
26
24
|
export type FromBtcConfig = FromBtcBaseConfig & {
|
|
27
|
-
bitcoinNetwork: bitcoin.networks.Network
|
|
28
25
|
confirmations: number,
|
|
29
26
|
swapCsvDelta: number
|
|
30
27
|
};
|
|
@@ -46,18 +43,22 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
46
43
|
|
|
47
44
|
readonly config: FromBtcConfig & {swapTsCsvDelta: BN};
|
|
48
45
|
|
|
46
|
+
readonly bitcoin: IBitcoinWallet;
|
|
47
|
+
|
|
49
48
|
constructor(
|
|
50
49
|
storageDirectory: IIntermediaryStorage<FromBtcSwapAbs>,
|
|
51
50
|
path: string,
|
|
52
51
|
chains: MultichainData,
|
|
53
|
-
|
|
52
|
+
bitcoin: IBitcoinWallet,
|
|
54
53
|
swapPricing: ISwapPrice,
|
|
55
54
|
config: FromBtcConfig
|
|
56
55
|
) {
|
|
57
|
-
super(storageDirectory, path, chains,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
super(storageDirectory, path, chains, swapPricing);
|
|
57
|
+
this.bitcoin = bitcoin;
|
|
58
|
+
this.config = {
|
|
59
|
+
...config,
|
|
60
|
+
swapTsCsvDelta: new BN(config.swapCsvDelta).mul(config.bitcoinBlocktime.div(config.safetyFactor))
|
|
61
|
+
};
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
/**
|
|
@@ -65,10 +66,9 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
65
66
|
*
|
|
66
67
|
* @param address
|
|
67
68
|
* @param amount
|
|
68
|
-
* @param bitcoinNetwork
|
|
69
69
|
*/
|
|
70
|
-
private getTxoHash(address: string, amount: BN
|
|
71
|
-
const parsedOutputScript = bitcoin.
|
|
70
|
+
private getTxoHash(address: string, amount: BN): Buffer {
|
|
71
|
+
const parsedOutputScript = this.bitcoin.toOutputScript(address);
|
|
72
72
|
|
|
73
73
|
return createHash("sha256").update(Buffer.concat([
|
|
74
74
|
Buffer.from(amount.toArray("le", 8)),
|
|
@@ -84,7 +84,7 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
84
84
|
* @param amount
|
|
85
85
|
*/
|
|
86
86
|
private getHash(chainIdentifier: string, address: string, amount: BN): Buffer {
|
|
87
|
-
const parsedOutputScript = bitcoin.
|
|
87
|
+
const parsedOutputScript = this.bitcoin.toOutputScript(address);
|
|
88
88
|
const {swapContract} = this.getChain(chainIdentifier);
|
|
89
89
|
return swapContract.getHashForOnchain(parsedOutputScript, amount, new BN(0));
|
|
90
90
|
}
|
|
@@ -97,15 +97,11 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
97
97
|
* @returns true if the swap should be refunded, false if nothing should be done
|
|
98
98
|
*/
|
|
99
99
|
protected async processPastSwap(swap: FromBtcSwapAbs): Promise<boolean> {
|
|
100
|
-
|
|
101
|
-
const currentTime = new BN(Math.floor(Date.now()/1000)-this.config.maxSkew);
|
|
102
|
-
|
|
103
|
-
const {swapContract} = this.getChain(swap.chainIdentifier);
|
|
100
|
+
const {swapContract, signer} = this.getChain(swap.chainIdentifier);
|
|
104
101
|
|
|
105
102
|
//Once authorization expires in CREATED state, the user can no more commit it on-chain
|
|
106
103
|
if(swap.state===FromBtcSwapState.CREATED) {
|
|
107
|
-
|
|
108
|
-
if(!isExpired) return false;
|
|
104
|
+
if(!await swapContract.isInitAuthorizationExpired(swap.data, swap)) return false;
|
|
109
105
|
|
|
110
106
|
const isCommited = await swapContract.isCommited(swap.data);
|
|
111
107
|
if(isCommited) {
|
|
@@ -116,15 +112,14 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
116
112
|
}
|
|
117
113
|
|
|
118
114
|
this.swapLogger.info(swap, "processPastSwap(state=CREATED): removing past swap due to authorization expiry, address: "+swap.address);
|
|
115
|
+
await this.bitcoin.addUnusedAddress(swap.address);
|
|
119
116
|
await this.removeSwapData(swap, FromBtcSwapState.CANCELED);
|
|
120
117
|
return false;
|
|
121
118
|
}
|
|
122
119
|
|
|
123
|
-
const expiryTime = swap.data.getExpiry();
|
|
124
120
|
//Check if commited swap expired by now
|
|
125
121
|
if(swap.state===FromBtcSwapState.COMMITED) {
|
|
126
|
-
|
|
127
|
-
if(!isExpired) return false;
|
|
122
|
+
if(!swapContract.isExpired(signer.getAddress(), swap.data)) return false;
|
|
128
123
|
|
|
129
124
|
const isCommited = await swapContract.isCommited(swap.data);
|
|
130
125
|
if(isCommited) {
|
|
@@ -233,6 +228,7 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
233
228
|
savedSwap.txIds.refund = (event as any).meta?.txId;
|
|
234
229
|
|
|
235
230
|
this.swapLogger.info(event, "SC: RefundEvent: swap refunded, address: "+savedSwap.address);
|
|
231
|
+
await this.bitcoin.addUnusedAddress(savedSwap.address);
|
|
236
232
|
await this.removeSwapData(savedSwap, FromBtcSwapState.REFUNDED);
|
|
237
233
|
}
|
|
238
234
|
|
|
@@ -383,10 +379,7 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
383
379
|
metadata.times.balanceChecked = Date.now();
|
|
384
380
|
|
|
385
381
|
//Create swap receive bitcoin address
|
|
386
|
-
const
|
|
387
|
-
lnd: this.LND,
|
|
388
|
-
format: "p2wpkh"
|
|
389
|
-
});
|
|
382
|
+
const receiveAddress = await this.bitcoin.getAddress();
|
|
390
383
|
abortController.signal.throwIfAborted();
|
|
391
384
|
metadata.times.addressCreated = Date.now();
|
|
392
385
|
|
|
@@ -424,7 +417,7 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
424
417
|
totalSecurityDeposit,
|
|
425
418
|
totalClaimerBounty
|
|
426
419
|
);
|
|
427
|
-
data.setTxoHash(this.getTxoHash(receiveAddress, amountBD
|
|
420
|
+
data.setTxoHash(this.getTxoHash(receiveAddress, amountBD).toString("hex"));
|
|
428
421
|
abortController.signal.throwIfAborted();
|
|
429
422
|
metadata.times.swapCreated = Date.now();
|
|
430
423
|
|
|
@@ -435,7 +428,10 @@ export class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, FromBtcSw
|
|
|
435
428
|
const createdSwap: FromBtcSwapAbs = new FromBtcSwapAbs(chainIdentifier, receiveAddress, amountBD, swapFee, swapFeeInToken);
|
|
436
429
|
createdSwap.data = data;
|
|
437
430
|
createdSwap.metadata = metadata;
|
|
438
|
-
createdSwap.
|
|
431
|
+
createdSwap.prefix = sigData.prefix;
|
|
432
|
+
createdSwap.timeout = sigData.timeout;
|
|
433
|
+
createdSwap.signature = sigData.signature;
|
|
434
|
+
createdSwap.feeRate = sigData.feeRate;
|
|
439
435
|
|
|
440
436
|
await PluginManager.swapCreate(createdSwap);
|
|
441
437
|
await this.storageManager.saveData(createdSwap.data.getHash(), createdSwap.data.getSequence(), createdSwap);
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import * as BN from "bn.js";
|
|
2
|
-
import * as bitcoin from "bitcoinjs-lib";
|
|
3
|
-
import {createHash} from "crypto";
|
|
4
2
|
import {SwapData} from "@atomiqlabs/base";
|
|
5
3
|
import {SwapHandlerType} from "../SwapHandler";
|
|
6
|
-
import {deserializeBN, serializeBN} from "../../utils/Utils";
|
|
7
4
|
import {FromBtcBaseSwap} from "../FromBtcBaseSwap";
|
|
8
5
|
|
|
9
6
|
export enum FromBtcSwapState {
|
|
@@ -17,8 +14,6 @@ export enum FromBtcSwapState {
|
|
|
17
14
|
export class FromBtcSwapAbs<T extends SwapData = SwapData> extends FromBtcBaseSwap<T, FromBtcSwapState> {
|
|
18
15
|
|
|
19
16
|
readonly address: string;
|
|
20
|
-
readonly amount: BN;
|
|
21
|
-
authorizationExpiry: BN;
|
|
22
17
|
txId: string;
|
|
23
18
|
|
|
24
19
|
constructor(chainIdentifier: string, address: string, amount: BN, swapFee: BN, swapFeeInToken: BN);
|
|
@@ -26,15 +21,12 @@ export class FromBtcSwapAbs<T extends SwapData = SwapData> extends FromBtcBaseSw
|
|
|
26
21
|
|
|
27
22
|
constructor(prOrObj: string | any, address?: string, amount?: BN, swapFee?: BN, swapFeeInToken?: BN) {
|
|
28
23
|
if(typeof(prOrObj)==="string") {
|
|
29
|
-
super(prOrObj, swapFee, swapFeeInToken);
|
|
24
|
+
super(prOrObj, amount, swapFee, swapFeeInToken);
|
|
30
25
|
this.state = FromBtcSwapState.CREATED;
|
|
31
26
|
this.address = address;
|
|
32
|
-
this.amount = amount;
|
|
33
27
|
} else {
|
|
34
28
|
super(prOrObj);
|
|
35
29
|
this.address = prOrObj.address;
|
|
36
|
-
this.amount = new BN(prOrObj.amount);
|
|
37
|
-
this.authorizationExpiry = deserializeBN(prOrObj.authorizationExpiry);
|
|
38
30
|
this.txId = prOrObj.txId;
|
|
39
31
|
}
|
|
40
32
|
this.type = SwapHandlerType.FROM_BTC;
|
|
@@ -43,19 +35,12 @@ export class FromBtcSwapAbs<T extends SwapData = SwapData> extends FromBtcBaseSw
|
|
|
43
35
|
serialize(): any {
|
|
44
36
|
const partialSerialized = super.serialize();
|
|
45
37
|
partialSerialized.address = this.address;
|
|
46
|
-
partialSerialized.amount = this.amount.toString(10);
|
|
47
|
-
partialSerialized.authorizationExpiry = serializeBN(this.authorizationExpiry);
|
|
48
38
|
partialSerialized.txId = this.txId;
|
|
49
39
|
return partialSerialized;
|
|
50
40
|
}
|
|
51
41
|
|
|
52
|
-
getTxoHash(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return createHash("sha256").update(Buffer.concat([
|
|
56
|
-
Buffer.from(this.amount.toArray("le", 8)),
|
|
57
|
-
parsedOutputScript
|
|
58
|
-
])).digest();
|
|
42
|
+
getTxoHash(): Buffer {
|
|
43
|
+
return Buffer.from(this.data.getTxoHash(), "hex");
|
|
59
44
|
}
|
|
60
45
|
|
|
61
46
|
isInitiated(): boolean {
|