ln-service 52.16.0 → 53.1.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 (119) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/README.md +12 -10
  3. package/package.json +6 -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 +36 -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 -71
  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 +20 -14
  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/change_password.js +14 -12
  83. package/test/macros/generate_blocks.js +23 -28
  84. package/test/macros/rpc.js +1 -0
  85. package/test/macros/setup_channel.js +23 -9
  86. package/test/macros/spawn_lnd.js +2 -0
  87. package/test/macros/wait_for_channel.js +8 -3
  88. package/test/macros/wait_for_route.js +2 -2
  89. package/test/routerrpc-integration/test_delete_forwarding_reputations.js +15 -22
  90. package/test/routerrpc-integration/test_disable_channel.js +8 -12
  91. package/test/routerrpc-integration/test_get_forwarding_confidence.js +17 -37
  92. package/test/routerrpc-integration/test_get_forwarding_reputations.js +26 -23
  93. package/test/routerrpc-integration/test_get_pathfinding_settings.js +6 -12
  94. package/test/routerrpc-integration/test_get_payment.js +19 -26
  95. package/test/routerrpc-integration/test_get_route_confidence.js +15 -21
  96. package/test/routerrpc-integration/test_get_route_through_hops.js +29 -32
  97. package/test/routerrpc-integration/test_multipath_payment.js +18 -20
  98. package/test/routerrpc-integration/test_pay_via_payment_details.js +19 -34
  99. package/test/routerrpc-integration/test_pay_via_payment_request.js +17 -27
  100. package/test/routerrpc-integration/test_pay_via_routes.js +37 -37
  101. package/test/routerrpc-integration/test_probe_for_route.js +27 -33
  102. package/test/routerrpc-integration/test_subscribe_to_forward_requests.js +39 -44
  103. package/test/routerrpc-integration/test_subscribe_to_forwards.js +83 -77
  104. package/test/routerrpc-integration/test_subscribe_to_past_payments.js +34 -28
  105. package/test/routerrpc-integration/test_update_pathfinding_settings.js +7 -10
  106. package/test/signerrpc-integration/test_diffie_hellman_compute_secret.js +15 -14
  107. package/test/signerrpc-integration/test_sign_bytes.js +11 -15
  108. package/test/signerrpc-integration/test_sign_transaction.js +6 -7
  109. package/test/signerrpc-integration/test_verify_bytes_signature.js +11 -12
  110. package/test/versionrpc-integration/test_get_wallet_version.js +6 -7
  111. package/test/walletrpc-integration/test_fund_psbt.js +13 -12
  112. package/test/walletrpc-integration/test_get_chain_fee_rate.js +4 -8
  113. package/test/walletrpc-integration/test_get_locked_utxos.js +11 -27
  114. package/test/walletrpc-integration/test_get_public_key.js +5 -13
  115. package/test/walletrpc-integration/test_lock_utxo.js +16 -23
  116. package/test/walletrpc-integration/test_send_to_chain_output_scripts.js +25 -6
  117. package/test/walletrpc-integration/test_sign_psbt.js +28 -19
  118. package/test/walletrpc-integration/test_unlock_utxo.js +16 -27
  119. package/test/walletrpc-integration/test_update_chain_transaction.js +6 -31
package/CHANGELOG.md CHANGED
@@ -1,6 +1,23 @@
1
1
  # Versions
2
2
 
3
- ## 52.16.0
3
+ ## 53.1.0
4
+
5
+ - Add support for LND 0.14.1
6
+ - `openChannels`: Add `is_avoiding_broadcast` to avoid all funding broadcast
7
+
8
+ ## 53.0.1
9
+
10
+ - Removed support for determining the type of channel to support LND 0.14.0.
11
+
12
+ - `createChainAddress`: Make address format optional and add p2wpkh as default
13
+ - `sendToChainOutputScripts`: Fix specification of `fee_tokens_per_vbyte`
14
+
15
+ ### Breaking Changes
16
+
17
+ - `getChannels`, `getPendingChannels`, `subscribeToChannels`: Remove
18
+ attributes `is_anchor`, `is_static_remote_key`, `is_variable_remote_key`.
19
+
20
+ ## 52.16.1
4
21
 
5
22
  - `subscribeToPayViaDetails`, `subscribeToPayViaRequest`: Add `paying`, and
6
23
  `routing_failure` events to follow in-flight attempts and encountered routing failures
package/README.md CHANGED
@@ -9,6 +9,7 @@ through npm.
9
9
 
10
10
  Supported LND versions:
11
11
 
12
+ - v0.14.0-beta
12
13
  - v0.13.0-beta to v0.13.4-beta
13
14
  - v0.12.0-beta to v0.12.1-beta
14
15
  - v0.11.0-beta to v0.11.1-beta
@@ -248,9 +249,13 @@ for `unlocker` methods.
248
249
  - [bolt07](https://npmjs.com/package/bolt07) - bolt07 channel gossip utilities
249
250
  - [bolt09](https://npmjs.com/package/bolt09) - bolt09 feature flag utilities
250
251
  - [invoices](https://npmjs.com/package/invoices) - bolt11 request utilities
251
- - [lightning](https://npmjs.com/package/lightning) - general lightning utilities
252
+ - [lightning](https://npmjs.com/package/lightning) - methods with typescript
253
+ typing support
252
254
  - [ln-accounting](https://npmjs.com/package/ln-accounting) - accounting records
253
- - [ln-pathfinding](https://npmjs.com/package/ln-accounting) - pathfinding utilities
255
+ - [ln-docker-daemons](https://github.com/alexbosworth/ln-docker-daemons)
256
+ - run regtest integration tests
257
+ - [ln-pathfinding](https://npmjs.com/package/ln-accounting) - pathfinding
258
+ utilities
254
259
  - [probing](https://npmjs.com/package/probing) - payment probing utilities
255
260
  - [psbt](https://www.npmjs.com/package/psbt) - BIP 174 PSBT utilities
256
261
 
@@ -490,7 +495,7 @@ Create a new receive address.
490
495
  Requires `address:write` permission
491
496
 
492
497
  {
493
- format: <Receive Address Type String> // "np2wpkh" || "p2wpkh"
498
+ [format]: <Receive Address Type String> // "np2wpkh" || "p2wpkh"
494
499
  [is_unused]: <Get As-Yet Unused Address Bool>
495
500
  lnd: <Authenticated LND API Object>
496
501
  }
@@ -1452,13 +1457,10 @@ Requires `offchain:read` permission
1452
1457
  [cooperative_close_delay_height]: <Prevent Coop Close Until Height Number>
1453
1458
  id: <Standard Format Channel Id String>
1454
1459
  is_active: <Channel Active Bool>
1455
- is_anchor: <Channel Supports Anchor Outputs Bool>
1456
1460
  is_closing: <Channel Is Closing Bool>
1457
1461
  is_opening: <Channel Is Opening Bool>
1458
1462
  is_partner_initiated: <Channel Partner Opened Channel Bool>
1459
1463
  is_private: <Channel Is Private Bool>
1460
- is_static_remote_key: <Remote Key Is Static Bool>
1461
- is_variable_remote_key: <Remote Key Is Variable Bool>
1462
1464
  local_balance: <Local Balance Tokens Number>
1463
1465
  [local_csv]: <Local CSV Blocks Delay Number>
1464
1466
  [local_dust]: <Remote Non-Enforceable Amount Tokens Number>
@@ -2535,7 +2537,6 @@ Requires `offchain:read` permission
2535
2537
  pending_channels: [{
2536
2538
  [close_transaction_id]: <Channel Closing Transaction Id String>
2537
2539
  is_active: <Channel Is Active Bool>
2538
- is_anchor: <Channel Is Anchor Channel Type Bool>
2539
2540
  is_closing: <Channel Is Closing Bool>
2540
2541
  is_opening: <Channel Is Opening Bool>
2541
2542
  [is_partner_initiated]: <Channel Partner Initiated Channel Bool>
@@ -3239,6 +3240,9 @@ minutes to fund the channels.
3239
3240
  If you do not fund the channels, be sure to `cancelPendingChannel`s on each
3240
3241
  channel that was not funded.
3241
3242
 
3243
+ Use `is_avoiding_broadcast` only when self-publishing the raw transaction
3244
+ after the funding step.
3245
+
3242
3246
  {
3243
3247
  channels: [{
3244
3248
  capacity: <Channel Capacity Tokens Number>
@@ -3250,6 +3254,7 @@ channel that was not funded.
3250
3254
  [partner_csv_delay]: <Peer Output CSV Delay Number>
3251
3255
  [partner_socket]: <Peer Connection Host:Port String>
3252
3256
  }]
3257
+ is_avoiding_broadcast: <Avoid Broadcast of All Channels Bool>
3253
3258
  lnd: <Authenticated LND API Object>
3254
3259
  }
3255
3260
 
@@ -4656,13 +4661,10 @@ Requires `offchain:read` permission
4656
4661
  [cooperative_close_delay_height]: <Prevent Coop Close Until Height Number>
4657
4662
  id: <Standard Format Channel Id String>
4658
4663
  is_active: <Channel Active Bool>
4659
- is_anchor: <Channel Supports Anchor Outputs Bool>
4660
4664
  is_closing: <Channel Is Closing Bool>
4661
4665
  is_opening: <Channel Is Opening Bool>
4662
4666
  is_partner_initiated: <Channel Partner Opened Channel Bool>
4663
4667
  is_private: <Channel Is Private Bool>
4664
- is_static_remote_key: <Remote Key Is Static Bool>
4665
- is_variable_remote_key: <Remote Key Is Variable Bool>
4666
4668
  local_balance: <Local Balance Tokens Number>
4667
4669
  [local_given]: <Local Initially Pushed Tokens Number>
4668
4670
  local_reserve: <Local Reserved Tokens Number>
package/package.json CHANGED
@@ -11,10 +11,10 @@
11
11
  "cors": "2.8.5",
12
12
  "express": "4.17.1",
13
13
  "invoices": "2.0.2",
14
- "lightning": "4.14.3",
14
+ "lightning": "5.1.0",
15
15
  "macaroon": "3.0.4",
16
16
  "morgan": "1.10.0",
17
- "ws": "8.2.3"
17
+ "ws": "8.3.0"
18
18
  },
19
19
  "description": "Interaction helper for your Lightning Network daemon",
20
20
  "devDependencies": {
@@ -23,9 +23,10 @@
23
23
  "async": "3.2.2",
24
24
  "asyncjs-util": "1.2.7",
25
25
  "bip66": "1.1.5",
26
- "bitcoinjs-lib": "6.0.0",
26
+ "bitcoinjs-lib": "6.0.1",
27
27
  "bn.js": "5.2.0",
28
28
  "ecpair": "1.0.1",
29
+ "ln-docker-daemons": "2.1.0",
29
30
  "portfinder": "1.0.28",
30
31
  "psbt": "1.1.10",
31
32
  "rimraf": "3.0.2",
@@ -51,16 +52,7 @@
51
52
  "url": "https://github.com/alexbosworth/ln-service.git"
52
53
  },
53
54
  "scripts": {
54
- "autopilot-integration-tests": "tap --no-coverage -t 90 test/autopilotrpc-integration/*.js",
55
- "chain-integration-tests": "tap --no-coverage -t 90 test/chainrpc-integration/*.js",
56
- "integration-tests": "tap --no-coverage -t 120 -j 1 test/grpc-integration/*.js test/integration/*.js",
57
- "invoices-integration-tests": "tap --no-coverage -t 90 test/invoicesrpc-integration/*.js",
58
- "router-integration-tests": "tap --no-coverage -j 2 -t 90 test/routerrpc-integration/*.js",
59
- "signer-integration-tests": "tap --no-coverage test/signerrpc-integration/*.js",
60
- "test": "tap --branches=1 --functions=1 --lines=1 --statements=1 -j 1 -t 150 test/autopilotrpc-integration/*.js test/chainrpc-integration/*.js test/integration/*.js test/invoicesrpc-integration/*.js test/routerrpc-integration/*.js test/routers-integration/*.js test/signerrpc-integration/*.js test/tower_clientrpc-integration/*.js test/tower_serverrpc-integration/*.js test/walletrpc-integration/*.js",
61
- "tower_client-integration-tests": "tap --no-coverage test/tower_clientrpc-integration/*.js",
62
- "tower_server-integration-tests": "tap --no-coverage test/tower_serverrpc-integration/*.js",
63
- "wallet-integration-tests": "tap --no-coverage test/walletrpc-integration/*.js"
55
+ "test": "echo $DOCKER_LND_VERSION && tap -j 2 --branches=1 --functions=1 --lines=1 --statements=1 -t 200 test/autopilotrpc-integration/*.js test/chainrpc-integration/*.js test/integration/*.js test/invoicesrpc-integration/*.js test/routerrpc-integration/*.js test/signerrpc-integration/*.js test/tower_clientrpc-integration/*.js test/tower_serverrpc-integration/*.js test/walletrpc-integration/*.js"
64
56
  },
65
- "version": "52.16.0"
57
+ "version": "53.1.0"
66
58
  }
@@ -1,35 +1,29 @@
1
+ const {spawnLightningCluster} = require('ln-docker-daemons');
1
2
  const {test} = require('@alexbosworth/tap');
2
3
 
3
4
  const {addPeer} = require('./../../');
4
- const {createChainAddress} = require('./../../');
5
- const {createCluster} = require('./../macros');
6
5
  const {delay} = require('./../macros');
7
- const {generateBlocks} = require('./../macros');
8
- const {getNetworkGraph} = require('./../../');
9
6
  const {getAutopilot} = require('./../../');
10
- const {openChannel} = require('./../../');
11
7
  const {setAutopilot} = require('./../../');
12
8
  const {setupChannel} = require('./../macros');
13
- const {spawnLnd} = require('./../macros');
14
- const {waitForChannel} = require('./../macros');
15
- const {waitForPendingChannel} = require('./../macros');
16
9
 
17
10
  const avg = array => array.reduce((a, b) => a + b) / array.length;
18
- const channelCapacityTokens = 1e6;
19
11
  const confirmationCount = 6;
20
- const defaultFee = 1e3;
21
12
  const maxScore = 1e8;
22
13
  const score = 50000000;
14
+ const size = 2;
23
15
 
24
16
  // Adjusting autopilot should result in changed autopilot status
25
17
  test(`Autopilot`, async ({end, equal}) => {
26
- const cluster = await createCluster({is_remote_skipped: true});
18
+ const {kill, nodes} = await spawnLightningCluster({size});
27
19
 
28
- const {kill} = cluster;
20
+ const [control, target] = nodes;
21
+
22
+ const cluster = {control, target};
29
23
 
30
24
  const {lnd} = cluster.control;
31
25
 
32
- await setupChannel({lnd, generate: cluster.generate, to: cluster.target});
26
+ await setupChannel({lnd, generate: control.generate, to: cluster.target});
33
27
 
34
28
  equal((await getAutopilot({lnd})).is_enabled, false, 'Autopilot starts off');
35
29
 
@@ -41,7 +35,7 @@ test(`Autopilot`, async ({end, equal}) => {
41
35
 
42
36
  await addPeer({
43
37
  lnd,
44
- public_key: cluster.target.public_key,
38
+ public_key: cluster.target.id,
45
39
  socket: cluster.target.socket,
46
40
  });
47
41
 
@@ -51,7 +45,7 @@ test(`Autopilot`, async ({end, equal}) => {
51
45
 
52
46
  equal((await getAutopilot({lnd})).is_enabled, false, 'Autopilot turned off');
53
47
 
54
- const pubKey = cluster.control.public_key;
48
+ const pubKey = cluster.control.id;
55
49
 
56
50
  await setAutopilot({
57
51
  lnd,
@@ -1,24 +1,23 @@
1
1
  const asyncRetry = require('async/retry');
2
+ const {spawnLightningCluster} = require('ln-docker-daemons');
2
3
  const {test} = require('@alexbosworth/tap');
3
4
 
4
- const {generateBlocks} = require('./../macros');
5
5
  const {getHeight} = require('./../../');
6
- const {spawnLnd} = require('./../macros');
7
- const {waitForTermination} = require('./../macros');
8
6
 
9
7
  const confirmationCount = 6;
8
+ const times = 100;
10
9
 
11
10
  // Get height should return height
12
11
  test(`Get height`, async ({end, equal, fail}) => {
13
- const spawned = await spawnLnd({});
12
+ const {nodes} = await spawnLightningCluster({});
14
13
 
15
- const {generate, kill, lnd} = spawned;
14
+ const [{chain, generate, kill, lnd}] = nodes;
16
15
 
17
16
  const startHeight = (await getHeight({lnd})).current_block_height;
18
17
 
19
- await generate({count: confirmationCount});
18
+ await asyncRetry({times}, async () => {
19
+ await generate({});
20
20
 
21
- await asyncRetry({}, async () => {
22
21
  const endHeight = (await getHeight({lnd})).current_block_height;
23
22
 
24
23
  if (endHeight - startHeight < confirmationCount) {
@@ -30,9 +29,7 @@ test(`Get height`, async ({end, equal, fail}) => {
30
29
  return;
31
30
  });
32
31
 
33
- kill();
34
-
35
- await waitForTermination({lnd});
32
+ await kill({});
36
33
 
37
34
  return end();
38
35
  });
@@ -1,63 +1,84 @@
1
1
  const EventEmitter = require('events');
2
+ const {once} = require('events');
2
3
 
3
4
  const asyncRetry = require('async/retry');
5
+ const {spawnLightningCluster} = require('ln-docker-daemons');
4
6
  const {test} = require('@alexbosworth/tap');
5
7
 
8
+ const {createChainAddress} = require('./../../');
6
9
  const {delay} = require('./../macros');
7
10
  const {generateBlocks} = require('./../macros');
8
11
  const {getHeight} = require('./../../');
12
+ const {getChainBalance} = require('./../../');
9
13
  const {spawnLnd} = require('./../macros');
10
14
  const {subscribeToBlocks} = require('./../../');
11
15
  const {waitForTermination} = require('./../macros');
12
16
 
13
17
  const confirmationCount = 6;
14
- const interval = 200;
15
- const times = 400;
18
+ const interval = 1;
19
+ const race = promises => Promise.race(promises);
20
+ const times = 4000;
16
21
 
17
22
  // Subscribers to blocks should receive block notifications
18
23
  test(`Subscribe to blocks`, async ({end, equal, fail}) => {
19
- const spawned = await spawnLnd({});
20
-
21
- const {kill, lnd} = spawned;
22
-
23
24
  const blocks = [];
25
+ const {kill, nodes} = await spawnLightningCluster({});
26
+
27
+ const [{generate, lnd}] = nodes;
24
28
 
25
- // Wait for chainrpc to be active
26
29
  await asyncRetry({interval, times}, async () => {
27
- const height = (await getHeight({lnd})).current_block_height;
30
+ const subBlocks = subscribeToBlocks({lnd});
28
31
 
29
- if (!height) {
30
- throw new Error('ExpectedCurrentHeight');
31
- }
32
+ const [event] = await race([
33
+ once(subBlocks, 'block'),
34
+ once(subBlocks, 'error'),
35
+ ]);
32
36
 
33
- return;
37
+ if (!event.height) {
38
+ throw new Error('ExpectedBlockEvent');
39
+ }
34
40
  });
35
41
 
36
- const sub = subscribeToBlocks({lnd});
37
- const startHeight = (await getHeight({lnd})).current_block_height;
42
+ try {
43
+ // Wait for chainrpc to be active
44
+ await asyncRetry({interval, times}, async () => {
45
+ if (!!(await getChainBalance({lnd})).chain_balance) {
46
+ return;
47
+ }
38
48
 
39
- sub.on('block', async data => blocks.push(data));
40
- sub.on('error', err => {});
49
+ await generate({});
41
50
 
42
- await spawned.generate({count: confirmationCount});
51
+ await getHeight({lnd});
43
52
 
44
- await asyncRetry({interval, times}, async () => {
45
- if (blocks.length < confirmationCount) {
46
- throw new Error('ExpectedAdditionalBlocks');
47
- }
48
- });
53
+ throw new Error('ExpectedChainBalance');
54
+ });
49
55
 
50
- blocks.forEach(({height, id}) => {
51
- equal(!!height, true, 'Got expected block height');
52
- equal(id.length, 64, 'Got expected block hash length');
53
- return;
54
- });
56
+ const sub = subscribeToBlocks({lnd});
57
+ const startHeight = (await getHeight({lnd})).current_block_height;
58
+
59
+ sub.on('block', data => blocks.push(data));
60
+ sub.on('error', err => {});
61
+
62
+ const {address} = await createChainAddress({lnd});
55
63
 
56
- kill();
64
+ await asyncRetry({interval, times}, async () => {
65
+ await generate({});
57
66
 
58
- await waitForTermination({lnd});
67
+ if (blocks.length < confirmationCount) {
68
+ throw new Error('ExpectedAdditionalBlocks');
69
+ }
70
+ });
59
71
 
60
- return end();
72
+ blocks.forEach(({height, id}) => {
73
+ equal(!!height, true, 'Got expected block height');
74
+ equal(id.length, 64, 'Got expected block hash length');
75
+ return;
76
+ });
77
+ } catch (err) {
78
+ equal(err, null, 'Expected no error');
79
+ } finally {
80
+ await kill({});
61
81
 
62
- return;
82
+ return end();
83
+ }
63
84
  });
@@ -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
  });