@@ -9870,6 +9870,57 @@ fn test_keysend_payments_to_private_node() {
9870
9870
claim_payment(&nodes[0], &path, test_preimage);
9871
9871
}
9872
9872
9873
+ #[test]
9874
+ fn test_double_partial_claim() {
9875
+ // Test what happens if a node receives a payment, generates a PaymentReceived event, the HTLCs
9876
+ // time out, the sender resends only some of the MPP parts, then the user processes the
9877
+ // PaymentReceived event, ensuring they don't inadvertently claim only part of the full payment
9878
+ // amount.
9879
+ let chanmon_cfgs = create_chanmon_cfgs(4);
9880
+ let node_cfgs = create_node_cfgs(4, &chanmon_cfgs);
9881
+ let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
9882
+ let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
9883
+
9884
+ create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 0, InitFeatures::known(), InitFeatures::known());
9885
+ create_announced_chan_between_nodes_with_value(&nodes, 0, 2, 100_000, 0, InitFeatures::known(), InitFeatures::known());
9886
+ create_announced_chan_between_nodes_with_value(&nodes, 1, 3, 100_000, 0, InitFeatures::known(), InitFeatures::known());
9887
+ create_announced_chan_between_nodes_with_value(&nodes, 2, 3, 100_000, 0, InitFeatures::known(), InitFeatures::known());
9888
+
9889
+ let (mut route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[3], 15_000_000);
9890
+ assert_eq!(route.paths.len(), 2);
9891
+ route.paths.sort_by(|path_a, _| {
9892
+ // Sort the path so that the path through nodes[1] comes first
9893
+ if path_a[0].pubkey == nodes[1].node.get_our_node_id() {
9894
+ core::cmp::Ordering::Less } else { core::cmp::Ordering::Greater }
9895
+ });
9896
+
9897
+ send_along_route_with_secret(&nodes[0], route.clone(), &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], 15_000_000, payment_hash, payment_secret);
9898
+ // nodes[3] has now received a PaymentReceived event...which it will take some (exorbitant)
9899
+ // amount of time to respond to.
9900
+
9901
+ // Connect some blocks to time out the payment
9902
+ connect_blocks(&nodes[3], TEST_FINAL_CLTV);
9903
+ connect_blocks(&nodes[0], TEST_FINAL_CLTV); // To get the same height for sending later
9904
+
9905
+ expect_pending_htlcs_forwardable!(nodes[3]);
9906
+
9907
+ pass_failed_payment_back(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, payment_hash);
9908
+
9909
+ // nodes[1] now retries one of the two paths...
9910
+ nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
9911
+ check_added_monitors!(nodes[0], 2);
9912
+
9913
+ let mut events = nodes[0].node.get_and_clear_pending_msg_events();
9914
+ assert_eq!(events.len(), 2);
9915
+ pass_along_path(&nodes[0], &[&nodes[1], &nodes[3]], 15_000_000, payment_hash, Some(payment_secret), events.drain(..).next().unwrap(), false, None);
9916
+
9917
+ // At this point nodes[3] has received one half of the payment, and the user goes to handle
9918
+ // that PaymentReceived event they got hours ago and never handled...we should refuse to claim.
9919
+ nodes[3].node.claim_funds(payment_preimage);
9920
+ check_added_monitors!(nodes[3], 0);
9921
+ assert!(nodes[3].node.get_and_clear_pending_msg_events().is_empty());
9922
+ }
9923
+
9873
9924
fn do_test_partial_claim_before_restart(persist_both_monitors: bool) {
9874
9925
// Test what happens if a node receives an MPP payment, claims it, but crashes before
9875
9926
// persisting the ChannelManager. If `persist_both_monitors` is false, also crash after only
0 commit comments