ln-service 52.14.4 → 53.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 (121) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +163 -11
  3. package/package.json +7 -14
  4. package/test/autopilotrpc-integration/test_autopilot.js +9 -15
  5. package/test/chainrpc-integration/test_get_height.js +7 -10
  6. package/test/chainrpc-integration/test_subscribe_to_blocks.js +52 -31
  7. package/test/chainrpc-integration/test_subscribe_to_chain_address.js +72 -66
  8. package/test/chainrpc-integration/test_subscribe_to_chain_spend.js +47 -16
  9. package/test/{integration → extra-integration}/test_recover_funds_from_channel.js +0 -0
  10. package/test/{integration → extra-integration}/test_recover_funds_from_channels.js +0 -0
  11. package/test/{integration → extra-integration}/test_restrict_macaroon.js +0 -0
  12. package/test/{integration → extra-integration}/test_revoke_access.js +0 -0
  13. package/test/{integration → extra-integration}/test_subscribe_to_rpc_requests.js +1 -1
  14. package/test/integration/test_add_peer.js +16 -12
  15. package/test/integration/test_cancel_pending_channel.js +20 -6
  16. package/test/integration/test_close_channel.js +15 -10
  17. package/test/integration/test_create_chain_address.js +3 -6
  18. package/test/integration/test_create_invoice.js +27 -23
  19. package/test/integration/test_decode_payment_request.js +30 -29
  20. package/test/integration/test_delete_payment.js +11 -8
  21. package/test/integration/test_delete_payments.js +13 -16
  22. package/test/integration/test_get_access_ids.js +4 -7
  23. package/test/integration/test_get_backup.js +12 -8
  24. package/test/integration/test_get_backups.js +8 -10
  25. package/test/integration/test_get_chain_balance.js +9 -53
  26. package/test/integration/test_get_chain_fee_estimate.js +21 -10
  27. package/test/integration/test_get_chain_transactions.js +30 -52
  28. package/test/integration/test_get_channel.js +7 -7
  29. package/test/integration/test_get_channel_balance.js +5 -6
  30. package/test/integration/test_get_channels.js +11 -10
  31. package/test/integration/test_get_closed_channels.js +169 -139
  32. package/test/integration/test_get_failed_payments.js +37 -39
  33. package/test/integration/test_get_fee_rates.js +6 -9
  34. package/test/integration/test_get_forwards.js +34 -35
  35. package/test/integration/test_get_invoice.js +7 -11
  36. package/test/integration/test_get_invoices.js +33 -30
  37. package/test/integration/test_get_methods.js +4 -7
  38. package/test/integration/test_get_network_centrality.js +14 -17
  39. package/test/integration/test_get_network_graph.js +12 -15
  40. package/test/integration/test_get_network_info.js +5 -6
  41. package/test/integration/test_get_node.js +15 -31
  42. package/test/integration/test_get_payments.js +10 -10
  43. package/test/integration/test_get_peers.js +10 -13
  44. package/test/integration/test_get_pending_coop.js +13 -18
  45. package/test/integration/test_get_pending_force.js +29 -21
  46. package/test/integration/test_get_route_to_destination.js +47 -40
  47. package/test/integration/test_get_utxos.js +17 -42
  48. package/test/integration/test_get_wallet_info.js +5 -12
  49. package/test/integration/test_open_channel.js +16 -9
  50. package/test/integration/test_open_channels.js +66 -66
  51. package/test/integration/test_pay.js +39 -36
  52. package/test/integration/test_pay_private_invoice.js +78 -72
  53. package/test/integration/test_payment_errors.js +13 -11
  54. package/test/integration/test_propose_channel.js +74 -53
  55. package/test/integration/test_push_funds.js +11 -15
  56. package/test/integration/test_rebalance.js +11 -22
  57. package/test/integration/test_remove_peer.js +13 -48
  58. package/test/integration/test_send_message_to_peer.js +25 -17
  59. package/test/integration/test_send_to_chain_address.js +60 -51
  60. package/test/integration/test_send_to_chain_addresses.js +30 -18
  61. package/test/integration/test_sign_message.js +3 -6
  62. package/test/integration/test_stop_daemon.js +3 -9
  63. package/test/integration/test_subscribe_to_backups.js +19 -11
  64. package/test/integration/test_subscribe_to_channels.js +28 -20
  65. package/test/integration/test_subscribe_to_graph.js +43 -22
  66. package/test/integration/test_subscribe_to_invoices.js +89 -103
  67. package/test/integration/test_subscribe_to_open_requests.js +47 -31
  68. package/test/integration/test_subscribe_to_peer_messages.js +51 -21
  69. package/test/integration/test_subscribe_to_peers.js +11 -16
  70. package/test/integration/test_subscribe_to_transactions.js +49 -45
  71. package/test/integration/test_update_routing_fees.js +12 -16
  72. package/test/integration/test_verify_access.js +5 -10
  73. package/test/integration/test_verify_backup.js +10 -8
  74. package/test/integration/test_verify_backups.js +11 -16
  75. package/test/integration/test_verify_message.js +6 -9
  76. package/test/invoicesrpc-integration/test_cancel_invoice.js +15 -22
  77. package/test/invoicesrpc-integration/test_get_sweep_transactions.js +15 -11
  78. package/test/invoicesrpc-integration/test_push_payment.js +53 -55
  79. package/test/invoicesrpc-integration/test_settle_invoice.js +25 -19
  80. package/test/invoicesrpc-integration/test_subscribe_cancel_invoice.js +13 -11
  81. package/test/invoicesrpc-integration/test_subscribe_settle_invoice.js +20 -15
  82. package/test/macros/btcsuite_type_daemon.js +1 -1
  83. package/test/macros/chain_send_transaction.js +1 -1
  84. package/test/macros/change_password.js +15 -13
  85. package/test/macros/generate_blocks.js +24 -29
  86. package/test/macros/rpc.js +1 -0
  87. package/test/macros/setup_channel.js +23 -9
  88. package/test/macros/spawn_lnd.js +3 -1
  89. package/test/macros/wait_for_channel.js +8 -3
  90. package/test/macros/wait_for_route.js +2 -2
  91. package/test/routerrpc-integration/test_delete_forwarding_reputations.js +15 -22
  92. package/test/routerrpc-integration/test_disable_channel.js +8 -12
  93. package/test/routerrpc-integration/test_get_forwarding_confidence.js +17 -37
  94. package/test/routerrpc-integration/test_get_forwarding_reputations.js +26 -25
  95. package/test/routerrpc-integration/test_get_pathfinding_settings.js +6 -12
  96. package/test/routerrpc-integration/test_get_payment.js +19 -26
  97. package/test/routerrpc-integration/test_get_route_confidence.js +15 -21
  98. package/test/routerrpc-integration/test_get_route_through_hops.js +29 -32
  99. package/test/routerrpc-integration/test_multipath_payment.js +18 -20
  100. package/test/routerrpc-integration/test_pay_via_payment_details.js +19 -34
  101. package/test/routerrpc-integration/test_pay_via_payment_request.js +17 -27
  102. package/test/routerrpc-integration/test_pay_via_routes.js +37 -37
  103. package/test/routerrpc-integration/test_probe_for_route.js +27 -33
  104. package/test/routerrpc-integration/test_subscribe_to_forward_requests.js +138 -32
  105. package/test/routerrpc-integration/test_subscribe_to_forwards.js +83 -77
  106. package/test/routerrpc-integration/test_subscribe_to_past_payments.js +34 -28
  107. package/test/routerrpc-integration/test_update_pathfinding_settings.js +7 -10
  108. package/test/signerrpc-integration/test_diffie_hellman_compute_secret.js +15 -14
  109. package/test/signerrpc-integration/test_sign_bytes.js +11 -15
  110. package/test/signerrpc-integration/test_sign_transaction.js +6 -7
  111. package/test/signerrpc-integration/test_verify_bytes_signature.js +11 -12
  112. package/test/versionrpc-integration/test_get_wallet_version.js +6 -7
  113. package/test/walletrpc-integration/test_fund_psbt.js +13 -12
  114. package/test/walletrpc-integration/test_get_chain_fee_rate.js +4 -8
  115. package/test/walletrpc-integration/test_get_locked_utxos.js +11 -27
  116. package/test/walletrpc-integration/test_get_public_key.js +5 -13
  117. package/test/walletrpc-integration/test_lock_utxo.js +16 -23
  118. package/test/walletrpc-integration/test_send_to_chain_output_scripts.js +25 -6
  119. package/test/walletrpc-integration/test_sign_psbt.js +28 -19
  120. package/test/walletrpc-integration/test_unlock_utxo.js +16 -27
  121. package/test/walletrpc-integration/test_update_chain_transaction.js +6 -31
@@ -1,12 +1,16 @@
1
1
  const asyncRetry = require('async/retry');
2
+ const {spawnLightningCluster} = require('ln-docker-daemons');
2
3
  const {test} = require('@alexbosworth/tap');
3
4
 
4
5
  const {chainSendTransaction} = require('./../macros');
5
6
  const {createChainAddress} = require('./../../');
6
7
  const {delay} = require('./../macros');
7
8
  const {generateBlocks} = require('./../macros');
9
+ const {getChainBalance} = require('./../../');
10
+ const {getChainTransactions} = require('./../../');
8
11
  const {getHeight} = require('./../../');
9
12
  const {mineTransaction} = require('./../macros');
13
+ const {sendToChainAddress} = require('./../../');
10
14
  const {spawnLnd} = require('./../macros');
11
15
  const {subscribeToChainAddress} = require('./../../');
12
16
  const {waitForTermination} = require('./../macros');
@@ -15,102 +19,104 @@ const count = 100;
15
19
  const defaultFee = 1e3;
16
20
  const defaultVout = 0;
17
21
  const format = 'np2wpkh';
18
- const interval = retryCount => 50 * Math.pow(2, retryCount);
19
- const times = 15;
22
+ const interval = 1;
23
+ const times = 1500;
20
24
  const tokens = 1e8;
21
25
 
22
26
  // Subscribing to chain transaction confirmations should trigger events
23
27
  test(`Subscribe to chain transactions`, async ({end, equal, fail}) => {
24
- const node = await spawnLnd({});
28
+ const {kill, nodes} = await spawnLightningCluster({});
25
29
 
26
- const cert = node.chain_rpc_cert_file;
27
- const host = node.listen_ip;
28
- const {kill} = node;
29
- const pass = node.chain_rpc_pass;
30
- const port = node.chain_rpc_port;
31
- const {lnd} = node;
32
- const user = node.chain_rpc_user;
30
+ const [{chain, generate, lnd}] = nodes;
33
31
 
34
- const startHeight = (await getHeight({lnd})).current_block_height;
32
+ // Wait for chainrpc to be active
33
+ await asyncRetry({interval, times}, async () => {
34
+ if (!!(await getChainBalance({lnd})).chain_balance) {
35
+ return;
36
+ }
35
37
 
36
- const {address} = await createChainAddress({format, lnd});
38
+ await generate({});
37
39
 
38
- // Generate some funds for LND
39
- const {blocks} = await node.generate({count});
40
+ await getHeight({lnd});
40
41
 
41
- const [block] = blocks;
42
+ throw new Error('ExpectedChainBalance');
43
+ });
42
44
 
43
- const [coinbaseTransactionId] = block.transaction_ids;
45
+ let firstConf;
46
+ const {address} = await createChainAddress({format, lnd});
47
+ const startHeight = (await getHeight({lnd})).current_block_height;
44
48
 
45
- const {transaction} = chainSendTransaction({
46
- tokens,
47
- destination: address,
48
- fee: defaultFee,
49
- private_key: node.mining_key,
50
- spend_transaction_id: coinbaseTransactionId,
51
- spend_vout: defaultVout,
52
- });
49
+ await asyncRetry({interval, times}, async () => {
50
+ const sub = subscribeToChainAddress({
51
+ lnd,
52
+ min_height: startHeight,
53
+ p2sh_address: address,
54
+ });
53
55
 
54
- const sub = subscribeToChainAddress({
55
- lnd,
56
- min_height: startHeight,
57
- p2sh_address: address,
58
- });
56
+ sub.on('confirmation', conf => firstConf = conf);
57
+ sub.on('error', err => {});
59
58
 
60
- let firstConf;
59
+ await generate({count});
61
60
 
62
- sub.on('confirmation', conf => firstConf = conf);
63
- sub.on('error', err => {});
61
+ await sendToChainAddress({lnd, address, tokens});
64
62
 
65
- // Wait for generation to be over
66
- await asyncRetry({interval, times}, async () => {
67
- await mineTransaction({cert, host, pass, port, transaction, user});
63
+ const {transactions} = await getChainTransactions({lnd});
64
+
65
+ const [{transaction}] = transactions
66
+ .filter(n => !n.is_confirmed)
67
+ .filter(n => !!n.is_outgoing);
68
68
 
69
- if (!firstConf) {
70
- throw new Error('ExpectedSubscribeToChainAddressSeesConfirmation');
69
+ if (!transaction) {
70
+ throw new Error('ExpectedTrnasaction');
71
71
  }
72
72
 
73
- equal(firstConf.block.length, 64, 'Confirmation block hash is returned');
74
- equal(firstConf.height, 102, 'Confirmation block height is returned');
75
- equal(firstConf.transaction, transaction, 'Confirmation raw tx returned');
73
+ // Wait for generation to be over
74
+ await asyncRetry({interval, times}, async () => {
75
+ await generate({});
76
76
 
77
- return;
78
- });
77
+ if (!firstConf) {
78
+ throw new Error('ExpectedSubscribeToChainAddressSeesConf');
79
+ }
79
80
 
80
- let secondConf;
81
+ equal(firstConf.block.length, 64, 'Confirmation block hash returned');
82
+ equal(firstConf.height >= 102, true, 'Got confirmation block height');
83
+ equal(firstConf.transaction, transaction, 'Confirmation raw tx');
81
84
 
82
- const sub2 = subscribeToChainAddress({
83
- lnd,
84
- min_confirmations: 6,
85
- min_height: startHeight,
86
- p2sh_address: address,
87
- });
85
+ return;
86
+ });
88
87
 
89
- sub2.on('error', () => {});
88
+ let secondConf;
90
89
 
91
- sub2.on('confirmation', conf => secondConf = conf);
90
+ const sub2 = subscribeToChainAddress({
91
+ lnd,
92
+ min_confirmations: 6,
93
+ min_height: startHeight,
94
+ p2sh_address: address,
95
+ });
92
96
 
93
- // Wait for generation to be over
94
- await asyncRetry({interval, times}, async () => {
95
- await mineTransaction({cert, host, pass, port, transaction, user});
97
+ sub2.on('error', () => {});
96
98
 
97
- if (!secondConf) {
98
- throw new Error('ExpectedSubscribeToChainAddressSeesMultiConfirmation');
99
- }
99
+ sub2.on('confirmation', conf => secondConf = conf);
100
100
 
101
- equal(secondConf.block.length, 64, 'Confirmation block hash is returned');
102
- equal(secondConf.height, 102, 'Confirmation block height is returned');
103
- equal(secondConf.transaction, transaction, 'Confirmation raw tx returned');
101
+ // Wait for generation to be over
102
+ await asyncRetry({interval, times}, async () => {
103
+ await generate({});
104
104
 
105
- return;
106
- });
105
+ if (!secondConf) {
106
+ throw new Error('ExpectedSubscribeToChainAddressSeesConfirmation');
107
+ }
107
108
 
108
- sub.removeAllListeners();
109
- sub2.removeAllListeners();
109
+ equal(secondConf.block.length, 64, 'Confirmation block hash returned');
110
+ equal(secondConf.height >= 102, true, 'Confirmation block height');
111
+ equal(secondConf.transaction, transaction, '2nd conf raw tx returned');
110
112
 
111
- kill();
113
+ return;
114
+ });
115
+
116
+ [sub, sub2].forEach(n => n.removeAllListeners());
117
+ });
112
118
 
113
- await waitForTermination({lnd});
119
+ await kill({});
114
120
 
115
121
  return end();
116
122
  });
@@ -1,40 +1,70 @@
1
+ const {once} = require('events');
2
+
1
3
  const asyncRetry = require('async/retry');
4
+ const {spawnLightningCluster} = require('ln-docker-daemons');
2
5
  const {test} = require('@alexbosworth/tap');
3
6
 
4
7
  const {createChainAddress} = require('./../../');
5
- const {createCluster} = require('./../macros');
6
- const {delay} = require('./../macros');
7
8
  const {getChainBalance} = require('./../../');
8
9
  const {getHeight} = require('./../../');
9
10
  const {getUtxos} = require('./../../');
10
11
  const {sendToChainAddress} = require('./../../');
12
+ const {subscribeToBlocks} = require('./../../');
11
13
  const {subscribeToChainSpend} = require('./../../');
12
14
 
13
15
  const confirmationCount = 6;
16
+ const count = 100;
14
17
  const format = 'p2wpkh';
15
- const interval = retryCount => 50 * Math.pow(2, retryCount);
16
- const times = 15;
18
+ const interval = 1;
19
+ const race = promises => Promise.race(promises);
20
+ const size = 2;
21
+ const times = 1000;
17
22
  const tokens = 1e6;
18
23
 
19
24
  // Subscribing to chain spend should push events on spend confirmations
20
25
  test(`Subscribe to chain spend`, async ({end, equal}) => {
21
- const cluster = await createCluster({is_remote_skipped: true});
22
26
  let gotAddressConf = false;
23
27
 
24
- const {lnd} = cluster.control;
28
+ const {kill, nodes} = await spawnLightningCluster({size});
29
+
30
+ const [control, target] = nodes;
31
+
32
+ const cluster = {control, target};
33
+
34
+ const {address} = await createChainAddress({lnd: target.lnd});
35
+ const {lnd} = control;
36
+
37
+ // Wait for chainrpc to be active
38
+ await control.generate({count});
25
39
 
26
40
  const startHeight = (await getHeight({lnd})).current_block_height;
27
41
 
28
- const {address} = await createChainAddress({
29
- format,
30
- lnd: cluster.target.lnd,
42
+ await asyncRetry({interval, times}, async () => {
43
+ const subBlocks = subscribeToBlocks({lnd});
44
+
45
+ const [event] = await race([
46
+ once(subBlocks, 'block'),
47
+ once(subBlocks, 'error'),
48
+ ]);
49
+
50
+ if (!event.height) {
51
+ throw new Error('ExpectedBlockEvent');
52
+ }
31
53
  });
32
54
 
33
- const sent = await sendToChainAddress({address, lnd, tokens});
55
+ const sent = await asyncRetry({times}, async () => {
56
+ await control.generate({});
57
+
58
+ return await sendToChainAddress({address, lnd, tokens});
59
+ });
34
60
 
35
- await cluster.generate({count: confirmationCount, node: cluster.control});
61
+ await control.generate({count: 1});
36
62
 
37
- const [utxo] = (await getUtxos({lnd: cluster.control.lnd})).utxos;
63
+ const {utxos} = await getUtxos({lnd});
64
+
65
+ const [utxo] = utxos;
66
+
67
+ await control.generate({count});
38
68
 
39
69
  const sub = subscribeToChainSpend({
40
70
  lnd,
@@ -54,7 +84,7 @@ test(`Subscribe to chain spend`, async ({end, equal}) => {
54
84
  return gotAddressConf = true;
55
85
  });
56
86
 
57
- const toTarget = await createChainAddress({format, lnd: cluster.target.lnd});
87
+ const toTarget = await createChainAddress({lnd: target.lnd});
58
88
 
59
89
  // Wait for generation to be over
60
90
  await asyncRetry({interval, times}, async () => {
@@ -64,10 +94,11 @@ test(`Subscribe to chain spend`, async ({end, equal}) => {
64
94
  address: toTarget.address,
65
95
  is_send_all: true,
66
96
  });
67
- } catch (err) {}
97
+ } catch (err) {
98
+ }
68
99
 
69
100
  // Generate to confirm the tx
70
- await cluster.generate({count: 1, node: cluster.control});
101
+ await control.generate({count: confirmationCount});
71
102
 
72
103
  if (!gotAddressConf) {
73
104
  throw new Error('ExpectedSubscribeToAddressSeesConfirmation');
@@ -76,7 +107,7 @@ test(`Subscribe to chain spend`, async ({end, equal}) => {
76
107
  return;
77
108
  });
78
109
 
79
- await cluster.kill({});
110
+ await kill({});
80
111
 
81
112
  equal(gotAddressConf, true, 'Subscribe to address sees confirmation');
82
113
 
@@ -234,7 +234,7 @@ test(`Subscribe to RPC requests`, async ({end, equal, fail, strictSame}) => {
234
234
 
235
235
  spawned.kill({});
236
236
 
237
- await waitForTermination({lnd});
237
+ await waitForTermination({lnd: spawned.lnd});
238
238
 
239
239
  return end();
240
240
  });
@@ -1,4 +1,5 @@
1
1
  const asyncRetry = require('async/retry');
2
+ const {spawnLightningCluster} = require('ln-docker-daemons');
2
3
  const {test} = require('@alexbosworth/tap');
3
4
 
4
5
  const {addPeer} = require('./../../');
@@ -6,37 +7,40 @@ const {createCluster} = require('./../macros');
6
7
  const {getPeers} = require('./../../');
7
8
 
8
9
  const interval = 100;
10
+ const size = 2;
9
11
  const times = 100;
12
+ const timeout = 1;
10
13
 
11
14
  // Adding peers should result in a connected peer
12
15
  test(`Add a peer`, async ({end, equal}) => {
13
- const cluster = await createCluster({});
16
+ const {kill, nodes} = await spawnLightningCluster({size});
14
17
 
15
- const {lnd} = cluster.control;
16
- const remoteNodeKey = cluster.remote.public_key;
18
+ const [{lnd}, target] = nodes;
17
19
 
18
20
  const connectedKeys = (await getPeers({lnd})).peers.map(n => n.public_key);
19
21
 
20
- equal(connectedKeys.find(n => n === remoteNodeKey), undefined, 'No peer');
22
+ equal(connectedKeys.find(n => n === target.id), undefined, 'No peer');
21
23
 
22
24
  await asyncRetry({interval, times}, async () => {
23
25
  await addPeer({
24
26
  lnd,
25
- public_key: cluster.remote.public_key,
26
- socket: cluster.remote.socket,
27
- timeout: 1,
27
+ timeout,
28
+ public_key: target.id,
29
+ socket: target.socket,
28
30
  });
29
31
 
30
32
  const {peers} = await getPeers({lnd});
31
33
 
32
- const connected = peers.find(n => n.public_key === remoteNodeKey);
34
+ const connected = peers.find(n => n.public_key === target.id);
33
35
 
34
- equal(connected.public_key, remoteNodeKey, 'Connected to remote node');
36
+ if (!connected) {
37
+ throw new Error('ExpectedConnectionToTarget');
38
+ }
39
+
40
+ equal(connected.public_key, target.id, 'Connected to remote node');
35
41
  });
36
42
 
37
- (async () => {
38
- await cluster.kill({});
39
- })();
43
+ await kill({});
40
44
 
41
45
  return end();
42
46
  });
@@ -1,24 +1,38 @@
1
+ const asyncEach = require('async/each');
1
2
  const asyncRetry = require('async/retry');
3
+ const {spawnLightningCluster} = require('ln-docker-daemons');
2
4
  const {test} = require('@alexbosworth/tap');
3
5
 
6
+ const {addPeer} = require('./../../');
4
7
  const {cancelPendingChannel} = require('./../../');
5
8
  const {createCluster} = require('./../macros');
6
9
  const {delay} = require('./../macros');
10
+ const {getChainBalance} = require('./../../');
7
11
  const {openChannels} = require('./../../');
8
12
 
9
13
  const capacity = 1e6;
14
+ const count = 100;
15
+ const interval = 100;
10
16
  const race = promises => Promise.race(promises);
11
- const timeout = 1000 * 10;
17
+ const size = 2;
18
+ const timeout = 1000 * 5;
19
+ const times = 200;
12
20
 
13
21
  // Cancel a channel should result in no pending channels
14
22
  test(`Cancel pending channel`, async ({end, equal}) => {
15
- const cluster = await createCluster({is_remote_skipped: true});
23
+ const {kill, nodes} = await spawnLightningCluster({size});
16
24
 
17
- const {lnd} = cluster.control;
25
+ const [control, target] = nodes;
18
26
 
19
- const channels = [{capacity, partner_public_key: cluster.target.public_key}];
27
+ const {lnd} = control;
20
28
 
21
- await asyncRetry({interval: 100, times: 100}, async () => {
29
+ await control.generate({count});
30
+
31
+ await addPeer({lnd, public_key: target.id, socket: target.socket});
32
+
33
+ const channels = [{capacity, partner_public_key: target.id}];
34
+
35
+ await asyncRetry({interval, times}, async () => {
22
36
  const toCancel = await race([
23
37
  delay(timeout),
24
38
  openChannels({channels, lnd}),
@@ -29,7 +43,7 @@ test(`Cancel pending channel`, async ({end, equal}) => {
29
43
  await cancelPendingChannel({id, lnd});
30
44
  });
31
45
 
32
- await cluster.kill({});
46
+ await kill({});
33
47
 
34
48
  return end();
35
49
  });
@@ -1,24 +1,29 @@
1
+ const {spawnLightningCluster} = require('ln-docker-daemons');
1
2
  const {test} = require('@alexbosworth/tap');
2
3
 
3
4
  const {closeChannel} = require('./../../');
4
5
  const {createCluster} = require('./../macros');
5
6
  const {setupChannel} = require('./../macros');
6
7
 
8
+ const size = 2;
9
+
7
10
  // Closing a channel should close the channel
8
11
  test(`Close channel`, async ({end, equal}) => {
9
- const cluster = await createCluster({is_remote_skipped: true});
12
+ const {kill, nodes} = await spawnLightningCluster({size});
13
+
14
+ const [control, target] = nodes;
10
15
 
11
16
  // Force close channel using tx id and vout
12
17
  try {
13
18
  const channelOpen = await setupChannel({
14
- generate: cluster.generate,
15
- lnd: cluster.control.lnd,
16
- to: cluster.target,
19
+ generate: control.generate,
20
+ lnd: control.lnd,
21
+ to: target,
17
22
  });
18
23
 
19
24
  const channelClose = await closeChannel({
20
25
  is_force_close: true,
21
- lnd: cluster.control.lnd,
26
+ lnd: control.lnd,
22
27
  transaction_id: channelOpen.transaction_id,
23
28
  transaction_vout: channelOpen.transaction_vout,
24
29
  });
@@ -32,14 +37,14 @@ test(`Close channel`, async ({end, equal}) => {
32
37
  // Coop close channel using the channel id
33
38
  try {
34
39
  const channelOpen = await setupChannel({
35
- generate: cluster.generate,
36
- lnd: cluster.control.lnd,
37
- to: cluster.target,
40
+ generate: control.generate,
41
+ lnd: control.lnd,
42
+ to: target,
38
43
  });
39
44
 
40
45
  const channelClose = await closeChannel({
41
46
  id: channelOpen.id,
42
- lnd: cluster.control.lnd,
47
+ lnd: control.lnd,
43
48
  });
44
49
 
45
50
  equal(channelClose.transaction_id.length, 64, 'Coop close id is returned');
@@ -48,7 +53,7 @@ test(`Close channel`, async ({end, equal}) => {
48
53
  equal(err, null, 'Expected no error coop closing');
49
54
  }
50
55
 
51
- await cluster.kill({});
56
+ await kill({});
52
57
 
53
58
  return end();
54
59
  });
@@ -1,9 +1,8 @@
1
1
  const {address} = require('bitcoinjs-lib');
2
+ const {spawnLightningCluster} = require('ln-docker-daemons');
2
3
  const {test} = require('@alexbosworth/tap');
3
4
 
4
5
  const {createChainAddress} = require('./../../');
5
- const {spawnLnd} = require('./../macros');
6
- const {waitForTermination} = require('./../macros');
7
6
 
8
7
  const formats = ['np2wpkh', 'p2wpkh'];
9
8
  const p2shAddressVersion = 196;
@@ -12,7 +11,7 @@ const regtestBech32AddressHrp = 'bcrt';
12
11
 
13
12
  // Creating addresses should result in addresses
14
13
  test(`Create address results in address creation`, async ({end, equal}) => {
15
- const {kill, lnd} = await spawnLnd({});
14
+ const [{kill, lnd}] = (await spawnLightningCluster({})).nodes;
16
15
 
17
16
  const createNewChainAddresses = formats
18
17
  .map(async format => await createChainAddress({lnd, format}));
@@ -35,9 +34,7 @@ test(`Create address results in address creation`, async ({end, equal}) => {
35
34
  equal(np2wpkh.address, unusedNp2wpkh.address, 'Nested is reused');
36
35
  equal(p2wpkh.address, unusedP2wpkh.address, 'Native is reused');
37
36
 
38
- kill();
39
-
40
- await waitForTermination({lnd});
37
+ await kill({});
41
38
 
42
39
  return end();
43
40
  });
@@ -1,41 +1,45 @@
1
+ const {spawnLightningCluster} = require('ln-docker-daemons');
1
2
  const {test} = require('@alexbosworth/tap');
2
3
 
3
4
  const {createInvoice} = require('./../../');
4
5
  const {parsePaymentRequest} = require('./../../');
5
- const {spawnLnd} = require('./../macros');
6
- const {waitForTermination} = require('./../macros');
7
6
 
8
7
  // createInvoice should result in a created invoice
9
8
  test(`Create an invoice`, async ({end, equal}) => {
10
- const {kill, lnd} = await spawnLnd({});
9
+ const [{generate, kill, lnd}] = (await spawnLightningCluster({})).nodes;
11
10
 
12
- const invoice = await createInvoice({lnd});
11
+ await generate({count: 100});
13
12
 
14
- const parsed = parsePaymentRequest({request: invoice.request});
13
+ try {
14
+ const invoice = await createInvoice({lnd});
15
15
 
16
- equal(invoice.chain_address, undefined, 'Default address is undefined');
17
- equal(invoice.created_at, parsed.created_at, 'Invoice has created at date');
18
- equal(invoice.description, undefined, 'Default description is undefined');
19
- equal(invoice.id, parsed.id, 'Invoice has id');
20
- equal(invoice.mtokens, '0', 'Default mtokens are 0');
21
- equal(!!invoice.request, true, 'Invoice has request');
22
- equal(!!invoice.secret, true, 'Invoice returns secret');
23
- equal(invoice.tokens, 0, 'Default tokens are 0');
16
+ const parsed = parsePaymentRequest({request: invoice.request});
24
17
 
25
- await createInvoice({lnd, is_including_private_channels: true});
18
+ equal(invoice.chain_address, undefined, 'Default address is undefined');
19
+ equal(invoice.created_at, parsed.created_at, 'Invoice has created date');
20
+ equal(invoice.description, undefined, 'Default description is undefined');
21
+ equal(invoice.id, parsed.id, 'Invoice has id');
22
+ equal(invoice.mtokens, '0', 'Default mtokens are 0');
23
+ equal(!!invoice.request, true, 'Invoice has request');
24
+ equal(!!invoice.secret, true, 'Invoice returns secret');
25
+ equal(invoice.tokens, 0, 'Default tokens are 0');
26
26
 
27
- try {
28
- await createInvoice({lnd, secret: invoice.secret});
29
- } catch (err) {
30
- const [code, message] = err;
27
+ try {
28
+ const duplicate = await createInvoice({lnd, secret: invoice.secret});
31
29
 
32
- equal(code, 409, 'Got expected error code');
33
- equal(message, 'InvoiceWithGivenHashAlreadyExists', 'Got expected msg');
34
- }
30
+ equal(duplicate, null, 'Expected no duplicate invoice');
31
+ } catch (err) {
32
+ const [code, message] = err;
35
33
 
36
- kill();
34
+ equal(code, 409, 'Got expected error code');
35
+ equal(message, 'InvoiceWithGivenHashAlreadyExists', 'Got expected msg');
36
+ }
37
+
38
+ } catch (err) {
39
+ equal(err, null, 'Expected no error in create invoice');
40
+ }
37
41
 
38
- await waitForTermination({lnd});
42
+ await kill({});
39
43
 
40
44
  return end();
41
45
  });