@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.
Files changed (97) hide show
  1. package/dist/index.d.ts +3 -1
  2. package/dist/index.js +3 -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/prices/OKXSwapPrice.d.ts +27 -0
  7. package/dist/prices/OKXSwapPrice.js +106 -0
  8. package/dist/swaps/FromBtcBaseSwap.d.ts +5 -1
  9. package/dist/swaps/FromBtcBaseSwap.js +20 -0
  10. package/dist/swaps/FromBtcBaseSwapHandler.d.ts +1 -0
  11. package/dist/swaps/FromBtcBaseSwapHandler.js +1 -1
  12. package/dist/swaps/FromBtcLnBaseSwapHandler.d.ts +8 -6
  13. package/dist/swaps/FromBtcLnBaseSwapHandler.js +7 -5
  14. package/dist/swaps/SwapHandler.d.ts +1 -4
  15. package/dist/swaps/SwapHandler.js +1 -2
  16. package/dist/swaps/SwapHandlerSwap.d.ts +4 -0
  17. package/dist/swaps/SwapHandlerSwap.js +9 -1
  18. package/dist/swaps/ToBtcBaseSwap.d.ts +3 -1
  19. package/dist/swaps/ToBtcBaseSwap.js +8 -2
  20. package/dist/swaps/ToBtcBaseSwapHandler.d.ts +1 -0
  21. package/dist/swaps/ToBtcBaseSwapHandler.js +1 -1
  22. package/dist/swaps/frombtc_abstract/FromBtcAbs.d.ts +3 -5
  23. package/dist/swaps/frombtc_abstract/FromBtcAbs.js +18 -25
  24. package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.d.ts +1 -4
  25. package/dist/swaps/frombtc_abstract/FromBtcSwapAbs.js +3 -16
  26. package/dist/swaps/frombtc_trusted/FromBtcTrusted.d.ts +6 -9
  27. package/dist/swaps/frombtc_trusted/FromBtcTrusted.js +238 -137
  28. package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.d.ts +9 -6
  29. package/dist/swaps/frombtc_trusted/FromBtcTrustedSwap.js +15 -10
  30. package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.d.ts +2 -2
  31. package/dist/swaps/frombtcln_abstract/FromBtcLnAbs.js +42 -62
  32. package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.d.ts +1 -6
  33. package/dist/swaps/frombtcln_abstract/FromBtcLnSwapAbs.js +2 -14
  34. package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.d.ts +3 -5
  35. package/dist/swaps/frombtcln_trusted/FromBtcLnTrusted.js +90 -87
  36. package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.d.ts +1 -2
  37. package/dist/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.js +5 -8
  38. package/dist/swaps/tobtc_abstract/ToBtcAbs.d.ts +5 -125
  39. package/dist/swaps/tobtc_abstract/ToBtcAbs.js +41 -334
  40. package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.d.ts +1 -4
  41. package/dist/swaps/tobtc_abstract/ToBtcSwapAbs.js +2 -11
  42. package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.d.ts +5 -55
  43. package/dist/swaps/tobtcln_abstract/ToBtcLnAbs.js +152 -398
  44. package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.d.ts +1 -6
  45. package/dist/swaps/tobtcln_abstract/ToBtcLnSwapAbs.js +2 -15
  46. package/dist/utils/Utils.d.ts +0 -10
  47. package/dist/utils/Utils.js +1 -34
  48. package/dist/wallets/IBitcoinWallet.d.ts +62 -0
  49. package/dist/wallets/IBitcoinWallet.js +2 -0
  50. package/dist/wallets/ILightningWallet.d.ts +118 -0
  51. package/dist/wallets/ILightningWallet.js +37 -0
  52. package/package.json +4 -9
  53. package/src/index.ts +4 -5
  54. package/src/plugins/IPlugin.ts +4 -2
  55. package/src/plugins/PluginManager.ts +6 -3
  56. package/src/prices/OKXSwapPrice.ts +114 -0
  57. package/src/swaps/FromBtcBaseSwap.ts +24 -1
  58. package/src/swaps/FromBtcBaseSwapHandler.ts +6 -2
  59. package/src/swaps/FromBtcLnBaseSwapHandler.ts +22 -6
  60. package/src/swaps/SwapHandler.ts +1 -8
  61. package/src/swaps/SwapHandlerSwap.ts +14 -1
  62. package/src/swaps/ToBtcBaseSwap.ts +12 -3
  63. package/src/swaps/ToBtcBaseSwapHandler.ts +6 -2
  64. package/src/swaps/frombtc_abstract/FromBtcAbs.ts +24 -28
  65. package/src/swaps/frombtc_abstract/FromBtcSwapAbs.ts +3 -18
  66. package/src/swaps/frombtc_trusted/FromBtcTrusted.ts +260 -159
  67. package/src/swaps/frombtc_trusted/FromBtcTrustedSwap.ts +22 -15
  68. package/src/swaps/frombtcln_abstract/FromBtcLnAbs.ts +69 -79
  69. package/src/swaps/frombtcln_abstract/FromBtcLnSwapAbs.ts +3 -20
  70. package/src/swaps/frombtcln_trusted/FromBtcLnTrusted.ts +108 -103
  71. package/src/swaps/frombtcln_trusted/FromBtcLnTrustedSwap.ts +6 -9
  72. package/src/swaps/tobtc_abstract/ToBtcAbs.ts +52 -410
  73. package/src/swaps/tobtc_abstract/ToBtcSwapAbs.ts +3 -18
  74. package/src/swaps/tobtcln_abstract/ToBtcLnAbs.ts +157 -434
  75. package/src/swaps/tobtcln_abstract/ToBtcLnSwapAbs.ts +3 -20
  76. package/src/utils/Utils.ts +0 -31
  77. package/src/wallets/IBitcoinWallet.ts +66 -0
  78. package/src/wallets/ILightningWallet.ts +179 -0
  79. package/dist/fees/OneDollarFeeEstimator.d.ts +0 -16
  80. package/dist/fees/OneDollarFeeEstimator.js +0 -71
  81. package/dist/utils/coinselect2/accumulative.d.ts +0 -6
  82. package/dist/utils/coinselect2/accumulative.js +0 -44
  83. package/dist/utils/coinselect2/blackjack.d.ts +0 -6
  84. package/dist/utils/coinselect2/blackjack.js +0 -41
  85. package/dist/utils/coinselect2/index.d.ts +0 -16
  86. package/dist/utils/coinselect2/index.js +0 -40
  87. package/dist/utils/coinselect2/utils.d.ts +0 -64
  88. package/dist/utils/coinselect2/utils.js +0 -121
  89. package/src/fees/OneDollarFeeEstimator.ts +0 -95
  90. package/src/utils/coinselect2/accumulative.js +0 -32
  91. package/src/utils/coinselect2/accumulative.ts +0 -58
  92. package/src/utils/coinselect2/blackjack.js +0 -29
  93. package/src/utils/coinselect2/blackjack.ts +0 -54
  94. package/src/utils/coinselect2/index.js +0 -16
  95. package/src/utils/coinselect2/index.ts +0 -50
  96. package/src/utils/coinselect2/utils.js +0 -110
  97. package/src/utils/coinselect2/utils.ts +0 -183
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./info/InfoHandler";
2
2
  export * from "./prices/CoinGeckoSwapPrice";
3
3
  export * from "./prices/BinanceSwapPrice";
4
+ export * from "./prices/OKXSwapPrice";
4
5
  export * from "./storage/IIntermediaryStorage";
5
6
  export * from "./storagemanager/StorageManager";
6
7
  export * from "./storagemanager/IntermediaryStorageManager";
@@ -22,7 +23,6 @@ export * from "./swaps/SwapHandlerSwap";
22
23
  export * from "./plugins/PluginManager";
23
24
  export * from "./plugins/IPlugin";
24
25
  export * from "./fees/IBtcFeeEstimator";
25
- export * from "./fees/OneDollarFeeEstimator";
26
26
  export * from "./utils/paramcoders/IParamReader";
27
27
  export * from "./utils/paramcoders/IParamWriter";
28
28
  export * from "./utils/paramcoders/LegacyParamEncoder";
@@ -31,3 +31,5 @@ export * from "./utils/paramcoders/ParamEncoder";
31
31
  export * from "./utils/paramcoders/SchemaVerifier";
32
32
  export * from "./utils/paramcoders/server/ServerParamDecoder";
33
33
  export * from "./utils/paramcoders/server/ServerParamEncoder";
34
+ export * from "./wallets/IBitcoinWallet";
35
+ export * from "./wallets/ILightningWallet";
package/dist/index.js CHANGED
@@ -14,12 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- const bitcoin = require("bitcoinjs-lib");
18
- const tinySecpk256Interface = require("@bitcoinerlab/secp256k1");
19
- bitcoin.initEccLib(tinySecpk256Interface);
20
17
  __exportStar(require("./info/InfoHandler"), exports);
21
18
  __exportStar(require("./prices/CoinGeckoSwapPrice"), exports);
22
19
  __exportStar(require("./prices/BinanceSwapPrice"), exports);
20
+ __exportStar(require("./prices/OKXSwapPrice"), exports);
23
21
  __exportStar(require("./storage/IIntermediaryStorage"), exports);
24
22
  __exportStar(require("./storagemanager/StorageManager"), exports);
25
23
  __exportStar(require("./storagemanager/IntermediaryStorageManager"), exports);
@@ -41,7 +39,6 @@ __exportStar(require("./swaps/SwapHandlerSwap"), exports);
41
39
  __exportStar(require("./plugins/PluginManager"), exports);
42
40
  __exportStar(require("./plugins/IPlugin"), exports);
43
41
  __exportStar(require("./fees/IBtcFeeEstimator"), exports);
44
- __exportStar(require("./fees/OneDollarFeeEstimator"), exports);
45
42
  __exportStar(require("./utils/paramcoders/IParamReader"), exports);
46
43
  __exportStar(require("./utils/paramcoders/IParamWriter"), exports);
47
44
  __exportStar(require("./utils/paramcoders/LegacyParamEncoder"), exports);
@@ -50,3 +47,5 @@ __exportStar(require("./utils/paramcoders/ParamEncoder"), exports);
50
47
  __exportStar(require("./utils/paramcoders/SchemaVerifier"), exports);
51
48
  __exportStar(require("./utils/paramcoders/server/ServerParamDecoder"), exports);
52
49
  __exportStar(require("./utils/paramcoders/server/ServerParamEncoder"), exports);
50
+ __exportStar(require("./wallets/IBitcoinWallet"), exports);
51
+ __exportStar(require("./wallets/ILightningWallet"), exports);
@@ -1,10 +1,11 @@
1
1
  import { BitcoinRpc } from "@atomiqlabs/base";
2
2
  import { FromBtcLnRequestType, FromBtcRequestType, ISwapPrice, MultichainData, RequestData, SwapHandler, ToBtcLnRequestType, ToBtcRequestType } from "..";
3
3
  import { SwapHandlerSwap } from "../swaps/SwapHandlerSwap";
4
- import { AuthenticatedLnd } from "lightning";
5
4
  import * as BN from "bn.js";
6
5
  import { Command } from "@atomiqlabs/server-base";
7
6
  import { FromBtcLnTrustedRequestType } from "../swaps/frombtcln_trusted/FromBtcLnTrusted";
7
+ import { IBitcoinWallet } from "../wallets/IBitcoinWallet";
8
+ import { ILightningWallet } from "../wallets/ILightningWallet";
8
9
  export type QuoteThrow = {
9
10
  type: "throw";
10
11
  message: string;
@@ -55,7 +56,7 @@ export interface IPlugin {
55
56
  name: string;
56
57
  author: string;
57
58
  description: string;
58
- onEnable(chainsData: MultichainData, bitcoinRpc: BitcoinRpc<any>, lnd: AuthenticatedLnd, swapPricing: ISwapPrice, tokens: {
59
+ onEnable(chainsData: MultichainData, bitcoinRpc: BitcoinRpc<any>, bitcoinWallet: IBitcoinWallet, lightningWallet: ILightningWallet, swapPricing: ISwapPrice, tokens: {
59
60
  [ticker: string]: {
60
61
  [chainId: string]: {
61
62
  address: string;
@@ -2,9 +2,10 @@ import { BitcoinRpc, SwapData } from "@atomiqlabs/base";
2
2
  import { IPlugin, PluginQuote, QuoteAmountTooHigh, QuoteAmountTooLow, QuoteSetFees, QuoteThrow, ToBtcPluginQuote } from "./IPlugin";
3
3
  import { FromBtcLnRequestType, FromBtcRequestType, ISwapPrice, MultichainData, RequestData, SwapHandler, ToBtcLnRequestType, ToBtcRequestType } from "..";
4
4
  import { SwapHandlerSwap } from "../swaps/SwapHandlerSwap";
5
- import { AuthenticatedLnd } from "lightning";
6
5
  import * as BN from "bn.js";
7
6
  import { FromBtcLnTrustedRequestType } from "../swaps/frombtcln_trusted/FromBtcLnTrusted";
7
+ import { IBitcoinWallet } from "../wallets/IBitcoinWallet";
8
+ import { ILightningWallet } from "../wallets/ILightningWallet";
8
9
  export type FailSwapResponse = {
9
10
  type: "fail";
10
11
  code?: number;
@@ -26,7 +27,7 @@ export declare class PluginManager {
26
27
  static plugins: Map<string, IPlugin>;
27
28
  static registerPlugin(name: string, plugin: IPlugin): void;
28
29
  static unregisterPlugin(name: string): boolean;
29
- static enable<T extends SwapData>(chainsData: MultichainData, bitcoinRpc: BitcoinRpc<any>, lnd: AuthenticatedLnd, swapPricing: ISwapPrice, tokens: {
30
+ static enable<T extends SwapData>(chainsData: MultichainData, bitcoinRpc: BitcoinRpc<any>, bitcoinWallet: IBitcoinWallet, lightningWallet: ILightningWallet, swapPricing: ISwapPrice, tokens: {
30
31
  [ticker: string]: {
31
32
  [chainId: string]: {
32
33
  address: string;
@@ -27,7 +27,7 @@ class PluginManager {
27
27
  static unregisterPlugin(name) {
28
28
  return PluginManager.plugins.delete(name);
29
29
  }
30
- static enable(chainsData, bitcoinRpc, lnd, swapPricing, tokens, directory) {
30
+ static enable(chainsData, bitcoinRpc, bitcoinWallet, lightningWallet, swapPricing, tokens, directory) {
31
31
  return __awaiter(this, void 0, void 0, function* () {
32
32
  try {
33
33
  fs.mkdirSync(directory);
@@ -39,7 +39,7 @@ class PluginManager {
39
39
  fs.mkdirSync(directory + "/" + name);
40
40
  }
41
41
  catch (e) { }
42
- yield plugin.onEnable(chainsData, bitcoinRpc, lnd, swapPricing, tokens, directory + "/" + name);
42
+ yield plugin.onEnable(chainsData, bitcoinRpc, bitcoinWallet, lightningWallet, swapPricing, tokens, directory + "/" + name);
43
43
  }
44
44
  catch (e) {
45
45
  pluginLogger.error(plugin, "enable(): plugin enable error", e);
@@ -0,0 +1,27 @@
1
+ import * as BN from "bn.js";
2
+ import { ISwapPrice } from "../swaps/ISwapPrice";
3
+ export type OKXPriceData = {
4
+ [pair: string]: {
5
+ [chainId: string]: {
6
+ address: string;
7
+ decimals: number;
8
+ };
9
+ };
10
+ };
11
+ export declare class OKXSwapPrice extends ISwapPrice<{
12
+ pair: string;
13
+ decimals: number;
14
+ }> {
15
+ url: string;
16
+ cache: {
17
+ [pair: string]: {
18
+ price: number;
19
+ expiry: number;
20
+ };
21
+ };
22
+ constructor(url: string, coins: OKXPriceData);
23
+ fetchPrice(pair: string): Promise<number>;
24
+ getPrice(tokenData: {
25
+ pair: string;
26
+ }): Promise<BN>;
27
+ }
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.OKXSwapPrice = void 0;
13
+ const BN = require("bn.js");
14
+ const ISwapPrice_1 = require("../swaps/ISwapPrice");
15
+ const CACHE_DURATION = 15000;
16
+ class OKXSwapPrice extends ISwapPrice_1.ISwapPrice {
17
+ constructor(url, coins) {
18
+ const coinsMap = {};
19
+ for (let pair in coins) {
20
+ const chains = coins[pair];
21
+ for (let chainId in chains) {
22
+ const tokenData = chains[chainId];
23
+ if (coinsMap[chainId] == null)
24
+ coinsMap[chainId] = {};
25
+ coinsMap[chainId][tokenData.address] = {
26
+ pair,
27
+ decimals: tokenData.decimals
28
+ };
29
+ }
30
+ }
31
+ super(coinsMap);
32
+ this.cache = {};
33
+ this.url = url || "https://www.okx.com/api/v5";
34
+ }
35
+ fetchPrice(pair) {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ const response = yield fetch(this.url + "/market/index-tickers?instId=" + pair, {
38
+ method: "GET"
39
+ });
40
+ if (response.status !== 200) {
41
+ let resp;
42
+ try {
43
+ resp = yield response.text();
44
+ }
45
+ catch (e) {
46
+ throw new Error(response.statusText);
47
+ }
48
+ throw new Error(resp);
49
+ }
50
+ let jsonBody = yield response.json();
51
+ return parseFloat(jsonBody.data[0].idxPx);
52
+ });
53
+ }
54
+ getPrice(tokenData) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ const pair = tokenData.pair;
57
+ if (pair.startsWith("$fixed-")) {
58
+ const amt = parseFloat(pair.substring(7));
59
+ return new BN(Math.floor(amt * 1000000));
60
+ }
61
+ const arr = pair.split(";");
62
+ const promises = [];
63
+ const cachedValue = this.cache[pair];
64
+ if (cachedValue == null || cachedValue.expiry < Date.now()) {
65
+ let resultPrice = 1;
66
+ for (let pair of arr) {
67
+ let invert = false;
68
+ if (pair.startsWith("!")) {
69
+ invert = true;
70
+ pair = pair.substring(1);
71
+ }
72
+ const cachedValue = this.cache[pair];
73
+ if (cachedValue == null || cachedValue.expiry < Date.now()) {
74
+ promises.push(this.fetchPrice(pair).then(price => {
75
+ this.cache[pair] = {
76
+ price,
77
+ expiry: Date.now() + CACHE_DURATION
78
+ };
79
+ if (invert) {
80
+ resultPrice /= price;
81
+ }
82
+ else {
83
+ resultPrice *= price;
84
+ }
85
+ }));
86
+ }
87
+ else {
88
+ if (invert) {
89
+ resultPrice /= cachedValue.price;
90
+ }
91
+ else {
92
+ resultPrice *= cachedValue.price;
93
+ }
94
+ }
95
+ }
96
+ yield Promise.all(promises);
97
+ this.cache[pair] = {
98
+ price: resultPrice,
99
+ expiry: Date.now() + CACHE_DURATION
100
+ };
101
+ }
102
+ return new BN(Math.floor(this.cache[pair].price * 100000000000000));
103
+ });
104
+ }
105
+ }
106
+ exports.OKXSwapPrice = OKXSwapPrice;
@@ -2,11 +2,15 @@ import { SwapData } from "@atomiqlabs/base";
2
2
  import { SwapHandlerSwap } from "./SwapHandlerSwap";
3
3
  import * as BN from "bn.js";
4
4
  export declare abstract class FromBtcBaseSwap<T extends SwapData, S = any> extends SwapHandlerSwap<T, S> {
5
+ amount: BN;
6
+ protected constructor(chainIdentifier: string, amount: BN, swapFee: BN, swapFeeInToken: BN);
7
+ protected constructor(obj: any);
5
8
  getInputAmount(): BN;
6
- abstract getTotalInputAmount(): BN;
9
+ getTotalInputAmount(): BN;
7
10
  getOutputAmount(): BN;
8
11
  getSwapFee(): {
9
12
  inInputToken: BN;
10
13
  inOutputToken: BN;
11
14
  };
15
+ serialize(): any;
12
16
  }
@@ -2,15 +2,35 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FromBtcBaseSwap = void 0;
4
4
  const SwapHandlerSwap_1 = require("./SwapHandlerSwap");
5
+ const BN = require("bn.js");
6
+ const Utils_1 = require("../utils/Utils");
5
7
  class FromBtcBaseSwap extends SwapHandlerSwap_1.SwapHandlerSwap {
8
+ constructor(obj, amount, swapFee, swapFeeInToken) {
9
+ super(obj, swapFee, swapFeeInToken);
10
+ if (typeof (obj) === "string" && BN.isBN(amount) && BN.isBN(swapFee) && BN.isBN(swapFeeInToken)) {
11
+ this.amount = amount;
12
+ }
13
+ else {
14
+ this.amount = (0, Utils_1.deserializeBN)(obj.amount);
15
+ }
16
+ }
17
+ ;
6
18
  getInputAmount() {
7
19
  return this.getTotalInputAmount().sub(this.getSwapFee().inInputToken);
8
20
  }
21
+ getTotalInputAmount() {
22
+ return this.amount;
23
+ }
9
24
  getOutputAmount() {
10
25
  return this.data.getAmount();
11
26
  }
12
27
  getSwapFee() {
13
28
  return { inInputToken: this.swapFee, inOutputToken: this.swapFeeInToken };
14
29
  }
30
+ serialize() {
31
+ const partialSerialized = super.serialize();
32
+ partialSerialized.amount = (0, Utils_1.serializeBN)(this.amount);
33
+ return partialSerialized;
34
+ }
15
35
  }
16
36
  exports.FromBtcBaseSwap = FromBtcBaseSwap;
@@ -114,5 +114,6 @@ export declare abstract class FromBtcBaseSwapHandler<V extends SwapHandlerSwap<S
114
114
  prefix: string;
115
115
  timeout: string;
116
116
  signature: string;
117
+ feeRate: string;
117
118
  }>;
118
119
  }
@@ -287,7 +287,7 @@ class FromBtcBaseSwapHandler extends SwapHandler_1.SwapHandler {
287
287
  this.logger.debug("getFromBtcSignatureData(): using fee rate from client: ", feeRate);
288
288
  const sigData = yield swapContract.getInitSignature(signer, swapObject, this.config.authorizationTimeout, prefetchedSignData, feeRate);
289
289
  abortSignal.throwIfAborted();
290
- return sigData;
290
+ return Object.assign(Object.assign({}, sigData), { feeRate });
291
291
  });
292
292
  }
293
293
  }
@@ -2,7 +2,13 @@ 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 { ILightningWallet, LightningNetworkChannel } from "../wallets/ILightningWallet";
6
+ import { IIntermediaryStorage } from "../storage/IIntermediaryStorage";
7
+ import { MultichainData } from "./SwapHandler";
8
+ import { ISwapPrice } from "./ISwapPrice";
5
9
  export declare abstract class FromBtcLnBaseSwapHandler<V extends SwapHandlerSwap<SwapData, S>, S> extends FromBtcBaseSwapHandler<V, S> {
10
+ readonly lightning: ILightningWallet;
11
+ constructor(storageDirectory: IIntermediaryStorage<V>, path: string, chains: MultichainData, lightning: ILightningWallet, swapPricing: ISwapPrice);
6
12
  /**
7
13
  * Checks if we have enough inbound liquidity to be able to receive an LN payment (without MPP)
8
14
  *
@@ -11,15 +17,11 @@ export declare abstract class FromBtcLnBaseSwapHandler<V extends SwapHandlerSwap
11
17
  * @param signal
12
18
  * @throws {DefinedRuntimeError} will throw an error if there isn't enough inbound liquidity to receive the LN payment
13
19
  */
14
- protected checkInboundLiquidity(amountBD: BN, channelsPrefetch: Promise<{
15
- channels: any[];
16
- }>, signal: AbortSignal): Promise<void>;
20
+ protected checkInboundLiquidity(amountBD: BN, channelsPrefetch: Promise<LightningNetworkChannel[]>, signal: AbortSignal): Promise<void>;
17
21
  /**
18
22
  * Starts LN channels pre-fetch
19
23
  *
20
24
  * @param abortController
21
25
  */
22
- protected getChannelsPrefetch(abortController: AbortController): Promise<{
23
- channels: any[];
24
- }>;
26
+ protected getChannelsPrefetch(abortController: AbortController): Promise<LightningNetworkChannel[]>;
25
27
  }
@@ -11,9 +11,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.FromBtcLnBaseSwapHandler = void 0;
13
13
  const FromBtcBaseSwapHandler_1 = require("./FromBtcBaseSwapHandler");
14
- const BN = require("bn.js");
15
- const lncli = require("ln-service");
16
14
  class FromBtcLnBaseSwapHandler extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
15
+ constructor(storageDirectory, path, chains, lightning, swapPricing) {
16
+ super(storageDirectory, path, chains, swapPricing);
17
+ this.lightning = lightning;
18
+ }
17
19
  /**
18
20
  * Checks if we have enough inbound liquidity to be able to receive an LN payment (without MPP)
19
21
  *
@@ -27,8 +29,8 @@ class FromBtcLnBaseSwapHandler extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapH
27
29
  const channelsResponse = yield channelsPrefetch;
28
30
  signal.throwIfAborted();
29
31
  let hasEnoughInboundLiquidity = false;
30
- channelsResponse.channels.forEach(channel => {
31
- if (new BN(channel.remote_balance).gte(amountBD))
32
+ channelsResponse.forEach(channel => {
33
+ if (channel.remoteBalance.gte(amountBD))
32
34
  hasEnoughInboundLiquidity = true;
33
35
  });
34
36
  if (!hasEnoughInboundLiquidity) {
@@ -45,7 +47,7 @@ class FromBtcLnBaseSwapHandler extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapH
45
47
  * @param abortController
46
48
  */
47
49
  getChannelsPrefetch(abortController) {
48
- return lncli.getChannels({ is_active: true, lnd: this.LND }).catch(e => {
50
+ return this.lightning.getChannels(true).catch(e => {
49
51
  this.logger.error("getChannelsPrefetch(): error", e);
50
52
  abortController.abort(e);
51
53
  return null;
@@ -1,7 +1,6 @@
1
1
  import { Express, Request } from "express";
2
2
  import { ISwapPrice } from "./ISwapPrice";
3
3
  import { ChainType, ClaimEvent, InitializeEvent, RefundEvent, SwapData, SwapEvent } from "@atomiqlabs/base";
4
- import { AuthenticatedLnd } from "lightning";
5
4
  import { SwapHandlerSwap } from "./SwapHandlerSwap";
6
5
  import { IIntermediaryStorage } from "../storage/IIntermediaryStorage";
7
6
  import * as BN from "bn.js";
@@ -33,7 +32,6 @@ export type SwapBaseConfig = {
33
32
  feePPM: BN;
34
33
  max: BN;
35
34
  min: BN;
36
- maxSkew: number;
37
35
  safetyFactor: BN;
38
36
  swapCheckInterval: number;
39
37
  };
@@ -70,7 +68,6 @@ export declare abstract class SwapHandler<V extends SwapHandlerSwap<SwapData, S>
70
68
  [chainId: string]: Set<string>;
71
69
  };
72
70
  readonly swapPricing: ISwapPrice;
73
- readonly LND: AuthenticatedLnd;
74
71
  abstract config: SwapBaseConfig;
75
72
  logger: {
76
73
  debug: (msg: string, ...args: any) => void;
@@ -84,7 +81,7 @@ export declare abstract class SwapHandler<V extends SwapHandlerSwap<SwapData, S>
84
81
  warn: (swap: SwapHandlerSwap | SwapEvent<SwapData> | SwapData, msg: string, ...args: any) => void;
85
82
  error: (swap: SwapHandlerSwap | SwapEvent<SwapData> | SwapData, msg: string, ...args: any) => void;
86
83
  };
87
- protected constructor(storageDirectory: IIntermediaryStorage<V>, path: string, chainsData: MultichainData, lnd: AuthenticatedLnd, swapPricing: ISwapPrice);
84
+ protected constructor(storageDirectory: IIntermediaryStorage<V>, path: string, chainsData: MultichainData, swapPricing: ISwapPrice);
88
85
  protected getDefaultChain(): ChainData;
89
86
  protected getChain(identifier: string): ChainData;
90
87
  protected abstract processPastSwaps(): Promise<void>;
@@ -28,7 +28,7 @@ var SwapHandlerType;
28
28
  * An abstract class defining a singular swap service
29
29
  */
30
30
  class SwapHandler {
31
- constructor(storageDirectory, path, chainsData, lnd, swapPricing) {
31
+ constructor(storageDirectory, path, chainsData, swapPricing) {
32
32
  this.logger = {
33
33
  debug: (msg, ...args) => console.debug("SwapHandler(" + this.type + "): " + msg, ...args),
34
34
  info: (msg, ...args) => console.info("SwapHandler(" + this.type + "): " + msg, ...args),
@@ -46,7 +46,6 @@ class SwapHandler {
46
46
  if (this.chains.chains[this.chains.default] == null)
47
47
  throw new Error("Invalid default chain specified");
48
48
  this.path = path;
49
- this.LND = lnd;
50
49
  this.swapPricing = swapPricing;
51
50
  this.allowedTokens = {};
52
51
  for (let chainId in chainsData.chains) {
@@ -20,6 +20,10 @@ export declare abstract class SwapHandlerSwap<T extends SwapData = SwapData, S =
20
20
  };
21
21
  readonly swapFee: BN;
22
22
  readonly swapFeeInToken: BN;
23
+ prefix: string;
24
+ timeout: string;
25
+ signature: string;
26
+ feeRate: string;
23
27
  protected constructor(chainIdentifier: string, swapFee: BN, swapFeeInToken: BN);
24
28
  protected constructor(obj: any);
25
29
  serialize(): any;
@@ -23,6 +23,10 @@ class SwapHandlerSwap extends base_1.Lockable {
23
23
  this.state = obj.state;
24
24
  this.swapFee = (0, Utils_1.deserializeBN)(obj.swapFee);
25
25
  this.swapFeeInToken = (0, Utils_1.deserializeBN)(obj.swapFeeInToken);
26
+ this.prefix = obj.prefix;
27
+ this.timeout = obj.timeout;
28
+ this.signature = obj.signature;
29
+ this.feeRate = obj.feeRate;
26
30
  }
27
31
  }
28
32
  serialize() {
@@ -33,7 +37,11 @@ class SwapHandlerSwap extends base_1.Lockable {
33
37
  metadata: this.metadata,
34
38
  txIds: this.txIds,
35
39
  swapFee: (0, Utils_1.serializeBN)(this.swapFee),
36
- swapFeeInToken: (0, Utils_1.serializeBN)(this.swapFeeInToken)
40
+ swapFeeInToken: (0, Utils_1.serializeBN)(this.swapFeeInToken),
41
+ prefix: this.prefix,
42
+ timeout: this.timeout,
43
+ signature: this.signature,
44
+ feeRate: this.feeRate
37
45
  };
38
46
  }
39
47
  /**
@@ -2,11 +2,12 @@ import { SwapHandlerSwap } from "./SwapHandlerSwap";
2
2
  import { SwapData } from "@atomiqlabs/base";
3
3
  import * as BN from "bn.js";
4
4
  export declare abstract class ToBtcBaseSwap<T extends SwapData = SwapData, S = any> extends SwapHandlerSwap<T, S> {
5
+ amount: BN;
5
6
  quotedNetworkFee: BN;
6
7
  readonly quotedNetworkFeeInToken: BN;
7
8
  realNetworkFee: BN;
8
9
  realNetworkFeeInToken: BN;
9
- protected constructor(chainIdentifier: string, swapFee: BN, swapFeeInToken: BN, quotedNetworkFee: BN, quotedNetworkFeeInToken: BN);
10
+ protected constructor(chainIdentifier: string, amount: BN, swapFee: BN, swapFeeInToken: BN, quotedNetworkFee: BN, quotedNetworkFeeInToken: BN);
10
11
  protected constructor(obj: any);
11
12
  serialize(): any;
12
13
  setRealNetworkFee(networkFeeInBtc: BN): void;
@@ -32,4 +33,5 @@ export declare abstract class ToBtcBaseSwap<T extends SwapData = SwapData, S = a
32
33
  inInputToken: BN;
33
34
  inOutputToken: BN;
34
35
  };
36
+ getOutputAmount(): BN;
35
37
  }
@@ -5,15 +5,17 @@ const SwapHandlerSwap_1 = require("./SwapHandlerSwap");
5
5
  const BN = require("bn.js");
6
6
  const Utils_1 = require("../utils/Utils");
7
7
  class ToBtcBaseSwap extends SwapHandlerSwap_1.SwapHandlerSwap {
8
- constructor(obj, swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken) {
9
- if (typeof (obj) === "string" && BN.isBN(swapFee) && BN.isBN(swapFeeInToken) && BN.isBN(quotedNetworkFee) && BN.isBN(quotedNetworkFeeInToken)) {
8
+ constructor(obj, amount, swapFee, swapFeeInToken, quotedNetworkFee, quotedNetworkFeeInToken) {
9
+ if (typeof (obj) === "string" && BN.isBN(amount) && BN.isBN(swapFee) && BN.isBN(swapFeeInToken) && BN.isBN(quotedNetworkFee) && BN.isBN(quotedNetworkFeeInToken)) {
10
10
  super(obj, swapFee, swapFeeInToken);
11
+ this.amount = amount;
11
12
  this.quotedNetworkFee = quotedNetworkFee;
12
13
  this.quotedNetworkFeeInToken = quotedNetworkFeeInToken;
13
14
  return;
14
15
  }
15
16
  else {
16
17
  super(obj);
18
+ this.amount = (0, Utils_1.deserializeBN)(obj.amount);
17
19
  this.quotedNetworkFee = (0, Utils_1.deserializeBN)(obj.quotedNetworkFee);
18
20
  this.quotedNetworkFeeInToken = (0, Utils_1.deserializeBN)(obj.quotedNetworkFeeInToken);
19
21
  this.realNetworkFee = (0, Utils_1.deserializeBN)(obj.realNetworkFee);
@@ -22,6 +24,7 @@ class ToBtcBaseSwap extends SwapHandlerSwap_1.SwapHandlerSwap {
22
24
  }
23
25
  serialize() {
24
26
  const obj = super.serialize();
27
+ obj.amount = (0, Utils_1.serializeBN)(this.amount);
25
28
  obj.quotedNetworkFee = (0, Utils_1.serializeBN)(this.quotedNetworkFee);
26
29
  obj.quotedNetworkFeeInToken = (0, Utils_1.serializeBN)(this.quotedNetworkFeeInToken);
27
30
  obj.realNetworkFee = (0, Utils_1.serializeBN)(this.realNetworkFee);
@@ -57,5 +60,8 @@ class ToBtcBaseSwap extends SwapHandlerSwap_1.SwapHandlerSwap {
57
60
  getRealNetworkFee() {
58
61
  return { inInputToken: this.realNetworkFeeInToken, inOutputToken: this.realNetworkFee };
59
62
  }
63
+ getOutputAmount() {
64
+ return this.amount;
65
+ }
60
66
  }
61
67
  exports.ToBtcBaseSwap = ToBtcBaseSwap;
@@ -90,5 +90,6 @@ export declare abstract class ToBtcBaseSwapHandler<V extends SwapHandlerSwap<Swa
90
90
  prefix: string;
91
91
  timeout: string;
92
92
  signature: string;
93
+ feeRate: string;
93
94
  }>;
94
95
  }
@@ -226,7 +226,7 @@ class ToBtcBaseSwapHandler extends SwapHandler_1.SwapHandler {
226
226
  const { swapContract, signer } = this.getChain(chainIdentifier);
227
227
  const sigData = yield swapContract.getInitSignature(signer, swapObject, this.config.authorizationTimeout, prefetchedSignData, feeRate);
228
228
  abortSignal.throwIfAborted();
229
- return sigData;
229
+ return Object.assign(Object.assign({}, sigData), { feeRate });
230
230
  });
231
231
  }
232
232
  }
@@ -4,12 +4,10 @@ import { FromBtcSwapAbs, FromBtcSwapState } from "./FromBtcSwapAbs";
4
4
  import { MultichainData, SwapHandlerType } from "../SwapHandler";
5
5
  import { ISwapPrice } from "../ISwapPrice";
6
6
  import { ClaimEvent, InitializeEvent, RefundEvent, SwapData } from "@atomiqlabs/base";
7
- import { AuthenticatedLnd } from "lightning";
8
- import * as bitcoin from "bitcoinjs-lib";
9
7
  import { IIntermediaryStorage } from "../../storage/IIntermediaryStorage";
10
8
  import { FromBtcBaseConfig, FromBtcBaseSwapHandler } from "../FromBtcBaseSwapHandler";
9
+ import { IBitcoinWallet } from "../../wallets/IBitcoinWallet";
11
10
  export type FromBtcConfig = FromBtcBaseConfig & {
12
- bitcoinNetwork: bitcoin.networks.Network;
13
11
  confirmations: number;
14
12
  swapCsvDelta: number;
15
13
  };
@@ -28,13 +26,13 @@ export declare class FromBtcAbs extends FromBtcBaseSwapHandler<FromBtcSwapAbs, F
28
26
  readonly config: FromBtcConfig & {
29
27
  swapTsCsvDelta: BN;
30
28
  };
31
- constructor(storageDirectory: IIntermediaryStorage<FromBtcSwapAbs>, path: string, chains: MultichainData, lnd: AuthenticatedLnd, swapPricing: ISwapPrice, config: FromBtcConfig);
29
+ readonly bitcoin: IBitcoinWallet;
30
+ constructor(storageDirectory: IIntermediaryStorage<FromBtcSwapAbs>, path: string, chains: MultichainData, bitcoin: IBitcoinWallet, swapPricing: ISwapPrice, config: FromBtcConfig);
32
31
  /**
33
32
  * Returns the TXO hash of the specific address and amount - sha256(u64le(amount) + outputScript(address))
34
33
  *
35
34
  * @param address
36
35
  * @param amount
37
- * @param bitcoinNetwork
38
36
  */
39
37
  private getTxoHash;
40
38
  /**