Skip to content

Commit 981d62f

Browse files
committed
Add test for duplicate keysend payment
The logic has been changed around duplicate keysend payments such that it's no longer explicitly clear that we reject duplicate keysend payments now that we handle receiving multi-part keysends. This test catches that.
1 parent 60f3347 commit 981d62f

File tree

1 file changed

+57
-1
lines changed

1 file changed

+57
-1
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8529,13 +8529,22 @@ mod tests {
85298529

85308530
#[test]
85318531
fn test_keysend_dup_payment_hash() {
8532+
do_test_keysend_dup_payment_hash(false);
8533+
do_test_keysend_dup_payment_hash(true);
8534+
}
8535+
8536+
fn do_test_keysend_dup_payment_hash(accept_mpp_keysend: bool) {
85328537
// (1): Test that a keysend payment with a duplicate payment hash to an existing pending
85338538
// outbound regular payment fails as expected.
85348539
// (2): Test that a regular payment with a duplicate payment hash to an existing keysend payment
85358540
// fails as expected.
8541+
// (3): Test that a keysend payment with a duplicate payment hash to an existing keysend payment
8542+
// fails as expected.
85368543
let chanmon_cfgs = create_chanmon_cfgs(2);
85378544
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
8538-
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
8545+
let mut mpp_keysend_cfg = test_default_channel_config();
8546+
mpp_keysend_cfg.accept_mpp_keysend = accept_mpp_keysend;
8547+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, Some(mpp_keysend_cfg)]);
85398548
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
85408549
create_announced_chan_between_nodes(&nodes, 0, 1);
85418550
let scorer = test_utils::TestScorer::new();
@@ -8624,6 +8633,53 @@ mod tests {
86248633

86258634
// Finally, succeed the keysend payment.
86268635
claim_payment(&nodes[0], &expected_route, payment_preimage);
8636+
8637+
// To start (3), send a keysend payment but don't claim it.
8638+
let payment_id_1 = PaymentId([44; 32]);
8639+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8640+
RecipientOnionFields::spontaneous_empty(), payment_id_1).unwrap();
8641+
check_added_monitors!(nodes[0], 1);
8642+
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
8643+
assert_eq!(events.len(), 1);
8644+
let event = events.pop().unwrap();
8645+
let path = vec![&nodes[1]];
8646+
pass_along_path(&nodes[0], &path, 100_000, payment_hash, None, event, true, Some(payment_preimage));
8647+
8648+
// Next, attempt a keysend payment and make sure it fails.
8649+
let route_params = RouteParameters {
8650+
payment_params: PaymentParameters::for_keysend(expected_route.last().unwrap().node.get_our_node_id(), TEST_FINAL_CLTV, false),
8651+
final_value_msat: 100_000,
8652+
};
8653+
let route = find_route(
8654+
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
8655+
None, nodes[0].logger, &scorer, &(), &random_seed_bytes
8656+
).unwrap();
8657+
let payment_id_2 = PaymentId([45; 32]);
8658+
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8659+
RecipientOnionFields::spontaneous_empty(), payment_id_2).unwrap();
8660+
check_added_monitors!(nodes[0], 1);
8661+
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
8662+
assert_eq!(events.len(), 1);
8663+
let ev = events.drain(..).next().unwrap();
8664+
let payment_event = SendEvent::from_event(ev);
8665+
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &payment_event.msgs[0]);
8666+
check_added_monitors!(nodes[1], 0);
8667+
commitment_signed_dance!(nodes[1], nodes[0], payment_event.commitment_msg, false);
8668+
expect_pending_htlcs_forwardable!(nodes[1]);
8669+
expect_pending_htlcs_forwardable_and_htlc_handling_failed!(nodes[1], vec![HTLCDestination::FailedPayment { payment_hash }]);
8670+
check_added_monitors!(nodes[1], 1);
8671+
let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
8672+
assert!(updates.update_add_htlcs.is_empty());
8673+
assert!(updates.update_fulfill_htlcs.is_empty());
8674+
assert_eq!(updates.update_fail_htlcs.len(), 1);
8675+
assert!(updates.update_fail_malformed_htlcs.is_empty());
8676+
assert!(updates.update_fee.is_none());
8677+
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &updates.update_fail_htlcs[0]);
8678+
commitment_signed_dance!(nodes[0], nodes[1], updates.commitment_signed, true, true);
8679+
expect_payment_failed!(nodes[0], payment_hash, true);
8680+
8681+
// Finally, claim the original payment.
8682+
claim_payment(&nodes[0], &expected_route, payment_preimage);
86278683
}
86288684

86298685
#[test]

0 commit comments

Comments
 (0)