@@ -490,6 +490,29 @@ fn two_hop_blinded_path_success() {
490490 claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , payment_preimage) ;
491491}
492492
493+ #[ test]
494+ fn three_hop_blinded_path_success ( ) {
495+ let chanmon_cfgs = create_chanmon_cfgs ( 5 ) ;
496+ let node_cfgs = create_node_cfgs ( 5 , & chanmon_cfgs) ;
497+ let node_chanmgrs = create_node_chanmgrs ( 5 , & node_cfgs, & [ None , None , None , None , None ] ) ;
498+ let mut nodes = create_network ( 5 , & node_cfgs, & node_chanmgrs) ;
499+ create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
500+ create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1_000_000 , 0 ) ;
501+ let chan_upd_2_3 = create_announced_chan_between_nodes_with_value ( & nodes, 2 , 3 , 1_000_000 , 0 ) . 0 . contents ;
502+ let chan_upd_3_4 = create_announced_chan_between_nodes_with_value ( & nodes, 3 , 4 , 1_000_000 , 0 ) . 0 . contents ;
503+
504+ let amt_msat = 5000 ;
505+ let ( payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 4 ] , Some ( amt_msat) , None ) ;
506+ let route_params = get_blinded_route_parameters ( amt_msat, payment_secret,
507+ nodes. iter ( ) . skip ( 2 ) . map ( |n| n. node . get_our_node_id ( ) ) . collect ( ) ,
508+ & [ & chan_upd_2_3, & chan_upd_3_4] , & chanmon_cfgs[ 4 ] . keys_manager ) ;
509+
510+ nodes[ 0 ] . node . send_payment ( payment_hash, RecipientOnionFields :: spontaneous_empty ( ) , PaymentId ( payment_hash. 0 ) , route_params, Retry :: Attempts ( 0 ) ) . unwrap ( ) ;
511+ check_added_monitors ( & nodes[ 0 ] , 1 ) ;
512+ pass_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 3 ] , & nodes[ 4 ] ] ] , amt_msat, payment_hash, payment_secret) ;
513+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 3 ] , & nodes[ 4 ] ] , payment_preimage) ;
514+ }
515+
493516#[ derive( PartialEq ) ]
494517enum ReceiveCheckFail {
495518 // The recipient fails the payment upon `PaymentClaimable`.
@@ -537,19 +560,20 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
537560 } ;
538561
539562 let amt_msat = 5000 ;
540- let final_cltv_delta = if check == ReceiveCheckFail :: ProcessPendingHTLCsCheck {
563+ let excess_final_cltv_delta_opt = if check == ReceiveCheckFail :: ProcessPendingHTLCsCheck {
541564 // Set the final CLTV expiry too low to trigger the failure in process_pending_htlc_forwards.
542565 Some ( TEST_FINAL_CLTV as u16 - 2 )
543566 } else { None } ;
544- let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 2 ] , Some ( amt_msat) , final_cltv_delta ) ;
567+ let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 2 ] , Some ( amt_msat) , excess_final_cltv_delta_opt ) ;
545568 let mut route_params = get_blinded_route_parameters ( amt_msat, payment_secret,
546569 nodes. iter ( ) . skip ( 1 ) . map ( |n| n. node . get_our_node_id ( ) ) . collect ( ) , & [ & chan_upd_1_2] ,
547570 & chanmon_cfgs[ 2 ] . keys_manager ) ;
548571
549572 let route = if check == ReceiveCheckFail :: ProcessPendingHTLCsCheck {
550573 let mut route = get_route ( & nodes[ 0 ] , & route_params) . unwrap ( ) ;
551574 // Set the final CLTV expiry too low to trigger the failure in process_pending_htlc_forwards.
552- route. paths [ 0 ] . blinded_tail . as_mut ( ) . map ( |bt| bt. excess_final_cltv_expiry_delta = TEST_FINAL_CLTV - 2 ) ;
575+ route. paths [ 0 ] . hops . last_mut ( ) . map ( |h| h. cltv_expiry_delta += excess_final_cltv_delta_opt. unwrap ( ) as u32 ) ;
576+ route. paths [ 0 ] . blinded_tail . as_mut ( ) . map ( |bt| bt. excess_final_cltv_expiry_delta = excess_final_cltv_delta_opt. unwrap ( ) as u32 ) ;
553577 route
554578 } else if check == ReceiveCheckFail :: PaymentConstraints {
555579 // Create a blinded path where the receiver's encrypted payload has an htlc_minimum_msat that is
@@ -657,6 +681,7 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
657681 commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 1 ] , ( ) , false , true , false , false ) ;
658682 } ,
659683 ReceiveCheckFail :: ProcessPendingHTLCsCheck => {
684+ assert_eq ! ( payment_event_1_2. msgs[ 0 ] . cltv_expiry, nodes[ 0 ] . best_block_info( ) . 1 + 1 + excess_final_cltv_delta_opt. unwrap( ) as u32 ) ;
660685 nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_1_2. msgs [ 0 ] ) ;
661686 check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
662687 do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & payment_event_1_2. commitment_msg , true , true ) ;
0 commit comments