1212use  bitcoin:: secp256k1:: ecdh:: SharedSecret ; 
1313use  bitcoin:: secp256k1:: { self ,  PublicKey ,  Secp256k1 ,  SecretKey } ; 
1414
15+ use  crate :: blinded_path:: message:: MAX_DUMMY_HOPS_COUNT ; 
1516use  crate :: blinded_path:: utils:: { self ,  BlindedPathWithPadding } ; 
1617use  crate :: blinded_path:: { BlindedHop ,  BlindedPath ,  IntroductionNode ,  NodeIdLookUp } ; 
1718use  crate :: crypto:: streams:: ChaChaDualPolyReadAdapter ; 
@@ -121,6 +122,32 @@ impl BlindedPaymentPath {
121122		receive_auth_key :  ReceiveAuthKey ,  payee_tlvs :  ReceiveTlvs ,  htlc_maximum_msat :  u64 , 
122123		min_final_cltv_expiry_delta :  u16 ,  entropy_source :  ES ,  secp_ctx :  & Secp256k1 < T > , 
123124	)  -> Result < Self ,  ( ) > 
125+ 	where 
126+ 		ES :: Target :  EntropySource , 
127+ 	{ 
128+ 		BlindedPaymentPath :: new_with_dummy_hops ( 
129+ 			intermediate_nodes, 
130+ 			payee_node_id, 
131+ 			0 , 
132+ 			receive_auth_key, 
133+ 			payee_tlvs, 
134+ 			htlc_maximum_msat, 
135+ 			min_final_cltv_expiry_delta, 
136+ 			entropy_source, 
137+ 			secp_ctx, 
138+ 		) 
139+ 	} 
140+ 
141+ 	/// Same as [`BlindedPaymentPath::new`], but allows specifying a number of dummy hops. 
142+ /// 
143+ /// Note: 
144+ /// At most [`MAX_DUMMY_HOPS_COUNT`] dummy hops can be added to the blinded path. 
145+ pub  fn  new_with_dummy_hops < ES :  Deref ,  T :  secp256k1:: Signing  + secp256k1:: Verification > ( 
146+ 		intermediate_nodes :  & [ PaymentForwardNode ] ,  payee_node_id :  PublicKey , 
147+ 		dummy_hop_count :  usize ,  receive_auth_key :  ReceiveAuthKey ,  payee_tlvs :  ReceiveTlvs , 
148+ 		htlc_maximum_msat :  u64 ,  min_final_cltv_expiry_delta :  u16 ,  entropy_source :  ES , 
149+ 		secp_ctx :  & Secp256k1 < T > , 
150+ 	)  -> Result < Self ,  ( ) > 
124151	where 
125152		ES :: Target :  EntropySource , 
126153	{ 
@@ -145,6 +172,7 @@ impl BlindedPaymentPath {
145172					secp_ctx, 
146173					intermediate_nodes, 
147174					payee_node_id, 
175+ 					dummy_hop_count, 
148176					payee_tlvs, 
149177					& blinding_secret, 
150178					receive_auth_key, 
@@ -654,15 +682,19 @@ pub(crate) const PAYMENT_PADDING_ROUND_OFF: usize = 30;
654682/// Construct blinded payment hops for the given `intermediate_nodes` and payee info. 
655683pub ( super )  fn  blinded_hops < T :  secp256k1:: Signing  + secp256k1:: Verification > ( 
656684	secp_ctx :  & Secp256k1 < T > ,  intermediate_nodes :  & [ PaymentForwardNode ] ,  payee_node_id :  PublicKey , 
657- 	payee_tlvs :  ReceiveTlvs ,  session_priv :  & SecretKey ,  local_node_receive_key :  ReceiveAuthKey , 
685+ 	dummy_hop_count :  usize ,  payee_tlvs :  ReceiveTlvs ,  session_priv :  & SecretKey , 
686+ 	local_node_receive_key :  ReceiveAuthKey , 
658687)  -> Vec < BlindedHop >  { 
688+ 	let  dummy_count = core:: cmp:: min ( dummy_hop_count,  MAX_DUMMY_HOPS_COUNT ) ; 
659689	let  pks = intermediate_nodes
660690		. iter ( ) 
661691		. map ( |node| ( node. node_id ,  None ) ) 
692+ 		. chain ( core:: iter:: repeat ( ( payee_node_id,  Some ( local_node_receive_key) ) ) . take ( dummy_count) ) 
662693		. chain ( core:: iter:: once ( ( payee_node_id,  Some ( local_node_receive_key) ) ) ) ; 
663694	let  tlvs = intermediate_nodes
664695		. iter ( ) 
665696		. map ( |node| BlindedPaymentTlvsRef :: Forward ( & node. tlvs ) ) 
697+ 		. chain ( ( 0 ..dummy_count) . map ( |_| BlindedPaymentTlvsRef :: Dummy ( & PaymentDummyTlv ) ) ) 
666698		. chain ( core:: iter:: once ( BlindedPaymentTlvsRef :: Receive ( & payee_tlvs) ) ) ; 
667699
668700	let  path = pks. zip ( 
0 commit comments