@@ -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