Skip to content

Commit 134add8

Browse files
committed
Consider available capacity while routing
Prioritize sufficient channels, also consider fees.
1 parent 26f4d72 commit 134add8

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

lightning/src/routing/router.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, targ
193193

194194
let mut targets = BinaryHeap::new(); //TODO: Do we care about switching to eg Fibbonaci heap?
195195
let mut dist = HashMap::with_capacity(network.get_nodes().len());
196+
let recommended_available_msat = final_value_msat * 4;
196197

197198
let mut first_hop_targets = HashMap::with_capacity(if first_hops.is_some() { first_hops.as_ref().unwrap().len() } else { 0 });
198199
if let Some(hops) = first_hops {
@@ -278,7 +279,45 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, targ
278279
lowest_fee_to_peer_through_node: total_fee,
279280
lowest_fee_to_node: $starting_fee_msat as u64 + new_fee,
280281
};
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 {
282321
targets.push(new_graph_node);
283322
old_entry.0 = total_fee;
284323
old_entry.3 = RouteHop {

0 commit comments

Comments
 (0)