@@ -193,6 +193,7 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, targ
193
193
194
194
let mut targets = BinaryHeap :: new ( ) ; //TODO: Do we care about switching to eg Fibbonaci heap?
195
195
let mut dist = HashMap :: with_capacity ( network. get_nodes ( ) . len ( ) ) ;
196
+ let recommended_available_msat = final_value_msat * 4 ;
196
197
197
198
let mut first_hop_targets = HashMap :: with_capacity ( if first_hops. is_some ( ) { first_hops. as_ref ( ) . unwrap ( ) . len ( ) } else { 0 } ) ;
198
199
if let Some ( hops) = first_hops {
@@ -278,7 +279,45 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, targ
278
279
lowest_fee_to_peer_through_node: total_fee,
279
280
lowest_fee_to_node: $starting_fee_msat as u64 + new_fee,
280
281
} ;
281
- if old_entry. 0 > total_fee {
282
+
283
+ let mut replace_hop = false ;
284
+
285
+ // Prioritize sufficient channels over insufficient (low capacity) and over those with unknown capacity.
286
+ // If both channels are sufficient, prioritize by fee.
287
+ // If at least one channel is insufficient, prioritize by capacity (if possible) and then fee.
288
+ if let Some ( new_available_msat) = available_msat {
289
+ // TODO: use weightened formula to consider both available capacity and fees.
290
+ if new_available_msat > recommended_available_msat {
291
+ if let Some ( old_available_msat) = old_entry. 4 {
292
+ if old_available_msat < recommended_available_msat {
293
+ replace_hop = true ;
294
+ }
295
+ else if old_available_msat < new_available_msat {
296
+ replace_hop = old_entry. 0 > total_fee;
297
+ }
298
+ } else {
299
+ replace_hop = true ;
300
+ }
301
+ } else {
302
+ if let Some ( old_available_msat) = old_entry. 4 {
303
+ if old_available_msat < new_available_msat {
304
+ replace_hop = true ;
305
+ }
306
+ } else {
307
+ replace_hop = old_entry. 0 > total_fee;
308
+ }
309
+ }
310
+ } else {
311
+ if let Some ( old_available_msat) = old_entry. 4 {
312
+ if old_available_msat < recommended_available_msat {
313
+ replace_hop = old_entry. 0 > total_fee;
314
+ }
315
+ } else {
316
+ replace_hop = old_entry. 0 > total_fee;
317
+ }
318
+ }
319
+
320
+ if replace_hop {
282
321
targets. push( new_graph_node) ;
283
322
old_entry. 0 = total_fee;
284
323
old_entry. 3 = RouteHop {
0 commit comments