@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
package/dist/index.d.ts CHANGED
@@ -22,7 +22,6 @@ export * from "./swaps/SwapHandlerSwap";
22
22
  export * from "./plugins/PluginManager";
23
23
  export * from "./plugins/IPlugin";
24
24
  export * from "./fees/IBtcFeeEstimator";
25
- export * from "./fees/OneDollarFeeEstimator";
26
25
  export * from "./utils/paramcoders/IParamReader";
27
26
  export * from "./utils/paramcoders/IParamWriter";
28
27
  export * from "./utils/paramcoders/LegacyParamEncoder";
@@ -31,3 +30,5 @@ export * from "./utils/paramcoders/ParamEncoder";
31
30
  export * from "./utils/paramcoders/SchemaVerifier";
32
31
  export * from "./utils/paramcoders/server/ServerParamDecoder";
33
32
  export * from "./utils/paramcoders/server/ServerParamEncoder";
33
+ export * from "./wallets/IBitcoinWallet";
34
+ export * from "./wallets/ILightningWallet";
package/dist/index.js CHANGED
@@ -14,9 +14,6 @@ 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);
@@ -41,7 +38,6 @@ __exportStar(require("./swaps/SwapHandlerSwap"), exports);
41
38
  __exportStar(require("./plugins/PluginManager"), exports);
42
39
  __exportStar(require("./plugins/IPlugin"), exports);
43
40
  __exportStar(require("./fees/IBtcFeeEstimator"), exports);
44
- __exportStar(require("./fees/OneDollarFeeEstimator"), exports);
45
41
  __exportStar(require("./utils/paramcoders/IParamReader"), exports);
46
42
  __exportStar(require("./utils/paramcoders/IParamWriter"), exports);
47
43
  __exportStar(require("./utils/paramcoders/LegacyParamEncoder"), exports);
@@ -50,3 +46,5 @@ __exportStar(require("./utils/paramcoders/ParamEncoder"), exports);
50
46
  __exportStar(require("./utils/paramcoders/SchemaVerifier"), exports);
51
47
  __exportStar(require("./utils/paramcoders/server/ServerParamDecoder"), exports);
52
48
  __exportStar(require("./utils/paramcoders/server/ServerParamEncoder"), exports);
49
+ __exportStar(require("./wallets/IBitcoinWallet"), exports);
50
+ __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);
@@ -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
  /**
@@ -11,11 +11,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.FromBtcAbs = void 0;
13
13
  const BN = require("bn.js");
14
- const lncli = require("ln-service");
15
14
  const FromBtcSwapAbs_1 = require("./FromBtcSwapAbs");
16
15
  const SwapHandler_1 = require("../SwapHandler");
17
16
  const base_1 = require("@atomiqlabs/base");
18
- const bitcoin = require("bitcoinjs-lib");
19
17
  const crypto_1 = require("crypto");
20
18
  const Utils_1 = require("../../utils/Utils");
21
19
  const PluginManager_1 = require("../../plugins/PluginManager");
@@ -26,22 +24,20 @@ const FromBtcBaseSwapHandler_1 = require("../FromBtcBaseSwapHandler");
26
24
  * Swap handler handling from BTC swaps using PTLCs (proof-time locked contracts) and btc relay (on-chain bitcoin SPV)
27
25
  */
28
26
  class FromBtcAbs extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
29
- constructor(storageDirectory, path, chains, lnd, swapPricing, config) {
30
- super(storageDirectory, path, chains, lnd, swapPricing);
27
+ constructor(storageDirectory, path, chains, bitcoin, swapPricing, config) {
28
+ super(storageDirectory, path, chains, swapPricing);
31
29
  this.type = SwapHandler_1.SwapHandlerType.FROM_BTC;
32
- const anyConfig = config;
33
- anyConfig.swapTsCsvDelta = new BN(config.swapCsvDelta).mul(config.bitcoinBlocktime.div(config.safetyFactor));
34
- this.config = anyConfig;
30
+ this.bitcoin = bitcoin;
31
+ this.config = Object.assign(Object.assign({}, config), { swapTsCsvDelta: new BN(config.swapCsvDelta).mul(config.bitcoinBlocktime.div(config.safetyFactor)) });
35
32
  }
36
33
  /**
37
34
  * Returns the TXO hash of the specific address and amount - sha256(u64le(amount) + outputScript(address))
38
35
  *
39
36
  * @param address
40
37
  * @param amount
41
- * @param bitcoinNetwork
42
38
  */
43
- getTxoHash(address, amount, bitcoinNetwork) {
44
- const parsedOutputScript = bitcoin.address.toOutputScript(address, bitcoinNetwork);
39
+ getTxoHash(address, amount) {
40
+ const parsedOutputScript = this.bitcoin.toOutputScript(address);
45
41
  return (0, crypto_1.createHash)("sha256").update(Buffer.concat([
46
42
  Buffer.from(amount.toArray("le", 8)),
47
43
  parsedOutputScript
@@ -55,7 +51,7 @@ class FromBtcAbs extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
55
51
  * @param amount
56
52
  */
57
53
  getHash(chainIdentifier, address, amount) {
58
- const parsedOutputScript = bitcoin.address.toOutputScript(address, this.config.bitcoinNetwork);
54
+ const parsedOutputScript = this.bitcoin.toOutputScript(address);
59
55
  const { swapContract } = this.getChain(chainIdentifier);
60
56
  return swapContract.getHashForOnchain(parsedOutputScript, amount, new BN(0));
61
57
  }
@@ -68,13 +64,10 @@ class FromBtcAbs extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
68
64
  */
69
65
  processPastSwap(swap) {
70
66
  return __awaiter(this, void 0, void 0, function* () {
71
- //Current time, minus maximum chain time skew
72
- const currentTime = new BN(Math.floor(Date.now() / 1000) - this.config.maxSkew);
73
- const { swapContract } = this.getChain(swap.chainIdentifier);
67
+ const { swapContract, signer } = this.getChain(swap.chainIdentifier);
74
68
  //Once authorization expires in CREATED state, the user can no more commit it on-chain
75
69
  if (swap.state === FromBtcSwapAbs_1.FromBtcSwapState.CREATED) {
76
- const isExpired = swap.authorizationExpiry.lt(currentTime);
77
- if (!isExpired)
70
+ if (!(yield swapContract.isInitAuthorizationExpired(swap.data, swap)))
78
71
  return false;
79
72
  const isCommited = yield swapContract.isCommited(swap.data);
80
73
  if (isCommited) {
@@ -84,14 +77,13 @@ class FromBtcAbs extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
84
77
  return false;
85
78
  }
86
79
  this.swapLogger.info(swap, "processPastSwap(state=CREATED): removing past swap due to authorization expiry, address: " + swap.address);
80
+ yield this.bitcoin.addUnusedAddress(swap.address);
87
81
  yield this.removeSwapData(swap, FromBtcSwapAbs_1.FromBtcSwapState.CANCELED);
88
82
  return false;
89
83
  }
90
- const expiryTime = swap.data.getExpiry();
91
84
  //Check if commited swap expired by now
92
85
  if (swap.state === FromBtcSwapAbs_1.FromBtcSwapState.COMMITED) {
93
- const isExpired = expiryTime.lt(currentTime);
94
- if (!isExpired)
86
+ if (!swapContract.isExpired(signer.getAddress(), swap.data))
95
87
  return false;
96
88
  const isCommited = yield swapContract.isCommited(swap.data);
97
89
  if (isCommited) {
@@ -201,6 +193,7 @@ class FromBtcAbs extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
201
193
  return;
202
194
  savedSwap.txIds.refund = (_a = event.meta) === null || _a === void 0 ? void 0 : _a.txId;
203
195
  this.swapLogger.info(event, "SC: RefundEvent: swap refunded, address: " + savedSwap.address);
196
+ yield this.bitcoin.addUnusedAddress(savedSwap.address);
204
197
  yield this.removeSwapData(savedSwap, FromBtcSwapAbs_1.FromBtcSwapState.REFUNDED);
205
198
  });
206
199
  }
@@ -316,10 +309,7 @@ class FromBtcAbs extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
316
309
  yield this.checkBalance(totalInToken, balancePrefetch, abortController.signal);
317
310
  metadata.times.balanceChecked = Date.now();
318
311
  //Create swap receive bitcoin address
319
- const { address: receiveAddress } = yield lncli.createChainAddress({
320
- lnd: this.LND,
321
- format: "p2wpkh"
322
- });
312
+ const receiveAddress = yield this.bitcoin.getAddress();
323
313
  abortController.signal.throwIfAborted();
324
314
  metadata.times.addressCreated = Date.now();
325
315
  const paymentHash = this.getHash(chainIdentifier, receiveAddress, amountBD);
@@ -334,7 +324,7 @@ class FromBtcAbs extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
334
324
  metadata.times.claimerBountyCalculated = Date.now();
335
325
  //Create swap data
336
326
  const data = yield swapContract.createSwapData(base_1.ChainSwapType.CHAIN, signer.getAddress(), parsedBody.address, useToken, totalInToken, paymentHash.toString("hex"), parsedBody.sequence, expiry, new BN(0), this.config.confirmations, false, true, totalSecurityDeposit, totalClaimerBounty);
337
- data.setTxoHash(this.getTxoHash(receiveAddress, amountBD, this.config.bitcoinNetwork).toString("hex"));
327
+ data.setTxoHash(this.getTxoHash(receiveAddress, amountBD).toString("hex"));
338
328
  abortController.signal.throwIfAborted();
339
329
  metadata.times.swapCreated = Date.now();
340
330
  //Sign the swap
@@ -343,7 +333,10 @@ class FromBtcAbs extends FromBtcBaseSwapHandler_1.FromBtcBaseSwapHandler {
343
333
  const createdSwap = new FromBtcSwapAbs_1.FromBtcSwapAbs(chainIdentifier, receiveAddress, amountBD, swapFee, swapFeeInToken);
344
334
  createdSwap.data = data;
345
335
  createdSwap.metadata = metadata;
346
- createdSwap.authorizationExpiry = new BN(sigData.timeout);
336
+ createdSwap.prefix = sigData.prefix;
337
+ createdSwap.timeout = sigData.timeout;
338
+ createdSwap.signature = sigData.signature;
339
+ createdSwap.feeRate = sigData.feeRate;
347
340
  yield PluginManager_1.PluginManager.swapCreate(createdSwap);
348
341
  yield this.storageManager.saveData(createdSwap.data.getHash(), createdSwap.data.getSequence(), createdSwap);
349
342
  this.swapLogger.info(createdSwap, "REST: /getAddress: Created swap address: " + receiveAddress + " amount: " + amountBD.toString(10));
@@ -1,6 +1,5 @@
1
1
  /// <reference types="node" />
2
2
  import * as BN from "bn.js";
3
- import * as bitcoin from "bitcoinjs-lib";
4
3
  import { SwapData } from "@atomiqlabs/base";
5
4
  import { FromBtcBaseSwap } from "../FromBtcBaseSwap";
6
5
  export declare enum FromBtcSwapState {
@@ -12,13 +11,11 @@ export declare enum FromBtcSwapState {
12
11
  }
13
12
  export declare class FromBtcSwapAbs<T extends SwapData = SwapData> extends FromBtcBaseSwap<T, FromBtcSwapState> {
14
13
  readonly address: string;
15
- readonly amount: BN;
16
- authorizationExpiry: BN;
17
14
  txId: string;
18
15
  constructor(chainIdentifier: string, address: string, amount: BN, swapFee: BN, swapFeeInToken: BN);
19
16
  constructor(obj: any);
20
17
  serialize(): any;
21
- getTxoHash(bitcoinNetwork: bitcoin.networks.Network): Buffer;
18
+ getTxoHash(): Buffer;
22
19
  isInitiated(): boolean;
23
20
  isFailed(): boolean;
24
21
  isSuccess(): boolean;
@@ -1,11 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FromBtcSwapAbs = exports.FromBtcSwapState = void 0;
4
- const BN = require("bn.js");
5
- const bitcoin = require("bitcoinjs-lib");
6
- const crypto_1 = require("crypto");
7
4
  const SwapHandler_1 = require("../SwapHandler");
8
- const Utils_1 = require("../../utils/Utils");
9
5
  const FromBtcBaseSwap_1 = require("../FromBtcBaseSwap");
10
6
  var FromBtcSwapState;
11
7
  (function (FromBtcSwapState) {
@@ -18,16 +14,13 @@ var FromBtcSwapState;
18
14
  class FromBtcSwapAbs extends FromBtcBaseSwap_1.FromBtcBaseSwap {
19
15
  constructor(prOrObj, address, amount, swapFee, swapFeeInToken) {
20
16
  if (typeof (prOrObj) === "string") {
21
- super(prOrObj, swapFee, swapFeeInToken);
17
+ super(prOrObj, amount, swapFee, swapFeeInToken);
22
18
  this.state = FromBtcSwapState.CREATED;
23
19
  this.address = address;
24
- this.amount = amount;
25
20
  }
26
21
  else {
27
22
  super(prOrObj);
28
23
  this.address = prOrObj.address;
29
- this.amount = new BN(prOrObj.amount);
30
- this.authorizationExpiry = (0, Utils_1.deserializeBN)(prOrObj.authorizationExpiry);
31
24
  this.txId = prOrObj.txId;
32
25
  }
33
26
  this.type = SwapHandler_1.SwapHandlerType.FROM_BTC;
@@ -35,17 +28,11 @@ class FromBtcSwapAbs extends FromBtcBaseSwap_1.FromBtcBaseSwap {
35
28
  serialize() {
36
29
  const partialSerialized = super.serialize();
37
30
  partialSerialized.address = this.address;
38
- partialSerialized.amount = this.amount.toString(10);
39
- partialSerialized.authorizationExpiry = (0, Utils_1.serializeBN)(this.authorizationExpiry);
40
31
  partialSerialized.txId = this.txId;
41
32
  return partialSerialized;
42
33
  }
43
- getTxoHash(bitcoinNetwork) {
44
- const parsedOutputScript = bitcoin.address.toOutputScript(this.address, bitcoinNetwork);
45
- return (0, crypto_1.createHash)("sha256").update(Buffer.concat([
46
- Buffer.from(this.amount.toArray("le", 8)),
47
- parsedOutputScript
48
- ])).digest();
34
+ getTxoHash() {
35
+ return Buffer.from(this.data.getTxoHash(), "hex");
49
36
  }
50
37
  isInitiated() {
51
38
  return this.state !== FromBtcSwapState.CREATED;