1010use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
1111use crate :: blinded_path:: BlindedPath ;
1212use crate :: blinded_path:: payment:: { ForwardNode , ForwardTlvs , PaymentConstraints , PaymentRelay , ReceiveTlvs } ;
13- use crate :: events:: { HTLCDestination , MessageSendEventsProvider } ;
13+ use crate :: events:: { HTLCDestination , MessageSendEvent , MessageSendEventsProvider } ;
1414use crate :: ln:: PaymentSecret ;
1515use crate :: ln:: channelmanager;
1616use crate :: ln:: channelmanager:: { PaymentId , RecipientOnionFields } ;
@@ -459,6 +459,7 @@ fn two_hop_blinded_path_success() {
459459 claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , payment_preimage) ;
460460}
461461
462+ #[ derive( PartialEq ) ]
462463enum ReceiveCheckFail {
463464 // The recipient fails the payment upon `PaymentClaimable`.
464465 RecipientFail ,
@@ -467,13 +468,17 @@ enum ReceiveCheckFail {
467468 // The incoming HTLC did not satisfy our requirements; in this case it underpaid us according to
468469 // the expected receive amount in the onion.
469470 ReceiveRequirements ,
471+ // The incoming HTLC errors when added to the Channel, in this case due to the HTLC being
472+ // delivered out-of-order with a shutdown message.
473+ ChannelCheck ,
470474}
471475
472476#[ test]
473477fn multi_hop_receiver_fail ( ) {
474478 do_multi_hop_receiver_fail ( ReceiveCheckFail :: RecipientFail ) ;
475479 do_multi_hop_receiver_fail ( ReceiveCheckFail :: OnionDecodeFail ) ;
476480 do_multi_hop_receiver_fail ( ReceiveCheckFail :: ReceiveRequirements ) ;
481+ do_multi_hop_receiver_fail ( ReceiveCheckFail :: ChannelCheck ) ;
477482}
478483
479484fn do_multi_hop_receiver_fail ( check : ReceiveCheckFail ) {
@@ -486,7 +491,12 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
486491 let session_priv = [ 3 ; 32 ] ;
487492 * nodes[ 0 ] . keys_manager . override_random_bytes . lock ( ) . unwrap ( ) = Some ( session_priv) ;
488493 create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
489- let chan_upd_1_2 = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1_000_000 , 0 ) . 0 . contents ;
494+ let ( chan_upd_1_2, chan_id_1_2) = {
495+ let ( chan_upd, _, channel_id, ..) = create_announced_chan_between_nodes_with_value (
496+ & nodes, 1 , 2 , 1_000_000 , 0
497+ ) ;
498+ ( chan_upd. contents , channel_id)
499+ } ;
490500
491501 let amt_msat = 5000 ;
492502 let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 2 ] , Some ( amt_msat) , None ) ;
@@ -566,6 +576,19 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
566576 check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
567577 do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & payment_event_1_2. commitment_msg , true , true ) ;
568578 } ,
579+ ReceiveCheckFail :: ChannelCheck => {
580+ nodes[ 2 ] . node . close_channel ( & chan_id_1_2, & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
581+ let node_2_shutdown = get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendShutdown , nodes[ 1 ] . node. get_our_node_id( ) ) ;
582+ nodes[ 1 ] . node . handle_shutdown ( & nodes[ 2 ] . node . get_our_node_id ( ) , & node_2_shutdown) ;
583+ let node_1_shutdown = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendShutdown , nodes[ 2 ] . node. get_our_node_id( ) ) ;
584+
585+ nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_1_2. msgs [ 0 ] ) ;
586+ nodes[ 2 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_1_2. commitment_msg ) ;
587+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
588+
589+ nodes[ 2 ] . node . handle_shutdown ( & nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_shutdown) ;
590+ commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 1 ] , ( ) , false , true , false , false ) ;
591+ }
569592 }
570593
571594 let updates_2_1 = get_htlc_update_msgs ! ( nodes[ 2 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
@@ -576,7 +599,20 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
576599 nodes[ 1 ] . node . handle_update_fail_malformed_htlc ( & nodes[ 2 ] . node . get_our_node_id ( ) , update_malformed) ;
577600 do_commitment_signed_dance ( & nodes[ 1 ] , & nodes[ 2 ] , & updates_2_1. commitment_signed , true , false ) ;
578601
579- let updates_1_0 = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
602+ let updates_1_0 = if check == ReceiveCheckFail :: ChannelCheck {
603+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
604+ assert_eq ! ( events. len( ) , 2 ) ;
605+ events. into_iter ( ) . find_map ( |ev| {
606+ match ev {
607+ MessageSendEvent :: UpdateHTLCs { node_id, updates } => {
608+ assert_eq ! ( node_id, nodes[ 0 ] . node. get_our_node_id( ) ) ;
609+ return Some ( updates)
610+ } ,
611+ MessageSendEvent :: SendClosingSigned { .. } => None ,
612+ _ => panic ! ( )
613+ }
614+ } ) . unwrap ( )
615+ } else { get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) } ;
580616 assert_eq ! ( updates_1_0. update_fail_htlcs. len( ) , 1 ) ;
581617 nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & updates_1_0. update_fail_htlcs [ 0 ] ) ;
582618 do_commitment_signed_dance ( & nodes[ 0 ] , & nodes[ 1 ] , & updates_1_0. commitment_signed , false , false ) ;
0 commit comments