lightning 5.11.0 → 5.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Versions
2
2
 
3
+ ## 5.13.1
4
+
5
+ - `signTransaction`: Fix multi-input signing for upcoming Taproot API changes
6
+
7
+ ## 5.13.0
8
+
9
+ - `addExternalSocket`: Add method to add a socket to graph announcements
10
+ - `removeExternalSocket`: Add method to remove sockets from graph announcements
11
+
12
+ ## 5.12.0
13
+
14
+ - `getWalletVersion`: Add support for LND 0.14.3-beta
15
+
3
16
  ## 5.11.0
4
17
 
5
18
  - `updateAlias`: Add method to update the node graph announcement alias
package/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ const {addExternalSocket} = require('./lnd_methods');
1
2
  const {addPeer} = require('./lnd_methods');
2
3
  const {authenticatedLndGrpc} = require('./lnd_grpc');
3
4
  const {broadcastChainTransaction} = require('./lnd_methods');
@@ -88,6 +89,7 @@ const {probeForRoute} = require('./lnd_methods');
88
89
  const {proposeChannel} = require('./lnd_methods');
89
90
  const {recoverFundsFromChannel} = require('./lnd_methods');
90
91
  const {recoverFundsFromChannels} = require('./lnd_methods');
92
+ const {removeExternalSocket} = require('./lnd_methods');
91
93
  const {removePeer} = require('./lnd_methods');
92
94
  const {requestChainFeeIncrease} = require('./lnd_methods');
93
95
  const {revokeAccess} = require('./lnd_methods');
@@ -140,6 +142,7 @@ const {verifyBytesSignature} = require('./lnd_methods');
140
142
  const {verifyMessage} = require('./lnd_methods');
141
143
 
142
144
  module.exports = {
145
+ addExternalSocket,
143
146
  addPeer,
144
147
  authenticatedLndGrpc,
145
148
  broadcastChainTransaction,
@@ -230,6 +233,7 @@ module.exports = {
230
233
  proposeChannel,
231
234
  recoverFundsFromChannel,
232
235
  recoverFundsFromChannels,
236
+ removeExternalSocket,
233
237
  removePeer,
234
238
  requestChainFeeIncrease,
235
239
  revokeAccess,
@@ -1,3 +1,4 @@
1
+ const {addExternalSocket} = require('./peers');
1
2
  const {addPeer} = require('./peers');
2
3
  const {broadcastChainTransaction} = require('./onchain');
3
4
  const {cancelHodlInvoice} = require('./invoices');
@@ -85,6 +86,7 @@ const {probeForRoute} = require('./offchain');
85
86
  const {proposeChannel} = require('./onchain');
86
87
  const {recoverFundsFromChannel} = require('./offchain');
87
88
  const {recoverFundsFromChannels} = require('./offchain');
89
+ const {removeExternalSocket} = require('./peers');
88
90
  const {removePeer} = require('./peers');
89
91
  const {requestChainFeeIncrease} = require('./onchain');
90
92
  const {revokeAccess} = require('./macaroon');
@@ -136,6 +138,7 @@ const {verifyBytesSignature} = require('./signer');
136
138
  const {verifyMessage} = require('./message');
137
139
 
138
140
  module.exports = {
141
+ addExternalSocket,
139
142
  addPeer,
140
143
  broadcastChainTransaction,
141
144
  cancelHodlInvoice,
@@ -223,6 +226,7 @@ module.exports = {
223
226
  proposeChannel,
224
227
  recoverFundsFromChannel,
225
228
  recoverFundsFromChannels,
229
+ removeExternalSocket,
226
230
  removePeer,
227
231
  requestChainFeeIncrease,
228
232
  revokeAccess,
@@ -31,6 +31,7 @@
31
31
  "7f34774529fa0964d47fc418d4d2965435cbfdc0": "0.11.1-beta",
32
32
  "86d3dec7b939b21bb10f2cd1ff56970c392a1c69": "0.13.2-beta",
33
33
  "86114c575c2dff9dff1e1bb4df961c64aea9fc1c": "0.10.4-beta",
34
+ "bd0c46b4fcb027af1915bd67a3da70e8ca5c6efe": "0.14.3-beta",
34
35
  "d176d2d65fc06e6631c4dc9478592be8545a21de": "0.12.0-beta",
35
36
  "d233f61383f2f950aa06f5b09da5b0e78e784fae": "0.12.1-beta",
36
37
  "d62c575f8499a314eb27f12462d20500b6bda2c7": "0.10.3-beta",
@@ -1,4 +1,8 @@
1
1
  {
2
+ "addExternalSocket": {
3
+ "method": "updateNodeAnnouncement",
4
+ "type": "peers"
5
+ },
2
6
  "addPeer": {
3
7
  "method": "ConnectPeer",
4
8
  "type": "default"
@@ -338,6 +342,10 @@
338
342
  "method": "restoreChannelBackups",
339
343
  "type": "default"
340
344
  },
345
+ "removeExternalSocket": {
346
+ "method": "updateNodeAnnouncement",
347
+ "type": "peers"
348
+ },
341
349
  "removePeer": {
342
350
  "method": "DisconnectPeer",
343
351
  "type": "default"
@@ -0,0 +1,62 @@
1
+ const asyncAuto = require('async/auto');
2
+ const {returnResult} = require('asyncjs-util');
3
+
4
+ const {isLnd} = require('./../../lnd_requests');
5
+
6
+ const action = 0;
7
+ const errorUnimplemented = 'unknown service peersrpc.Peers';
8
+ const method = 'updateNodeAnnouncement';
9
+ const type = 'peers';
10
+
11
+ /** Add a new advertised p2p socket address
12
+
13
+ Note: this method is not supported in LND versions 0.14.3 and below
14
+
15
+ Requires LND built with `peersrpc` build tag
16
+
17
+ Requires `peers:write` permissions
18
+
19
+ {
20
+ lnd: <Authenticated LND API Object>
21
+ socket: <Add Socket Address String>
22
+ }
23
+
24
+ @returns via cbk or Promise
25
+ */
26
+ module.exports = ({lnd, socket}, cbk) => {
27
+ return new Promise((resolve, reject) => {
28
+ return asyncAuto({
29
+ // Check arguments
30
+ validate: cbk => {
31
+ if (!isLnd({lnd, method, type})) {
32
+ return cbk([400, 'ExpectedLndToAddExternalSocket']);
33
+ }
34
+
35
+ if (!socket) {
36
+ return cbk([400, 'ExpectedHostAndPortOfSocketToAdd']);
37
+ }
38
+
39
+ return cbk();
40
+ },
41
+
42
+ // Add external socket to be advertised
43
+ add: ['validate', ({}, cbk) => {
44
+ return lnd[type][method]({
45
+ address_updates: [{action, address: socket}],
46
+ },
47
+ err => {
48
+ if (!!err && err.details === errorUnimplemented) {
49
+ return cbk([400, 'ExpectedPeersRpcLndBuildTagToAddSocket']);
50
+ }
51
+
52
+ if (!!err) {
53
+ return cbk([503, 'UnexpectedErrorAddingExternalSocket', {err}]);
54
+ }
55
+
56
+ return cbk();
57
+ });
58
+ }],
59
+ },
60
+ returnResult({reject, resolve}, cbk));
61
+ });
62
+ };
@@ -1,13 +1,17 @@
1
+ const addExternalSocket = require('./add_external_socket');
1
2
  const addPeer = require('./add_peer');
2
3
  const getPeers = require('./get_peers');
4
+ const removeExternalSocket = require('./remove_external_socket');
3
5
  const removePeer = require('./remove_peer');
4
6
  const subscribeToPeers = require('./subscribe_to_peers');
5
7
  const updateAlias = require('./update_alias');
6
8
  const updateColor = require('./update_color');
7
9
 
8
10
  module.exports = {
11
+ addExternalSocket,
9
12
  addPeer,
10
13
  getPeers,
14
+ removeExternalSocket,
11
15
  removePeer,
12
16
  subscribeToPeers,
13
17
  updateAlias,
@@ -0,0 +1,62 @@
1
+ const asyncAuto = require('async/auto');
2
+ const {returnResult} = require('asyncjs-util');
3
+
4
+ const {isLnd} = require('./../../lnd_requests');
5
+
6
+ const action = 1;
7
+ const errorUnimplemented = 'unknown service peersrpc.Peers';
8
+ const method = 'updateNodeAnnouncement';
9
+ const type = 'peers';
10
+
11
+ /** Remove an existing advertised p2p socket address
12
+
13
+ Note: this method is not supported in LND versions 0.14.3 and below
14
+
15
+ Requires LND built with `peersrpc` build tag
16
+
17
+ Requires `peers:write` permissions
18
+
19
+ {
20
+ lnd: <Authenticated LND API Object>
21
+ socket: <Remove Socket Address String>
22
+ }
23
+
24
+ @returns via cbk or Promise
25
+ */
26
+ module.exports = ({lnd, socket}, cbk) => {
27
+ return new Promise((resolve, reject) => {
28
+ return asyncAuto({
29
+ // Check arguments
30
+ validate: cbk => {
31
+ if (!isLnd({lnd, method, type})) {
32
+ return cbk([400, 'ExpectedLndToRemoveExternalSocket']);
33
+ }
34
+
35
+ if (!socket) {
36
+ return cbk([400, 'ExpectedHostAndPortOfSocketToRemove']);
37
+ }
38
+
39
+ return cbk();
40
+ },
41
+
42
+ // Stop external socket from being advertised
43
+ add: ['validate', ({}, cbk) => {
44
+ return lnd[type][method]({
45
+ address_updates: [{action, address: socket}],
46
+ },
47
+ err => {
48
+ if (!!err && err.details === errorUnimplemented) {
49
+ return cbk([400, 'ExpectedPeersRpcLndBuildTagToRemoveSocket']);
50
+ }
51
+
52
+ if (!!err) {
53
+ return cbk([503, 'UnexpectedErrorRemovingExternalSocket', {err}]);
54
+ }
55
+
56
+ return cbk();
57
+ });
58
+ }],
59
+ },
60
+ returnResult({reject, resolve}, cbk));
61
+ });
62
+ };
@@ -16,7 +16,7 @@ const type = 'peers';
16
16
  Requires `peers:write` permissions
17
17
 
18
18
  {
19
- color: <Node Color #000000 String>
19
+ alias: <Node Alias String>
20
20
  lnd: <Authenticated LND API Object>
21
21
  }
22
22
 
@@ -11,7 +11,7 @@ const type = 'peers';
11
11
 
12
12
  Note: this method is not supported in LND versions 0.14.3 and below
13
13
 
14
- Requires LND built with `signrpc` build tag
14
+ Requires LND built with `peersrpc` build tag
15
15
 
16
16
  Requires `peers:write` permissions
17
17
 
@@ -6,6 +6,7 @@ const {isLnd} = require('./../../lnd_requests');
6
6
  const bufferAsHex = buffer => buffer.toString('hex');
7
7
  const hexAsBuffer = hex => Buffer.from(hex, 'hex');
8
8
  const {isArray} = Array;
9
+ const isV1 = scriptHex => scriptHex.length === 68 && /5120/.test(scriptHex);
9
10
  const method = 'signOutputRaw';
10
11
  const notFound = -1;
11
12
  const type = 'signer';
@@ -64,13 +65,27 @@ module.exports = ({inputs, lnd, spending, transaction}, cbk) => {
64
65
  return cbk();
65
66
  },
66
67
 
68
+ // Derive the previous outputs set
69
+ previousOutputs: ['validate', ({}, cbk) => {
70
+ const outputs = [].concat(inputs).concat(spending || []).map(utxo => ({
71
+ pk_script: hexAsBuffer(utxo.output_script),
72
+ value: utxo.output_tokens,
73
+ }));
74
+
75
+ const v1Spends = outputs.filter(n => isV1(bufferAsHex(n.pk_script)));
76
+
77
+ // Exit early when there is no need to provide prev outs, non-taproot
78
+ if (!v1Spends.length) {
79
+ return cbk();
80
+ }
81
+
82
+ return cbk(null, outputs);
83
+ }],
84
+
67
85
  // Get signatures
68
- signTransaction: ['validate', ({}, cbk) => {
86
+ signTransaction: ['previousOutputs', ({previousOutputs}, cbk) => {
69
87
  return lnd[type][method]({
70
- prev_outputs: [].concat(inputs).concat(spending || []).map(utxo => ({
71
- pk_script: hexAsBuffer(utxo.output_script),
72
- value: utxo.output_tokens,
73
- })),
88
+ prev_outputs: previousOutputs,
74
89
  raw_tx_bytes: hexAsBuffer(transaction),
75
90
  sign_descs: inputs.map(input => ({
76
91
  input_index: input.vin,
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "url": "https://github.com/alexbosworth/lightning/issues"
8
8
  },
9
9
  "dependencies": {
10
- "@grpc/grpc-js": "1.6.6",
10
+ "@grpc/grpc-js": "1.6.7",
11
11
  "@grpc/proto-loader": "0.6.9",
12
12
  "@types/express": "4.17.13",
13
13
  "@types/node": "17.0.25",
@@ -59,5 +59,5 @@
59
59
  "directory": "test/typescript"
60
60
  },
61
61
  "types": "index.d.ts",
62
- "version": "5.11.0"
62
+ "version": "5.13.1"
63
63
  }
@@ -0,0 +1,56 @@
1
+ const {test} = require('@alexbosworth/tap');
2
+
3
+ const {addExternalSocket} = require('./../../../');
4
+
5
+ const makeLnd = ({err}) => {
6
+ return {peers: {updateNodeAnnouncement: (args, cbk) => cbk(err)}};
7
+ };
8
+
9
+ const makeArgs = overrides => {
10
+ const args = {lnd: makeLnd({}), socket: '127.0.0.1:9735'};
11
+
12
+ Object.keys(overrides).forEach(key => args[key] = overrides[key]);
13
+
14
+ return args;
15
+ };
16
+
17
+ const tests = [
18
+ {
19
+ args: makeArgs({lnd: undefined}),
20
+ description: 'LND is required to add an external socket',
21
+ error: [400, 'ExpectedLndToAddExternalSocket'],
22
+ },
23
+ {
24
+ args: makeArgs({socket: undefined}),
25
+ description: 'A socket is required to add an external socket',
26
+ error: [400, 'ExpectedHostAndPortOfSocketToAdd'],
27
+ },
28
+ {
29
+ args: makeArgs({
30
+ lnd: makeLnd({err: {details: 'unknown service peersrpc.Peers'}}),
31
+ }),
32
+ description: 'LND with peersrpc is required to add an external socket',
33
+ error: [400, 'ExpectedPeersRpcLndBuildTagToAddSocket'],
34
+ },
35
+ {
36
+ args: makeArgs({lnd: makeLnd({err: 'err'})}),
37
+ description: 'LND error is returned',
38
+ error: [503, 'UnexpectedErrorAddingExternalSocket', {err: 'err'}],
39
+ },
40
+ {
41
+ args: makeArgs({}),
42
+ description: 'Socket added successfully',
43
+ },
44
+ ];
45
+
46
+ tests.forEach(({args, description, error, expected}) => {
47
+ return test(description, async ({deepEqual, end, equal, rejects}) => {
48
+ if (!!error) {
49
+ await rejects(() => addExternalSocket(args), error, 'Got error');
50
+ } else {
51
+ await addExternalSocket(args);
52
+ }
53
+
54
+ return end();
55
+ });
56
+ });
@@ -0,0 +1,56 @@
1
+ const {test} = require('@alexbosworth/tap');
2
+
3
+ const {removeExternalSocket} = require('./../../../');
4
+
5
+ const makeLnd = ({err}) => {
6
+ return {peers: {updateNodeAnnouncement: (args, cbk) => cbk(err)}};
7
+ };
8
+
9
+ const makeArgs = overrides => {
10
+ const args = {lnd: makeLnd({}), socket: '127.0.0.1:9735'};
11
+
12
+ Object.keys(overrides).forEach(key => args[key] = overrides[key]);
13
+
14
+ return args;
15
+ };
16
+
17
+ const tests = [
18
+ {
19
+ args: makeArgs({lnd: undefined}),
20
+ description: 'LND is required to remove an external socket',
21
+ error: [400, 'ExpectedLndToRemoveExternalSocket'],
22
+ },
23
+ {
24
+ args: makeArgs({socket: undefined}),
25
+ description: 'A socket is required to remove an external socket',
26
+ error: [400, 'ExpectedHostAndPortOfSocketToRemove'],
27
+ },
28
+ {
29
+ args: makeArgs({
30
+ lnd: makeLnd({err: {details: 'unknown service peersrpc.Peers'}}),
31
+ }),
32
+ description: 'LND with peersrpc is required to add an external socket',
33
+ error: [400, 'ExpectedPeersRpcLndBuildTagToRemoveSocket'],
34
+ },
35
+ {
36
+ args: makeArgs({lnd: makeLnd({err: 'err'})}),
37
+ description: 'LND error is returned',
38
+ error: [503, 'UnexpectedErrorRemovingExternalSocket', {err: 'err'}],
39
+ },
40
+ {
41
+ args: makeArgs({}),
42
+ description: 'Socket removed successfully',
43
+ },
44
+ ];
45
+
46
+ tests.forEach(({args, description, error, expected}) => {
47
+ return test(description, async ({deepEqual, end, equal, rejects}) => {
48
+ if (!!error) {
49
+ await rejects(() => removeExternalSocket(args), error, 'Got error');
50
+ } else {
51
+ await removeExternalSocket(args);
52
+ }
53
+
54
+ return end();
55
+ });
56
+ });