@@ -100,7 +100,7 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, S: Deref, SP: Sized,
100100		const  MIN_PEER_CHANNELS :  usize  = 3 ; 
101101
102102		let  network_graph = self . network_graph . deref ( ) . read_only ( ) ; 
103- 		let  paths  = first_hops. into_iter ( ) 
103+ 		let  counterparty_channels  = first_hops. into_iter ( ) 
104104			. filter ( |details| details. counterparty . features . supports_route_blinding ( ) ) 
105105			. filter ( |details| amount_msats <= details. inbound_capacity_msat ) 
106106			. filter ( |details| amount_msats >= details. inbound_htlc_minimum_msat . unwrap_or ( 0 ) ) 
@@ -142,7 +142,9 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, S: Deref, SP: Sized,
142142					htlc_maximum_msat :  details. inbound_htlc_maximum_msat . unwrap_or ( u64:: MAX ) , 
143143				} ; 
144144				Some ( ( forward_node,  counterparty_channels) ) 
145- 			} ) 
145+ 			} ) ; 
146+ 
147+ 		let  three_hop_paths = counterparty_channels. clone ( ) 
146148			// Pair counterparties with their other channels 
147149			. flat_map ( |( forward_node,  counterparty_channels) |
148150				counterparty_channels
@@ -194,20 +196,29 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, S: Deref, SP: Sized,
194196					tlvs. clone ( ) ,  u64:: MAX ,  entropy_source,  secp_ctx
195197				) ) 
196198			} ) 
197- 			. take ( MAX_PAYMENT_PATHS ) 
198- 			. collect :: < Result < Vec < _ > ,  _ > > ( ) ; 
199+ 			. take ( MAX_PAYMENT_PATHS ) ; 
199200
200- 		match  paths { 
201- 			Ok ( paths)  if  !paths. is_empty ( )  => Ok ( paths) , 
202- 			_ => { 
203- 				if  network_graph. nodes ( ) . contains_key ( & NodeId :: from_pubkey ( & recipient) )  { 
204- 					BlindedPath :: one_hop_for_payment ( recipient,  tlvs,  entropy_source,  secp_ctx) 
205- 						. map ( |path| vec ! [ path] ) 
206- 				}  else  { 
207- 					Err ( ( ) ) 
208- 				} 
209- 			} , 
210- 		} 
201+ 		let  two_hop_paths = counterparty_channels
202+ 			. map ( |( forward_node,  _) | { 
203+ 				BlindedPath :: new_for_payment ( 
204+ 					& [ forward_node] ,  recipient,  tlvs. clone ( ) ,  u64:: MAX ,  entropy_source,  secp_ctx
205+ 				) 
206+ 			} ) 
207+ 			. take ( MAX_PAYMENT_PATHS ) ; 
208+ 
209+ 		three_hop_paths
210+ 			. collect :: < Result < Vec < _ > ,  _ > > ( ) . ok ( ) 
211+ 			. and_then ( |paths| ( !paths. is_empty ( ) ) . then ( || paths) ) 
212+ 			. or_else ( || two_hop_paths. collect :: < Result < Vec < _ > ,  _ > > ( ) . ok ( ) ) 
213+ 			. and_then ( |paths| ( !paths. is_empty ( ) ) . then ( || paths) ) 
214+ 			. or_else ( || network_graph
215+ 				. node ( & NodeId :: from_pubkey ( & recipient) ) . ok_or ( ( ) ) 
216+ 				. and_then ( |_|
217+ 					BlindedPath :: one_hop_for_payment ( recipient,  tlvs,  entropy_source,  secp_ctx) ) 
218+ 				. map ( |path| vec ! [ path] ) 
219+ 				. ok ( ) 
220+ 			) 
221+ 			. ok_or ( ( ) ) 
211222	} 
212223} 
213224
0 commit comments