@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.
Files changed (94) hide show
  1. package/dist/index.d.ts +2 -1
  2. package/dist/index.js +2 -4
  3. package/dist/plugins/IPlugin.d.ts +3 -2
  4. package/dist/plugins/PluginManager.d.ts +3 -2
  5. package/dist/plugins/PluginManager.js +2 -2
  6. package/dist/swaps/FromBtcBaseSwap.d.ts +5 -1
  7. package/dist/swaps/FromBtcBaseSwap.js +20 -0
  8. package/dist/swaps/FromBtcBaseSwapHandler.d.ts +1 -0
  9. package/dist/swaps/FromBtcBaseSwapHandler.js +1 -1
  10. package/dist/swaps/FromBtcLnBaseSwapHandler.d.ts +8 -6
  11. package/dist/swaps/FromBtcLnBaseSwapHandler.js +7 -5
  12. package/dist/swaps/SwapHandler.d.ts +1 -4
  13. package/dist/swaps/SwapHandler.js +1 -2
  14. package/dist/swaps/SwapHandlerSwap.d.ts +4 -0
  15. package/dist/swaps/SwapHandlerSwap.js +9 -1
  16. package/dist/swaps/ToBtcBaseSwap.d.ts +3 -1
  17. package/dist/swaps/ToBtcBaseSwap.js +8 -2
  18. package/dist/swaps/ToBtcBaseSwapHandler.d.ts +1 -0
  19. package/dist/swaps/ToBtcBaseSwapHandler.js +1 -1
  20. package/dist/swaps/frombtc_abstract/FromBtcAbs.d.ts +3 -5
  21. package/dist/swaps/frombtc_abstract/FromBtcAbs.js +18 -25
  22. package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.d.ts +1 -4
  23. package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.js +3 -16
  24. package/dist/swaps/frombtc_trusted/FromBtcTrusted.d.ts +6 -9
  25. package/dist/swaps/frombtc_trusted/FromBtcTrusted.js +238 -137
  26. package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.d.ts +9 -6
  27. package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.js +15 -10
  28. package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.d.ts +2 -2
  29. package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.js +42 -62
  30. package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.d.ts +1 -6
  31. package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.js +2 -14
  32. package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.d.ts +3 -5
  33. package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.js +64 -80
  34. package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.d.ts +1 -2
  35. package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.js +5 -8
  36. package/dist/swaps/tobtc_abstract/ToBtcAbs.d.ts +5 -125
  37. package/dist/swaps/tobtc_abstract/ToBtcAbs.js +41 -334
  38. package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.d.ts +1 -4
  39. package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.js +2 -11
  40. package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.d.ts +5 -55
  41. package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.js +152 -398
  42. package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.d.ts +1 -6
  43. package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.js +2 -15
  44. package/dist/utils/Utils.d.ts +0 -10
  45. package/dist/utils/Utils.js +1 -34
  46. package/dist/wallets/IBitcoinWallet.d.ts +62 -0
  47. package/dist/wallets/IBitcoinWallet.js +2 -0
  48. package/dist/wallets/ILightningWallet.d.ts +118 -0
  49. package/dist/wallets/ILightningWallet.js +37 -0
  50. package/package.json +4 -9
  51. package/src/index.ts +3 -5
  52. package/src/plugins/IPlugin.ts +4 -2
  53. package/src/plugins/PluginManager.ts +6 -3
  54. package/src/swaps/FromBtcBaseSwap.ts +24 -1
  55. package/src/swaps/FromBtcBaseSwapHandler.ts +6 -2
  56. package/src/swaps/FromBtcLnBaseSwapHandler.ts +22 -6
  57. package/src/swaps/SwapHandler.ts +1 -8
  58. package/src/swaps/SwapHandlerSwap.ts +14 -1
  59. package/src/swaps/ToBtcBaseSwap.ts +12 -3
  60. package/src/swaps/ToBtcBaseSwapHandler.ts +6 -2
  61. package/src/swaps/frombtc_abstract/FromBtcAbs.ts +24 -28
  62. package/src/swaps/frombtc_abstract/FromBtcSwapAbs.ts +3 -18
  63. package/src/swaps/frombtc_trusted/FromBtcTrusted.ts +260 -159
  64. package/src/swaps/frombtc_trusted/FromBtcTrustedSwap.ts +22 -15
  65. package/src/swaps/frombtcln_abstract/FromBtcLnAbs.ts +69 -79
  66. package/src/swaps/frombtcln_abstract/FromBtcLnSwapAbs.ts +3 -20
  67. package/src/swaps/frombtcln_trusted/FromBtcLnTrusted.ts +80 -97
  68. package/src/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.ts +6 -9
  69. package/src/swaps/tobtc_abstract/ToBtcAbs.ts +52 -410
  70. package/src/swaps/tobtc_abstract/ToBtcSwapAbs.ts +3 -18
  71. package/src/swaps/tobtcln_abstract/ToBtcLnAbs.ts +157 -434
  72. package/src/swaps/tobtcln_abstract/ToBtcLnSwapAbs.ts +3 -20
  73. package/src/utils/Utils.ts +0 -31
  74. package/src/wallets/IBitcoinWallet.ts +66 -0
  75. package/src/wallets/ILightningWallet.ts +179 -0
  76. package/dist/fees/OneDollarFeeEstimator.d.ts +0 -16
  77. package/dist/fees/OneDollarFeeEstimator.js +0 -71
  78. package/dist/utils/coinselect2/accumulative.d.ts +0 -6
  79. package/dist/utils/coinselect2/accumulative.js +0 -44
  80. package/dist/utils/coinselect2/blackjack.d.ts +0 -6
  81. package/dist/utils/coinselect2/blackjack.js +0 -41
  82. package/dist/utils/coinselect2/index.d.ts +0 -16
  83. package/dist/utils/coinselect2/index.js +0 -40
  84. package/dist/utils/coinselect2/utils.d.ts +0 -64
  85. package/dist/utils/coinselect2/utils.js +0 -121
  86. package/src/fees/OneDollarFeeEstimator.ts +0 -95
  87. package/src/utils/coinselect2/accumulative.js +0 -32
  88. package/src/utils/coinselect2/accumulative.ts +0 -58
  89. package/src/utils/coinselect2/blackjack.js +0 -29
  90. package/src/utils/coinselect2/blackjack.ts +0 -54
  91. package/src/utils/coinselect2/index.js +0 -16
  92. package/src/utils/coinselect2/index.ts +0 -50
  93. package/src/utils/coinselect2/utils.js +0 -110
  94. 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, swapFee: BN, swapFeeInToken: BN, quotedNetworkFee: BN, quotedNetworkFeeInToken: BN, signatureExpiry: BN);
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, signatureExpiry) {
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;
@@ -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;
@@ -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.handleLndError = exports.deserializeBN = exports.serializeBN = exports.shuffle = exports.HEX_REGEX = exports.getLogger = exports.expressHandlerWrapper = exports.isDefinedRuntimeError = void 0;
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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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": "10.3.11",
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.0",
26
- "@atomiqlabs/bolt11": "1.5.1",
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.18.2",
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";
@@ -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
- lnd: AuthenticatedLnd,
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
- lnd: AuthenticatedLnd,
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
- lnd,
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
- abstract getTotalInputAmount(): BN;
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 sigData;
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 * as lncli from "ln-service";
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<{channels: any[]}>, signal: AbortSignal) {
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.channels.forEach(channel => {
25
- if(new BN(channel.remote_balance).gte(amountBD)) hasEnoughInboundLiquidity = true;
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<{channels: any[]}> {
41
- return lncli.getChannels({is_active: true, lnd: this.LND}).catch(e => {
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;
@@ -1,15 +1,12 @@
1
- import {Express, Request, Response} from "express";
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) {