Skip to content

Commit b2936c4

Browse files
committed
Find payment bucket in calculate_success_probability_times_billion
This simply moves code which will simplify the next commit somewhat.
1 parent 1b21317 commit b2936c4

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

lightning/src/routing/scoring.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ impl HistoricalMinMaxBuckets<'_> {
616616

617617
#[inline]
618618
fn calculate_success_probability_times_billion<T: Time>(
619-
&self, now: T, last_updated: T, half_life: Duration, payment_amt_64th_bucket: u8)
619+
&self, now: T, last_updated: T, half_life: Duration, amount_msat: u64, capacity_msat: u64)
620620
-> Option<u64> {
621621
// If historical penalties are enabled, calculate the penalty by walking the set of
622622
// historical liquidity bucket (min, max) combinations (where min_idx < max_idx) and, for
@@ -639,6 +639,20 @@ impl HistoricalMinMaxBuckets<'_> {
639639
// less than 1/16th of a channel's capacity, or 1/8th if we used the top of the bucket.
640640
let mut total_valid_points_tracked = 0;
641641

642+
let payment_amt_64th_bucket: u8 = if amount_msat < u64::max_value() / 64 {
643+
(amount_msat * 64 / capacity_msat.saturating_add(1))
644+
.try_into().unwrap_or(65)
645+
} else {
646+
// Only use 128-bit arithmetic when multiplication will overflow to avoid 128-bit
647+
// division. This branch should only be hit in fuzz testing since the amount would
648+
// need to be over 2.88 million BTC in practice.
649+
((amount_msat as u128) * 64 / (capacity_msat as u128).saturating_add(1))
650+
.try_into().unwrap_or(65)
651+
};
652+
#[cfg(not(fuzzing))]
653+
debug_assert!(payment_amt_64th_bucket <= 64);
654+
if payment_amt_64th_bucket >= 64 { return None; }
655+
642656
// Check if all our buckets are zero, once decayed and treat it as if we had no data. We
643657
// don't actually use the decayed buckets, though, as that would lose precision.
644658
let (decayed_min_buckets, decayed_max_buckets, required_decays) =
@@ -1043,26 +1057,13 @@ impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>,
10431057

10441058
if params.historical_liquidity_penalty_multiplier_msat != 0 ||
10451059
params.historical_liquidity_penalty_amount_multiplier_msat != 0 {
1046-
let payment_amt_64th_bucket = if amount_msat < u64::max_value() / 64 {
1047-
amount_msat * 64 / self.capacity_msat.saturating_add(1)
1048-
} else {
1049-
// Only use 128-bit arithmetic when multiplication will overflow to avoid 128-bit
1050-
// division. This branch should only be hit in fuzz testing since the amount would
1051-
// need to be over 2.88 million BTC in practice.
1052-
((amount_msat as u128) * 64 / (self.capacity_msat as u128).saturating_add(1))
1053-
.try_into().unwrap_or(65)
1054-
};
1055-
#[cfg(not(fuzzing))]
1056-
debug_assert!(payment_amt_64th_bucket <= 64);
1057-
if payment_amt_64th_bucket > 64 { return res; }
1058-
10591060
let buckets = HistoricalMinMaxBuckets {
10601061
min_liquidity_offset_history: &self.min_liquidity_offset_history,
10611062
max_liquidity_offset_history: &self.max_liquidity_offset_history,
10621063
};
10631064
if let Some(cumulative_success_prob_times_billion) = buckets
10641065
.calculate_success_probability_times_billion(self.now, *self.last_updated,
1065-
params.historical_no_updates_half_life, payment_amt_64th_bucket as u8)
1066+
params.historical_no_updates_half_life, amount_msat, self.capacity_msat)
10661067
{
10671068
let historical_negative_log10_times_2048 = approx::negative_log10_times_2048(cumulative_success_prob_times_billion + 1, 1024 * 1024 * 1024);
10681069
res = res.saturating_add(Self::combined_penalty_msat(amount_msat,

0 commit comments

Comments
 (0)