@@ -100,7 +100,7 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, S: Deref, SP: Sized,
100
100
const MIN_PEER_CHANNELS : usize = 3 ;
101
101
102
102
let network_graph = self . network_graph . deref ( ) . read_only ( ) ;
103
- let paths = first_hops. into_iter ( )
103
+ let counterparty_channels = first_hops. into_iter ( )
104
104
. filter ( |details| details. counterparty . features . supports_route_blinding ( ) )
105
105
. filter ( |details| amount_msats <= details. inbound_capacity_msat )
106
106
. filter ( |details| amount_msats >= details. inbound_htlc_minimum_msat . unwrap_or ( 0 ) )
@@ -147,7 +147,9 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, S: Deref, SP: Sized,
147
147
htlc_maximum_msat : details. inbound_htlc_maximum_msat . unwrap_or ( u64:: MAX ) ,
148
148
} ;
149
149
Some ( ( forward_node, counterparty_channels) )
150
- } )
150
+ } ) ;
151
+
152
+ let three_hop_paths = counterparty_channels. clone ( )
151
153
// Pair counterparties with their other channels
152
154
. flat_map ( |( forward_node, counterparty_channels) |
153
155
counterparty_channels
@@ -198,20 +200,29 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, S: Deref, SP: Sized,
198
200
tlvs. clone ( ) , u64:: MAX , entropy_source, secp_ctx
199
201
)
200
202
} )
201
- . take ( MAX_PAYMENT_PATHS )
202
- . collect :: < Result < Vec < _ > , _ > > ( ) ;
203
+ . take ( MAX_PAYMENT_PATHS ) ;
203
204
204
- match paths {
205
- Ok ( paths) if !paths. is_empty ( ) => Ok ( paths) ,
206
- _ => {
207
- if network_graph. nodes ( ) . contains_key ( & NodeId :: from_pubkey ( & recipient) ) {
208
- BlindedPath :: one_hop_for_payment ( recipient, tlvs, entropy_source, secp_ctx)
209
- . map ( |path| vec ! [ path] )
210
- } else {
211
- Err ( ( ) )
212
- }
213
- } ,
214
- }
205
+ let two_hop_paths = counterparty_channels
206
+ . map ( |( forward_node, _) | {
207
+ BlindedPath :: new_for_payment (
208
+ & [ forward_node] , recipient, tlvs. clone ( ) , u64:: MAX , entropy_source, secp_ctx
209
+ )
210
+ } )
211
+ . take ( MAX_PAYMENT_PATHS ) ;
212
+
213
+ three_hop_paths
214
+ . collect :: < Result < Vec < _ > , _ > > ( ) . ok ( )
215
+ . and_then ( |paths| ( !paths. is_empty ( ) ) . then ( || paths) )
216
+ . or_else ( || two_hop_paths. collect :: < Result < Vec < _ > , _ > > ( ) . ok ( ) )
217
+ . and_then ( |paths| ( !paths. is_empty ( ) ) . then ( || paths) )
218
+ . or_else ( || network_graph
219
+ . node ( & NodeId :: from_pubkey ( & recipient) ) . ok_or ( ( ) )
220
+ . and_then ( |_|
221
+ BlindedPath :: one_hop_for_payment ( recipient, tlvs, entropy_source, secp_ctx) )
222
+ . map ( |path| vec ! [ path] )
223
+ . ok ( )
224
+ )
225
+ . ok_or ( ( ) )
215
226
}
216
227
}
217
228
0 commit comments