@atomiqlabs/lp-lib 10.3.11 → 11.0.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/index.d.ts +2 -1
- package/dist/index.js +2 -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/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 +64 -80
- 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 +3 -5
- package/src/plugins/IPlugin.ts +4 -2
- package/src/plugins/PluginManager.ts +6 -3
- 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 +80 -97
- 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
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import * as BN from "bn.js";
|
|
3
2
|
import { SwapData } from "@atomiqlabs/base";
|
|
4
3
|
import { ToBtcBaseSwap } from "../ToBtcBaseSwap";
|
|
@@ -13,15 +12,11 @@ export declare enum ToBtcLnSwapState {
|
|
|
13
12
|
}
|
|
14
13
|
export declare class ToBtcLnSwapAbs<T extends SwapData = SwapData> extends ToBtcBaseSwap<T, ToBtcLnSwapState> {
|
|
15
14
|
readonly pr: string;
|
|
16
|
-
readonly signatureExpiry: BN;
|
|
17
15
|
secret: string;
|
|
18
|
-
constructor(chainIdentifier: string, pr: string,
|
|
16
|
+
constructor(chainIdentifier: string, pr: string, amountMtokens: BN, swapFee: BN, swapFeeInToken: BN, quotedNetworkFee: BN, quotedNetworkFeeInToken: BN);
|
|
19
17
|
constructor(obj: any);
|
|
20
18
|
serialize(): any;
|
|
21
|
-
getHash(): string;
|
|
22
|
-
getHashBuffer(): Buffer;
|
|
23
19
|
isInitiated(): boolean;
|
|
24
20
|
isFailed(): boolean;
|
|
25
21
|
isSuccess(): boolean;
|
|
26
|
-
getOutputAmount(): BN;
|
|
27
22
|
}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ToBtcLnSwapAbs = exports.ToBtcLnSwapState = void 0;
|
|
4
4
|
const BN = require("bn.js");
|
|
5
|
-
const bolt11 = require("@atomiqlabs/bolt11");
|
|
6
5
|
const __1 = require("../..");
|
|
7
6
|
const Utils_1 = require("../../utils/Utils");
|
|
8
7
|
const ToBtcBaseSwap_1 = require("../ToBtcBaseSwap");
|
|
@@ -17,18 +16,16 @@ var ToBtcLnSwapState;
|
|
|
17
16
|
ToBtcLnSwapState[ToBtcLnSwapState["CLAIMED"] = 3] = "CLAIMED";
|
|
18
17
|
})(ToBtcLnSwapState = exports.ToBtcLnSwapState || (exports.ToBtcLnSwapState = {}));
|
|
19
18
|
class ToBtcLnSwapAbs extends ToBtcBaseSwap_1.ToBtcBaseSwap {
|
|
20
|
-
constructor(chainIdOrObj, pr, swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken
|
|
19
|
+
constructor(chainIdOrObj, pr, amount, swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken) {
|
|
21
20
|
var _a, _b;
|
|
22
21
|
if (typeof (chainIdOrObj) === "string") {
|
|
23
|
-
super(chainIdOrObj, swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken);
|
|
22
|
+
super(chainIdOrObj, amount.add(new BN(999)).div(new BN(1000)), swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken);
|
|
24
23
|
this.state = ToBtcLnSwapState.SAVED;
|
|
25
24
|
this.pr = pr;
|
|
26
|
-
this.signatureExpiry = signatureExpiry;
|
|
27
25
|
}
|
|
28
26
|
else {
|
|
29
27
|
super(chainIdOrObj);
|
|
30
28
|
this.pr = chainIdOrObj.pr;
|
|
31
|
-
this.signatureExpiry = (0, Utils_1.deserializeBN)(chainIdOrObj.signatureExpiry);
|
|
32
29
|
this.secret = chainIdOrObj.secret;
|
|
33
30
|
//Compatibility with older versions
|
|
34
31
|
(_a = this.quotedNetworkFee) !== null && _a !== void 0 ? _a : (this.quotedNetworkFee = (0, Utils_1.deserializeBN)(chainIdOrObj.maxFee));
|
|
@@ -39,16 +36,9 @@ class ToBtcLnSwapAbs extends ToBtcBaseSwap_1.ToBtcBaseSwap {
|
|
|
39
36
|
serialize() {
|
|
40
37
|
const partialSerialized = super.serialize();
|
|
41
38
|
partialSerialized.pr = this.pr;
|
|
42
|
-
partialSerialized.signatureExpiry = (0, Utils_1.serializeBN)(this.signatureExpiry);
|
|
43
39
|
partialSerialized.secret = this.secret;
|
|
44
40
|
return partialSerialized;
|
|
45
41
|
}
|
|
46
|
-
getHash() {
|
|
47
|
-
return bolt11.decode(this.pr).tagsObject.payment_hash;
|
|
48
|
-
}
|
|
49
|
-
getHashBuffer() {
|
|
50
|
-
return Buffer.from(bolt11.decode(this.pr).tagsObject.payment_hash, "hex");
|
|
51
|
-
}
|
|
52
42
|
isInitiated() {
|
|
53
43
|
return this.state !== ToBtcLnSwapState.SAVED;
|
|
54
44
|
}
|
|
@@ -58,8 +48,5 @@ class ToBtcLnSwapAbs extends ToBtcBaseSwap_1.ToBtcBaseSwap {
|
|
|
58
48
|
isSuccess() {
|
|
59
49
|
return this.state === ToBtcLnSwapState.CLAIMED;
|
|
60
50
|
}
|
|
61
|
-
getOutputAmount() {
|
|
62
|
-
return new BN(bolt11.decode(this.pr).millisatoshis).add(new BN(999)).div(new BN(1000));
|
|
63
|
-
}
|
|
64
51
|
}
|
|
65
52
|
exports.ToBtcLnSwapAbs = ToBtcLnSwapAbs;
|
package/dist/utils/Utils.d.ts
CHANGED
|
@@ -18,15 +18,5 @@ export declare function getLogger(prefix: string): {
|
|
|
18
18
|
error: (msg: any, ...args: any[]) => void;
|
|
19
19
|
};
|
|
20
20
|
export declare const HEX_REGEX: RegExp;
|
|
21
|
-
export declare function shuffle(array: any[]): void;
|
|
22
21
|
export declare function serializeBN(bn: BN | null): string | null;
|
|
23
22
|
export declare function deserializeBN(str: string | null): BN | null;
|
|
24
|
-
/**
|
|
25
|
-
* Handles & throws LND error if the error is:
|
|
26
|
-
* - network error
|
|
27
|
-
* - server side (LND) internal error
|
|
28
|
-
* - malformed input data error
|
|
29
|
-
*
|
|
30
|
-
* @param e
|
|
31
|
-
*/
|
|
32
|
-
export declare function handleLndError(e: any): void;
|
package/dist/utils/Utils.js
CHANGED
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
12
|
+
exports.deserializeBN = exports.serializeBN = exports.HEX_REGEX = exports.getLogger = exports.expressHandlerWrapper = exports.isDefinedRuntimeError = void 0;
|
|
13
13
|
const BN = require("bn.js");
|
|
14
14
|
function isDefinedRuntimeError(obj) {
|
|
15
15
|
if (obj.code != null && typeof (obj.code) === "number") {
|
|
@@ -66,20 +66,6 @@ function getLogger(prefix) {
|
|
|
66
66
|
}
|
|
67
67
|
exports.getLogger = getLogger;
|
|
68
68
|
exports.HEX_REGEX = /[0-9a-fA-F]+/;
|
|
69
|
-
function shuffle(array) {
|
|
70
|
-
let currentIndex = array.length;
|
|
71
|
-
// While there remain elements to shuffle...
|
|
72
|
-
while (currentIndex != 0) {
|
|
73
|
-
// Pick a remaining element...
|
|
74
|
-
let randomIndex = Math.floor(Math.random() * currentIndex);
|
|
75
|
-
currentIndex--;
|
|
76
|
-
// And swap it with the current element.
|
|
77
|
-
[array[currentIndex], array[randomIndex]] = [
|
|
78
|
-
array[randomIndex], array[currentIndex]
|
|
79
|
-
];
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
exports.shuffle = shuffle;
|
|
83
69
|
function serializeBN(bn) {
|
|
84
70
|
return bn == null ? null : bn.toString(10);
|
|
85
71
|
}
|
|
@@ -88,22 +74,3 @@ function deserializeBN(str) {
|
|
|
88
74
|
return str == null ? null : new BN(str);
|
|
89
75
|
}
|
|
90
76
|
exports.deserializeBN = deserializeBN;
|
|
91
|
-
/**
|
|
92
|
-
* Handles & throws LND error if the error is:
|
|
93
|
-
* - network error
|
|
94
|
-
* - server side (LND) internal error
|
|
95
|
-
* - malformed input data error
|
|
96
|
-
*
|
|
97
|
-
* @param e
|
|
98
|
-
*/
|
|
99
|
-
function handleLndError(e) {
|
|
100
|
-
if (!Array.isArray(e))
|
|
101
|
-
throw e; //Throw errors that are not originating from the SDK
|
|
102
|
-
if (typeof (e[0]) !== "number")
|
|
103
|
-
throw e; //Throw errors that don't have proper format
|
|
104
|
-
if (e[0] >= 500 && e[0] < 600)
|
|
105
|
-
throw e; //Throw server errors 5xx
|
|
106
|
-
if (e[0] === 400)
|
|
107
|
-
throw e; //Throw malformed request data errors
|
|
108
|
-
}
|
|
109
|
-
exports.handleLndError = handleLndError;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import BN from "bn.js";
|
|
3
|
+
import { Psbt, Transaction } from "bitcoinjs-lib";
|
|
4
|
+
import { BtcTx } from "@atomiqlabs/base";
|
|
5
|
+
import { Command } from "@atomiqlabs/server-base";
|
|
6
|
+
export type BitcoinUtxo = {
|
|
7
|
+
address: string;
|
|
8
|
+
type: "p2wpkh" | "p2sh-p2wpkh" | "p2tr";
|
|
9
|
+
confirmations: number;
|
|
10
|
+
outputScript: Buffer;
|
|
11
|
+
value: number;
|
|
12
|
+
txId: string;
|
|
13
|
+
vout: number;
|
|
14
|
+
};
|
|
15
|
+
export type SignPsbtResponse = {
|
|
16
|
+
psbt: Psbt;
|
|
17
|
+
tx: Transaction;
|
|
18
|
+
raw: string;
|
|
19
|
+
txId: string;
|
|
20
|
+
networkFee: number;
|
|
21
|
+
};
|
|
22
|
+
export interface IBitcoinWallet {
|
|
23
|
+
init(): Promise<void>;
|
|
24
|
+
isReady(): boolean;
|
|
25
|
+
getStatus(): string;
|
|
26
|
+
getStatusInfo(): Promise<Record<string, string>>;
|
|
27
|
+
getCommands(): Command<any>[];
|
|
28
|
+
toOutputScript(address: string): Buffer;
|
|
29
|
+
getAddressType(): "p2wpkh" | "p2sh-p2wpkh" | "p2tr";
|
|
30
|
+
/**
|
|
31
|
+
* Returns an unused address suitable for receiving
|
|
32
|
+
*/
|
|
33
|
+
getAddress(): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Adds previously returned address (with getAddress call), to the pool of unused addresses
|
|
36
|
+
* @param address
|
|
37
|
+
*/
|
|
38
|
+
addUnusedAddress(address: string): Promise<void>;
|
|
39
|
+
getUtxos(): Promise<BitcoinUtxo[]>;
|
|
40
|
+
getBalance(): Promise<{
|
|
41
|
+
confirmed: number;
|
|
42
|
+
unconfirmed: number;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Returns required reserve amount that needs to be kept in the wallet (for e.g. lightning anchor channels)
|
|
46
|
+
*/
|
|
47
|
+
getRequiredReserve(): Promise<number>;
|
|
48
|
+
getWalletTransactions(startHeight?: number): Promise<BtcTx[]>;
|
|
49
|
+
getWalletTransaction(txId: string): Promise<BtcTx | null>;
|
|
50
|
+
subscribeToWalletTransactions(callback: (tx: BtcTx) => void, abortSignal?: AbortSignal): void;
|
|
51
|
+
signPsbt(psbt: Psbt): Promise<SignPsbtResponse>;
|
|
52
|
+
sendRawTransaction(tx: string): Promise<void>;
|
|
53
|
+
getSignedTransaction(destination: string, amount: number, feeRate?: number, nonce?: BN, maxAllowedFeeRate?: number): Promise<SignPsbtResponse>;
|
|
54
|
+
estimateFee(destination: string, amount: number, feeRate?: number, feeRateMultiplier?: number): Promise<{
|
|
55
|
+
satsPerVbyte: number;
|
|
56
|
+
networkFee: number;
|
|
57
|
+
}>;
|
|
58
|
+
drainAll(destination: string | Buffer, inputs: Omit<BitcoinUtxo, "address">[], feeRate?: number): Promise<SignPsbtResponse>;
|
|
59
|
+
burnAll(inputs: Omit<BitcoinUtxo, "address">[]): Promise<SignPsbtResponse>;
|
|
60
|
+
getBlockheight(): Promise<number>;
|
|
61
|
+
getFeeRate(): Promise<number>;
|
|
62
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import * as BN from "bn.js";
|
|
2
|
+
import { Command } from "@atomiqlabs/server-base";
|
|
3
|
+
export type IncomingLightningNetworkPayment = {
|
|
4
|
+
createdAt: number;
|
|
5
|
+
confirmedAt: number;
|
|
6
|
+
createdHeight: number;
|
|
7
|
+
timeout: number;
|
|
8
|
+
status: "held" | "canceled" | "confirmed";
|
|
9
|
+
mtokens: BN;
|
|
10
|
+
};
|
|
11
|
+
export type LightningNetworkInvoice = {
|
|
12
|
+
id: string;
|
|
13
|
+
request: string;
|
|
14
|
+
secret?: string;
|
|
15
|
+
cltvDelta: number;
|
|
16
|
+
mtokens: BN;
|
|
17
|
+
createdAt: number;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
description: string;
|
|
20
|
+
descriptionHash?: string;
|
|
21
|
+
payments: IncomingLightningNetworkPayment[];
|
|
22
|
+
status: "unpaid" | "held" | "canceled" | "confirmed";
|
|
23
|
+
};
|
|
24
|
+
export type OutgoingLightningNetworkPayment = {
|
|
25
|
+
failedReason?: "insufficient_balance" | "invalid_payment" | "pathfinding_timeout" | "route_not_found";
|
|
26
|
+
status: "confirmed" | "failed" | "pending";
|
|
27
|
+
secret?: string;
|
|
28
|
+
feeMtokens?: BN;
|
|
29
|
+
};
|
|
30
|
+
export type LightningNetworkChannel = {
|
|
31
|
+
id: string;
|
|
32
|
+
capacity: BN;
|
|
33
|
+
isActive: boolean;
|
|
34
|
+
localBalance: BN;
|
|
35
|
+
localReserve: BN;
|
|
36
|
+
remoteBalance: BN;
|
|
37
|
+
remoteReserve: BN;
|
|
38
|
+
unsettledBalance: BN;
|
|
39
|
+
transactionId: string;
|
|
40
|
+
transactionVout: number;
|
|
41
|
+
};
|
|
42
|
+
export type InvoiceInit = {
|
|
43
|
+
mtokens: BN;
|
|
44
|
+
descriptionHash?: string;
|
|
45
|
+
description?: string;
|
|
46
|
+
cltvDelta?: number;
|
|
47
|
+
expiresAt?: number;
|
|
48
|
+
};
|
|
49
|
+
export type HodlInvoiceInit = {
|
|
50
|
+
description: string;
|
|
51
|
+
cltvDelta: number;
|
|
52
|
+
expiresAt: number;
|
|
53
|
+
id: string;
|
|
54
|
+
mtokens: BN;
|
|
55
|
+
descriptionHash?: string;
|
|
56
|
+
};
|
|
57
|
+
export type LNRoutes = {
|
|
58
|
+
publicKey: string;
|
|
59
|
+
feeRate?: number;
|
|
60
|
+
cltvDelta?: number;
|
|
61
|
+
channel?: string;
|
|
62
|
+
baseFeeMtokens?: BN;
|
|
63
|
+
}[][];
|
|
64
|
+
export type ParsedPaymentRequest = {
|
|
65
|
+
id: string;
|
|
66
|
+
mtokens: BN;
|
|
67
|
+
expiryEpochMillis: number;
|
|
68
|
+
destination: string;
|
|
69
|
+
cltvDelta: number;
|
|
70
|
+
description: string;
|
|
71
|
+
routes: LNRoutes;
|
|
72
|
+
};
|
|
73
|
+
export type LightningPaymentInit = {
|
|
74
|
+
request: string;
|
|
75
|
+
maxFeeMtokens?: BN;
|
|
76
|
+
maxTimeoutHeight?: number;
|
|
77
|
+
};
|
|
78
|
+
export type LightningBalanceResponse = {
|
|
79
|
+
localBalance: BN;
|
|
80
|
+
remoteBalance: BN;
|
|
81
|
+
unsettledBalance: BN;
|
|
82
|
+
};
|
|
83
|
+
export type ProbeAndRouteInit = {
|
|
84
|
+
request: string;
|
|
85
|
+
amountMtokens: BN;
|
|
86
|
+
maxFeeMtokens: BN;
|
|
87
|
+
maxTimeoutHeight: number;
|
|
88
|
+
};
|
|
89
|
+
export type ProbeAndRouteResponse = {
|
|
90
|
+
confidence: number;
|
|
91
|
+
feeMtokens: BN;
|
|
92
|
+
destination: string;
|
|
93
|
+
privateRoutes: LNRoutes;
|
|
94
|
+
};
|
|
95
|
+
export declare function routesMatch(routesA: LNRoutes, routesB: LNRoutes): boolean;
|
|
96
|
+
export interface ILightningWallet {
|
|
97
|
+
init(): Promise<void>;
|
|
98
|
+
isReady(): boolean;
|
|
99
|
+
getStatus(): string;
|
|
100
|
+
getStatusInfo(): Promise<Record<string, string>>;
|
|
101
|
+
getCommands(): Command<any>[];
|
|
102
|
+
createInvoice(init: InvoiceInit): Promise<LightningNetworkInvoice>;
|
|
103
|
+
createHodlInvoice(init: HodlInvoiceInit): Promise<LightningNetworkInvoice>;
|
|
104
|
+
getInvoice(paymentHash: string): Promise<LightningNetworkInvoice | null>;
|
|
105
|
+
cancelHodlInvoice(paymentHash: string): Promise<void>;
|
|
106
|
+
settleHodlInvoice(secret: string): Promise<void>;
|
|
107
|
+
waitForInvoice(paymentHash: string, abortSignal?: AbortSignal): Promise<LightningNetworkInvoice>;
|
|
108
|
+
pay(init: LightningPaymentInit): Promise<void>;
|
|
109
|
+
getPayment(paymentHash: string): Promise<OutgoingLightningNetworkPayment | null>;
|
|
110
|
+
waitForPayment(paymentHash: string, abortSignal?: AbortSignal): Promise<OutgoingLightningNetworkPayment>;
|
|
111
|
+
probe(init: ProbeAndRouteInit): Promise<ProbeAndRouteResponse | null>;
|
|
112
|
+
route(init: ProbeAndRouteInit): Promise<ProbeAndRouteResponse | null>;
|
|
113
|
+
parsePaymentRequest(request: string): Promise<ParsedPaymentRequest>;
|
|
114
|
+
getBlockheight(): Promise<number>;
|
|
115
|
+
getChannels(activeOnly?: boolean): Promise<LightningNetworkChannel[]>;
|
|
116
|
+
getLightningBalance(): Promise<LightningBalanceResponse>;
|
|
117
|
+
getIdentityPublicKey(): Promise<string>;
|
|
118
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.routesMatch = void 0;
|
|
4
|
+
function routesMatch(routesA, routesB) {
|
|
5
|
+
if (routesA === routesB)
|
|
6
|
+
return true;
|
|
7
|
+
if (routesA == null || routesB == null) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
if (routesA.length !== routesB.length)
|
|
11
|
+
return false;
|
|
12
|
+
for (let i = 0; i < routesA.length; i++) {
|
|
13
|
+
if (routesA[i] === routesB[i])
|
|
14
|
+
continue;
|
|
15
|
+
if (routesA[i] == null || routesB[i] == null) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (routesA[i].length !== routesB[i].length)
|
|
19
|
+
return false;
|
|
20
|
+
for (let e = 0; e < routesA[i].length; e++) {
|
|
21
|
+
if (routesA[i][e] === routesB[i][e])
|
|
22
|
+
continue;
|
|
23
|
+
if (routesA[i][e] == null || routesB[i][e] == null) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if (routesA[i][e].publicKey !== routesB[i][e].publicKey ||
|
|
27
|
+
!routesA[i][e].baseFeeMtokens.eq(routesB[i][e].baseFeeMtokens) ||
|
|
28
|
+
routesA[i][e].channel !== routesB[i][e].channel ||
|
|
29
|
+
routesA[i][e].cltvDelta !== routesB[i][e].cltvDelta ||
|
|
30
|
+
routesA[i][e].feeRate !== routesB[i][e].feeRate) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
exports.routesMatch = routesMatch;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atomiqlabs/lp-lib",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "11.0.0",
|
|
4
4
|
"description": "Main functionality implementation for atomiq LP node",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types:": "./dist/index.d.ts",
|
|
@@ -22,16 +22,11 @@
|
|
|
22
22
|
"author": "adambor",
|
|
23
23
|
"license": "ISC",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@atomiqlabs/base": "7.2.
|
|
26
|
-
"@atomiqlabs/
|
|
27
|
-
"@atomiqlabs/server-base": "1.0.4",
|
|
28
|
-
"@bitcoinerlab/secp256k1": "1.0.5",
|
|
25
|
+
"@atomiqlabs/base": "7.2.2",
|
|
26
|
+
"@atomiqlabs/server-base": "1.0.5",
|
|
29
27
|
"bitcoinjs-lib": "6.1.5",
|
|
30
28
|
"bn.js": "5.2.1",
|
|
31
|
-
"express": "4.
|
|
32
|
-
"lightning": "10.2.1",
|
|
33
|
-
"ln-service": "57.2.0",
|
|
34
|
-
"one-dollar-fee-estimator-failover": "0.1.1",
|
|
29
|
+
"express": "4.21.1",
|
|
35
30
|
"promise-queue-ts": "0.0.1"
|
|
36
31
|
},
|
|
37
32
|
"devDependencies": {
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import * as bitcoin from "bitcoinjs-lib";
|
|
2
|
-
import * as tinySecpk256Interface from "@bitcoinerlab/secp256k1";
|
|
3
|
-
bitcoin.initEccLib(tinySecpk256Interface);
|
|
4
|
-
|
|
5
1
|
export * from "./info/InfoHandler";
|
|
6
2
|
|
|
7
3
|
export * from "./prices/CoinGeckoSwapPrice";
|
|
@@ -34,7 +30,6 @@ export * from "./plugins/PluginManager";
|
|
|
34
30
|
export * from "./plugins/IPlugin";
|
|
35
31
|
|
|
36
32
|
export * from "./fees/IBtcFeeEstimator";
|
|
37
|
-
export * from "./fees/OneDollarFeeEstimator";
|
|
38
33
|
|
|
39
34
|
export * from "./utils/paramcoders/IParamReader";
|
|
40
35
|
export * from "./utils/paramcoders/IParamWriter";
|
|
@@ -44,3 +39,6 @@ export * from "./utils/paramcoders/ParamEncoder";
|
|
|
44
39
|
export * from "./utils/paramcoders/SchemaVerifier";
|
|
45
40
|
export * from "./utils/paramcoders/server/ServerParamDecoder";
|
|
46
41
|
export * from "./utils/paramcoders/server/ServerParamEncoder";
|
|
42
|
+
|
|
43
|
+
export * from "./wallets/IBitcoinWallet";
|
|
44
|
+
export * from "./wallets/ILightningWallet";
|
package/src/plugins/IPlugin.ts
CHANGED
|
@@ -8,10 +8,11 @@ import {
|
|
|
8
8
|
ToBtcRequestType
|
|
9
9
|
} from "..";
|
|
10
10
|
import {SwapHandlerSwap} from "../swaps/SwapHandlerSwap";
|
|
11
|
-
import {AuthenticatedLnd} from "lightning";
|
|
12
11
|
import * as BN from "bn.js";
|
|
13
12
|
import {Command} from "@atomiqlabs/server-base";
|
|
14
13
|
import {FromBtcLnTrustedRequestType} from "../swaps/frombtcln_trusted/FromBtcLnTrusted";
|
|
14
|
+
import {IBitcoinWallet} from "../wallets/IBitcoinWallet";
|
|
15
|
+
import {ILightningWallet} from "../wallets/ILightningWallet";
|
|
15
16
|
|
|
16
17
|
export type QuoteThrow = {
|
|
17
18
|
type: "throw",
|
|
@@ -84,7 +85,8 @@ export interface IPlugin {
|
|
|
84
85
|
chainsData: MultichainData,
|
|
85
86
|
|
|
86
87
|
bitcoinRpc: BitcoinRpc<any>,
|
|
87
|
-
|
|
88
|
+
bitcoinWallet: IBitcoinWallet,
|
|
89
|
+
lightningWallet: ILightningWallet,
|
|
88
90
|
|
|
89
91
|
swapPricing: ISwapPrice,
|
|
90
92
|
tokens: {
|
|
@@ -16,11 +16,12 @@ import {
|
|
|
16
16
|
ToBtcRequestType
|
|
17
17
|
} from "..";
|
|
18
18
|
import {SwapHandlerSwap} from "../swaps/SwapHandlerSwap";
|
|
19
|
-
import {AuthenticatedLnd} from "lightning";
|
|
20
19
|
import * as BN from "bn.js";
|
|
21
20
|
import * as fs from "fs";
|
|
22
21
|
import {getLogger} from "../utils/Utils";
|
|
23
22
|
import {FromBtcLnTrustedRequestType} from "../swaps/frombtcln_trusted/FromBtcLnTrusted";
|
|
23
|
+
import {IBitcoinWallet} from "../wallets/IBitcoinWallet";
|
|
24
|
+
import {ILightningWallet} from "../wallets/ILightningWallet";
|
|
24
25
|
|
|
25
26
|
export type FailSwapResponse = {
|
|
26
27
|
type: "fail",
|
|
@@ -67,7 +68,8 @@ export class PluginManager {
|
|
|
67
68
|
chainsData: MultichainData,
|
|
68
69
|
|
|
69
70
|
bitcoinRpc: BitcoinRpc<any>,
|
|
70
|
-
|
|
71
|
+
bitcoinWallet: IBitcoinWallet,
|
|
72
|
+
lightningWallet: ILightningWallet,
|
|
71
73
|
|
|
72
74
|
swapPricing: ISwapPrice,
|
|
73
75
|
tokens: {
|
|
@@ -92,7 +94,8 @@ export class PluginManager {
|
|
|
92
94
|
await plugin.onEnable(
|
|
93
95
|
chainsData,
|
|
94
96
|
bitcoinRpc,
|
|
95
|
-
|
|
97
|
+
bitcoinWallet,
|
|
98
|
+
lightningWallet,
|
|
96
99
|
swapPricing,
|
|
97
100
|
tokens,
|
|
98
101
|
directory+"/"+name
|
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
import {SwapData} from "@atomiqlabs/base";
|
|
2
2
|
import {SwapHandlerSwap} from "./SwapHandlerSwap";
|
|
3
3
|
import * as BN from "bn.js";
|
|
4
|
+
import {deserializeBN, serializeBN} from "../utils/Utils";
|
|
4
5
|
|
|
5
6
|
export abstract class FromBtcBaseSwap<T extends SwapData, S = any> extends SwapHandlerSwap<T, S> {
|
|
6
7
|
|
|
8
|
+
amount: BN;
|
|
9
|
+
|
|
10
|
+
protected constructor(chainIdentifier: string, amount: BN, swapFee: BN, swapFeeInToken: BN);
|
|
11
|
+
protected constructor(obj: any);
|
|
12
|
+
|
|
13
|
+
protected constructor(obj?: any | string, amount?: BN, swapFee?: BN, swapFeeInToken?: BN) {
|
|
14
|
+
super(obj, swapFee, swapFeeInToken);
|
|
15
|
+
if (typeof (obj) === "string" && BN.isBN(amount) && BN.isBN(swapFee) && BN.isBN(swapFeeInToken)) {
|
|
16
|
+
this.amount = amount;
|
|
17
|
+
} else {
|
|
18
|
+
this.amount = deserializeBN(obj.amount);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
7
22
|
getInputAmount(): BN {
|
|
8
23
|
return this.getTotalInputAmount().sub(this.getSwapFee().inInputToken);
|
|
9
24
|
}
|
|
10
25
|
|
|
11
|
-
|
|
26
|
+
getTotalInputAmount(): BN {
|
|
27
|
+
return this.amount;
|
|
28
|
+
}
|
|
12
29
|
|
|
13
30
|
getOutputAmount(): BN {
|
|
14
31
|
return this.data.getAmount();
|
|
@@ -18,4 +35,10 @@ export abstract class FromBtcBaseSwap<T extends SwapData, S = any> extends SwapH
|
|
|
18
35
|
return {inInputToken: this.swapFee, inOutputToken: this.swapFeeInToken};
|
|
19
36
|
}
|
|
20
37
|
|
|
38
|
+
serialize(): any {
|
|
39
|
+
const partialSerialized = super.serialize();
|
|
40
|
+
partialSerialized.amount = serializeBN(this.amount);
|
|
41
|
+
return partialSerialized;
|
|
42
|
+
}
|
|
43
|
+
|
|
21
44
|
}
|
|
@@ -345,7 +345,8 @@ export abstract class FromBtcBaseSwapHandler<V extends SwapHandlerSwap<SwapData,
|
|
|
345
345
|
): Promise<{
|
|
346
346
|
prefix: string,
|
|
347
347
|
timeout: string,
|
|
348
|
-
signature: string
|
|
348
|
+
signature: string,
|
|
349
|
+
feeRate: string
|
|
349
350
|
}> {
|
|
350
351
|
const {swapContract, signer} = this.getChain(chainIdentifier);
|
|
351
352
|
|
|
@@ -369,7 +370,10 @@ export abstract class FromBtcBaseSwapHandler<V extends SwapHandlerSwap<SwapData,
|
|
|
369
370
|
);
|
|
370
371
|
abortSignal.throwIfAborted();
|
|
371
372
|
|
|
372
|
-
return
|
|
373
|
+
return {
|
|
374
|
+
...sigData,
|
|
375
|
+
feeRate
|
|
376
|
+
};
|
|
373
377
|
}
|
|
374
378
|
|
|
375
379
|
}
|
|
@@ -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) {
|