ln-service 53.7.0 → 53.8.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.
- package/CHANGELOG.md +5 -1
- package/README.md +38 -2
- package/index.js +4 -2
- package/package.json +9 -6
- package/test/integration/test_add_peer.js +4 -2
- package/test/integration/test_delete_pending_channel.js +5 -2
- package/test/integration/test_get_closed_channels.js +0 -2
- package/test/integration/test_get_invoice.js +0 -1
- package/test/integration/test_get_node.js +13 -1
- package/test/integration/test_get_peers.js +32 -21
- package/test/integration/test_get_pending_force.js +1 -1
- package/test/integration/test_get_wallet_info.js +32 -26
- package/test/integration/test_open_channels.js +22 -15
- package/test/integration/test_pay.js +0 -1
- package/test/integration/test_pay_private_invoice.js +0 -1
- package/test/integration/test_propose_channel.js +438 -421
- package/test/integration/test_remove_peer.js +13 -9
- package/test/integration/test_send_message_to_peer.js +39 -28
- package/test/integration/test_send_to_chain_address.js +4 -0
- package/test/integration/test_subscribe_to_channels.js +0 -1
- package/test/integration/test_subscribe_to_invoices.js +80 -78
- package/test/integration/test_subscribe_to_peer_messages.js +6 -4
- package/test/integration/test_subscribe_to_peers.js +23 -19
- package/test/invoicesrpc-integration/test_get_sweep_transactions.js +0 -2
- package/test/invoicesrpc-integration/test_subscribe_cancel_invoice.js +0 -1
- package/test/macros/wait_for_channel.js +1 -1
- package/test/routerrpc-integration/test_delete_forwarding_reputations.js +61 -27
- package/test/routerrpc-integration/test_get_forwarding_reputations.js +42 -14
- package/test/routerrpc-integration/test_get_route_through_hops.js +33 -22
- package/test/routerrpc-integration/test_multipath_payment.js +0 -1
- package/test/routerrpc-integration/test_pay_via_payment_details.js +118 -111
- package/test/routerrpc-integration/test_pay_via_payment_request.js +92 -80
- package/test/routerrpc-integration/test_probe_for_route.js +78 -74
- package/test/routerrpc-integration/test_subscribe_to_forward_requests.js +0 -1
- package/test/routerrpc-integration/test_subscribe_to_forwards.js +518 -505
- package/test/routerrpc-integration/test_subscribe_to_past_payments.js +0 -3
- package/test/tower_clientrpc-integration/test_get_connected_watchtowers.js +0 -3
- package/test/walletrpc-integration/test_fund_psbt.js +113 -1
- package/test/walletrpc-integration/test_get_master_public_keys.js +79 -0
- package/test/walletrpc-integration/test_partially_sign_psbt.js +17 -5
- package/test/walletrpc-integration/test_sign_psbt.js +4 -1
|
@@ -14,21 +14,25 @@ test(`Remove a peer`, async ({end, equal}) => {
|
|
|
14
14
|
|
|
15
15
|
const [{id, lnd}, target] = nodes;
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
await
|
|
19
|
-
|
|
17
|
+
try {
|
|
18
|
+
await asyncRetry({interval: 10, times: 2000}, async () => {
|
|
19
|
+
await addPeer({lnd, public_key: target.id, socket: target.socket});
|
|
20
|
+
});
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
const {peers} = await getPeers({lnd});
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
const [targetPeer] = peers;
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
equal(targetPeer.public_key, target.id, 'Peer is added');
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
await removePeer({lnd, public_key: targetPeer.public_key});
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
const postRemovalPeers = await getPeers({lnd});
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
equal(postRemovalPeers.peers.length, [].length, 'Peer is removed');
|
|
33
|
+
} catch (err) {
|
|
34
|
+
equal(err, null, 'Expected no error');
|
|
35
|
+
}
|
|
32
36
|
|
|
33
37
|
await kill({});
|
|
34
38
|
|
|
@@ -8,7 +8,7 @@ const {subscribeToPeerMessages} = require('./../../');
|
|
|
8
8
|
|
|
9
9
|
const interval = 10;
|
|
10
10
|
const size = 2;
|
|
11
|
-
const times =
|
|
11
|
+
const times = 2000;
|
|
12
12
|
|
|
13
13
|
// Sending a message to a peer should result in the message received
|
|
14
14
|
test(`Send peer message`, async ({end, equal, strictSame}) => {
|
|
@@ -33,39 +33,50 @@ test(`Send peer message`, async ({end, equal, strictSame}) => {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
await
|
|
38
|
-
|
|
36
|
+
try {
|
|
37
|
+
await asyncRetry({interval, times}, async () => {
|
|
38
|
+
await addPeer({
|
|
39
|
+
lnd,
|
|
40
|
+
public_key: target.id,
|
|
41
|
+
retry_count: 1,
|
|
42
|
+
retry_delay: 1,
|
|
43
|
+
socket: target.socket,
|
|
44
|
+
timeout: 1000,
|
|
45
|
+
});
|
|
46
|
+
});
|
|
39
47
|
|
|
40
|
-
|
|
48
|
+
const sub = subscribeToPeerMessages({lnd: target.lnd});
|
|
41
49
|
|
|
42
|
-
|
|
50
|
+
const messages = [];
|
|
43
51
|
|
|
44
|
-
|
|
52
|
+
sub.on('message_received', message => messages.push(message));
|
|
45
53
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
54
|
+
await asyncRetry({interval, times}, async () => {
|
|
55
|
+
await sendMessageToPeer({
|
|
56
|
+
lnd,
|
|
57
|
+
message: Buffer.from('message').toString('hex'),
|
|
58
|
+
public_key: target.id,
|
|
59
|
+
});
|
|
52
60
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const [message] = messages;
|
|
61
|
+
if (!messages.length) {
|
|
62
|
+
throw new Error('ExpectedMessage');
|
|
63
|
+
}
|
|
64
|
+
});
|
|
59
65
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
message
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
const [message] = messages;
|
|
67
|
+
|
|
68
|
+
strictSame(
|
|
69
|
+
message,
|
|
70
|
+
{
|
|
71
|
+
message: Buffer.from('message').toString('hex'),
|
|
72
|
+
public_key: id,
|
|
73
|
+
type: 32768,
|
|
74
|
+
},
|
|
75
|
+
'Message successfully sent to peer'
|
|
76
|
+
);
|
|
77
|
+
} catch (err) {
|
|
78
|
+
equal(err, null, 'Expected no error');
|
|
79
|
+
}
|
|
69
80
|
|
|
70
81
|
await kill({});
|
|
71
82
|
|
|
@@ -5,7 +5,6 @@ const {test} = require('@alexbosworth/tap');
|
|
|
5
5
|
const {addPeer} = require('./../../');
|
|
6
6
|
const {closeChannel} = require('./../../');
|
|
7
7
|
const {getChainBalance} = require('./../../');
|
|
8
|
-
const {getHeight} = require('./../../');
|
|
9
8
|
const {getWalletInfo} = require('./../../');
|
|
10
9
|
const {openChannel} = require('./../../');
|
|
11
10
|
const {removePeer} = require('./../../');
|
|
@@ -4,13 +4,9 @@ const {routeFromHops} = require('bolt07');
|
|
|
4
4
|
const {spawnLightningCluster} = require('ln-docker-daemons');
|
|
5
5
|
const {test} = require('@alexbosworth/tap');
|
|
6
6
|
|
|
7
|
-
const {cancelHodlInvoice} = require('./../../');
|
|
8
7
|
const {createInvoice} = require('./../../');
|
|
9
8
|
const {getChannel} = require('./../../');
|
|
10
|
-
const {getChannels} = require('./../../');
|
|
11
|
-
const {getHeight} = require('./../../');
|
|
12
9
|
const {pay} = require('./../../');
|
|
13
|
-
const {payViaRoutes} = require('./../../');
|
|
14
10
|
const {setupChannel} = require('./../macros');
|
|
15
11
|
const {subscribeToInvoices} = require('./../../');
|
|
16
12
|
|
|
@@ -37,107 +33,113 @@ test('Subscribe to invoices', async ({end, equal, fail}) => {
|
|
|
37
33
|
|
|
38
34
|
const destination = control.id;
|
|
39
35
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
generate,
|
|
43
|
-
lnd,
|
|
44
|
-
give: 1e5,
|
|
45
|
-
to: target,
|
|
46
|
-
});
|
|
36
|
+
try {
|
|
37
|
+
await generate({count: 100});
|
|
47
38
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// Created invoices are emitted
|
|
57
|
-
{
|
|
58
|
-
const sub = subscribeToInvoices({lnd, restart_delay_ms: 1});
|
|
39
|
+
// Create a channel from the control to the target node
|
|
40
|
+
const controlToTargetChannel = await setupChannel({
|
|
41
|
+
generate,
|
|
42
|
+
lnd,
|
|
43
|
+
give: 1e5,
|
|
44
|
+
to: target,
|
|
45
|
+
});
|
|
59
46
|
|
|
60
|
-
|
|
47
|
+
// Create a channel from the target back to the control
|
|
48
|
+
const targetToControlChannel = await setupChannel({
|
|
49
|
+
lnd: target.lnd,
|
|
50
|
+
generate: target.generate,
|
|
51
|
+
give: 1e5,
|
|
52
|
+
to: control,
|
|
53
|
+
});
|
|
61
54
|
|
|
62
|
-
|
|
55
|
+
// Created invoices are emitted
|
|
56
|
+
{
|
|
57
|
+
const sub = subscribeToInvoices({lnd, restart_delay_ms: 1});
|
|
63
58
|
|
|
64
|
-
|
|
65
|
-
await createInvoice({lnd});
|
|
59
|
+
const updates = [];
|
|
66
60
|
|
|
67
|
-
|
|
61
|
+
sub.on('invoice_updated', updated => updates.push(updated));
|
|
68
62
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
63
|
+
const update = await asyncRetry({interval, times}, async () => {
|
|
64
|
+
await createInvoice({lnd});
|
|
72
65
|
|
|
73
|
-
|
|
74
|
-
});
|
|
66
|
+
const [update] = updates;
|
|
75
67
|
|
|
76
|
-
|
|
68
|
+
if (!update) {
|
|
69
|
+
throw new Error('ExpectedInvoiceUpdate');
|
|
70
|
+
}
|
|
77
71
|
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
return update;
|
|
73
|
+
});
|
|
80
74
|
|
|
81
|
-
|
|
82
|
-
{
|
|
83
|
-
const sub = subscribeToInvoices({lnd, restart_delay_ms: 1});
|
|
75
|
+
equal(update.tokens, 0, 'Invoiced zero');
|
|
84
76
|
|
|
85
|
-
|
|
77
|
+
sub.removeAllListeners();
|
|
78
|
+
}
|
|
86
79
|
|
|
87
|
-
|
|
80
|
+
// Paid invoices are emitted
|
|
81
|
+
{
|
|
82
|
+
const sub = subscribeToInvoices({lnd, restart_delay_ms: 1});
|
|
88
83
|
|
|
89
|
-
|
|
90
|
-
await pay({
|
|
91
|
-
lnd: target.lnd,
|
|
92
|
-
request: (await createInvoice({lnd, tokens})).request,
|
|
93
|
-
});
|
|
84
|
+
const updates = [];
|
|
94
85
|
|
|
95
|
-
|
|
86
|
+
sub.on('invoice_updated', updated => updates.push(updated));
|
|
96
87
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
88
|
+
const update = await asyncRetry({interval, times}, async () => {
|
|
89
|
+
await pay({
|
|
90
|
+
lnd: target.lnd,
|
|
91
|
+
request: (await createInvoice({lnd, tokens})).request,
|
|
92
|
+
});
|
|
100
93
|
|
|
101
|
-
|
|
102
|
-
});
|
|
94
|
+
const [update] = updates.filter(n => n.is_confirmed);
|
|
103
95
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
equal(update.received, tokens, 'Got received tokens');
|
|
108
|
-
equal(update.received_mtokens, '10000000', 'Got invoice mtokens');
|
|
96
|
+
if (!update) {
|
|
97
|
+
throw new Error('ExpectedPaidInvoiceUpdate');
|
|
98
|
+
}
|
|
109
99
|
|
|
110
|
-
|
|
111
|
-
|
|
100
|
+
return update;
|
|
101
|
+
});
|
|
112
102
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
103
|
+
equal(!!update.confirmed_at, true, 'Got receive date');
|
|
104
|
+
equal(!!update.confirmed_index, true, 'Got confirm index');
|
|
105
|
+
equal(update.payments.length, 1, 'Got received HTLC');
|
|
106
|
+
equal(update.received, tokens, 'Got received tokens');
|
|
107
|
+
equal(update.received_mtokens, '10000000', 'Got invoice mtokens');
|
|
108
|
+
|
|
109
|
+
sub.removeAllListeners();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Old invoices are emitted
|
|
113
|
+
{
|
|
114
|
+
const sub = subscribeToInvoices({
|
|
115
|
+
lnd,
|
|
116
|
+
added_after: 1,
|
|
117
|
+
restart_delay_ms: 1,
|
|
118
|
+
});
|
|
120
119
|
|
|
121
|
-
|
|
120
|
+
const updates = [];
|
|
122
121
|
|
|
123
|
-
|
|
122
|
+
sub.on('invoice_updated', updated => updates.push(updated));
|
|
124
123
|
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
const update = await asyncRetry({interval, times}, async () => {
|
|
125
|
+
const [update] = updates;
|
|
127
126
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
if (!update) {
|
|
128
|
+
throw new Error('ExpectedPastInvoiceUpdate');
|
|
129
|
+
}
|
|
131
130
|
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
return update;
|
|
132
|
+
});
|
|
134
133
|
|
|
135
|
-
|
|
134
|
+
equal(update.index, 2, 'Got past update');
|
|
136
135
|
|
|
137
|
-
|
|
136
|
+
sub.removeAllListeners();
|
|
137
|
+
}
|
|
138
|
+
} catch (err) {
|
|
139
|
+
equal(err, null, 'Expected no error');
|
|
140
|
+
} finally {
|
|
141
|
+
await kill({});
|
|
138
142
|
}
|
|
139
143
|
|
|
140
|
-
await kill({});
|
|
141
|
-
|
|
142
144
|
return end();
|
|
143
145
|
});
|
|
@@ -17,10 +17,12 @@ test(`Subscribe to peer messages`, async ({end, equal, strictSame}) => {
|
|
|
17
17
|
const [{lnd}, target, remote] = nodes;
|
|
18
18
|
|
|
19
19
|
try {
|
|
20
|
-
await
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
await asyncRetry({interval, times}, async () => {
|
|
21
|
+
await addPeer({
|
|
22
|
+
lnd,
|
|
23
|
+
public_key: target.id,
|
|
24
|
+
socket: target.socket,
|
|
25
|
+
});
|
|
24
26
|
});
|
|
25
27
|
|
|
26
28
|
await addPeer({
|
|
@@ -20,36 +20,40 @@ test(`Subscribe to peers`, async ({end, equal}) => {
|
|
|
20
20
|
|
|
21
21
|
const [{generate, lnd}, target] = nodes;
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
try {
|
|
24
|
+
const sub = subscribeToPeers({lnd});
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
sub.on('error', () => {});
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
await asyncRetry({interval, times}, async () => {
|
|
29
|
+
await addPeer({lnd, public_key: target.id, socket: target.socket});
|
|
30
|
+
});
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
const disconnect = removePeer({lnd, public_key: target.id});
|
|
33
|
+
const receiveDisconnect = once(sub, 'disconnected');
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
const [disconectMessage] = await all([receiveDisconnect, disconnect]);
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
const [disconnected] = disconectMessage;
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
equal(disconnected.public_key, target.id, 'Got d/c event');
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
const connect = asyncRetry({interval, times}, async () => {
|
|
42
|
+
return addPeer({lnd, public_key: target.id, socket: target.socket});
|
|
43
|
+
});
|
|
43
44
|
|
|
44
|
-
|
|
45
|
+
const receiveConnectMessage = once(sub, 'connected');
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
const [connectMessage] = await all([receiveConnectMessage, connect]);
|
|
47
48
|
|
|
48
|
-
|
|
49
|
+
const [connected] = connectMessage;
|
|
49
50
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
equal(connected.public_key, target.id, 'Got connected');
|
|
52
|
+
} catch (err) {
|
|
53
|
+
equal(err, null, 'Expected no error');
|
|
54
|
+
} finally {
|
|
55
|
+
await kill({});
|
|
56
|
+
}
|
|
53
57
|
|
|
54
58
|
return end();
|
|
55
59
|
});
|
|
@@ -10,10 +10,8 @@ const {closeChannel} = require('./../../');
|
|
|
10
10
|
const {createHodlInvoice} = require('./../../');
|
|
11
11
|
const {delay} = require('./../macros');
|
|
12
12
|
const {getChainTransactions} = require('./../../');
|
|
13
|
-
const {getChannels} = require('./../../');
|
|
14
13
|
const {getClosedChannels} = require('./../../');
|
|
15
14
|
const {getInvoice} = require('./../../');
|
|
16
|
-
const {getInvoices} = require('./../../');
|
|
17
15
|
const {getPendingChannels} = require('./../../');
|
|
18
16
|
const {getSweepTransactions} = require('./../../');
|
|
19
17
|
const {getWalletInfo} = require('./../../');
|
|
@@ -8,7 +8,6 @@ const {cancelHodlInvoice} = require('./../../');
|
|
|
8
8
|
const {createHodlInvoice} = require('./../../');
|
|
9
9
|
const {delay} = require('./../macros');
|
|
10
10
|
const {getInvoice} = require('./../../');
|
|
11
|
-
const {getInvoices} = require('./../../');
|
|
12
11
|
const {pay} = require('./../../');
|
|
13
12
|
const {setupChannel} = require('./../macros');
|
|
14
13
|
const {subscribeToInvoice} = require('./../../');
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const asyncRetry = require('async/retry');
|
|
1
2
|
const {spawnLightningCluster} = require('ln-docker-daemons');
|
|
2
3
|
const {test} = require('@alexbosworth/tap');
|
|
3
4
|
|
|
@@ -5,12 +6,17 @@ const {addPeer} = require('./../../');
|
|
|
5
6
|
const {createInvoice} = require('./../../');
|
|
6
7
|
const {deleteForwardingReputations} = require('./../../');
|
|
7
8
|
const {getForwardingReputations} = require('./../../');
|
|
9
|
+
const {getNetworkGraph} = require('./../../');
|
|
8
10
|
const {payViaPaymentRequest} = require('./../../');
|
|
9
11
|
const {probeForRoute} = require('./../../');
|
|
10
12
|
const {setupChannel} = require('./../macros');
|
|
11
13
|
const {waitForRoute} = require('./../macros');
|
|
12
14
|
|
|
15
|
+
const flatten = arr => [].concat(...arr);
|
|
16
|
+
const interval = 10;
|
|
13
17
|
const size = 3;
|
|
18
|
+
const times = 1000;
|
|
19
|
+
const tlvOnionBit = 14;
|
|
14
20
|
const tokens = 1e6 / 2;
|
|
15
21
|
|
|
16
22
|
// Deleting forwarding reputations should eliminate forwarding reputations
|
|
@@ -19,45 +25,73 @@ test('Delete forwarding reputations', async ({end, equal}) => {
|
|
|
19
25
|
|
|
20
26
|
const [{generate, lnd}, target, remote] = nodes;
|
|
21
27
|
|
|
22
|
-
|
|
28
|
+
try {
|
|
29
|
+
const controlToTargetChan = await setupChannel({
|
|
30
|
+
generate,
|
|
31
|
+
lnd,
|
|
32
|
+
to: target,
|
|
33
|
+
});
|
|
23
34
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
const targetToRemoteChan = await setupChannel({
|
|
36
|
+
generate: target.generate,
|
|
37
|
+
lnd: target.lnd,
|
|
38
|
+
to: remote,
|
|
39
|
+
});
|
|
29
40
|
|
|
30
|
-
|
|
41
|
+
await addPeer({lnd, public_key: remote.id, socket: remote.socket});
|
|
31
42
|
|
|
32
|
-
|
|
43
|
+
const {id, request} = await createInvoice({tokens, lnd: remote.lnd});
|
|
33
44
|
|
|
34
|
-
|
|
45
|
+
await asyncRetry({interval, times}, async () => {
|
|
46
|
+
const {channels, nodes} = await getNetworkGraph({lnd});
|
|
35
47
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
equal(err, null, 'Expected no error paying payment request');
|
|
40
|
-
}
|
|
48
|
+
const limitedFeatures = nodes.find(node => {
|
|
49
|
+
return !node.features.find(n => n.bit === tlvOnionBit);
|
|
50
|
+
});
|
|
41
51
|
|
|
42
|
-
|
|
43
|
-
await probeForRoute({lnd, tokens, destination: remote.id});
|
|
44
|
-
} catch (err) {}
|
|
52
|
+
const policies = flatten(channels.map(n => n.policies));
|
|
45
53
|
|
|
46
|
-
|
|
47
|
-
const {nodes} = await getForwardingReputations({lnd});
|
|
54
|
+
const cltvDeltas = policies.map(n => n.cltv_delta);
|
|
48
55
|
|
|
49
|
-
|
|
50
|
-
|
|
56
|
+
if (!!cltvDeltas.filter(n => !n).length) {
|
|
57
|
+
throw new Error('ExpectedAllChannelPolicies');
|
|
58
|
+
}
|
|
51
59
|
|
|
52
|
-
|
|
60
|
+
if (!!limitedFeatures) {
|
|
61
|
+
throw new Error('NetworkGraphSyncIncomplete');
|
|
62
|
+
}
|
|
63
|
+
});
|
|
53
64
|
|
|
54
|
-
|
|
55
|
-
const {nodes} = await getForwardingReputations({lnd});
|
|
65
|
+
await waitForRoute({lnd, tokens, destination: remote.id});
|
|
56
66
|
|
|
57
|
-
|
|
58
|
-
|
|
67
|
+
try {
|
|
68
|
+
await payViaPaymentRequest({lnd, request});
|
|
69
|
+
} catch (err) {
|
|
70
|
+
equal(err, null, 'Expected no error paying payment request');
|
|
71
|
+
}
|
|
59
72
|
|
|
60
|
-
|
|
73
|
+
try {
|
|
74
|
+
await probeForRoute({lnd, tokens, destination: remote.id});
|
|
75
|
+
} catch (err) {}
|
|
76
|
+
|
|
77
|
+
{
|
|
78
|
+
const {nodes} = await getForwardingReputations({lnd});
|
|
79
|
+
|
|
80
|
+
equal(nodes.length, 2, 'Reputations should exist');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
await deleteForwardingReputations({lnd});
|
|
84
|
+
|
|
85
|
+
{
|
|
86
|
+
const {nodes} = await getForwardingReputations({lnd});
|
|
87
|
+
|
|
88
|
+
equal(nodes.length, [].length, 'Reputations should be wiped');
|
|
89
|
+
}
|
|
90
|
+
} catch (err) {
|
|
91
|
+
equal(err, null, 'Expected no error');
|
|
92
|
+
} finally {
|
|
93
|
+
await kill({});
|
|
94
|
+
}
|
|
61
95
|
|
|
62
96
|
return end();
|
|
63
97
|
});
|
|
@@ -5,7 +5,7 @@ const {test} = require('@alexbosworth/tap');
|
|
|
5
5
|
const {addPeer} = require('./../../');
|
|
6
6
|
const {getChannels} = require('./../../');
|
|
7
7
|
const {getForwardingReputations} = require('./../../');
|
|
8
|
-
const {
|
|
8
|
+
const {getNetworkGraph} = require('./../../');
|
|
9
9
|
const {probeForRoute} = require('./../../');
|
|
10
10
|
const {setupChannel} = require('./../macros');
|
|
11
11
|
const {waitForRoute} = require('./../macros');
|
|
@@ -15,9 +15,12 @@ const channelCapacityTokens = 1e6;
|
|
|
15
15
|
const confirmationCount = 20;
|
|
16
16
|
const defaultFee = 1e3;
|
|
17
17
|
const defaultOdds = 950000;
|
|
18
|
+
const flatten = arr => [].concat(...arr);
|
|
18
19
|
const interval = 10;
|
|
20
|
+
const maturity = 100;
|
|
19
21
|
const size = 3;
|
|
20
22
|
const times = 2000;
|
|
23
|
+
const tlvOnionBit = 14;
|
|
21
24
|
const tokens = 1e6 / 2;
|
|
22
25
|
|
|
23
26
|
// Getting forwarding reputations should return reputations
|
|
@@ -26,9 +29,9 @@ test('Get forwarding reputations', async ({end, equal}) => {
|
|
|
26
29
|
|
|
27
30
|
const [{generate, id, lnd}, target, remote] = cluster.nodes;
|
|
28
31
|
|
|
29
|
-
await generate({count: 100});
|
|
30
|
-
|
|
31
32
|
try {
|
|
33
|
+
await generate({count: maturity});
|
|
34
|
+
|
|
32
35
|
// Create a channel from the control to the target node
|
|
33
36
|
await setupChannel({
|
|
34
37
|
generate,
|
|
@@ -45,22 +48,47 @@ test('Get forwarding reputations', async ({end, equal}) => {
|
|
|
45
48
|
});
|
|
46
49
|
|
|
47
50
|
await asyncRetry({interval, times}, async () => {
|
|
48
|
-
|
|
51
|
+
const {channels, nodes} = await getNetworkGraph({lnd});
|
|
52
|
+
|
|
53
|
+
const limitedFeatures = nodes.find(node => {
|
|
54
|
+
return !node.features.find(n => n.bit === tlvOnionBit);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const policies = flatten(channels.map(n => n.policies));
|
|
58
|
+
|
|
59
|
+
const cltvDeltas = policies.map(n => n.cltv_delta);
|
|
60
|
+
|
|
61
|
+
if (!!cltvDeltas.filter(n => !n).length) {
|
|
62
|
+
throw new Error('ExpectedAllChannelPolicies');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (!!limitedFeatures) {
|
|
66
|
+
throw new Error('NetworkGraphSyncIncomplete');
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
await asyncRetry({interval, times}, async () => {
|
|
71
|
+
await generate({});
|
|
72
|
+
|
|
73
|
+
await addPeer({
|
|
74
|
+
lnd,
|
|
75
|
+
public_key: remote.id,
|
|
76
|
+
socket: remote.socket,
|
|
77
|
+
retry_count: 1,
|
|
78
|
+
retry_delay: 1,
|
|
79
|
+
timeout: 1,
|
|
80
|
+
});
|
|
49
81
|
|
|
50
82
|
const {channels} = await getChannels({lnd: remote.lnd});
|
|
51
83
|
|
|
52
84
|
await waitForRoute({lnd, tokens, destination: remote.id});
|
|
53
85
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
});
|
|
61
|
-
} catch (err) {
|
|
62
|
-
equal(err, null, 'Expected no error probing');
|
|
63
|
-
}
|
|
86
|
+
await probeForRoute({
|
|
87
|
+
lnd,
|
|
88
|
+
tokens,
|
|
89
|
+
destination: remote.id,
|
|
90
|
+
is_ignoring_past_failures: true,
|
|
91
|
+
});
|
|
64
92
|
|
|
65
93
|
const {nodes} = await getForwardingReputations({lnd});
|
|
66
94
|
|