Skip to content

Commit e7c45d9

Browse files
committed
Don't rely on calculate_success_probability* to handle amt > cap
Currently we let an `htlc_amount >= channel_capacity` pass through from `penalty_msat` to `calculate_success_probability_times_billion`, but only if its only marginally bigger (less than 65/64ths). This is fine as `calculate_success_probability_times_billion` handles bogus values just fine (it will always return a zero probability in such cases). However, this is risky, and in fact breaks in the coming commits, so instead check it before ever calling through to the historical bucket probability calculations.
1 parent d277fa1 commit e7c45d9

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

lightning/src/routing/scoring.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,9 @@ impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>,
999999
/// Returns a liquidity penalty for routing the given HTLC `amount_msat` through the channel in
10001000
/// this direction.
10011001
fn penalty_msat(&self, amount_msat: u64, params: &ProbabilisticScoringParameters) -> u64 {
1002-
let max_liquidity_msat = self.max_liquidity_msat();
1002+
let available_capacity = self.available_capacity();
1003+
let max_liquidity_msat = available_capacity.saturating_sub(
1004+
self.decayed_offset_msat(*self.max_liquidity_offset_msat));
10031005
let min_liquidity_msat = core::cmp::min(self.min_liquidity_msat(), max_liquidity_msat);
10041006

10051007
let mut res = if amount_msat <= min_liquidity_msat {
@@ -1030,6 +1032,15 @@ impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>,
10301032
}
10311033
};
10321034

1035+
if amount_msat >= available_capacity {
1036+
// We're trying to send more than the capacity, use a max penalty.
1037+
res = res.saturating_add(Self::combined_penalty_msat(amount_msat,
1038+
NEGATIVE_LOG10_UPPER_BOUND * 2048,
1039+
params.historical_liquidity_penalty_multiplier_msat,
1040+
params.historical_liquidity_penalty_amount_multiplier_msat));
1041+
return res;
1042+
}
1043+
10331044
if params.historical_liquidity_penalty_multiplier_msat != 0 ||
10341045
params.historical_liquidity_penalty_amount_multiplier_msat != 0 {
10351046
let payment_amt_64th_bucket = if amount_msat < u64::max_value() / 64 {

0 commit comments

Comments
 (0)