Skip to content

Commit b0d4ab8

Browse files
committed
Send keysend preimage through OutboundPayment::send_payment_internal
Fixes a bug where we wouldn't use the provided keysend preimage when piping through OutboundPayment::pay_route_internal. Also simplifies and refactors existing keysend tests to make sure this gets hit.
1 parent b7d0357 commit b0d4ab8

File tree

2 files changed

+26
-37
lines changed

2 files changed

+26
-37
lines changed

lightning/src/ln/outbound_payment.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ impl OutboundPayments {
684684
Some(route_params.payment_params.clone()), entropy_source, best_block_height)
685685
.map_err(|_| RetryableSendFailure::DuplicatePayment)?;
686686

687-
let res = self.pay_route_internal(&route, payment_hash, recipient_onion, None, payment_id, None,
687+
let res = self.pay_route_internal(&route, payment_hash, recipient_onion, keysend_preimage, payment_id, None,
688688
onion_session_privs, node_signer, best_block_height, &send_payment_along_path);
689689
log_info!(logger, "Result sending payment with id {}: {:?}", log_bytes!(payment_id.0), res);
690690
if let Err(e) = res {

lightning/src/ln/payment_tests.rs

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -237,63 +237,52 @@ fn mpp_receive_timeout() {
237237
}
238238

239239
#[test]
240-
fn test_keysend_payments_to_public_node() {
241-
let chanmon_cfgs = create_chanmon_cfgs(2);
242-
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
243-
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
244-
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
245-
246-
let _chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001);
247-
let network_graph = nodes[0].network_graph.clone();
248-
let payer_pubkey = nodes[0].node.get_our_node_id();
249-
let payee_pubkey = nodes[1].node.get_our_node_id();
250-
let route_params = RouteParameters {
251-
payment_params: PaymentParameters::for_keysend(payee_pubkey, 40, false),
252-
final_value_msat: 10000,
253-
};
254-
let scorer = test_utils::TestScorer::new();
255-
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
256-
let route = find_route(&payer_pubkey, &route_params, &network_graph, None, nodes[0].logger, &scorer, &(), &random_seed_bytes).unwrap();
257-
258-
let test_preimage = PaymentPreimage([42; 32]);
259-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
260-
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap();
261-
check_added_monitors!(nodes[0], 1);
262-
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
263-
assert_eq!(events.len(), 1);
264-
let event = events.pop().unwrap();
265-
let path = vec![&nodes[1]];
266-
pass_along_path(&nodes[0], &path, 10000, payment_hash, None, event, true, Some(test_preimage));
267-
claim_payment(&nodes[0], &path, test_preimage);
240+
fn test_keysend_payments() {
241+
do_test_keysend_payments(false, false);
242+
do_test_keysend_payments(false, true);
243+
do_test_keysend_payments(true, false);
244+
do_test_keysend_payments(true, true);
268245
}
269246

270-
#[test]
271-
fn test_keysend_payments_to_private_node() {
247+
fn do_test_keysend_payments(public_node: bool, with_retry: bool) {
272248
let chanmon_cfgs = create_chanmon_cfgs(2);
273249
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
274250
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
275251
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
276252

253+
if public_node {
254+
create_announced_chan_between_nodes(&nodes, 0, 1);
255+
} else {
256+
create_chan_between_nodes(&nodes[0], &nodes[1]);
257+
}
277258
let payer_pubkey = nodes[0].node.get_our_node_id();
278259
let payee_pubkey = nodes[1].node.get_our_node_id();
279-
280-
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1]);
281260
let route_params = RouteParameters {
282261
payment_params: PaymentParameters::for_keysend(payee_pubkey, 40, false),
283262
final_value_msat: 10000,
284263
};
264+
285265
let network_graph = nodes[0].network_graph.clone();
286-
let first_hops = nodes[0].node.list_usable_channels();
266+
let channels = nodes[0].node.list_usable_channels();
267+
let first_hops = channels.iter().collect::<Vec<_>>();
268+
let first_hops = if public_node { None } else { Some(first_hops.as_slice()) };
269+
287270
let scorer = test_utils::TestScorer::new();
288271
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
289272
let route = find_route(
290-
&payer_pubkey, &route_params, &network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
273+
&payer_pubkey, &route_params, &network_graph, first_hops,
291274
nodes[0].logger, &scorer, &(), &random_seed_bytes
292275
).unwrap();
293276

294277
let test_preimage = PaymentPreimage([42; 32]);
295-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
296-
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap();
278+
let payment_hash = if with_retry {
279+
nodes[0].node.send_spontaneous_payment_with_retry(Some(test_preimage),
280+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0),
281+
route_params, Retry::Attempts(1)).unwrap()
282+
} else {
283+
nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
284+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap()
285+
};
297286
check_added_monitors!(nodes[0], 1);
298287
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
299288
assert_eq!(events.len(), 1);

0 commit comments

Comments
 (0)